@kirrosh/zond 0.26.0 → 0.27.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 +59 -0
- package/README.md +22 -21
- package/bin/zond.mjs +23 -0
- package/package.json +13 -16
- package/scripts/npm/postinstall.mjs +76 -0
- package/src/CLAUDE.md +0 -112
- package/src/bun-types.d.ts +0 -5
- package/src/cli/argv.ts +0 -122
- package/src/cli/commands/add-api.ts +0 -146
- package/src/cli/commands/api/annotate/idempotency.ts +0 -59
- package/src/cli/commands/api/annotate/index.ts +0 -880
- package/src/cli/commands/api/annotate/lifecycle.ts +0 -74
- package/src/cli/commands/api/annotate/overlay.ts +0 -206
- package/src/cli/commands/api/annotate/pagination.ts +0 -64
- package/src/cli/commands/api/annotate/prompts.ts +0 -220
- package/src/cli/commands/api/annotate/readback.ts +0 -58
- package/src/cli/commands/api/annotate/resources.ts +0 -91
- package/src/cli/commands/api/annotate/seed-bodies.ts +0 -61
- package/src/cli/commands/audit.ts +0 -786
- package/src/cli/commands/catalog.ts +0 -97
- package/src/cli/commands/check.ts +0 -361
- package/src/cli/commands/checks.ts +0 -1072
- package/src/cli/commands/ci-init.ts +0 -223
- package/src/cli/commands/clean.ts +0 -212
- package/src/cli/commands/cleanup.ts +0 -236
- package/src/cli/commands/completions.ts +0 -192
- package/src/cli/commands/coverage.ts +0 -872
- package/src/cli/commands/db.ts +0 -611
- package/src/cli/commands/describe.ts +0 -120
- package/src/cli/commands/discover.ts +0 -1356
- package/src/cli/commands/doctor.ts +0 -661
- package/src/cli/commands/fixtures.ts +0 -402
- package/src/cli/commands/generate.ts +0 -577
- package/src/cli/commands/init/agents-md.ts +0 -61
- package/src/cli/commands/init/bootstrap.ts +0 -111
- package/src/cli/commands/init/index.ts +0 -244
- package/src/cli/commands/init/skills.ts +0 -141
- package/src/cli/commands/init/templates/agents.md +0 -86
- package/src/cli/commands/init/templates/markdown.d.ts +0 -4
- package/src/cli/commands/init/templates/skills/warm-up-target.md +0 -122
- package/src/cli/commands/init/templates/skills/zond-checks.md +0 -621
- package/src/cli/commands/init/templates/skills/zond-seed.md +0 -114
- package/src/cli/commands/init/templates/skills/zond-triage.md +0 -272
- package/src/cli/commands/init/templates/skills/zond.md +0 -861
- package/src/cli/commands/init/templates/zond-config.yml +0 -14
- package/src/cli/commands/prepare-fixtures.ts +0 -97
- package/src/cli/commands/probe/_seed-bodies.ts +0 -52
- package/src/cli/commands/probe/mass-assignment.ts +0 -594
- package/src/cli/commands/probe/security.ts +0 -537
- package/src/cli/commands/probe/static.ts +0 -255
- package/src/cli/commands/probe/webhooks.ts +0 -163
- package/src/cli/commands/probe.ts +0 -535
- package/src/cli/commands/reference.ts +0 -87
- package/src/cli/commands/refresh-api.ts +0 -227
- package/src/cli/commands/remove-api.ts +0 -150
- package/src/cli/commands/report-bundle.ts +0 -310
- package/src/cli/commands/report.ts +0 -241
- package/src/cli/commands/request.ts +0 -548
- package/src/cli/commands/run.ts +0 -1142
- package/src/cli/commands/schema-from-runs.ts +0 -128
- package/src/cli/commands/secrets.ts +0 -133
- package/src/cli/commands/session.ts +0 -244
- package/src/cli/commands/use.ts +0 -74
- package/src/cli/index.ts +0 -55
- package/src/cli/json-envelope.ts +0 -108
- package/src/cli/json-schemas.ts +0 -314
- package/src/cli/output.ts +0 -40
- package/src/cli/program.ts +0 -219
- package/src/cli/resolve.ts +0 -105
- package/src/cli/runtime.ts +0 -7
- package/src/cli/safe-live.ts +0 -24
- package/src/cli/status-filter.ts +0 -114
- package/src/cli/util/api-context.ts +0 -85
- package/src/cli/version.ts +0 -8
- package/src/core/audit/persist.ts +0 -183
- package/src/core/checks/budget.ts +0 -59
- package/src/core/checks/checks/_crud-helpers.ts +0 -133
- package/src/core/checks/checks/_negative_mutator.ts +0 -133
- package/src/core/checks/checks/_readback-helpers.ts +0 -133
- package/src/core/checks/checks/content_type_conformance.ts +0 -39
- package/src/core/checks/checks/cross_call_references.ts +0 -147
- package/src/core/checks/checks/cursor_boundary_fuzzing.ts +0 -219
- package/src/core/checks/checks/ensure_resource_availability.ts +0 -62
- package/src/core/checks/checks/idempotency_replay.ts +0 -242
- package/src/core/checks/checks/ignored_auth.ts +0 -254
- package/src/core/checks/checks/index.ts +0 -68
- package/src/core/checks/checks/lifecycle_transitions.ts +0 -416
- package/src/core/checks/checks/missing_required_header.ts +0 -40
- package/src/core/checks/checks/negative_data_rejection.ts +0 -148
- package/src/core/checks/checks/not_a_server_error.ts +0 -35
- package/src/core/checks/checks/open_cors_on_sensitive.ts +0 -160
- package/src/core/checks/checks/pagination_invariants.ts +0 -419
- package/src/core/checks/checks/positive_data_acceptance.ts +0 -33
- package/src/core/checks/checks/rate_limit_headers_absent.ts +0 -77
- package/src/core/checks/checks/response_headers_conformance.ts +0 -74
- package/src/core/checks/checks/response_schema_conformance.ts +0 -30
- package/src/core/checks/checks/status_code_conformance.ts +0 -132
- package/src/core/checks/checks/unsupported_method.ts +0 -63
- package/src/core/checks/checks/use_after_free.ts +0 -78
- package/src/core/checks/index.ts +0 -30
- package/src/core/checks/mode.ts +0 -82
- package/src/core/checks/recommended-action.ts +0 -68
- package/src/core/checks/registry.ts +0 -78
- package/src/core/checks/runner.ts +0 -1461
- package/src/core/checks/sarif.ts +0 -230
- package/src/core/checks/spec-findings.ts +0 -308
- package/src/core/checks/stateful.ts +0 -121
- package/src/core/checks/types.ts +0 -305
- package/src/core/checks/zond-extensions.ts +0 -73
- package/src/core/classifier/recommended-action.ts +0 -251
- package/src/core/context/current.ts +0 -51
- package/src/core/context/session.ts +0 -78
- package/src/core/coverage/loader.ts +0 -216
- package/src/core/coverage/reasons.ts +0 -300
- package/src/core/diagnostics/db-analysis.ts +0 -666
- package/src/core/diagnostics/failure-class.ts +0 -140
- package/src/core/diagnostics/failure-hints.ts +0 -112
- package/src/core/diagnostics/spec-pointer.ts +0 -99
- package/src/core/diagnostics/suggested-fixes.ts +0 -155
- package/src/core/exporter/case-study/index.ts +0 -270
- package/src/core/exporter/curl.ts +0 -40
- package/src/core/exporter/exporter.ts +0 -48
- package/src/core/exporter/html-report/escape.ts +0 -24
- package/src/core/exporter/html-report/index.ts +0 -479
- package/src/core/exporter/html-report/script.ts +0 -100
- package/src/core/exporter/html-report/styles.ts +0 -408
- package/src/core/generator/catalog-builder.ts +0 -179
- package/src/core/generator/chunker.ts +0 -78
- package/src/core/generator/coverage-phase.ts +0 -0
- package/src/core/generator/coverage-scanner.ts +0 -87
- package/src/core/generator/data-factory.ts +0 -759
- package/src/core/generator/describe.ts +0 -302
- package/src/core/generator/endpoint-warnings.ts +0 -52
- package/src/core/generator/fixtures-builder.ts +0 -332
- package/src/core/generator/index.ts +0 -14
- package/src/core/generator/openapi-reader.ts +0 -297
- package/src/core/generator/path-param-disambig.ts +0 -140
- package/src/core/generator/resources-builder.ts +0 -898
- package/src/core/generator/schema-utils.ts +0 -112
- package/src/core/generator/serializer.ts +0 -343
- package/src/core/generator/suite-generator.ts +0 -1301
- package/src/core/generator/types.ts +0 -63
- package/src/core/identity/identity-file.ts +0 -0
- package/src/core/lint/affects.ts +0 -28
- package/src/core/lint/config.ts +0 -96
- package/src/core/lint/format.ts +0 -42
- package/src/core/lint/index.ts +0 -94
- package/src/core/lint/reporter.ts +0 -128
- package/src/core/lint/rules/consistency.ts +0 -158
- package/src/core/lint/rules/heuristics.ts +0 -97
- package/src/core/lint/rules/strictness.ts +0 -109
- package/src/core/lint/types.ts +0 -96
- package/src/core/lint/walker.ts +0 -248
- package/src/core/meta/meta-store.ts +0 -11
- package/src/core/output/README.md +0 -73
- package/src/core/output/index.ts +0 -13
- package/src/core/output/run.ts +0 -91
- package/src/core/output/types.ts +0 -122
- package/src/core/parser/dynamic-values.ts +0 -160
- package/src/core/parser/env-interpolation.ts +0 -104
- package/src/core/parser/filter.ts +0 -97
- package/src/core/parser/schema.ts +0 -359
- package/src/core/parser/types.ts +0 -117
- package/src/core/parser/variables.ts +0 -0
- package/src/core/parser/yaml-parser.ts +0 -181
- package/src/core/probe/bootstrap.ts +0 -34
- package/src/core/probe/dry-run-envelope.ts +0 -61
- package/src/core/probe/mass-assignment/classify.ts +0 -175
- package/src/core/probe/mass-assignment/cleanup.ts +0 -52
- package/src/core/probe/mass-assignment/digest.ts +0 -114
- package/src/core/probe/mass-assignment/orchestrator.ts +0 -459
- package/src/core/probe/mass-assignment/regression.ts +0 -141
- package/src/core/probe/mass-assignment/suspects.ts +0 -92
- package/src/core/probe/mass-assignment/types.ts +0 -135
- package/src/core/probe/mass-assignment-probe-class.ts +0 -198
- package/src/core/probe/mass-assignment-probe.ts +0 -27
- package/src/core/probe/mass-assignment-template.ts +0 -240
- package/src/core/probe/method-probe.ts +0 -164
- package/src/core/probe/method-shared.ts +0 -69
- package/src/core/probe/negative-probe.ts +0 -691
- package/src/core/probe/orphan-tracker.ts +0 -188
- package/src/core/probe/path-discovery.ts +0 -439
- package/src/core/probe/probe-harness.ts +0 -119
- package/src/core/probe/registry.ts +0 -89
- package/src/core/probe/runner.ts +0 -136
- package/src/core/probe/security/baseline.ts +0 -174
- package/src/core/probe/security/classify.ts +0 -341
- package/src/core/probe/security/cleanup.ts +0 -125
- package/src/core/probe/security/detectors.ts +0 -71
- package/src/core/probe/security/digest.ts +0 -104
- package/src/core/probe/security/orchestrator.ts +0 -398
- package/src/core/probe/security/regression.ts +0 -103
- package/src/core/probe/security/types.ts +0 -151
- package/src/core/probe/security-probe-class.ts +0 -207
- package/src/core/probe/security-probe.ts +0 -32
- package/src/core/probe/shared.ts +0 -531
- package/src/core/probe/static-probe-class.ts +0 -125
- package/src/core/probe/types.ts +0 -165
- package/src/core/probe/verdict-aggregator.ts +0 -33
- package/src/core/probe/webhooks-probe.ts +0 -282
- package/src/core/reporter/console.ts +0 -240
- package/src/core/reporter/index.ts +0 -22
- package/src/core/reporter/json.ts +0 -22
- package/src/core/reporter/junit.ts +0 -93
- package/src/core/reporter/ndjson.ts +0 -37
- package/src/core/reporter/types.ts +0 -15
- package/src/core/runner/assertions.ts +0 -383
- package/src/core/runner/async-pool.ts +0 -108
- package/src/core/runner/auth-path.ts +0 -8
- package/src/core/runner/ci-context.ts +0 -72
- package/src/core/runner/executor.ts +0 -652
- package/src/core/runner/expr-eval.ts +0 -41
- package/src/core/runner/form-encode.ts +0 -41
- package/src/core/runner/http-client.ts +0 -224
- package/src/core/runner/learn-drift.ts +0 -293
- package/src/core/runner/preflight-vars.ts +0 -153
- package/src/core/runner/progress-tracker.ts +0 -73
- package/src/core/runner/rate-limiter.ts +0 -185
- package/src/core/runner/run-kind.ts +0 -45
- package/src/core/runner/schema-validator.ts +0 -308
- package/src/core/runner/send-request.ts +0 -232
- package/src/core/runner/transforms.ts +0 -65
- package/src/core/runner/types.ts +0 -94
- package/src/core/secrets/registry.ts +0 -164
- package/src/core/secrets/secrets-file.ts +0 -115
- package/src/core/selectors/operation-filter.ts +0 -144
- package/src/core/setup-api.ts +0 -590
- package/src/core/severity/category.ts +0 -94
- package/src/core/severity/index.ts +0 -58
- package/src/core/spec/infer-schema.ts +0 -102
- package/src/core/spec/layers.ts +0 -154
- package/src/core/spec/merge-specs.ts +0 -156
- package/src/core/spec/schema-from-runs.ts +0 -117
- package/src/core/spec/schema-overlay.ts +0 -130
- package/src/core/util/ajv.ts +0 -13
- package/src/core/util/format-eta.ts +0 -21
- package/src/core/util/headers.ts +0 -9
- package/src/core/util/url.ts +0 -24
- package/src/core/utils.ts +0 -13
- package/src/core/workspace/config.ts +0 -129
- package/src/core/workspace/fixture-gap-report.ts +0 -84
- package/src/core/workspace/fixture-gaps.ts +0 -71
- package/src/core/workspace/manifest.ts +0 -283
- package/src/core/workspace/output-rotation.ts +0 -62
- package/src/core/workspace/root.ts +0 -96
- package/src/core/workspace/triage-path.ts +0 -87
- package/src/db/lint-runs.ts +0 -47
- package/src/db/migrate.ts +0 -128
- package/src/db/migrations/0001_run_kind.sql +0 -25
- package/src/db/migrations/0002_run_kind_request.sql +0 -59
- package/src/db/migrations/sql.d.ts +0 -4
- package/src/db/queries/collections.ts +0 -133
- package/src/db/queries/coverage.ts +0 -9
- package/src/db/queries/dashboard.ts +0 -59
- package/src/db/queries/results.ts +0 -216
- package/src/db/queries/runs.ts +0 -289
- package/src/db/queries/sessions.ts +0 -42
- package/src/db/queries/settings.ts +0 -28
- package/src/db/queries/types.ts +0 -172
- package/src/db/queries.ts +0 -75
- package/src/db/schema.ts +0 -298
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `zond add api <name> --spec <path|url>` — register a new API in the
|
|
3
|
-
* current workspace.
|
|
4
|
-
*
|
|
5
|
-
* The split from `zond init --spec` exists so the two operations
|
|
6
|
-
* (workspace bootstrap vs. API registration) have separate names and
|
|
7
|
-
* separate skill mentions. `init --spec` still works as a deprecated
|
|
8
|
-
* alias.
|
|
9
|
-
*
|
|
10
|
-
* This command refuses to run when no workspace marker is present,
|
|
11
|
-
* pointing the user at `zond init` first. setupApi handles spec
|
|
12
|
-
* snapshot + artifact generation.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { setupApi, type SetupApiResult } from "../../core/setup-api.ts";
|
|
16
|
-
import { findWorkspaceRoot } from "../../core/workspace/root.ts";
|
|
17
|
-
import { jsonOk, jsonError, printJson, zerr } from "../json-envelope.ts";
|
|
18
|
-
import { printError, printSuccess } from "../output.ts";
|
|
19
|
-
|
|
20
|
-
export interface AddApiOptions {
|
|
21
|
-
name: string;
|
|
22
|
-
/** One or more specs. Multiple → deterministic union (ARV-375). */
|
|
23
|
-
specs?: string[];
|
|
24
|
-
baseUrl?: string;
|
|
25
|
-
dir?: string;
|
|
26
|
-
force?: boolean;
|
|
27
|
-
insecure?: boolean;
|
|
28
|
-
caPath?: string;
|
|
29
|
-
dbPath?: string;
|
|
30
|
-
json?: boolean;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export async function addApiCommand(opts: AddApiOptions): Promise<number> {
|
|
34
|
-
const ws = findWorkspaceRoot();
|
|
35
|
-
if (ws.fromFallback) {
|
|
36
|
-
const m = `No workspace detected (no zond.config.yml / .zond / apis marker). Run \`zond init\` first to bootstrap a workspace.`;
|
|
37
|
-
if (opts.json) printJson(jsonError("add-api", [m])); else printError(m);
|
|
38
|
-
return 2;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const envVars: Record<string, string> = {};
|
|
42
|
-
if (opts.baseUrl) envVars.base_url = opts.baseUrl;
|
|
43
|
-
|
|
44
|
-
const hasSpec = (opts.specs?.length ?? 0) > 0;
|
|
45
|
-
let result: SetupApiResult;
|
|
46
|
-
try {
|
|
47
|
-
result = await setupApi({
|
|
48
|
-
name: opts.name,
|
|
49
|
-
specs: opts.specs,
|
|
50
|
-
dir: opts.dir,
|
|
51
|
-
envVars: Object.keys(envVars).length > 0 ? envVars : undefined,
|
|
52
|
-
dbPath: opts.dbPath,
|
|
53
|
-
force: opts.force,
|
|
54
|
-
insecure: opts.insecure,
|
|
55
|
-
caPath: opts.caPath,
|
|
56
|
-
});
|
|
57
|
-
} catch (err) {
|
|
58
|
-
const m = (err as Error).message;
|
|
59
|
-
// Tag known spec-ingest failures with a structured code so downstream
|
|
60
|
-
// tooling (skills, retry logic) can branch on it (ARV-145). Cyclic
|
|
61
|
-
// structures escape decycleSchema only when @readme/openapi-parser
|
|
62
|
-
// builds an unusual graph — surface that as spec_load_failure with a
|
|
63
|
-
// pointer to the underlying serializer message.
|
|
64
|
-
const isCycleError = /cyclic structures|spec_serialize_failed/i.test(m);
|
|
65
|
-
const errInput = isCycleError ? zerr("spec_load_failure", m) : m;
|
|
66
|
-
if (opts.json) printJson(jsonError("add-api", [errInput])); else printError(m);
|
|
67
|
-
return 2;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const mode: "spec" | "run-only" = hasSpec ? "spec" : "run-only";
|
|
71
|
-
const artifacts = mode === "spec"
|
|
72
|
-
? ["spec.json", ".api-catalog.yaml", ".api-resources.yaml", ".api-fixtures.yaml", ".env.yaml"]
|
|
73
|
-
: [".env.yaml"];
|
|
74
|
-
|
|
75
|
-
if (opts.json) {
|
|
76
|
-
printJson(jsonOk("add-api", {
|
|
77
|
-
api: opts.name,
|
|
78
|
-
mode,
|
|
79
|
-
collectionId: result.collectionId,
|
|
80
|
-
baseDir: result.baseDir,
|
|
81
|
-
testPath: result.testPath,
|
|
82
|
-
endpoints: result.specEndpoints,
|
|
83
|
-
artifacts,
|
|
84
|
-
}, result.warnings));
|
|
85
|
-
} else {
|
|
86
|
-
if (mode === "spec") {
|
|
87
|
-
printSuccess(`Registered API '${opts.name}' at ${result.baseDir} (${result.specEndpoints} endpoints)`);
|
|
88
|
-
process.stdout.write(` Artifacts: spec.json + .api-catalog.yaml + .api-resources.yaml + .api-fixtures.yaml\n`);
|
|
89
|
-
if (result.authVars && result.authVars.length > 0) {
|
|
90
|
-
const list = result.authVars.map((v) => `\`${v}\``).join(", ");
|
|
91
|
-
process.stdout.write(` Auth required: fill ${list} in ${result.baseDir}/.secrets.yaml (already wired via @secret in .env.yaml).\n`);
|
|
92
|
-
}
|
|
93
|
-
process.stdout.write(` Next: run \`zond doctor --api ${opts.name}\` to see required fixtures.\n`);
|
|
94
|
-
} else {
|
|
95
|
-
printSuccess(`Registered API '${opts.name}' at ${result.baseDir} (no spec — run-only mode)`);
|
|
96
|
-
process.stdout.write(` Artifacts: .env.yaml (base_url=${opts.baseUrl})\n`);
|
|
97
|
-
process.stdout.write(` Next: write tests in ${result.testPath}/, run \`zond run --api ${opts.name} <test.yaml>\`.\n`);
|
|
98
|
-
process.stdout.write(` To enable generate/probe/validate-schema, attach a spec: \`zond refresh-api ${opts.name} --spec <path|url>\`.\n`);
|
|
99
|
-
}
|
|
100
|
-
if (result.warnings) for (const w of result.warnings) process.stderr.write(`Warning: ${w}\n`);
|
|
101
|
-
}
|
|
102
|
-
return 0;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
import type { Command } from "commander";
|
|
106
|
-
import { globalJson } from "../resolve.ts";
|
|
107
|
-
|
|
108
|
-
export function registerAdd(program: Command): void {
|
|
109
|
-
const add = program.command("add").description("Register objects in the workspace");
|
|
110
|
-
add
|
|
111
|
-
.command("api <name>")
|
|
112
|
-
.description("Register an API: from an OpenAPI spec (full toolkit) or just --base-url (run-only mode)")
|
|
113
|
-
.option(
|
|
114
|
-
"--spec <path>",
|
|
115
|
-
"Path or URL to OpenAPI spec — enables generate/probe/validate-schema. Repeat --spec to union multiple specs (e.g. v1 + v2) into one merged audit target (ARV-375).",
|
|
116
|
-
(val: string, acc: string[]) => acc.concat(val),
|
|
117
|
-
[] as string[],
|
|
118
|
-
)
|
|
119
|
-
.option("--base-url <url>", "Base URL recorded in .env.yaml (required if --spec is omitted)")
|
|
120
|
-
.option("--dir <path>", "Target directory (defaults to apis/<name>/)")
|
|
121
|
-
.option("--force", "Overwrite an existing API with the same name")
|
|
122
|
-
.option("--insecure", "Skip TLS verification when fetching the spec from https")
|
|
123
|
-
.option("--ca <path>", "PEM CA bundle to trust for the spec fetch (adds to public roots; also reads NODE_EXTRA_CA_CERTS) — use instead of --insecure for internal/corp CAs")
|
|
124
|
-
.option("--db <path>", "Path to SQLite database file")
|
|
125
|
-
.action(async (name: string, opts, cmd: Command) => {
|
|
126
|
-
const json = globalJson(cmd);
|
|
127
|
-
const specs: string[] = Array.isArray(opts.spec) ? opts.spec : (opts.spec ? [opts.spec] : []);
|
|
128
|
-
if (specs.length === 0 && !opts.baseUrl) {
|
|
129
|
-
const m = "Provide --spec <path|url> for a full registration, or --base-url <url> for run-only mode.";
|
|
130
|
-
if (json) printJson(jsonError("add-api", [m])); else printError(m);
|
|
131
|
-
process.exitCode = 2;
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
process.exitCode = await addApiCommand({
|
|
135
|
-
name,
|
|
136
|
-
specs,
|
|
137
|
-
baseUrl: opts.baseUrl,
|
|
138
|
-
dir: opts.dir,
|
|
139
|
-
force: opts.force === true,
|
|
140
|
-
insecure: opts.insecure === true,
|
|
141
|
-
caPath: typeof opts.ca === "string" ? opts.ca : undefined,
|
|
142
|
-
dbPath: typeof opts.db === "string" ? opts.db : undefined,
|
|
143
|
-
json,
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ARV-187 / idempotency: parser + expected shape.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { z } from "zod";
|
|
6
|
-
import type { ResourcePatch } from "./overlay.ts";
|
|
7
|
-
import type { ResourceSlice } from "./prompts.ts";
|
|
8
|
-
|
|
9
|
-
const IdempotencySchema = z.object({
|
|
10
|
-
header: z.string().default("Idempotency-Key"),
|
|
11
|
-
scope: z.enum(["endpoint", "global"]).optional(),
|
|
12
|
-
ignore_response_fields: z.array(z.string()).optional(),
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
const ResponseSchema = z.object({
|
|
16
|
-
resource: z.string(),
|
|
17
|
-
idempotency: IdempotencySchema.nullable(),
|
|
18
|
-
rationale: z.string().optional(),
|
|
19
|
-
confidence: z.enum(["low", "medium", "high"]).optional(),
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
export const EXPECTED_OUTPUT_SHAPE = {
|
|
23
|
-
resource: "string (echo input)",
|
|
24
|
-
idempotency: {
|
|
25
|
-
header: "string (header name, e.g. 'Idempotency-Key')",
|
|
26
|
-
scope: "endpoint | global (optional)",
|
|
27
|
-
ignore_response_fields: "string[] (optional — fields that change between replays, e.g. 'created')",
|
|
28
|
-
},
|
|
29
|
-
rationale: "string (optional)",
|
|
30
|
-
confidence: "low | medium | high",
|
|
31
|
-
null_form: "if create endpoint doesn't support idempotency-replay, return { resource, idempotency: null }",
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
export function parseIdempotencyResponse(parsed: unknown, slice: ResourceSlice): { patch: ResourcePatch; audit: Record<string, unknown> } {
|
|
35
|
-
const validated = ResponseSchema.safeParse(parsed);
|
|
36
|
-
if (!validated.success) {
|
|
37
|
-
throw new Error(`idempotency response failed schema for ${slice.resource}: ${validated.error.message}`);
|
|
38
|
-
}
|
|
39
|
-
const v = validated.data;
|
|
40
|
-
if (v.idempotency == null) {
|
|
41
|
-
return {
|
|
42
|
-
patch: { resource: slice.resource },
|
|
43
|
-
audit: { resource: slice.resource, rationale: v.rationale, confidence: v.confidence, dropped: "no Idempotency-Key support" },
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
return {
|
|
47
|
-
patch: {
|
|
48
|
-
resource: slice.resource,
|
|
49
|
-
idempotency: {
|
|
50
|
-
header: v.idempotency.header,
|
|
51
|
-
scope: v.idempotency.scope,
|
|
52
|
-
ignore_response_fields: v.idempotency.ignore_response_fields,
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
audit: { resource: slice.resource, rationale: v.rationale, confidence: v.confidence },
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function isApplicable(slice: ResourceSlice): boolean { return Boolean(slice.endpoints.create); }
|