From f7edc8aefd2eba9f8ab325b8cb9b4a14a4c5038d Mon Sep 17 00:00:00 2001 From: HengYang Date: Sat, 26 Sep 2026 13:06:25 +0800 Subject: [PATCH 01/33] fix(verify): distinguish appended exchanges from archive refreshes --- README.md | 11 +- cli/index-conversations.js | 14 +- dist/index-cli.js | 20 +- dist/mcp-server.js | 6341 ++++++++++++++++++++++-- dist/verify.d.ts | 10 +- dist/verify.js | 53 +- src/index-cli.ts | 20 +- src/verify.ts | 52 +- test/index-cli-single-instance.test.ts | 23 +- test/verify.test.ts | 101 +- 10 files changed, 6212 insertions(+), 433 deletions(-) diff --git a/README.md b/README.md index ee952317..9e64bc63 100644 --- a/README.md +++ b/README.md @@ -372,9 +372,14 @@ This test uses your normal Claude Code auth and writes small test transcripts to Manual indexing tools for bulk operations and maintenance. See `episodic-memory index --help` for full options. Common operations: -- `--cleanup` - Index all unprocessed conversations -- `--verify` - Check index health -- `--repair` - Fix detected issues +- `--cleanup` - Index unprocessed exchanges; summaries may call an AI provider unless disabled +- `--verify` - Distinguish missing summaries, unindexed archives, appended exchanges, and archive mtime refreshes +- `--repair` - Re-embed and regenerate summaries for repair candidates; review the scope and provider cost first + +An archive mtime refresh without new exchanges is reported separately and is +not an outdated-index repair target. An unindexed archive is reported, but +that status alone does not select it for `--repair`; a separate overlapping +repair category may still cause it to be processed. ### `episodic-memory search` diff --git a/cli/index-conversations.js b/cli/index-conversations.js index 4d5f5bf5..77ea6f10 100755 --- a/cli/index-conversations.js +++ b/cli/index-conversations.js @@ -50,16 +50,16 @@ USAGE: COMMANDS: (default) Index all conversations - --cleanup Process only unindexed conversations (fast, cheap) + --cleanup Process unindexed exchanges (may generate AI summaries) --session ID Index specific session (used by hook) - --verify Check index health - --repair Fix detected issues + --verify Classify index and summary state + --repair Re-embed and summarize repair candidates (review first) --rebuild Delete DB and re-index everything (requires confirmation) OPTIONS: --concurrency N Parallel summarization (1-16, default: 1) -c N Short form of --concurrency - --no-summaries Skip AI summary generation (free, but no summaries in results) + --no-summaries Skip AI summary provider calls --help, -h Show this help EXAMPLES: @@ -69,13 +69,13 @@ EXAMPLES: # Index with 8 parallel summarizations (8x faster) index-conversations --cleanup --concurrency 8 - # Index without AI summaries (free, fast) + # Index without AI summary provider calls index-conversations --cleanup --no-summaries # Check index health index-conversations --verify - # Fix any issues found + # Review candidates and provider cost before broad repair index-conversations --repair # Nuclear option (deletes everything, re-indexes) @@ -85,7 +85,7 @@ WORKFLOW: 1. Initial setup: index-conversations --cleanup 2. Ongoing: Auto-indexed by sessionEnd hook 3. Health check: index-conversations --verify (weekly) - 4. Recovery: index-conversations --repair (if issues found) + 4. Recovery: review exact verifier categories before repair SEE ALSO: INDEXING.md - Setup and maintenance guide diff --git a/dist/index-cli.js b/dist/index-cli.js index 950a4c7d..f8b34bc7 100644 --- a/dist/index-cli.js +++ b/dist/index-cli.js @@ -63,15 +63,25 @@ async function main() { const issues = await verifyIndex(); console.log('\n=== Verification Results ==='); console.log(`Missing summaries: ${issues.missing.length}`); + console.log(`Unindexed archives: ${issues.unindexed.length}`); console.log(`Orphaned entries: ${issues.orphaned.length}`); console.log(`Outdated files: ${issues.outdated.length}`); + console.log(`Archive refreshes (no new exchanges): ${issues.archiveRefreshes.length}`); console.log(`Corrupted files: ${issues.corrupted.length}`); if (issues.missing.length > 0) { console.log('\nMissing summaries:'); issues.missing.forEach(m => console.log(` ${m.path}`)); } - if (issues.missing.length + issues.orphaned.length + issues.outdated.length + issues.corrupted.length > 0) { - console.log('\nRun with --repair to fix these issues.'); + if (issues.unindexed.length > 0) { + console.log('\nUnindexed archives:'); + issues.unindexed.forEach(item => console.log(` ${item.path}`)); + } + if (issues.outdated.length > 0) { + console.log('\nArchives with appended exchanges:'); + issues.outdated.forEach(item => console.log(` ${item.path}`)); + } + if (issues.missing.length + issues.unindexed.length + issues.orphaned.length + issues.outdated.length + issues.corrupted.length > 0) { + console.log('\nReview exact candidates before repair; --repair may regenerate summaries and embeddings.'); process.exit(1); } else { @@ -81,10 +91,14 @@ async function main() { case 'repair': console.log('Verifying conversation index...'); const repairIssues = await verifyIndex(); + if (repairIssues.unindexed.length > 0) { + console.log(`${repairIssues.unindexed.length} unindexed archive(s) require separate review; --repair does not select them by this status alone.`); + process.exitCode = 1; + } if (repairIssues.missing.length + repairIssues.orphaned.length + repairIssues.outdated.length > 0) { await repairIndex(repairIssues); } - else { + else if (repairIssues.unindexed.length === 0) { console.log('✅ No issues to repair!'); } break; diff --git a/dist/mcp-server.js b/dist/mcp-server.js index e3a9adac..ca13e73b 100644 --- a/dist/mcp-server.js +++ b/dist/mcp-server.js @@ -29,9 +29,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge mod )); -// node_modules/ajv/dist/compile/codegen/code.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js var require_code = __commonJS({ - "node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; @@ -183,9 +183,9 @@ var require_code = __commonJS({ } }); -// node_modules/ajv/dist/compile/codegen/scope.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js var require_scope = __commonJS({ - "node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; @@ -328,9 +328,9 @@ var require_scope = __commonJS({ } }); -// node_modules/ajv/dist/compile/codegen/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js var require_codegen = __commonJS({ - "node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; @@ -1048,9 +1048,9 @@ var require_codegen = __commonJS({ } }); -// node_modules/ajv/dist/compile/util.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js var require_util = __commonJS({ - "node_modules/ajv/dist/compile/util.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; @@ -1215,9 +1215,9 @@ var require_util = __commonJS({ } }); -// node_modules/ajv/dist/compile/names.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js var require_names = __commonJS({ - "node_modules/ajv/dist/compile/names.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -1254,9 +1254,9 @@ var require_names = __commonJS({ } }); -// node_modules/ajv/dist/compile/errors.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js var require_errors = __commonJS({ - "node_modules/ajv/dist/compile/errors.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; @@ -1376,9 +1376,9 @@ var require_errors = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/boolSchema.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js var require_boolSchema = __commonJS({ - "node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; @@ -1427,9 +1427,9 @@ var require_boolSchema = __commonJS({ } }); -// node_modules/ajv/dist/compile/rules.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js var require_rules = __commonJS({ - "node_modules/ajv/dist/compile/rules.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getRules = exports.isJSONType = void 0; @@ -1458,9 +1458,9 @@ var require_rules = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/applicability.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js var require_applicability = __commonJS({ - "node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; @@ -1481,9 +1481,9 @@ var require_applicability = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/dataType.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js var require_dataType = __commonJS({ - "node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; @@ -1665,9 +1665,9 @@ var require_dataType = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/defaults.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js var require_defaults = __commonJS({ - "node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.assignDefaults = void 0; @@ -1702,9 +1702,9 @@ var require_defaults = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/code.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js var require_code2 = __commonJS({ - "node_modules/ajv/dist/vocabularies/code.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; @@ -1775,13 +1775,13 @@ var require_code2 = __commonJS({ exports.callValidateCode = callValidateCode; var newRegExp = (0, codegen_1._)`new RegExp`; function usePattern({ gen, it: { opts } }, pattern) { - const u3 = opts.unicodeRegExp ? "u" : ""; + const u = opts.unicodeRegExp ? "u" : ""; const { regExp } = opts.code; - const rx = regExp(pattern, u3); + const rx = regExp(pattern, u); return gen.scopeValue("pattern", { key: rx.toString(), ref: rx, - code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u3})` + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` }); } exports.usePattern = usePattern; @@ -1835,9 +1835,9 @@ var require_code2 = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/keyword.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js var require_keyword = __commonJS({ - "node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; @@ -1953,9 +1953,9 @@ var require_keyword = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/subschema.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js var require_subschema = __commonJS({ - "node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; @@ -2159,9 +2159,9 @@ var require_json_schema_traverse = __commonJS({ } }); -// node_modules/ajv/dist/compile/resolve.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js var require_resolve = __commonJS({ - "node_modules/ajv/dist/compile/resolve.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; @@ -2315,9 +2315,9 @@ var require_resolve = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js var require_validate = __commonJS({ - "node_modules/ajv/dist/compile/validate/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; @@ -2823,9 +2823,9 @@ var require_validate = __commonJS({ } }); -// node_modules/ajv/dist/runtime/validation_error.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js var require_validation_error = __commonJS({ - "node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ValidationError = class extends Error { @@ -2839,9 +2839,9 @@ var require_validation_error = __commonJS({ } }); -// node_modules/ajv/dist/compile/ref_error.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js var require_ref_error = __commonJS({ - "node_modules/ajv/dist/compile/ref_error.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var resolve_1 = require_resolve(); @@ -2856,9 +2856,9 @@ var require_ref_error = __commonJS({ } }); -// node_modules/ajv/dist/compile/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js var require_compile = __commonJS({ - "node_modules/ajv/dist/compile/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; @@ -3080,9 +3080,9 @@ var require_compile = __commonJS({ } }); -// node_modules/ajv/dist/refs/data.json +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json var require_data = __commonJS({ - "node_modules/ajv/dist/refs/data.json"(exports, module) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json"(exports, module) { module.exports = { $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", @@ -4217,9 +4217,9 @@ var require_fast_uri = __commonJS({ } }); -// node_modules/ajv/dist/runtime/uri.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js var require_uri = __commonJS({ - "node_modules/ajv/dist/runtime/uri.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var uri = require_fast_uri(); @@ -4228,9 +4228,9 @@ var require_uri = __commonJS({ } }); -// node_modules/ajv/dist/core.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js var require_core = __commonJS({ - "node_modules/ajv/dist/core.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; @@ -4839,9 +4839,9 @@ var require_core = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/core/id.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js var require_id = __commonJS({ - "node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var def = { @@ -4854,9 +4854,9 @@ var require_id = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/core/ref.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js var require_ref = __commonJS({ - "node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.callRef = exports.getValidate = void 0; @@ -4976,9 +4976,9 @@ var require_ref = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/core/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js var require_core2 = __commonJS({ - "node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var id_1 = require_id(); @@ -4997,9 +4997,9 @@ var require_core2 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitNumber.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js var require_limitNumber = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5029,9 +5029,9 @@ var require_limitNumber = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/multipleOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js var require_multipleOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5057,9 +5057,9 @@ var require_multipleOf = __commonJS({ } }); -// node_modules/ajv/dist/runtime/ucs2length.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js var require_ucs2length = __commonJS({ - "node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function ucs2length(str) { @@ -5083,9 +5083,9 @@ var require_ucs2length = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitLength.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js var require_limitLength = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5115,9 +5115,9 @@ var require_limitLength = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/pattern.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js var require_pattern = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5135,12 +5135,12 @@ var require_pattern = __commonJS({ error: error61, code(cxt) { const { gen, data, $data, schema, schemaCode, it } = cxt; - const u3 = it.opts.unicodeRegExp ? "u" : ""; + const u = it.opts.unicodeRegExp ? "u" : ""; if ($data) { const { regExp } = it.opts.code; const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); const valid = gen.let("valid"); - gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u3}).test(${data})`), () => gen.assign(valid, false)); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); cxt.fail$data((0, codegen_1._)`!${valid}`); } else { const regExp = (0, code_1.usePattern)(cxt, schema); @@ -5152,9 +5152,9 @@ var require_pattern = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitProperties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js var require_limitProperties = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5181,9 +5181,9 @@ var require_limitProperties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/required.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js var require_required = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5263,9 +5263,9 @@ var require_required = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js var require_limitItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5292,9 +5292,9 @@ var require_limitItems = __commonJS({ } }); -// node_modules/ajv/dist/runtime/equal.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js var require_equal = __commonJS({ - "node_modules/ajv/dist/runtime/equal.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var equal = require_fast_deep_equal(); @@ -5303,9 +5303,9 @@ var require_equal = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js var require_uniqueItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var dataType_1 = require_dataType(); @@ -5370,9 +5370,9 @@ var require_uniqueItems = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/const.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js var require_const = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5399,9 +5399,9 @@ var require_const = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/enum.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js var require_enum = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5448,9 +5448,9 @@ var require_enum = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js var require_validation = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var limitNumber_1 = require_limitNumber(); @@ -5486,9 +5486,9 @@ var require_validation = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js var require_additionalItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateAdditionalItems = void 0; @@ -5539,9 +5539,9 @@ var require_additionalItems = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/items.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js var require_items = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateTuple = void 0; @@ -5583,10 +5583,10 @@ var require_items = __commonJS({ }); function checkStrictTuple(sch) { const { opts, errSchemaPath } = it; - const l = schArr.length; - const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false); + const l3 = schArr.length; + const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); if (opts.strictTuples && !fullTuple) { - const msg = `"${keyword}" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); } } @@ -5596,9 +5596,9 @@ var require_items = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js var require_prefixItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var items_1 = require_items(); @@ -5613,9 +5613,9 @@ var require_prefixItems = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/items2020.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js var require_items2020 = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5648,9 +5648,9 @@ var require_items2020 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/contains.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js var require_contains = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5742,9 +5742,9 @@ var require_contains = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/dependencies.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js var require_dependencies = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; @@ -5836,9 +5836,9 @@ var require_dependencies = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js var require_propertyNames = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5879,9 +5879,9 @@ var require_propertyNames = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js var require_additionalProperties = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5985,9 +5985,9 @@ var require_additionalProperties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/properties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js var require_properties = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var validate_1 = require_validate(); @@ -6043,9 +6043,9 @@ var require_properties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js var require_patternProperties = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6117,9 +6117,9 @@ var require_patternProperties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/not.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js var require_not = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6148,9 +6148,9 @@ var require_not = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/anyOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js var require_anyOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6165,9 +6165,9 @@ var require_anyOf = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/oneOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js var require_oneOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6223,9 +6223,9 @@ var require_oneOf = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/allOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js var require_allOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6250,9 +6250,9 @@ var require_allOf = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/if.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js var require_if = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6319,9 +6319,9 @@ var require_if = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/thenElse.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js var require_thenElse = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6337,9 +6337,9 @@ var require_thenElse = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js var require_applicator = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var additionalItems_1 = require_additionalItems(); @@ -6385,9 +6385,9 @@ var require_applicator = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/format/format.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js var require_format = __commonJS({ - "node_modules/ajv/dist/vocabularies/format/format.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6475,9 +6475,9 @@ var require_format = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/format/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js var require_format2 = __commonJS({ - "node_modules/ajv/dist/vocabularies/format/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var format_1 = require_format(); @@ -6486,9 +6486,9 @@ var require_format2 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/metadata.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js var require_metadata = __commonJS({ - "node_modules/ajv/dist/vocabularies/metadata.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.contentVocabulary = exports.metadataVocabulary = void 0; @@ -6509,9 +6509,9 @@ var require_metadata = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/draft7.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js var require_draft7 = __commonJS({ - "node_modules/ajv/dist/vocabularies/draft7.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var core_1 = require_core2(); @@ -6531,9 +6531,9 @@ var require_draft7 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/discriminator/types.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js var require_types = __commonJS({ - "node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DiscrError = void 0; @@ -6545,9 +6545,9 @@ var require_types = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/discriminator/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js var require_discriminator = __commonJS({ - "node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6650,9 +6650,9 @@ var require_discriminator = __commonJS({ } }); -// node_modules/ajv/dist/refs/json-schema-draft-07.json +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json var require_json_schema_draft_07 = __commonJS({ - "node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { module.exports = { $schema: "http://json-schema.org/draft-07/schema#", $id: "http://json-schema.org/draft-07/schema#", @@ -6807,9 +6807,9 @@ var require_json_schema_draft_07 = __commonJS({ } }); -// node_modules/ajv/dist/ajv.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js var require_ajv = __commonJS({ - "node_modules/ajv/dist/ajv.js"(exports, module) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js"(exports, module) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; @@ -7080,14 +7080,5621 @@ var require_formats = __commonJS({ } }); +// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js +var require_code3 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; + var _CodeOrName = class { + }; + exports._CodeOrName = _CodeOrName; + exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; + var Name = class extends _CodeOrName { + constructor(s) { + super(); + if (!exports.IDENTIFIER.test(s)) + throw new Error("CodeGen: name must be a valid identifier"); + this.str = s; + } + toString() { + return this.str; + } + emptyStr() { + return false; + } + get names() { + return { [this.str]: 1 }; + } + }; + exports.Name = Name; + var _Code = class extends _CodeOrName { + constructor(code) { + super(); + this._items = typeof code === "string" ? [code] : code; + } + toString() { + return this.str; + } + emptyStr() { + if (this._items.length > 1) + return false; + const item = this._items[0]; + return item === "" || item === '""'; + } + get str() { + var _a3; + return (_a3 = this._str) !== null && _a3 !== void 0 ? _a3 : this._str = this._items.reduce((s, c) => `${s}${c}`, ""); + } + get names() { + var _a3; + return (_a3 = this._names) !== null && _a3 !== void 0 ? _a3 : this._names = this._items.reduce((names, c) => { + if (c instanceof Name) + names[c.str] = (names[c.str] || 0) + 1; + return names; + }, {}); + } + }; + exports._Code = _Code; + exports.nil = new _Code(""); + function _2(strs, ...args) { + const code = [strs[0]]; + let i = 0; + while (i < args.length) { + addCodeArg(code, args[i]); + code.push(strs[++i]); + } + return new _Code(code); + } + exports._ = _2; + var plus = new _Code("+"); + function str(strs, ...args) { + const expr = [safeStringify(strs[0])]; + let i = 0; + while (i < args.length) { + expr.push(plus); + addCodeArg(expr, args[i]); + expr.push(plus, safeStringify(strs[++i])); + } + optimize(expr); + return new _Code(expr); + } + exports.str = str; + function addCodeArg(code, arg) { + if (arg instanceof _Code) + code.push(...arg._items); + else if (arg instanceof Name) + code.push(arg); + else + code.push(interpolate(arg)); + } + exports.addCodeArg = addCodeArg; + function optimize(expr) { + let i = 1; + while (i < expr.length - 1) { + if (expr[i] === plus) { + const res = mergeExprItems(expr[i - 1], expr[i + 1]); + if (res !== void 0) { + expr.splice(i - 1, 3, res); + continue; + } + expr[i++] = "+"; + } + i++; + } + } + function mergeExprItems(a, b2) { + if (b2 === '""') + return a; + if (a === '""') + return b2; + if (typeof a == "string") { + if (b2 instanceof Name || a[a.length - 1] !== '"') + return; + if (typeof b2 != "string") + return `${a.slice(0, -1)}${b2}"`; + if (b2[0] === '"') + return a.slice(0, -1) + b2.slice(1); + return; + } + if (typeof b2 == "string" && b2[0] === '"' && !(a instanceof Name)) + return `"${a}${b2.slice(1)}`; + return; + } + function strConcat(c1, c2) { + return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str`${c1}${c2}`; + } + exports.strConcat = strConcat; + function interpolate(x2) { + return typeof x2 == "number" || typeof x2 == "boolean" || x2 === null ? x2 : safeStringify(Array.isArray(x2) ? x2.join(",") : x2); + } + function stringify(x2) { + return new _Code(safeStringify(x2)); + } + exports.stringify = stringify; + function safeStringify(x2) { + return JSON.stringify(x2).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); + } + exports.safeStringify = safeStringify; + function getProperty(key) { + return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _2`[${key}]`; + } + exports.getProperty = getProperty; + function getEsmExportName(key) { + if (typeof key == "string" && exports.IDENTIFIER.test(key)) { + return new _Code(`${key}`); + } + throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`); + } + exports.getEsmExportName = getEsmExportName; + function regexpCode(rx) { + return new _Code(rx.toString()); + } + exports.regexpCode = regexpCode; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js +var require_scope2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; + var code_1 = require_code3(); + var ValueError = class extends Error { + constructor(name) { + super(`CodeGen: "code" for ${name} not defined`); + this.value = name.value; + } + }; + var UsedValueState; + (function(UsedValueState2) { + UsedValueState2[UsedValueState2["Started"] = 0] = "Started"; + UsedValueState2[UsedValueState2["Completed"] = 1] = "Completed"; + })(UsedValueState || (exports.UsedValueState = UsedValueState = {})); + exports.varKinds = { + const: new code_1.Name("const"), + let: new code_1.Name("let"), + var: new code_1.Name("var") + }; + var Scope = class { + constructor({ prefixes, parent } = {}) { + this._names = {}; + this._prefixes = prefixes; + this._parent = parent; + } + toName(nameOrPrefix) { + return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix); + } + name(prefix) { + return new code_1.Name(this._newName(prefix)); + } + _newName(prefix) { + const ng = this._names[prefix] || this._nameGroup(prefix); + return `${prefix}${ng.index++}`; + } + _nameGroup(prefix) { + var _a3, _b; + if (((_b = (_a3 = this._parent) === null || _a3 === void 0 ? void 0 : _a3._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || this._prefixes && !this._prefixes.has(prefix)) { + throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`); + } + return this._names[prefix] = { prefix, index: 0 }; + } + }; + exports.Scope = Scope; + var ValueScopeName = class extends code_1.Name { + constructor(prefix, nameStr) { + super(nameStr); + this.prefix = prefix; + } + setValue(value, { property, itemIndex }) { + this.value = value; + this.scopePath = (0, code_1._)`.${new code_1.Name(property)}[${itemIndex}]`; + } + }; + exports.ValueScopeName = ValueScopeName; + var line = (0, code_1._)`\n`; + var ValueScope = class extends Scope { + constructor(opts) { + super(opts); + this._values = {}; + this._scope = opts.scope; + this.opts = { ...opts, _n: opts.lines ? line : code_1.nil }; + } + get() { + return this._scope; + } + name(prefix) { + return new ValueScopeName(prefix, this._newName(prefix)); + } + value(nameOrPrefix, value) { + var _a3; + if (value.ref === void 0) + throw new Error("CodeGen: ref must be passed in value"); + const name = this.toName(nameOrPrefix); + const { prefix } = name; + const valueKey = (_a3 = value.key) !== null && _a3 !== void 0 ? _a3 : value.ref; + let vs = this._values[prefix]; + if (vs) { + const _name = vs.get(valueKey); + if (_name) + return _name; + } else { + vs = this._values[prefix] = /* @__PURE__ */ new Map(); + } + vs.set(valueKey, name); + const s = this._scope[prefix] || (this._scope[prefix] = []); + const itemIndex = s.length; + s[itemIndex] = value.ref; + name.setValue(value, { property: prefix, itemIndex }); + return name; + } + getValue(prefix, keyOrRef) { + const vs = this._values[prefix]; + if (!vs) + return; + return vs.get(keyOrRef); + } + scopeRefs(scopeName, values = this._values) { + return this._reduceValues(values, (name) => { + if (name.scopePath === void 0) + throw new Error(`CodeGen: name "${name}" has no value`); + return (0, code_1._)`${scopeName}${name.scopePath}`; + }); + } + scopeCode(values = this._values, usedValues, getCode) { + return this._reduceValues(values, (name) => { + if (name.value === void 0) + throw new Error(`CodeGen: name "${name}" has no value`); + return name.value.code; + }, usedValues, getCode); + } + _reduceValues(values, valueCode, usedValues = {}, getCode) { + let code = code_1.nil; + for (const prefix in values) { + const vs = values[prefix]; + if (!vs) + continue; + const nameSet = usedValues[prefix] = usedValues[prefix] || /* @__PURE__ */ new Map(); + vs.forEach((name) => { + if (nameSet.has(name)) + return; + nameSet.set(name, UsedValueState.Started); + let c = valueCode(name); + if (c) { + const def = this.opts.es5 ? exports.varKinds.var : exports.varKinds.const; + code = (0, code_1._)`${code}${def} ${name} = ${c};${this.opts._n}`; + } else if (c = getCode === null || getCode === void 0 ? void 0 : getCode(name)) { + code = (0, code_1._)`${code}${c}${this.opts._n}`; + } else { + throw new ValueError(name); + } + nameSet.set(name, UsedValueState.Completed); + }); + } + return code; + } + }; + exports.ValueScope = ValueScope; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js +var require_codegen2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; + var code_1 = require_code3(); + var scope_1 = require_scope2(); + var code_2 = require_code3(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return code_2._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return code_2.str; + } }); + Object.defineProperty(exports, "strConcat", { enumerable: true, get: function() { + return code_2.strConcat; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return code_2.nil; + } }); + Object.defineProperty(exports, "getProperty", { enumerable: true, get: function() { + return code_2.getProperty; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return code_2.stringify; + } }); + Object.defineProperty(exports, "regexpCode", { enumerable: true, get: function() { + return code_2.regexpCode; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return code_2.Name; + } }); + var scope_2 = require_scope2(); + Object.defineProperty(exports, "Scope", { enumerable: true, get: function() { + return scope_2.Scope; + } }); + Object.defineProperty(exports, "ValueScope", { enumerable: true, get: function() { + return scope_2.ValueScope; + } }); + Object.defineProperty(exports, "ValueScopeName", { enumerable: true, get: function() { + return scope_2.ValueScopeName; + } }); + Object.defineProperty(exports, "varKinds", { enumerable: true, get: function() { + return scope_2.varKinds; + } }); + exports.operators = { + GT: new code_1._Code(">"), + GTE: new code_1._Code(">="), + LT: new code_1._Code("<"), + LTE: new code_1._Code("<="), + EQ: new code_1._Code("==="), + NEQ: new code_1._Code("!=="), + NOT: new code_1._Code("!"), + OR: new code_1._Code("||"), + AND: new code_1._Code("&&"), + ADD: new code_1._Code("+") + }; + var Node = class { + optimizeNodes() { + return this; + } + optimizeNames(_names, _constants) { + return this; + } + }; + var Def = class extends Node { + constructor(varKind, name, rhs) { + super(); + this.varKind = varKind; + this.name = name; + this.rhs = rhs; + } + render({ es5, _n }) { + const varKind = es5 ? scope_1.varKinds.var : this.varKind; + const rhs = this.rhs === void 0 ? "" : ` = ${this.rhs}`; + return `${varKind} ${this.name}${rhs};` + _n; + } + optimizeNames(names, constants) { + if (!names[this.name.str]) + return; + if (this.rhs) + this.rhs = optimizeExpr(this.rhs, names, constants); + return this; + } + get names() { + return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {}; + } + }; + var Assign = class extends Node { + constructor(lhs, rhs, sideEffects) { + super(); + this.lhs = lhs; + this.rhs = rhs; + this.sideEffects = sideEffects; + } + render({ _n }) { + return `${this.lhs} = ${this.rhs};` + _n; + } + optimizeNames(names, constants) { + if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects) + return; + this.rhs = optimizeExpr(this.rhs, names, constants); + return this; + } + get names() { + const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names }; + return addExprNames(names, this.rhs); + } + }; + var AssignOp = class extends Assign { + constructor(lhs, op, rhs, sideEffects) { + super(lhs, rhs, sideEffects); + this.op = op; + } + render({ _n }) { + return `${this.lhs} ${this.op}= ${this.rhs};` + _n; + } + }; + var Label = class extends Node { + constructor(label) { + super(); + this.label = label; + this.names = {}; + } + render({ _n }) { + return `${this.label}:` + _n; + } + }; + var Break = class extends Node { + constructor(label) { + super(); + this.label = label; + this.names = {}; + } + render({ _n }) { + const label = this.label ? ` ${this.label}` : ""; + return `break${label};` + _n; + } + }; + var Throw = class extends Node { + constructor(error61) { + super(); + this.error = error61; + } + render({ _n }) { + return `throw ${this.error};` + _n; + } + get names() { + return this.error.names; + } + }; + var AnyCode = class extends Node { + constructor(code) { + super(); + this.code = code; + } + render({ _n }) { + return `${this.code};` + _n; + } + optimizeNodes() { + return `${this.code}` ? this : void 0; + } + optimizeNames(names, constants) { + this.code = optimizeExpr(this.code, names, constants); + return this; + } + get names() { + return this.code instanceof code_1._CodeOrName ? this.code.names : {}; + } + }; + var ParentNode = class extends Node { + constructor(nodes = []) { + super(); + this.nodes = nodes; + } + render(opts) { + return this.nodes.reduce((code, n) => code + n.render(opts), ""); + } + optimizeNodes() { + const { nodes } = this; + let i = nodes.length; + while (i--) { + const n = nodes[i].optimizeNodes(); + if (Array.isArray(n)) + nodes.splice(i, 1, ...n); + else if (n) + nodes[i] = n; + else + nodes.splice(i, 1); + } + return nodes.length > 0 ? this : void 0; + } + optimizeNames(names, constants) { + const { nodes } = this; + let i = nodes.length; + while (i--) { + const n = nodes[i]; + if (n.optimizeNames(names, constants)) + continue; + subtractNames(names, n.names); + nodes.splice(i, 1); + } + return nodes.length > 0 ? this : void 0; + } + get names() { + return this.nodes.reduce((names, n) => addNames(names, n.names), {}); + } + }; + var BlockNode = class extends ParentNode { + render(opts) { + return "{" + opts._n + super.render(opts) + "}" + opts._n; + } + }; + var Root = class extends ParentNode { + }; + var Else = class extends BlockNode { + }; + Else.kind = "else"; + var If = class _If extends BlockNode { + constructor(condition, nodes) { + super(nodes); + this.condition = condition; + } + render(opts) { + let code = `if(${this.condition})` + super.render(opts); + if (this.else) + code += "else " + this.else.render(opts); + return code; + } + optimizeNodes() { + super.optimizeNodes(); + const cond = this.condition; + if (cond === true) + return this.nodes; + let e = this.else; + if (e) { + const ns = e.optimizeNodes(); + e = this.else = Array.isArray(ns) ? new Else(ns) : ns; + } + if (e) { + if (cond === false) + return e instanceof _If ? e : e.nodes; + if (this.nodes.length) + return this; + return new _If(not(cond), e instanceof _If ? [e] : e.nodes); + } + if (cond === false || !this.nodes.length) + return void 0; + return this; + } + optimizeNames(names, constants) { + var _a3; + this.else = (_a3 = this.else) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); + if (!(super.optimizeNames(names, constants) || this.else)) + return; + this.condition = optimizeExpr(this.condition, names, constants); + return this; + } + get names() { + const names = super.names; + addExprNames(names, this.condition); + if (this.else) + addNames(names, this.else.names); + return names; + } + }; + If.kind = "if"; + var For = class extends BlockNode { + }; + For.kind = "for"; + var ForLoop = class extends For { + constructor(iteration) { + super(); + this.iteration = iteration; + } + render(opts) { + return `for(${this.iteration})` + super.render(opts); + } + optimizeNames(names, constants) { + if (!super.optimizeNames(names, constants)) + return; + this.iteration = optimizeExpr(this.iteration, names, constants); + return this; + } + get names() { + return addNames(super.names, this.iteration.names); + } + }; + var ForRange = class extends For { + constructor(varKind, name, from, to) { + super(); + this.varKind = varKind; + this.name = name; + this.from = from; + this.to = to; + } + render(opts) { + const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind; + const { name, from, to } = this; + return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts); + } + get names() { + const names = addExprNames(super.names, this.from); + return addExprNames(names, this.to); + } + }; + var ForIter = class extends For { + constructor(loop, varKind, name, iterable) { + super(); + this.loop = loop; + this.varKind = varKind; + this.name = name; + this.iterable = iterable; + } + render(opts) { + return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts); + } + optimizeNames(names, constants) { + if (!super.optimizeNames(names, constants)) + return; + this.iterable = optimizeExpr(this.iterable, names, constants); + return this; + } + get names() { + return addNames(super.names, this.iterable.names); + } + }; + var Func = class extends BlockNode { + constructor(name, args, async) { + super(); + this.name = name; + this.args = args; + this.async = async; + } + render(opts) { + const _async = this.async ? "async " : ""; + return `${_async}function ${this.name}(${this.args})` + super.render(opts); + } + }; + Func.kind = "func"; + var Return = class extends ParentNode { + render(opts) { + return "return " + super.render(opts); + } + }; + Return.kind = "return"; + var Try = class extends BlockNode { + render(opts) { + let code = "try" + super.render(opts); + if (this.catch) + code += this.catch.render(opts); + if (this.finally) + code += this.finally.render(opts); + return code; + } + optimizeNodes() { + var _a3, _b; + super.optimizeNodes(); + (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNodes(); + (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes(); + return this; + } + optimizeNames(names, constants) { + var _a3, _b; + super.optimizeNames(names, constants); + (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); + (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants); + return this; + } + get names() { + const names = super.names; + if (this.catch) + addNames(names, this.catch.names); + if (this.finally) + addNames(names, this.finally.names); + return names; + } + }; + var Catch = class extends BlockNode { + constructor(error61) { + super(); + this.error = error61; + } + render(opts) { + return `catch(${this.error})` + super.render(opts); + } + }; + Catch.kind = "catch"; + var Finally = class extends BlockNode { + render(opts) { + return "finally" + super.render(opts); + } + }; + Finally.kind = "finally"; + var CodeGen = class { + constructor(extScope, opts = {}) { + this._values = {}; + this._blockStarts = []; + this._constants = {}; + this.opts = { ...opts, _n: opts.lines ? "\n" : "" }; + this._extScope = extScope; + this._scope = new scope_1.Scope({ parent: extScope }); + this._nodes = [new Root()]; + } + toString() { + return this._root.render(this.opts); + } + // returns unique name in the internal scope + name(prefix) { + return this._scope.name(prefix); + } + // reserves unique name in the external scope + scopeName(prefix) { + return this._extScope.name(prefix); + } + // reserves unique name in the external scope and assigns value to it + scopeValue(prefixOrName, value) { + const name = this._extScope.value(prefixOrName, value); + const vs = this._values[name.prefix] || (this._values[name.prefix] = /* @__PURE__ */ new Set()); + vs.add(name); + return name; + } + getScopeValue(prefix, keyOrRef) { + return this._extScope.getValue(prefix, keyOrRef); + } + // return code that assigns values in the external scope to the names that are used internally + // (same names that were returned by gen.scopeName or gen.scopeValue) + scopeRefs(scopeName) { + return this._extScope.scopeRefs(scopeName, this._values); + } + scopeCode() { + return this._extScope.scopeCode(this._values); + } + _def(varKind, nameOrPrefix, rhs, constant) { + const name = this._scope.toName(nameOrPrefix); + if (rhs !== void 0 && constant) + this._constants[name.str] = rhs; + this._leafNode(new Def(varKind, name, rhs)); + return name; + } + // `const` declaration (`var` in es5 mode) + const(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant); + } + // `let` declaration with optional assignment (`var` in es5 mode) + let(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant); + } + // `var` declaration with optional assignment + var(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant); + } + // assignment code + assign(lhs, rhs, sideEffects) { + return this._leafNode(new Assign(lhs, rhs, sideEffects)); + } + // `+=` code + add(lhs, rhs) { + return this._leafNode(new AssignOp(lhs, exports.operators.ADD, rhs)); + } + // appends passed SafeExpr to code or executes Block + code(c) { + if (typeof c == "function") + c(); + else if (c !== code_1.nil) + this._leafNode(new AnyCode(c)); + return this; + } + // returns code for object literal for the passed argument list of key-value pairs + object(...keyValues) { + const code = ["{"]; + for (const [key, value] of keyValues) { + if (code.length > 1) + code.push(","); + code.push(key); + if (key !== value || this.opts.es5) { + code.push(":"); + (0, code_1.addCodeArg)(code, value); + } + } + code.push("}"); + return new code_1._Code(code); + } + // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed) + if(condition, thenBody, elseBody) { + this._blockNode(new If(condition)); + if (thenBody && elseBody) { + this.code(thenBody).else().code(elseBody).endIf(); + } else if (thenBody) { + this.code(thenBody).endIf(); + } else if (elseBody) { + throw new Error('CodeGen: "else" body without "then" body'); + } + return this; + } + // `else if` clause - invalid without `if` or after `else` clauses + elseIf(condition) { + return this._elseNode(new If(condition)); + } + // `else` clause - only valid after `if` or `else if` clauses + else() { + return this._elseNode(new Else()); + } + // end `if` statement (needed if gen.if was used only with condition) + endIf() { + return this._endBlockNode(If, Else); + } + _for(node2, forBody) { + this._blockNode(node2); + if (forBody) + this.code(forBody).endFor(); + return this; + } + // a generic `for` clause (or statement if `forBody` is passed) + for(iteration, forBody) { + return this._for(new ForLoop(iteration), forBody); + } + // `for` statement for a range of values + forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) { + const name = this._scope.toName(nameOrPrefix); + return this._for(new ForRange(varKind, name, from, to), () => forBody(name)); + } + // `for-of` statement (in es5 mode replace with a normal for loop) + forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) { + const name = this._scope.toName(nameOrPrefix); + if (this.opts.es5) { + const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable); + return this.forRange("_i", 0, (0, code_1._)`${arr}.length`, (i) => { + this.var(name, (0, code_1._)`${arr}[${i}]`); + forBody(name); + }); + } + return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name)); + } + // `for-in` statement. + // With option `ownProperties` replaced with a `for-of` loop for object keys + forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) { + if (this.opts.ownProperties) { + return this.forOf(nameOrPrefix, (0, code_1._)`Object.keys(${obj})`, forBody); + } + const name = this._scope.toName(nameOrPrefix); + return this._for(new ForIter("in", varKind, name, obj), () => forBody(name)); + } + // end `for` loop + endFor() { + return this._endBlockNode(For); + } + // `label` statement + label(label) { + return this._leafNode(new Label(label)); + } + // `break` statement + break(label) { + return this._leafNode(new Break(label)); + } + // `return` statement + return(value) { + const node2 = new Return(); + this._blockNode(node2); + this.code(value); + if (node2.nodes.length !== 1) + throw new Error('CodeGen: "return" should have one node'); + return this._endBlockNode(Return); + } + // `try` statement + try(tryBody, catchCode, finallyCode) { + if (!catchCode && !finallyCode) + throw new Error('CodeGen: "try" without "catch" and "finally"'); + const node2 = new Try(); + this._blockNode(node2); + this.code(tryBody); + if (catchCode) { + const error61 = this.name("e"); + this._currNode = node2.catch = new Catch(error61); + catchCode(error61); + } + if (finallyCode) { + this._currNode = node2.finally = new Finally(); + this.code(finallyCode); + } + return this._endBlockNode(Catch, Finally); + } + // `throw` statement + throw(error61) { + return this._leafNode(new Throw(error61)); + } + // start self-balancing block + block(body, nodeCount) { + this._blockStarts.push(this._nodes.length); + if (body) + this.code(body).endBlock(nodeCount); + return this; + } + // end the current self-balancing block + endBlock(nodeCount) { + const len = this._blockStarts.pop(); + if (len === void 0) + throw new Error("CodeGen: not in self-balancing block"); + const toClose = this._nodes.length - len; + if (toClose < 0 || nodeCount !== void 0 && toClose !== nodeCount) { + throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`); + } + this._nodes.length = len; + return this; + } + // `function` heading (or definition if funcBody is passed) + func(name, args = code_1.nil, async, funcBody) { + this._blockNode(new Func(name, args, async)); + if (funcBody) + this.code(funcBody).endFunc(); + return this; + } + // end function definition + endFunc() { + return this._endBlockNode(Func); + } + optimize(n = 1) { + while (n-- > 0) { + this._root.optimizeNodes(); + this._root.optimizeNames(this._root.names, this._constants); + } + } + _leafNode(node2) { + this._currNode.nodes.push(node2); + return this; + } + _blockNode(node2) { + this._currNode.nodes.push(node2); + this._nodes.push(node2); + } + _endBlockNode(N1, N2) { + const n = this._currNode; + if (n instanceof N1 || N2 && n instanceof N2) { + this._nodes.pop(); + return this; + } + throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`); + } + _elseNode(node2) { + const n = this._currNode; + if (!(n instanceof If)) { + throw new Error('CodeGen: "else" without "if"'); + } + this._currNode = n.else = node2; + return this; + } + get _root() { + return this._nodes[0]; + } + get _currNode() { + const ns = this._nodes; + return ns[ns.length - 1]; + } + set _currNode(node2) { + const ns = this._nodes; + ns[ns.length - 1] = node2; + } + }; + exports.CodeGen = CodeGen; + function addNames(names, from) { + for (const n in from) + names[n] = (names[n] || 0) + (from[n] || 0); + return names; + } + function addExprNames(names, from) { + return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names; + } + function optimizeExpr(expr, names, constants) { + if (expr instanceof code_1.Name) + return replaceName(expr); + if (!canOptimize(expr)) + return expr; + return new code_1._Code(expr._items.reduce((items, c) => { + if (c instanceof code_1.Name) + c = replaceName(c); + if (c instanceof code_1._Code) + items.push(...c._items); + else + items.push(c); + return items; + }, [])); + function replaceName(n) { + const c = constants[n.str]; + if (c === void 0 || names[n.str] !== 1) + return n; + delete names[n.str]; + return c; + } + function canOptimize(e) { + return e instanceof code_1._Code && e._items.some((c) => c instanceof code_1.Name && names[c.str] === 1 && constants[c.str] !== void 0); + } + } + function subtractNames(names, from) { + for (const n in from) + names[n] = (names[n] || 0) - (from[n] || 0); + } + function not(x2) { + return typeof x2 == "boolean" || typeof x2 == "number" || x2 === null ? !x2 : (0, code_1._)`!${par(x2)}`; + } + exports.not = not; + var andCode = mappend(exports.operators.AND); + function and(...args) { + return args.reduce(andCode); + } + exports.and = and; + var orCode = mappend(exports.operators.OR); + function or(...args) { + return args.reduce(orCode); + } + exports.or = or; + function mappend(op) { + return (x2, y2) => x2 === code_1.nil ? y2 : y2 === code_1.nil ? x2 : (0, code_1._)`${par(x2)} ${op} ${par(y2)}`; + } + function par(x2) { + return x2 instanceof code_1.Name ? x2 : (0, code_1._)`(${x2})`; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js +var require_util2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; + var codegen_1 = require_codegen2(); + var code_1 = require_code3(); + function toHash(arr) { + const hash2 = {}; + for (const item of arr) + hash2[item] = true; + return hash2; + } + exports.toHash = toHash; + function alwaysValidSchema(it, schema) { + if (typeof schema == "boolean") + return schema; + if (Object.keys(schema).length === 0) + return true; + checkUnknownRules(it, schema); + return !schemaHasRules(schema, it.self.RULES.all); + } + exports.alwaysValidSchema = alwaysValidSchema; + function checkUnknownRules(it, schema = it.schema) { + const { opts, self } = it; + if (!opts.strictSchema) + return; + if (typeof schema === "boolean") + return; + const rules = self.RULES.keywords; + for (const key in schema) { + if (!rules[key]) + checkStrictMode(it, `unknown keyword: "${key}"`); + } + } + exports.checkUnknownRules = checkUnknownRules; + function schemaHasRules(schema, rules) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (rules[key]) + return true; + return false; + } + exports.schemaHasRules = schemaHasRules; + function schemaHasRulesButRef(schema, RULES) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (key !== "$ref" && RULES.all[key]) + return true; + return false; + } + exports.schemaHasRulesButRef = schemaHasRulesButRef; + function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) { + if (!$data) { + if (typeof schema == "number" || typeof schema == "boolean") + return schema; + if (typeof schema == "string") + return (0, codegen_1._)`${schema}`; + } + return (0, codegen_1._)`${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`; + } + exports.schemaRefOrVal = schemaRefOrVal; + function unescapeFragment(str) { + return unescapeJsonPointer(decodeURIComponent(str)); + } + exports.unescapeFragment = unescapeFragment; + function escapeFragment(str) { + return encodeURIComponent(escapeJsonPointer(str)); + } + exports.escapeFragment = escapeFragment; + function escapeJsonPointer(str) { + if (typeof str == "number") + return `${str}`; + return str.replace(/~/g, "~0").replace(/\//g, "~1"); + } + exports.escapeJsonPointer = escapeJsonPointer; + function unescapeJsonPointer(str) { + return str.replace(/~1/g, "/").replace(/~0/g, "~"); + } + exports.unescapeJsonPointer = unescapeJsonPointer; + function eachItem(xs, f) { + if (Array.isArray(xs)) { + for (const x2 of xs) + f(x2); + } else { + f(xs); + } + } + exports.eachItem = eachItem; + function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues: mergeValues2, resultToName }) { + return (gen, from, to, toName) => { + const res = to === void 0 ? from : to instanceof codegen_1.Name ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to) : from instanceof codegen_1.Name ? (mergeToName(gen, to, from), from) : mergeValues2(from, to); + return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res; + }; + } + exports.mergeEvaluated = { + props: makeMergeEvaluated({ + mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => { + gen.if((0, codegen_1._)`${from} === true`, () => gen.assign(to, true), () => gen.assign(to, (0, codegen_1._)`${to} || {}`).code((0, codegen_1._)`Object.assign(${to}, ${from})`)); + }), + mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => { + if (from === true) { + gen.assign(to, true); + } else { + gen.assign(to, (0, codegen_1._)`${to} || {}`); + setEvaluated(gen, to, from); + } + }), + mergeValues: (from, to) => from === true ? true : { ...from, ...to }, + resultToName: evaluatedPropsToName + }), + items: makeMergeEvaluated({ + mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => gen.assign(to, (0, codegen_1._)`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)), + mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => gen.assign(to, from === true ? true : (0, codegen_1._)`${to} > ${from} ? ${to} : ${from}`)), + mergeValues: (from, to) => from === true ? true : Math.max(from, to), + resultToName: (gen, items) => gen.var("items", items) + }) + }; + function evaluatedPropsToName(gen, ps) { + if (ps === true) + return gen.var("props", true); + const props = gen.var("props", (0, codegen_1._)`{}`); + if (ps !== void 0) + setEvaluated(gen, props, ps); + return props; + } + exports.evaluatedPropsToName = evaluatedPropsToName; + function setEvaluated(gen, props, ps) { + Object.keys(ps).forEach((p) => gen.assign((0, codegen_1._)`${props}${(0, codegen_1.getProperty)(p)}`, true)); + } + exports.setEvaluated = setEvaluated; + var snippets = {}; + function useFunc(gen, f) { + return gen.scopeValue("func", { + ref: f, + code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code)) + }); + } + exports.useFunc = useFunc; + var Type; + (function(Type2) { + Type2[Type2["Num"] = 0] = "Num"; + Type2[Type2["Str"] = 1] = "Str"; + })(Type || (exports.Type = Type = {})); + function getErrorPath(dataProp, dataPropType, jsPropertySyntax) { + if (dataProp instanceof codegen_1.Name) { + const isNumber = dataPropType === Type.Num; + return jsPropertySyntax ? isNumber ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`; + } + return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp); + } + exports.getErrorPath = getErrorPath; + function checkStrictMode(it, msg, mode = it.opts.strictSchema) { + if (!mode) + return; + msg = `strict mode: ${msg}`; + if (mode === true) + throw new Error(msg); + it.self.logger.warn(msg); + } + exports.checkStrictMode = checkStrictMode; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js +var require_names2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var names = { + // validation function arguments + data: new codegen_1.Name("data"), + // data passed to validation function + // args passed from referencing schema + valCxt: new codegen_1.Name("valCxt"), + // validation/data context - should not be used directly, it is destructured to the names below + instancePath: new codegen_1.Name("instancePath"), + parentData: new codegen_1.Name("parentData"), + parentDataProperty: new codegen_1.Name("parentDataProperty"), + rootData: new codegen_1.Name("rootData"), + // root data - same as the data passed to the first/top validation function + dynamicAnchors: new codegen_1.Name("dynamicAnchors"), + // used to support recursiveRef and dynamicRef + // function scoped variables + vErrors: new codegen_1.Name("vErrors"), + // null or array of validation errors + errors: new codegen_1.Name("errors"), + // counter of validation errors + this: new codegen_1.Name("this"), + // "globals" + self: new codegen_1.Name("self"), + scope: new codegen_1.Name("scope"), + // JTD serialize/parse name for JSON string and position + json: new codegen_1.Name("json"), + jsonPos: new codegen_1.Name("jsonPos"), + jsonLen: new codegen_1.Name("jsonLen"), + jsonPart: new codegen_1.Name("jsonPart") + }; + exports.default = names; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js +var require_errors2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var names_1 = require_names2(); + exports.keywordError = { + message: ({ keyword }) => (0, codegen_1.str)`must pass "${keyword}" keyword validation` + }; + exports.keyword$DataError = { + message: ({ keyword, schemaType }) => schemaType ? (0, codegen_1.str)`"${keyword}" keyword must be ${schemaType} ($data)` : (0, codegen_1.str)`"${keyword}" keyword is invalid ($data)` + }; + function reportError(cxt, error61 = exports.keywordError, errorPaths, overrideAllErrors) { + const { it } = cxt; + const { gen, compositeRule, allErrors } = it; + const errObj = errorObjectCode(cxt, error61, errorPaths); + if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : compositeRule || allErrors) { + addError(gen, errObj); + } else { + returnErrors(it, (0, codegen_1._)`[${errObj}]`); + } + } + exports.reportError = reportError; + function reportExtraError(cxt, error61 = exports.keywordError, errorPaths) { + const { it } = cxt; + const { gen, compositeRule, allErrors } = it; + const errObj = errorObjectCode(cxt, error61, errorPaths); + addError(gen, errObj); + if (!(compositeRule || allErrors)) { + returnErrors(it, names_1.default.vErrors); + } + } + exports.reportExtraError = reportExtraError; + function resetErrorsCount(gen, errsCount) { + gen.assign(names_1.default.errors, errsCount); + gen.if((0, codegen_1._)`${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign((0, codegen_1._)`${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null))); + } + exports.resetErrorsCount = resetErrorsCount; + function extendErrors({ gen, keyword, schemaValue, data, errsCount, it }) { + if (errsCount === void 0) + throw new Error("ajv implementation error"); + const err = gen.name("err"); + gen.forRange("i", errsCount, names_1.default.errors, (i) => { + gen.const(err, (0, codegen_1._)`${names_1.default.vErrors}[${i}]`); + gen.if((0, codegen_1._)`${err}.instancePath === undefined`, () => gen.assign((0, codegen_1._)`${err}.instancePath`, (0, codegen_1.strConcat)(names_1.default.instancePath, it.errorPath))); + gen.assign((0, codegen_1._)`${err}.schemaPath`, (0, codegen_1.str)`${it.errSchemaPath}/${keyword}`); + if (it.opts.verbose) { + gen.assign((0, codegen_1._)`${err}.schema`, schemaValue); + gen.assign((0, codegen_1._)`${err}.data`, data); + } + }); + } + exports.extendErrors = extendErrors; + function addError(gen, errObj) { + const err = gen.const("err", errObj); + gen.if((0, codegen_1._)`${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, (0, codegen_1._)`[${err}]`), (0, codegen_1._)`${names_1.default.vErrors}.push(${err})`); + gen.code((0, codegen_1._)`${names_1.default.errors}++`); + } + function returnErrors(it, errs) { + const { gen, validateName, schemaEnv } = it; + if (schemaEnv.$async) { + gen.throw((0, codegen_1._)`new ${it.ValidationError}(${errs})`); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, errs); + gen.return(false); + } + } + var E2 = { + keyword: new codegen_1.Name("keyword"), + schemaPath: new codegen_1.Name("schemaPath"), + // also used in JTD errors + params: new codegen_1.Name("params"), + propertyName: new codegen_1.Name("propertyName"), + message: new codegen_1.Name("message"), + schema: new codegen_1.Name("schema"), + parentSchema: new codegen_1.Name("parentSchema") + }; + function errorObjectCode(cxt, error61, errorPaths) { + const { createErrors } = cxt.it; + if (createErrors === false) + return (0, codegen_1._)`{}`; + return errorObject(cxt, error61, errorPaths); + } + function errorObject(cxt, error61, errorPaths = {}) { + const { gen, it } = cxt; + const keyValues = [ + errorInstancePath(it, errorPaths), + errorSchemaPath(cxt, errorPaths) + ]; + extraErrorProps(cxt, error61, keyValues); + return gen.object(...keyValues); + } + function errorInstancePath({ errorPath }, { instancePath }) { + const instPath = instancePath ? (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(instancePath, util_1.Type.Str)}` : errorPath; + return [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, instPath)]; + } + function errorSchemaPath({ keyword, it: { errSchemaPath } }, { schemaPath, parentSchema }) { + let schPath = parentSchema ? errSchemaPath : (0, codegen_1.str)`${errSchemaPath}/${keyword}`; + if (schemaPath) { + schPath = (0, codegen_1.str)`${schPath}${(0, util_1.getErrorPath)(schemaPath, util_1.Type.Str)}`; + } + return [E2.schemaPath, schPath]; + } + function extraErrorProps(cxt, { params, message }, keyValues) { + const { keyword, data, schemaValue, it } = cxt; + const { opts, propertyName, topSchemaRef, schemaPath } = it; + keyValues.push([E2.keyword, keyword], [E2.params, typeof params == "function" ? params(cxt) : params || (0, codegen_1._)`{}`]); + if (opts.messages) { + keyValues.push([E2.message, typeof message == "function" ? message(cxt) : message]); + } + if (opts.verbose) { + keyValues.push([E2.schema, schemaValue], [E2.parentSchema, (0, codegen_1._)`${topSchemaRef}${schemaPath}`], [names_1.default.data, data]); + } + if (propertyName) + keyValues.push([E2.propertyName, propertyName]); + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js +var require_boolSchema2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; + var errors_1 = require_errors2(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var boolError = { + message: "boolean schema is false" + }; + function topBoolOrEmptySchema(it) { + const { gen, schema, validateName } = it; + if (schema === false) { + falseSchemaError(it, false); + } else if (typeof schema == "object" && schema.$async === true) { + gen.return(names_1.default.data); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, null); + gen.return(true); + } + } + exports.topBoolOrEmptySchema = topBoolOrEmptySchema; + function boolOrEmptySchema(it, valid) { + const { gen, schema } = it; + if (schema === false) { + gen.var(valid, false); + falseSchemaError(it); + } else { + gen.var(valid, true); + } + } + exports.boolOrEmptySchema = boolOrEmptySchema; + function falseSchemaError(it, overrideAllErrors) { + const { gen, data } = it; + const cxt = { + gen, + keyword: "false schema", + data, + schema: false, + schemaCode: false, + schemaValue: false, + params: {}, + it + }; + (0, errors_1.reportError)(cxt, boolError, void 0, overrideAllErrors); + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js +var require_rules2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getRules = exports.isJSONType = void 0; + var _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"]; + var jsonTypes = new Set(_jsonTypes); + function isJSONType(x2) { + return typeof x2 == "string" && jsonTypes.has(x2); + } + exports.isJSONType = isJSONType; + function getRules() { + const groups = { + number: { type: "number", rules: [] }, + string: { type: "string", rules: [] }, + array: { type: "array", rules: [] }, + object: { type: "object", rules: [] } + }; + return { + types: { ...groups, integer: true, boolean: true, null: true }, + rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object], + post: { rules: [] }, + all: {}, + keywords: {} + }; + } + exports.getRules = getRules; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js +var require_applicability2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; + function schemaHasRulesForType({ schema, self }, type) { + const group = self.RULES.types[type]; + return group && group !== true && shouldUseGroup(schema, group); + } + exports.schemaHasRulesForType = schemaHasRulesForType; + function shouldUseGroup(schema, group) { + return group.rules.some((rule) => shouldUseRule(schema, rule)); + } + exports.shouldUseGroup = shouldUseGroup; + function shouldUseRule(schema, rule) { + var _a3; + return schema[rule.keyword] !== void 0 || ((_a3 = rule.definition.implements) === null || _a3 === void 0 ? void 0 : _a3.some((kwd) => schema[kwd] !== void 0)); + } + exports.shouldUseRule = shouldUseRule; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js +var require_dataType2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; + var rules_1 = require_rules2(); + var applicability_1 = require_applicability2(); + var errors_1 = require_errors2(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var DataType; + (function(DataType2) { + DataType2[DataType2["Correct"] = 0] = "Correct"; + DataType2[DataType2["Wrong"] = 1] = "Wrong"; + })(DataType || (exports.DataType = DataType = {})); + function getSchemaTypes(schema) { + const types = getJSONTypes(schema.type); + const hasNull = types.includes("null"); + if (hasNull) { + if (schema.nullable === false) + throw new Error("type: null contradicts nullable: false"); + } else { + if (!types.length && schema.nullable !== void 0) { + throw new Error('"nullable" cannot be used without "type"'); + } + if (schema.nullable === true) + types.push("null"); + } + return types; + } + exports.getSchemaTypes = getSchemaTypes; + function getJSONTypes(ts) { + const types = Array.isArray(ts) ? ts : ts ? [ts] : []; + if (types.every(rules_1.isJSONType)) + return types; + throw new Error("type must be JSONType or JSONType[]: " + types.join(",")); + } + exports.getJSONTypes = getJSONTypes; + function coerceAndCheckDataType(it, types) { + const { gen, data, opts } = it; + const coerceTo = coerceToTypes(types, opts.coerceTypes); + const checkTypes = types.length > 0 && !(coerceTo.length === 0 && types.length === 1 && (0, applicability_1.schemaHasRulesForType)(it, types[0])); + if (checkTypes) { + const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong); + gen.if(wrongType, () => { + if (coerceTo.length) + coerceData(it, types, coerceTo); + else + reportTypeError(it); + }); + } + return checkTypes; + } + exports.coerceAndCheckDataType = coerceAndCheckDataType; + var COERCIBLE = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean", "null"]); + function coerceToTypes(types, coerceTypes) { + return coerceTypes ? types.filter((t) => COERCIBLE.has(t) || coerceTypes === "array" && t === "array") : []; + } + function coerceData(it, types, coerceTo) { + const { gen, data, opts } = it; + const dataType = gen.let("dataType", (0, codegen_1._)`typeof ${data}`); + const coerced = gen.let("coerced", (0, codegen_1._)`undefined`); + if (opts.coerceTypes === "array") { + gen.if((0, codegen_1._)`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen.assign(data, (0, codegen_1._)`${data}[0]`).assign(dataType, (0, codegen_1._)`typeof ${data}`).if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))); + } + gen.if((0, codegen_1._)`${coerced} !== undefined`); + for (const t of coerceTo) { + if (COERCIBLE.has(t) || t === "array" && opts.coerceTypes === "array") { + coerceSpecificType(t); + } + } + gen.else(); + reportTypeError(it); + gen.endIf(); + gen.if((0, codegen_1._)`${coerced} !== undefined`, () => { + gen.assign(data, coerced); + assignParentData(it, coerced); + }); + function coerceSpecificType(t) { + switch (t) { + case "string": + gen.elseIf((0, codegen_1._)`${dataType} == "number" || ${dataType} == "boolean"`).assign(coerced, (0, codegen_1._)`"" + ${data}`).elseIf((0, codegen_1._)`${data} === null`).assign(coerced, (0, codegen_1._)`""`); + return; + case "number": + gen.elseIf((0, codegen_1._)`${dataType} == "boolean" || ${data} === null + || (${dataType} == "string" && ${data} && ${data} == +${data})`).assign(coerced, (0, codegen_1._)`+${data}`); + return; + case "integer": + gen.elseIf((0, codegen_1._)`${dataType} === "boolean" || ${data} === null + || (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`).assign(coerced, (0, codegen_1._)`+${data}`); + return; + case "boolean": + gen.elseIf((0, codegen_1._)`${data} === "false" || ${data} === 0 || ${data} === null`).assign(coerced, false).elseIf((0, codegen_1._)`${data} === "true" || ${data} === 1`).assign(coerced, true); + return; + case "null": + gen.elseIf((0, codegen_1._)`${data} === "" || ${data} === 0 || ${data} === false`); + gen.assign(coerced, null); + return; + case "array": + gen.elseIf((0, codegen_1._)`${dataType} === "string" || ${dataType} === "number" + || ${dataType} === "boolean" || ${data} === null`).assign(coerced, (0, codegen_1._)`[${data}]`); + } + } + } + function assignParentData({ gen, parentData, parentDataProperty }, expr) { + gen.if((0, codegen_1._)`${parentData} !== undefined`, () => gen.assign((0, codegen_1._)`${parentData}[${parentDataProperty}]`, expr)); + } + function checkDataType(dataType, data, strictNums, correct = DataType.Correct) { + const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ; + let cond; + switch (dataType) { + case "null": + return (0, codegen_1._)`${data} ${EQ} null`; + case "array": + cond = (0, codegen_1._)`Array.isArray(${data})`; + break; + case "object": + cond = (0, codegen_1._)`${data} && typeof ${data} == "object" && !Array.isArray(${data})`; + break; + case "integer": + cond = numCond((0, codegen_1._)`!(${data} % 1) && !isNaN(${data})`); + break; + case "number": + cond = numCond(); + break; + default: + return (0, codegen_1._)`typeof ${data} ${EQ} ${dataType}`; + } + return correct === DataType.Correct ? cond : (0, codegen_1.not)(cond); + function numCond(_cond = codegen_1.nil) { + return (0, codegen_1.and)((0, codegen_1._)`typeof ${data} == "number"`, _cond, strictNums ? (0, codegen_1._)`isFinite(${data})` : codegen_1.nil); + } + } + exports.checkDataType = checkDataType; + function checkDataTypes(dataTypes, data, strictNums, correct) { + if (dataTypes.length === 1) { + return checkDataType(dataTypes[0], data, strictNums, correct); + } + let cond; + const types = (0, util_1.toHash)(dataTypes); + if (types.array && types.object) { + const notObj = (0, codegen_1._)`typeof ${data} != "object"`; + cond = types.null ? notObj : (0, codegen_1._)`!${data} || ${notObj}`; + delete types.null; + delete types.array; + delete types.object; + } else { + cond = codegen_1.nil; + } + if (types.number) + delete types.integer; + for (const t in types) + cond = (0, codegen_1.and)(cond, checkDataType(t, data, strictNums, correct)); + return cond; + } + exports.checkDataTypes = checkDataTypes; + var typeError = { + message: ({ schema }) => `must be ${schema}`, + params: ({ schema, schemaValue }) => typeof schema == "string" ? (0, codegen_1._)`{type: ${schema}}` : (0, codegen_1._)`{type: ${schemaValue}}` + }; + function reportTypeError(it) { + const cxt = getTypeErrorContext(it); + (0, errors_1.reportError)(cxt, typeError); + } + exports.reportTypeError = reportTypeError; + function getTypeErrorContext(it) { + const { gen, data, schema } = it; + const schemaCode = (0, util_1.schemaRefOrVal)(it, schema, "type"); + return { + gen, + keyword: "type", + data, + schema: schema.type, + schemaCode, + schemaValue: schemaCode, + parentSchema: schema, + params: {}, + it + }; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js +var require_defaults2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.assignDefaults = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + function assignDefaults(it, ty) { + const { properties, items } = it.schema; + if (ty === "object" && properties) { + for (const key in properties) { + assignDefault(it, key, properties[key].default); + } + } else if (ty === "array" && Array.isArray(items)) { + items.forEach((sch, i) => assignDefault(it, i, sch.default)); + } + } + exports.assignDefaults = assignDefaults; + function assignDefault(it, prop, defaultValue) { + const { gen, compositeRule, data, opts } = it; + if (defaultValue === void 0) + return; + const childData = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(prop)}`; + if (compositeRule) { + (0, util_1.checkStrictMode)(it, `default is ignored for: ${childData}`); + return; + } + let condition = (0, codegen_1._)`${childData} === undefined`; + if (opts.useDefaults === "empty") { + condition = (0, codegen_1._)`${condition} || ${childData} === null || ${childData} === ""`; + } + gen.if(condition, (0, codegen_1._)`${childData} = ${(0, codegen_1.stringify)(defaultValue)}`); + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js +var require_code4 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var names_1 = require_names2(); + var util_2 = require_util2(); + function checkReportMissingProp(cxt, prop) { + const { gen, data, it } = cxt; + gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => { + cxt.setParams({ missingProperty: (0, codegen_1._)`${prop}` }, true); + cxt.error(); + }); + } + exports.checkReportMissingProp = checkReportMissingProp; + function checkMissingProp({ gen, data, it: { opts } }, properties, missing) { + return (0, codegen_1.or)(...properties.map((prop) => (0, codegen_1.and)(noPropertyInData(gen, data, prop, opts.ownProperties), (0, codegen_1._)`${missing} = ${prop}`))); + } + exports.checkMissingProp = checkMissingProp; + function reportMissingProp(cxt, missing) { + cxt.setParams({ missingProperty: missing }, true); + cxt.error(); + } + exports.reportMissingProp = reportMissingProp; + function hasPropFunc(gen) { + return gen.scopeValue("func", { + // eslint-disable-next-line @typescript-eslint/unbound-method + ref: Object.prototype.hasOwnProperty, + code: (0, codegen_1._)`Object.prototype.hasOwnProperty` + }); + } + exports.hasPropFunc = hasPropFunc; + function isOwnProperty(gen, data, property) { + return (0, codegen_1._)`${hasPropFunc(gen)}.call(${data}, ${property})`; + } + exports.isOwnProperty = isOwnProperty; + function propertyInData(gen, data, property, ownProperties) { + const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} !== undefined`; + return ownProperties ? (0, codegen_1._)`${cond} && ${isOwnProperty(gen, data, property)}` : cond; + } + exports.propertyInData = propertyInData; + function noPropertyInData(gen, data, property, ownProperties) { + const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} === undefined`; + return ownProperties ? (0, codegen_1.or)(cond, (0, codegen_1.not)(isOwnProperty(gen, data, property))) : cond; + } + exports.noPropertyInData = noPropertyInData; + function allSchemaProperties(schemaMap) { + return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : []; + } + exports.allSchemaProperties = allSchemaProperties; + function schemaProperties(it, schemaMap) { + return allSchemaProperties(schemaMap).filter((p) => !(0, util_1.alwaysValidSchema)(it, schemaMap[p])); + } + exports.schemaProperties = schemaProperties; + function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) { + const dataAndSchema = passSchema ? (0, codegen_1._)`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data; + const valCxt = [ + [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, errorPath)], + [names_1.default.parentData, it.parentData], + [names_1.default.parentDataProperty, it.parentDataProperty], + [names_1.default.rootData, names_1.default.rootData] + ]; + if (it.opts.dynamicRef) + valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]); + const args = (0, codegen_1._)`${dataAndSchema}, ${gen.object(...valCxt)}`; + return context !== codegen_1.nil ? (0, codegen_1._)`${func}.call(${context}, ${args})` : (0, codegen_1._)`${func}(${args})`; + } + exports.callValidateCode = callValidateCode; + var newRegExp = (0, codegen_1._)`new RegExp`; + function usePattern({ gen, it: { opts } }, pattern) { + const u = opts.unicodeRegExp ? "u" : ""; + const { regExp } = opts.code; + const rx = regExp(pattern, u); + return gen.scopeValue("pattern", { + key: rx.toString(), + ref: rx, + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` + }); + } + exports.usePattern = usePattern; + function validateArray(cxt) { + const { gen, data, keyword, it } = cxt; + const valid = gen.name("valid"); + if (it.allErrors) { + const validArr = gen.let("valid", true); + validateItems(() => gen.assign(validArr, false)); + return validArr; + } + gen.var(valid, true); + validateItems(() => gen.break()); + return valid; + function validateItems(notValid) { + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + gen.forRange("i", 0, len, (i) => { + cxt.subschema({ + keyword, + dataProp: i, + dataPropType: util_1.Type.Num + }, valid); + gen.if((0, codegen_1.not)(valid), notValid); + }); + } + } + exports.validateArray = validateArray; + function validateUnion(cxt) { + const { gen, schema, keyword, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const alwaysValid = schema.some((sch) => (0, util_1.alwaysValidSchema)(it, sch)); + if (alwaysValid && !it.opts.unevaluated) + return; + const valid = gen.let("valid", false); + const schValid = gen.name("_valid"); + gen.block(() => schema.forEach((_sch, i) => { + const schCxt = cxt.subschema({ + keyword, + schemaProp: i, + compositeRule: true + }, schValid); + gen.assign(valid, (0, codegen_1._)`${valid} || ${schValid}`); + const merged = cxt.mergeValidEvaluated(schCxt, schValid); + if (!merged) + gen.if((0, codegen_1.not)(valid)); + })); + cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); + } + exports.validateUnion = validateUnion; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js +var require_keyword2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var code_1 = require_code4(); + var errors_1 = require_errors2(); + function macroKeywordCode(cxt, def) { + const { gen, keyword, schema, parentSchema, it } = cxt; + const macroSchema = def.macro.call(it.self, schema, parentSchema, it); + const schemaRef = useKeyword(gen, keyword, macroSchema); + if (it.opts.validateSchema !== false) + it.self.validateSchema(macroSchema, true); + const valid = gen.name("valid"); + cxt.subschema({ + schema: macroSchema, + schemaPath: codegen_1.nil, + errSchemaPath: `${it.errSchemaPath}/${keyword}`, + topSchemaRef: schemaRef, + compositeRule: true + }, valid); + cxt.pass(valid, () => cxt.error(true)); + } + exports.macroKeywordCode = macroKeywordCode; + function funcKeywordCode(cxt, def) { + var _a3; + const { gen, keyword, schema, parentSchema, $data, it } = cxt; + checkAsyncKeyword(it, def); + const validate2 = !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate; + const validateRef = useKeyword(gen, keyword, validate2); + const valid = gen.let("valid"); + cxt.block$data(valid, validateKeyword); + cxt.ok((_a3 = def.valid) !== null && _a3 !== void 0 ? _a3 : valid); + function validateKeyword() { + if (def.errors === false) { + assignValid(); + if (def.modifying) + modifyData(cxt); + reportErrs(() => cxt.error()); + } else { + const ruleErrs = def.async ? validateAsync2() : validateSync(); + if (def.modifying) + modifyData(cxt); + reportErrs(() => addErrs(cxt, ruleErrs)); + } + } + function validateAsync2() { + const ruleErrs = gen.let("ruleErrs", null); + gen.try(() => assignValid((0, codegen_1._)`await `), (e) => gen.assign(valid, false).if((0, codegen_1._)`${e} instanceof ${it.ValidationError}`, () => gen.assign(ruleErrs, (0, codegen_1._)`${e}.errors`), () => gen.throw(e))); + return ruleErrs; + } + function validateSync() { + const validateErrs = (0, codegen_1._)`${validateRef}.errors`; + gen.assign(validateErrs, null); + assignValid(codegen_1.nil); + return validateErrs; + } + function assignValid(_await = def.async ? (0, codegen_1._)`await ` : codegen_1.nil) { + const passCxt = it.opts.passContext ? names_1.default.this : names_1.default.self; + const passSchema = !("compile" in def && !$data || def.schema === false); + gen.assign(valid, (0, codegen_1._)`${_await}${(0, code_1.callValidateCode)(cxt, validateRef, passCxt, passSchema)}`, def.modifying); + } + function reportErrs(errors) { + var _a4; + gen.if((0, codegen_1.not)((_a4 = def.valid) !== null && _a4 !== void 0 ? _a4 : valid), errors); + } + } + exports.funcKeywordCode = funcKeywordCode; + function modifyData(cxt) { + const { gen, data, it } = cxt; + gen.if(it.parentData, () => gen.assign(data, (0, codegen_1._)`${it.parentData}[${it.parentDataProperty}]`)); + } + function addErrs(cxt, errs) { + const { gen } = cxt; + gen.if((0, codegen_1._)`Array.isArray(${errs})`, () => { + gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`).assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); + (0, errors_1.extendErrors)(cxt); + }, () => cxt.error()); + } + function checkAsyncKeyword({ schemaEnv }, def) { + if (def.async && !schemaEnv.$async) + throw new Error("async keyword in sync schema"); + } + function useKeyword(gen, keyword, result) { + if (result === void 0) + throw new Error(`keyword "${keyword}" failed to compile`); + return gen.scopeValue("keyword", typeof result == "function" ? { ref: result } : { ref: result, code: (0, codegen_1.stringify)(result) }); + } + function validSchemaType(schema, schemaType, allowUndefined = false) { + return !schemaType.length || schemaType.some((st) => st === "array" ? Array.isArray(schema) : st === "object" ? schema && typeof schema == "object" && !Array.isArray(schema) : typeof schema == st || allowUndefined && typeof schema == "undefined"); + } + exports.validSchemaType = validSchemaType; + function validateKeywordUsage({ schema, opts, self, errSchemaPath }, def, keyword) { + if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) { + throw new Error("ajv implementation error"); + } + const deps = def.dependencies; + if (deps === null || deps === void 0 ? void 0 : deps.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) { + throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(",")}`); + } + if (def.validateSchema) { + const valid = def.validateSchema(schema[keyword]); + if (!valid) { + const msg = `keyword "${keyword}" value is invalid at path "${errSchemaPath}": ` + self.errorsText(def.validateSchema.errors); + if (opts.validateSchema === "log") + self.logger.error(msg); + else + throw new Error(msg); + } + } + } + exports.validateKeywordUsage = validateKeywordUsage; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js +var require_subschema2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + function getSubschema(it, { keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef }) { + if (keyword !== void 0 && schema !== void 0) { + throw new Error('both "keyword" and "schema" passed, only one allowed'); + } + if (keyword !== void 0) { + const sch = it.schema[keyword]; + return schemaProp === void 0 ? { + schema: sch, + schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}`, + errSchemaPath: `${it.errSchemaPath}/${keyword}` + } : { + schema: sch[schemaProp], + schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}${(0, codegen_1.getProperty)(schemaProp)}`, + errSchemaPath: `${it.errSchemaPath}/${keyword}/${(0, util_1.escapeFragment)(schemaProp)}` + }; + } + if (schema !== void 0) { + if (schemaPath === void 0 || errSchemaPath === void 0 || topSchemaRef === void 0) { + throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"'); + } + return { + schema, + schemaPath, + topSchemaRef, + errSchemaPath + }; + } + throw new Error('either "keyword" or "schema" must be passed'); + } + exports.getSubschema = getSubschema; + function extendSubschemaData(subschema, it, { dataProp, dataPropType: dpType, data, dataTypes, propertyName }) { + if (data !== void 0 && dataProp !== void 0) { + throw new Error('both "data" and "dataProp" passed, only one allowed'); + } + const { gen } = it; + if (dataProp !== void 0) { + const { errorPath, dataPathArr, opts } = it; + const nextData = gen.let("data", (0, codegen_1._)`${it.data}${(0, codegen_1.getProperty)(dataProp)}`, true); + dataContextProps(nextData); + subschema.errorPath = (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(dataProp, dpType, opts.jsPropertySyntax)}`; + subschema.parentDataProperty = (0, codegen_1._)`${dataProp}`; + subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty]; + } + if (data !== void 0) { + const nextData = data instanceof codegen_1.Name ? data : gen.let("data", data, true); + dataContextProps(nextData); + if (propertyName !== void 0) + subschema.propertyName = propertyName; + } + if (dataTypes) + subschema.dataTypes = dataTypes; + function dataContextProps(_nextData) { + subschema.data = _nextData; + subschema.dataLevel = it.dataLevel + 1; + subschema.dataTypes = []; + it.definedProperties = /* @__PURE__ */ new Set(); + subschema.parentData = it.data; + subschema.dataNames = [...it.dataNames, _nextData]; + } + } + exports.extendSubschemaData = extendSubschemaData; + function extendSubschemaMode(subschema, { jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors }) { + if (compositeRule !== void 0) + subschema.compositeRule = compositeRule; + if (createErrors !== void 0) + subschema.createErrors = createErrors; + if (allErrors !== void 0) + subschema.allErrors = allErrors; + subschema.jtdDiscriminator = jtdDiscriminator; + subschema.jtdMetadata = jtdMetadata; + } + exports.extendSubschemaMode = extendSubschemaMode; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js +var require_resolve2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; + var util_1 = require_util2(); + var equal = require_fast_deep_equal(); + var traverse = require_json_schema_traverse(); + var SIMPLE_INLINED = /* @__PURE__ */ new Set([ + "type", + "format", + "pattern", + "maxLength", + "minLength", + "maxProperties", + "minProperties", + "maxItems", + "minItems", + "maximum", + "minimum", + "uniqueItems", + "multipleOf", + "required", + "enum", + "const" + ]); + function inlineRef(schema, limit = true) { + if (typeof schema == "boolean") + return true; + if (limit === true) + return !hasRef(schema); + if (!limit) + return false; + return countKeys(schema) <= limit; + } + exports.inlineRef = inlineRef; + var REF_KEYWORDS = /* @__PURE__ */ new Set([ + "$ref", + "$recursiveRef", + "$recursiveAnchor", + "$dynamicRef", + "$dynamicAnchor" + ]); + function hasRef(schema) { + for (const key in schema) { + if (REF_KEYWORDS.has(key)) + return true; + const sch = schema[key]; + if (Array.isArray(sch) && sch.some(hasRef)) + return true; + if (typeof sch == "object" && hasRef(sch)) + return true; + } + return false; + } + function countKeys(schema) { + let count = 0; + for (const key in schema) { + if (key === "$ref") + return Infinity; + count++; + if (SIMPLE_INLINED.has(key)) + continue; + if (typeof schema[key] == "object") { + (0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch)); + } + if (count === Infinity) + return Infinity; + } + return count; + } + function getFullPath(resolver, id = "", normalize) { + if (normalize !== false) + id = normalizeId(id); + const p = resolver.parse(id); + return _getFullPath(resolver, p); + } + exports.getFullPath = getFullPath; + function _getFullPath(resolver, p) { + const serialized = resolver.serialize(p); + return serialized.split("#")[0] + "#"; + } + exports._getFullPath = _getFullPath; + var TRAILING_SLASH_HASH = /#\/?$/; + function normalizeId(id) { + return id ? id.replace(TRAILING_SLASH_HASH, "") : ""; + } + exports.normalizeId = normalizeId; + function resolveUrl(resolver, baseId, id) { + id = normalizeId(id); + return resolver.resolve(baseId, id); + } + exports.resolveUrl = resolveUrl; + var ANCHOR = /^[a-z_][-a-z0-9._]*$/i; + function getSchemaRefs(schema, baseId) { + if (typeof schema == "boolean") + return {}; + const { schemaId, uriResolver } = this.opts; + const schId = normalizeId(schema[schemaId] || baseId); + const baseIds = { "": schId }; + const pathPrefix = getFullPath(uriResolver, schId, false); + const localRefs = {}; + const schemaRefs = /* @__PURE__ */ new Set(); + traverse(schema, { allKeys: true }, (sch, jsonPtr, _2, parentJsonPtr) => { + if (parentJsonPtr === void 0) + return; + const fullPath = pathPrefix + jsonPtr; + let innerBaseId = baseIds[parentJsonPtr]; + if (typeof sch[schemaId] == "string") + innerBaseId = addRef.call(this, sch[schemaId]); + addAnchor.call(this, sch.$anchor); + addAnchor.call(this, sch.$dynamicAnchor); + baseIds[jsonPtr] = innerBaseId; + function addRef(ref) { + const _resolve = this.opts.uriResolver.resolve; + ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref); + if (schemaRefs.has(ref)) + throw ambiguos(ref); + schemaRefs.add(ref); + let schOrRef = this.refs[ref]; + if (typeof schOrRef == "string") + schOrRef = this.refs[schOrRef]; + if (typeof schOrRef == "object") { + checkAmbiguosRef(sch, schOrRef.schema, ref); + } else if (ref !== normalizeId(fullPath)) { + if (ref[0] === "#") { + checkAmbiguosRef(sch, localRefs[ref], ref); + localRefs[ref] = sch; + } else { + this.refs[ref] = fullPath; + } + } + return ref; + } + function addAnchor(anchor2) { + if (typeof anchor2 == "string") { + if (!ANCHOR.test(anchor2)) + throw new Error(`invalid anchor "${anchor2}"`); + addRef.call(this, `#${anchor2}`); + } + } + }); + return localRefs; + function checkAmbiguosRef(sch1, sch2, ref) { + if (sch2 !== void 0 && !equal(sch1, sch2)) + throw ambiguos(ref); + } + function ambiguos(ref) { + return new Error(`reference "${ref}" resolves to more than one schema`); + } + } + exports.getSchemaRefs = getSchemaRefs; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js +var require_validate2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; + var boolSchema_1 = require_boolSchema2(); + var dataType_1 = require_dataType2(); + var applicability_1 = require_applicability2(); + var dataType_2 = require_dataType2(); + var defaults_1 = require_defaults2(); + var keyword_1 = require_keyword2(); + var subschema_1 = require_subschema2(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var resolve_1 = require_resolve2(); + var util_1 = require_util2(); + var errors_1 = require_errors2(); + function validateFunctionCode(it) { + if (isSchemaObj(it)) { + checkKeywords(it); + if (schemaCxtHasRules(it)) { + topSchemaObjCode(it); + return; + } + } + validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it)); + } + exports.validateFunctionCode = validateFunctionCode; + function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) { + if (opts.code.es5) { + gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => { + gen.code((0, codegen_1._)`"use strict"; ${funcSourceUrl(schema, opts)}`); + destructureValCxtES5(gen, opts); + gen.code(body); + }); + } else { + gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body)); + } + } + function destructureValCxt(opts) { + return (0, codegen_1._)`{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._)`, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`; + } + function destructureValCxtES5(gen, opts) { + gen.if(names_1.default.valCxt, () => { + gen.var(names_1.default.instancePath, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.instancePath}`); + gen.var(names_1.default.parentData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentData}`); + gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentDataProperty}`); + gen.var(names_1.default.rootData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.rootData}`); + if (opts.dynamicRef) + gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`); + }, () => { + gen.var(names_1.default.instancePath, (0, codegen_1._)`""`); + gen.var(names_1.default.parentData, (0, codegen_1._)`undefined`); + gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`undefined`); + gen.var(names_1.default.rootData, names_1.default.data); + if (opts.dynamicRef) + gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`{}`); + }); + } + function topSchemaObjCode(it) { + const { schema, opts, gen } = it; + validateFunction(it, () => { + if (opts.$comment && schema.$comment) + commentKeyword(it); + checkNoDefault(it); + gen.let(names_1.default.vErrors, null); + gen.let(names_1.default.errors, 0); + if (opts.unevaluated) + resetEvaluated(it); + typeAndKeywords(it); + returnResults(it); + }); + return; + } + function resetEvaluated(it) { + const { gen, validateName } = it; + it.evaluated = gen.const("evaluated", (0, codegen_1._)`${validateName}.evaluated`); + gen.if((0, codegen_1._)`${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._)`${it.evaluated}.props`, (0, codegen_1._)`undefined`)); + gen.if((0, codegen_1._)`${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._)`${it.evaluated}.items`, (0, codegen_1._)`undefined`)); + } + function funcSourceUrl(schema, opts) { + const schId = typeof schema == "object" && schema[opts.schemaId]; + return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._)`/*# sourceURL=${schId} */` : codegen_1.nil; + } + function subschemaCode(it, valid) { + if (isSchemaObj(it)) { + checkKeywords(it); + if (schemaCxtHasRules(it)) { + subSchemaObjCode(it, valid); + return; + } + } + (0, boolSchema_1.boolOrEmptySchema)(it, valid); + } + function schemaCxtHasRules({ schema, self }) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (self.RULES.all[key]) + return true; + return false; + } + function isSchemaObj(it) { + return typeof it.schema != "boolean"; + } + function subSchemaObjCode(it, valid) { + const { schema, gen, opts } = it; + if (opts.$comment && schema.$comment) + commentKeyword(it); + updateContext(it); + checkAsyncSchema(it); + const errsCount = gen.const("_errs", names_1.default.errors); + typeAndKeywords(it, errsCount); + gen.var(valid, (0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + } + function checkKeywords(it) { + (0, util_1.checkUnknownRules)(it); + checkRefsAndKeywords(it); + } + function typeAndKeywords(it, errsCount) { + if (it.opts.jtd) + return schemaKeywords(it, [], false, errsCount); + const types = (0, dataType_1.getSchemaTypes)(it.schema); + const checkedTypes = (0, dataType_1.coerceAndCheckDataType)(it, types); + schemaKeywords(it, types, !checkedTypes, errsCount); + } + function checkRefsAndKeywords(it) { + const { schema, errSchemaPath, opts, self } = it; + if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) { + self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`); + } + } + function checkNoDefault(it) { + const { schema, opts } = it; + if (schema.default !== void 0 && opts.useDefaults && opts.strictSchema) { + (0, util_1.checkStrictMode)(it, "default is ignored in the schema root"); + } + } + function updateContext(it) { + const schId = it.schema[it.opts.schemaId]; + if (schId) + it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId); + } + function checkAsyncSchema(it) { + if (it.schema.$async && !it.schemaEnv.$async) + throw new Error("async schema in sync schema"); + } + function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) { + const msg = schema.$comment; + if (opts.$comment === true) { + gen.code((0, codegen_1._)`${names_1.default.self}.logger.log(${msg})`); + } else if (typeof opts.$comment == "function") { + const schemaPath = (0, codegen_1.str)`${errSchemaPath}/$comment`; + const rootName = gen.scopeValue("root", { ref: schemaEnv.root }); + gen.code((0, codegen_1._)`${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`); + } + } + function returnResults(it) { + const { gen, schemaEnv, validateName, ValidationError, opts } = it; + if (schemaEnv.$async) { + gen.if((0, codegen_1._)`${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._)`new ${ValidationError}(${names_1.default.vErrors})`)); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, names_1.default.vErrors); + if (opts.unevaluated) + assignEvaluated(it); + gen.return((0, codegen_1._)`${names_1.default.errors} === 0`); + } + } + function assignEvaluated({ gen, evaluated, props, items }) { + if (props instanceof codegen_1.Name) + gen.assign((0, codegen_1._)`${evaluated}.props`, props); + if (items instanceof codegen_1.Name) + gen.assign((0, codegen_1._)`${evaluated}.items`, items); + } + function schemaKeywords(it, types, typeErrors, errsCount) { + const { gen, schema, data, allErrors, opts, self } = it; + const { RULES } = self; + if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) { + gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition)); + return; + } + if (!opts.jtd) + checkStrictTypes(it, types); + gen.block(() => { + for (const group of RULES.rules) + groupKeywords(group); + groupKeywords(RULES.post); + }); + function groupKeywords(group) { + if (!(0, applicability_1.shouldUseGroup)(schema, group)) + return; + if (group.type) { + gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers)); + iterateKeywords(it, group); + if (types.length === 1 && types[0] === group.type && typeErrors) { + gen.else(); + (0, dataType_2.reportTypeError)(it); + } + gen.endIf(); + } else { + iterateKeywords(it, group); + } + if (!allErrors) + gen.if((0, codegen_1._)`${names_1.default.errors} === ${errsCount || 0}`); + } + } + function iterateKeywords(it, group) { + const { gen, schema, opts: { useDefaults } } = it; + if (useDefaults) + (0, defaults_1.assignDefaults)(it, group.type); + gen.block(() => { + for (const rule of group.rules) { + if ((0, applicability_1.shouldUseRule)(schema, rule)) { + keywordCode(it, rule.keyword, rule.definition, group.type); + } + } + }); + } + function checkStrictTypes(it, types) { + if (it.schemaEnv.meta || !it.opts.strictTypes) + return; + checkContextTypes(it, types); + if (!it.opts.allowUnionTypes) + checkMultipleTypes(it, types); + checkKeywordTypes(it, it.dataTypes); + } + function checkContextTypes(it, types) { + if (!types.length) + return; + if (!it.dataTypes.length) { + it.dataTypes = types; + return; + } + types.forEach((t) => { + if (!includesType(it.dataTypes, t)) { + strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`); + } + }); + narrowSchemaTypes(it, types); + } + function checkMultipleTypes(it, ts) { + if (ts.length > 1 && !(ts.length === 2 && ts.includes("null"))) { + strictTypesError(it, "use allowUnionTypes to allow union type keyword"); + } + } + function checkKeywordTypes(it, ts) { + const rules = it.self.RULES.all; + for (const keyword in rules) { + const rule = rules[keyword]; + if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) { + const { type } = rule.definition; + if (type.length && !type.some((t) => hasApplicableType(ts, t))) { + strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`); + } + } + } + } + function hasApplicableType(schTs, kwdT) { + return schTs.includes(kwdT) || kwdT === "number" && schTs.includes("integer"); + } + function includesType(ts, t) { + return ts.includes(t) || t === "integer" && ts.includes("number"); + } + function narrowSchemaTypes(it, withTypes) { + const ts = []; + for (const t of it.dataTypes) { + if (includesType(withTypes, t)) + ts.push(t); + else if (withTypes.includes("integer") && t === "number") + ts.push("integer"); + } + it.dataTypes = ts; + } + function strictTypesError(it, msg) { + const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; + msg += ` at "${schemaPath}" (strictTypes)`; + (0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes); + } + var KeywordCxt = class { + constructor(it, def, keyword) { + (0, keyword_1.validateKeywordUsage)(it, def, keyword); + this.gen = it.gen; + this.allErrors = it.allErrors; + this.keyword = keyword; + this.data = it.data; + this.schema = it.schema[keyword]; + this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data; + this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data); + this.schemaType = def.schemaType; + this.parentSchema = it.schema; + this.params = {}; + this.it = it; + this.def = def; + if (this.$data) { + this.schemaCode = it.gen.const("vSchema", getData(this.$data, it)); + } else { + this.schemaCode = this.schemaValue; + if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) { + throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`); + } + } + if ("code" in def ? def.trackErrors : def.errors !== false) { + this.errsCount = it.gen.const("_errs", names_1.default.errors); + } + } + result(condition, successAction, failAction) { + this.failResult((0, codegen_1.not)(condition), successAction, failAction); + } + failResult(condition, successAction, failAction) { + this.gen.if(condition); + if (failAction) + failAction(); + else + this.error(); + if (successAction) { + this.gen.else(); + successAction(); + if (this.allErrors) + this.gen.endIf(); + } else { + if (this.allErrors) + this.gen.endIf(); + else + this.gen.else(); + } + } + pass(condition, failAction) { + this.failResult((0, codegen_1.not)(condition), void 0, failAction); + } + fail(condition) { + if (condition === void 0) { + this.error(); + if (!this.allErrors) + this.gen.if(false); + return; + } + this.gen.if(condition); + this.error(); + if (this.allErrors) + this.gen.endIf(); + else + this.gen.else(); + } + fail$data(condition) { + if (!this.$data) + return this.fail(condition); + const { schemaCode } = this; + this.fail((0, codegen_1._)`${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`); + } + error(append, errorParams, errorPaths) { + if (errorParams) { + this.setParams(errorParams); + this._error(append, errorPaths); + this.setParams({}); + return; + } + this._error(append, errorPaths); + } + _error(append, errorPaths) { + ; + (append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths); + } + $dataError() { + (0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError); + } + reset() { + if (this.errsCount === void 0) + throw new Error('add "trackErrors" to keyword definition'); + (0, errors_1.resetErrorsCount)(this.gen, this.errsCount); + } + ok(cond) { + if (!this.allErrors) + this.gen.if(cond); + } + setParams(obj, assign) { + if (assign) + Object.assign(this.params, obj); + else + this.params = obj; + } + block$data(valid, codeBlock, $dataValid = codegen_1.nil) { + this.gen.block(() => { + this.check$data(valid, $dataValid); + codeBlock(); + }); + } + check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) { + if (!this.$data) + return; + const { gen, schemaCode, schemaType, def } = this; + gen.if((0, codegen_1.or)((0, codegen_1._)`${schemaCode} === undefined`, $dataValid)); + if (valid !== codegen_1.nil) + gen.assign(valid, true); + if (schemaType.length || def.validateSchema) { + gen.elseIf(this.invalid$data()); + this.$dataError(); + if (valid !== codegen_1.nil) + gen.assign(valid, false); + } + gen.else(); + } + invalid$data() { + const { gen, schemaCode, schemaType, def, it } = this; + return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema()); + function wrong$DataType() { + if (schemaType.length) { + if (!(schemaCode instanceof codegen_1.Name)) + throw new Error("ajv implementation error"); + const st = Array.isArray(schemaType) ? schemaType : [schemaType]; + return (0, codegen_1._)`${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`; + } + return codegen_1.nil; + } + function invalid$DataSchema() { + if (def.validateSchema) { + const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema }); + return (0, codegen_1._)`!${validateSchemaRef}(${schemaCode})`; + } + return codegen_1.nil; + } + } + subschema(appl, valid) { + const subschema = (0, subschema_1.getSubschema)(this.it, appl); + (0, subschema_1.extendSubschemaData)(subschema, this.it, appl); + (0, subschema_1.extendSubschemaMode)(subschema, appl); + const nextContext = { ...this.it, ...subschema, items: void 0, props: void 0 }; + subschemaCode(nextContext, valid); + return nextContext; + } + mergeEvaluated(schemaCxt, toName) { + const { it, gen } = this; + if (!it.opts.unevaluated) + return; + if (it.props !== true && schemaCxt.props !== void 0) { + it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName); + } + if (it.items !== true && schemaCxt.items !== void 0) { + it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName); + } + } + mergeValidEvaluated(schemaCxt, valid) { + const { it, gen } = this; + if (it.opts.unevaluated && (it.props !== true || it.items !== true)) { + gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name)); + return true; + } + } + }; + exports.KeywordCxt = KeywordCxt; + function keywordCode(it, keyword, def, ruleType) { + const cxt = new KeywordCxt(it, def, keyword); + if ("code" in def) { + def.code(cxt, ruleType); + } else if (cxt.$data && def.validate) { + (0, keyword_1.funcKeywordCode)(cxt, def); + } else if ("macro" in def) { + (0, keyword_1.macroKeywordCode)(cxt, def); + } else if (def.compile || def.validate) { + (0, keyword_1.funcKeywordCode)(cxt, def); + } + } + var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/; + var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/; + function getData($data, { dataLevel, dataNames, dataPathArr }) { + let jsonPointer; + let data; + if ($data === "") + return names_1.default.rootData; + if ($data[0] === "/") { + if (!JSON_POINTER.test($data)) + throw new Error(`Invalid JSON-pointer: ${$data}`); + jsonPointer = $data; + data = names_1.default.rootData; + } else { + const matches = RELATIVE_JSON_POINTER.exec($data); + if (!matches) + throw new Error(`Invalid JSON-pointer: ${$data}`); + const up = +matches[1]; + jsonPointer = matches[2]; + if (jsonPointer === "#") { + if (up >= dataLevel) + throw new Error(errorMsg("property/index", up)); + return dataPathArr[dataLevel - up]; + } + if (up > dataLevel) + throw new Error(errorMsg("data", up)); + data = dataNames[dataLevel - up]; + if (!jsonPointer) + return data; + } + let expr = data; + const segments = jsonPointer.split("/"); + for (const segment of segments) { + if (segment) { + data = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`; + expr = (0, codegen_1._)`${expr} && ${data}`; + } + } + return expr; + function errorMsg(pointerType, up) { + return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`; + } + } + exports.getData = getData; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js +var require_validation_error2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var ValidationError = class extends Error { + constructor(errors) { + super("validation failed"); + this.errors = errors; + this.ajv = this.validation = true; + } + }; + exports.default = ValidationError; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js +var require_ref_error2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var resolve_1 = require_resolve2(); + var MissingRefError = class extends Error { + constructor(resolver, baseId, ref, msg) { + super(msg || `can't resolve reference ${ref} from id ${baseId}`); + this.missingRef = (0, resolve_1.resolveUrl)(resolver, baseId, ref); + this.missingSchema = (0, resolve_1.normalizeId)((0, resolve_1.getFullPath)(resolver, this.missingRef)); + } + }; + exports.default = MissingRefError; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js +var require_compile2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; + var codegen_1 = require_codegen2(); + var validation_error_1 = require_validation_error2(); + var names_1 = require_names2(); + var resolve_1 = require_resolve2(); + var util_1 = require_util2(); + var validate_1 = require_validate2(); + var SchemaEnv = class { + constructor(env) { + var _a3; + this.refs = {}; + this.dynamicAnchors = {}; + let schema; + if (typeof env.schema == "object") + schema = env.schema; + this.schema = env.schema; + this.schemaId = env.schemaId; + this.root = env.root || this; + this.baseId = (_a3 = env.baseId) !== null && _a3 !== void 0 ? _a3 : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]); + this.schemaPath = env.schemaPath; + this.localRefs = env.localRefs; + this.meta = env.meta; + this.$async = schema === null || schema === void 0 ? void 0 : schema.$async; + this.refs = {}; + } + }; + exports.SchemaEnv = SchemaEnv; + function compileSchema(sch) { + const _sch = getCompilingSchema.call(this, sch); + if (_sch) + return _sch; + const rootId = (0, resolve_1.getFullPath)(this.opts.uriResolver, sch.root.baseId); + const { es5, lines } = this.opts.code; + const { ownProperties } = this.opts; + const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties }); + let _ValidationError; + if (sch.$async) { + _ValidationError = gen.scopeValue("Error", { + ref: validation_error_1.default, + code: (0, codegen_1._)`require("ajv/dist/runtime/validation_error").default` + }); + } + const validateName = gen.scopeName("validate"); + sch.validateName = validateName; + const schemaCxt = { + gen, + allErrors: this.opts.allErrors, + data: names_1.default.data, + parentData: names_1.default.parentData, + parentDataProperty: names_1.default.parentDataProperty, + dataNames: [names_1.default.data], + dataPathArr: [codegen_1.nil], + // TODO can its length be used as dataLevel if nil is removed? + dataLevel: 0, + dataTypes: [], + definedProperties: /* @__PURE__ */ new Set(), + topSchemaRef: gen.scopeValue("schema", this.opts.code.source === true ? { ref: sch.schema, code: (0, codegen_1.stringify)(sch.schema) } : { ref: sch.schema }), + validateName, + ValidationError: _ValidationError, + schema: sch.schema, + schemaEnv: sch, + rootId, + baseId: sch.baseId || rootId, + schemaPath: codegen_1.nil, + errSchemaPath: sch.schemaPath || (this.opts.jtd ? "" : "#"), + errorPath: (0, codegen_1._)`""`, + opts: this.opts, + self: this + }; + let sourceCode; + try { + this._compilations.add(sch); + (0, validate_1.validateFunctionCode)(schemaCxt); + gen.optimize(this.opts.code.optimize); + const validateCode = gen.toString(); + sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${validateCode}`; + if (this.opts.code.process) + sourceCode = this.opts.code.process(sourceCode, sch); + const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); + const validate2 = makeValidate(this, this.scope.get()); + this.scope.value(validateName, { ref: validate2 }); + validate2.errors = null; + validate2.schema = sch.schema; + validate2.schemaEnv = sch; + if (sch.$async) + validate2.$async = true; + if (this.opts.code.source === true) { + validate2.source = { validateName, validateCode, scopeValues: gen._values }; + } + if (this.opts.unevaluated) { + const { props, items } = schemaCxt; + validate2.evaluated = { + props: props instanceof codegen_1.Name ? void 0 : props, + items: items instanceof codegen_1.Name ? void 0 : items, + dynamicProps: props instanceof codegen_1.Name, + dynamicItems: items instanceof codegen_1.Name + }; + if (validate2.source) + validate2.source.evaluated = (0, codegen_1.stringify)(validate2.evaluated); + } + sch.validate = validate2; + return sch; + } catch (e) { + delete sch.validate; + delete sch.validateName; + if (sourceCode) + this.logger.error("Error compiling schema, function code:", sourceCode); + throw e; + } finally { + this._compilations.delete(sch); + } + } + exports.compileSchema = compileSchema; + function resolveRef2(root, baseId, ref) { + var _a3; + ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref); + const schOrFunc = root.refs[ref]; + if (schOrFunc) + return schOrFunc; + let _sch = resolve.call(this, root, ref); + if (_sch === void 0) { + const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref]; + const { schemaId } = this.opts; + if (schema) + _sch = new SchemaEnv({ schema, schemaId, root, baseId }); + } + if (_sch === void 0) + return; + return root.refs[ref] = inlineOrCompile.call(this, _sch); + } + exports.resolveRef = resolveRef2; + function inlineOrCompile(sch) { + if ((0, resolve_1.inlineRef)(sch.schema, this.opts.inlineRefs)) + return sch.schema; + return sch.validate ? sch : compileSchema.call(this, sch); + } + function getCompilingSchema(schEnv) { + for (const sch of this._compilations) { + if (sameSchemaEnv(sch, schEnv)) + return sch; + } + } + exports.getCompilingSchema = getCompilingSchema; + function sameSchemaEnv(s1, s2) { + return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId; + } + function resolve(root, ref) { + let sch; + while (typeof (sch = this.refs[ref]) == "string") + ref = sch; + return sch || this.schemas[ref] || resolveSchema.call(this, root, ref); + } + function resolveSchema(root, ref) { + const p = this.opts.uriResolver.parse(ref); + const refPath = (0, resolve_1._getFullPath)(this.opts.uriResolver, p); + let baseId = (0, resolve_1.getFullPath)(this.opts.uriResolver, root.baseId, void 0); + if (Object.keys(root.schema).length > 0 && refPath === baseId) { + return getJsonPointer.call(this, p, root); + } + const id = (0, resolve_1.normalizeId)(refPath); + const schOrRef = this.refs[id] || this.schemas[id]; + if (typeof schOrRef == "string") { + const sch = resolveSchema.call(this, root, schOrRef); + if (typeof (sch === null || sch === void 0 ? void 0 : sch.schema) !== "object") + return; + return getJsonPointer.call(this, p, sch); + } + if (typeof (schOrRef === null || schOrRef === void 0 ? void 0 : schOrRef.schema) !== "object") + return; + if (!schOrRef.validate) + compileSchema.call(this, schOrRef); + if (id === (0, resolve_1.normalizeId)(ref)) { + const { schema } = schOrRef; + const { schemaId } = this.opts; + const schId = schema[schemaId]; + if (schId) + baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); + return new SchemaEnv({ schema, schemaId, root, baseId }); + } + return getJsonPointer.call(this, p, schOrRef); + } + exports.resolveSchema = resolveSchema; + var PREVENT_SCOPE_CHANGE = /* @__PURE__ */ new Set([ + "properties", + "patternProperties", + "enum", + "dependencies", + "definitions" + ]); + function getJsonPointer(parsedRef, { baseId, schema, root }) { + var _a3; + if (((_a3 = parsedRef.fragment) === null || _a3 === void 0 ? void 0 : _a3[0]) !== "/") + return; + for (const part of parsedRef.fragment.slice(1).split("/")) { + if (typeof schema === "boolean") + return; + const partSchema = schema[(0, util_1.unescapeFragment)(part)]; + if (partSchema === void 0) + return; + schema = partSchema; + const schId = typeof schema === "object" && schema[this.opts.schemaId]; + if (!PREVENT_SCOPE_CHANGE.has(part) && schId) { + baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); + } + } + let env; + if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) { + const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref); + env = resolveSchema.call(this, root, $ref); + } + const { schemaId } = this.opts; + env = env || new SchemaEnv({ schema, schemaId, root, baseId }); + if (env.schema !== env.root.schema) + return env; + return void 0; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json +var require_data2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json"(exports, module) { + module.exports = { + $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", + description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", + type: "object", + required: ["$data"], + properties: { + $data: { + type: "string", + anyOf: [{ format: "relative-json-pointer" }, { format: "json-pointer" }] + } + }, + additionalProperties: false + }; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js +var require_uri2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var uri = require_fast_uri(); + uri.code = 'require("ajv/dist/runtime/uri").default'; + exports.default = uri; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/core.js +var require_core3 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/core.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; + var validate_1 = require_validate2(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen2(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error2(); + var ref_error_1 = require_ref_error2(); + var rules_1 = require_rules2(); + var compile_1 = require_compile2(); + var codegen_2 = require_codegen2(); + var resolve_1 = require_resolve2(); + var dataType_1 = require_dataType2(); + var util_1 = require_util2(); + var $dataRefSchema = require_data2(); + var uri_1 = require_uri2(); + var defaultRegExp = (str, flags) => new RegExp(str, flags); + defaultRegExp.code = "new RegExp"; + var META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes"]; + var EXT_SCOPE_NAMES = /* @__PURE__ */ new Set([ + "validate", + "serialize", + "parse", + "wrapper", + "root", + "schema", + "keyword", + "pattern", + "formats", + "validate$data", + "func", + "obj", + "Error" + ]); + var removedOptions = { + errorDataPath: "", + format: "`validateFormats: false` can be used instead.", + nullable: '"nullable" keyword is supported by default.', + jsonPointers: "Deprecated jsPropertySyntax can be used instead.", + extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.", + missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.", + processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`", + sourceCode: "Use option `code: {source: true}`", + strictDefaults: "It is default now, see option `strict`.", + strictKeywords: "It is default now, see option `strict`.", + uniqueItems: '"uniqueItems" keyword is always validated.', + unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).", + cache: "Map is used as cache, schema object as key.", + serialize: "Map is used as cache, schema object as key.", + ajvErrors: "It is default now." + }; + var deprecatedOptions = { + ignoreKeywordsWithRef: "", + jsPropertySyntax: "", + unicode: '"minLength"/"maxLength" account for unicode characters by default.' + }; + var MAX_EXPRESSION = 200; + function requiredOptions(o) { + var _a3, _b, _c, _d, _e2, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; + const s = o.strict; + const _optz = (_a3 = o.code) === null || _a3 === void 0 ? void 0 : _a3.optimize; + const optimize = _optz === true || _optz === void 0 ? 1 : _optz || 0; + const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp; + const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default; + return { + strictSchema: (_f = (_e2 = o.strictSchema) !== null && _e2 !== void 0 ? _e2 : s) !== null && _f !== void 0 ? _f : true, + strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true, + strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log", + strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log", + strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false, + code: o.code ? { ...o.code, optimize, regExp } : { optimize, regExp }, + loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION, + loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION, + meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true, + messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true, + inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true, + schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id", + addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true, + validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true, + validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true, + unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true, + int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true, + uriResolver + }; + } + var Ajv2 = class { + constructor(opts = {}) { + this.schemas = {}; + this.refs = {}; + this.formats = /* @__PURE__ */ Object.create(null); + this._compilations = /* @__PURE__ */ new Set(); + this._loading = {}; + this._cache = /* @__PURE__ */ new Map(); + opts = this.opts = { ...opts, ...requiredOptions(opts) }; + const { es5, lines } = this.opts.code; + this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines }); + this.logger = getLogger(opts.logger); + const formatOpt = opts.validateFormats; + opts.validateFormats = false; + this.RULES = (0, rules_1.getRules)(); + checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED"); + checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn"); + this._metaOpts = getMetaSchemaOptions.call(this); + if (opts.formats) + addInitialFormats.call(this); + this._addVocabularies(); + this._addDefaultMetaSchema(); + if (opts.keywords) + addInitialKeywords.call(this, opts.keywords); + if (typeof opts.meta == "object") + this.addMetaSchema(opts.meta); + addInitialSchemas.call(this); + opts.validateFormats = formatOpt; + } + _addVocabularies() { + this.addKeyword("$async"); + } + _addDefaultMetaSchema() { + const { $data, meta: meta3, schemaId } = this.opts; + let _dataRefSchema = $dataRefSchema; + if (schemaId === "id") { + _dataRefSchema = { ...$dataRefSchema }; + _dataRefSchema.id = _dataRefSchema.$id; + delete _dataRefSchema.$id; + } + if (meta3 && $data) + this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false); + } + defaultMeta() { + const { meta: meta3, schemaId } = this.opts; + return this.opts.defaultMeta = typeof meta3 == "object" ? meta3[schemaId] || meta3 : void 0; + } + validate(schemaKeyRef, data) { + let v2; + if (typeof schemaKeyRef == "string") { + v2 = this.getSchema(schemaKeyRef); + if (!v2) + throw new Error(`no schema with key or ref "${schemaKeyRef}"`); + } else { + v2 = this.compile(schemaKeyRef); + } + const valid = v2(data); + if (!("$async" in v2)) + this.errors = v2.errors; + return valid; + } + compile(schema, _meta) { + const sch = this._addSchema(schema, _meta); + return sch.validate || this._compileSchemaEnv(sch); + } + compileAsync(schema, meta3) { + if (typeof this.opts.loadSchema != "function") { + throw new Error("options.loadSchema should be a function"); + } + const { loadSchema } = this.opts; + return runCompileAsync.call(this, schema, meta3); + async function runCompileAsync(_schema, _meta) { + await loadMetaSchema.call(this, _schema.$schema); + const sch = this._addSchema(_schema, _meta); + return sch.validate || _compileAsync.call(this, sch); + } + async function loadMetaSchema($ref) { + if ($ref && !this.getSchema($ref)) { + await runCompileAsync.call(this, { $ref }, true); + } + } + async function _compileAsync(sch) { + try { + return this._compileSchemaEnv(sch); + } catch (e) { + if (!(e instanceof ref_error_1.default)) + throw e; + checkLoaded.call(this, e); + await loadMissingSchema.call(this, e.missingSchema); + return _compileAsync.call(this, sch); + } + } + function checkLoaded({ missingSchema: ref, missingRef }) { + if (this.refs[ref]) { + throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`); + } + } + async function loadMissingSchema(ref) { + const _schema = await _loadSchema.call(this, ref); + if (!this.refs[ref]) + await loadMetaSchema.call(this, _schema.$schema); + if (!this.refs[ref]) + this.addSchema(_schema, ref, meta3); + } + async function _loadSchema(ref) { + const p = this._loading[ref]; + if (p) + return p; + try { + return await (this._loading[ref] = loadSchema(ref)); + } finally { + delete this._loading[ref]; + } + } + } + // Adds schema to the instance + addSchema(schema, key, _meta, _validateSchema = this.opts.validateSchema) { + if (Array.isArray(schema)) { + for (const sch of schema) + this.addSchema(sch, void 0, _meta, _validateSchema); + return this; + } + let id; + if (typeof schema === "object") { + const { schemaId } = this.opts; + id = schema[schemaId]; + if (id !== void 0 && typeof id != "string") { + throw new Error(`schema ${schemaId} must be string`); + } + } + key = (0, resolve_1.normalizeId)(key || id); + this._checkUnique(key); + this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true); + return this; + } + // Add schema that will be used to validate other schemas + // options in META_IGNORE_OPTIONS are alway set to false + addMetaSchema(schema, key, _validateSchema = this.opts.validateSchema) { + this.addSchema(schema, key, true, _validateSchema); + return this; + } + // Validate schema against its meta-schema + validateSchema(schema, throwOrLogError) { + if (typeof schema == "boolean") + return true; + let $schema; + $schema = schema.$schema; + if ($schema !== void 0 && typeof $schema != "string") { + throw new Error("$schema must be a string"); + } + $schema = $schema || this.opts.defaultMeta || this.defaultMeta(); + if (!$schema) { + this.logger.warn("meta-schema not available"); + this.errors = null; + return true; + } + const valid = this.validate($schema, schema); + if (!valid && throwOrLogError) { + const message = "schema is invalid: " + this.errorsText(); + if (this.opts.validateSchema === "log") + this.logger.error(message); + else + throw new Error(message); + } + return valid; + } + // Get compiled schema by `key` or `ref`. + // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id) + getSchema(keyRef) { + let sch; + while (typeof (sch = getSchEnv.call(this, keyRef)) == "string") + keyRef = sch; + if (sch === void 0) { + const { schemaId } = this.opts; + const root = new compile_1.SchemaEnv({ schema: {}, schemaId }); + sch = compile_1.resolveSchema.call(this, root, keyRef); + if (!sch) + return; + this.refs[keyRef] = sch; + } + return sch.validate || this._compileSchemaEnv(sch); + } + // Remove cached schema(s). + // If no parameter is passed all schemas but meta-schemas are removed. + // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. + // Even if schema is referenced by other schemas it still can be removed as other schemas have local references. + removeSchema(schemaKeyRef) { + if (schemaKeyRef instanceof RegExp) { + this._removeAllSchemas(this.schemas, schemaKeyRef); + this._removeAllSchemas(this.refs, schemaKeyRef); + return this; + } + switch (typeof schemaKeyRef) { + case "undefined": + this._removeAllSchemas(this.schemas); + this._removeAllSchemas(this.refs); + this._cache.clear(); + return this; + case "string": { + const sch = getSchEnv.call(this, schemaKeyRef); + if (typeof sch == "object") + this._cache.delete(sch.schema); + delete this.schemas[schemaKeyRef]; + delete this.refs[schemaKeyRef]; + return this; + } + case "object": { + const cacheKey = schemaKeyRef; + this._cache.delete(cacheKey); + let id = schemaKeyRef[this.opts.schemaId]; + if (id) { + id = (0, resolve_1.normalizeId)(id); + delete this.schemas[id]; + delete this.refs[id]; + } + return this; + } + default: + throw new Error("ajv.removeSchema: invalid parameter"); + } + } + // add "vocabulary" - a collection of keywords + addVocabulary(definitions) { + for (const def of definitions) + this.addKeyword(def); + return this; + } + addKeyword(kwdOrDef, def) { + let keyword; + if (typeof kwdOrDef == "string") { + keyword = kwdOrDef; + if (typeof def == "object") { + this.logger.warn("these parameters are deprecated, see docs for addKeyword"); + def.keyword = keyword; + } + } else if (typeof kwdOrDef == "object" && def === void 0) { + def = kwdOrDef; + keyword = def.keyword; + if (Array.isArray(keyword) && !keyword.length) { + throw new Error("addKeywords: keyword must be string or non-empty array"); + } + } else { + throw new Error("invalid addKeywords parameters"); + } + checkKeyword.call(this, keyword, def); + if (!def) { + (0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd)); + return this; + } + keywordMetaschema.call(this, def); + const definition = { + ...def, + type: (0, dataType_1.getJSONTypes)(def.type), + schemaType: (0, dataType_1.getJSONTypes)(def.schemaType) + }; + (0, util_1.eachItem)(keyword, definition.type.length === 0 ? (k2) => addRule.call(this, k2, definition) : (k2) => definition.type.forEach((t) => addRule.call(this, k2, definition, t))); + return this; + } + getKeyword(keyword) { + const rule = this.RULES.all[keyword]; + return typeof rule == "object" ? rule.definition : !!rule; + } + // Remove keyword + removeKeyword(keyword) { + const { RULES } = this; + delete RULES.keywords[keyword]; + delete RULES.all[keyword]; + for (const group of RULES.rules) { + const i = group.rules.findIndex((rule) => rule.keyword === keyword); + if (i >= 0) + group.rules.splice(i, 1); + } + return this; + } + // Add format + addFormat(name, format) { + if (typeof format == "string") + format = new RegExp(format); + this.formats[name] = format; + return this; + } + errorsText(errors = this.errors, { separator = ", ", dataVar = "data" } = {}) { + if (!errors || errors.length === 0) + return "No errors"; + return errors.map((e) => `${dataVar}${e.instancePath} ${e.message}`).reduce((text, msg) => text + separator + msg); + } + $dataMetaSchema(metaSchema, keywordsJsonPointers) { + const rules = this.RULES.all; + metaSchema = JSON.parse(JSON.stringify(metaSchema)); + for (const jsonPointer of keywordsJsonPointers) { + const segments = jsonPointer.split("/").slice(1); + let keywords = metaSchema; + for (const seg of segments) + keywords = keywords[seg]; + for (const key in rules) { + const rule = rules[key]; + if (typeof rule != "object") + continue; + const { $data } = rule.definition; + const schema = keywords[key]; + if ($data && schema) + keywords[key] = schemaOrData(schema); + } + } + return metaSchema; + } + _removeAllSchemas(schemas, regex) { + for (const keyRef in schemas) { + const sch = schemas[keyRef]; + if (!regex || regex.test(keyRef)) { + if (typeof sch == "string") { + delete schemas[keyRef]; + } else if (sch && !sch.meta) { + this._cache.delete(sch.schema); + delete schemas[keyRef]; + } + } + } + } + _addSchema(schema, meta3, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) { + let id; + const { schemaId } = this.opts; + if (typeof schema == "object") { + id = schema[schemaId]; + } else { + if (this.opts.jtd) + throw new Error("schema must be object"); + else if (typeof schema != "boolean") + throw new Error("schema must be object or boolean"); + } + let sch = this._cache.get(schema); + if (sch !== void 0) + return sch; + baseId = (0, resolve_1.normalizeId)(id || baseId); + const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId); + sch = new compile_1.SchemaEnv({ schema, schemaId, meta: meta3, baseId, localRefs }); + this._cache.set(sch.schema, sch); + if (addSchema && !baseId.startsWith("#")) { + if (baseId) + this._checkUnique(baseId); + this.refs[baseId] = sch; + } + if (validateSchema) + this.validateSchema(schema, true); + return sch; + } + _checkUnique(id) { + if (this.schemas[id] || this.refs[id]) { + throw new Error(`schema with key or id "${id}" already exists`); + } + } + _compileSchemaEnv(sch) { + if (sch.meta) + this._compileMetaSchema(sch); + else + compile_1.compileSchema.call(this, sch); + if (!sch.validate) + throw new Error("ajv implementation error"); + return sch.validate; + } + _compileMetaSchema(sch) { + const currentOpts = this.opts; + this.opts = this._metaOpts; + try { + compile_1.compileSchema.call(this, sch); + } finally { + this.opts = currentOpts; + } + } + }; + Ajv2.ValidationError = validation_error_1.default; + Ajv2.MissingRefError = ref_error_1.default; + exports.default = Ajv2; + function checkOptions(checkOpts, options, msg, log = "error") { + for (const key in checkOpts) { + const opt = key; + if (opt in options) + this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`); + } + } + function getSchEnv(keyRef) { + keyRef = (0, resolve_1.normalizeId)(keyRef); + return this.schemas[keyRef] || this.refs[keyRef]; + } + function addInitialSchemas() { + const optsSchemas = this.opts.schemas; + if (!optsSchemas) + return; + if (Array.isArray(optsSchemas)) + this.addSchema(optsSchemas); + else + for (const key in optsSchemas) + this.addSchema(optsSchemas[key], key); + } + function addInitialFormats() { + for (const name in this.opts.formats) { + const format = this.opts.formats[name]; + if (format) + this.addFormat(name, format); + } + } + function addInitialKeywords(defs) { + if (Array.isArray(defs)) { + this.addVocabulary(defs); + return; + } + this.logger.warn("keywords option as map is deprecated, pass array"); + for (const keyword in defs) { + const def = defs[keyword]; + if (!def.keyword) + def.keyword = keyword; + this.addKeyword(def); + } + } + function getMetaSchemaOptions() { + const metaOpts = { ...this.opts }; + for (const opt of META_IGNORE_OPTIONS) + delete metaOpts[opt]; + return metaOpts; + } + var noLogs = { log() { + }, warn() { + }, error() { + } }; + function getLogger(logger) { + if (logger === false) + return noLogs; + if (logger === void 0) + return console; + if (logger.log && logger.warn && logger.error) + return logger; + throw new Error("logger must implement log, warn and error methods"); + } + var KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i; + function checkKeyword(keyword, def) { + const { RULES } = this; + (0, util_1.eachItem)(keyword, (kwd) => { + if (RULES.keywords[kwd]) + throw new Error(`Keyword ${kwd} is already defined`); + if (!KEYWORD_NAME.test(kwd)) + throw new Error(`Keyword ${kwd} has invalid name`); + }); + if (!def) + return; + if (def.$data && !("code" in def || "validate" in def)) { + throw new Error('$data keyword must have "code" or "validate" function'); + } + } + function addRule(keyword, definition, dataType) { + var _a3; + const post = definition === null || definition === void 0 ? void 0 : definition.post; + if (dataType && post) + throw new Error('keyword with "post" flag cannot have "type"'); + const { RULES } = this; + let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType); + if (!ruleGroup) { + ruleGroup = { type: dataType, rules: [] }; + RULES.rules.push(ruleGroup); + } + RULES.keywords[keyword] = true; + if (!definition) + return; + const rule = { + keyword, + definition: { + ...definition, + type: (0, dataType_1.getJSONTypes)(definition.type), + schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType) + } + }; + if (definition.before) + addBeforeRule.call(this, ruleGroup, rule, definition.before); + else + ruleGroup.rules.push(rule); + RULES.all[keyword] = rule; + (_a3 = definition.implements) === null || _a3 === void 0 ? void 0 : _a3.forEach((kwd) => this.addKeyword(kwd)); + } + function addBeforeRule(ruleGroup, rule, before) { + const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before); + if (i >= 0) { + ruleGroup.rules.splice(i, 0, rule); + } else { + ruleGroup.rules.push(rule); + this.logger.warn(`rule ${before} is not defined`); + } + } + function keywordMetaschema(def) { + let { metaSchema } = def; + if (metaSchema === void 0) + return; + if (def.$data && this.opts.$data) + metaSchema = schemaOrData(metaSchema); + def.validateSchema = this.compile(metaSchema, true); + } + var $dataRef = { + $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" + }; + function schemaOrData(schema) { + return { anyOf: [schema, $dataRef] }; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js +var require_id2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var def = { + keyword: "id", + code() { + throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID'); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js +var require_ref2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.callRef = exports.getValidate = void 0; + var ref_error_1 = require_ref_error2(); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var compile_1 = require_compile2(); + var util_1 = require_util2(); + var def = { + keyword: "$ref", + schemaType: "string", + code(cxt) { + const { gen, schema: $ref, it } = cxt; + const { baseId, schemaEnv: env, validateName, opts, self } = it; + const { root } = env; + if (($ref === "#" || $ref === "#/") && baseId === root.baseId) + return callRootRef(); + const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref); + if (schOrEnv === void 0) + throw new ref_error_1.default(it.opts.uriResolver, baseId, $ref); + if (schOrEnv instanceof compile_1.SchemaEnv) + return callValidate(schOrEnv); + return inlineRefSchema(schOrEnv); + function callRootRef() { + if (env === root) + return callRef(cxt, validateName, env, env.$async); + const rootName = gen.scopeValue("root", { ref: root }); + return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async); + } + function callValidate(sch) { + const v2 = getValidate(cxt, sch); + callRef(cxt, v2, sch, sch.$async); + } + function inlineRefSchema(sch) { + const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: (0, codegen_1.stringify)(sch) } : { ref: sch }); + const valid = gen.name("valid"); + const schCxt = cxt.subschema({ + schema: sch, + dataTypes: [], + schemaPath: codegen_1.nil, + topSchemaRef: schName, + errSchemaPath: $ref + }, valid); + cxt.mergeEvaluated(schCxt); + cxt.ok(valid); + } + } + }; + function getValidate(cxt, sch) { + const { gen } = cxt; + return sch.validate ? gen.scopeValue("validate", { ref: sch.validate }) : (0, codegen_1._)`${gen.scopeValue("wrapper", { ref: sch })}.validate`; + } + exports.getValidate = getValidate; + function callRef(cxt, v2, sch, $async) { + const { gen, it } = cxt; + const { allErrors, schemaEnv: env, opts } = it; + const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil; + if ($async) + callAsyncRef(); + else + callSyncRef(); + function callAsyncRef() { + if (!env.$async) + throw new Error("async schema referenced by sync schema"); + const valid = gen.let("valid"); + gen.try(() => { + gen.code((0, codegen_1._)`await ${(0, code_1.callValidateCode)(cxt, v2, passCxt)}`); + addEvaluatedFrom(v2); + if (!allErrors) + gen.assign(valid, true); + }, (e) => { + gen.if((0, codegen_1._)`!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e)); + addErrorsFrom(e); + if (!allErrors) + gen.assign(valid, false); + }); + cxt.ok(valid); + } + function callSyncRef() { + cxt.result((0, code_1.callValidateCode)(cxt, v2, passCxt), () => addEvaluatedFrom(v2), () => addErrorsFrom(v2)); + } + function addErrorsFrom(source) { + const errs = (0, codegen_1._)`${source}.errors`; + gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`); + gen.assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); + } + function addEvaluatedFrom(source) { + var _a3; + if (!it.opts.unevaluated) + return; + const schEvaluated = (_a3 = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a3 === void 0 ? void 0 : _a3.evaluated; + if (it.props !== true) { + if (schEvaluated && !schEvaluated.dynamicProps) { + if (schEvaluated.props !== void 0) { + it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props); + } + } else { + const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`); + it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name); + } + } + if (it.items !== true) { + if (schEvaluated && !schEvaluated.dynamicItems) { + if (schEvaluated.items !== void 0) { + it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items); + } + } else { + const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`); + it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name); + } + } + } + } + exports.callRef = callRef; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js +var require_core4 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var id_1 = require_id2(); + var ref_1 = require_ref2(); + var core = [ + "$schema", + "$id", + "$defs", + "$vocabulary", + { keyword: "$comment" }, + "definitions", + id_1.default, + ref_1.default + ]; + exports.default = core; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +var require_limitNumber2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var ops = codegen_1.operators; + var KWDs = { + maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, + minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, + exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, + exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE } + }; + var error61 = { + message: ({ keyword, schemaCode }) => (0, codegen_1.str)`must be ${KWDs[keyword].okStr} ${schemaCode}`, + params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}` + }; + var def = { + keyword: Object.keys(KWDs), + type: "number", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + cxt.fail$data((0, codegen_1._)`${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +var require_multipleOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must be multiple of ${schemaCode}`, + params: ({ schemaCode }) => (0, codegen_1._)`{multipleOf: ${schemaCode}}` + }; + var def = { + keyword: "multipleOf", + type: "number", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { gen, data, schemaCode, it } = cxt; + const prec = it.opts.multipleOfPrecision; + const res = gen.let("res"); + const invalid = prec ? (0, codegen_1._)`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}` : (0, codegen_1._)`${res} !== parseInt(${res})`; + cxt.fail$data((0, codegen_1._)`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js +var require_ucs2length2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + function ucs2length(str) { + const len = str.length; + let length = 0; + let pos = 0; + let value; + while (pos < len) { + length++; + value = str.charCodeAt(pos++); + if (value >= 55296 && value <= 56319 && pos < len) { + value = str.charCodeAt(pos); + if ((value & 64512) === 56320) + pos++; + } + } + return length; + } + exports.default = ucs2length; + ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default'; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js +var require_limitLength2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var ucs2length_1 = require_ucs2length2(); + var error61 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxLength" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} characters`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxLength", "minLength"], + type: "string", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode, it } = cxt; + const op = keyword === "maxLength" ? codegen_1.operators.GT : codegen_1.operators.LT; + const len = it.opts.unicode === false ? (0, codegen_1._)`${data}.length` : (0, codegen_1._)`${(0, util_1.useFunc)(cxt.gen, ucs2length_1.default)}(${data})`; + cxt.fail$data((0, codegen_1._)`${len} ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js +var require_pattern2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var util_1 = require_util2(); + var codegen_1 = require_codegen2(); + var error61 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must match pattern "${schemaCode}"`, + params: ({ schemaCode }) => (0, codegen_1._)`{pattern: ${schemaCode}}` + }; + var def = { + keyword: "pattern", + type: "string", + schemaType: "string", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + const u = it.opts.unicodeRegExp ? "u" : ""; + if ($data) { + const { regExp } = it.opts.code; + const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); + const valid = gen.let("valid"); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); + cxt.fail$data((0, codegen_1._)`!${valid}`); + } else { + const regExp = (0, code_1.usePattern)(cxt, schema); + cxt.fail$data((0, codegen_1._)`!${regExp}.test(${data})`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +var require_limitProperties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxProperties" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} properties`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxProperties", "minProperties"], + type: "object", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT; + cxt.fail$data((0, codegen_1._)`Object.keys(${data}).length ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js +var require_required2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { missingProperty } }) => (0, codegen_1.str)`must have required property '${missingProperty}'`, + params: ({ params: { missingProperty } }) => (0, codegen_1._)`{missingProperty: ${missingProperty}}` + }; + var def = { + keyword: "required", + type: "object", + schemaType: "array", + $data: true, + error: error61, + code(cxt) { + const { gen, schema, schemaCode, data, $data, it } = cxt; + const { opts } = it; + if (!$data && schema.length === 0) + return; + const useLoop = schema.length >= opts.loopRequired; + if (it.allErrors) + allErrorsMode(); + else + exitOnErrorMode(); + if (opts.strictRequired) { + const props = cxt.parentSchema.properties; + const { definedProperties } = cxt.it; + for (const requiredKey of schema) { + if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === void 0 && !definedProperties.has(requiredKey)) { + const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; + const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`; + (0, util_1.checkStrictMode)(it, msg, it.opts.strictRequired); + } + } + } + function allErrorsMode() { + if (useLoop || $data) { + cxt.block$data(codegen_1.nil, loopAllRequired); + } else { + for (const prop of schema) { + (0, code_1.checkReportMissingProp)(cxt, prop); + } + } + } + function exitOnErrorMode() { + const missing = gen.let("missing"); + if (useLoop || $data) { + const valid = gen.let("valid", true); + cxt.block$data(valid, () => loopUntilMissing(missing, valid)); + cxt.ok(valid); + } else { + gen.if((0, code_1.checkMissingProp)(cxt, schema, missing)); + (0, code_1.reportMissingProp)(cxt, missing); + gen.else(); + } + } + function loopAllRequired() { + gen.forOf("prop", schemaCode, (prop) => { + cxt.setParams({ missingProperty: prop }); + gen.if((0, code_1.noPropertyInData)(gen, data, prop, opts.ownProperties), () => cxt.error()); + }); + } + function loopUntilMissing(missing, valid) { + cxt.setParams({ missingProperty: missing }); + gen.forOf(missing, schemaCode, () => { + gen.assign(valid, (0, code_1.propertyInData)(gen, data, missing, opts.ownProperties)); + gen.if((0, codegen_1.not)(valid), () => { + cxt.error(); + gen.break(); + }); + }, codegen_1.nil); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js +var require_limitItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxItems" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} items`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxItems", "minItems"], + type: "array", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + const op = keyword === "maxItems" ? codegen_1.operators.GT : codegen_1.operators.LT; + cxt.fail$data((0, codegen_1._)`${data}.length ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js +var require_equal2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var equal = require_fast_deep_equal(); + equal.code = 'require("ajv/dist/runtime/equal").default'; + exports.default = equal; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +var require_uniqueItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dataType_1 = require_dataType2(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var equal_1 = require_equal2(); + var error61 = { + message: ({ params: { i, j: j2 } }) => (0, codegen_1.str)`must NOT have duplicate items (items ## ${j2} and ${i} are identical)`, + params: ({ params: { i, j: j2 } }) => (0, codegen_1._)`{i: ${i}, j: ${j2}}` + }; + var def = { + keyword: "uniqueItems", + type: "array", + schemaType: "boolean", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt; + if (!$data && !schema) + return; + const valid = gen.let("valid"); + const itemTypes = parentSchema.items ? (0, dataType_1.getSchemaTypes)(parentSchema.items) : []; + cxt.block$data(valid, validateUniqueItems, (0, codegen_1._)`${schemaCode} === false`); + cxt.ok(valid); + function validateUniqueItems() { + const i = gen.let("i", (0, codegen_1._)`${data}.length`); + const j2 = gen.let("j"); + cxt.setParams({ i, j: j2 }); + gen.assign(valid, true); + gen.if((0, codegen_1._)`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j2)); + } + function canOptimize() { + return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array"); + } + function loopN(i, j2) { + const item = gen.name("item"); + const wrongType = (0, dataType_1.checkDataTypes)(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong); + const indices = gen.const("indices", (0, codegen_1._)`{}`); + gen.for((0, codegen_1._)`;${i}--;`, () => { + gen.let(item, (0, codegen_1._)`${data}[${i}]`); + gen.if(wrongType, (0, codegen_1._)`continue`); + if (itemTypes.length > 1) + gen.if((0, codegen_1._)`typeof ${item} == "string"`, (0, codegen_1._)`${item} += "_"`); + gen.if((0, codegen_1._)`typeof ${indices}[${item}] == "number"`, () => { + gen.assign(j2, (0, codegen_1._)`${indices}[${item}]`); + cxt.error(); + gen.assign(valid, false).break(); + }).code((0, codegen_1._)`${indices}[${item}] = ${i}`); + }); + } + function loopN2(i, j2) { + const eql = (0, util_1.useFunc)(gen, equal_1.default); + const outer = gen.name("outer"); + gen.label(outer).for((0, codegen_1._)`;${i}--;`, () => gen.for((0, codegen_1._)`${j2} = ${i}; ${j2}--;`, () => gen.if((0, codegen_1._)`${eql}(${data}[${i}], ${data}[${j2}])`, () => { + cxt.error(); + gen.assign(valid, false).break(outer); + }))); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js +var require_const2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var equal_1 = require_equal2(); + var error61 = { + message: "must be equal to constant", + params: ({ schemaCode }) => (0, codegen_1._)`{allowedValue: ${schemaCode}}` + }; + var def = { + keyword: "const", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schemaCode, schema } = cxt; + if ($data || schema && typeof schema == "object") { + cxt.fail$data((0, codegen_1._)`!${(0, util_1.useFunc)(gen, equal_1.default)}(${data}, ${schemaCode})`); + } else { + cxt.fail((0, codegen_1._)`${schema} !== ${data}`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js +var require_enum2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var equal_1 = require_equal2(); + var error61 = { + message: "must be equal to one of the allowed values", + params: ({ schemaCode }) => (0, codegen_1._)`{allowedValues: ${schemaCode}}` + }; + var def = { + keyword: "enum", + schemaType: "array", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + if (!$data && schema.length === 0) + throw new Error("enum must have non-empty array"); + const useLoop = schema.length >= it.opts.loopEnum; + let eql; + const getEql = () => eql !== null && eql !== void 0 ? eql : eql = (0, util_1.useFunc)(gen, equal_1.default); + let valid; + if (useLoop || $data) { + valid = gen.let("valid"); + cxt.block$data(valid, loopEnum); + } else { + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const vSchema = gen.const("vSchema", schemaCode); + valid = (0, codegen_1.or)(...schema.map((_x, i) => equalCode(vSchema, i))); + } + cxt.pass(valid); + function loopEnum() { + gen.assign(valid, false); + gen.forOf("v", schemaCode, (v2) => gen.if((0, codegen_1._)`${getEql()}(${data}, ${v2})`, () => gen.assign(valid, true).break())); + } + function equalCode(vSchema, i) { + const sch = schema[i]; + return typeof sch === "object" && sch !== null ? (0, codegen_1._)`${getEql()}(${data}, ${vSchema}[${i}])` : (0, codegen_1._)`${data} === ${sch}`; + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js +var require_validation2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var limitNumber_1 = require_limitNumber2(); + var multipleOf_1 = require_multipleOf2(); + var limitLength_1 = require_limitLength2(); + var pattern_1 = require_pattern2(); + var limitProperties_1 = require_limitProperties2(); + var required_1 = require_required2(); + var limitItems_1 = require_limitItems2(); + var uniqueItems_1 = require_uniqueItems2(); + var const_1 = require_const2(); + var enum_1 = require_enum2(); + var validation = [ + // number + limitNumber_1.default, + multipleOf_1.default, + // string + limitLength_1.default, + pattern_1.default, + // object + limitProperties_1.default, + required_1.default, + // array + limitItems_1.default, + uniqueItems_1.default, + // any + { keyword: "type", schemaType: ["string", "array"] }, + { keyword: "nullable", schemaType: "boolean" }, + const_1.default, + enum_1.default + ]; + exports.default = validation; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +var require_additionalItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateAdditionalItems = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "additionalItems", + type: "array", + schemaType: ["boolean", "object"], + before: "uniqueItems", + error: error61, + code(cxt) { + const { parentSchema, it } = cxt; + const { items } = parentSchema; + if (!Array.isArray(items)) { + (0, util_1.checkStrictMode)(it, '"additionalItems" is ignored when "items" is not an array of schemas'); + return; + } + validateAdditionalItems(cxt, items); + } + }; + function validateAdditionalItems(cxt, items) { + const { gen, schema, data, keyword, it } = cxt; + it.items = true; + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + if (schema === false) { + cxt.setParams({ len: items.length }); + cxt.pass((0, codegen_1._)`${len} <= ${items.length}`); + } else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.var("valid", (0, codegen_1._)`${len} <= ${items.length}`); + gen.if((0, codegen_1.not)(valid), () => validateItems(valid)); + cxt.ok(valid); + } + function validateItems(valid) { + gen.forRange("i", items.length, len, (i) => { + cxt.subschema({ keyword, dataProp: i, dataPropType: util_1.Type.Num }, valid); + if (!it.allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + }); + } + } + exports.validateAdditionalItems = validateAdditionalItems; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js +var require_items2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateTuple = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var code_1 = require_code4(); + var def = { + keyword: "items", + type: "array", + schemaType: ["object", "array", "boolean"], + before: "uniqueItems", + code(cxt) { + const { schema, it } = cxt; + if (Array.isArray(schema)) + return validateTuple(cxt, "additionalItems", schema); + it.items = true; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + cxt.ok((0, code_1.validateArray)(cxt)); + } + }; + function validateTuple(cxt, extraItems, schArr = cxt.schema) { + const { gen, parentSchema, data, keyword, it } = cxt; + checkStrictTuple(parentSchema); + if (it.opts.unevaluated && schArr.length && it.items !== true) { + it.items = util_1.mergeEvaluated.items(gen, schArr.length, it.items); + } + const valid = gen.name("valid"); + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + schArr.forEach((sch, i) => { + if ((0, util_1.alwaysValidSchema)(it, sch)) + return; + gen.if((0, codegen_1._)`${len} > ${i}`, () => cxt.subschema({ + keyword, + schemaProp: i, + dataProp: i + }, valid)); + cxt.ok(valid); + }); + function checkStrictTuple(sch) { + const { opts, errSchemaPath } = it; + const l3 = schArr.length; + const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); + if (opts.strictTuples && !fullTuple) { + const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); + } + } + } + exports.validateTuple = validateTuple; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +var require_prefixItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var items_1 = require_items2(); + var def = { + keyword: "prefixItems", + type: "array", + schemaType: ["array"], + before: "uniqueItems", + code: (cxt) => (0, items_1.validateTuple)(cxt, "items") + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js +var require_items20202 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var code_1 = require_code4(); + var additionalItems_1 = require_additionalItems2(); + var error61 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "items", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + error: error61, + code(cxt) { + const { schema, parentSchema, it } = cxt; + const { prefixItems } = parentSchema; + it.items = true; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + if (prefixItems) + (0, additionalItems_1.validateAdditionalItems)(cxt, prefixItems); + else + cxt.ok((0, code_1.validateArray)(cxt)); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js +var require_contains2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1.str)`must contain at least ${min} valid item(s)` : (0, codegen_1.str)`must contain at least ${min} and no more than ${max} valid item(s)`, + params: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1._)`{minContains: ${min}}` : (0, codegen_1._)`{minContains: ${min}, maxContains: ${max}}` + }; + var def = { + keyword: "contains", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + trackErrors: true, + error: error61, + code(cxt) { + const { gen, schema, parentSchema, data, it } = cxt; + let min; + let max; + const { minContains, maxContains } = parentSchema; + if (it.opts.next) { + min = minContains === void 0 ? 1 : minContains; + max = maxContains; + } else { + min = 1; + } + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + cxt.setParams({ min, max }); + if (max === void 0 && min === 0) { + (0, util_1.checkStrictMode)(it, `"minContains" == 0 without "maxContains": "contains" keyword ignored`); + return; + } + if (max !== void 0 && min > max) { + (0, util_1.checkStrictMode)(it, `"minContains" > "maxContains" is always invalid`); + cxt.fail(); + return; + } + if ((0, util_1.alwaysValidSchema)(it, schema)) { + let cond = (0, codegen_1._)`${len} >= ${min}`; + if (max !== void 0) + cond = (0, codegen_1._)`${cond} && ${len} <= ${max}`; + cxt.pass(cond); + return; + } + it.items = true; + const valid = gen.name("valid"); + if (max === void 0 && min === 1) { + validateItems(valid, () => gen.if(valid, () => gen.break())); + } else if (min === 0) { + gen.let(valid, true); + if (max !== void 0) + gen.if((0, codegen_1._)`${data}.length > 0`, validateItemsWithCount); + } else { + gen.let(valid, false); + validateItemsWithCount(); + } + cxt.result(valid, () => cxt.reset()); + function validateItemsWithCount() { + const schValid = gen.name("_valid"); + const count = gen.let("count", 0); + validateItems(schValid, () => gen.if(schValid, () => checkLimits(count))); + } + function validateItems(_valid, block) { + gen.forRange("i", 0, len, (i) => { + cxt.subschema({ + keyword: "contains", + dataProp: i, + dataPropType: util_1.Type.Num, + compositeRule: true + }, _valid); + block(); + }); + } + function checkLimits(count) { + gen.code((0, codegen_1._)`${count}++`); + if (max === void 0) { + gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break()); + } else { + gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break()); + if (min === 1) + gen.assign(valid, true); + else + gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true)); + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +var require_dependencies2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var code_1 = require_code4(); + exports.error = { + message: ({ params: { property, depsCount, deps } }) => { + const property_ies = depsCount === 1 ? "property" : "properties"; + return (0, codegen_1.str)`must have ${property_ies} ${deps} when property ${property} is present`; + }, + params: ({ params: { property, depsCount, deps, missingProperty } }) => (0, codegen_1._)`{property: ${property}, + missingProperty: ${missingProperty}, + depsCount: ${depsCount}, + deps: ${deps}}` + // TODO change to reference + }; + var def = { + keyword: "dependencies", + type: "object", + schemaType: "object", + error: exports.error, + code(cxt) { + const [propDeps, schDeps] = splitDependencies(cxt); + validatePropertyDeps(cxt, propDeps); + validateSchemaDeps(cxt, schDeps); + } + }; + function splitDependencies({ schema }) { + const propertyDeps = {}; + const schemaDeps = {}; + for (const key in schema) { + if (key === "__proto__") + continue; + const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps; + deps[key] = schema[key]; + } + return [propertyDeps, schemaDeps]; + } + function validatePropertyDeps(cxt, propertyDeps = cxt.schema) { + const { gen, data, it } = cxt; + if (Object.keys(propertyDeps).length === 0) + return; + const missing = gen.let("missing"); + for (const prop in propertyDeps) { + const deps = propertyDeps[prop]; + if (deps.length === 0) + continue; + const hasProperty = (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties); + cxt.setParams({ + property: prop, + depsCount: deps.length, + deps: deps.join(", ") + }); + if (it.allErrors) { + gen.if(hasProperty, () => { + for (const depProp of deps) { + (0, code_1.checkReportMissingProp)(cxt, depProp); + } + }); + } else { + gen.if((0, codegen_1._)`${hasProperty} && (${(0, code_1.checkMissingProp)(cxt, deps, missing)})`); + (0, code_1.reportMissingProp)(cxt, missing); + gen.else(); + } + } + } + exports.validatePropertyDeps = validatePropertyDeps; + function validateSchemaDeps(cxt, schemaDeps = cxt.schema) { + const { gen, data, keyword, it } = cxt; + const valid = gen.name("valid"); + for (const prop in schemaDeps) { + if ((0, util_1.alwaysValidSchema)(it, schemaDeps[prop])) + continue; + gen.if( + (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties), + () => { + const schCxt = cxt.subschema({ keyword, schemaProp: prop }, valid); + cxt.mergeValidEvaluated(schCxt, valid); + }, + () => gen.var(valid, true) + // TODO var + ); + cxt.ok(valid); + } + } + exports.validateSchemaDeps = validateSchemaDeps; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +var require_propertyNames2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: "property name must be valid", + params: ({ params }) => (0, codegen_1._)`{propertyName: ${params.propertyName}}` + }; + var def = { + keyword: "propertyNames", + type: "object", + schemaType: ["object", "boolean"], + error: error61, + code(cxt) { + const { gen, schema, data, it } = cxt; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + const valid = gen.name("valid"); + gen.forIn("key", data, (key) => { + cxt.setParams({ propertyName: key }); + cxt.subschema({ + keyword: "propertyNames", + data: key, + dataTypes: ["string"], + propertyName: key, + compositeRule: true + }, valid); + gen.if((0, codegen_1.not)(valid), () => { + cxt.error(true); + if (!it.allErrors) + gen.break(); + }); + }); + cxt.ok(valid); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +var require_additionalProperties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var util_1 = require_util2(); + var error61 = { + message: "must NOT have additional properties", + params: ({ params }) => (0, codegen_1._)`{additionalProperty: ${params.additionalProperty}}` + }; + var def = { + keyword: "additionalProperties", + type: ["object"], + schemaType: ["boolean", "object"], + allowUndefined: true, + trackErrors: true, + error: error61, + code(cxt) { + const { gen, schema, parentSchema, data, errsCount, it } = cxt; + if (!errsCount) + throw new Error("ajv implementation error"); + const { allErrors, opts } = it; + it.props = true; + if (opts.removeAdditional !== "all" && (0, util_1.alwaysValidSchema)(it, schema)) + return; + const props = (0, code_1.allSchemaProperties)(parentSchema.properties); + const patProps = (0, code_1.allSchemaProperties)(parentSchema.patternProperties); + checkAdditionalProperties(); + cxt.ok((0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + function checkAdditionalProperties() { + gen.forIn("key", data, (key) => { + if (!props.length && !patProps.length) + additionalPropertyCode(key); + else + gen.if(isAdditional(key), () => additionalPropertyCode(key)); + }); + } + function isAdditional(key) { + let definedProp; + if (props.length > 8) { + const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema.properties, "properties"); + definedProp = (0, code_1.isOwnProperty)(gen, propsSchema, key); + } else if (props.length) { + definedProp = (0, codegen_1.or)(...props.map((p) => (0, codegen_1._)`${key} === ${p}`)); + } else { + definedProp = codegen_1.nil; + } + if (patProps.length) { + definedProp = (0, codegen_1.or)(definedProp, ...patProps.map((p) => (0, codegen_1._)`${(0, code_1.usePattern)(cxt, p)}.test(${key})`)); + } + return (0, codegen_1.not)(definedProp); + } + function deleteAdditional(key) { + gen.code((0, codegen_1._)`delete ${data}[${key}]`); + } + function additionalPropertyCode(key) { + if (opts.removeAdditional === "all" || opts.removeAdditional && schema === false) { + deleteAdditional(key); + return; + } + if (schema === false) { + cxt.setParams({ additionalProperty: key }); + cxt.error(); + if (!allErrors) + gen.break(); + return; + } + if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.name("valid"); + if (opts.removeAdditional === "failing") { + applyAdditionalSchema(key, valid, false); + gen.if((0, codegen_1.not)(valid), () => { + cxt.reset(); + deleteAdditional(key); + }); + } else { + applyAdditionalSchema(key, valid); + if (!allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + } + } + function applyAdditionalSchema(key, valid, errors) { + const subschema = { + keyword: "additionalProperties", + dataProp: key, + dataPropType: util_1.Type.Str + }; + if (errors === false) { + Object.assign(subschema, { + compositeRule: true, + createErrors: false, + allErrors: false + }); + } + cxt.subschema(subschema, valid); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js +var require_properties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var validate_1 = require_validate2(); + var code_1 = require_code4(); + var util_1 = require_util2(); + var additionalProperties_1 = require_additionalProperties2(); + var def = { + keyword: "properties", + type: "object", + schemaType: "object", + code(cxt) { + const { gen, schema, parentSchema, data, it } = cxt; + if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === void 0) { + additionalProperties_1.default.code(new validate_1.KeywordCxt(it, additionalProperties_1.default, "additionalProperties")); + } + const allProps = (0, code_1.allSchemaProperties)(schema); + for (const prop of allProps) { + it.definedProperties.add(prop); + } + if (it.opts.unevaluated && allProps.length && it.props !== true) { + it.props = util_1.mergeEvaluated.props(gen, (0, util_1.toHash)(allProps), it.props); + } + const properties = allProps.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p])); + if (properties.length === 0) + return; + const valid = gen.name("valid"); + for (const prop of properties) { + if (hasDefault(prop)) { + applyPropertySchema(prop); + } else { + gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties)); + applyPropertySchema(prop); + if (!it.allErrors) + gen.else().var(valid, true); + gen.endIf(); + } + cxt.it.definedProperties.add(prop); + cxt.ok(valid); + } + function hasDefault(prop) { + return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== void 0; + } + function applyPropertySchema(prop) { + cxt.subschema({ + keyword: "properties", + schemaProp: prop, + dataProp: prop + }, valid); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +var require_patternProperties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var util_2 = require_util2(); + var def = { + keyword: "patternProperties", + type: "object", + schemaType: "object", + code(cxt) { + const { gen, schema, data, parentSchema, it } = cxt; + const { opts } = it; + const patterns = (0, code_1.allSchemaProperties)(schema); + const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p])); + if (patterns.length === 0 || alwaysValidPatterns.length === patterns.length && (!it.opts.unevaluated || it.props === true)) { + return; + } + const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties; + const valid = gen.name("valid"); + if (it.props !== true && !(it.props instanceof codegen_1.Name)) { + it.props = (0, util_2.evaluatedPropsToName)(gen, it.props); + } + const { props } = it; + validatePatternProperties(); + function validatePatternProperties() { + for (const pat of patterns) { + if (checkProperties) + checkMatchingProperties(pat); + if (it.allErrors) { + validateProperties(pat); + } else { + gen.var(valid, true); + validateProperties(pat); + gen.if(valid); + } + } + } + function checkMatchingProperties(pat) { + for (const prop in checkProperties) { + if (new RegExp(pat).test(prop)) { + (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`); + } + } + } + function validateProperties(pat) { + gen.forIn("key", data, (key) => { + gen.if((0, codegen_1._)`${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => { + const alwaysValid = alwaysValidPatterns.includes(pat); + if (!alwaysValid) { + cxt.subschema({ + keyword: "patternProperties", + schemaProp: pat, + dataProp: key, + dataPropType: util_2.Type.Str + }, valid); + } + if (it.opts.unevaluated && props !== true) { + gen.assign((0, codegen_1._)`${props}[${key}]`, true); + } else if (!alwaysValid && !it.allErrors) { + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + }); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js +var require_not2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util2(); + var def = { + keyword: "not", + schemaType: ["object", "boolean"], + trackErrors: true, + code(cxt) { + const { gen, schema, it } = cxt; + if ((0, util_1.alwaysValidSchema)(it, schema)) { + cxt.fail(); + return; + } + const valid = gen.name("valid"); + cxt.subschema({ + keyword: "not", + compositeRule: true, + createErrors: false, + allErrors: false + }, valid); + cxt.failResult(valid, () => cxt.reset(), () => cxt.error()); + }, + error: { message: "must NOT be valid" } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +var require_anyOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var def = { + keyword: "anyOf", + schemaType: "array", + trackErrors: true, + code: code_1.validateUnion, + error: { message: "must match a schema in anyOf" } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +var require_oneOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: "must match exactly one schema in oneOf", + params: ({ params }) => (0, codegen_1._)`{passingSchemas: ${params.passing}}` + }; + var def = { + keyword: "oneOf", + schemaType: "array", + trackErrors: true, + error: error61, + code(cxt) { + const { gen, schema, parentSchema, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + if (it.opts.discriminator && parentSchema.discriminator) + return; + const schArr = schema; + const valid = gen.let("valid", false); + const passing = gen.let("passing", null); + const schValid = gen.name("_valid"); + cxt.setParams({ passing }); + gen.block(validateOneOf); + cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); + function validateOneOf() { + schArr.forEach((sch, i) => { + let schCxt; + if ((0, util_1.alwaysValidSchema)(it, sch)) { + gen.var(schValid, true); + } else { + schCxt = cxt.subschema({ + keyword: "oneOf", + schemaProp: i, + compositeRule: true + }, schValid); + } + if (i > 0) { + gen.if((0, codegen_1._)`${schValid} && ${valid}`).assign(valid, false).assign(passing, (0, codegen_1._)`[${passing}, ${i}]`).else(); + } + gen.if(schValid, () => { + gen.assign(valid, true); + gen.assign(passing, i); + if (schCxt) + cxt.mergeEvaluated(schCxt, codegen_1.Name); + }); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js +var require_allOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util2(); + var def = { + keyword: "allOf", + schemaType: "array", + code(cxt) { + const { gen, schema, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const valid = gen.name("valid"); + schema.forEach((sch, i) => { + if ((0, util_1.alwaysValidSchema)(it, sch)) + return; + const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid); + cxt.ok(valid); + cxt.mergeEvaluated(schCxt); + }); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js +var require_if2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`, + params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}` + }; + var def = { + keyword: "if", + schemaType: ["object", "boolean"], + trackErrors: true, + error: error61, + code(cxt) { + const { gen, parentSchema, it } = cxt; + if (parentSchema.then === void 0 && parentSchema.else === void 0) { + (0, util_1.checkStrictMode)(it, '"if" without "then" and "else" is ignored'); + } + const hasThen = hasSchema(it, "then"); + const hasElse = hasSchema(it, "else"); + if (!hasThen && !hasElse) + return; + const valid = gen.let("valid", true); + const schValid = gen.name("_valid"); + validateIf(); + cxt.reset(); + if (hasThen && hasElse) { + const ifClause = gen.let("ifClause"); + cxt.setParams({ ifClause }); + gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause)); + } else if (hasThen) { + gen.if(schValid, validateClause("then")); + } else { + gen.if((0, codegen_1.not)(schValid), validateClause("else")); + } + cxt.pass(valid, () => cxt.error(true)); + function validateIf() { + const schCxt = cxt.subschema({ + keyword: "if", + compositeRule: true, + createErrors: false, + allErrors: false + }, schValid); + cxt.mergeEvaluated(schCxt); + } + function validateClause(keyword, ifClause) { + return () => { + const schCxt = cxt.subschema({ keyword }, schValid); + gen.assign(valid, schValid); + cxt.mergeValidEvaluated(schCxt, valid); + if (ifClause) + gen.assign(ifClause, (0, codegen_1._)`${keyword}`); + else + cxt.setParams({ ifClause: keyword }); + }; + } + } + }; + function hasSchema(it, keyword) { + const schema = it.schema[keyword]; + return schema !== void 0 && !(0, util_1.alwaysValidSchema)(it, schema); + } + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +var require_thenElse2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util2(); + var def = { + keyword: ["then", "else"], + schemaType: ["object", "boolean"], + code({ keyword, parentSchema, it }) { + if (parentSchema.if === void 0) + (0, util_1.checkStrictMode)(it, `"${keyword}" without "if" is ignored`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js +var require_applicator2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var additionalItems_1 = require_additionalItems2(); + var prefixItems_1 = require_prefixItems2(); + var items_1 = require_items2(); + var items2020_1 = require_items20202(); + var contains_1 = require_contains2(); + var dependencies_1 = require_dependencies2(); + var propertyNames_1 = require_propertyNames2(); + var additionalProperties_1 = require_additionalProperties2(); + var properties_1 = require_properties2(); + var patternProperties_1 = require_patternProperties2(); + var not_1 = require_not2(); + var anyOf_1 = require_anyOf2(); + var oneOf_1 = require_oneOf2(); + var allOf_1 = require_allOf2(); + var if_1 = require_if2(); + var thenElse_1 = require_thenElse2(); + function getApplicator(draft2020 = false) { + const applicator = [ + // any + not_1.default, + anyOf_1.default, + oneOf_1.default, + allOf_1.default, + if_1.default, + thenElse_1.default, + // object + propertyNames_1.default, + additionalProperties_1.default, + dependencies_1.default, + properties_1.default, + patternProperties_1.default + ]; + if (draft2020) + applicator.push(prefixItems_1.default, items2020_1.default); + else + applicator.push(additionalItems_1.default, items_1.default); + applicator.push(contains_1.default); + return applicator; + } + exports.default = getApplicator; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js +var require_format3 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`, + params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}` + }; + var def = { + keyword: "format", + type: ["number", "string"], + schemaType: "string", + $data: true, + error: error61, + code(cxt, ruleType) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + const { opts, errSchemaPath, schemaEnv, self } = it; + if (!opts.validateFormats) + return; + if ($data) + validate$DataFormat(); + else + validateFormat(); + function validate$DataFormat() { + const fmts = gen.scopeValue("formats", { + ref: self.formats, + code: opts.code.formats + }); + const fDef = gen.const("fDef", (0, codegen_1._)`${fmts}[${schemaCode}]`); + const fType = gen.let("fType"); + const format = gen.let("format"); + gen.if((0, codegen_1._)`typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._)`${fDef}.type || "string"`).assign(format, (0, codegen_1._)`${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._)`"string"`).assign(format, fDef)); + cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt())); + function unknownFmt() { + if (opts.strictSchema === false) + return codegen_1.nil; + return (0, codegen_1._)`${schemaCode} && !${format}`; + } + function invalidFmt() { + const callFormat = schemaEnv.$async ? (0, codegen_1._)`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))` : (0, codegen_1._)`${format}(${data})`; + const validData = (0, codegen_1._)`(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`; + return (0, codegen_1._)`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`; + } + } + function validateFormat() { + const formatDef = self.formats[schema]; + if (!formatDef) { + unknownFormat(); + return; + } + if (formatDef === true) + return; + const [fmtType, format, fmtRef] = getFormat(formatDef); + if (fmtType === ruleType) + cxt.pass(validCondition()); + function unknownFormat() { + if (opts.strictSchema === false) { + self.logger.warn(unknownMsg()); + return; + } + throw new Error(unknownMsg()); + function unknownMsg() { + return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`; + } + } + function getFormat(fmtDef) { + const code = fmtDef instanceof RegExp ? (0, codegen_1.regexpCode)(fmtDef) : opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(schema)}` : void 0; + const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code }); + if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) { + return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._)`${fmt}.validate`]; + } + return ["string", fmtDef, fmt]; + } + function validCondition() { + if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) { + if (!schemaEnv.$async) + throw new Error("async format in sync schema"); + return (0, codegen_1._)`await ${fmtRef}(${data})`; + } + return typeof format == "function" ? (0, codegen_1._)`${fmtRef}(${data})` : (0, codegen_1._)`${fmtRef}.test(${data})`; + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js +var require_format4 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var format_1 = require_format3(); + var format = [format_1.default]; + exports.default = format; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js +var require_metadata2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.contentVocabulary = exports.metadataVocabulary = void 0; + exports.metadataVocabulary = [ + "title", + "description", + "default", + "deprecated", + "readOnly", + "writeOnly", + "examples" + ]; + exports.contentVocabulary = [ + "contentMediaType", + "contentEncoding", + "contentSchema" + ]; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js +var require_draft72 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var core_1 = require_core4(); + var validation_1 = require_validation2(); + var applicator_1 = require_applicator2(); + var format_1 = require_format4(); + var metadata_1 = require_metadata2(); + var draft7Vocabularies = [ + core_1.default, + validation_1.default, + (0, applicator_1.default)(), + format_1.default, + metadata_1.metadataVocabulary, + metadata_1.contentVocabulary + ]; + exports.default = draft7Vocabularies; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js +var require_types2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.DiscrError = void 0; + var DiscrError; + (function(DiscrError2) { + DiscrError2["Tag"] = "tag"; + DiscrError2["Mapping"] = "mapping"; + })(DiscrError || (exports.DiscrError = DiscrError = {})); + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js +var require_discriminator2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var types_1 = require_types2(); + var compile_1 = require_compile2(); + var ref_error_1 = require_ref_error2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`, + params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}` + }; + var def = { + keyword: "discriminator", + type: "object", + schemaType: "object", + error: error61, + code(cxt) { + const { gen, data, schema, parentSchema, it } = cxt; + const { oneOf } = parentSchema; + if (!it.opts.discriminator) { + throw new Error("discriminator: requires discriminator option"); + } + const tagName = schema.propertyName; + if (typeof tagName != "string") + throw new Error("discriminator: requires propertyName"); + if (schema.mapping) + throw new Error("discriminator: mapping is not supported"); + if (!oneOf) + throw new Error("discriminator: requires oneOf keyword"); + const valid = gen.let("valid", false); + const tag = gen.const("tag", (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(tagName)}`); + gen.if((0, codegen_1._)`typeof ${tag} == "string"`, () => validateMapping(), () => cxt.error(false, { discrError: types_1.DiscrError.Tag, tag, tagName })); + cxt.ok(valid); + function validateMapping() { + const mapping = getMapping(); + gen.if(false); + for (const tagValue in mapping) { + gen.elseIf((0, codegen_1._)`${tag} === ${tagValue}`); + gen.assign(valid, applyTagSchema(mapping[tagValue])); + } + gen.else(); + cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag, tagName }); + gen.endIf(); + } + function applyTagSchema(schemaProp) { + const _valid = gen.name("valid"); + const schCxt = cxt.subschema({ keyword: "oneOf", schemaProp }, _valid); + cxt.mergeEvaluated(schCxt, codegen_1.Name); + return _valid; + } + function getMapping() { + var _a3; + const oneOfMapping = {}; + const topRequired = hasRequired(parentSchema); + let tagRequired = true; + for (let i = 0; i < oneOf.length; i++) { + let sch = oneOf[i]; + if ((sch === null || sch === void 0 ? void 0 : sch.$ref) && !(0, util_1.schemaHasRulesButRef)(sch, it.self.RULES)) { + const ref = sch.$ref; + sch = compile_1.resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref); + if (sch instanceof compile_1.SchemaEnv) + sch = sch.schema; + if (sch === void 0) + throw new ref_error_1.default(it.opts.uriResolver, it.baseId, ref); + } + const propSch = (_a3 = sch === null || sch === void 0 ? void 0 : sch.properties) === null || _a3 === void 0 ? void 0 : _a3[tagName]; + if (typeof propSch != "object") { + throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`); + } + tagRequired = tagRequired && (topRequired || hasRequired(sch)); + addMappings(propSch, i); + } + if (!tagRequired) + throw new Error(`discriminator: "${tagName}" must be required`); + return oneOfMapping; + function hasRequired({ required: required2 }) { + return Array.isArray(required2) && required2.includes(tagName); + } + function addMappings(sch, i) { + if (sch.const) { + addMapping(sch.const, i); + } else if (sch.enum) { + for (const tagValue of sch.enum) { + addMapping(tagValue, i); + } + } else { + throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`); + } + } + function addMapping(tagValue, i) { + if (typeof tagValue != "string" || tagValue in oneOfMapping) { + throw new Error(`discriminator: "${tagName}" values must be unique strings`); + } + oneOfMapping[tagValue] = i; + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json +var require_json_schema_draft_072 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { + module.exports = { + $schema: "http://json-schema.org/draft-07/schema#", + $id: "http://json-schema.org/draft-07/schema#", + title: "Core schema meta-schema", + definitions: { + schemaArray: { + type: "array", + minItems: 1, + items: { $ref: "#" } + }, + nonNegativeInteger: { + type: "integer", + minimum: 0 + }, + nonNegativeIntegerDefault0: { + allOf: [{ $ref: "#/definitions/nonNegativeInteger" }, { default: 0 }] + }, + simpleTypes: { + enum: ["array", "boolean", "integer", "null", "number", "object", "string"] + }, + stringArray: { + type: "array", + items: { type: "string" }, + uniqueItems: true, + default: [] + } + }, + type: ["object", "boolean"], + properties: { + $id: { + type: "string", + format: "uri-reference" + }, + $schema: { + type: "string", + format: "uri" + }, + $ref: { + type: "string", + format: "uri-reference" + }, + $comment: { + type: "string" + }, + title: { + type: "string" + }, + description: { + type: "string" + }, + default: true, + readOnly: { + type: "boolean", + default: false + }, + examples: { + type: "array", + items: true + }, + multipleOf: { + type: "number", + exclusiveMinimum: 0 + }, + maximum: { + type: "number" + }, + exclusiveMaximum: { + type: "number" + }, + minimum: { + type: "number" + }, + exclusiveMinimum: { + type: "number" + }, + maxLength: { $ref: "#/definitions/nonNegativeInteger" }, + minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + pattern: { + type: "string", + format: "regex" + }, + additionalItems: { $ref: "#" }, + items: { + anyOf: [{ $ref: "#" }, { $ref: "#/definitions/schemaArray" }], + default: true + }, + maxItems: { $ref: "#/definitions/nonNegativeInteger" }, + minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + uniqueItems: { + type: "boolean", + default: false + }, + contains: { $ref: "#" }, + maxProperties: { $ref: "#/definitions/nonNegativeInteger" }, + minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + required: { $ref: "#/definitions/stringArray" }, + additionalProperties: { $ref: "#" }, + definitions: { + type: "object", + additionalProperties: { $ref: "#" }, + default: {} + }, + properties: { + type: "object", + additionalProperties: { $ref: "#" }, + default: {} + }, + patternProperties: { + type: "object", + additionalProperties: { $ref: "#" }, + propertyNames: { format: "regex" }, + default: {} + }, + dependencies: { + type: "object", + additionalProperties: { + anyOf: [{ $ref: "#" }, { $ref: "#/definitions/stringArray" }] + } + }, + propertyNames: { $ref: "#" }, + const: true, + enum: { + type: "array", + items: true, + minItems: 1, + uniqueItems: true + }, + type: { + anyOf: [ + { $ref: "#/definitions/simpleTypes" }, + { + type: "array", + items: { $ref: "#/definitions/simpleTypes" }, + minItems: 1, + uniqueItems: true + } + ] + }, + format: { type: "string" }, + contentMediaType: { type: "string" }, + contentEncoding: { type: "string" }, + if: { $ref: "#" }, + then: { $ref: "#" }, + else: { $ref: "#" }, + allOf: { $ref: "#/definitions/schemaArray" }, + anyOf: { $ref: "#/definitions/schemaArray" }, + oneOf: { $ref: "#/definitions/schemaArray" }, + not: { $ref: "#" } + }, + default: true + }; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/ajv.js +var require_ajv2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/ajv.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; + var core_1 = require_core3(); + var draft7_1 = require_draft72(); + var discriminator_1 = require_discriminator2(); + var draft7MetaSchema = require_json_schema_draft_072(); + var META_SUPPORT_DATA = ["/properties"]; + var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema"; + var Ajv2 = class extends core_1.default { + _addVocabularies() { + super._addVocabularies(); + draft7_1.default.forEach((v2) => this.addVocabulary(v2)); + if (this.opts.discriminator) + this.addKeyword(discriminator_1.default); + } + _addDefaultMetaSchema() { + super._addDefaultMetaSchema(); + if (!this.opts.meta) + return; + const metaSchema = this.opts.$data ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA) : draft7MetaSchema; + this.addMetaSchema(metaSchema, META_SCHEMA_ID, false); + this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID; + } + defaultMeta() { + return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0); + } + }; + exports.Ajv = Ajv2; + module.exports = exports = Ajv2; + module.exports.Ajv = Ajv2; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = Ajv2; + var validate_1 = require_validate2(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen2(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error2(); + Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { + return validation_error_1.default; + } }); + var ref_error_1 = require_ref_error2(); + Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { + return ref_error_1.default; + } }); + } +}); + // node_modules/ajv-formats/dist/limit.js var require_limit = __commonJS({ "node_modules/ajv-formats/dist/limit.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatLimitDefinition = void 0; - var ajv_1 = require_ajv(); - var codegen_1 = require_codegen(); + var ajv_1 = require_ajv2(); + var codegen_1 = require_codegen2(); var ops = codegen_1.operators; var KWDs = { formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, @@ -7159,7 +12766,7 @@ var require_dist = __commonJS({ Object.defineProperty(exports, "__esModule", { value: true }); var formats_1 = require_formats(); var limit_1 = require_limit(); - var codegen_1 = require_codegen(); + var codegen_1 = require_codegen2(); var fullName = new codegen_1.Name("fullFormats"); var fastName = new codegen_1.Name("fastFormats"); var formatsPlugin = (ajv, opts = { keywords: true }) => { @@ -27647,10 +33254,10 @@ function isTerminal(status) { return status === "completed" || status === "failed" || status === "cancelled"; } -// node_modules/zod-to-json-schema/dist/esm/Options.js +// node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/Options.js var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use"); -// node_modules/zod-to-json-schema/dist/esm/parsers/string.js +// node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/parsers/string.js var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789"); // node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js @@ -30046,140 +35653,147 @@ function L() { return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null }; } var T = L(); -function G(u3) { - T = u3; +function G(l3) { + T = l3; } -var I = { exec: () => null }; -function d(u3, e = "") { - let t = typeof u3 == "string" ? u3 : u3.source, n = { replace: (r, i) => { +var E = { exec: () => null }; +function d(l3, e = "") { + let t = typeof l3 == "string" ? l3 : l3.source, n = { replace: (r, i) => { let s = typeof i == "string" ? i : i.source; return s = s.replace(m.caret, "$1"), t = t.replace(r, s), n; }, getRegex: () => new RegExp(t, e) }; return n; } -var m = { codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, outputLinkReplace: /\\([\[\]])/g, indentCodeCompensation: /^(\s+)(?:```)/, beginningSpace: /^\s+/, endingHash: /#$/, startingSpaceChar: /^ /, endingSpaceChar: / $/, nonSpaceChar: /[^ ]/, newLineCharGlobal: /\n/g, tabCharGlobal: /\t/g, multipleSpaceGlobal: /\s+/g, blankLine: /^[ \t]*$/, doubleBlankLine: /\n[ \t]*\n[ \t]*$/, blockquoteStart: /^ {0,3}>/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (u3) => new RegExp(`^( {0,3}${u3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}#`), htmlBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; -var be = /^(?:[ \t]*(?:\n|$))+/; -var Re = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; -var Te = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; -var E = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; -var Oe = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; +var be = (() => { + try { + return !!new RegExp("(?<=1)(?/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (l3) => new RegExp(`^( {0,3}${l3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}#`), htmlBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; +var Re = /^(?:[ \t]*(?:\n|$))+/; +var Te = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; +var Oe = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; +var I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; +var we = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; var F = /(?:[*+-]|\d{1,9}[.)])/; var ie = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/; var oe = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(); -var we = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); +var ye = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); var j = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; -var ye = /^[^\n]+/; +var Pe = /^[^\n]+/; var Q = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/; -var Pe = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); -var Se = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); +var Se = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); +var $e = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); var v = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; var U = /|$))/; -var $e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); -var ae = d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var _e = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); -var K = { blockquote: _e, code: Re, def: Pe, fences: Te, heading: Oe, hr: E, html: $e, lheading: oe, list: Se, newline: be, paragraph: ae, table: I, text: ye }; -var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var Le = { ...K, lheading: we, table: re, paragraph: d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; -var Me = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: I, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", E).replace("heading", ` *#{1,6} *[^ +var _e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); +var ae = d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var Le = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); +var K = { blockquote: Le, code: Te, def: Se, fences: Oe, heading: we, hr: I, html: _e, lheading: oe, list: $e, newline: Re, paragraph: ae, table: E, text: Pe }; +var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var Me = { ...K, lheading: ye, table: re, paragraph: d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; +var ze = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: E, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", I).replace("heading", ` *#{1,6} *[^ ]`).replace("lheading", oe).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }; -var ze = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; -var Ae = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; +var Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; +var Ee = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; var le = /^( {2,}|\\)\n(?!\s*$)/; var Ie = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g; +var Be = /(?!~)[\s\p{P}\p{S}]/u; +var qe = /(?:[^\s\p{P}\p{S}]|~)/u; +var ve = d(/link|precode-code|html/, "g").replace("link", /\[(?:[^\[\]`]|(?`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", be ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(); var ce = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/; -var ve = d(ce, "u").replace(/punct/g, D).getRegex(); -var De = d(ce, "u").replace(/punct/g, pe).getRegex(); +var De = d(ce, "u").replace(/punct/g, D).getRegex(); +var He = d(ce, "u").replace(/punct/g, pe).getRegex(); var he = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)"; -var He = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Ze = d(he, "gu").replace(/notPunctSpace/g, Be).replace(/punctSpace/g, Ce).replace(/punct/g, pe).getRegex(); -var Ge = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Ne = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); -var Fe = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); -var je = d(U).replace("(?:-->|$)", "-->").getRegex(); -var Qe = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", je).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); +var Ze = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Ge = d(he, "gu").replace(/notPunctSpace/g, qe).replace(/punctSpace/g, Be).replace(/punct/g, pe).getRegex(); +var Ne = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Fe = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); +var je = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); +var Qe = d(U).replace("(?:-->|$)", "-->").getRegex(); +var Ue = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", Qe).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); var q = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/; -var Ue = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); +var Ke = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); var de = d(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", Q).getRegex(); var ke = d(/^!?\[(ref)\](?:\[\])?/).replace("ref", Q).getRegex(); -var Ke = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); +var We = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); var se = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/; -var X = { _backpedal: I, anyPunctuation: Ne, autolink: Fe, blockSkip: qe, br: le, code: Ae, del: I, emStrongLDelim: ve, emStrongRDelimAst: He, emStrongRDelimUnd: Ge, escape: ze, link: Ue, nolink: ke, punctuation: Ee, reflink: de, reflinkSearch: Ke, tag: Qe, text: Ie, url: I }; -var We = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; -var N = { ...X, emStrongRDelimAst: Ze, emStrongLDelim: De, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; -var ge = (u3) => Je[u3]; -function w(u3, e) { +var X = { _backpedal: E, anyPunctuation: Fe, autolink: je, blockSkip: ve, br: le, code: Ee, del: E, emStrongLDelim: De, emStrongRDelimAst: Ze, emStrongRDelimUnd: Ne, escape: Ae, link: Ke, nolink: ke, punctuation: Ce, reflink: de, reflinkSearch: We, tag: Ue, text: Ie, url: E }; +var Xe = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; +var N = { ...X, emStrongRDelimAst: Ge, emStrongLDelim: He, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; +var ge = (l3) => Ve[l3]; +function w(l3, e) { if (e) { - if (m.escapeTest.test(u3)) return u3.replace(m.escapeReplace, ge); - } else if (m.escapeTestNoEncode.test(u3)) return u3.replace(m.escapeReplaceNoEncode, ge); - return u3; + if (m.escapeTest.test(l3)) return l3.replace(m.escapeReplace, ge); + } else if (m.escapeTestNoEncode.test(l3)) return l3.replace(m.escapeReplaceNoEncode, ge); + return l3; } -function J(u3) { +function J(l3) { try { - u3 = encodeURI(u3).replace(m.percentDecode, "%"); + l3 = encodeURI(l3).replace(m.percentDecode, "%"); } catch { return null; } - return u3; + return l3; } -function V(u3, e) { - let t = u3.replace(m.findPipe, (i, s, o) => { - let a = false, l = s; - for (; --l >= 0 && o[l] === "\\"; ) a = !a; - return a ? "|" : " |"; +function V(l3, e) { + let t = l3.replace(m.findPipe, (i, s, a) => { + let o = false, p = s; + for (; --p >= 0 && a[p] === "\\"; ) o = !o; + return o ? "|" : " |"; }), n = t.split(m.splitPipe), r = 0; if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e) if (n.length > e) n.splice(e); else for (; n.length < e; ) n.push(""); for (; r < n.length; r++) n[r] = n[r].trim().replace(m.slashPipe, "|"); return n; } -function z2(u3, e, t) { - let n = u3.length; +function z2(l3, e, t) { + let n = l3.length; if (n === 0) return ""; let r = 0; for (; r < n; ) { - let i = u3.charAt(n - r - 1); + let i = l3.charAt(n - r - 1); if (i === e && !t) r++; else if (i !== e && t) r++; else break; } - return u3.slice(0, n - r); + return l3.slice(0, n - r); } -function fe(u3, e) { - if (u3.indexOf(e[1]) === -1) return -1; +function fe(l3, e) { + if (l3.indexOf(e[1]) === -1) return -1; let t = 0; - for (let n = 0; n < u3.length; n++) if (u3[n] === "\\") n++; - else if (u3[n] === e[0]) t++; - else if (u3[n] === e[1] && (t--, t < 0)) return n; + for (let n = 0; n < l3.length; n++) if (l3[n] === "\\") n++; + else if (l3[n] === e[0]) t++; + else if (l3[n] === e[1] && (t--, t < 0)) return n; return t > 0 ? -2 : -1; } -function me(u3, e, t, n, r) { - let i = e.href, s = e.title || null, o = u3[1].replace(r.other.outputLinkReplace, "$1"); +function me(l3, e, t, n, r) { + let i = e.href, s = e.title || null, a = l3[1].replace(r.other.outputLinkReplace, "$1"); n.state.inLink = true; - let a = { type: u3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: o, tokens: n.inlineTokens(o) }; - return n.state.inLink = false, a; + let o = { type: l3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: a, tokens: n.inlineTokens(a) }; + return n.state.inLink = false, o; } -function Ve(u3, e, t) { - let n = u3.match(t.other.indentCodeCompensation); +function Ye(l3, e, t) { + let n = l3.match(t.other.indentCodeCompensation); if (n === null) return e; let r = n[1]; return e.split(` `).map((i) => { let s = i.match(t.other.beginningSpace); if (s === null) return i; - let [o] = s; - return o.length >= r.length ? i.slice(r.length) : i; + let [a] = s; + return a.length >= r.length ? i.slice(r.length) : i; }).join(` `); } @@ -30205,7 +35819,7 @@ var y = class { fences(e) { let t = this.rules.block.fences.exec(e); if (t) { - let n = t[0], r = Ve(n, t[3] || "", this.rules); + let n = t[0], r = Ye(n, t[3] || "", this.rules); return { type: "code", raw: n, lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2], text: r }; } } @@ -30232,19 +35846,19 @@ var y = class { `).split(` `), r = "", i = "", s = []; for (; n.length > 0; ) { - let o = false, a = [], l; - for (l = 0; l < n.length; l++) if (this.rules.other.blockquoteStart.test(n[l])) a.push(n[l]), o = true; - else if (!o) a.push(n[l]); + let a = false, o = [], p; + for (p = 0; p < n.length; p++) if (this.rules.other.blockquoteStart.test(n[p])) o.push(n[p]), a = true; + else if (!a) o.push(n[p]); else break; - n = n.slice(l); - let c = a.join(` -`), p = c.replace(this.rules.other.blockquoteSetextReplace, ` + n = n.slice(p); + let u = o.join(` +`), c = u.replace(this.rules.other.blockquoteSetextReplace, ` $1`).replace(this.rules.other.blockquoteSetextReplace2, ""); r = r ? `${r} -${c}` : c, i = i ? `${i} -${p}` : p; +${u}` : u, i = i ? `${i} +${c}` : c; let g = this.lexer.state.top; - if (this.lexer.state.top = true, this.lexer.blockTokens(p, s, true), this.lexer.state.top = g, n.length === 0) break; + if (this.lexer.state.top = true, this.lexer.blockTokens(c, s, true), this.lexer.state.top = g, n.length === 0) break; let h = s.at(-1); if (h?.type === "code") break; if (h?.type === "blockquote") { @@ -30270,45 +35884,45 @@ ${p}` : p; if (t) { let n = t[1].trim(), r = n.length > 1, i = { type: "list", raw: "", ordered: r, start: r ? +n.slice(0, -1) : "", loose: false, items: [] }; n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); - let s = this.rules.other.listItemRegex(n), o = false; + let s = this.rules.other.listItemRegex(n), a = false; for (; e; ) { - let l = false, c = "", p = ""; + let p = false, u = "", c = ""; if (!(t = s.exec(e)) || this.rules.block.hr.test(e)) break; - c = t[0], e = e.substring(c.length); + u = t[0], e = e.substring(u.length); let g = t[2].split(` `, 1)[0].replace(this.rules.other.listReplaceTabs, (H) => " ".repeat(3 * H.length)), h = e.split(` `, 1)[0], R = !g.trim(), f = 0; - if (this.options.pedantic ? (f = 2, p = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, p = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (c += h + ` -`, e = e.substring(h.length + 1), l = true), !l) { + if (this.options.pedantic ? (f = 2, c = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, c = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (u += h + ` +`, e = e.substring(h.length + 1), p = true), !p) { let H = this.rules.other.nextBulletRegex(f), ee = this.rules.other.hrRegex(f), te = this.rules.other.fencesBeginRegex(f), ne = this.rules.other.headingBeginRegex(f), xe = this.rules.other.htmlBeginRegex(f); for (; e; ) { let Z = e.split(` `, 1)[0], A; if (h = Z, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, " "), A = h) : A = h.replace(this.rules.other.tabCharGlobal, " "), te.test(h) || ne.test(h) || xe.test(h) || H.test(h) || ee.test(h)) break; - if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) p += ` + if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) c += ` ` + A.slice(f); else { if (R || g.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || te.test(g) || ne.test(g) || ee.test(g)) break; - p += ` + c += ` ` + h; } - !R && !h.trim() && (R = true), c += Z + ` + !R && !h.trim() && (R = true), u += Z + ` `, e = e.substring(Z.length + 1), g = A.slice(f); } } - i.loose || (o ? i.loose = true : this.rules.other.doubleBlankLine.test(c) && (o = true)); + i.loose || (a ? i.loose = true : this.rules.other.doubleBlankLine.test(u) && (a = true)); let O = null, Y; - this.options.gfm && (O = this.rules.other.listIsTask.exec(p), O && (Y = O[0] !== "[ ] ", p = p.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: c, task: !!O, checked: Y, loose: false, text: p, tokens: [] }), i.raw += c; + this.options.gfm && (O = this.rules.other.listIsTask.exec(c), O && (Y = O[0] !== "[ ] ", c = c.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: u, task: !!O, checked: Y, loose: false, text: c, tokens: [] }), i.raw += u; } - let a = i.items.at(-1); - if (a) a.raw = a.raw.trimEnd(), a.text = a.text.trimEnd(); + let o = i.items.at(-1); + if (o) o.raw = o.raw.trimEnd(), o.text = o.text.trimEnd(); else return; i.raw = i.raw.trimEnd(); - for (let l = 0; l < i.items.length; l++) if (this.lexer.state.top = false, i.items[l].tokens = this.lexer.blockTokens(i.items[l].text, []), !i.loose) { - let c = i.items[l].tokens.filter((g) => g.type === "space"), p = c.length > 0 && c.some((g) => this.rules.other.anyLine.test(g.raw)); - i.loose = p; + for (let p = 0; p < i.items.length; p++) if (this.lexer.state.top = false, i.items[p].tokens = this.lexer.blockTokens(i.items[p].text, []), !i.loose) { + let u = i.items[p].tokens.filter((g) => g.type === "space"), c = u.length > 0 && u.some((g) => this.rules.other.anyLine.test(g.raw)); + i.loose = c; } - if (i.loose) for (let l = 0; l < i.items.length; l++) i.items[l].loose = true; + if (i.loose) for (let p = 0; p < i.items.length; p++) i.items[p].loose = true; return i; } } @@ -30329,9 +35943,9 @@ ${p}` : p; let n = V(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(` `) : [], s = { type: "table", raw: t[0], header: [], align: [], rows: [] }; if (n.length === r.length) { - for (let o of r) this.rules.other.tableAlignRight.test(o) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(o) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(o) ? s.align.push("left") : s.align.push(null); - for (let o = 0; o < n.length; o++) s.header.push({ text: n[o], tokens: this.lexer.inline(n[o]), header: true, align: s.align[o] }); - for (let o of i) s.rows.push(V(o, s.header.length).map((a, l) => ({ text: a, tokens: this.lexer.inline(a), header: false, align: s.align[l] }))); + for (let a of r) this.rules.other.tableAlignRight.test(a) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(a) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(a) ? s.align.push("left") : s.align.push(null); + for (let a = 0; a < n.length; a++) s.header.push({ text: n[a], tokens: this.lexer.inline(n[a]), header: true, align: s.align[a] }); + for (let a of i) s.rows.push(V(a, s.header.length).map((o, p) => ({ text: o, tokens: this.lexer.inline(o), header: false, align: s.align[p] }))); return s; } } @@ -30371,8 +35985,8 @@ ${p}` : p; let s = fe(t[2], "()"); if (s === -2) return; if (s > -1) { - let a = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; - t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, a).trim(), t[3] = ""; + let o = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; + t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, o).trim(), t[3] = ""; } } let r = t[2], i = ""; @@ -30398,20 +36012,20 @@ ${p}` : p; let r = this.rules.inline.emStrongLDelim.exec(e); if (!r || r[3] && n.match(this.rules.other.unicodeAlphaNumeric)) return; if (!(r[1] || r[2] || "") || !n || this.rules.inline.punctuation.exec(n)) { - let s = [...r[0]].length - 1, o, a, l = s, c = 0, p = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; - for (p.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = p.exec(t)) != null; ) { - if (o = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !o) continue; - if (a = [...o].length, r[3] || r[4]) { - l += a; + let s = [...r[0]].length - 1, a, o, p = s, u = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + for (c.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = c.exec(t)) != null; ) { + if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a) continue; + if (o = [...a].length, r[3] || r[4]) { + p += o; continue; - } else if ((r[5] || r[6]) && s % 3 && !((s + a) % 3)) { - c += a; + } else if ((r[5] || r[6]) && s % 3 && !((s + o) % 3)) { + u += o; continue; } - if (l -= a, l > 0) continue; - a = Math.min(a, a + l + c); - let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + a); - if (Math.min(s, a) % 2) { + if (p -= o, p > 0) continue; + o = Math.min(o, o + p + u); + let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + o); + if (Math.min(s, o) % 2) { let f = h.slice(1, -1); return { type: "em", raw: h, text: f, tokens: this.lexer.inlineTokens(f) }; } @@ -30465,7 +36079,7 @@ ${p}` : p; } } }; -var x = class u { +var x = class l { tokens; options; state; @@ -30480,10 +36094,10 @@ var x = class u { return { block: C, inline: M }; } static lex(e, t) { - return new u(t).lex(e); + return new l(t).lex(e); } static lexInline(e, t) { - return new u(t).inlineTokens(e); + return new l(t).inlineTokens(e); } lex(e) { e = e.replace(m.carriageReturn, ` @@ -30557,9 +36171,9 @@ var x = class u { } let i = e; if (this.options.extensions?.startBlock) { - let s = 1 / 0, o = e.slice(1), a; - this.options.extensions.startBlock.forEach((l) => { - a = l.call({ lexer: this }, o), typeof a == "number" && a >= 0 && (s = Math.min(s, a)); + let s = 1 / 0, a = e.slice(1), o; + this.options.extensions.startBlock.forEach((p) => { + o = p.call({ lexer: this }, a), typeof o == "number" && o >= 0 && (s = Math.min(s, o)); }), s < 1 / 0 && s >= 0 && (i = e.substring(0, s + 1)); } if (this.state.top && (r = this.tokenizer.paragraph(i))) { @@ -30599,13 +36213,14 @@ var x = class u { if (o.length > 0) for (; (r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) != null; ) o.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); } for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null; ) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); - for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + let i; + for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) i = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i) + "[" + "a".repeat(r[0].length - i - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n; - let i = false, s = ""; + let s = false, a = ""; for (; e; ) { - i || (s = ""), i = false; + s || (a = ""), s = false; let o; - if (this.options.extensions?.inline?.some((l) => (o = l.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; + if (this.options.extensions?.inline?.some((u) => (o = u.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; if (o = this.tokenizer.escape(e)) { e = e.substring(o.raw.length), t.push(o); continue; @@ -30620,11 +36235,11 @@ var x = class u { } if (o = this.tokenizer.reflink(e, this.tokens.links)) { e = e.substring(o.raw.length); - let l = t.at(-1); - o.type === "text" && l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); + let u = t.at(-1); + o.type === "text" && u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); continue; } - if (o = this.tokenizer.emStrong(e, n, s)) { + if (o = this.tokenizer.emStrong(e, n, a)) { e = e.substring(o.raw.length), t.push(o); continue; } @@ -30648,25 +36263,25 @@ var x = class u { e = e.substring(o.raw.length), t.push(o); continue; } - let a = e; + let p = e; if (this.options.extensions?.startInline) { - let l = 1 / 0, c = e.slice(1), p; - this.options.extensions.startInline.forEach((g) => { - p = g.call({ lexer: this }, c), typeof p == "number" && p >= 0 && (l = Math.min(l, p)); - }), l < 1 / 0 && l >= 0 && (a = e.substring(0, l + 1)); - } - if (o = this.tokenizer.inlineText(a)) { - e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (s = o.raw.slice(-1)), i = true; - let l = t.at(-1); - l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); + let u = 1 / 0, c = e.slice(1), g; + this.options.extensions.startInline.forEach((h) => { + g = h.call({ lexer: this }, c), typeof g == "number" && g >= 0 && (u = Math.min(u, g)); + }), u < 1 / 0 && u >= 0 && (p = e.substring(0, u + 1)); + } + if (o = this.tokenizer.inlineText(p)) { + e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (a = o.raw.slice(-1)), s = true; + let u = t.at(-1); + u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); continue; } if (e) { - let l = "Infinite loop on byte: " + e.charCodeAt(0); + let u = "Infinite loop on byte: " + e.charCodeAt(0); if (this.options.silent) { - console.error(l); + console.error(u); break; - } else throw new Error(l); + } else throw new Error(u); } } return t; @@ -30709,9 +36324,9 @@ ${this.parser.parse(e)} } list(e) { let t = e.ordered, n = e.start, r = ""; - for (let o = 0; o < e.items.length; o++) { - let a = e.items[o]; - r += this.listitem(a); + for (let a = 0; a < e.items.length; a++) { + let o = e.items[a]; + r += this.listitem(o); } let i = t ? "ol" : "ul", s = t && n !== 1 ? ' start="' + n + '"' : ""; return "<" + i + s + `> @@ -30742,7 +36357,7 @@ ${this.parser.parse(e)} for (let i = 0; i < e.rows.length; i++) { let s = e.rows[i]; n = ""; - for (let o = 0; o < s.length; o++) n += this.tablecell(s[o]); + for (let a = 0; a < s.length; a++) n += this.tablecell(s[a]); r += this.tablerow({ text: n }); } return r && (r = `${r}`), ` @@ -30824,7 +36439,7 @@ var $ = class { return ""; } }; -var b = class u2 { +var b = class l2 { options; renderer; textRenderer; @@ -30832,19 +36447,19 @@ var b = class u2 { this.options = e || T, this.options.renderer = this.options.renderer || new P(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new $(); } static parse(e, t) { - return new u2(t).parse(e); + return new l2(t).parse(e); } static parseInline(e, t) { - return new u2(t).parseInline(e); + return new l2(t).parseInline(e); } parse(e, t = true) { let n = ""; for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let o = i, a = this.options.extensions.renderers[o.type].call({ parser: this }, o); - if (a !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(o.type)) { - n += a || ""; + let a = i, o = this.options.extensions.renderers[a.type].call({ parser: this }, a); + if (o !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(a.type)) { + n += o || ""; continue; } } @@ -30891,16 +36506,16 @@ var b = class u2 { continue; } case "text": { - let o = s, a = this.renderer.text(o); - for (; r + 1 < e.length && e[r + 1].type === "text"; ) o = e[++r], a += ` -` + this.renderer.text(o); - t ? n += this.renderer.paragraph({ type: "paragraph", raw: a, text: a, tokens: [{ type: "text", raw: a, text: a, escaped: true }] }) : n += a; + let a = s, o = this.renderer.text(a); + for (; r + 1 < e.length && e[r + 1].type === "text"; ) a = e[++r], o += ` +` + this.renderer.text(a); + t ? n += this.renderer.paragraph({ type: "paragraph", raw: o, text: o, tokens: [{ type: "text", raw: o, text: o, escaped: true }] }) : n += o; continue; } default: { - let o = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(o), ""; - throw new Error(o); + let a = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(a), ""; + throw new Error(a); } } } @@ -30911,9 +36526,9 @@ var b = class u2 { for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let o = this.options.extensions.renderers[i.type].call({ parser: this }, i); - if (o !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { - n += o || ""; + let a = this.options.extensions.renderers[i.type].call({ parser: this }, i); + if (a !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { + n += a || ""; continue; } } @@ -30960,9 +36575,9 @@ var b = class u2 { break; } default: { - let o = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(o), ""; - throw new Error(o); + let a = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(a), ""; + throw new Error(a); } } } @@ -31016,7 +36631,7 @@ var B = class { case "table": { let i = r; for (let s of i.header) n = n.concat(this.walkTokens(s.tokens, t)); - for (let s of i.rows) for (let o of s) n = n.concat(this.walkTokens(o.tokens, t)); + for (let s of i.rows) for (let a of s) n = n.concat(this.walkTokens(a.tokens, t)); break; } case "list": { @@ -31027,8 +36642,8 @@ var B = class { default: { let i = r; this.defaults.extensions?.childTokens?.[i.type] ? this.defaults.extensions.childTokens[i.type].forEach((s) => { - let o = i[s].flat(1 / 0); - n = n.concat(this.walkTokens(o, t)); + let a = i[s].flat(1 / 0); + n = n.concat(this.walkTokens(a, t)); }) : i.tokens && (n = n.concat(this.walkTokens(i.tokens, t))); } } @@ -31042,9 +36657,9 @@ var B = class { if (!i.name) throw new Error("extension name required"); if ("renderer" in i) { let s = t.renderers[i.name]; - s ? t.renderers[i.name] = function(...o) { - let a = i.renderer.apply(this, o); - return a === false && (a = s.apply(this, o)), a; + s ? t.renderers[i.name] = function(...a) { + let o = i.renderer.apply(this, a); + return o === false && (o = s.apply(this, a)), o; } : t.renderers[i.name] = i.renderer; } if ("tokenizer" in i) { @@ -31058,10 +36673,10 @@ var B = class { for (let s in n.renderer) { if (!(s in i)) throw new Error(`renderer '${s}' does not exist`); if (["options", "parser"].includes(s)) continue; - let o = s, a = n.renderer[o], l = i[o]; - i[o] = (...c) => { - let p = a.apply(i, c); - return p === false && (p = l.apply(i, c)), p || ""; + let a = s, o = n.renderer[a], p = i[a]; + i[a] = (...u) => { + let c = o.apply(i, u); + return c === false && (c = p.apply(i, u)), c || ""; }; } r.renderer = i; @@ -31071,10 +36686,10 @@ var B = class { for (let s in n.tokenizer) { if (!(s in i)) throw new Error(`tokenizer '${s}' does not exist`); if (["options", "rules", "lexer"].includes(s)) continue; - let o = s, a = n.tokenizer[o], l = i[o]; - i[o] = (...c) => { - let p = a.apply(i, c); - return p === false && (p = l.apply(i, c)), p; + let a = s, o = n.tokenizer[a], p = i[a]; + i[a] = (...u) => { + let c = o.apply(i, u); + return c === false && (c = p.apply(i, u)), c; }; } r.tokenizer = i; @@ -31084,30 +36699,30 @@ var B = class { for (let s in n.hooks) { if (!(s in i)) throw new Error(`hook '${s}' does not exist`); if (["options", "block"].includes(s)) continue; - let o = s, a = n.hooks[o], l = i[o]; - S.passThroughHooks.has(s) ? i[o] = (c) => { + let a = s, o = n.hooks[a], p = i[a]; + S.passThroughHooks.has(s) ? i[a] = (u) => { if (this.defaults.async && S.passThroughHooksRespectAsync.has(s)) return (async () => { - let g = await a.call(i, c); - return l.call(i, g); + let g = await o.call(i, u); + return p.call(i, g); })(); - let p = a.call(i, c); - return l.call(i, p); - } : i[o] = (...c) => { + let c = o.call(i, u); + return p.call(i, c); + } : i[a] = (...u) => { if (this.defaults.async) return (async () => { - let g = await a.apply(i, c); - return g === false && (g = await l.apply(i, c)), g; + let g = await o.apply(i, u); + return g === false && (g = await p.apply(i, u)), g; })(); - let p = a.apply(i, c); - return p === false && (p = l.apply(i, c)), p; + let c = o.apply(i, u); + return c === false && (c = p.apply(i, u)), c; }; } r.hooks = i; } if (n.walkTokens) { let i = this.defaults.walkTokens, s = n.walkTokens; - r.walkTokens = function(o) { - let a = []; - return a.push(s.call(this, o)), i && (a = a.concat(i.call(this, o))), a; + r.walkTokens = function(a) { + let o = []; + return o.push(s.call(this, a)), i && (o = o.concat(i.call(this, a))), o; }; } this.defaults = { ...this.defaults, ...r }; @@ -31124,24 +36739,24 @@ var B = class { } parseMarkdown(e) { return (n, r) => { - let i = { ...r }, s = { ...this.defaults, ...i }, o = this.onError(!!s.silent, !!s.async); - if (this.defaults.async === true && i.async === false) return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); - if (typeof n > "u" || n === null) return o(new Error("marked(): input parameter is undefined or null")); - if (typeof n != "string") return o(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); + let i = { ...r }, s = { ...this.defaults, ...i }, a = this.onError(!!s.silent, !!s.async); + if (this.defaults.async === true && i.async === false) return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + if (typeof n > "u" || n === null) return a(new Error("marked(): input parameter is undefined or null")); + if (typeof n != "string") return a(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); if (s.hooks && (s.hooks.options = s, s.hooks.block = e), s.async) return (async () => { - let a = s.hooks ? await s.hooks.preprocess(n) : n, c = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(a, s), p = s.hooks ? await s.hooks.processAllTokens(c) : c; - s.walkTokens && await Promise.all(this.walkTokens(p, s.walkTokens)); - let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); + let o = s.hooks ? await s.hooks.preprocess(n) : n, u = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(o, s), c = s.hooks ? await s.hooks.processAllTokens(u) : u; + s.walkTokens && await Promise.all(this.walkTokens(c, s.walkTokens)); + let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(c, s); return s.hooks ? await s.hooks.postprocess(h) : h; - })().catch(o); + })().catch(a); try { s.hooks && (n = s.hooks.preprocess(n)); - let l = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); - s.hooks && (l = s.hooks.processAllTokens(l)), s.walkTokens && this.walkTokens(l, s.walkTokens); - let p = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(l, s); - return s.hooks && (p = s.hooks.postprocess(p)), p; - } catch (a) { - return o(a); + let p = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); + s.hooks && (p = s.hooks.processAllTokens(p)), s.walkTokens && this.walkTokens(p, s.walkTokens); + let c = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); + return s.hooks && (c = s.hooks.postprocess(c)), c; + } catch (o) { + return a(o); } }; } @@ -31158,19 +36773,19 @@ Please report this to https://github.com/markedjs/marked.`, e) { } }; var _ = new B(); -function k(u3, e) { - return _.parse(u3, e); +function k(l3, e) { + return _.parse(l3, e); } -k.options = k.setOptions = function(u3) { - return _.setOptions(u3), k.defaults = _.defaults, G(k.defaults), k; +k.options = k.setOptions = function(l3) { + return _.setOptions(l3), k.defaults = _.defaults, G(k.defaults), k; }; k.getDefaults = L; k.defaults = T; -k.use = function(...u3) { - return _.use(...u3), k.defaults = _.defaults, G(k.defaults), k; +k.use = function(...l3) { + return _.use(...l3), k.defaults = _.defaults, G(k.defaults), k; }; -k.walkTokens = function(u3, e) { - return _.walkTokens(u3, e); +k.walkTokens = function(l3, e) { + return _.walkTokens(l3, e); }; k.parseInline = _.parseInline; k.Parser = b; @@ -31182,13 +36797,13 @@ k.lexer = x.lex; k.Tokenizer = y; k.Hooks = S; k.parse = k; -var Ht = k.options; -var Zt = k.setOptions; -var Gt = k.use; -var Nt = k.walkTokens; -var Ft = k.parseInline; -var Qt = b.parse; -var Ut = x.lex; +var Zt = k.options; +var Gt = k.setOptions; +var Nt = k.use; +var Ft = k.walkTokens; +var jt = k.parseInline; +var Ut = b.parse; +var Kt = x.lex; // src/show.ts function formatConversationAsMarkdown(jsonl, startLine, endLine) { diff --git a/dist/verify.d.ts b/dist/verify.d.ts index 9558c879..44208d16 100644 --- a/dist/verify.d.ts +++ b/dist/verify.d.ts @@ -3,6 +3,9 @@ export interface VerificationResult { path: string; reason: string; }>; + unindexed: Array<{ + path: string; + }>; orphaned: Array<{ uuid: string; path: string; @@ -12,10 +15,15 @@ export interface VerificationResult { fileTime: number; dbTime: number; }>; + archiveRefreshes: Array<{ + path: string; + fileTime: number; + dbTime: number; + }>; corrupted: Array<{ path: string; error: string; }>; } export declare function verifyIndex(): Promise; -export declare function repairIndex(issues: VerificationResult): Promise; +export declare function repairIndex(issues: Pick): Promise; diff --git a/dist/verify.js b/dist/verify.js index dd4535d2..d9456181 100644 --- a/dist/verify.js +++ b/dist/verify.js @@ -1,14 +1,16 @@ import fs from 'fs'; import path from 'path'; import { parseConversation } from './parser.js'; -import { initDatabase, getAllExchanges, getFileLastIndexed } from './db.js'; +import { initDatabase, getAllExchanges } from './db.js'; import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { isErroredSentinel } from './summary-sentinel.js'; export async function verifyIndex() { const result = { missing: [], + unindexed: [], orphaned: [], outdated: [], + archiveRefreshes: [], corrupted: [] }; const archiveDir = getArchiveDir(); @@ -20,6 +22,10 @@ export async function verifyIndex() { } // Initialize database once for all checks const db = initDatabase(); + const indexState = db.prepare(` + SELECT MAX(line_end) AS maxLineEnd, MAX(last_indexed) AS lastIndexed + FROM exchanges WHERE archive_path = ? + `); const projects = fs.readdirSync(archiveDir); const excludedProjects = getExcludedProjects(); const excludedDirSet = new Set(excludedProjects); @@ -47,27 +53,28 @@ export async function verifyIndex() { // re-attempts it rather than reporting the conversation as healthy. if (!fs.existsSync(summaryPath)) { result.missing.push({ path: conversationPath, reason: 'No summary file' }); - continue; } - if (isErroredSentinel(fs.readFileSync(summaryPath, 'utf-8'))) { + else if (isErroredSentinel(fs.readFileSync(summaryPath, 'utf-8'))) { result.missing.push({ path: conversationPath, reason: 'Previous summarization failed (error sentinel)' }); - continue; } - // Check if file is outdated (modified after last_indexed) - const lastIndexed = getFileLastIndexed(db, conversationPath); - if (lastIndexed !== null) { - const fileStat = fs.statSync(conversationPath); - if (fileStat.mtimeMs > lastIndexed) { - result.outdated.push({ - path: conversationPath, - fileTime: fileStat.mtimeMs, - dbTime: lastIndexed - }); - } - } - // Try parsing to detect corruption + const state = indexState.get(conversationPath); + const maxLineEnd = state.maxLineEnd; + if (maxLineEnd === null) + result.unindexed.push({ path: conversationPath }); + // Parse independently of summary state and mtime. Only exchanges past + // the indexed high-water mark are a real index delta. try { - await parseConversation(conversationPath, project, conversationPath); + const exchanges = await parseConversation(conversationPath, project, conversationPath); + if (maxLineEnd !== null) { + const fileTime = fs.statSync(conversationPath).mtimeMs; + const dbTime = state.lastIndexed ?? 0; + if (exchanges.some(exchange => exchange.lineEnd > maxLineEnd)) { + result.outdated.push({ path: conversationPath, fileTime, dbTime }); + } + else if (state.lastIndexed !== null && fileTime > state.lastIndexed) { + result.archiveRefreshes.push({ path: conversationPath, fileTime, dbTime }); + } + } } catch (error) { result.corrupted.push({ @@ -82,7 +89,7 @@ export async function verifyIndex() { const dbExchanges = getAllExchanges(db); db.close(); for (const exchange of dbExchanges) { - if (!foundFiles.has(exchange.archivePath)) { + if (!foundFiles.has(exchange.archivePath) && !statIfExists(exchange.archivePath)?.isFile()) { result.orphaned.push({ uuid: exchange.id, path: exchange.archivePath @@ -106,10 +113,10 @@ export async function repairIndex(issues) { deleteExchange(db, orphan.uuid); } // Re-index missing and outdated conversations - const toReindex = [ - ...issues.missing.map(m => m.path), - ...issues.outdated.map(o => o.path) - ]; + const toReindex = [...new Set([ + ...issues.missing.map(m => m.path), + ...issues.outdated.map(o => o.path) + ])]; for (const conversationPath of toReindex) { console.log(`Re-indexing: ${conversationPath}`); try { diff --git a/src/index-cli.ts b/src/index-cli.ts index 272ecdba..d3042677 100644 --- a/src/index-cli.ts +++ b/src/index-cli.ts @@ -71,17 +71,27 @@ async function main() { console.log('\n=== Verification Results ==='); console.log(`Missing summaries: ${issues.missing.length}`); + console.log(`Unindexed archives: ${issues.unindexed.length}`); console.log(`Orphaned entries: ${issues.orphaned.length}`); console.log(`Outdated files: ${issues.outdated.length}`); + console.log(`Archive refreshes (no new exchanges): ${issues.archiveRefreshes.length}`); console.log(`Corrupted files: ${issues.corrupted.length}`); if (issues.missing.length > 0) { console.log('\nMissing summaries:'); issues.missing.forEach(m => console.log(` ${m.path}`)); } + if (issues.unindexed.length > 0) { + console.log('\nUnindexed archives:'); + issues.unindexed.forEach(item => console.log(` ${item.path}`)); + } + if (issues.outdated.length > 0) { + console.log('\nArchives with appended exchanges:'); + issues.outdated.forEach(item => console.log(` ${item.path}`)); + } - if (issues.missing.length + issues.orphaned.length + issues.outdated.length + issues.corrupted.length > 0) { - console.log('\nRun with --repair to fix these issues.'); + if (issues.missing.length + issues.unindexed.length + issues.orphaned.length + issues.outdated.length + issues.corrupted.length > 0) { + console.log('\nReview exact candidates before repair; --repair may regenerate summaries and embeddings.'); process.exit(1); } else { console.log('\n✅ Index is healthy!'); @@ -92,9 +102,13 @@ async function main() { console.log('Verifying conversation index...'); const repairIssues = await verifyIndex(); + if (repairIssues.unindexed.length > 0) { + console.log(`${repairIssues.unindexed.length} unindexed archive(s) require separate review; --repair does not select them by this status alone.`); + process.exitCode = 1; + } if (repairIssues.missing.length + repairIssues.orphaned.length + repairIssues.outdated.length > 0) { await repairIndex(repairIssues); - } else { + } else if (repairIssues.unindexed.length === 0) { console.log('✅ No issues to repair!'); } break; diff --git a/src/verify.ts b/src/verify.ts index 0dd2c5db..0a0a9c3d 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -1,22 +1,26 @@ import fs from 'fs'; import path from 'path'; import { parseConversation } from './parser.js'; -import { initDatabase, getAllExchanges, getFileLastIndexed } from './db.js'; +import { initDatabase, getAllExchanges } from './db.js'; import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { isErroredSentinel } from './summary-sentinel.js'; export interface VerificationResult { missing: Array<{ path: string; reason: string }>; + unindexed: Array<{ path: string }>; orphaned: Array<{ uuid: string; path: string }>; outdated: Array<{ path: string; fileTime: number; dbTime: number }>; + archiveRefreshes: Array<{ path: string; fileTime: number; dbTime: number }>; corrupted: Array<{ path: string; error: string }>; } export async function verifyIndex(): Promise { const result: VerificationResult = { missing: [], + unindexed: [], orphaned: [], outdated: [], + archiveRefreshes: [], corrupted: [] }; @@ -32,6 +36,10 @@ export async function verifyIndex(): Promise { // Initialize database once for all checks const db = initDatabase(); + const indexState = db.prepare(` + SELECT MAX(line_end) AS maxLineEnd, MAX(last_indexed) AS lastIndexed + FROM exchanges WHERE archive_path = ? + `); const projects = fs.readdirSync(archiveDir); const excludedProjects = getExcludedProjects(); @@ -68,29 +76,27 @@ export async function verifyIndex(): Promise { // re-attempts it rather than reporting the conversation as healthy. if (!fs.existsSync(summaryPath)) { result.missing.push({ path: conversationPath, reason: 'No summary file' }); - continue; - } - if (isErroredSentinel(fs.readFileSync(summaryPath, 'utf-8'))) { + } else if (isErroredSentinel(fs.readFileSync(summaryPath, 'utf-8'))) { result.missing.push({ path: conversationPath, reason: 'Previous summarization failed (error sentinel)' }); - continue; } - // Check if file is outdated (modified after last_indexed) - const lastIndexed = getFileLastIndexed(db, conversationPath); - if (lastIndexed !== null) { - const fileStat = fs.statSync(conversationPath); - if (fileStat.mtimeMs > lastIndexed) { - result.outdated.push({ - path: conversationPath, - fileTime: fileStat.mtimeMs, - dbTime: lastIndexed - }); - } - } + const state = indexState.get(conversationPath) as { maxLineEnd: number | null; lastIndexed: number | null }; + const maxLineEnd = state.maxLineEnd; + if (maxLineEnd === null) result.unindexed.push({ path: conversationPath }); - // Try parsing to detect corruption + // Parse independently of summary state and mtime. Only exchanges past + // the indexed high-water mark are a real index delta. try { - await parseConversation(conversationPath, project, conversationPath); + const exchanges = await parseConversation(conversationPath, project, conversationPath); + if (maxLineEnd !== null) { + const fileTime = fs.statSync(conversationPath).mtimeMs; + const dbTime = state.lastIndexed ?? 0; + if (exchanges.some(exchange => exchange.lineEnd > maxLineEnd)) { + result.outdated.push({ path: conversationPath, fileTime, dbTime }); + } else if (state.lastIndexed !== null && fileTime > state.lastIndexed) { + result.archiveRefreshes.push({ path: conversationPath, fileTime, dbTime }); + } + } } catch (error) { result.corrupted.push({ path: conversationPath, @@ -107,7 +113,7 @@ export async function verifyIndex(): Promise { db.close(); for (const exchange of dbExchanges) { - if (!foundFiles.has(exchange.archivePath)) { + if (!foundFiles.has(exchange.archivePath) && !statIfExists(exchange.archivePath)?.isFile()) { result.orphaned.push({ uuid: exchange.id, path: exchange.archivePath @@ -118,7 +124,7 @@ export async function verifyIndex(): Promise { return result; } -export async function repairIndex(issues: VerificationResult): Promise { +export async function repairIndex(issues: Pick): Promise { console.log('Repairing index...'); // To avoid circular dependencies, we import the indexer functions dynamically @@ -137,10 +143,10 @@ export async function repairIndex(issues: VerificationResult): Promise { } // Re-index missing and outdated conversations - const toReindex = [ + const toReindex = [...new Set([ ...issues.missing.map(m => m.path), ...issues.outdated.map(o => o.path) - ]; + ])]; for (const conversationPath of toReindex) { console.log(`Re-indexing: ${conversationPath}`); diff --git a/test/index-cli-single-instance.test.ts b/test/index-cli-single-instance.test.ts index d41203a9..21bf02d3 100644 --- a/test/index-cli-single-instance.test.ts +++ b/test/index-cli-single-instance.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { spawnSync } from 'child_process'; -import { mkdtempSync, mkdirSync, rmSync, existsSync } from 'fs'; +import { mkdtempSync, mkdirSync, rmSync, existsSync, writeFileSync } from 'fs'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import { tmpdir } from 'os'; @@ -87,6 +87,27 @@ describe('index-cli single-instance lock (#97)', () => { expect(existsSync(join(testDir, 'test.db'))).toBe(false); }); + it('reports unindexed archives as actionable without calling them outdated', () => { + const projectDir = join(testDir, 'archive', 'project'); + mkdirSync(projectDir, { recursive: true }); + const archivePath = join(projectDir, 'session.jsonl'); + writeFileSync(archivePath, [ + JSON.stringify({ type: 'user', message: { role: 'user', content: 'Hello' }, timestamp: '2024-01-01T00:00:00Z' }), + JSON.stringify({ type: 'assistant', message: { role: 'assistant', content: 'Hi' }, timestamp: '2024-01-01T00:00:01Z' }), + ].join('\n')); + writeFileSync(archivePath.replace('.jsonl', '-summary.txt'), 'Existing summary'); + + const result = runIndexCli(['verify']); + expect(result.status).toBe(1); + expect(result.stdout).toContain('Unindexed archives: 1'); + expect(result.stdout).toContain(archivePath); + expect(result.stdout).toContain('Outdated files: 0'); + + const repair = runIndexCli(['repair']); + expect(repair.status).toBe(1); + expect(repair.stdout).toContain('unindexed archive(s) require separate review'); + }); + it('releases the lock after an uncontended run', () => { const result = runIndexCli(['verify']); diff --git a/test/verify.test.ts b/test/verify.test.ts index ae70da81..fbb3c272 100644 --- a/test/verify.test.ts +++ b/test/verify.test.ts @@ -6,6 +6,7 @@ import path from 'path'; import os from 'os'; import { initDatabase, insertExchange } from '../src/db.js'; import { ConversationExchange } from '../src/types.js'; +import { summarizeConversation } from '../src/summarizer.js'; vi.mock('../src/embeddings.js', () => ({ initEmbeddings: vi.fn(async () => {}), @@ -156,7 +157,7 @@ describe('verifyIndex', () => { expect(result.orphaned[0].path).toBe(exchange.archivePath); }); - it('detects outdated files (file modified after last_indexed)', async () => { + it('detects appended exchanges beyond the indexed high-water mark', async () => { // Create conversation file with summary const projectArchive = path.join(archiveDir, 'test-project'); fs.mkdirSync(projectArchive, { recursive: true }); @@ -193,15 +194,15 @@ describe('verifyIndex', () => { const lastIndexed = row.last_indexed; db.close(); - // Wait a bit, then modify the file - await new Promise(resolve => setTimeout(resolve, 10)); - - // Update the conversation file + // Append a complete exchange and make the timestamp comparison deterministic. const updatedMessages = [ ...messages, - JSON.stringify({ type: 'user', message: { role: 'user', content: 'New message' }, timestamp: '2024-01-01T00:00:02Z' }) + JSON.stringify({ type: 'user', message: { role: 'user', content: 'New message' }, timestamp: '2024-01-01T00:00:02Z' }), + JSON.stringify({ type: 'assistant', message: { role: 'assistant', content: 'New response' }, timestamp: '2024-01-01T00:00:03Z' }) ]; fs.writeFileSync(conversationPath, updatedMessages.join('\n')); + const future = new Date(lastIndexed + 10_000); + fs.utimesSync(conversationPath, future, future); // Verify detects outdated file const result = await verifyIndex(); @@ -212,6 +213,75 @@ describe('verifyIndex', () => { expect(result.outdated[0].fileTime).toBeGreaterThan(lastIndexed); }); + it('does not call an mtime-only archive refresh an index delta', async () => { + const projectArchive = path.join(archiveDir, 'test-project'); + fs.mkdirSync(projectArchive, { recursive: true }); + const conversationPath = path.join(projectArchive, 'refreshed.jsonl'); + fs.writeFileSync(conversationPath, [ + JSON.stringify({ type: 'user', message: { role: 'user', content: 'Hello' }, timestamp: '2024-01-01T00:00:00Z' }), + JSON.stringify({ type: 'assistant', message: { role: 'assistant', content: 'Hi' }, timestamp: '2024-01-01T00:00:01Z' }) + ].join('\n')); + fs.writeFileSync(conversationPath.replace('.jsonl', '-summary.txt'), 'Existing summary'); + const db = initDatabase(); + insertExchange(db, { id: 'refreshed', project: 'test-project', timestamp: '2024-01-01T00:00:00Z', + userMessage: 'Hello', assistantMessage: 'Hi', archivePath: conversationPath, lineStart: 1, lineEnd: 2 }, new Array(384).fill(0.1)); + db.close(); + const future = new Date(Date.now() + 10_000); + fs.utimesSync(conversationPath, future, future); + + const result = await verifyIndex(); + expect(result.outdated).toEqual([]); + expect(result.archiveRefreshes.map(item => item.path)).toEqual([conversationPath]); + }); + + it('reports a missing summary and an appended exchange independently', async () => { + const projectArchive = path.join(archiveDir, 'test-project'); + fs.mkdirSync(projectArchive, { recursive: true }); + const conversationPath = path.join(projectArchive, 'appended.jsonl'); + const messages = [ + JSON.stringify({ type: 'user', message: { role: 'user', content: 'Hello' }, timestamp: '2024-01-01T00:00:00Z' }), + JSON.stringify({ type: 'assistant', message: { role: 'assistant', content: 'Hi' }, timestamp: '2024-01-01T00:00:01Z' }) + ]; + fs.writeFileSync(conversationPath, messages.join('\n')); + const db = initDatabase(); + insertExchange(db, { id: 'original', project: 'test-project', timestamp: '2024-01-01T00:00:00Z', + userMessage: 'Hello', assistantMessage: 'Hi', archivePath: conversationPath, lineStart: 1, lineEnd: 2 }, new Array(384).fill(0.1)); + const lastIndexed = (db.prepare('SELECT last_indexed FROM exchanges WHERE id = ?').get('original') as { last_indexed: number }).last_indexed; + db.close(); + fs.appendFileSync(conversationPath, '\n' + [ + JSON.stringify({ type: 'user', message: { role: 'user', content: 'Later' }, timestamp: '2024-01-01T00:00:02Z' }), + JSON.stringify({ type: 'assistant', message: { role: 'assistant', content: 'Done' }, timestamp: '2024-01-01T00:00:03Z' }) + ].join('\n')); + const future = new Date(lastIndexed + 10_000); + fs.utimesSync(conversationPath, future, future); + + const result = await verifyIndex(); + expect(result.missing.map(item => item.path)).toEqual([conversationPath]); + expect(result.outdated.map(item => item.path)).toEqual([conversationPath]); + }); + + it('distinguishes an unindexed archive from an indexed external source', async () => { + const projectArchive = path.join(archiveDir, 'test-project'); + fs.mkdirSync(projectArchive, { recursive: true }); + const archivePath = path.join(projectArchive, 'unindexed.jsonl'); + const sourcePath = path.join(testDir, 'active.jsonl'); + const lines = [ + JSON.stringify({ type: 'user', message: { role: 'user', content: 'Hello' }, timestamp: '2024-01-01T00:00:00Z' }), + JSON.stringify({ type: 'assistant', message: { role: 'assistant', content: 'Hi' }, timestamp: '2024-01-01T00:00:01Z' }) + ].join('\n'); + fs.writeFileSync(archivePath, lines); + fs.writeFileSync(archivePath.replace('.jsonl', '-summary.txt'), 'Existing summary'); + fs.writeFileSync(sourcePath, lines); + const db = initDatabase(); + insertExchange(db, { id: 'external', project: 'test-project', timestamp: '2024-01-01T00:00:00Z', + userMessage: 'Hello', assistantMessage: 'Hi', archivePath: sourcePath, lineStart: 1, lineEnd: 2 }, new Array(384).fill(0.1)); + db.close(); + + const result = await verifyIndex(); + expect(result.unindexed.map(item => item.path)).toEqual([archivePath]); + expect(result.orphaned).toEqual([]); + }); + // Note: Parser is resilient to malformed JSON - it skips bad lines // Corruption detection would require file system errors or permission issues // which are harder to test. Skipping for now as missing summaries is the @@ -244,6 +314,25 @@ describe('repairIndex', () => { delete process.env.TEST_DB_PATH; }); + it('repairs a path reported as both missing and outdated only once', async () => { + const projectArchive = path.join(archiveDir, 'test-project'); + fs.mkdirSync(projectArchive, { recursive: true }); + const conversationPath = path.join(projectArchive, 'duplicate.jsonl'); + fs.writeFileSync(conversationPath, [ + JSON.stringify({ type: 'user', message: { role: 'user', content: 'Hello' }, timestamp: '2024-01-01T00:00:00Z' }), + JSON.stringify({ type: 'assistant', message: { role: 'assistant', content: 'Hi' }, timestamp: '2024-01-01T00:00:01Z' }) + ].join('\n')); + vi.mocked(summarizeConversation).mockClear(); + + await repairIndex({ + missing: [{ path: conversationPath, reason: 'No summary file' }], + outdated: [{ path: conversationPath, fileTime: 2, dbTime: 1 }], + orphaned: [], corrupted: [] + }); + + expect(summarizeConversation).toHaveBeenCalledTimes(1); + }); + it('deletes orphaned database entries during repair', async () => { // Initialize database with orphaned entry const db = initDatabase(); From 2e44c81ab2db48c03897e17a6c621c59cd9bb5d4 Mon Sep 17 00:00:00 2001 From: HengYang Date: Sat, 26 Sep 2026 13:13:54 +0800 Subject: [PATCH 02/33] fix(summarizer): keep Codex summaries on Codex route --- README.md | 7 +- dist/mcp-server.js | 6341 ++++++++++++++++++++++++++++++-- dist/summarizer.d.ts | 4 +- dist/summarizer.js | 25 +- docs/CODEX.md | 5 +- src/summarizer.ts | 24 +- test/codex-no-fallback.test.ts | 63 + 7 files changed, 6076 insertions(+), 393 deletions(-) create mode 100644 test/codex-no-fallback.test.ts diff --git a/README.md b/README.md index ee952317..93f169e9 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,7 @@ To route summarization through a custom Anthropic-compatible endpoint or overrid # Override model (default: haiku) export EPISODIC_MEMORY_API_MODEL=opus -# Override fallback model on error (default: sonnet) +# Override the Claude fallback model on error (default: sonnet; not used for Codex) export EPISODIC_MEMORY_API_MODEL_FALLBACK=sonnet # Route through custom endpoint @@ -294,7 +294,10 @@ These pass through unchanged to episodic-memory's summarizer subprocess. Because These settings only affect episodic-memory's summarization calls, not your interactive Claude Code or Codex sessions. -Codex summarization requires `codex-cli 0.130.0` or newer. If Codex app-server summarization is unavailable, sync logs the reason and falls back to transcript-text summarization. +Codex summarization requires `codex-cli 0.130.0` or newer and a session ID for +an ephemeral read-only fork. If that route is unavailable, the summary attempt +fails and can be retried later; it does not silently switch to Claude or a +metered Anthropic API. Indexing exchanges remains independent of the summary. ### What's Affected diff --git a/dist/mcp-server.js b/dist/mcp-server.js index e3a9adac..ca13e73b 100644 --- a/dist/mcp-server.js +++ b/dist/mcp-server.js @@ -29,9 +29,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge mod )); -// node_modules/ajv/dist/compile/codegen/code.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js var require_code = __commonJS({ - "node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; @@ -183,9 +183,9 @@ var require_code = __commonJS({ } }); -// node_modules/ajv/dist/compile/codegen/scope.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js var require_scope = __commonJS({ - "node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; @@ -328,9 +328,9 @@ var require_scope = __commonJS({ } }); -// node_modules/ajv/dist/compile/codegen/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js var require_codegen = __commonJS({ - "node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; @@ -1048,9 +1048,9 @@ var require_codegen = __commonJS({ } }); -// node_modules/ajv/dist/compile/util.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js var require_util = __commonJS({ - "node_modules/ajv/dist/compile/util.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; @@ -1215,9 +1215,9 @@ var require_util = __commonJS({ } }); -// node_modules/ajv/dist/compile/names.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js var require_names = __commonJS({ - "node_modules/ajv/dist/compile/names.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -1254,9 +1254,9 @@ var require_names = __commonJS({ } }); -// node_modules/ajv/dist/compile/errors.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js var require_errors = __commonJS({ - "node_modules/ajv/dist/compile/errors.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; @@ -1376,9 +1376,9 @@ var require_errors = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/boolSchema.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js var require_boolSchema = __commonJS({ - "node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; @@ -1427,9 +1427,9 @@ var require_boolSchema = __commonJS({ } }); -// node_modules/ajv/dist/compile/rules.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js var require_rules = __commonJS({ - "node_modules/ajv/dist/compile/rules.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getRules = exports.isJSONType = void 0; @@ -1458,9 +1458,9 @@ var require_rules = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/applicability.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js var require_applicability = __commonJS({ - "node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; @@ -1481,9 +1481,9 @@ var require_applicability = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/dataType.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js var require_dataType = __commonJS({ - "node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; @@ -1665,9 +1665,9 @@ var require_dataType = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/defaults.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js var require_defaults = __commonJS({ - "node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.assignDefaults = void 0; @@ -1702,9 +1702,9 @@ var require_defaults = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/code.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js var require_code2 = __commonJS({ - "node_modules/ajv/dist/vocabularies/code.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; @@ -1775,13 +1775,13 @@ var require_code2 = __commonJS({ exports.callValidateCode = callValidateCode; var newRegExp = (0, codegen_1._)`new RegExp`; function usePattern({ gen, it: { opts } }, pattern) { - const u3 = opts.unicodeRegExp ? "u" : ""; + const u = opts.unicodeRegExp ? "u" : ""; const { regExp } = opts.code; - const rx = regExp(pattern, u3); + const rx = regExp(pattern, u); return gen.scopeValue("pattern", { key: rx.toString(), ref: rx, - code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u3})` + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` }); } exports.usePattern = usePattern; @@ -1835,9 +1835,9 @@ var require_code2 = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/keyword.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js var require_keyword = __commonJS({ - "node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; @@ -1953,9 +1953,9 @@ var require_keyword = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/subschema.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js var require_subschema = __commonJS({ - "node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; @@ -2159,9 +2159,9 @@ var require_json_schema_traverse = __commonJS({ } }); -// node_modules/ajv/dist/compile/resolve.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js var require_resolve = __commonJS({ - "node_modules/ajv/dist/compile/resolve.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; @@ -2315,9 +2315,9 @@ var require_resolve = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js var require_validate = __commonJS({ - "node_modules/ajv/dist/compile/validate/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; @@ -2823,9 +2823,9 @@ var require_validate = __commonJS({ } }); -// node_modules/ajv/dist/runtime/validation_error.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js var require_validation_error = __commonJS({ - "node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ValidationError = class extends Error { @@ -2839,9 +2839,9 @@ var require_validation_error = __commonJS({ } }); -// node_modules/ajv/dist/compile/ref_error.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js var require_ref_error = __commonJS({ - "node_modules/ajv/dist/compile/ref_error.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var resolve_1 = require_resolve(); @@ -2856,9 +2856,9 @@ var require_ref_error = __commonJS({ } }); -// node_modules/ajv/dist/compile/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js var require_compile = __commonJS({ - "node_modules/ajv/dist/compile/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; @@ -3080,9 +3080,9 @@ var require_compile = __commonJS({ } }); -// node_modules/ajv/dist/refs/data.json +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json var require_data = __commonJS({ - "node_modules/ajv/dist/refs/data.json"(exports, module) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json"(exports, module) { module.exports = { $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", @@ -4217,9 +4217,9 @@ var require_fast_uri = __commonJS({ } }); -// node_modules/ajv/dist/runtime/uri.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js var require_uri = __commonJS({ - "node_modules/ajv/dist/runtime/uri.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var uri = require_fast_uri(); @@ -4228,9 +4228,9 @@ var require_uri = __commonJS({ } }); -// node_modules/ajv/dist/core.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js var require_core = __commonJS({ - "node_modules/ajv/dist/core.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; @@ -4839,9 +4839,9 @@ var require_core = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/core/id.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js var require_id = __commonJS({ - "node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var def = { @@ -4854,9 +4854,9 @@ var require_id = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/core/ref.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js var require_ref = __commonJS({ - "node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.callRef = exports.getValidate = void 0; @@ -4976,9 +4976,9 @@ var require_ref = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/core/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js var require_core2 = __commonJS({ - "node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var id_1 = require_id(); @@ -4997,9 +4997,9 @@ var require_core2 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitNumber.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js var require_limitNumber = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5029,9 +5029,9 @@ var require_limitNumber = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/multipleOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js var require_multipleOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5057,9 +5057,9 @@ var require_multipleOf = __commonJS({ } }); -// node_modules/ajv/dist/runtime/ucs2length.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js var require_ucs2length = __commonJS({ - "node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function ucs2length(str) { @@ -5083,9 +5083,9 @@ var require_ucs2length = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitLength.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js var require_limitLength = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5115,9 +5115,9 @@ var require_limitLength = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/pattern.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js var require_pattern = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5135,12 +5135,12 @@ var require_pattern = __commonJS({ error: error61, code(cxt) { const { gen, data, $data, schema, schemaCode, it } = cxt; - const u3 = it.opts.unicodeRegExp ? "u" : ""; + const u = it.opts.unicodeRegExp ? "u" : ""; if ($data) { const { regExp } = it.opts.code; const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); const valid = gen.let("valid"); - gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u3}).test(${data})`), () => gen.assign(valid, false)); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); cxt.fail$data((0, codegen_1._)`!${valid}`); } else { const regExp = (0, code_1.usePattern)(cxt, schema); @@ -5152,9 +5152,9 @@ var require_pattern = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitProperties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js var require_limitProperties = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5181,9 +5181,9 @@ var require_limitProperties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/required.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js var require_required = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5263,9 +5263,9 @@ var require_required = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js var require_limitItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5292,9 +5292,9 @@ var require_limitItems = __commonJS({ } }); -// node_modules/ajv/dist/runtime/equal.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js var require_equal = __commonJS({ - "node_modules/ajv/dist/runtime/equal.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var equal = require_fast_deep_equal(); @@ -5303,9 +5303,9 @@ var require_equal = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js var require_uniqueItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var dataType_1 = require_dataType(); @@ -5370,9 +5370,9 @@ var require_uniqueItems = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/const.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js var require_const = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5399,9 +5399,9 @@ var require_const = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/enum.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js var require_enum = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5448,9 +5448,9 @@ var require_enum = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js var require_validation = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var limitNumber_1 = require_limitNumber(); @@ -5486,9 +5486,9 @@ var require_validation = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js var require_additionalItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateAdditionalItems = void 0; @@ -5539,9 +5539,9 @@ var require_additionalItems = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/items.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js var require_items = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateTuple = void 0; @@ -5583,10 +5583,10 @@ var require_items = __commonJS({ }); function checkStrictTuple(sch) { const { opts, errSchemaPath } = it; - const l = schArr.length; - const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false); + const l3 = schArr.length; + const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); if (opts.strictTuples && !fullTuple) { - const msg = `"${keyword}" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); } } @@ -5596,9 +5596,9 @@ var require_items = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js var require_prefixItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var items_1 = require_items(); @@ -5613,9 +5613,9 @@ var require_prefixItems = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/items2020.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js var require_items2020 = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5648,9 +5648,9 @@ var require_items2020 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/contains.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js var require_contains = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5742,9 +5742,9 @@ var require_contains = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/dependencies.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js var require_dependencies = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; @@ -5836,9 +5836,9 @@ var require_dependencies = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js var require_propertyNames = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5879,9 +5879,9 @@ var require_propertyNames = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js var require_additionalProperties = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5985,9 +5985,9 @@ var require_additionalProperties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/properties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js var require_properties = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var validate_1 = require_validate(); @@ -6043,9 +6043,9 @@ var require_properties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js var require_patternProperties = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6117,9 +6117,9 @@ var require_patternProperties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/not.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js var require_not = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6148,9 +6148,9 @@ var require_not = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/anyOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js var require_anyOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6165,9 +6165,9 @@ var require_anyOf = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/oneOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js var require_oneOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6223,9 +6223,9 @@ var require_oneOf = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/allOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js var require_allOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6250,9 +6250,9 @@ var require_allOf = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/if.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js var require_if = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6319,9 +6319,9 @@ var require_if = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/thenElse.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js var require_thenElse = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6337,9 +6337,9 @@ var require_thenElse = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js var require_applicator = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var additionalItems_1 = require_additionalItems(); @@ -6385,9 +6385,9 @@ var require_applicator = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/format/format.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js var require_format = __commonJS({ - "node_modules/ajv/dist/vocabularies/format/format.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6475,9 +6475,9 @@ var require_format = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/format/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js var require_format2 = __commonJS({ - "node_modules/ajv/dist/vocabularies/format/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var format_1 = require_format(); @@ -6486,9 +6486,9 @@ var require_format2 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/metadata.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js var require_metadata = __commonJS({ - "node_modules/ajv/dist/vocabularies/metadata.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.contentVocabulary = exports.metadataVocabulary = void 0; @@ -6509,9 +6509,9 @@ var require_metadata = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/draft7.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js var require_draft7 = __commonJS({ - "node_modules/ajv/dist/vocabularies/draft7.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var core_1 = require_core2(); @@ -6531,9 +6531,9 @@ var require_draft7 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/discriminator/types.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js var require_types = __commonJS({ - "node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DiscrError = void 0; @@ -6545,9 +6545,9 @@ var require_types = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/discriminator/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js var require_discriminator = __commonJS({ - "node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6650,9 +6650,9 @@ var require_discriminator = __commonJS({ } }); -// node_modules/ajv/dist/refs/json-schema-draft-07.json +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json var require_json_schema_draft_07 = __commonJS({ - "node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { module.exports = { $schema: "http://json-schema.org/draft-07/schema#", $id: "http://json-schema.org/draft-07/schema#", @@ -6807,9 +6807,9 @@ var require_json_schema_draft_07 = __commonJS({ } }); -// node_modules/ajv/dist/ajv.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js var require_ajv = __commonJS({ - "node_modules/ajv/dist/ajv.js"(exports, module) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js"(exports, module) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; @@ -7080,14 +7080,5621 @@ var require_formats = __commonJS({ } }); +// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js +var require_code3 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; + var _CodeOrName = class { + }; + exports._CodeOrName = _CodeOrName; + exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; + var Name = class extends _CodeOrName { + constructor(s) { + super(); + if (!exports.IDENTIFIER.test(s)) + throw new Error("CodeGen: name must be a valid identifier"); + this.str = s; + } + toString() { + return this.str; + } + emptyStr() { + return false; + } + get names() { + return { [this.str]: 1 }; + } + }; + exports.Name = Name; + var _Code = class extends _CodeOrName { + constructor(code) { + super(); + this._items = typeof code === "string" ? [code] : code; + } + toString() { + return this.str; + } + emptyStr() { + if (this._items.length > 1) + return false; + const item = this._items[0]; + return item === "" || item === '""'; + } + get str() { + var _a3; + return (_a3 = this._str) !== null && _a3 !== void 0 ? _a3 : this._str = this._items.reduce((s, c) => `${s}${c}`, ""); + } + get names() { + var _a3; + return (_a3 = this._names) !== null && _a3 !== void 0 ? _a3 : this._names = this._items.reduce((names, c) => { + if (c instanceof Name) + names[c.str] = (names[c.str] || 0) + 1; + return names; + }, {}); + } + }; + exports._Code = _Code; + exports.nil = new _Code(""); + function _2(strs, ...args) { + const code = [strs[0]]; + let i = 0; + while (i < args.length) { + addCodeArg(code, args[i]); + code.push(strs[++i]); + } + return new _Code(code); + } + exports._ = _2; + var plus = new _Code("+"); + function str(strs, ...args) { + const expr = [safeStringify(strs[0])]; + let i = 0; + while (i < args.length) { + expr.push(plus); + addCodeArg(expr, args[i]); + expr.push(plus, safeStringify(strs[++i])); + } + optimize(expr); + return new _Code(expr); + } + exports.str = str; + function addCodeArg(code, arg) { + if (arg instanceof _Code) + code.push(...arg._items); + else if (arg instanceof Name) + code.push(arg); + else + code.push(interpolate(arg)); + } + exports.addCodeArg = addCodeArg; + function optimize(expr) { + let i = 1; + while (i < expr.length - 1) { + if (expr[i] === plus) { + const res = mergeExprItems(expr[i - 1], expr[i + 1]); + if (res !== void 0) { + expr.splice(i - 1, 3, res); + continue; + } + expr[i++] = "+"; + } + i++; + } + } + function mergeExprItems(a, b2) { + if (b2 === '""') + return a; + if (a === '""') + return b2; + if (typeof a == "string") { + if (b2 instanceof Name || a[a.length - 1] !== '"') + return; + if (typeof b2 != "string") + return `${a.slice(0, -1)}${b2}"`; + if (b2[0] === '"') + return a.slice(0, -1) + b2.slice(1); + return; + } + if (typeof b2 == "string" && b2[0] === '"' && !(a instanceof Name)) + return `"${a}${b2.slice(1)}`; + return; + } + function strConcat(c1, c2) { + return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str`${c1}${c2}`; + } + exports.strConcat = strConcat; + function interpolate(x2) { + return typeof x2 == "number" || typeof x2 == "boolean" || x2 === null ? x2 : safeStringify(Array.isArray(x2) ? x2.join(",") : x2); + } + function stringify(x2) { + return new _Code(safeStringify(x2)); + } + exports.stringify = stringify; + function safeStringify(x2) { + return JSON.stringify(x2).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); + } + exports.safeStringify = safeStringify; + function getProperty(key) { + return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _2`[${key}]`; + } + exports.getProperty = getProperty; + function getEsmExportName(key) { + if (typeof key == "string" && exports.IDENTIFIER.test(key)) { + return new _Code(`${key}`); + } + throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`); + } + exports.getEsmExportName = getEsmExportName; + function regexpCode(rx) { + return new _Code(rx.toString()); + } + exports.regexpCode = regexpCode; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js +var require_scope2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; + var code_1 = require_code3(); + var ValueError = class extends Error { + constructor(name) { + super(`CodeGen: "code" for ${name} not defined`); + this.value = name.value; + } + }; + var UsedValueState; + (function(UsedValueState2) { + UsedValueState2[UsedValueState2["Started"] = 0] = "Started"; + UsedValueState2[UsedValueState2["Completed"] = 1] = "Completed"; + })(UsedValueState || (exports.UsedValueState = UsedValueState = {})); + exports.varKinds = { + const: new code_1.Name("const"), + let: new code_1.Name("let"), + var: new code_1.Name("var") + }; + var Scope = class { + constructor({ prefixes, parent } = {}) { + this._names = {}; + this._prefixes = prefixes; + this._parent = parent; + } + toName(nameOrPrefix) { + return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix); + } + name(prefix) { + return new code_1.Name(this._newName(prefix)); + } + _newName(prefix) { + const ng = this._names[prefix] || this._nameGroup(prefix); + return `${prefix}${ng.index++}`; + } + _nameGroup(prefix) { + var _a3, _b; + if (((_b = (_a3 = this._parent) === null || _a3 === void 0 ? void 0 : _a3._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || this._prefixes && !this._prefixes.has(prefix)) { + throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`); + } + return this._names[prefix] = { prefix, index: 0 }; + } + }; + exports.Scope = Scope; + var ValueScopeName = class extends code_1.Name { + constructor(prefix, nameStr) { + super(nameStr); + this.prefix = prefix; + } + setValue(value, { property, itemIndex }) { + this.value = value; + this.scopePath = (0, code_1._)`.${new code_1.Name(property)}[${itemIndex}]`; + } + }; + exports.ValueScopeName = ValueScopeName; + var line = (0, code_1._)`\n`; + var ValueScope = class extends Scope { + constructor(opts) { + super(opts); + this._values = {}; + this._scope = opts.scope; + this.opts = { ...opts, _n: opts.lines ? line : code_1.nil }; + } + get() { + return this._scope; + } + name(prefix) { + return new ValueScopeName(prefix, this._newName(prefix)); + } + value(nameOrPrefix, value) { + var _a3; + if (value.ref === void 0) + throw new Error("CodeGen: ref must be passed in value"); + const name = this.toName(nameOrPrefix); + const { prefix } = name; + const valueKey = (_a3 = value.key) !== null && _a3 !== void 0 ? _a3 : value.ref; + let vs = this._values[prefix]; + if (vs) { + const _name = vs.get(valueKey); + if (_name) + return _name; + } else { + vs = this._values[prefix] = /* @__PURE__ */ new Map(); + } + vs.set(valueKey, name); + const s = this._scope[prefix] || (this._scope[prefix] = []); + const itemIndex = s.length; + s[itemIndex] = value.ref; + name.setValue(value, { property: prefix, itemIndex }); + return name; + } + getValue(prefix, keyOrRef) { + const vs = this._values[prefix]; + if (!vs) + return; + return vs.get(keyOrRef); + } + scopeRefs(scopeName, values = this._values) { + return this._reduceValues(values, (name) => { + if (name.scopePath === void 0) + throw new Error(`CodeGen: name "${name}" has no value`); + return (0, code_1._)`${scopeName}${name.scopePath}`; + }); + } + scopeCode(values = this._values, usedValues, getCode) { + return this._reduceValues(values, (name) => { + if (name.value === void 0) + throw new Error(`CodeGen: name "${name}" has no value`); + return name.value.code; + }, usedValues, getCode); + } + _reduceValues(values, valueCode, usedValues = {}, getCode) { + let code = code_1.nil; + for (const prefix in values) { + const vs = values[prefix]; + if (!vs) + continue; + const nameSet = usedValues[prefix] = usedValues[prefix] || /* @__PURE__ */ new Map(); + vs.forEach((name) => { + if (nameSet.has(name)) + return; + nameSet.set(name, UsedValueState.Started); + let c = valueCode(name); + if (c) { + const def = this.opts.es5 ? exports.varKinds.var : exports.varKinds.const; + code = (0, code_1._)`${code}${def} ${name} = ${c};${this.opts._n}`; + } else if (c = getCode === null || getCode === void 0 ? void 0 : getCode(name)) { + code = (0, code_1._)`${code}${c}${this.opts._n}`; + } else { + throw new ValueError(name); + } + nameSet.set(name, UsedValueState.Completed); + }); + } + return code; + } + }; + exports.ValueScope = ValueScope; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js +var require_codegen2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; + var code_1 = require_code3(); + var scope_1 = require_scope2(); + var code_2 = require_code3(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return code_2._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return code_2.str; + } }); + Object.defineProperty(exports, "strConcat", { enumerable: true, get: function() { + return code_2.strConcat; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return code_2.nil; + } }); + Object.defineProperty(exports, "getProperty", { enumerable: true, get: function() { + return code_2.getProperty; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return code_2.stringify; + } }); + Object.defineProperty(exports, "regexpCode", { enumerable: true, get: function() { + return code_2.regexpCode; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return code_2.Name; + } }); + var scope_2 = require_scope2(); + Object.defineProperty(exports, "Scope", { enumerable: true, get: function() { + return scope_2.Scope; + } }); + Object.defineProperty(exports, "ValueScope", { enumerable: true, get: function() { + return scope_2.ValueScope; + } }); + Object.defineProperty(exports, "ValueScopeName", { enumerable: true, get: function() { + return scope_2.ValueScopeName; + } }); + Object.defineProperty(exports, "varKinds", { enumerable: true, get: function() { + return scope_2.varKinds; + } }); + exports.operators = { + GT: new code_1._Code(">"), + GTE: new code_1._Code(">="), + LT: new code_1._Code("<"), + LTE: new code_1._Code("<="), + EQ: new code_1._Code("==="), + NEQ: new code_1._Code("!=="), + NOT: new code_1._Code("!"), + OR: new code_1._Code("||"), + AND: new code_1._Code("&&"), + ADD: new code_1._Code("+") + }; + var Node = class { + optimizeNodes() { + return this; + } + optimizeNames(_names, _constants) { + return this; + } + }; + var Def = class extends Node { + constructor(varKind, name, rhs) { + super(); + this.varKind = varKind; + this.name = name; + this.rhs = rhs; + } + render({ es5, _n }) { + const varKind = es5 ? scope_1.varKinds.var : this.varKind; + const rhs = this.rhs === void 0 ? "" : ` = ${this.rhs}`; + return `${varKind} ${this.name}${rhs};` + _n; + } + optimizeNames(names, constants) { + if (!names[this.name.str]) + return; + if (this.rhs) + this.rhs = optimizeExpr(this.rhs, names, constants); + return this; + } + get names() { + return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {}; + } + }; + var Assign = class extends Node { + constructor(lhs, rhs, sideEffects) { + super(); + this.lhs = lhs; + this.rhs = rhs; + this.sideEffects = sideEffects; + } + render({ _n }) { + return `${this.lhs} = ${this.rhs};` + _n; + } + optimizeNames(names, constants) { + if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects) + return; + this.rhs = optimizeExpr(this.rhs, names, constants); + return this; + } + get names() { + const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names }; + return addExprNames(names, this.rhs); + } + }; + var AssignOp = class extends Assign { + constructor(lhs, op, rhs, sideEffects) { + super(lhs, rhs, sideEffects); + this.op = op; + } + render({ _n }) { + return `${this.lhs} ${this.op}= ${this.rhs};` + _n; + } + }; + var Label = class extends Node { + constructor(label) { + super(); + this.label = label; + this.names = {}; + } + render({ _n }) { + return `${this.label}:` + _n; + } + }; + var Break = class extends Node { + constructor(label) { + super(); + this.label = label; + this.names = {}; + } + render({ _n }) { + const label = this.label ? ` ${this.label}` : ""; + return `break${label};` + _n; + } + }; + var Throw = class extends Node { + constructor(error61) { + super(); + this.error = error61; + } + render({ _n }) { + return `throw ${this.error};` + _n; + } + get names() { + return this.error.names; + } + }; + var AnyCode = class extends Node { + constructor(code) { + super(); + this.code = code; + } + render({ _n }) { + return `${this.code};` + _n; + } + optimizeNodes() { + return `${this.code}` ? this : void 0; + } + optimizeNames(names, constants) { + this.code = optimizeExpr(this.code, names, constants); + return this; + } + get names() { + return this.code instanceof code_1._CodeOrName ? this.code.names : {}; + } + }; + var ParentNode = class extends Node { + constructor(nodes = []) { + super(); + this.nodes = nodes; + } + render(opts) { + return this.nodes.reduce((code, n) => code + n.render(opts), ""); + } + optimizeNodes() { + const { nodes } = this; + let i = nodes.length; + while (i--) { + const n = nodes[i].optimizeNodes(); + if (Array.isArray(n)) + nodes.splice(i, 1, ...n); + else if (n) + nodes[i] = n; + else + nodes.splice(i, 1); + } + return nodes.length > 0 ? this : void 0; + } + optimizeNames(names, constants) { + const { nodes } = this; + let i = nodes.length; + while (i--) { + const n = nodes[i]; + if (n.optimizeNames(names, constants)) + continue; + subtractNames(names, n.names); + nodes.splice(i, 1); + } + return nodes.length > 0 ? this : void 0; + } + get names() { + return this.nodes.reduce((names, n) => addNames(names, n.names), {}); + } + }; + var BlockNode = class extends ParentNode { + render(opts) { + return "{" + opts._n + super.render(opts) + "}" + opts._n; + } + }; + var Root = class extends ParentNode { + }; + var Else = class extends BlockNode { + }; + Else.kind = "else"; + var If = class _If extends BlockNode { + constructor(condition, nodes) { + super(nodes); + this.condition = condition; + } + render(opts) { + let code = `if(${this.condition})` + super.render(opts); + if (this.else) + code += "else " + this.else.render(opts); + return code; + } + optimizeNodes() { + super.optimizeNodes(); + const cond = this.condition; + if (cond === true) + return this.nodes; + let e = this.else; + if (e) { + const ns = e.optimizeNodes(); + e = this.else = Array.isArray(ns) ? new Else(ns) : ns; + } + if (e) { + if (cond === false) + return e instanceof _If ? e : e.nodes; + if (this.nodes.length) + return this; + return new _If(not(cond), e instanceof _If ? [e] : e.nodes); + } + if (cond === false || !this.nodes.length) + return void 0; + return this; + } + optimizeNames(names, constants) { + var _a3; + this.else = (_a3 = this.else) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); + if (!(super.optimizeNames(names, constants) || this.else)) + return; + this.condition = optimizeExpr(this.condition, names, constants); + return this; + } + get names() { + const names = super.names; + addExprNames(names, this.condition); + if (this.else) + addNames(names, this.else.names); + return names; + } + }; + If.kind = "if"; + var For = class extends BlockNode { + }; + For.kind = "for"; + var ForLoop = class extends For { + constructor(iteration) { + super(); + this.iteration = iteration; + } + render(opts) { + return `for(${this.iteration})` + super.render(opts); + } + optimizeNames(names, constants) { + if (!super.optimizeNames(names, constants)) + return; + this.iteration = optimizeExpr(this.iteration, names, constants); + return this; + } + get names() { + return addNames(super.names, this.iteration.names); + } + }; + var ForRange = class extends For { + constructor(varKind, name, from, to) { + super(); + this.varKind = varKind; + this.name = name; + this.from = from; + this.to = to; + } + render(opts) { + const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind; + const { name, from, to } = this; + return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts); + } + get names() { + const names = addExprNames(super.names, this.from); + return addExprNames(names, this.to); + } + }; + var ForIter = class extends For { + constructor(loop, varKind, name, iterable) { + super(); + this.loop = loop; + this.varKind = varKind; + this.name = name; + this.iterable = iterable; + } + render(opts) { + return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts); + } + optimizeNames(names, constants) { + if (!super.optimizeNames(names, constants)) + return; + this.iterable = optimizeExpr(this.iterable, names, constants); + return this; + } + get names() { + return addNames(super.names, this.iterable.names); + } + }; + var Func = class extends BlockNode { + constructor(name, args, async) { + super(); + this.name = name; + this.args = args; + this.async = async; + } + render(opts) { + const _async = this.async ? "async " : ""; + return `${_async}function ${this.name}(${this.args})` + super.render(opts); + } + }; + Func.kind = "func"; + var Return = class extends ParentNode { + render(opts) { + return "return " + super.render(opts); + } + }; + Return.kind = "return"; + var Try = class extends BlockNode { + render(opts) { + let code = "try" + super.render(opts); + if (this.catch) + code += this.catch.render(opts); + if (this.finally) + code += this.finally.render(opts); + return code; + } + optimizeNodes() { + var _a3, _b; + super.optimizeNodes(); + (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNodes(); + (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes(); + return this; + } + optimizeNames(names, constants) { + var _a3, _b; + super.optimizeNames(names, constants); + (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); + (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants); + return this; + } + get names() { + const names = super.names; + if (this.catch) + addNames(names, this.catch.names); + if (this.finally) + addNames(names, this.finally.names); + return names; + } + }; + var Catch = class extends BlockNode { + constructor(error61) { + super(); + this.error = error61; + } + render(opts) { + return `catch(${this.error})` + super.render(opts); + } + }; + Catch.kind = "catch"; + var Finally = class extends BlockNode { + render(opts) { + return "finally" + super.render(opts); + } + }; + Finally.kind = "finally"; + var CodeGen = class { + constructor(extScope, opts = {}) { + this._values = {}; + this._blockStarts = []; + this._constants = {}; + this.opts = { ...opts, _n: opts.lines ? "\n" : "" }; + this._extScope = extScope; + this._scope = new scope_1.Scope({ parent: extScope }); + this._nodes = [new Root()]; + } + toString() { + return this._root.render(this.opts); + } + // returns unique name in the internal scope + name(prefix) { + return this._scope.name(prefix); + } + // reserves unique name in the external scope + scopeName(prefix) { + return this._extScope.name(prefix); + } + // reserves unique name in the external scope and assigns value to it + scopeValue(prefixOrName, value) { + const name = this._extScope.value(prefixOrName, value); + const vs = this._values[name.prefix] || (this._values[name.prefix] = /* @__PURE__ */ new Set()); + vs.add(name); + return name; + } + getScopeValue(prefix, keyOrRef) { + return this._extScope.getValue(prefix, keyOrRef); + } + // return code that assigns values in the external scope to the names that are used internally + // (same names that were returned by gen.scopeName or gen.scopeValue) + scopeRefs(scopeName) { + return this._extScope.scopeRefs(scopeName, this._values); + } + scopeCode() { + return this._extScope.scopeCode(this._values); + } + _def(varKind, nameOrPrefix, rhs, constant) { + const name = this._scope.toName(nameOrPrefix); + if (rhs !== void 0 && constant) + this._constants[name.str] = rhs; + this._leafNode(new Def(varKind, name, rhs)); + return name; + } + // `const` declaration (`var` in es5 mode) + const(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant); + } + // `let` declaration with optional assignment (`var` in es5 mode) + let(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant); + } + // `var` declaration with optional assignment + var(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant); + } + // assignment code + assign(lhs, rhs, sideEffects) { + return this._leafNode(new Assign(lhs, rhs, sideEffects)); + } + // `+=` code + add(lhs, rhs) { + return this._leafNode(new AssignOp(lhs, exports.operators.ADD, rhs)); + } + // appends passed SafeExpr to code or executes Block + code(c) { + if (typeof c == "function") + c(); + else if (c !== code_1.nil) + this._leafNode(new AnyCode(c)); + return this; + } + // returns code for object literal for the passed argument list of key-value pairs + object(...keyValues) { + const code = ["{"]; + for (const [key, value] of keyValues) { + if (code.length > 1) + code.push(","); + code.push(key); + if (key !== value || this.opts.es5) { + code.push(":"); + (0, code_1.addCodeArg)(code, value); + } + } + code.push("}"); + return new code_1._Code(code); + } + // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed) + if(condition, thenBody, elseBody) { + this._blockNode(new If(condition)); + if (thenBody && elseBody) { + this.code(thenBody).else().code(elseBody).endIf(); + } else if (thenBody) { + this.code(thenBody).endIf(); + } else if (elseBody) { + throw new Error('CodeGen: "else" body without "then" body'); + } + return this; + } + // `else if` clause - invalid without `if` or after `else` clauses + elseIf(condition) { + return this._elseNode(new If(condition)); + } + // `else` clause - only valid after `if` or `else if` clauses + else() { + return this._elseNode(new Else()); + } + // end `if` statement (needed if gen.if was used only with condition) + endIf() { + return this._endBlockNode(If, Else); + } + _for(node2, forBody) { + this._blockNode(node2); + if (forBody) + this.code(forBody).endFor(); + return this; + } + // a generic `for` clause (or statement if `forBody` is passed) + for(iteration, forBody) { + return this._for(new ForLoop(iteration), forBody); + } + // `for` statement for a range of values + forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) { + const name = this._scope.toName(nameOrPrefix); + return this._for(new ForRange(varKind, name, from, to), () => forBody(name)); + } + // `for-of` statement (in es5 mode replace with a normal for loop) + forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) { + const name = this._scope.toName(nameOrPrefix); + if (this.opts.es5) { + const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable); + return this.forRange("_i", 0, (0, code_1._)`${arr}.length`, (i) => { + this.var(name, (0, code_1._)`${arr}[${i}]`); + forBody(name); + }); + } + return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name)); + } + // `for-in` statement. + // With option `ownProperties` replaced with a `for-of` loop for object keys + forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) { + if (this.opts.ownProperties) { + return this.forOf(nameOrPrefix, (0, code_1._)`Object.keys(${obj})`, forBody); + } + const name = this._scope.toName(nameOrPrefix); + return this._for(new ForIter("in", varKind, name, obj), () => forBody(name)); + } + // end `for` loop + endFor() { + return this._endBlockNode(For); + } + // `label` statement + label(label) { + return this._leafNode(new Label(label)); + } + // `break` statement + break(label) { + return this._leafNode(new Break(label)); + } + // `return` statement + return(value) { + const node2 = new Return(); + this._blockNode(node2); + this.code(value); + if (node2.nodes.length !== 1) + throw new Error('CodeGen: "return" should have one node'); + return this._endBlockNode(Return); + } + // `try` statement + try(tryBody, catchCode, finallyCode) { + if (!catchCode && !finallyCode) + throw new Error('CodeGen: "try" without "catch" and "finally"'); + const node2 = new Try(); + this._blockNode(node2); + this.code(tryBody); + if (catchCode) { + const error61 = this.name("e"); + this._currNode = node2.catch = new Catch(error61); + catchCode(error61); + } + if (finallyCode) { + this._currNode = node2.finally = new Finally(); + this.code(finallyCode); + } + return this._endBlockNode(Catch, Finally); + } + // `throw` statement + throw(error61) { + return this._leafNode(new Throw(error61)); + } + // start self-balancing block + block(body, nodeCount) { + this._blockStarts.push(this._nodes.length); + if (body) + this.code(body).endBlock(nodeCount); + return this; + } + // end the current self-balancing block + endBlock(nodeCount) { + const len = this._blockStarts.pop(); + if (len === void 0) + throw new Error("CodeGen: not in self-balancing block"); + const toClose = this._nodes.length - len; + if (toClose < 0 || nodeCount !== void 0 && toClose !== nodeCount) { + throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`); + } + this._nodes.length = len; + return this; + } + // `function` heading (or definition if funcBody is passed) + func(name, args = code_1.nil, async, funcBody) { + this._blockNode(new Func(name, args, async)); + if (funcBody) + this.code(funcBody).endFunc(); + return this; + } + // end function definition + endFunc() { + return this._endBlockNode(Func); + } + optimize(n = 1) { + while (n-- > 0) { + this._root.optimizeNodes(); + this._root.optimizeNames(this._root.names, this._constants); + } + } + _leafNode(node2) { + this._currNode.nodes.push(node2); + return this; + } + _blockNode(node2) { + this._currNode.nodes.push(node2); + this._nodes.push(node2); + } + _endBlockNode(N1, N2) { + const n = this._currNode; + if (n instanceof N1 || N2 && n instanceof N2) { + this._nodes.pop(); + return this; + } + throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`); + } + _elseNode(node2) { + const n = this._currNode; + if (!(n instanceof If)) { + throw new Error('CodeGen: "else" without "if"'); + } + this._currNode = n.else = node2; + return this; + } + get _root() { + return this._nodes[0]; + } + get _currNode() { + const ns = this._nodes; + return ns[ns.length - 1]; + } + set _currNode(node2) { + const ns = this._nodes; + ns[ns.length - 1] = node2; + } + }; + exports.CodeGen = CodeGen; + function addNames(names, from) { + for (const n in from) + names[n] = (names[n] || 0) + (from[n] || 0); + return names; + } + function addExprNames(names, from) { + return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names; + } + function optimizeExpr(expr, names, constants) { + if (expr instanceof code_1.Name) + return replaceName(expr); + if (!canOptimize(expr)) + return expr; + return new code_1._Code(expr._items.reduce((items, c) => { + if (c instanceof code_1.Name) + c = replaceName(c); + if (c instanceof code_1._Code) + items.push(...c._items); + else + items.push(c); + return items; + }, [])); + function replaceName(n) { + const c = constants[n.str]; + if (c === void 0 || names[n.str] !== 1) + return n; + delete names[n.str]; + return c; + } + function canOptimize(e) { + return e instanceof code_1._Code && e._items.some((c) => c instanceof code_1.Name && names[c.str] === 1 && constants[c.str] !== void 0); + } + } + function subtractNames(names, from) { + for (const n in from) + names[n] = (names[n] || 0) - (from[n] || 0); + } + function not(x2) { + return typeof x2 == "boolean" || typeof x2 == "number" || x2 === null ? !x2 : (0, code_1._)`!${par(x2)}`; + } + exports.not = not; + var andCode = mappend(exports.operators.AND); + function and(...args) { + return args.reduce(andCode); + } + exports.and = and; + var orCode = mappend(exports.operators.OR); + function or(...args) { + return args.reduce(orCode); + } + exports.or = or; + function mappend(op) { + return (x2, y2) => x2 === code_1.nil ? y2 : y2 === code_1.nil ? x2 : (0, code_1._)`${par(x2)} ${op} ${par(y2)}`; + } + function par(x2) { + return x2 instanceof code_1.Name ? x2 : (0, code_1._)`(${x2})`; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js +var require_util2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; + var codegen_1 = require_codegen2(); + var code_1 = require_code3(); + function toHash(arr) { + const hash2 = {}; + for (const item of arr) + hash2[item] = true; + return hash2; + } + exports.toHash = toHash; + function alwaysValidSchema(it, schema) { + if (typeof schema == "boolean") + return schema; + if (Object.keys(schema).length === 0) + return true; + checkUnknownRules(it, schema); + return !schemaHasRules(schema, it.self.RULES.all); + } + exports.alwaysValidSchema = alwaysValidSchema; + function checkUnknownRules(it, schema = it.schema) { + const { opts, self } = it; + if (!opts.strictSchema) + return; + if (typeof schema === "boolean") + return; + const rules = self.RULES.keywords; + for (const key in schema) { + if (!rules[key]) + checkStrictMode(it, `unknown keyword: "${key}"`); + } + } + exports.checkUnknownRules = checkUnknownRules; + function schemaHasRules(schema, rules) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (rules[key]) + return true; + return false; + } + exports.schemaHasRules = schemaHasRules; + function schemaHasRulesButRef(schema, RULES) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (key !== "$ref" && RULES.all[key]) + return true; + return false; + } + exports.schemaHasRulesButRef = schemaHasRulesButRef; + function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) { + if (!$data) { + if (typeof schema == "number" || typeof schema == "boolean") + return schema; + if (typeof schema == "string") + return (0, codegen_1._)`${schema}`; + } + return (0, codegen_1._)`${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`; + } + exports.schemaRefOrVal = schemaRefOrVal; + function unescapeFragment(str) { + return unescapeJsonPointer(decodeURIComponent(str)); + } + exports.unescapeFragment = unescapeFragment; + function escapeFragment(str) { + return encodeURIComponent(escapeJsonPointer(str)); + } + exports.escapeFragment = escapeFragment; + function escapeJsonPointer(str) { + if (typeof str == "number") + return `${str}`; + return str.replace(/~/g, "~0").replace(/\//g, "~1"); + } + exports.escapeJsonPointer = escapeJsonPointer; + function unescapeJsonPointer(str) { + return str.replace(/~1/g, "/").replace(/~0/g, "~"); + } + exports.unescapeJsonPointer = unescapeJsonPointer; + function eachItem(xs, f) { + if (Array.isArray(xs)) { + for (const x2 of xs) + f(x2); + } else { + f(xs); + } + } + exports.eachItem = eachItem; + function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues: mergeValues2, resultToName }) { + return (gen, from, to, toName) => { + const res = to === void 0 ? from : to instanceof codegen_1.Name ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to) : from instanceof codegen_1.Name ? (mergeToName(gen, to, from), from) : mergeValues2(from, to); + return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res; + }; + } + exports.mergeEvaluated = { + props: makeMergeEvaluated({ + mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => { + gen.if((0, codegen_1._)`${from} === true`, () => gen.assign(to, true), () => gen.assign(to, (0, codegen_1._)`${to} || {}`).code((0, codegen_1._)`Object.assign(${to}, ${from})`)); + }), + mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => { + if (from === true) { + gen.assign(to, true); + } else { + gen.assign(to, (0, codegen_1._)`${to} || {}`); + setEvaluated(gen, to, from); + } + }), + mergeValues: (from, to) => from === true ? true : { ...from, ...to }, + resultToName: evaluatedPropsToName + }), + items: makeMergeEvaluated({ + mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => gen.assign(to, (0, codegen_1._)`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)), + mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => gen.assign(to, from === true ? true : (0, codegen_1._)`${to} > ${from} ? ${to} : ${from}`)), + mergeValues: (from, to) => from === true ? true : Math.max(from, to), + resultToName: (gen, items) => gen.var("items", items) + }) + }; + function evaluatedPropsToName(gen, ps) { + if (ps === true) + return gen.var("props", true); + const props = gen.var("props", (0, codegen_1._)`{}`); + if (ps !== void 0) + setEvaluated(gen, props, ps); + return props; + } + exports.evaluatedPropsToName = evaluatedPropsToName; + function setEvaluated(gen, props, ps) { + Object.keys(ps).forEach((p) => gen.assign((0, codegen_1._)`${props}${(0, codegen_1.getProperty)(p)}`, true)); + } + exports.setEvaluated = setEvaluated; + var snippets = {}; + function useFunc(gen, f) { + return gen.scopeValue("func", { + ref: f, + code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code)) + }); + } + exports.useFunc = useFunc; + var Type; + (function(Type2) { + Type2[Type2["Num"] = 0] = "Num"; + Type2[Type2["Str"] = 1] = "Str"; + })(Type || (exports.Type = Type = {})); + function getErrorPath(dataProp, dataPropType, jsPropertySyntax) { + if (dataProp instanceof codegen_1.Name) { + const isNumber = dataPropType === Type.Num; + return jsPropertySyntax ? isNumber ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`; + } + return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp); + } + exports.getErrorPath = getErrorPath; + function checkStrictMode(it, msg, mode = it.opts.strictSchema) { + if (!mode) + return; + msg = `strict mode: ${msg}`; + if (mode === true) + throw new Error(msg); + it.self.logger.warn(msg); + } + exports.checkStrictMode = checkStrictMode; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js +var require_names2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var names = { + // validation function arguments + data: new codegen_1.Name("data"), + // data passed to validation function + // args passed from referencing schema + valCxt: new codegen_1.Name("valCxt"), + // validation/data context - should not be used directly, it is destructured to the names below + instancePath: new codegen_1.Name("instancePath"), + parentData: new codegen_1.Name("parentData"), + parentDataProperty: new codegen_1.Name("parentDataProperty"), + rootData: new codegen_1.Name("rootData"), + // root data - same as the data passed to the first/top validation function + dynamicAnchors: new codegen_1.Name("dynamicAnchors"), + // used to support recursiveRef and dynamicRef + // function scoped variables + vErrors: new codegen_1.Name("vErrors"), + // null or array of validation errors + errors: new codegen_1.Name("errors"), + // counter of validation errors + this: new codegen_1.Name("this"), + // "globals" + self: new codegen_1.Name("self"), + scope: new codegen_1.Name("scope"), + // JTD serialize/parse name for JSON string and position + json: new codegen_1.Name("json"), + jsonPos: new codegen_1.Name("jsonPos"), + jsonLen: new codegen_1.Name("jsonLen"), + jsonPart: new codegen_1.Name("jsonPart") + }; + exports.default = names; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js +var require_errors2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var names_1 = require_names2(); + exports.keywordError = { + message: ({ keyword }) => (0, codegen_1.str)`must pass "${keyword}" keyword validation` + }; + exports.keyword$DataError = { + message: ({ keyword, schemaType }) => schemaType ? (0, codegen_1.str)`"${keyword}" keyword must be ${schemaType} ($data)` : (0, codegen_1.str)`"${keyword}" keyword is invalid ($data)` + }; + function reportError(cxt, error61 = exports.keywordError, errorPaths, overrideAllErrors) { + const { it } = cxt; + const { gen, compositeRule, allErrors } = it; + const errObj = errorObjectCode(cxt, error61, errorPaths); + if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : compositeRule || allErrors) { + addError(gen, errObj); + } else { + returnErrors(it, (0, codegen_1._)`[${errObj}]`); + } + } + exports.reportError = reportError; + function reportExtraError(cxt, error61 = exports.keywordError, errorPaths) { + const { it } = cxt; + const { gen, compositeRule, allErrors } = it; + const errObj = errorObjectCode(cxt, error61, errorPaths); + addError(gen, errObj); + if (!(compositeRule || allErrors)) { + returnErrors(it, names_1.default.vErrors); + } + } + exports.reportExtraError = reportExtraError; + function resetErrorsCount(gen, errsCount) { + gen.assign(names_1.default.errors, errsCount); + gen.if((0, codegen_1._)`${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign((0, codegen_1._)`${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null))); + } + exports.resetErrorsCount = resetErrorsCount; + function extendErrors({ gen, keyword, schemaValue, data, errsCount, it }) { + if (errsCount === void 0) + throw new Error("ajv implementation error"); + const err = gen.name("err"); + gen.forRange("i", errsCount, names_1.default.errors, (i) => { + gen.const(err, (0, codegen_1._)`${names_1.default.vErrors}[${i}]`); + gen.if((0, codegen_1._)`${err}.instancePath === undefined`, () => gen.assign((0, codegen_1._)`${err}.instancePath`, (0, codegen_1.strConcat)(names_1.default.instancePath, it.errorPath))); + gen.assign((0, codegen_1._)`${err}.schemaPath`, (0, codegen_1.str)`${it.errSchemaPath}/${keyword}`); + if (it.opts.verbose) { + gen.assign((0, codegen_1._)`${err}.schema`, schemaValue); + gen.assign((0, codegen_1._)`${err}.data`, data); + } + }); + } + exports.extendErrors = extendErrors; + function addError(gen, errObj) { + const err = gen.const("err", errObj); + gen.if((0, codegen_1._)`${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, (0, codegen_1._)`[${err}]`), (0, codegen_1._)`${names_1.default.vErrors}.push(${err})`); + gen.code((0, codegen_1._)`${names_1.default.errors}++`); + } + function returnErrors(it, errs) { + const { gen, validateName, schemaEnv } = it; + if (schemaEnv.$async) { + gen.throw((0, codegen_1._)`new ${it.ValidationError}(${errs})`); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, errs); + gen.return(false); + } + } + var E2 = { + keyword: new codegen_1.Name("keyword"), + schemaPath: new codegen_1.Name("schemaPath"), + // also used in JTD errors + params: new codegen_1.Name("params"), + propertyName: new codegen_1.Name("propertyName"), + message: new codegen_1.Name("message"), + schema: new codegen_1.Name("schema"), + parentSchema: new codegen_1.Name("parentSchema") + }; + function errorObjectCode(cxt, error61, errorPaths) { + const { createErrors } = cxt.it; + if (createErrors === false) + return (0, codegen_1._)`{}`; + return errorObject(cxt, error61, errorPaths); + } + function errorObject(cxt, error61, errorPaths = {}) { + const { gen, it } = cxt; + const keyValues = [ + errorInstancePath(it, errorPaths), + errorSchemaPath(cxt, errorPaths) + ]; + extraErrorProps(cxt, error61, keyValues); + return gen.object(...keyValues); + } + function errorInstancePath({ errorPath }, { instancePath }) { + const instPath = instancePath ? (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(instancePath, util_1.Type.Str)}` : errorPath; + return [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, instPath)]; + } + function errorSchemaPath({ keyword, it: { errSchemaPath } }, { schemaPath, parentSchema }) { + let schPath = parentSchema ? errSchemaPath : (0, codegen_1.str)`${errSchemaPath}/${keyword}`; + if (schemaPath) { + schPath = (0, codegen_1.str)`${schPath}${(0, util_1.getErrorPath)(schemaPath, util_1.Type.Str)}`; + } + return [E2.schemaPath, schPath]; + } + function extraErrorProps(cxt, { params, message }, keyValues) { + const { keyword, data, schemaValue, it } = cxt; + const { opts, propertyName, topSchemaRef, schemaPath } = it; + keyValues.push([E2.keyword, keyword], [E2.params, typeof params == "function" ? params(cxt) : params || (0, codegen_1._)`{}`]); + if (opts.messages) { + keyValues.push([E2.message, typeof message == "function" ? message(cxt) : message]); + } + if (opts.verbose) { + keyValues.push([E2.schema, schemaValue], [E2.parentSchema, (0, codegen_1._)`${topSchemaRef}${schemaPath}`], [names_1.default.data, data]); + } + if (propertyName) + keyValues.push([E2.propertyName, propertyName]); + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js +var require_boolSchema2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; + var errors_1 = require_errors2(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var boolError = { + message: "boolean schema is false" + }; + function topBoolOrEmptySchema(it) { + const { gen, schema, validateName } = it; + if (schema === false) { + falseSchemaError(it, false); + } else if (typeof schema == "object" && schema.$async === true) { + gen.return(names_1.default.data); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, null); + gen.return(true); + } + } + exports.topBoolOrEmptySchema = topBoolOrEmptySchema; + function boolOrEmptySchema(it, valid) { + const { gen, schema } = it; + if (schema === false) { + gen.var(valid, false); + falseSchemaError(it); + } else { + gen.var(valid, true); + } + } + exports.boolOrEmptySchema = boolOrEmptySchema; + function falseSchemaError(it, overrideAllErrors) { + const { gen, data } = it; + const cxt = { + gen, + keyword: "false schema", + data, + schema: false, + schemaCode: false, + schemaValue: false, + params: {}, + it + }; + (0, errors_1.reportError)(cxt, boolError, void 0, overrideAllErrors); + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js +var require_rules2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getRules = exports.isJSONType = void 0; + var _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"]; + var jsonTypes = new Set(_jsonTypes); + function isJSONType(x2) { + return typeof x2 == "string" && jsonTypes.has(x2); + } + exports.isJSONType = isJSONType; + function getRules() { + const groups = { + number: { type: "number", rules: [] }, + string: { type: "string", rules: [] }, + array: { type: "array", rules: [] }, + object: { type: "object", rules: [] } + }; + return { + types: { ...groups, integer: true, boolean: true, null: true }, + rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object], + post: { rules: [] }, + all: {}, + keywords: {} + }; + } + exports.getRules = getRules; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js +var require_applicability2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; + function schemaHasRulesForType({ schema, self }, type) { + const group = self.RULES.types[type]; + return group && group !== true && shouldUseGroup(schema, group); + } + exports.schemaHasRulesForType = schemaHasRulesForType; + function shouldUseGroup(schema, group) { + return group.rules.some((rule) => shouldUseRule(schema, rule)); + } + exports.shouldUseGroup = shouldUseGroup; + function shouldUseRule(schema, rule) { + var _a3; + return schema[rule.keyword] !== void 0 || ((_a3 = rule.definition.implements) === null || _a3 === void 0 ? void 0 : _a3.some((kwd) => schema[kwd] !== void 0)); + } + exports.shouldUseRule = shouldUseRule; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js +var require_dataType2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; + var rules_1 = require_rules2(); + var applicability_1 = require_applicability2(); + var errors_1 = require_errors2(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var DataType; + (function(DataType2) { + DataType2[DataType2["Correct"] = 0] = "Correct"; + DataType2[DataType2["Wrong"] = 1] = "Wrong"; + })(DataType || (exports.DataType = DataType = {})); + function getSchemaTypes(schema) { + const types = getJSONTypes(schema.type); + const hasNull = types.includes("null"); + if (hasNull) { + if (schema.nullable === false) + throw new Error("type: null contradicts nullable: false"); + } else { + if (!types.length && schema.nullable !== void 0) { + throw new Error('"nullable" cannot be used without "type"'); + } + if (schema.nullable === true) + types.push("null"); + } + return types; + } + exports.getSchemaTypes = getSchemaTypes; + function getJSONTypes(ts) { + const types = Array.isArray(ts) ? ts : ts ? [ts] : []; + if (types.every(rules_1.isJSONType)) + return types; + throw new Error("type must be JSONType or JSONType[]: " + types.join(",")); + } + exports.getJSONTypes = getJSONTypes; + function coerceAndCheckDataType(it, types) { + const { gen, data, opts } = it; + const coerceTo = coerceToTypes(types, opts.coerceTypes); + const checkTypes = types.length > 0 && !(coerceTo.length === 0 && types.length === 1 && (0, applicability_1.schemaHasRulesForType)(it, types[0])); + if (checkTypes) { + const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong); + gen.if(wrongType, () => { + if (coerceTo.length) + coerceData(it, types, coerceTo); + else + reportTypeError(it); + }); + } + return checkTypes; + } + exports.coerceAndCheckDataType = coerceAndCheckDataType; + var COERCIBLE = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean", "null"]); + function coerceToTypes(types, coerceTypes) { + return coerceTypes ? types.filter((t) => COERCIBLE.has(t) || coerceTypes === "array" && t === "array") : []; + } + function coerceData(it, types, coerceTo) { + const { gen, data, opts } = it; + const dataType = gen.let("dataType", (0, codegen_1._)`typeof ${data}`); + const coerced = gen.let("coerced", (0, codegen_1._)`undefined`); + if (opts.coerceTypes === "array") { + gen.if((0, codegen_1._)`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen.assign(data, (0, codegen_1._)`${data}[0]`).assign(dataType, (0, codegen_1._)`typeof ${data}`).if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))); + } + gen.if((0, codegen_1._)`${coerced} !== undefined`); + for (const t of coerceTo) { + if (COERCIBLE.has(t) || t === "array" && opts.coerceTypes === "array") { + coerceSpecificType(t); + } + } + gen.else(); + reportTypeError(it); + gen.endIf(); + gen.if((0, codegen_1._)`${coerced} !== undefined`, () => { + gen.assign(data, coerced); + assignParentData(it, coerced); + }); + function coerceSpecificType(t) { + switch (t) { + case "string": + gen.elseIf((0, codegen_1._)`${dataType} == "number" || ${dataType} == "boolean"`).assign(coerced, (0, codegen_1._)`"" + ${data}`).elseIf((0, codegen_1._)`${data} === null`).assign(coerced, (0, codegen_1._)`""`); + return; + case "number": + gen.elseIf((0, codegen_1._)`${dataType} == "boolean" || ${data} === null + || (${dataType} == "string" && ${data} && ${data} == +${data})`).assign(coerced, (0, codegen_1._)`+${data}`); + return; + case "integer": + gen.elseIf((0, codegen_1._)`${dataType} === "boolean" || ${data} === null + || (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`).assign(coerced, (0, codegen_1._)`+${data}`); + return; + case "boolean": + gen.elseIf((0, codegen_1._)`${data} === "false" || ${data} === 0 || ${data} === null`).assign(coerced, false).elseIf((0, codegen_1._)`${data} === "true" || ${data} === 1`).assign(coerced, true); + return; + case "null": + gen.elseIf((0, codegen_1._)`${data} === "" || ${data} === 0 || ${data} === false`); + gen.assign(coerced, null); + return; + case "array": + gen.elseIf((0, codegen_1._)`${dataType} === "string" || ${dataType} === "number" + || ${dataType} === "boolean" || ${data} === null`).assign(coerced, (0, codegen_1._)`[${data}]`); + } + } + } + function assignParentData({ gen, parentData, parentDataProperty }, expr) { + gen.if((0, codegen_1._)`${parentData} !== undefined`, () => gen.assign((0, codegen_1._)`${parentData}[${parentDataProperty}]`, expr)); + } + function checkDataType(dataType, data, strictNums, correct = DataType.Correct) { + const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ; + let cond; + switch (dataType) { + case "null": + return (0, codegen_1._)`${data} ${EQ} null`; + case "array": + cond = (0, codegen_1._)`Array.isArray(${data})`; + break; + case "object": + cond = (0, codegen_1._)`${data} && typeof ${data} == "object" && !Array.isArray(${data})`; + break; + case "integer": + cond = numCond((0, codegen_1._)`!(${data} % 1) && !isNaN(${data})`); + break; + case "number": + cond = numCond(); + break; + default: + return (0, codegen_1._)`typeof ${data} ${EQ} ${dataType}`; + } + return correct === DataType.Correct ? cond : (0, codegen_1.not)(cond); + function numCond(_cond = codegen_1.nil) { + return (0, codegen_1.and)((0, codegen_1._)`typeof ${data} == "number"`, _cond, strictNums ? (0, codegen_1._)`isFinite(${data})` : codegen_1.nil); + } + } + exports.checkDataType = checkDataType; + function checkDataTypes(dataTypes, data, strictNums, correct) { + if (dataTypes.length === 1) { + return checkDataType(dataTypes[0], data, strictNums, correct); + } + let cond; + const types = (0, util_1.toHash)(dataTypes); + if (types.array && types.object) { + const notObj = (0, codegen_1._)`typeof ${data} != "object"`; + cond = types.null ? notObj : (0, codegen_1._)`!${data} || ${notObj}`; + delete types.null; + delete types.array; + delete types.object; + } else { + cond = codegen_1.nil; + } + if (types.number) + delete types.integer; + for (const t in types) + cond = (0, codegen_1.and)(cond, checkDataType(t, data, strictNums, correct)); + return cond; + } + exports.checkDataTypes = checkDataTypes; + var typeError = { + message: ({ schema }) => `must be ${schema}`, + params: ({ schema, schemaValue }) => typeof schema == "string" ? (0, codegen_1._)`{type: ${schema}}` : (0, codegen_1._)`{type: ${schemaValue}}` + }; + function reportTypeError(it) { + const cxt = getTypeErrorContext(it); + (0, errors_1.reportError)(cxt, typeError); + } + exports.reportTypeError = reportTypeError; + function getTypeErrorContext(it) { + const { gen, data, schema } = it; + const schemaCode = (0, util_1.schemaRefOrVal)(it, schema, "type"); + return { + gen, + keyword: "type", + data, + schema: schema.type, + schemaCode, + schemaValue: schemaCode, + parentSchema: schema, + params: {}, + it + }; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js +var require_defaults2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.assignDefaults = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + function assignDefaults(it, ty) { + const { properties, items } = it.schema; + if (ty === "object" && properties) { + for (const key in properties) { + assignDefault(it, key, properties[key].default); + } + } else if (ty === "array" && Array.isArray(items)) { + items.forEach((sch, i) => assignDefault(it, i, sch.default)); + } + } + exports.assignDefaults = assignDefaults; + function assignDefault(it, prop, defaultValue) { + const { gen, compositeRule, data, opts } = it; + if (defaultValue === void 0) + return; + const childData = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(prop)}`; + if (compositeRule) { + (0, util_1.checkStrictMode)(it, `default is ignored for: ${childData}`); + return; + } + let condition = (0, codegen_1._)`${childData} === undefined`; + if (opts.useDefaults === "empty") { + condition = (0, codegen_1._)`${condition} || ${childData} === null || ${childData} === ""`; + } + gen.if(condition, (0, codegen_1._)`${childData} = ${(0, codegen_1.stringify)(defaultValue)}`); + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js +var require_code4 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var names_1 = require_names2(); + var util_2 = require_util2(); + function checkReportMissingProp(cxt, prop) { + const { gen, data, it } = cxt; + gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => { + cxt.setParams({ missingProperty: (0, codegen_1._)`${prop}` }, true); + cxt.error(); + }); + } + exports.checkReportMissingProp = checkReportMissingProp; + function checkMissingProp({ gen, data, it: { opts } }, properties, missing) { + return (0, codegen_1.or)(...properties.map((prop) => (0, codegen_1.and)(noPropertyInData(gen, data, prop, opts.ownProperties), (0, codegen_1._)`${missing} = ${prop}`))); + } + exports.checkMissingProp = checkMissingProp; + function reportMissingProp(cxt, missing) { + cxt.setParams({ missingProperty: missing }, true); + cxt.error(); + } + exports.reportMissingProp = reportMissingProp; + function hasPropFunc(gen) { + return gen.scopeValue("func", { + // eslint-disable-next-line @typescript-eslint/unbound-method + ref: Object.prototype.hasOwnProperty, + code: (0, codegen_1._)`Object.prototype.hasOwnProperty` + }); + } + exports.hasPropFunc = hasPropFunc; + function isOwnProperty(gen, data, property) { + return (0, codegen_1._)`${hasPropFunc(gen)}.call(${data}, ${property})`; + } + exports.isOwnProperty = isOwnProperty; + function propertyInData(gen, data, property, ownProperties) { + const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} !== undefined`; + return ownProperties ? (0, codegen_1._)`${cond} && ${isOwnProperty(gen, data, property)}` : cond; + } + exports.propertyInData = propertyInData; + function noPropertyInData(gen, data, property, ownProperties) { + const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} === undefined`; + return ownProperties ? (0, codegen_1.or)(cond, (0, codegen_1.not)(isOwnProperty(gen, data, property))) : cond; + } + exports.noPropertyInData = noPropertyInData; + function allSchemaProperties(schemaMap) { + return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : []; + } + exports.allSchemaProperties = allSchemaProperties; + function schemaProperties(it, schemaMap) { + return allSchemaProperties(schemaMap).filter((p) => !(0, util_1.alwaysValidSchema)(it, schemaMap[p])); + } + exports.schemaProperties = schemaProperties; + function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) { + const dataAndSchema = passSchema ? (0, codegen_1._)`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data; + const valCxt = [ + [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, errorPath)], + [names_1.default.parentData, it.parentData], + [names_1.default.parentDataProperty, it.parentDataProperty], + [names_1.default.rootData, names_1.default.rootData] + ]; + if (it.opts.dynamicRef) + valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]); + const args = (0, codegen_1._)`${dataAndSchema}, ${gen.object(...valCxt)}`; + return context !== codegen_1.nil ? (0, codegen_1._)`${func}.call(${context}, ${args})` : (0, codegen_1._)`${func}(${args})`; + } + exports.callValidateCode = callValidateCode; + var newRegExp = (0, codegen_1._)`new RegExp`; + function usePattern({ gen, it: { opts } }, pattern) { + const u = opts.unicodeRegExp ? "u" : ""; + const { regExp } = opts.code; + const rx = regExp(pattern, u); + return gen.scopeValue("pattern", { + key: rx.toString(), + ref: rx, + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` + }); + } + exports.usePattern = usePattern; + function validateArray(cxt) { + const { gen, data, keyword, it } = cxt; + const valid = gen.name("valid"); + if (it.allErrors) { + const validArr = gen.let("valid", true); + validateItems(() => gen.assign(validArr, false)); + return validArr; + } + gen.var(valid, true); + validateItems(() => gen.break()); + return valid; + function validateItems(notValid) { + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + gen.forRange("i", 0, len, (i) => { + cxt.subschema({ + keyword, + dataProp: i, + dataPropType: util_1.Type.Num + }, valid); + gen.if((0, codegen_1.not)(valid), notValid); + }); + } + } + exports.validateArray = validateArray; + function validateUnion(cxt) { + const { gen, schema, keyword, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const alwaysValid = schema.some((sch) => (0, util_1.alwaysValidSchema)(it, sch)); + if (alwaysValid && !it.opts.unevaluated) + return; + const valid = gen.let("valid", false); + const schValid = gen.name("_valid"); + gen.block(() => schema.forEach((_sch, i) => { + const schCxt = cxt.subschema({ + keyword, + schemaProp: i, + compositeRule: true + }, schValid); + gen.assign(valid, (0, codegen_1._)`${valid} || ${schValid}`); + const merged = cxt.mergeValidEvaluated(schCxt, schValid); + if (!merged) + gen.if((0, codegen_1.not)(valid)); + })); + cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); + } + exports.validateUnion = validateUnion; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js +var require_keyword2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var code_1 = require_code4(); + var errors_1 = require_errors2(); + function macroKeywordCode(cxt, def) { + const { gen, keyword, schema, parentSchema, it } = cxt; + const macroSchema = def.macro.call(it.self, schema, parentSchema, it); + const schemaRef = useKeyword(gen, keyword, macroSchema); + if (it.opts.validateSchema !== false) + it.self.validateSchema(macroSchema, true); + const valid = gen.name("valid"); + cxt.subschema({ + schema: macroSchema, + schemaPath: codegen_1.nil, + errSchemaPath: `${it.errSchemaPath}/${keyword}`, + topSchemaRef: schemaRef, + compositeRule: true + }, valid); + cxt.pass(valid, () => cxt.error(true)); + } + exports.macroKeywordCode = macroKeywordCode; + function funcKeywordCode(cxt, def) { + var _a3; + const { gen, keyword, schema, parentSchema, $data, it } = cxt; + checkAsyncKeyword(it, def); + const validate2 = !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate; + const validateRef = useKeyword(gen, keyword, validate2); + const valid = gen.let("valid"); + cxt.block$data(valid, validateKeyword); + cxt.ok((_a3 = def.valid) !== null && _a3 !== void 0 ? _a3 : valid); + function validateKeyword() { + if (def.errors === false) { + assignValid(); + if (def.modifying) + modifyData(cxt); + reportErrs(() => cxt.error()); + } else { + const ruleErrs = def.async ? validateAsync2() : validateSync(); + if (def.modifying) + modifyData(cxt); + reportErrs(() => addErrs(cxt, ruleErrs)); + } + } + function validateAsync2() { + const ruleErrs = gen.let("ruleErrs", null); + gen.try(() => assignValid((0, codegen_1._)`await `), (e) => gen.assign(valid, false).if((0, codegen_1._)`${e} instanceof ${it.ValidationError}`, () => gen.assign(ruleErrs, (0, codegen_1._)`${e}.errors`), () => gen.throw(e))); + return ruleErrs; + } + function validateSync() { + const validateErrs = (0, codegen_1._)`${validateRef}.errors`; + gen.assign(validateErrs, null); + assignValid(codegen_1.nil); + return validateErrs; + } + function assignValid(_await = def.async ? (0, codegen_1._)`await ` : codegen_1.nil) { + const passCxt = it.opts.passContext ? names_1.default.this : names_1.default.self; + const passSchema = !("compile" in def && !$data || def.schema === false); + gen.assign(valid, (0, codegen_1._)`${_await}${(0, code_1.callValidateCode)(cxt, validateRef, passCxt, passSchema)}`, def.modifying); + } + function reportErrs(errors) { + var _a4; + gen.if((0, codegen_1.not)((_a4 = def.valid) !== null && _a4 !== void 0 ? _a4 : valid), errors); + } + } + exports.funcKeywordCode = funcKeywordCode; + function modifyData(cxt) { + const { gen, data, it } = cxt; + gen.if(it.parentData, () => gen.assign(data, (0, codegen_1._)`${it.parentData}[${it.parentDataProperty}]`)); + } + function addErrs(cxt, errs) { + const { gen } = cxt; + gen.if((0, codegen_1._)`Array.isArray(${errs})`, () => { + gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`).assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); + (0, errors_1.extendErrors)(cxt); + }, () => cxt.error()); + } + function checkAsyncKeyword({ schemaEnv }, def) { + if (def.async && !schemaEnv.$async) + throw new Error("async keyword in sync schema"); + } + function useKeyword(gen, keyword, result) { + if (result === void 0) + throw new Error(`keyword "${keyword}" failed to compile`); + return gen.scopeValue("keyword", typeof result == "function" ? { ref: result } : { ref: result, code: (0, codegen_1.stringify)(result) }); + } + function validSchemaType(schema, schemaType, allowUndefined = false) { + return !schemaType.length || schemaType.some((st) => st === "array" ? Array.isArray(schema) : st === "object" ? schema && typeof schema == "object" && !Array.isArray(schema) : typeof schema == st || allowUndefined && typeof schema == "undefined"); + } + exports.validSchemaType = validSchemaType; + function validateKeywordUsage({ schema, opts, self, errSchemaPath }, def, keyword) { + if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) { + throw new Error("ajv implementation error"); + } + const deps = def.dependencies; + if (deps === null || deps === void 0 ? void 0 : deps.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) { + throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(",")}`); + } + if (def.validateSchema) { + const valid = def.validateSchema(schema[keyword]); + if (!valid) { + const msg = `keyword "${keyword}" value is invalid at path "${errSchemaPath}": ` + self.errorsText(def.validateSchema.errors); + if (opts.validateSchema === "log") + self.logger.error(msg); + else + throw new Error(msg); + } + } + } + exports.validateKeywordUsage = validateKeywordUsage; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js +var require_subschema2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + function getSubschema(it, { keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef }) { + if (keyword !== void 0 && schema !== void 0) { + throw new Error('both "keyword" and "schema" passed, only one allowed'); + } + if (keyword !== void 0) { + const sch = it.schema[keyword]; + return schemaProp === void 0 ? { + schema: sch, + schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}`, + errSchemaPath: `${it.errSchemaPath}/${keyword}` + } : { + schema: sch[schemaProp], + schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}${(0, codegen_1.getProperty)(schemaProp)}`, + errSchemaPath: `${it.errSchemaPath}/${keyword}/${(0, util_1.escapeFragment)(schemaProp)}` + }; + } + if (schema !== void 0) { + if (schemaPath === void 0 || errSchemaPath === void 0 || topSchemaRef === void 0) { + throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"'); + } + return { + schema, + schemaPath, + topSchemaRef, + errSchemaPath + }; + } + throw new Error('either "keyword" or "schema" must be passed'); + } + exports.getSubschema = getSubschema; + function extendSubschemaData(subschema, it, { dataProp, dataPropType: dpType, data, dataTypes, propertyName }) { + if (data !== void 0 && dataProp !== void 0) { + throw new Error('both "data" and "dataProp" passed, only one allowed'); + } + const { gen } = it; + if (dataProp !== void 0) { + const { errorPath, dataPathArr, opts } = it; + const nextData = gen.let("data", (0, codegen_1._)`${it.data}${(0, codegen_1.getProperty)(dataProp)}`, true); + dataContextProps(nextData); + subschema.errorPath = (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(dataProp, dpType, opts.jsPropertySyntax)}`; + subschema.parentDataProperty = (0, codegen_1._)`${dataProp}`; + subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty]; + } + if (data !== void 0) { + const nextData = data instanceof codegen_1.Name ? data : gen.let("data", data, true); + dataContextProps(nextData); + if (propertyName !== void 0) + subschema.propertyName = propertyName; + } + if (dataTypes) + subschema.dataTypes = dataTypes; + function dataContextProps(_nextData) { + subschema.data = _nextData; + subschema.dataLevel = it.dataLevel + 1; + subschema.dataTypes = []; + it.definedProperties = /* @__PURE__ */ new Set(); + subschema.parentData = it.data; + subschema.dataNames = [...it.dataNames, _nextData]; + } + } + exports.extendSubschemaData = extendSubschemaData; + function extendSubschemaMode(subschema, { jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors }) { + if (compositeRule !== void 0) + subschema.compositeRule = compositeRule; + if (createErrors !== void 0) + subschema.createErrors = createErrors; + if (allErrors !== void 0) + subschema.allErrors = allErrors; + subschema.jtdDiscriminator = jtdDiscriminator; + subschema.jtdMetadata = jtdMetadata; + } + exports.extendSubschemaMode = extendSubschemaMode; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js +var require_resolve2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; + var util_1 = require_util2(); + var equal = require_fast_deep_equal(); + var traverse = require_json_schema_traverse(); + var SIMPLE_INLINED = /* @__PURE__ */ new Set([ + "type", + "format", + "pattern", + "maxLength", + "minLength", + "maxProperties", + "minProperties", + "maxItems", + "minItems", + "maximum", + "minimum", + "uniqueItems", + "multipleOf", + "required", + "enum", + "const" + ]); + function inlineRef(schema, limit = true) { + if (typeof schema == "boolean") + return true; + if (limit === true) + return !hasRef(schema); + if (!limit) + return false; + return countKeys(schema) <= limit; + } + exports.inlineRef = inlineRef; + var REF_KEYWORDS = /* @__PURE__ */ new Set([ + "$ref", + "$recursiveRef", + "$recursiveAnchor", + "$dynamicRef", + "$dynamicAnchor" + ]); + function hasRef(schema) { + for (const key in schema) { + if (REF_KEYWORDS.has(key)) + return true; + const sch = schema[key]; + if (Array.isArray(sch) && sch.some(hasRef)) + return true; + if (typeof sch == "object" && hasRef(sch)) + return true; + } + return false; + } + function countKeys(schema) { + let count = 0; + for (const key in schema) { + if (key === "$ref") + return Infinity; + count++; + if (SIMPLE_INLINED.has(key)) + continue; + if (typeof schema[key] == "object") { + (0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch)); + } + if (count === Infinity) + return Infinity; + } + return count; + } + function getFullPath(resolver, id = "", normalize) { + if (normalize !== false) + id = normalizeId(id); + const p = resolver.parse(id); + return _getFullPath(resolver, p); + } + exports.getFullPath = getFullPath; + function _getFullPath(resolver, p) { + const serialized = resolver.serialize(p); + return serialized.split("#")[0] + "#"; + } + exports._getFullPath = _getFullPath; + var TRAILING_SLASH_HASH = /#\/?$/; + function normalizeId(id) { + return id ? id.replace(TRAILING_SLASH_HASH, "") : ""; + } + exports.normalizeId = normalizeId; + function resolveUrl(resolver, baseId, id) { + id = normalizeId(id); + return resolver.resolve(baseId, id); + } + exports.resolveUrl = resolveUrl; + var ANCHOR = /^[a-z_][-a-z0-9._]*$/i; + function getSchemaRefs(schema, baseId) { + if (typeof schema == "boolean") + return {}; + const { schemaId, uriResolver } = this.opts; + const schId = normalizeId(schema[schemaId] || baseId); + const baseIds = { "": schId }; + const pathPrefix = getFullPath(uriResolver, schId, false); + const localRefs = {}; + const schemaRefs = /* @__PURE__ */ new Set(); + traverse(schema, { allKeys: true }, (sch, jsonPtr, _2, parentJsonPtr) => { + if (parentJsonPtr === void 0) + return; + const fullPath = pathPrefix + jsonPtr; + let innerBaseId = baseIds[parentJsonPtr]; + if (typeof sch[schemaId] == "string") + innerBaseId = addRef.call(this, sch[schemaId]); + addAnchor.call(this, sch.$anchor); + addAnchor.call(this, sch.$dynamicAnchor); + baseIds[jsonPtr] = innerBaseId; + function addRef(ref) { + const _resolve = this.opts.uriResolver.resolve; + ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref); + if (schemaRefs.has(ref)) + throw ambiguos(ref); + schemaRefs.add(ref); + let schOrRef = this.refs[ref]; + if (typeof schOrRef == "string") + schOrRef = this.refs[schOrRef]; + if (typeof schOrRef == "object") { + checkAmbiguosRef(sch, schOrRef.schema, ref); + } else if (ref !== normalizeId(fullPath)) { + if (ref[0] === "#") { + checkAmbiguosRef(sch, localRefs[ref], ref); + localRefs[ref] = sch; + } else { + this.refs[ref] = fullPath; + } + } + return ref; + } + function addAnchor(anchor2) { + if (typeof anchor2 == "string") { + if (!ANCHOR.test(anchor2)) + throw new Error(`invalid anchor "${anchor2}"`); + addRef.call(this, `#${anchor2}`); + } + } + }); + return localRefs; + function checkAmbiguosRef(sch1, sch2, ref) { + if (sch2 !== void 0 && !equal(sch1, sch2)) + throw ambiguos(ref); + } + function ambiguos(ref) { + return new Error(`reference "${ref}" resolves to more than one schema`); + } + } + exports.getSchemaRefs = getSchemaRefs; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js +var require_validate2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; + var boolSchema_1 = require_boolSchema2(); + var dataType_1 = require_dataType2(); + var applicability_1 = require_applicability2(); + var dataType_2 = require_dataType2(); + var defaults_1 = require_defaults2(); + var keyword_1 = require_keyword2(); + var subschema_1 = require_subschema2(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var resolve_1 = require_resolve2(); + var util_1 = require_util2(); + var errors_1 = require_errors2(); + function validateFunctionCode(it) { + if (isSchemaObj(it)) { + checkKeywords(it); + if (schemaCxtHasRules(it)) { + topSchemaObjCode(it); + return; + } + } + validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it)); + } + exports.validateFunctionCode = validateFunctionCode; + function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) { + if (opts.code.es5) { + gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => { + gen.code((0, codegen_1._)`"use strict"; ${funcSourceUrl(schema, opts)}`); + destructureValCxtES5(gen, opts); + gen.code(body); + }); + } else { + gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body)); + } + } + function destructureValCxt(opts) { + return (0, codegen_1._)`{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._)`, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`; + } + function destructureValCxtES5(gen, opts) { + gen.if(names_1.default.valCxt, () => { + gen.var(names_1.default.instancePath, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.instancePath}`); + gen.var(names_1.default.parentData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentData}`); + gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentDataProperty}`); + gen.var(names_1.default.rootData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.rootData}`); + if (opts.dynamicRef) + gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`); + }, () => { + gen.var(names_1.default.instancePath, (0, codegen_1._)`""`); + gen.var(names_1.default.parentData, (0, codegen_1._)`undefined`); + gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`undefined`); + gen.var(names_1.default.rootData, names_1.default.data); + if (opts.dynamicRef) + gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`{}`); + }); + } + function topSchemaObjCode(it) { + const { schema, opts, gen } = it; + validateFunction(it, () => { + if (opts.$comment && schema.$comment) + commentKeyword(it); + checkNoDefault(it); + gen.let(names_1.default.vErrors, null); + gen.let(names_1.default.errors, 0); + if (opts.unevaluated) + resetEvaluated(it); + typeAndKeywords(it); + returnResults(it); + }); + return; + } + function resetEvaluated(it) { + const { gen, validateName } = it; + it.evaluated = gen.const("evaluated", (0, codegen_1._)`${validateName}.evaluated`); + gen.if((0, codegen_1._)`${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._)`${it.evaluated}.props`, (0, codegen_1._)`undefined`)); + gen.if((0, codegen_1._)`${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._)`${it.evaluated}.items`, (0, codegen_1._)`undefined`)); + } + function funcSourceUrl(schema, opts) { + const schId = typeof schema == "object" && schema[opts.schemaId]; + return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._)`/*# sourceURL=${schId} */` : codegen_1.nil; + } + function subschemaCode(it, valid) { + if (isSchemaObj(it)) { + checkKeywords(it); + if (schemaCxtHasRules(it)) { + subSchemaObjCode(it, valid); + return; + } + } + (0, boolSchema_1.boolOrEmptySchema)(it, valid); + } + function schemaCxtHasRules({ schema, self }) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (self.RULES.all[key]) + return true; + return false; + } + function isSchemaObj(it) { + return typeof it.schema != "boolean"; + } + function subSchemaObjCode(it, valid) { + const { schema, gen, opts } = it; + if (opts.$comment && schema.$comment) + commentKeyword(it); + updateContext(it); + checkAsyncSchema(it); + const errsCount = gen.const("_errs", names_1.default.errors); + typeAndKeywords(it, errsCount); + gen.var(valid, (0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + } + function checkKeywords(it) { + (0, util_1.checkUnknownRules)(it); + checkRefsAndKeywords(it); + } + function typeAndKeywords(it, errsCount) { + if (it.opts.jtd) + return schemaKeywords(it, [], false, errsCount); + const types = (0, dataType_1.getSchemaTypes)(it.schema); + const checkedTypes = (0, dataType_1.coerceAndCheckDataType)(it, types); + schemaKeywords(it, types, !checkedTypes, errsCount); + } + function checkRefsAndKeywords(it) { + const { schema, errSchemaPath, opts, self } = it; + if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) { + self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`); + } + } + function checkNoDefault(it) { + const { schema, opts } = it; + if (schema.default !== void 0 && opts.useDefaults && opts.strictSchema) { + (0, util_1.checkStrictMode)(it, "default is ignored in the schema root"); + } + } + function updateContext(it) { + const schId = it.schema[it.opts.schemaId]; + if (schId) + it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId); + } + function checkAsyncSchema(it) { + if (it.schema.$async && !it.schemaEnv.$async) + throw new Error("async schema in sync schema"); + } + function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) { + const msg = schema.$comment; + if (opts.$comment === true) { + gen.code((0, codegen_1._)`${names_1.default.self}.logger.log(${msg})`); + } else if (typeof opts.$comment == "function") { + const schemaPath = (0, codegen_1.str)`${errSchemaPath}/$comment`; + const rootName = gen.scopeValue("root", { ref: schemaEnv.root }); + gen.code((0, codegen_1._)`${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`); + } + } + function returnResults(it) { + const { gen, schemaEnv, validateName, ValidationError, opts } = it; + if (schemaEnv.$async) { + gen.if((0, codegen_1._)`${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._)`new ${ValidationError}(${names_1.default.vErrors})`)); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, names_1.default.vErrors); + if (opts.unevaluated) + assignEvaluated(it); + gen.return((0, codegen_1._)`${names_1.default.errors} === 0`); + } + } + function assignEvaluated({ gen, evaluated, props, items }) { + if (props instanceof codegen_1.Name) + gen.assign((0, codegen_1._)`${evaluated}.props`, props); + if (items instanceof codegen_1.Name) + gen.assign((0, codegen_1._)`${evaluated}.items`, items); + } + function schemaKeywords(it, types, typeErrors, errsCount) { + const { gen, schema, data, allErrors, opts, self } = it; + const { RULES } = self; + if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) { + gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition)); + return; + } + if (!opts.jtd) + checkStrictTypes(it, types); + gen.block(() => { + for (const group of RULES.rules) + groupKeywords(group); + groupKeywords(RULES.post); + }); + function groupKeywords(group) { + if (!(0, applicability_1.shouldUseGroup)(schema, group)) + return; + if (group.type) { + gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers)); + iterateKeywords(it, group); + if (types.length === 1 && types[0] === group.type && typeErrors) { + gen.else(); + (0, dataType_2.reportTypeError)(it); + } + gen.endIf(); + } else { + iterateKeywords(it, group); + } + if (!allErrors) + gen.if((0, codegen_1._)`${names_1.default.errors} === ${errsCount || 0}`); + } + } + function iterateKeywords(it, group) { + const { gen, schema, opts: { useDefaults } } = it; + if (useDefaults) + (0, defaults_1.assignDefaults)(it, group.type); + gen.block(() => { + for (const rule of group.rules) { + if ((0, applicability_1.shouldUseRule)(schema, rule)) { + keywordCode(it, rule.keyword, rule.definition, group.type); + } + } + }); + } + function checkStrictTypes(it, types) { + if (it.schemaEnv.meta || !it.opts.strictTypes) + return; + checkContextTypes(it, types); + if (!it.opts.allowUnionTypes) + checkMultipleTypes(it, types); + checkKeywordTypes(it, it.dataTypes); + } + function checkContextTypes(it, types) { + if (!types.length) + return; + if (!it.dataTypes.length) { + it.dataTypes = types; + return; + } + types.forEach((t) => { + if (!includesType(it.dataTypes, t)) { + strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`); + } + }); + narrowSchemaTypes(it, types); + } + function checkMultipleTypes(it, ts) { + if (ts.length > 1 && !(ts.length === 2 && ts.includes("null"))) { + strictTypesError(it, "use allowUnionTypes to allow union type keyword"); + } + } + function checkKeywordTypes(it, ts) { + const rules = it.self.RULES.all; + for (const keyword in rules) { + const rule = rules[keyword]; + if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) { + const { type } = rule.definition; + if (type.length && !type.some((t) => hasApplicableType(ts, t))) { + strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`); + } + } + } + } + function hasApplicableType(schTs, kwdT) { + return schTs.includes(kwdT) || kwdT === "number" && schTs.includes("integer"); + } + function includesType(ts, t) { + return ts.includes(t) || t === "integer" && ts.includes("number"); + } + function narrowSchemaTypes(it, withTypes) { + const ts = []; + for (const t of it.dataTypes) { + if (includesType(withTypes, t)) + ts.push(t); + else if (withTypes.includes("integer") && t === "number") + ts.push("integer"); + } + it.dataTypes = ts; + } + function strictTypesError(it, msg) { + const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; + msg += ` at "${schemaPath}" (strictTypes)`; + (0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes); + } + var KeywordCxt = class { + constructor(it, def, keyword) { + (0, keyword_1.validateKeywordUsage)(it, def, keyword); + this.gen = it.gen; + this.allErrors = it.allErrors; + this.keyword = keyword; + this.data = it.data; + this.schema = it.schema[keyword]; + this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data; + this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data); + this.schemaType = def.schemaType; + this.parentSchema = it.schema; + this.params = {}; + this.it = it; + this.def = def; + if (this.$data) { + this.schemaCode = it.gen.const("vSchema", getData(this.$data, it)); + } else { + this.schemaCode = this.schemaValue; + if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) { + throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`); + } + } + if ("code" in def ? def.trackErrors : def.errors !== false) { + this.errsCount = it.gen.const("_errs", names_1.default.errors); + } + } + result(condition, successAction, failAction) { + this.failResult((0, codegen_1.not)(condition), successAction, failAction); + } + failResult(condition, successAction, failAction) { + this.gen.if(condition); + if (failAction) + failAction(); + else + this.error(); + if (successAction) { + this.gen.else(); + successAction(); + if (this.allErrors) + this.gen.endIf(); + } else { + if (this.allErrors) + this.gen.endIf(); + else + this.gen.else(); + } + } + pass(condition, failAction) { + this.failResult((0, codegen_1.not)(condition), void 0, failAction); + } + fail(condition) { + if (condition === void 0) { + this.error(); + if (!this.allErrors) + this.gen.if(false); + return; + } + this.gen.if(condition); + this.error(); + if (this.allErrors) + this.gen.endIf(); + else + this.gen.else(); + } + fail$data(condition) { + if (!this.$data) + return this.fail(condition); + const { schemaCode } = this; + this.fail((0, codegen_1._)`${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`); + } + error(append, errorParams, errorPaths) { + if (errorParams) { + this.setParams(errorParams); + this._error(append, errorPaths); + this.setParams({}); + return; + } + this._error(append, errorPaths); + } + _error(append, errorPaths) { + ; + (append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths); + } + $dataError() { + (0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError); + } + reset() { + if (this.errsCount === void 0) + throw new Error('add "trackErrors" to keyword definition'); + (0, errors_1.resetErrorsCount)(this.gen, this.errsCount); + } + ok(cond) { + if (!this.allErrors) + this.gen.if(cond); + } + setParams(obj, assign) { + if (assign) + Object.assign(this.params, obj); + else + this.params = obj; + } + block$data(valid, codeBlock, $dataValid = codegen_1.nil) { + this.gen.block(() => { + this.check$data(valid, $dataValid); + codeBlock(); + }); + } + check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) { + if (!this.$data) + return; + const { gen, schemaCode, schemaType, def } = this; + gen.if((0, codegen_1.or)((0, codegen_1._)`${schemaCode} === undefined`, $dataValid)); + if (valid !== codegen_1.nil) + gen.assign(valid, true); + if (schemaType.length || def.validateSchema) { + gen.elseIf(this.invalid$data()); + this.$dataError(); + if (valid !== codegen_1.nil) + gen.assign(valid, false); + } + gen.else(); + } + invalid$data() { + const { gen, schemaCode, schemaType, def, it } = this; + return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema()); + function wrong$DataType() { + if (schemaType.length) { + if (!(schemaCode instanceof codegen_1.Name)) + throw new Error("ajv implementation error"); + const st = Array.isArray(schemaType) ? schemaType : [schemaType]; + return (0, codegen_1._)`${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`; + } + return codegen_1.nil; + } + function invalid$DataSchema() { + if (def.validateSchema) { + const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema }); + return (0, codegen_1._)`!${validateSchemaRef}(${schemaCode})`; + } + return codegen_1.nil; + } + } + subschema(appl, valid) { + const subschema = (0, subschema_1.getSubschema)(this.it, appl); + (0, subschema_1.extendSubschemaData)(subschema, this.it, appl); + (0, subschema_1.extendSubschemaMode)(subschema, appl); + const nextContext = { ...this.it, ...subschema, items: void 0, props: void 0 }; + subschemaCode(nextContext, valid); + return nextContext; + } + mergeEvaluated(schemaCxt, toName) { + const { it, gen } = this; + if (!it.opts.unevaluated) + return; + if (it.props !== true && schemaCxt.props !== void 0) { + it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName); + } + if (it.items !== true && schemaCxt.items !== void 0) { + it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName); + } + } + mergeValidEvaluated(schemaCxt, valid) { + const { it, gen } = this; + if (it.opts.unevaluated && (it.props !== true || it.items !== true)) { + gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name)); + return true; + } + } + }; + exports.KeywordCxt = KeywordCxt; + function keywordCode(it, keyword, def, ruleType) { + const cxt = new KeywordCxt(it, def, keyword); + if ("code" in def) { + def.code(cxt, ruleType); + } else if (cxt.$data && def.validate) { + (0, keyword_1.funcKeywordCode)(cxt, def); + } else if ("macro" in def) { + (0, keyword_1.macroKeywordCode)(cxt, def); + } else if (def.compile || def.validate) { + (0, keyword_1.funcKeywordCode)(cxt, def); + } + } + var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/; + var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/; + function getData($data, { dataLevel, dataNames, dataPathArr }) { + let jsonPointer; + let data; + if ($data === "") + return names_1.default.rootData; + if ($data[0] === "/") { + if (!JSON_POINTER.test($data)) + throw new Error(`Invalid JSON-pointer: ${$data}`); + jsonPointer = $data; + data = names_1.default.rootData; + } else { + const matches = RELATIVE_JSON_POINTER.exec($data); + if (!matches) + throw new Error(`Invalid JSON-pointer: ${$data}`); + const up = +matches[1]; + jsonPointer = matches[2]; + if (jsonPointer === "#") { + if (up >= dataLevel) + throw new Error(errorMsg("property/index", up)); + return dataPathArr[dataLevel - up]; + } + if (up > dataLevel) + throw new Error(errorMsg("data", up)); + data = dataNames[dataLevel - up]; + if (!jsonPointer) + return data; + } + let expr = data; + const segments = jsonPointer.split("/"); + for (const segment of segments) { + if (segment) { + data = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`; + expr = (0, codegen_1._)`${expr} && ${data}`; + } + } + return expr; + function errorMsg(pointerType, up) { + return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`; + } + } + exports.getData = getData; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js +var require_validation_error2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var ValidationError = class extends Error { + constructor(errors) { + super("validation failed"); + this.errors = errors; + this.ajv = this.validation = true; + } + }; + exports.default = ValidationError; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js +var require_ref_error2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var resolve_1 = require_resolve2(); + var MissingRefError = class extends Error { + constructor(resolver, baseId, ref, msg) { + super(msg || `can't resolve reference ${ref} from id ${baseId}`); + this.missingRef = (0, resolve_1.resolveUrl)(resolver, baseId, ref); + this.missingSchema = (0, resolve_1.normalizeId)((0, resolve_1.getFullPath)(resolver, this.missingRef)); + } + }; + exports.default = MissingRefError; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js +var require_compile2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; + var codegen_1 = require_codegen2(); + var validation_error_1 = require_validation_error2(); + var names_1 = require_names2(); + var resolve_1 = require_resolve2(); + var util_1 = require_util2(); + var validate_1 = require_validate2(); + var SchemaEnv = class { + constructor(env) { + var _a3; + this.refs = {}; + this.dynamicAnchors = {}; + let schema; + if (typeof env.schema == "object") + schema = env.schema; + this.schema = env.schema; + this.schemaId = env.schemaId; + this.root = env.root || this; + this.baseId = (_a3 = env.baseId) !== null && _a3 !== void 0 ? _a3 : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]); + this.schemaPath = env.schemaPath; + this.localRefs = env.localRefs; + this.meta = env.meta; + this.$async = schema === null || schema === void 0 ? void 0 : schema.$async; + this.refs = {}; + } + }; + exports.SchemaEnv = SchemaEnv; + function compileSchema(sch) { + const _sch = getCompilingSchema.call(this, sch); + if (_sch) + return _sch; + const rootId = (0, resolve_1.getFullPath)(this.opts.uriResolver, sch.root.baseId); + const { es5, lines } = this.opts.code; + const { ownProperties } = this.opts; + const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties }); + let _ValidationError; + if (sch.$async) { + _ValidationError = gen.scopeValue("Error", { + ref: validation_error_1.default, + code: (0, codegen_1._)`require("ajv/dist/runtime/validation_error").default` + }); + } + const validateName = gen.scopeName("validate"); + sch.validateName = validateName; + const schemaCxt = { + gen, + allErrors: this.opts.allErrors, + data: names_1.default.data, + parentData: names_1.default.parentData, + parentDataProperty: names_1.default.parentDataProperty, + dataNames: [names_1.default.data], + dataPathArr: [codegen_1.nil], + // TODO can its length be used as dataLevel if nil is removed? + dataLevel: 0, + dataTypes: [], + definedProperties: /* @__PURE__ */ new Set(), + topSchemaRef: gen.scopeValue("schema", this.opts.code.source === true ? { ref: sch.schema, code: (0, codegen_1.stringify)(sch.schema) } : { ref: sch.schema }), + validateName, + ValidationError: _ValidationError, + schema: sch.schema, + schemaEnv: sch, + rootId, + baseId: sch.baseId || rootId, + schemaPath: codegen_1.nil, + errSchemaPath: sch.schemaPath || (this.opts.jtd ? "" : "#"), + errorPath: (0, codegen_1._)`""`, + opts: this.opts, + self: this + }; + let sourceCode; + try { + this._compilations.add(sch); + (0, validate_1.validateFunctionCode)(schemaCxt); + gen.optimize(this.opts.code.optimize); + const validateCode = gen.toString(); + sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${validateCode}`; + if (this.opts.code.process) + sourceCode = this.opts.code.process(sourceCode, sch); + const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); + const validate2 = makeValidate(this, this.scope.get()); + this.scope.value(validateName, { ref: validate2 }); + validate2.errors = null; + validate2.schema = sch.schema; + validate2.schemaEnv = sch; + if (sch.$async) + validate2.$async = true; + if (this.opts.code.source === true) { + validate2.source = { validateName, validateCode, scopeValues: gen._values }; + } + if (this.opts.unevaluated) { + const { props, items } = schemaCxt; + validate2.evaluated = { + props: props instanceof codegen_1.Name ? void 0 : props, + items: items instanceof codegen_1.Name ? void 0 : items, + dynamicProps: props instanceof codegen_1.Name, + dynamicItems: items instanceof codegen_1.Name + }; + if (validate2.source) + validate2.source.evaluated = (0, codegen_1.stringify)(validate2.evaluated); + } + sch.validate = validate2; + return sch; + } catch (e) { + delete sch.validate; + delete sch.validateName; + if (sourceCode) + this.logger.error("Error compiling schema, function code:", sourceCode); + throw e; + } finally { + this._compilations.delete(sch); + } + } + exports.compileSchema = compileSchema; + function resolveRef2(root, baseId, ref) { + var _a3; + ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref); + const schOrFunc = root.refs[ref]; + if (schOrFunc) + return schOrFunc; + let _sch = resolve.call(this, root, ref); + if (_sch === void 0) { + const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref]; + const { schemaId } = this.opts; + if (schema) + _sch = new SchemaEnv({ schema, schemaId, root, baseId }); + } + if (_sch === void 0) + return; + return root.refs[ref] = inlineOrCompile.call(this, _sch); + } + exports.resolveRef = resolveRef2; + function inlineOrCompile(sch) { + if ((0, resolve_1.inlineRef)(sch.schema, this.opts.inlineRefs)) + return sch.schema; + return sch.validate ? sch : compileSchema.call(this, sch); + } + function getCompilingSchema(schEnv) { + for (const sch of this._compilations) { + if (sameSchemaEnv(sch, schEnv)) + return sch; + } + } + exports.getCompilingSchema = getCompilingSchema; + function sameSchemaEnv(s1, s2) { + return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId; + } + function resolve(root, ref) { + let sch; + while (typeof (sch = this.refs[ref]) == "string") + ref = sch; + return sch || this.schemas[ref] || resolveSchema.call(this, root, ref); + } + function resolveSchema(root, ref) { + const p = this.opts.uriResolver.parse(ref); + const refPath = (0, resolve_1._getFullPath)(this.opts.uriResolver, p); + let baseId = (0, resolve_1.getFullPath)(this.opts.uriResolver, root.baseId, void 0); + if (Object.keys(root.schema).length > 0 && refPath === baseId) { + return getJsonPointer.call(this, p, root); + } + const id = (0, resolve_1.normalizeId)(refPath); + const schOrRef = this.refs[id] || this.schemas[id]; + if (typeof schOrRef == "string") { + const sch = resolveSchema.call(this, root, schOrRef); + if (typeof (sch === null || sch === void 0 ? void 0 : sch.schema) !== "object") + return; + return getJsonPointer.call(this, p, sch); + } + if (typeof (schOrRef === null || schOrRef === void 0 ? void 0 : schOrRef.schema) !== "object") + return; + if (!schOrRef.validate) + compileSchema.call(this, schOrRef); + if (id === (0, resolve_1.normalizeId)(ref)) { + const { schema } = schOrRef; + const { schemaId } = this.opts; + const schId = schema[schemaId]; + if (schId) + baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); + return new SchemaEnv({ schema, schemaId, root, baseId }); + } + return getJsonPointer.call(this, p, schOrRef); + } + exports.resolveSchema = resolveSchema; + var PREVENT_SCOPE_CHANGE = /* @__PURE__ */ new Set([ + "properties", + "patternProperties", + "enum", + "dependencies", + "definitions" + ]); + function getJsonPointer(parsedRef, { baseId, schema, root }) { + var _a3; + if (((_a3 = parsedRef.fragment) === null || _a3 === void 0 ? void 0 : _a3[0]) !== "/") + return; + for (const part of parsedRef.fragment.slice(1).split("/")) { + if (typeof schema === "boolean") + return; + const partSchema = schema[(0, util_1.unescapeFragment)(part)]; + if (partSchema === void 0) + return; + schema = partSchema; + const schId = typeof schema === "object" && schema[this.opts.schemaId]; + if (!PREVENT_SCOPE_CHANGE.has(part) && schId) { + baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); + } + } + let env; + if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) { + const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref); + env = resolveSchema.call(this, root, $ref); + } + const { schemaId } = this.opts; + env = env || new SchemaEnv({ schema, schemaId, root, baseId }); + if (env.schema !== env.root.schema) + return env; + return void 0; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json +var require_data2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json"(exports, module) { + module.exports = { + $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", + description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", + type: "object", + required: ["$data"], + properties: { + $data: { + type: "string", + anyOf: [{ format: "relative-json-pointer" }, { format: "json-pointer" }] + } + }, + additionalProperties: false + }; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js +var require_uri2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var uri = require_fast_uri(); + uri.code = 'require("ajv/dist/runtime/uri").default'; + exports.default = uri; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/core.js +var require_core3 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/core.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; + var validate_1 = require_validate2(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen2(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error2(); + var ref_error_1 = require_ref_error2(); + var rules_1 = require_rules2(); + var compile_1 = require_compile2(); + var codegen_2 = require_codegen2(); + var resolve_1 = require_resolve2(); + var dataType_1 = require_dataType2(); + var util_1 = require_util2(); + var $dataRefSchema = require_data2(); + var uri_1 = require_uri2(); + var defaultRegExp = (str, flags) => new RegExp(str, flags); + defaultRegExp.code = "new RegExp"; + var META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes"]; + var EXT_SCOPE_NAMES = /* @__PURE__ */ new Set([ + "validate", + "serialize", + "parse", + "wrapper", + "root", + "schema", + "keyword", + "pattern", + "formats", + "validate$data", + "func", + "obj", + "Error" + ]); + var removedOptions = { + errorDataPath: "", + format: "`validateFormats: false` can be used instead.", + nullable: '"nullable" keyword is supported by default.', + jsonPointers: "Deprecated jsPropertySyntax can be used instead.", + extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.", + missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.", + processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`", + sourceCode: "Use option `code: {source: true}`", + strictDefaults: "It is default now, see option `strict`.", + strictKeywords: "It is default now, see option `strict`.", + uniqueItems: '"uniqueItems" keyword is always validated.', + unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).", + cache: "Map is used as cache, schema object as key.", + serialize: "Map is used as cache, schema object as key.", + ajvErrors: "It is default now." + }; + var deprecatedOptions = { + ignoreKeywordsWithRef: "", + jsPropertySyntax: "", + unicode: '"minLength"/"maxLength" account for unicode characters by default.' + }; + var MAX_EXPRESSION = 200; + function requiredOptions(o) { + var _a3, _b, _c, _d, _e2, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; + const s = o.strict; + const _optz = (_a3 = o.code) === null || _a3 === void 0 ? void 0 : _a3.optimize; + const optimize = _optz === true || _optz === void 0 ? 1 : _optz || 0; + const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp; + const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default; + return { + strictSchema: (_f = (_e2 = o.strictSchema) !== null && _e2 !== void 0 ? _e2 : s) !== null && _f !== void 0 ? _f : true, + strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true, + strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log", + strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log", + strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false, + code: o.code ? { ...o.code, optimize, regExp } : { optimize, regExp }, + loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION, + loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION, + meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true, + messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true, + inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true, + schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id", + addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true, + validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true, + validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true, + unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true, + int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true, + uriResolver + }; + } + var Ajv2 = class { + constructor(opts = {}) { + this.schemas = {}; + this.refs = {}; + this.formats = /* @__PURE__ */ Object.create(null); + this._compilations = /* @__PURE__ */ new Set(); + this._loading = {}; + this._cache = /* @__PURE__ */ new Map(); + opts = this.opts = { ...opts, ...requiredOptions(opts) }; + const { es5, lines } = this.opts.code; + this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines }); + this.logger = getLogger(opts.logger); + const formatOpt = opts.validateFormats; + opts.validateFormats = false; + this.RULES = (0, rules_1.getRules)(); + checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED"); + checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn"); + this._metaOpts = getMetaSchemaOptions.call(this); + if (opts.formats) + addInitialFormats.call(this); + this._addVocabularies(); + this._addDefaultMetaSchema(); + if (opts.keywords) + addInitialKeywords.call(this, opts.keywords); + if (typeof opts.meta == "object") + this.addMetaSchema(opts.meta); + addInitialSchemas.call(this); + opts.validateFormats = formatOpt; + } + _addVocabularies() { + this.addKeyword("$async"); + } + _addDefaultMetaSchema() { + const { $data, meta: meta3, schemaId } = this.opts; + let _dataRefSchema = $dataRefSchema; + if (schemaId === "id") { + _dataRefSchema = { ...$dataRefSchema }; + _dataRefSchema.id = _dataRefSchema.$id; + delete _dataRefSchema.$id; + } + if (meta3 && $data) + this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false); + } + defaultMeta() { + const { meta: meta3, schemaId } = this.opts; + return this.opts.defaultMeta = typeof meta3 == "object" ? meta3[schemaId] || meta3 : void 0; + } + validate(schemaKeyRef, data) { + let v2; + if (typeof schemaKeyRef == "string") { + v2 = this.getSchema(schemaKeyRef); + if (!v2) + throw new Error(`no schema with key or ref "${schemaKeyRef}"`); + } else { + v2 = this.compile(schemaKeyRef); + } + const valid = v2(data); + if (!("$async" in v2)) + this.errors = v2.errors; + return valid; + } + compile(schema, _meta) { + const sch = this._addSchema(schema, _meta); + return sch.validate || this._compileSchemaEnv(sch); + } + compileAsync(schema, meta3) { + if (typeof this.opts.loadSchema != "function") { + throw new Error("options.loadSchema should be a function"); + } + const { loadSchema } = this.opts; + return runCompileAsync.call(this, schema, meta3); + async function runCompileAsync(_schema, _meta) { + await loadMetaSchema.call(this, _schema.$schema); + const sch = this._addSchema(_schema, _meta); + return sch.validate || _compileAsync.call(this, sch); + } + async function loadMetaSchema($ref) { + if ($ref && !this.getSchema($ref)) { + await runCompileAsync.call(this, { $ref }, true); + } + } + async function _compileAsync(sch) { + try { + return this._compileSchemaEnv(sch); + } catch (e) { + if (!(e instanceof ref_error_1.default)) + throw e; + checkLoaded.call(this, e); + await loadMissingSchema.call(this, e.missingSchema); + return _compileAsync.call(this, sch); + } + } + function checkLoaded({ missingSchema: ref, missingRef }) { + if (this.refs[ref]) { + throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`); + } + } + async function loadMissingSchema(ref) { + const _schema = await _loadSchema.call(this, ref); + if (!this.refs[ref]) + await loadMetaSchema.call(this, _schema.$schema); + if (!this.refs[ref]) + this.addSchema(_schema, ref, meta3); + } + async function _loadSchema(ref) { + const p = this._loading[ref]; + if (p) + return p; + try { + return await (this._loading[ref] = loadSchema(ref)); + } finally { + delete this._loading[ref]; + } + } + } + // Adds schema to the instance + addSchema(schema, key, _meta, _validateSchema = this.opts.validateSchema) { + if (Array.isArray(schema)) { + for (const sch of schema) + this.addSchema(sch, void 0, _meta, _validateSchema); + return this; + } + let id; + if (typeof schema === "object") { + const { schemaId } = this.opts; + id = schema[schemaId]; + if (id !== void 0 && typeof id != "string") { + throw new Error(`schema ${schemaId} must be string`); + } + } + key = (0, resolve_1.normalizeId)(key || id); + this._checkUnique(key); + this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true); + return this; + } + // Add schema that will be used to validate other schemas + // options in META_IGNORE_OPTIONS are alway set to false + addMetaSchema(schema, key, _validateSchema = this.opts.validateSchema) { + this.addSchema(schema, key, true, _validateSchema); + return this; + } + // Validate schema against its meta-schema + validateSchema(schema, throwOrLogError) { + if (typeof schema == "boolean") + return true; + let $schema; + $schema = schema.$schema; + if ($schema !== void 0 && typeof $schema != "string") { + throw new Error("$schema must be a string"); + } + $schema = $schema || this.opts.defaultMeta || this.defaultMeta(); + if (!$schema) { + this.logger.warn("meta-schema not available"); + this.errors = null; + return true; + } + const valid = this.validate($schema, schema); + if (!valid && throwOrLogError) { + const message = "schema is invalid: " + this.errorsText(); + if (this.opts.validateSchema === "log") + this.logger.error(message); + else + throw new Error(message); + } + return valid; + } + // Get compiled schema by `key` or `ref`. + // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id) + getSchema(keyRef) { + let sch; + while (typeof (sch = getSchEnv.call(this, keyRef)) == "string") + keyRef = sch; + if (sch === void 0) { + const { schemaId } = this.opts; + const root = new compile_1.SchemaEnv({ schema: {}, schemaId }); + sch = compile_1.resolveSchema.call(this, root, keyRef); + if (!sch) + return; + this.refs[keyRef] = sch; + } + return sch.validate || this._compileSchemaEnv(sch); + } + // Remove cached schema(s). + // If no parameter is passed all schemas but meta-schemas are removed. + // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. + // Even if schema is referenced by other schemas it still can be removed as other schemas have local references. + removeSchema(schemaKeyRef) { + if (schemaKeyRef instanceof RegExp) { + this._removeAllSchemas(this.schemas, schemaKeyRef); + this._removeAllSchemas(this.refs, schemaKeyRef); + return this; + } + switch (typeof schemaKeyRef) { + case "undefined": + this._removeAllSchemas(this.schemas); + this._removeAllSchemas(this.refs); + this._cache.clear(); + return this; + case "string": { + const sch = getSchEnv.call(this, schemaKeyRef); + if (typeof sch == "object") + this._cache.delete(sch.schema); + delete this.schemas[schemaKeyRef]; + delete this.refs[schemaKeyRef]; + return this; + } + case "object": { + const cacheKey = schemaKeyRef; + this._cache.delete(cacheKey); + let id = schemaKeyRef[this.opts.schemaId]; + if (id) { + id = (0, resolve_1.normalizeId)(id); + delete this.schemas[id]; + delete this.refs[id]; + } + return this; + } + default: + throw new Error("ajv.removeSchema: invalid parameter"); + } + } + // add "vocabulary" - a collection of keywords + addVocabulary(definitions) { + for (const def of definitions) + this.addKeyword(def); + return this; + } + addKeyword(kwdOrDef, def) { + let keyword; + if (typeof kwdOrDef == "string") { + keyword = kwdOrDef; + if (typeof def == "object") { + this.logger.warn("these parameters are deprecated, see docs for addKeyword"); + def.keyword = keyword; + } + } else if (typeof kwdOrDef == "object" && def === void 0) { + def = kwdOrDef; + keyword = def.keyword; + if (Array.isArray(keyword) && !keyword.length) { + throw new Error("addKeywords: keyword must be string or non-empty array"); + } + } else { + throw new Error("invalid addKeywords parameters"); + } + checkKeyword.call(this, keyword, def); + if (!def) { + (0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd)); + return this; + } + keywordMetaschema.call(this, def); + const definition = { + ...def, + type: (0, dataType_1.getJSONTypes)(def.type), + schemaType: (0, dataType_1.getJSONTypes)(def.schemaType) + }; + (0, util_1.eachItem)(keyword, definition.type.length === 0 ? (k2) => addRule.call(this, k2, definition) : (k2) => definition.type.forEach((t) => addRule.call(this, k2, definition, t))); + return this; + } + getKeyword(keyword) { + const rule = this.RULES.all[keyword]; + return typeof rule == "object" ? rule.definition : !!rule; + } + // Remove keyword + removeKeyword(keyword) { + const { RULES } = this; + delete RULES.keywords[keyword]; + delete RULES.all[keyword]; + for (const group of RULES.rules) { + const i = group.rules.findIndex((rule) => rule.keyword === keyword); + if (i >= 0) + group.rules.splice(i, 1); + } + return this; + } + // Add format + addFormat(name, format) { + if (typeof format == "string") + format = new RegExp(format); + this.formats[name] = format; + return this; + } + errorsText(errors = this.errors, { separator = ", ", dataVar = "data" } = {}) { + if (!errors || errors.length === 0) + return "No errors"; + return errors.map((e) => `${dataVar}${e.instancePath} ${e.message}`).reduce((text, msg) => text + separator + msg); + } + $dataMetaSchema(metaSchema, keywordsJsonPointers) { + const rules = this.RULES.all; + metaSchema = JSON.parse(JSON.stringify(metaSchema)); + for (const jsonPointer of keywordsJsonPointers) { + const segments = jsonPointer.split("/").slice(1); + let keywords = metaSchema; + for (const seg of segments) + keywords = keywords[seg]; + for (const key in rules) { + const rule = rules[key]; + if (typeof rule != "object") + continue; + const { $data } = rule.definition; + const schema = keywords[key]; + if ($data && schema) + keywords[key] = schemaOrData(schema); + } + } + return metaSchema; + } + _removeAllSchemas(schemas, regex) { + for (const keyRef in schemas) { + const sch = schemas[keyRef]; + if (!regex || regex.test(keyRef)) { + if (typeof sch == "string") { + delete schemas[keyRef]; + } else if (sch && !sch.meta) { + this._cache.delete(sch.schema); + delete schemas[keyRef]; + } + } + } + } + _addSchema(schema, meta3, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) { + let id; + const { schemaId } = this.opts; + if (typeof schema == "object") { + id = schema[schemaId]; + } else { + if (this.opts.jtd) + throw new Error("schema must be object"); + else if (typeof schema != "boolean") + throw new Error("schema must be object or boolean"); + } + let sch = this._cache.get(schema); + if (sch !== void 0) + return sch; + baseId = (0, resolve_1.normalizeId)(id || baseId); + const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId); + sch = new compile_1.SchemaEnv({ schema, schemaId, meta: meta3, baseId, localRefs }); + this._cache.set(sch.schema, sch); + if (addSchema && !baseId.startsWith("#")) { + if (baseId) + this._checkUnique(baseId); + this.refs[baseId] = sch; + } + if (validateSchema) + this.validateSchema(schema, true); + return sch; + } + _checkUnique(id) { + if (this.schemas[id] || this.refs[id]) { + throw new Error(`schema with key or id "${id}" already exists`); + } + } + _compileSchemaEnv(sch) { + if (sch.meta) + this._compileMetaSchema(sch); + else + compile_1.compileSchema.call(this, sch); + if (!sch.validate) + throw new Error("ajv implementation error"); + return sch.validate; + } + _compileMetaSchema(sch) { + const currentOpts = this.opts; + this.opts = this._metaOpts; + try { + compile_1.compileSchema.call(this, sch); + } finally { + this.opts = currentOpts; + } + } + }; + Ajv2.ValidationError = validation_error_1.default; + Ajv2.MissingRefError = ref_error_1.default; + exports.default = Ajv2; + function checkOptions(checkOpts, options, msg, log = "error") { + for (const key in checkOpts) { + const opt = key; + if (opt in options) + this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`); + } + } + function getSchEnv(keyRef) { + keyRef = (0, resolve_1.normalizeId)(keyRef); + return this.schemas[keyRef] || this.refs[keyRef]; + } + function addInitialSchemas() { + const optsSchemas = this.opts.schemas; + if (!optsSchemas) + return; + if (Array.isArray(optsSchemas)) + this.addSchema(optsSchemas); + else + for (const key in optsSchemas) + this.addSchema(optsSchemas[key], key); + } + function addInitialFormats() { + for (const name in this.opts.formats) { + const format = this.opts.formats[name]; + if (format) + this.addFormat(name, format); + } + } + function addInitialKeywords(defs) { + if (Array.isArray(defs)) { + this.addVocabulary(defs); + return; + } + this.logger.warn("keywords option as map is deprecated, pass array"); + for (const keyword in defs) { + const def = defs[keyword]; + if (!def.keyword) + def.keyword = keyword; + this.addKeyword(def); + } + } + function getMetaSchemaOptions() { + const metaOpts = { ...this.opts }; + for (const opt of META_IGNORE_OPTIONS) + delete metaOpts[opt]; + return metaOpts; + } + var noLogs = { log() { + }, warn() { + }, error() { + } }; + function getLogger(logger) { + if (logger === false) + return noLogs; + if (logger === void 0) + return console; + if (logger.log && logger.warn && logger.error) + return logger; + throw new Error("logger must implement log, warn and error methods"); + } + var KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i; + function checkKeyword(keyword, def) { + const { RULES } = this; + (0, util_1.eachItem)(keyword, (kwd) => { + if (RULES.keywords[kwd]) + throw new Error(`Keyword ${kwd} is already defined`); + if (!KEYWORD_NAME.test(kwd)) + throw new Error(`Keyword ${kwd} has invalid name`); + }); + if (!def) + return; + if (def.$data && !("code" in def || "validate" in def)) { + throw new Error('$data keyword must have "code" or "validate" function'); + } + } + function addRule(keyword, definition, dataType) { + var _a3; + const post = definition === null || definition === void 0 ? void 0 : definition.post; + if (dataType && post) + throw new Error('keyword with "post" flag cannot have "type"'); + const { RULES } = this; + let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType); + if (!ruleGroup) { + ruleGroup = { type: dataType, rules: [] }; + RULES.rules.push(ruleGroup); + } + RULES.keywords[keyword] = true; + if (!definition) + return; + const rule = { + keyword, + definition: { + ...definition, + type: (0, dataType_1.getJSONTypes)(definition.type), + schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType) + } + }; + if (definition.before) + addBeforeRule.call(this, ruleGroup, rule, definition.before); + else + ruleGroup.rules.push(rule); + RULES.all[keyword] = rule; + (_a3 = definition.implements) === null || _a3 === void 0 ? void 0 : _a3.forEach((kwd) => this.addKeyword(kwd)); + } + function addBeforeRule(ruleGroup, rule, before) { + const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before); + if (i >= 0) { + ruleGroup.rules.splice(i, 0, rule); + } else { + ruleGroup.rules.push(rule); + this.logger.warn(`rule ${before} is not defined`); + } + } + function keywordMetaschema(def) { + let { metaSchema } = def; + if (metaSchema === void 0) + return; + if (def.$data && this.opts.$data) + metaSchema = schemaOrData(metaSchema); + def.validateSchema = this.compile(metaSchema, true); + } + var $dataRef = { + $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" + }; + function schemaOrData(schema) { + return { anyOf: [schema, $dataRef] }; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js +var require_id2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var def = { + keyword: "id", + code() { + throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID'); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js +var require_ref2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.callRef = exports.getValidate = void 0; + var ref_error_1 = require_ref_error2(); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var compile_1 = require_compile2(); + var util_1 = require_util2(); + var def = { + keyword: "$ref", + schemaType: "string", + code(cxt) { + const { gen, schema: $ref, it } = cxt; + const { baseId, schemaEnv: env, validateName, opts, self } = it; + const { root } = env; + if (($ref === "#" || $ref === "#/") && baseId === root.baseId) + return callRootRef(); + const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref); + if (schOrEnv === void 0) + throw new ref_error_1.default(it.opts.uriResolver, baseId, $ref); + if (schOrEnv instanceof compile_1.SchemaEnv) + return callValidate(schOrEnv); + return inlineRefSchema(schOrEnv); + function callRootRef() { + if (env === root) + return callRef(cxt, validateName, env, env.$async); + const rootName = gen.scopeValue("root", { ref: root }); + return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async); + } + function callValidate(sch) { + const v2 = getValidate(cxt, sch); + callRef(cxt, v2, sch, sch.$async); + } + function inlineRefSchema(sch) { + const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: (0, codegen_1.stringify)(sch) } : { ref: sch }); + const valid = gen.name("valid"); + const schCxt = cxt.subschema({ + schema: sch, + dataTypes: [], + schemaPath: codegen_1.nil, + topSchemaRef: schName, + errSchemaPath: $ref + }, valid); + cxt.mergeEvaluated(schCxt); + cxt.ok(valid); + } + } + }; + function getValidate(cxt, sch) { + const { gen } = cxt; + return sch.validate ? gen.scopeValue("validate", { ref: sch.validate }) : (0, codegen_1._)`${gen.scopeValue("wrapper", { ref: sch })}.validate`; + } + exports.getValidate = getValidate; + function callRef(cxt, v2, sch, $async) { + const { gen, it } = cxt; + const { allErrors, schemaEnv: env, opts } = it; + const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil; + if ($async) + callAsyncRef(); + else + callSyncRef(); + function callAsyncRef() { + if (!env.$async) + throw new Error("async schema referenced by sync schema"); + const valid = gen.let("valid"); + gen.try(() => { + gen.code((0, codegen_1._)`await ${(0, code_1.callValidateCode)(cxt, v2, passCxt)}`); + addEvaluatedFrom(v2); + if (!allErrors) + gen.assign(valid, true); + }, (e) => { + gen.if((0, codegen_1._)`!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e)); + addErrorsFrom(e); + if (!allErrors) + gen.assign(valid, false); + }); + cxt.ok(valid); + } + function callSyncRef() { + cxt.result((0, code_1.callValidateCode)(cxt, v2, passCxt), () => addEvaluatedFrom(v2), () => addErrorsFrom(v2)); + } + function addErrorsFrom(source) { + const errs = (0, codegen_1._)`${source}.errors`; + gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`); + gen.assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); + } + function addEvaluatedFrom(source) { + var _a3; + if (!it.opts.unevaluated) + return; + const schEvaluated = (_a3 = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a3 === void 0 ? void 0 : _a3.evaluated; + if (it.props !== true) { + if (schEvaluated && !schEvaluated.dynamicProps) { + if (schEvaluated.props !== void 0) { + it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props); + } + } else { + const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`); + it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name); + } + } + if (it.items !== true) { + if (schEvaluated && !schEvaluated.dynamicItems) { + if (schEvaluated.items !== void 0) { + it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items); + } + } else { + const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`); + it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name); + } + } + } + } + exports.callRef = callRef; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js +var require_core4 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var id_1 = require_id2(); + var ref_1 = require_ref2(); + var core = [ + "$schema", + "$id", + "$defs", + "$vocabulary", + { keyword: "$comment" }, + "definitions", + id_1.default, + ref_1.default + ]; + exports.default = core; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +var require_limitNumber2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var ops = codegen_1.operators; + var KWDs = { + maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, + minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, + exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, + exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE } + }; + var error61 = { + message: ({ keyword, schemaCode }) => (0, codegen_1.str)`must be ${KWDs[keyword].okStr} ${schemaCode}`, + params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}` + }; + var def = { + keyword: Object.keys(KWDs), + type: "number", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + cxt.fail$data((0, codegen_1._)`${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +var require_multipleOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must be multiple of ${schemaCode}`, + params: ({ schemaCode }) => (0, codegen_1._)`{multipleOf: ${schemaCode}}` + }; + var def = { + keyword: "multipleOf", + type: "number", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { gen, data, schemaCode, it } = cxt; + const prec = it.opts.multipleOfPrecision; + const res = gen.let("res"); + const invalid = prec ? (0, codegen_1._)`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}` : (0, codegen_1._)`${res} !== parseInt(${res})`; + cxt.fail$data((0, codegen_1._)`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js +var require_ucs2length2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + function ucs2length(str) { + const len = str.length; + let length = 0; + let pos = 0; + let value; + while (pos < len) { + length++; + value = str.charCodeAt(pos++); + if (value >= 55296 && value <= 56319 && pos < len) { + value = str.charCodeAt(pos); + if ((value & 64512) === 56320) + pos++; + } + } + return length; + } + exports.default = ucs2length; + ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default'; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js +var require_limitLength2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var ucs2length_1 = require_ucs2length2(); + var error61 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxLength" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} characters`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxLength", "minLength"], + type: "string", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode, it } = cxt; + const op = keyword === "maxLength" ? codegen_1.operators.GT : codegen_1.operators.LT; + const len = it.opts.unicode === false ? (0, codegen_1._)`${data}.length` : (0, codegen_1._)`${(0, util_1.useFunc)(cxt.gen, ucs2length_1.default)}(${data})`; + cxt.fail$data((0, codegen_1._)`${len} ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js +var require_pattern2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var util_1 = require_util2(); + var codegen_1 = require_codegen2(); + var error61 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must match pattern "${schemaCode}"`, + params: ({ schemaCode }) => (0, codegen_1._)`{pattern: ${schemaCode}}` + }; + var def = { + keyword: "pattern", + type: "string", + schemaType: "string", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + const u = it.opts.unicodeRegExp ? "u" : ""; + if ($data) { + const { regExp } = it.opts.code; + const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); + const valid = gen.let("valid"); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); + cxt.fail$data((0, codegen_1._)`!${valid}`); + } else { + const regExp = (0, code_1.usePattern)(cxt, schema); + cxt.fail$data((0, codegen_1._)`!${regExp}.test(${data})`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +var require_limitProperties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxProperties" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} properties`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxProperties", "minProperties"], + type: "object", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT; + cxt.fail$data((0, codegen_1._)`Object.keys(${data}).length ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js +var require_required2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { missingProperty } }) => (0, codegen_1.str)`must have required property '${missingProperty}'`, + params: ({ params: { missingProperty } }) => (0, codegen_1._)`{missingProperty: ${missingProperty}}` + }; + var def = { + keyword: "required", + type: "object", + schemaType: "array", + $data: true, + error: error61, + code(cxt) { + const { gen, schema, schemaCode, data, $data, it } = cxt; + const { opts } = it; + if (!$data && schema.length === 0) + return; + const useLoop = schema.length >= opts.loopRequired; + if (it.allErrors) + allErrorsMode(); + else + exitOnErrorMode(); + if (opts.strictRequired) { + const props = cxt.parentSchema.properties; + const { definedProperties } = cxt.it; + for (const requiredKey of schema) { + if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === void 0 && !definedProperties.has(requiredKey)) { + const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; + const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`; + (0, util_1.checkStrictMode)(it, msg, it.opts.strictRequired); + } + } + } + function allErrorsMode() { + if (useLoop || $data) { + cxt.block$data(codegen_1.nil, loopAllRequired); + } else { + for (const prop of schema) { + (0, code_1.checkReportMissingProp)(cxt, prop); + } + } + } + function exitOnErrorMode() { + const missing = gen.let("missing"); + if (useLoop || $data) { + const valid = gen.let("valid", true); + cxt.block$data(valid, () => loopUntilMissing(missing, valid)); + cxt.ok(valid); + } else { + gen.if((0, code_1.checkMissingProp)(cxt, schema, missing)); + (0, code_1.reportMissingProp)(cxt, missing); + gen.else(); + } + } + function loopAllRequired() { + gen.forOf("prop", schemaCode, (prop) => { + cxt.setParams({ missingProperty: prop }); + gen.if((0, code_1.noPropertyInData)(gen, data, prop, opts.ownProperties), () => cxt.error()); + }); + } + function loopUntilMissing(missing, valid) { + cxt.setParams({ missingProperty: missing }); + gen.forOf(missing, schemaCode, () => { + gen.assign(valid, (0, code_1.propertyInData)(gen, data, missing, opts.ownProperties)); + gen.if((0, codegen_1.not)(valid), () => { + cxt.error(); + gen.break(); + }); + }, codegen_1.nil); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js +var require_limitItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxItems" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} items`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxItems", "minItems"], + type: "array", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + const op = keyword === "maxItems" ? codegen_1.operators.GT : codegen_1.operators.LT; + cxt.fail$data((0, codegen_1._)`${data}.length ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js +var require_equal2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var equal = require_fast_deep_equal(); + equal.code = 'require("ajv/dist/runtime/equal").default'; + exports.default = equal; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +var require_uniqueItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dataType_1 = require_dataType2(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var equal_1 = require_equal2(); + var error61 = { + message: ({ params: { i, j: j2 } }) => (0, codegen_1.str)`must NOT have duplicate items (items ## ${j2} and ${i} are identical)`, + params: ({ params: { i, j: j2 } }) => (0, codegen_1._)`{i: ${i}, j: ${j2}}` + }; + var def = { + keyword: "uniqueItems", + type: "array", + schemaType: "boolean", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt; + if (!$data && !schema) + return; + const valid = gen.let("valid"); + const itemTypes = parentSchema.items ? (0, dataType_1.getSchemaTypes)(parentSchema.items) : []; + cxt.block$data(valid, validateUniqueItems, (0, codegen_1._)`${schemaCode} === false`); + cxt.ok(valid); + function validateUniqueItems() { + const i = gen.let("i", (0, codegen_1._)`${data}.length`); + const j2 = gen.let("j"); + cxt.setParams({ i, j: j2 }); + gen.assign(valid, true); + gen.if((0, codegen_1._)`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j2)); + } + function canOptimize() { + return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array"); + } + function loopN(i, j2) { + const item = gen.name("item"); + const wrongType = (0, dataType_1.checkDataTypes)(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong); + const indices = gen.const("indices", (0, codegen_1._)`{}`); + gen.for((0, codegen_1._)`;${i}--;`, () => { + gen.let(item, (0, codegen_1._)`${data}[${i}]`); + gen.if(wrongType, (0, codegen_1._)`continue`); + if (itemTypes.length > 1) + gen.if((0, codegen_1._)`typeof ${item} == "string"`, (0, codegen_1._)`${item} += "_"`); + gen.if((0, codegen_1._)`typeof ${indices}[${item}] == "number"`, () => { + gen.assign(j2, (0, codegen_1._)`${indices}[${item}]`); + cxt.error(); + gen.assign(valid, false).break(); + }).code((0, codegen_1._)`${indices}[${item}] = ${i}`); + }); + } + function loopN2(i, j2) { + const eql = (0, util_1.useFunc)(gen, equal_1.default); + const outer = gen.name("outer"); + gen.label(outer).for((0, codegen_1._)`;${i}--;`, () => gen.for((0, codegen_1._)`${j2} = ${i}; ${j2}--;`, () => gen.if((0, codegen_1._)`${eql}(${data}[${i}], ${data}[${j2}])`, () => { + cxt.error(); + gen.assign(valid, false).break(outer); + }))); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js +var require_const2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var equal_1 = require_equal2(); + var error61 = { + message: "must be equal to constant", + params: ({ schemaCode }) => (0, codegen_1._)`{allowedValue: ${schemaCode}}` + }; + var def = { + keyword: "const", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schemaCode, schema } = cxt; + if ($data || schema && typeof schema == "object") { + cxt.fail$data((0, codegen_1._)`!${(0, util_1.useFunc)(gen, equal_1.default)}(${data}, ${schemaCode})`); + } else { + cxt.fail((0, codegen_1._)`${schema} !== ${data}`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js +var require_enum2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var equal_1 = require_equal2(); + var error61 = { + message: "must be equal to one of the allowed values", + params: ({ schemaCode }) => (0, codegen_1._)`{allowedValues: ${schemaCode}}` + }; + var def = { + keyword: "enum", + schemaType: "array", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + if (!$data && schema.length === 0) + throw new Error("enum must have non-empty array"); + const useLoop = schema.length >= it.opts.loopEnum; + let eql; + const getEql = () => eql !== null && eql !== void 0 ? eql : eql = (0, util_1.useFunc)(gen, equal_1.default); + let valid; + if (useLoop || $data) { + valid = gen.let("valid"); + cxt.block$data(valid, loopEnum); + } else { + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const vSchema = gen.const("vSchema", schemaCode); + valid = (0, codegen_1.or)(...schema.map((_x, i) => equalCode(vSchema, i))); + } + cxt.pass(valid); + function loopEnum() { + gen.assign(valid, false); + gen.forOf("v", schemaCode, (v2) => gen.if((0, codegen_1._)`${getEql()}(${data}, ${v2})`, () => gen.assign(valid, true).break())); + } + function equalCode(vSchema, i) { + const sch = schema[i]; + return typeof sch === "object" && sch !== null ? (0, codegen_1._)`${getEql()}(${data}, ${vSchema}[${i}])` : (0, codegen_1._)`${data} === ${sch}`; + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js +var require_validation2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var limitNumber_1 = require_limitNumber2(); + var multipleOf_1 = require_multipleOf2(); + var limitLength_1 = require_limitLength2(); + var pattern_1 = require_pattern2(); + var limitProperties_1 = require_limitProperties2(); + var required_1 = require_required2(); + var limitItems_1 = require_limitItems2(); + var uniqueItems_1 = require_uniqueItems2(); + var const_1 = require_const2(); + var enum_1 = require_enum2(); + var validation = [ + // number + limitNumber_1.default, + multipleOf_1.default, + // string + limitLength_1.default, + pattern_1.default, + // object + limitProperties_1.default, + required_1.default, + // array + limitItems_1.default, + uniqueItems_1.default, + // any + { keyword: "type", schemaType: ["string", "array"] }, + { keyword: "nullable", schemaType: "boolean" }, + const_1.default, + enum_1.default + ]; + exports.default = validation; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +var require_additionalItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateAdditionalItems = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "additionalItems", + type: "array", + schemaType: ["boolean", "object"], + before: "uniqueItems", + error: error61, + code(cxt) { + const { parentSchema, it } = cxt; + const { items } = parentSchema; + if (!Array.isArray(items)) { + (0, util_1.checkStrictMode)(it, '"additionalItems" is ignored when "items" is not an array of schemas'); + return; + } + validateAdditionalItems(cxt, items); + } + }; + function validateAdditionalItems(cxt, items) { + const { gen, schema, data, keyword, it } = cxt; + it.items = true; + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + if (schema === false) { + cxt.setParams({ len: items.length }); + cxt.pass((0, codegen_1._)`${len} <= ${items.length}`); + } else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.var("valid", (0, codegen_1._)`${len} <= ${items.length}`); + gen.if((0, codegen_1.not)(valid), () => validateItems(valid)); + cxt.ok(valid); + } + function validateItems(valid) { + gen.forRange("i", items.length, len, (i) => { + cxt.subschema({ keyword, dataProp: i, dataPropType: util_1.Type.Num }, valid); + if (!it.allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + }); + } + } + exports.validateAdditionalItems = validateAdditionalItems; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js +var require_items2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateTuple = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var code_1 = require_code4(); + var def = { + keyword: "items", + type: "array", + schemaType: ["object", "array", "boolean"], + before: "uniqueItems", + code(cxt) { + const { schema, it } = cxt; + if (Array.isArray(schema)) + return validateTuple(cxt, "additionalItems", schema); + it.items = true; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + cxt.ok((0, code_1.validateArray)(cxt)); + } + }; + function validateTuple(cxt, extraItems, schArr = cxt.schema) { + const { gen, parentSchema, data, keyword, it } = cxt; + checkStrictTuple(parentSchema); + if (it.opts.unevaluated && schArr.length && it.items !== true) { + it.items = util_1.mergeEvaluated.items(gen, schArr.length, it.items); + } + const valid = gen.name("valid"); + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + schArr.forEach((sch, i) => { + if ((0, util_1.alwaysValidSchema)(it, sch)) + return; + gen.if((0, codegen_1._)`${len} > ${i}`, () => cxt.subschema({ + keyword, + schemaProp: i, + dataProp: i + }, valid)); + cxt.ok(valid); + }); + function checkStrictTuple(sch) { + const { opts, errSchemaPath } = it; + const l3 = schArr.length; + const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); + if (opts.strictTuples && !fullTuple) { + const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); + } + } + } + exports.validateTuple = validateTuple; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +var require_prefixItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var items_1 = require_items2(); + var def = { + keyword: "prefixItems", + type: "array", + schemaType: ["array"], + before: "uniqueItems", + code: (cxt) => (0, items_1.validateTuple)(cxt, "items") + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js +var require_items20202 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var code_1 = require_code4(); + var additionalItems_1 = require_additionalItems2(); + var error61 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "items", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + error: error61, + code(cxt) { + const { schema, parentSchema, it } = cxt; + const { prefixItems } = parentSchema; + it.items = true; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + if (prefixItems) + (0, additionalItems_1.validateAdditionalItems)(cxt, prefixItems); + else + cxt.ok((0, code_1.validateArray)(cxt)); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js +var require_contains2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1.str)`must contain at least ${min} valid item(s)` : (0, codegen_1.str)`must contain at least ${min} and no more than ${max} valid item(s)`, + params: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1._)`{minContains: ${min}}` : (0, codegen_1._)`{minContains: ${min}, maxContains: ${max}}` + }; + var def = { + keyword: "contains", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + trackErrors: true, + error: error61, + code(cxt) { + const { gen, schema, parentSchema, data, it } = cxt; + let min; + let max; + const { minContains, maxContains } = parentSchema; + if (it.opts.next) { + min = minContains === void 0 ? 1 : minContains; + max = maxContains; + } else { + min = 1; + } + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + cxt.setParams({ min, max }); + if (max === void 0 && min === 0) { + (0, util_1.checkStrictMode)(it, `"minContains" == 0 without "maxContains": "contains" keyword ignored`); + return; + } + if (max !== void 0 && min > max) { + (0, util_1.checkStrictMode)(it, `"minContains" > "maxContains" is always invalid`); + cxt.fail(); + return; + } + if ((0, util_1.alwaysValidSchema)(it, schema)) { + let cond = (0, codegen_1._)`${len} >= ${min}`; + if (max !== void 0) + cond = (0, codegen_1._)`${cond} && ${len} <= ${max}`; + cxt.pass(cond); + return; + } + it.items = true; + const valid = gen.name("valid"); + if (max === void 0 && min === 1) { + validateItems(valid, () => gen.if(valid, () => gen.break())); + } else if (min === 0) { + gen.let(valid, true); + if (max !== void 0) + gen.if((0, codegen_1._)`${data}.length > 0`, validateItemsWithCount); + } else { + gen.let(valid, false); + validateItemsWithCount(); + } + cxt.result(valid, () => cxt.reset()); + function validateItemsWithCount() { + const schValid = gen.name("_valid"); + const count = gen.let("count", 0); + validateItems(schValid, () => gen.if(schValid, () => checkLimits(count))); + } + function validateItems(_valid, block) { + gen.forRange("i", 0, len, (i) => { + cxt.subschema({ + keyword: "contains", + dataProp: i, + dataPropType: util_1.Type.Num, + compositeRule: true + }, _valid); + block(); + }); + } + function checkLimits(count) { + gen.code((0, codegen_1._)`${count}++`); + if (max === void 0) { + gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break()); + } else { + gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break()); + if (min === 1) + gen.assign(valid, true); + else + gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true)); + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +var require_dependencies2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var code_1 = require_code4(); + exports.error = { + message: ({ params: { property, depsCount, deps } }) => { + const property_ies = depsCount === 1 ? "property" : "properties"; + return (0, codegen_1.str)`must have ${property_ies} ${deps} when property ${property} is present`; + }, + params: ({ params: { property, depsCount, deps, missingProperty } }) => (0, codegen_1._)`{property: ${property}, + missingProperty: ${missingProperty}, + depsCount: ${depsCount}, + deps: ${deps}}` + // TODO change to reference + }; + var def = { + keyword: "dependencies", + type: "object", + schemaType: "object", + error: exports.error, + code(cxt) { + const [propDeps, schDeps] = splitDependencies(cxt); + validatePropertyDeps(cxt, propDeps); + validateSchemaDeps(cxt, schDeps); + } + }; + function splitDependencies({ schema }) { + const propertyDeps = {}; + const schemaDeps = {}; + for (const key in schema) { + if (key === "__proto__") + continue; + const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps; + deps[key] = schema[key]; + } + return [propertyDeps, schemaDeps]; + } + function validatePropertyDeps(cxt, propertyDeps = cxt.schema) { + const { gen, data, it } = cxt; + if (Object.keys(propertyDeps).length === 0) + return; + const missing = gen.let("missing"); + for (const prop in propertyDeps) { + const deps = propertyDeps[prop]; + if (deps.length === 0) + continue; + const hasProperty = (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties); + cxt.setParams({ + property: prop, + depsCount: deps.length, + deps: deps.join(", ") + }); + if (it.allErrors) { + gen.if(hasProperty, () => { + for (const depProp of deps) { + (0, code_1.checkReportMissingProp)(cxt, depProp); + } + }); + } else { + gen.if((0, codegen_1._)`${hasProperty} && (${(0, code_1.checkMissingProp)(cxt, deps, missing)})`); + (0, code_1.reportMissingProp)(cxt, missing); + gen.else(); + } + } + } + exports.validatePropertyDeps = validatePropertyDeps; + function validateSchemaDeps(cxt, schemaDeps = cxt.schema) { + const { gen, data, keyword, it } = cxt; + const valid = gen.name("valid"); + for (const prop in schemaDeps) { + if ((0, util_1.alwaysValidSchema)(it, schemaDeps[prop])) + continue; + gen.if( + (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties), + () => { + const schCxt = cxt.subschema({ keyword, schemaProp: prop }, valid); + cxt.mergeValidEvaluated(schCxt, valid); + }, + () => gen.var(valid, true) + // TODO var + ); + cxt.ok(valid); + } + } + exports.validateSchemaDeps = validateSchemaDeps; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +var require_propertyNames2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: "property name must be valid", + params: ({ params }) => (0, codegen_1._)`{propertyName: ${params.propertyName}}` + }; + var def = { + keyword: "propertyNames", + type: "object", + schemaType: ["object", "boolean"], + error: error61, + code(cxt) { + const { gen, schema, data, it } = cxt; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + const valid = gen.name("valid"); + gen.forIn("key", data, (key) => { + cxt.setParams({ propertyName: key }); + cxt.subschema({ + keyword: "propertyNames", + data: key, + dataTypes: ["string"], + propertyName: key, + compositeRule: true + }, valid); + gen.if((0, codegen_1.not)(valid), () => { + cxt.error(true); + if (!it.allErrors) + gen.break(); + }); + }); + cxt.ok(valid); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +var require_additionalProperties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var util_1 = require_util2(); + var error61 = { + message: "must NOT have additional properties", + params: ({ params }) => (0, codegen_1._)`{additionalProperty: ${params.additionalProperty}}` + }; + var def = { + keyword: "additionalProperties", + type: ["object"], + schemaType: ["boolean", "object"], + allowUndefined: true, + trackErrors: true, + error: error61, + code(cxt) { + const { gen, schema, parentSchema, data, errsCount, it } = cxt; + if (!errsCount) + throw new Error("ajv implementation error"); + const { allErrors, opts } = it; + it.props = true; + if (opts.removeAdditional !== "all" && (0, util_1.alwaysValidSchema)(it, schema)) + return; + const props = (0, code_1.allSchemaProperties)(parentSchema.properties); + const patProps = (0, code_1.allSchemaProperties)(parentSchema.patternProperties); + checkAdditionalProperties(); + cxt.ok((0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + function checkAdditionalProperties() { + gen.forIn("key", data, (key) => { + if (!props.length && !patProps.length) + additionalPropertyCode(key); + else + gen.if(isAdditional(key), () => additionalPropertyCode(key)); + }); + } + function isAdditional(key) { + let definedProp; + if (props.length > 8) { + const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema.properties, "properties"); + definedProp = (0, code_1.isOwnProperty)(gen, propsSchema, key); + } else if (props.length) { + definedProp = (0, codegen_1.or)(...props.map((p) => (0, codegen_1._)`${key} === ${p}`)); + } else { + definedProp = codegen_1.nil; + } + if (patProps.length) { + definedProp = (0, codegen_1.or)(definedProp, ...patProps.map((p) => (0, codegen_1._)`${(0, code_1.usePattern)(cxt, p)}.test(${key})`)); + } + return (0, codegen_1.not)(definedProp); + } + function deleteAdditional(key) { + gen.code((0, codegen_1._)`delete ${data}[${key}]`); + } + function additionalPropertyCode(key) { + if (opts.removeAdditional === "all" || opts.removeAdditional && schema === false) { + deleteAdditional(key); + return; + } + if (schema === false) { + cxt.setParams({ additionalProperty: key }); + cxt.error(); + if (!allErrors) + gen.break(); + return; + } + if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.name("valid"); + if (opts.removeAdditional === "failing") { + applyAdditionalSchema(key, valid, false); + gen.if((0, codegen_1.not)(valid), () => { + cxt.reset(); + deleteAdditional(key); + }); + } else { + applyAdditionalSchema(key, valid); + if (!allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + } + } + function applyAdditionalSchema(key, valid, errors) { + const subschema = { + keyword: "additionalProperties", + dataProp: key, + dataPropType: util_1.Type.Str + }; + if (errors === false) { + Object.assign(subschema, { + compositeRule: true, + createErrors: false, + allErrors: false + }); + } + cxt.subschema(subschema, valid); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js +var require_properties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var validate_1 = require_validate2(); + var code_1 = require_code4(); + var util_1 = require_util2(); + var additionalProperties_1 = require_additionalProperties2(); + var def = { + keyword: "properties", + type: "object", + schemaType: "object", + code(cxt) { + const { gen, schema, parentSchema, data, it } = cxt; + if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === void 0) { + additionalProperties_1.default.code(new validate_1.KeywordCxt(it, additionalProperties_1.default, "additionalProperties")); + } + const allProps = (0, code_1.allSchemaProperties)(schema); + for (const prop of allProps) { + it.definedProperties.add(prop); + } + if (it.opts.unevaluated && allProps.length && it.props !== true) { + it.props = util_1.mergeEvaluated.props(gen, (0, util_1.toHash)(allProps), it.props); + } + const properties = allProps.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p])); + if (properties.length === 0) + return; + const valid = gen.name("valid"); + for (const prop of properties) { + if (hasDefault(prop)) { + applyPropertySchema(prop); + } else { + gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties)); + applyPropertySchema(prop); + if (!it.allErrors) + gen.else().var(valid, true); + gen.endIf(); + } + cxt.it.definedProperties.add(prop); + cxt.ok(valid); + } + function hasDefault(prop) { + return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== void 0; + } + function applyPropertySchema(prop) { + cxt.subschema({ + keyword: "properties", + schemaProp: prop, + dataProp: prop + }, valid); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +var require_patternProperties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var util_2 = require_util2(); + var def = { + keyword: "patternProperties", + type: "object", + schemaType: "object", + code(cxt) { + const { gen, schema, data, parentSchema, it } = cxt; + const { opts } = it; + const patterns = (0, code_1.allSchemaProperties)(schema); + const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p])); + if (patterns.length === 0 || alwaysValidPatterns.length === patterns.length && (!it.opts.unevaluated || it.props === true)) { + return; + } + const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties; + const valid = gen.name("valid"); + if (it.props !== true && !(it.props instanceof codegen_1.Name)) { + it.props = (0, util_2.evaluatedPropsToName)(gen, it.props); + } + const { props } = it; + validatePatternProperties(); + function validatePatternProperties() { + for (const pat of patterns) { + if (checkProperties) + checkMatchingProperties(pat); + if (it.allErrors) { + validateProperties(pat); + } else { + gen.var(valid, true); + validateProperties(pat); + gen.if(valid); + } + } + } + function checkMatchingProperties(pat) { + for (const prop in checkProperties) { + if (new RegExp(pat).test(prop)) { + (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`); + } + } + } + function validateProperties(pat) { + gen.forIn("key", data, (key) => { + gen.if((0, codegen_1._)`${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => { + const alwaysValid = alwaysValidPatterns.includes(pat); + if (!alwaysValid) { + cxt.subschema({ + keyword: "patternProperties", + schemaProp: pat, + dataProp: key, + dataPropType: util_2.Type.Str + }, valid); + } + if (it.opts.unevaluated && props !== true) { + gen.assign((0, codegen_1._)`${props}[${key}]`, true); + } else if (!alwaysValid && !it.allErrors) { + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + }); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js +var require_not2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util2(); + var def = { + keyword: "not", + schemaType: ["object", "boolean"], + trackErrors: true, + code(cxt) { + const { gen, schema, it } = cxt; + if ((0, util_1.alwaysValidSchema)(it, schema)) { + cxt.fail(); + return; + } + const valid = gen.name("valid"); + cxt.subschema({ + keyword: "not", + compositeRule: true, + createErrors: false, + allErrors: false + }, valid); + cxt.failResult(valid, () => cxt.reset(), () => cxt.error()); + }, + error: { message: "must NOT be valid" } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +var require_anyOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var def = { + keyword: "anyOf", + schemaType: "array", + trackErrors: true, + code: code_1.validateUnion, + error: { message: "must match a schema in anyOf" } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +var require_oneOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: "must match exactly one schema in oneOf", + params: ({ params }) => (0, codegen_1._)`{passingSchemas: ${params.passing}}` + }; + var def = { + keyword: "oneOf", + schemaType: "array", + trackErrors: true, + error: error61, + code(cxt) { + const { gen, schema, parentSchema, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + if (it.opts.discriminator && parentSchema.discriminator) + return; + const schArr = schema; + const valid = gen.let("valid", false); + const passing = gen.let("passing", null); + const schValid = gen.name("_valid"); + cxt.setParams({ passing }); + gen.block(validateOneOf); + cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); + function validateOneOf() { + schArr.forEach((sch, i) => { + let schCxt; + if ((0, util_1.alwaysValidSchema)(it, sch)) { + gen.var(schValid, true); + } else { + schCxt = cxt.subschema({ + keyword: "oneOf", + schemaProp: i, + compositeRule: true + }, schValid); + } + if (i > 0) { + gen.if((0, codegen_1._)`${schValid} && ${valid}`).assign(valid, false).assign(passing, (0, codegen_1._)`[${passing}, ${i}]`).else(); + } + gen.if(schValid, () => { + gen.assign(valid, true); + gen.assign(passing, i); + if (schCxt) + cxt.mergeEvaluated(schCxt, codegen_1.Name); + }); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js +var require_allOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util2(); + var def = { + keyword: "allOf", + schemaType: "array", + code(cxt) { + const { gen, schema, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const valid = gen.name("valid"); + schema.forEach((sch, i) => { + if ((0, util_1.alwaysValidSchema)(it, sch)) + return; + const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid); + cxt.ok(valid); + cxt.mergeEvaluated(schCxt); + }); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js +var require_if2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`, + params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}` + }; + var def = { + keyword: "if", + schemaType: ["object", "boolean"], + trackErrors: true, + error: error61, + code(cxt) { + const { gen, parentSchema, it } = cxt; + if (parentSchema.then === void 0 && parentSchema.else === void 0) { + (0, util_1.checkStrictMode)(it, '"if" without "then" and "else" is ignored'); + } + const hasThen = hasSchema(it, "then"); + const hasElse = hasSchema(it, "else"); + if (!hasThen && !hasElse) + return; + const valid = gen.let("valid", true); + const schValid = gen.name("_valid"); + validateIf(); + cxt.reset(); + if (hasThen && hasElse) { + const ifClause = gen.let("ifClause"); + cxt.setParams({ ifClause }); + gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause)); + } else if (hasThen) { + gen.if(schValid, validateClause("then")); + } else { + gen.if((0, codegen_1.not)(schValid), validateClause("else")); + } + cxt.pass(valid, () => cxt.error(true)); + function validateIf() { + const schCxt = cxt.subschema({ + keyword: "if", + compositeRule: true, + createErrors: false, + allErrors: false + }, schValid); + cxt.mergeEvaluated(schCxt); + } + function validateClause(keyword, ifClause) { + return () => { + const schCxt = cxt.subschema({ keyword }, schValid); + gen.assign(valid, schValid); + cxt.mergeValidEvaluated(schCxt, valid); + if (ifClause) + gen.assign(ifClause, (0, codegen_1._)`${keyword}`); + else + cxt.setParams({ ifClause: keyword }); + }; + } + } + }; + function hasSchema(it, keyword) { + const schema = it.schema[keyword]; + return schema !== void 0 && !(0, util_1.alwaysValidSchema)(it, schema); + } + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +var require_thenElse2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util2(); + var def = { + keyword: ["then", "else"], + schemaType: ["object", "boolean"], + code({ keyword, parentSchema, it }) { + if (parentSchema.if === void 0) + (0, util_1.checkStrictMode)(it, `"${keyword}" without "if" is ignored`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js +var require_applicator2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var additionalItems_1 = require_additionalItems2(); + var prefixItems_1 = require_prefixItems2(); + var items_1 = require_items2(); + var items2020_1 = require_items20202(); + var contains_1 = require_contains2(); + var dependencies_1 = require_dependencies2(); + var propertyNames_1 = require_propertyNames2(); + var additionalProperties_1 = require_additionalProperties2(); + var properties_1 = require_properties2(); + var patternProperties_1 = require_patternProperties2(); + var not_1 = require_not2(); + var anyOf_1 = require_anyOf2(); + var oneOf_1 = require_oneOf2(); + var allOf_1 = require_allOf2(); + var if_1 = require_if2(); + var thenElse_1 = require_thenElse2(); + function getApplicator(draft2020 = false) { + const applicator = [ + // any + not_1.default, + anyOf_1.default, + oneOf_1.default, + allOf_1.default, + if_1.default, + thenElse_1.default, + // object + propertyNames_1.default, + additionalProperties_1.default, + dependencies_1.default, + properties_1.default, + patternProperties_1.default + ]; + if (draft2020) + applicator.push(prefixItems_1.default, items2020_1.default); + else + applicator.push(additionalItems_1.default, items_1.default); + applicator.push(contains_1.default); + return applicator; + } + exports.default = getApplicator; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js +var require_format3 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`, + params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}` + }; + var def = { + keyword: "format", + type: ["number", "string"], + schemaType: "string", + $data: true, + error: error61, + code(cxt, ruleType) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + const { opts, errSchemaPath, schemaEnv, self } = it; + if (!opts.validateFormats) + return; + if ($data) + validate$DataFormat(); + else + validateFormat(); + function validate$DataFormat() { + const fmts = gen.scopeValue("formats", { + ref: self.formats, + code: opts.code.formats + }); + const fDef = gen.const("fDef", (0, codegen_1._)`${fmts}[${schemaCode}]`); + const fType = gen.let("fType"); + const format = gen.let("format"); + gen.if((0, codegen_1._)`typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._)`${fDef}.type || "string"`).assign(format, (0, codegen_1._)`${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._)`"string"`).assign(format, fDef)); + cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt())); + function unknownFmt() { + if (opts.strictSchema === false) + return codegen_1.nil; + return (0, codegen_1._)`${schemaCode} && !${format}`; + } + function invalidFmt() { + const callFormat = schemaEnv.$async ? (0, codegen_1._)`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))` : (0, codegen_1._)`${format}(${data})`; + const validData = (0, codegen_1._)`(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`; + return (0, codegen_1._)`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`; + } + } + function validateFormat() { + const formatDef = self.formats[schema]; + if (!formatDef) { + unknownFormat(); + return; + } + if (formatDef === true) + return; + const [fmtType, format, fmtRef] = getFormat(formatDef); + if (fmtType === ruleType) + cxt.pass(validCondition()); + function unknownFormat() { + if (opts.strictSchema === false) { + self.logger.warn(unknownMsg()); + return; + } + throw new Error(unknownMsg()); + function unknownMsg() { + return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`; + } + } + function getFormat(fmtDef) { + const code = fmtDef instanceof RegExp ? (0, codegen_1.regexpCode)(fmtDef) : opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(schema)}` : void 0; + const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code }); + if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) { + return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._)`${fmt}.validate`]; + } + return ["string", fmtDef, fmt]; + } + function validCondition() { + if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) { + if (!schemaEnv.$async) + throw new Error("async format in sync schema"); + return (0, codegen_1._)`await ${fmtRef}(${data})`; + } + return typeof format == "function" ? (0, codegen_1._)`${fmtRef}(${data})` : (0, codegen_1._)`${fmtRef}.test(${data})`; + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js +var require_format4 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var format_1 = require_format3(); + var format = [format_1.default]; + exports.default = format; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js +var require_metadata2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.contentVocabulary = exports.metadataVocabulary = void 0; + exports.metadataVocabulary = [ + "title", + "description", + "default", + "deprecated", + "readOnly", + "writeOnly", + "examples" + ]; + exports.contentVocabulary = [ + "contentMediaType", + "contentEncoding", + "contentSchema" + ]; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js +var require_draft72 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var core_1 = require_core4(); + var validation_1 = require_validation2(); + var applicator_1 = require_applicator2(); + var format_1 = require_format4(); + var metadata_1 = require_metadata2(); + var draft7Vocabularies = [ + core_1.default, + validation_1.default, + (0, applicator_1.default)(), + format_1.default, + metadata_1.metadataVocabulary, + metadata_1.contentVocabulary + ]; + exports.default = draft7Vocabularies; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js +var require_types2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.DiscrError = void 0; + var DiscrError; + (function(DiscrError2) { + DiscrError2["Tag"] = "tag"; + DiscrError2["Mapping"] = "mapping"; + })(DiscrError || (exports.DiscrError = DiscrError = {})); + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js +var require_discriminator2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var types_1 = require_types2(); + var compile_1 = require_compile2(); + var ref_error_1 = require_ref_error2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`, + params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}` + }; + var def = { + keyword: "discriminator", + type: "object", + schemaType: "object", + error: error61, + code(cxt) { + const { gen, data, schema, parentSchema, it } = cxt; + const { oneOf } = parentSchema; + if (!it.opts.discriminator) { + throw new Error("discriminator: requires discriminator option"); + } + const tagName = schema.propertyName; + if (typeof tagName != "string") + throw new Error("discriminator: requires propertyName"); + if (schema.mapping) + throw new Error("discriminator: mapping is not supported"); + if (!oneOf) + throw new Error("discriminator: requires oneOf keyword"); + const valid = gen.let("valid", false); + const tag = gen.const("tag", (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(tagName)}`); + gen.if((0, codegen_1._)`typeof ${tag} == "string"`, () => validateMapping(), () => cxt.error(false, { discrError: types_1.DiscrError.Tag, tag, tagName })); + cxt.ok(valid); + function validateMapping() { + const mapping = getMapping(); + gen.if(false); + for (const tagValue in mapping) { + gen.elseIf((0, codegen_1._)`${tag} === ${tagValue}`); + gen.assign(valid, applyTagSchema(mapping[tagValue])); + } + gen.else(); + cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag, tagName }); + gen.endIf(); + } + function applyTagSchema(schemaProp) { + const _valid = gen.name("valid"); + const schCxt = cxt.subschema({ keyword: "oneOf", schemaProp }, _valid); + cxt.mergeEvaluated(schCxt, codegen_1.Name); + return _valid; + } + function getMapping() { + var _a3; + const oneOfMapping = {}; + const topRequired = hasRequired(parentSchema); + let tagRequired = true; + for (let i = 0; i < oneOf.length; i++) { + let sch = oneOf[i]; + if ((sch === null || sch === void 0 ? void 0 : sch.$ref) && !(0, util_1.schemaHasRulesButRef)(sch, it.self.RULES)) { + const ref = sch.$ref; + sch = compile_1.resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref); + if (sch instanceof compile_1.SchemaEnv) + sch = sch.schema; + if (sch === void 0) + throw new ref_error_1.default(it.opts.uriResolver, it.baseId, ref); + } + const propSch = (_a3 = sch === null || sch === void 0 ? void 0 : sch.properties) === null || _a3 === void 0 ? void 0 : _a3[tagName]; + if (typeof propSch != "object") { + throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`); + } + tagRequired = tagRequired && (topRequired || hasRequired(sch)); + addMappings(propSch, i); + } + if (!tagRequired) + throw new Error(`discriminator: "${tagName}" must be required`); + return oneOfMapping; + function hasRequired({ required: required2 }) { + return Array.isArray(required2) && required2.includes(tagName); + } + function addMappings(sch, i) { + if (sch.const) { + addMapping(sch.const, i); + } else if (sch.enum) { + for (const tagValue of sch.enum) { + addMapping(tagValue, i); + } + } else { + throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`); + } + } + function addMapping(tagValue, i) { + if (typeof tagValue != "string" || tagValue in oneOfMapping) { + throw new Error(`discriminator: "${tagName}" values must be unique strings`); + } + oneOfMapping[tagValue] = i; + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json +var require_json_schema_draft_072 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { + module.exports = { + $schema: "http://json-schema.org/draft-07/schema#", + $id: "http://json-schema.org/draft-07/schema#", + title: "Core schema meta-schema", + definitions: { + schemaArray: { + type: "array", + minItems: 1, + items: { $ref: "#" } + }, + nonNegativeInteger: { + type: "integer", + minimum: 0 + }, + nonNegativeIntegerDefault0: { + allOf: [{ $ref: "#/definitions/nonNegativeInteger" }, { default: 0 }] + }, + simpleTypes: { + enum: ["array", "boolean", "integer", "null", "number", "object", "string"] + }, + stringArray: { + type: "array", + items: { type: "string" }, + uniqueItems: true, + default: [] + } + }, + type: ["object", "boolean"], + properties: { + $id: { + type: "string", + format: "uri-reference" + }, + $schema: { + type: "string", + format: "uri" + }, + $ref: { + type: "string", + format: "uri-reference" + }, + $comment: { + type: "string" + }, + title: { + type: "string" + }, + description: { + type: "string" + }, + default: true, + readOnly: { + type: "boolean", + default: false + }, + examples: { + type: "array", + items: true + }, + multipleOf: { + type: "number", + exclusiveMinimum: 0 + }, + maximum: { + type: "number" + }, + exclusiveMaximum: { + type: "number" + }, + minimum: { + type: "number" + }, + exclusiveMinimum: { + type: "number" + }, + maxLength: { $ref: "#/definitions/nonNegativeInteger" }, + minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + pattern: { + type: "string", + format: "regex" + }, + additionalItems: { $ref: "#" }, + items: { + anyOf: [{ $ref: "#" }, { $ref: "#/definitions/schemaArray" }], + default: true + }, + maxItems: { $ref: "#/definitions/nonNegativeInteger" }, + minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + uniqueItems: { + type: "boolean", + default: false + }, + contains: { $ref: "#" }, + maxProperties: { $ref: "#/definitions/nonNegativeInteger" }, + minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + required: { $ref: "#/definitions/stringArray" }, + additionalProperties: { $ref: "#" }, + definitions: { + type: "object", + additionalProperties: { $ref: "#" }, + default: {} + }, + properties: { + type: "object", + additionalProperties: { $ref: "#" }, + default: {} + }, + patternProperties: { + type: "object", + additionalProperties: { $ref: "#" }, + propertyNames: { format: "regex" }, + default: {} + }, + dependencies: { + type: "object", + additionalProperties: { + anyOf: [{ $ref: "#" }, { $ref: "#/definitions/stringArray" }] + } + }, + propertyNames: { $ref: "#" }, + const: true, + enum: { + type: "array", + items: true, + minItems: 1, + uniqueItems: true + }, + type: { + anyOf: [ + { $ref: "#/definitions/simpleTypes" }, + { + type: "array", + items: { $ref: "#/definitions/simpleTypes" }, + minItems: 1, + uniqueItems: true + } + ] + }, + format: { type: "string" }, + contentMediaType: { type: "string" }, + contentEncoding: { type: "string" }, + if: { $ref: "#" }, + then: { $ref: "#" }, + else: { $ref: "#" }, + allOf: { $ref: "#/definitions/schemaArray" }, + anyOf: { $ref: "#/definitions/schemaArray" }, + oneOf: { $ref: "#/definitions/schemaArray" }, + not: { $ref: "#" } + }, + default: true + }; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/ajv.js +var require_ajv2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/ajv.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; + var core_1 = require_core3(); + var draft7_1 = require_draft72(); + var discriminator_1 = require_discriminator2(); + var draft7MetaSchema = require_json_schema_draft_072(); + var META_SUPPORT_DATA = ["/properties"]; + var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema"; + var Ajv2 = class extends core_1.default { + _addVocabularies() { + super._addVocabularies(); + draft7_1.default.forEach((v2) => this.addVocabulary(v2)); + if (this.opts.discriminator) + this.addKeyword(discriminator_1.default); + } + _addDefaultMetaSchema() { + super._addDefaultMetaSchema(); + if (!this.opts.meta) + return; + const metaSchema = this.opts.$data ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA) : draft7MetaSchema; + this.addMetaSchema(metaSchema, META_SCHEMA_ID, false); + this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID; + } + defaultMeta() { + return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0); + } + }; + exports.Ajv = Ajv2; + module.exports = exports = Ajv2; + module.exports.Ajv = Ajv2; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = Ajv2; + var validate_1 = require_validate2(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen2(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error2(); + Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { + return validation_error_1.default; + } }); + var ref_error_1 = require_ref_error2(); + Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { + return ref_error_1.default; + } }); + } +}); + // node_modules/ajv-formats/dist/limit.js var require_limit = __commonJS({ "node_modules/ajv-formats/dist/limit.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatLimitDefinition = void 0; - var ajv_1 = require_ajv(); - var codegen_1 = require_codegen(); + var ajv_1 = require_ajv2(); + var codegen_1 = require_codegen2(); var ops = codegen_1.operators; var KWDs = { formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, @@ -7159,7 +12766,7 @@ var require_dist = __commonJS({ Object.defineProperty(exports, "__esModule", { value: true }); var formats_1 = require_formats(); var limit_1 = require_limit(); - var codegen_1 = require_codegen(); + var codegen_1 = require_codegen2(); var fullName = new codegen_1.Name("fullFormats"); var fastName = new codegen_1.Name("fastFormats"); var formatsPlugin = (ajv, opts = { keywords: true }) => { @@ -27647,10 +33254,10 @@ function isTerminal(status) { return status === "completed" || status === "failed" || status === "cancelled"; } -// node_modules/zod-to-json-schema/dist/esm/Options.js +// node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/Options.js var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use"); -// node_modules/zod-to-json-schema/dist/esm/parsers/string.js +// node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/parsers/string.js var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789"); // node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js @@ -30046,140 +35653,147 @@ function L() { return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null }; } var T = L(); -function G(u3) { - T = u3; +function G(l3) { + T = l3; } -var I = { exec: () => null }; -function d(u3, e = "") { - let t = typeof u3 == "string" ? u3 : u3.source, n = { replace: (r, i) => { +var E = { exec: () => null }; +function d(l3, e = "") { + let t = typeof l3 == "string" ? l3 : l3.source, n = { replace: (r, i) => { let s = typeof i == "string" ? i : i.source; return s = s.replace(m.caret, "$1"), t = t.replace(r, s), n; }, getRegex: () => new RegExp(t, e) }; return n; } -var m = { codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, outputLinkReplace: /\\([\[\]])/g, indentCodeCompensation: /^(\s+)(?:```)/, beginningSpace: /^\s+/, endingHash: /#$/, startingSpaceChar: /^ /, endingSpaceChar: / $/, nonSpaceChar: /[^ ]/, newLineCharGlobal: /\n/g, tabCharGlobal: /\t/g, multipleSpaceGlobal: /\s+/g, blankLine: /^[ \t]*$/, doubleBlankLine: /\n[ \t]*\n[ \t]*$/, blockquoteStart: /^ {0,3}>/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (u3) => new RegExp(`^( {0,3}${u3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}#`), htmlBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; -var be = /^(?:[ \t]*(?:\n|$))+/; -var Re = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; -var Te = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; -var E = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; -var Oe = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; +var be = (() => { + try { + return !!new RegExp("(?<=1)(?/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (l3) => new RegExp(`^( {0,3}${l3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}#`), htmlBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; +var Re = /^(?:[ \t]*(?:\n|$))+/; +var Te = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; +var Oe = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; +var I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; +var we = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; var F = /(?:[*+-]|\d{1,9}[.)])/; var ie = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/; var oe = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(); -var we = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); +var ye = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); var j = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; -var ye = /^[^\n]+/; +var Pe = /^[^\n]+/; var Q = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/; -var Pe = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); -var Se = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); +var Se = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); +var $e = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); var v = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; var U = /|$))/; -var $e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); -var ae = d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var _e = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); -var K = { blockquote: _e, code: Re, def: Pe, fences: Te, heading: Oe, hr: E, html: $e, lheading: oe, list: Se, newline: be, paragraph: ae, table: I, text: ye }; -var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var Le = { ...K, lheading: we, table: re, paragraph: d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; -var Me = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: I, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", E).replace("heading", ` *#{1,6} *[^ +var _e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); +var ae = d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var Le = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); +var K = { blockquote: Le, code: Te, def: Se, fences: Oe, heading: we, hr: I, html: _e, lheading: oe, list: $e, newline: Re, paragraph: ae, table: E, text: Pe }; +var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var Me = { ...K, lheading: ye, table: re, paragraph: d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; +var ze = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: E, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", I).replace("heading", ` *#{1,6} *[^ ]`).replace("lheading", oe).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }; -var ze = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; -var Ae = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; +var Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; +var Ee = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; var le = /^( {2,}|\\)\n(?!\s*$)/; var Ie = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g; +var Be = /(?!~)[\s\p{P}\p{S}]/u; +var qe = /(?:[^\s\p{P}\p{S}]|~)/u; +var ve = d(/link|precode-code|html/, "g").replace("link", /\[(?:[^\[\]`]|(?`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", be ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(); var ce = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/; -var ve = d(ce, "u").replace(/punct/g, D).getRegex(); -var De = d(ce, "u").replace(/punct/g, pe).getRegex(); +var De = d(ce, "u").replace(/punct/g, D).getRegex(); +var He = d(ce, "u").replace(/punct/g, pe).getRegex(); var he = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)"; -var He = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Ze = d(he, "gu").replace(/notPunctSpace/g, Be).replace(/punctSpace/g, Ce).replace(/punct/g, pe).getRegex(); -var Ge = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Ne = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); -var Fe = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); -var je = d(U).replace("(?:-->|$)", "-->").getRegex(); -var Qe = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", je).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); +var Ze = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Ge = d(he, "gu").replace(/notPunctSpace/g, qe).replace(/punctSpace/g, Be).replace(/punct/g, pe).getRegex(); +var Ne = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Fe = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); +var je = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); +var Qe = d(U).replace("(?:-->|$)", "-->").getRegex(); +var Ue = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", Qe).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); var q = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/; -var Ue = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); +var Ke = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); var de = d(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", Q).getRegex(); var ke = d(/^!?\[(ref)\](?:\[\])?/).replace("ref", Q).getRegex(); -var Ke = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); +var We = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); var se = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/; -var X = { _backpedal: I, anyPunctuation: Ne, autolink: Fe, blockSkip: qe, br: le, code: Ae, del: I, emStrongLDelim: ve, emStrongRDelimAst: He, emStrongRDelimUnd: Ge, escape: ze, link: Ue, nolink: ke, punctuation: Ee, reflink: de, reflinkSearch: Ke, tag: Qe, text: Ie, url: I }; -var We = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; -var N = { ...X, emStrongRDelimAst: Ze, emStrongLDelim: De, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; -var ge = (u3) => Je[u3]; -function w(u3, e) { +var X = { _backpedal: E, anyPunctuation: Fe, autolink: je, blockSkip: ve, br: le, code: Ee, del: E, emStrongLDelim: De, emStrongRDelimAst: Ze, emStrongRDelimUnd: Ne, escape: Ae, link: Ke, nolink: ke, punctuation: Ce, reflink: de, reflinkSearch: We, tag: Ue, text: Ie, url: E }; +var Xe = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; +var N = { ...X, emStrongRDelimAst: Ge, emStrongLDelim: He, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; +var ge = (l3) => Ve[l3]; +function w(l3, e) { if (e) { - if (m.escapeTest.test(u3)) return u3.replace(m.escapeReplace, ge); - } else if (m.escapeTestNoEncode.test(u3)) return u3.replace(m.escapeReplaceNoEncode, ge); - return u3; + if (m.escapeTest.test(l3)) return l3.replace(m.escapeReplace, ge); + } else if (m.escapeTestNoEncode.test(l3)) return l3.replace(m.escapeReplaceNoEncode, ge); + return l3; } -function J(u3) { +function J(l3) { try { - u3 = encodeURI(u3).replace(m.percentDecode, "%"); + l3 = encodeURI(l3).replace(m.percentDecode, "%"); } catch { return null; } - return u3; + return l3; } -function V(u3, e) { - let t = u3.replace(m.findPipe, (i, s, o) => { - let a = false, l = s; - for (; --l >= 0 && o[l] === "\\"; ) a = !a; - return a ? "|" : " |"; +function V(l3, e) { + let t = l3.replace(m.findPipe, (i, s, a) => { + let o = false, p = s; + for (; --p >= 0 && a[p] === "\\"; ) o = !o; + return o ? "|" : " |"; }), n = t.split(m.splitPipe), r = 0; if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e) if (n.length > e) n.splice(e); else for (; n.length < e; ) n.push(""); for (; r < n.length; r++) n[r] = n[r].trim().replace(m.slashPipe, "|"); return n; } -function z2(u3, e, t) { - let n = u3.length; +function z2(l3, e, t) { + let n = l3.length; if (n === 0) return ""; let r = 0; for (; r < n; ) { - let i = u3.charAt(n - r - 1); + let i = l3.charAt(n - r - 1); if (i === e && !t) r++; else if (i !== e && t) r++; else break; } - return u3.slice(0, n - r); + return l3.slice(0, n - r); } -function fe(u3, e) { - if (u3.indexOf(e[1]) === -1) return -1; +function fe(l3, e) { + if (l3.indexOf(e[1]) === -1) return -1; let t = 0; - for (let n = 0; n < u3.length; n++) if (u3[n] === "\\") n++; - else if (u3[n] === e[0]) t++; - else if (u3[n] === e[1] && (t--, t < 0)) return n; + for (let n = 0; n < l3.length; n++) if (l3[n] === "\\") n++; + else if (l3[n] === e[0]) t++; + else if (l3[n] === e[1] && (t--, t < 0)) return n; return t > 0 ? -2 : -1; } -function me(u3, e, t, n, r) { - let i = e.href, s = e.title || null, o = u3[1].replace(r.other.outputLinkReplace, "$1"); +function me(l3, e, t, n, r) { + let i = e.href, s = e.title || null, a = l3[1].replace(r.other.outputLinkReplace, "$1"); n.state.inLink = true; - let a = { type: u3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: o, tokens: n.inlineTokens(o) }; - return n.state.inLink = false, a; + let o = { type: l3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: a, tokens: n.inlineTokens(a) }; + return n.state.inLink = false, o; } -function Ve(u3, e, t) { - let n = u3.match(t.other.indentCodeCompensation); +function Ye(l3, e, t) { + let n = l3.match(t.other.indentCodeCompensation); if (n === null) return e; let r = n[1]; return e.split(` `).map((i) => { let s = i.match(t.other.beginningSpace); if (s === null) return i; - let [o] = s; - return o.length >= r.length ? i.slice(r.length) : i; + let [a] = s; + return a.length >= r.length ? i.slice(r.length) : i; }).join(` `); } @@ -30205,7 +35819,7 @@ var y = class { fences(e) { let t = this.rules.block.fences.exec(e); if (t) { - let n = t[0], r = Ve(n, t[3] || "", this.rules); + let n = t[0], r = Ye(n, t[3] || "", this.rules); return { type: "code", raw: n, lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2], text: r }; } } @@ -30232,19 +35846,19 @@ var y = class { `).split(` `), r = "", i = "", s = []; for (; n.length > 0; ) { - let o = false, a = [], l; - for (l = 0; l < n.length; l++) if (this.rules.other.blockquoteStart.test(n[l])) a.push(n[l]), o = true; - else if (!o) a.push(n[l]); + let a = false, o = [], p; + for (p = 0; p < n.length; p++) if (this.rules.other.blockquoteStart.test(n[p])) o.push(n[p]), a = true; + else if (!a) o.push(n[p]); else break; - n = n.slice(l); - let c = a.join(` -`), p = c.replace(this.rules.other.blockquoteSetextReplace, ` + n = n.slice(p); + let u = o.join(` +`), c = u.replace(this.rules.other.blockquoteSetextReplace, ` $1`).replace(this.rules.other.blockquoteSetextReplace2, ""); r = r ? `${r} -${c}` : c, i = i ? `${i} -${p}` : p; +${u}` : u, i = i ? `${i} +${c}` : c; let g = this.lexer.state.top; - if (this.lexer.state.top = true, this.lexer.blockTokens(p, s, true), this.lexer.state.top = g, n.length === 0) break; + if (this.lexer.state.top = true, this.lexer.blockTokens(c, s, true), this.lexer.state.top = g, n.length === 0) break; let h = s.at(-1); if (h?.type === "code") break; if (h?.type === "blockquote") { @@ -30270,45 +35884,45 @@ ${p}` : p; if (t) { let n = t[1].trim(), r = n.length > 1, i = { type: "list", raw: "", ordered: r, start: r ? +n.slice(0, -1) : "", loose: false, items: [] }; n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); - let s = this.rules.other.listItemRegex(n), o = false; + let s = this.rules.other.listItemRegex(n), a = false; for (; e; ) { - let l = false, c = "", p = ""; + let p = false, u = "", c = ""; if (!(t = s.exec(e)) || this.rules.block.hr.test(e)) break; - c = t[0], e = e.substring(c.length); + u = t[0], e = e.substring(u.length); let g = t[2].split(` `, 1)[0].replace(this.rules.other.listReplaceTabs, (H) => " ".repeat(3 * H.length)), h = e.split(` `, 1)[0], R = !g.trim(), f = 0; - if (this.options.pedantic ? (f = 2, p = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, p = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (c += h + ` -`, e = e.substring(h.length + 1), l = true), !l) { + if (this.options.pedantic ? (f = 2, c = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, c = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (u += h + ` +`, e = e.substring(h.length + 1), p = true), !p) { let H = this.rules.other.nextBulletRegex(f), ee = this.rules.other.hrRegex(f), te = this.rules.other.fencesBeginRegex(f), ne = this.rules.other.headingBeginRegex(f), xe = this.rules.other.htmlBeginRegex(f); for (; e; ) { let Z = e.split(` `, 1)[0], A; if (h = Z, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, " "), A = h) : A = h.replace(this.rules.other.tabCharGlobal, " "), te.test(h) || ne.test(h) || xe.test(h) || H.test(h) || ee.test(h)) break; - if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) p += ` + if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) c += ` ` + A.slice(f); else { if (R || g.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || te.test(g) || ne.test(g) || ee.test(g)) break; - p += ` + c += ` ` + h; } - !R && !h.trim() && (R = true), c += Z + ` + !R && !h.trim() && (R = true), u += Z + ` `, e = e.substring(Z.length + 1), g = A.slice(f); } } - i.loose || (o ? i.loose = true : this.rules.other.doubleBlankLine.test(c) && (o = true)); + i.loose || (a ? i.loose = true : this.rules.other.doubleBlankLine.test(u) && (a = true)); let O = null, Y; - this.options.gfm && (O = this.rules.other.listIsTask.exec(p), O && (Y = O[0] !== "[ ] ", p = p.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: c, task: !!O, checked: Y, loose: false, text: p, tokens: [] }), i.raw += c; + this.options.gfm && (O = this.rules.other.listIsTask.exec(c), O && (Y = O[0] !== "[ ] ", c = c.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: u, task: !!O, checked: Y, loose: false, text: c, tokens: [] }), i.raw += u; } - let a = i.items.at(-1); - if (a) a.raw = a.raw.trimEnd(), a.text = a.text.trimEnd(); + let o = i.items.at(-1); + if (o) o.raw = o.raw.trimEnd(), o.text = o.text.trimEnd(); else return; i.raw = i.raw.trimEnd(); - for (let l = 0; l < i.items.length; l++) if (this.lexer.state.top = false, i.items[l].tokens = this.lexer.blockTokens(i.items[l].text, []), !i.loose) { - let c = i.items[l].tokens.filter((g) => g.type === "space"), p = c.length > 0 && c.some((g) => this.rules.other.anyLine.test(g.raw)); - i.loose = p; + for (let p = 0; p < i.items.length; p++) if (this.lexer.state.top = false, i.items[p].tokens = this.lexer.blockTokens(i.items[p].text, []), !i.loose) { + let u = i.items[p].tokens.filter((g) => g.type === "space"), c = u.length > 0 && u.some((g) => this.rules.other.anyLine.test(g.raw)); + i.loose = c; } - if (i.loose) for (let l = 0; l < i.items.length; l++) i.items[l].loose = true; + if (i.loose) for (let p = 0; p < i.items.length; p++) i.items[p].loose = true; return i; } } @@ -30329,9 +35943,9 @@ ${p}` : p; let n = V(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(` `) : [], s = { type: "table", raw: t[0], header: [], align: [], rows: [] }; if (n.length === r.length) { - for (let o of r) this.rules.other.tableAlignRight.test(o) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(o) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(o) ? s.align.push("left") : s.align.push(null); - for (let o = 0; o < n.length; o++) s.header.push({ text: n[o], tokens: this.lexer.inline(n[o]), header: true, align: s.align[o] }); - for (let o of i) s.rows.push(V(o, s.header.length).map((a, l) => ({ text: a, tokens: this.lexer.inline(a), header: false, align: s.align[l] }))); + for (let a of r) this.rules.other.tableAlignRight.test(a) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(a) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(a) ? s.align.push("left") : s.align.push(null); + for (let a = 0; a < n.length; a++) s.header.push({ text: n[a], tokens: this.lexer.inline(n[a]), header: true, align: s.align[a] }); + for (let a of i) s.rows.push(V(a, s.header.length).map((o, p) => ({ text: o, tokens: this.lexer.inline(o), header: false, align: s.align[p] }))); return s; } } @@ -30371,8 +35985,8 @@ ${p}` : p; let s = fe(t[2], "()"); if (s === -2) return; if (s > -1) { - let a = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; - t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, a).trim(), t[3] = ""; + let o = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; + t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, o).trim(), t[3] = ""; } } let r = t[2], i = ""; @@ -30398,20 +36012,20 @@ ${p}` : p; let r = this.rules.inline.emStrongLDelim.exec(e); if (!r || r[3] && n.match(this.rules.other.unicodeAlphaNumeric)) return; if (!(r[1] || r[2] || "") || !n || this.rules.inline.punctuation.exec(n)) { - let s = [...r[0]].length - 1, o, a, l = s, c = 0, p = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; - for (p.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = p.exec(t)) != null; ) { - if (o = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !o) continue; - if (a = [...o].length, r[3] || r[4]) { - l += a; + let s = [...r[0]].length - 1, a, o, p = s, u = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + for (c.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = c.exec(t)) != null; ) { + if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a) continue; + if (o = [...a].length, r[3] || r[4]) { + p += o; continue; - } else if ((r[5] || r[6]) && s % 3 && !((s + a) % 3)) { - c += a; + } else if ((r[5] || r[6]) && s % 3 && !((s + o) % 3)) { + u += o; continue; } - if (l -= a, l > 0) continue; - a = Math.min(a, a + l + c); - let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + a); - if (Math.min(s, a) % 2) { + if (p -= o, p > 0) continue; + o = Math.min(o, o + p + u); + let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + o); + if (Math.min(s, o) % 2) { let f = h.slice(1, -1); return { type: "em", raw: h, text: f, tokens: this.lexer.inlineTokens(f) }; } @@ -30465,7 +36079,7 @@ ${p}` : p; } } }; -var x = class u { +var x = class l { tokens; options; state; @@ -30480,10 +36094,10 @@ var x = class u { return { block: C, inline: M }; } static lex(e, t) { - return new u(t).lex(e); + return new l(t).lex(e); } static lexInline(e, t) { - return new u(t).inlineTokens(e); + return new l(t).inlineTokens(e); } lex(e) { e = e.replace(m.carriageReturn, ` @@ -30557,9 +36171,9 @@ var x = class u { } let i = e; if (this.options.extensions?.startBlock) { - let s = 1 / 0, o = e.slice(1), a; - this.options.extensions.startBlock.forEach((l) => { - a = l.call({ lexer: this }, o), typeof a == "number" && a >= 0 && (s = Math.min(s, a)); + let s = 1 / 0, a = e.slice(1), o; + this.options.extensions.startBlock.forEach((p) => { + o = p.call({ lexer: this }, a), typeof o == "number" && o >= 0 && (s = Math.min(s, o)); }), s < 1 / 0 && s >= 0 && (i = e.substring(0, s + 1)); } if (this.state.top && (r = this.tokenizer.paragraph(i))) { @@ -30599,13 +36213,14 @@ var x = class u { if (o.length > 0) for (; (r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) != null; ) o.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); } for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null; ) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); - for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + let i; + for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) i = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i) + "[" + "a".repeat(r[0].length - i - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n; - let i = false, s = ""; + let s = false, a = ""; for (; e; ) { - i || (s = ""), i = false; + s || (a = ""), s = false; let o; - if (this.options.extensions?.inline?.some((l) => (o = l.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; + if (this.options.extensions?.inline?.some((u) => (o = u.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; if (o = this.tokenizer.escape(e)) { e = e.substring(o.raw.length), t.push(o); continue; @@ -30620,11 +36235,11 @@ var x = class u { } if (o = this.tokenizer.reflink(e, this.tokens.links)) { e = e.substring(o.raw.length); - let l = t.at(-1); - o.type === "text" && l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); + let u = t.at(-1); + o.type === "text" && u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); continue; } - if (o = this.tokenizer.emStrong(e, n, s)) { + if (o = this.tokenizer.emStrong(e, n, a)) { e = e.substring(o.raw.length), t.push(o); continue; } @@ -30648,25 +36263,25 @@ var x = class u { e = e.substring(o.raw.length), t.push(o); continue; } - let a = e; + let p = e; if (this.options.extensions?.startInline) { - let l = 1 / 0, c = e.slice(1), p; - this.options.extensions.startInline.forEach((g) => { - p = g.call({ lexer: this }, c), typeof p == "number" && p >= 0 && (l = Math.min(l, p)); - }), l < 1 / 0 && l >= 0 && (a = e.substring(0, l + 1)); - } - if (o = this.tokenizer.inlineText(a)) { - e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (s = o.raw.slice(-1)), i = true; - let l = t.at(-1); - l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); + let u = 1 / 0, c = e.slice(1), g; + this.options.extensions.startInline.forEach((h) => { + g = h.call({ lexer: this }, c), typeof g == "number" && g >= 0 && (u = Math.min(u, g)); + }), u < 1 / 0 && u >= 0 && (p = e.substring(0, u + 1)); + } + if (o = this.tokenizer.inlineText(p)) { + e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (a = o.raw.slice(-1)), s = true; + let u = t.at(-1); + u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); continue; } if (e) { - let l = "Infinite loop on byte: " + e.charCodeAt(0); + let u = "Infinite loop on byte: " + e.charCodeAt(0); if (this.options.silent) { - console.error(l); + console.error(u); break; - } else throw new Error(l); + } else throw new Error(u); } } return t; @@ -30709,9 +36324,9 @@ ${this.parser.parse(e)} } list(e) { let t = e.ordered, n = e.start, r = ""; - for (let o = 0; o < e.items.length; o++) { - let a = e.items[o]; - r += this.listitem(a); + for (let a = 0; a < e.items.length; a++) { + let o = e.items[a]; + r += this.listitem(o); } let i = t ? "ol" : "ul", s = t && n !== 1 ? ' start="' + n + '"' : ""; return "<" + i + s + `> @@ -30742,7 +36357,7 @@ ${this.parser.parse(e)} for (let i = 0; i < e.rows.length; i++) { let s = e.rows[i]; n = ""; - for (let o = 0; o < s.length; o++) n += this.tablecell(s[o]); + for (let a = 0; a < s.length; a++) n += this.tablecell(s[a]); r += this.tablerow({ text: n }); } return r && (r = `${r}`), `
@@ -30824,7 +36439,7 @@ var $ = class { return ""; } }; -var b = class u2 { +var b = class l2 { options; renderer; textRenderer; @@ -30832,19 +36447,19 @@ var b = class u2 { this.options = e || T, this.options.renderer = this.options.renderer || new P(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new $(); } static parse(e, t) { - return new u2(t).parse(e); + return new l2(t).parse(e); } static parseInline(e, t) { - return new u2(t).parseInline(e); + return new l2(t).parseInline(e); } parse(e, t = true) { let n = ""; for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let o = i, a = this.options.extensions.renderers[o.type].call({ parser: this }, o); - if (a !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(o.type)) { - n += a || ""; + let a = i, o = this.options.extensions.renderers[a.type].call({ parser: this }, a); + if (o !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(a.type)) { + n += o || ""; continue; } } @@ -30891,16 +36506,16 @@ var b = class u2 { continue; } case "text": { - let o = s, a = this.renderer.text(o); - for (; r + 1 < e.length && e[r + 1].type === "text"; ) o = e[++r], a += ` -` + this.renderer.text(o); - t ? n += this.renderer.paragraph({ type: "paragraph", raw: a, text: a, tokens: [{ type: "text", raw: a, text: a, escaped: true }] }) : n += a; + let a = s, o = this.renderer.text(a); + for (; r + 1 < e.length && e[r + 1].type === "text"; ) a = e[++r], o += ` +` + this.renderer.text(a); + t ? n += this.renderer.paragraph({ type: "paragraph", raw: o, text: o, tokens: [{ type: "text", raw: o, text: o, escaped: true }] }) : n += o; continue; } default: { - let o = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(o), ""; - throw new Error(o); + let a = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(a), ""; + throw new Error(a); } } } @@ -30911,9 +36526,9 @@ var b = class u2 { for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let o = this.options.extensions.renderers[i.type].call({ parser: this }, i); - if (o !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { - n += o || ""; + let a = this.options.extensions.renderers[i.type].call({ parser: this }, i); + if (a !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { + n += a || ""; continue; } } @@ -30960,9 +36575,9 @@ var b = class u2 { break; } default: { - let o = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(o), ""; - throw new Error(o); + let a = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(a), ""; + throw new Error(a); } } } @@ -31016,7 +36631,7 @@ var B = class { case "table": { let i = r; for (let s of i.header) n = n.concat(this.walkTokens(s.tokens, t)); - for (let s of i.rows) for (let o of s) n = n.concat(this.walkTokens(o.tokens, t)); + for (let s of i.rows) for (let a of s) n = n.concat(this.walkTokens(a.tokens, t)); break; } case "list": { @@ -31027,8 +36642,8 @@ var B = class { default: { let i = r; this.defaults.extensions?.childTokens?.[i.type] ? this.defaults.extensions.childTokens[i.type].forEach((s) => { - let o = i[s].flat(1 / 0); - n = n.concat(this.walkTokens(o, t)); + let a = i[s].flat(1 / 0); + n = n.concat(this.walkTokens(a, t)); }) : i.tokens && (n = n.concat(this.walkTokens(i.tokens, t))); } } @@ -31042,9 +36657,9 @@ var B = class { if (!i.name) throw new Error("extension name required"); if ("renderer" in i) { let s = t.renderers[i.name]; - s ? t.renderers[i.name] = function(...o) { - let a = i.renderer.apply(this, o); - return a === false && (a = s.apply(this, o)), a; + s ? t.renderers[i.name] = function(...a) { + let o = i.renderer.apply(this, a); + return o === false && (o = s.apply(this, a)), o; } : t.renderers[i.name] = i.renderer; } if ("tokenizer" in i) { @@ -31058,10 +36673,10 @@ var B = class { for (let s in n.renderer) { if (!(s in i)) throw new Error(`renderer '${s}' does not exist`); if (["options", "parser"].includes(s)) continue; - let o = s, a = n.renderer[o], l = i[o]; - i[o] = (...c) => { - let p = a.apply(i, c); - return p === false && (p = l.apply(i, c)), p || ""; + let a = s, o = n.renderer[a], p = i[a]; + i[a] = (...u) => { + let c = o.apply(i, u); + return c === false && (c = p.apply(i, u)), c || ""; }; } r.renderer = i; @@ -31071,10 +36686,10 @@ var B = class { for (let s in n.tokenizer) { if (!(s in i)) throw new Error(`tokenizer '${s}' does not exist`); if (["options", "rules", "lexer"].includes(s)) continue; - let o = s, a = n.tokenizer[o], l = i[o]; - i[o] = (...c) => { - let p = a.apply(i, c); - return p === false && (p = l.apply(i, c)), p; + let a = s, o = n.tokenizer[a], p = i[a]; + i[a] = (...u) => { + let c = o.apply(i, u); + return c === false && (c = p.apply(i, u)), c; }; } r.tokenizer = i; @@ -31084,30 +36699,30 @@ var B = class { for (let s in n.hooks) { if (!(s in i)) throw new Error(`hook '${s}' does not exist`); if (["options", "block"].includes(s)) continue; - let o = s, a = n.hooks[o], l = i[o]; - S.passThroughHooks.has(s) ? i[o] = (c) => { + let a = s, o = n.hooks[a], p = i[a]; + S.passThroughHooks.has(s) ? i[a] = (u) => { if (this.defaults.async && S.passThroughHooksRespectAsync.has(s)) return (async () => { - let g = await a.call(i, c); - return l.call(i, g); + let g = await o.call(i, u); + return p.call(i, g); })(); - let p = a.call(i, c); - return l.call(i, p); - } : i[o] = (...c) => { + let c = o.call(i, u); + return p.call(i, c); + } : i[a] = (...u) => { if (this.defaults.async) return (async () => { - let g = await a.apply(i, c); - return g === false && (g = await l.apply(i, c)), g; + let g = await o.apply(i, u); + return g === false && (g = await p.apply(i, u)), g; })(); - let p = a.apply(i, c); - return p === false && (p = l.apply(i, c)), p; + let c = o.apply(i, u); + return c === false && (c = p.apply(i, u)), c; }; } r.hooks = i; } if (n.walkTokens) { let i = this.defaults.walkTokens, s = n.walkTokens; - r.walkTokens = function(o) { - let a = []; - return a.push(s.call(this, o)), i && (a = a.concat(i.call(this, o))), a; + r.walkTokens = function(a) { + let o = []; + return o.push(s.call(this, a)), i && (o = o.concat(i.call(this, a))), o; }; } this.defaults = { ...this.defaults, ...r }; @@ -31124,24 +36739,24 @@ var B = class { } parseMarkdown(e) { return (n, r) => { - let i = { ...r }, s = { ...this.defaults, ...i }, o = this.onError(!!s.silent, !!s.async); - if (this.defaults.async === true && i.async === false) return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); - if (typeof n > "u" || n === null) return o(new Error("marked(): input parameter is undefined or null")); - if (typeof n != "string") return o(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); + let i = { ...r }, s = { ...this.defaults, ...i }, a = this.onError(!!s.silent, !!s.async); + if (this.defaults.async === true && i.async === false) return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + if (typeof n > "u" || n === null) return a(new Error("marked(): input parameter is undefined or null")); + if (typeof n != "string") return a(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); if (s.hooks && (s.hooks.options = s, s.hooks.block = e), s.async) return (async () => { - let a = s.hooks ? await s.hooks.preprocess(n) : n, c = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(a, s), p = s.hooks ? await s.hooks.processAllTokens(c) : c; - s.walkTokens && await Promise.all(this.walkTokens(p, s.walkTokens)); - let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); + let o = s.hooks ? await s.hooks.preprocess(n) : n, u = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(o, s), c = s.hooks ? await s.hooks.processAllTokens(u) : u; + s.walkTokens && await Promise.all(this.walkTokens(c, s.walkTokens)); + let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(c, s); return s.hooks ? await s.hooks.postprocess(h) : h; - })().catch(o); + })().catch(a); try { s.hooks && (n = s.hooks.preprocess(n)); - let l = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); - s.hooks && (l = s.hooks.processAllTokens(l)), s.walkTokens && this.walkTokens(l, s.walkTokens); - let p = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(l, s); - return s.hooks && (p = s.hooks.postprocess(p)), p; - } catch (a) { - return o(a); + let p = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); + s.hooks && (p = s.hooks.processAllTokens(p)), s.walkTokens && this.walkTokens(p, s.walkTokens); + let c = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); + return s.hooks && (c = s.hooks.postprocess(c)), c; + } catch (o) { + return a(o); } }; } @@ -31158,19 +36773,19 @@ Please report this to https://github.com/markedjs/marked.`, e) { } }; var _ = new B(); -function k(u3, e) { - return _.parse(u3, e); +function k(l3, e) { + return _.parse(l3, e); } -k.options = k.setOptions = function(u3) { - return _.setOptions(u3), k.defaults = _.defaults, G(k.defaults), k; +k.options = k.setOptions = function(l3) { + return _.setOptions(l3), k.defaults = _.defaults, G(k.defaults), k; }; k.getDefaults = L; k.defaults = T; -k.use = function(...u3) { - return _.use(...u3), k.defaults = _.defaults, G(k.defaults), k; +k.use = function(...l3) { + return _.use(...l3), k.defaults = _.defaults, G(k.defaults), k; }; -k.walkTokens = function(u3, e) { - return _.walkTokens(u3, e); +k.walkTokens = function(l3, e) { + return _.walkTokens(l3, e); }; k.parseInline = _.parseInline; k.Parser = b; @@ -31182,13 +36797,13 @@ k.lexer = x.lex; k.Tokenizer = y; k.Hooks = S; k.parse = k; -var Ht = k.options; -var Zt = k.setOptions; -var Gt = k.use; -var Nt = k.walkTokens; -var Ft = k.parseInline; -var Qt = b.parse; -var Ut = x.lex; +var Zt = k.options; +var Gt = k.setOptions; +var Nt = k.use; +var Ft = k.walkTokens; +var jt = k.parseInline; +var Ut = b.parse; +var Kt = x.lex; // src/show.ts function formatConversationAsMarkdown(jsonl, startLine, endLine) { diff --git a/dist/summarizer.d.ts b/dist/summarizer.d.ts index 4c97be52..30041f0b 100644 --- a/dist/summarizer.d.ts +++ b/dist/summarizer.d.ts @@ -166,8 +166,8 @@ export declare function runCodexCommand(command: CodexSummarizerCommand): Promis * * Default to `undefined` so `app-server` uses the current Codex config * (`~/.codex/config.toml#model`). Operators can override via - * `EPISODIC_MEMORY_CODEX_MODEL` if they need a specific model id (e.g. an - * API-key user wanting `gpt-5.5-codex`). + * `EPISODIC_MEMORY_CODEX_MODEL` if they need a supported model id for their + * selected Codex route. * * See https://github.com/obra/episodic-memory/issues/98. */ diff --git a/dist/summarizer.js b/dist/summarizer.js index 60719809..bd814b60 100644 --- a/dist/summarizer.js +++ b/dist/summarizer.js @@ -609,8 +609,8 @@ function getCodexSessionId(exchanges, sessionId) { * * Default to `undefined` so `app-server` uses the current Codex config * (`~/.codex/config.toml#model`). Operators can override via - * `EPISODIC_MEMORY_CODEX_MODEL` if they need a specific model id (e.g. an - * API-key user wanting `gpt-5.5-codex`). + * `EPISODIC_MEMORY_CODEX_MODEL` if they need a supported model id for their + * selected Codex route. * * See https://github.com/obra/episodic-memory/issues/98. */ @@ -628,20 +628,19 @@ export async function summarizeConversation(exchanges, sessionId) { return 'Trivial conversation with no substantive content.'; } } - const codexSessionId = getCodexSessionId(exchanges, sessionId); - if (codexSessionId) { - try { - const result = await callCodex(buildCodexSummaryPrompt(), codexSessionId, getCodexModel(exchanges)); - return extractSummary(result); - } - catch (error) { - console.log(` Codex summarizer unavailable, falling back to transcript text: ${error instanceof Error ? error.message : String(error)}`); + const isCodexConversation = exchanges.some(exchange => exchange.harness === 'codex'); + if (isCodexConversation) { + const codexSessionId = getCodexSessionId(exchanges, sessionId); + if (!codexSessionId) { + throw new Error('Codex session ID is required for a read-only summary fork'); } + const result = await callCodex(buildCodexSummaryPrompt(), codexSessionId, getCodexModel(exchanges)); + return extractSummary(result); } // Cost safety (#104): everything below this point calls the metered Claude API - // path. If a stray global ANTHROPIC_API_KEY would be billed and the user hasn't + // path. Codex conversations return or fail before reaching this point. + // If a stray global ANTHROPIC_API_KEY would be billed and the user hasn't // acknowledged it, warn once and proceed (don't silently spend without notice). - // Placed AFTER the Codex attempt so pure-Codex users are never warned needlessly. if (wouldBillMeteredApi() && !meteredApiOptIn()) { warnMeteredApiOnce(); } @@ -652,7 +651,7 @@ export async function summarizeConversation(exchanges, sessionId) { // would fail on every one before the no-resume retry kicks in. Treat // missing harness as Claude for backward compatibility with old archives. const isClaudeSession = exchanges.some(e => e.harness === 'claude' || e.harness === undefined); - const claudeSessionId = !codexSessionId && isClaudeSession ? sessionId : undefined; + const claudeSessionId = isClaudeSession ? sessionId : undefined; const cwd = claudeSessionId ? exchanges.find(e => e.cwd)?.cwd : undefined; const conversationText = claudeSessionId ? '' // When resuming, no need to include conversation text - it's already in context diff --git a/docs/CODEX.md b/docs/CODEX.md index c3d83f97..1bafc40e 100644 --- a/docs/CODEX.md +++ b/docs/CODEX.md @@ -92,4 +92,7 @@ The test creates an isolated temporary `CODEX_HOME`, copies your existing Codex Codex summaries use `codex app-server`, `thread/fork`, and `ephemeral: true`. This matters: `codex exec --ephemeral resume ` was tested and still appended to the resumed rollout, so it is not the quality bar for summarization. -If the Codex app-server summarizer is unavailable or below the support floor, Episodic Memory logs the reason and falls back to transcript-text summarization instead of silently skipping the conversation. +If the Codex app-server summarizer is unavailable, below the support floor, or +the transcript has no session ID to fork, the summary attempt fails with a +retryable error. It does not switch providers to Claude. Conversation exchanges +can still be indexed and searched without a generated summary. diff --git a/src/summarizer.ts b/src/summarizer.ts index d7e3cc04..988124e1 100644 --- a/src/summarizer.ts +++ b/src/summarizer.ts @@ -693,8 +693,8 @@ function getCodexSessionId(exchanges: ConversationExchange[], sessionId?: string * * Default to `undefined` so `app-server` uses the current Codex config * (`~/.codex/config.toml#model`). Operators can override via - * `EPISODIC_MEMORY_CODEX_MODEL` if they need a specific model id (e.g. an - * API-key user wanting `gpt-5.5-codex`). + * `EPISODIC_MEMORY_CODEX_MODEL` if they need a supported model id for their + * selected Codex route. * * See https://github.com/obra/episodic-memory/issues/98. */ @@ -715,20 +715,20 @@ export async function summarizeConversation(exchanges: ConversationExchange[], s } } - const codexSessionId = getCodexSessionId(exchanges, sessionId); - if (codexSessionId) { - try { - const result = await callCodex(buildCodexSummaryPrompt(), codexSessionId, getCodexModel(exchanges)); - return extractSummary(result); - } catch (error) { - console.log(` Codex summarizer unavailable, falling back to transcript text: ${error instanceof Error ? error.message : String(error)}`); + const isCodexConversation = exchanges.some(exchange => exchange.harness === 'codex'); + if (isCodexConversation) { + const codexSessionId = getCodexSessionId(exchanges, sessionId); + if (!codexSessionId) { + throw new Error('Codex session ID is required for a read-only summary fork'); } + const result = await callCodex(buildCodexSummaryPrompt(), codexSessionId, getCodexModel(exchanges)); + return extractSummary(result); } // Cost safety (#104): everything below this point calls the metered Claude API - // path. If a stray global ANTHROPIC_API_KEY would be billed and the user hasn't + // path. Codex conversations return or fail before reaching this point. + // If a stray global ANTHROPIC_API_KEY would be billed and the user hasn't // acknowledged it, warn once and proceed (don't silently spend without notice). - // Placed AFTER the Codex attempt so pure-Codex users are never warned needlessly. if (wouldBillMeteredApi() && !meteredApiOptIn()) { warnMeteredApiOnce(); } @@ -742,7 +742,7 @@ export async function summarizeConversation(exchanges: ConversationExchange[], s const isClaudeSession = exchanges.some( e => e.harness === 'claude' || e.harness === undefined ); - const claudeSessionId = !codexSessionId && isClaudeSession ? sessionId : undefined; + const claudeSessionId = isClaudeSession ? sessionId : undefined; const cwd = claudeSessionId ? exchanges.find(e => e.cwd)?.cwd : undefined; const conversationText = claudeSessionId ? '' // When resuming, no need to include conversation text - it's already in context diff --git a/test/codex-no-fallback.test.ts b/test/codex-no-fallback.test.ts new file mode 100644 index 00000000..0a6332c3 --- /dev/null +++ b/test/codex-no-fallback.test.ts @@ -0,0 +1,63 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import type { ConversationExchange } from '../src/types.js'; + +vi.mock('@anthropic-ai/claude-agent-sdk', () => ({ query: vi.fn() })); +import { query } from '@anthropic-ai/claude-agent-sdk'; +import { summarizeConversation } from '../src/summarizer.js'; + +describe('Codex summary provider boundary', () => { + let directory: string; + let previous: NodeJS.ProcessEnv; + + beforeEach(() => { + previous = { ...process.env }; + directory = fs.mkdtempSync(path.join(os.tmpdir(), 'em-codex-no-fallback-')); + process.env.EPISODIC_MEMORY_CONFIG_DIR = directory; + process.env.EPISODIC_MEMORY_CODEX_BIN = path.join(directory, 'missing-codex'); + vi.mocked(query).mockReset(); + }); + + afterEach(() => { + process.env = previous; + fs.rmSync(directory, { recursive: true, force: true }); + }); + + it('does not call Claude when Codex app-server is unavailable', async () => { + vi.mocked(query).mockReturnValue({ + async *[Symbol.asyncIterator]() { + yield { type: 'result', is_error: false, result: 'Unexpected Claude fallback.' }; + }, + } as any); + const exchange: ConversationExchange = { + id: 'codex-1', project: 'fixture', timestamp: '2026-01-01T00:00:00Z', + userMessage: 'Explain the design decisions behind the memory index and the safe summary route in this project.', + assistantMessage: 'The index uses line high-water marks and summaries are generated only after provider admission.', + archivePath: path.join(directory, 'session.jsonl'), lineStart: 1, lineEnd: 2, + harness: 'codex', sessionId: '00000000-1111-4222-8333-444444444444', + }; + + await expect(summarizeConversation([exchange], exchange.sessionId)).rejects.toThrow(); + expect(query).not.toHaveBeenCalled(); + }); + + it('keeps a Codex transcript without a session ID on the Codex route', async () => { + vi.mocked(query).mockReturnValue({ + async *[Symbol.asyncIterator]() { + yield { type: 'result', is_error: false, result: 'Unexpected Claude fallback.' }; + }, + } as any); + const exchange: ConversationExchange = { + id: 'codex-no-id', project: 'fixture', timestamp: '2026-01-01T00:00:00Z', + userMessage: 'Explain the design decisions behind the memory index and the safe summary route in this project.', + assistantMessage: 'The index uses line high-water marks and summaries are generated only after provider admission.', + archivePath: path.join(directory, 'session.jsonl'), lineStart: 1, lineEnd: 2, + harness: 'codex', + }; + + await expect(summarizeConversation([exchange])).rejects.toThrow(/session ID/); + expect(query).not.toHaveBeenCalled(); + }); +}); From 9c9173a68ad30ee04d67f30920c7d25c73a694d4 Mon Sep 17 00:00:00 2001 From: HengYang Date: Sat, 26 Sep 2026 13:43:03 +0800 Subject: [PATCH 03/33] feat(admission): enforce record exclusions at ingestion and recall --- README.md | 128 +- dist/db.js | 5 + dist/indexer.js | 30 +- dist/mcp-server.js | 7470 ++++++++++++++++++++++--- dist/parser.js | 41 +- dist/record-admission.d.ts | 43 + dist/record-admission.js | 636 +++ dist/search.js | 118 +- dist/show-cli.js | 4 +- dist/show.js | 5 +- dist/summarizer.d.ts | 6 +- dist/summarizer.js | 104 +- dist/sync-cli.js | 13 +- dist/sync.d.ts | 11 +- dist/sync.js | 81 +- dist/verify.js | 4 + src/db.ts | 4 + src/indexer.ts | 24 +- src/mcp-server.ts | 3 +- src/parser.ts | 41 +- src/record-admission.ts | 561 ++ src/search.ts | 125 +- src/show-cli.ts | 4 +- src/show.ts | 5 +- src/summarizer.ts | 97 +- src/sync-cli.ts | 12 +- src/sync.ts | 80 +- src/verify.ts | 4 + test/mcp-server.test.ts | 73 +- test/record-admission.test.ts | 421 ++ test/record-screening.test.ts | 270 + test/search-admission.test.ts | 185 + test/setup-isolated-config.ts | 1 + test/summarizer-options.test.ts | 65 + test/sync-cli-single-instance.test.ts | 18 + test/sync.test.ts | 8 +- test/verify.test.ts | 7 + 37 files changed, 9587 insertions(+), 1120 deletions(-) create mode 100644 dist/record-admission.d.ts create mode 100644 dist/record-admission.js create mode 100644 src/record-admission.ts create mode 100644 test/record-admission.test.ts create mode 100644 test/record-screening.test.ts create mode 100644 test/search-admission.test.ts diff --git a/README.md b/README.md index ee952317..ed2f4fa7 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,21 @@ Semantic search for Claude Code, Codex, Cursor, opencode, and Oh My Pi (OMP) conversations. Remember past discussions, decisions, and patterns. +## Recall admission + +Search rechecks the current record-exclusion policy and configured credential scanner, +including rows indexed before the policy changed. Excluded hits do not consume the +requested result limit. A stale whole-conversation summary is omitted if any of its +source records or tool calls is excluded; safe neighboring exchanges remain searchable. + +Conversation opt-out markers are read from decoded user text, including JSON escapes. +Assistant quotations and tool outputs do not opt out the conversation. Tool-result +blocks inside a user envelope are still tool output. Malformed legacy text retains +conservative marker handling, and unreadable or oversized records fail closed. +Ranged reads retain physical line coordinates without materializing unrelated message bodies. +Original transcripts are never rewritten. Source and policy changes during a search +abort the result rather than returning a partially validated view. + ## Testimonial From an AI coding assistant's perspective: @@ -417,14 +432,14 @@ open output.html ## Excluding Conversations -Conversations containing this marker anywhere in their content will be archived but not indexed: +Conversations with this marker in a decoded user instruction are excluded before new archive copying, parsing, and indexing: ``` DO NOT INDEX THIS CHAT ``` **Automatic exclusions:** -- Conversations where Claude generates summaries (marker in system prompt) +- Summarizer-generated conversations carrying the marker in their prompt - Meta-conversations about conversation processing **Use cases:** @@ -433,7 +448,114 @@ Conversations containing this marker anywhere in their content will be archived - Test or experimental sessions - Any conversation you don't want searchable -The marker can appear in any message (user or assistant) and excludes the entire conversation from the search index. +The marker in user instructions prevents new derived copies and indexing; an assistant quotation or tool result does not opt out the conversation. It does not delete an existing archive or index entry. + +### Persistent record exclusions + +`record-exclusions.json` in the existing configuration directory defines exact +records that must not enter new derived archives, parser output, summaries, or +database insertions. It is independent of `CONVERSATION_SEARCH_EXCLUDE_PROJECTS`; +that environment variable cannot replace or disable record exclusions. + +```json +{ + "version": 1, + "exchanges": [ + { + "session_id": "00000000-1111-4222-8333-444444444444", + "transcript": "rollout-00000000-1111-4222-8333-444444444444.jsonl", + "line_start": 4, + "line_end": 5 + } + ], + "tool_calls": [ + { + "session_id": "00000000-1111-4222-8333-444444444444", + "transcript": "rollout-00000000-1111-4222-8333-444444444444.jsonl", + "call_id": "call-example" + } + ] +} +``` + +Line ranges are inclusive physical JSONL coordinates in the original transcript. +Excluded records become empty lines in a derived copy, preserving later line +numbers. Session identity, exact transcript basename and native tool-call identity, not +a machine-specific absolute path, bind the policy. Sibling subagent transcripts +sharing a parent session are separate subjects. Safe text blocks remain when only a tool block +is excluded. Original transcripts are never changed. + +Malformed, unreadable, symlinked or oversized policy files reject admission. +When a policy is present, unchanged source timestamps do not bypass a fresh +admission decision. Source/archive aliasing and changing input are rejected. +The marker scan and record stream use the same descriptor; source identity is +checked during and after streaming. Direct database insertion checks both the +transcript identity and historical session metadata, which may name an ancestor. +The foreground sync CLI exits nonzero for per-file admission errors and does not +claim successful synchronization or start embedding migration after those errors. +Full, session and incremental indexing, repair, MCP reads and the display CLI use +the same admission boundary. Display pagination retains physical line numbers. +An absent policy retains ordinary behavior; deleting the policy intentionally +removes its protection, so maintain it as private operator configuration. + +Summarization with a record policy uses admitted transcript text, never a resumed +source session. Codex retains its selected provider through an ephemeral fresh +context and fails rather than silently falling back to another provider. Claude +receives the admitted text without session resume. Policy-enabled Codex summaries +require Codex 0.154.0 or newer. The isolated summary path disables inherited +tools, plugins, hooks, and skills, and refuses to proceed if the configured +MCP or skill boundary cannot be established. It uses a temporary empty working +directory; provider error payloads are suppressed and the directory is removed +after process termination. + +### Optional local secret screening + +Add an optional `screening` object to the same policy to reject newly detected +content before derived archive writes, reads, summaries and database insertion: + +```json +"screening": { + "engine": "gitleaks", + "executable": "/absolute/resolved/path/to/gitleaks", + "sha256": "<64 lowercase hex characters from the trusted executable>", + "timeout_ms": 2000, + "max_record_bytes": 1048576 +} +``` + +Keep the existing `version`, `exchanges` and `tool_calls` fields. Install Gitleaks +through a trusted package source, resolve its executable symlink and verify its provenance before pinning its +SHA-256. On migration or upgrade, explicitly replace the host-local path and +digest after verifying the new executable. The scanner must be a regular, +executable file owned by the current user or root and not group/world-writable. +Do not copy credential stores or an old host's executable-path assumption. + +Exact exclusions run first. Each remaining physical record is screened locally +with the pinned Gitleaks built-in rules. Nested JSON strings are decoded while +retaining key/value assignment context; separate exchange messages are screened +separately. A finding rejects the operation rather than silently dropping a new +message and breaking conversation pairing. Missing/changed executables, byte or +nesting limits, timeouts and malformed or contradictory reports fail closed. +No findings, input, scanner diagnostics or secret fingerprints appear in errors. +The scanner receives stdin in a private empty working directory with no inherited +environment/configuration and with inline allow comments disabled. Its temporary +directory is removed after execution. Original transcripts and previously +published archives remain unchanged when admission fails. + +Screening launches a bounded subprocess per record; it is not an unbounded bulk +collection service. Measure a finite representative batch before large imports. +No automatic sync or background job is enabled by this setting. Before enabling +it, replace all policy consumers with this version through their native lifecycle: +older strict-schema consumers reject the additional field. Installing a plugin +does not replace already-loaded code, so do not enable the field while protected +old consumers still require the previous schema. + +Without `screening`, this policy remains an exact exclusion mechanism. Even with +screening, pattern matching does not prove universal unknown-secret absence, +purge preexisting derived data, rewrite original +sessions, or retroactively filter already-loaded code. Old randomly generated +tool-row IDs need verified native source-call mapping before policy migration; +do not broaden those entries to whole sessions or claim a complete migration. ## MCP Server diff --git a/dist/db.js b/dist/db.js index 83f546ad..a5bba7e3 100644 --- a/dist/db.js +++ b/dist/db.js @@ -1,4 +1,5 @@ import Database from 'better-sqlite3'; +import { admitExchange } from './record-admission.js'; import path from 'path'; import fs from 'fs'; import * as sqliteVec from 'sqlite-vec'; @@ -186,6 +187,10 @@ export function initDatabase() { return db; } export function insertExchange(db, exchange, embedding, toolNames) { + const admitted = admitExchange(exchange); + if (!admitted) + return; + exchange = admitted; const now = Date.now(); const stmt = db.prepare(` INSERT OR REPLACE INTO exchanges diff --git a/dist/indexer.js b/dist/indexer.js index 8afa1d35..c5c42e13 100644 --- a/dist/indexer.js +++ b/dist/indexer.js @@ -1,4 +1,5 @@ import fs from 'fs'; +import { archiveAdmittedConversation, readRecordExclusions } from './record-admission.js'; import path from 'path'; import { initDatabase, insertExchange } from './db.js'; import { parseConversation } from './parser.js'; @@ -26,6 +27,7 @@ function sessionIdForSummary(exchanges) { return exchanges.find(exchange => exchange.sessionId)?.sessionId; } export async function indexConversations(limitToProject, maxConversations, concurrency = 1, noSummaries = false) { + readRecordExclusions(); console.log('Initializing database...'); const db = initDatabase(); console.log('Loading embedding model...'); @@ -74,15 +76,16 @@ export async function indexConversations(limitToProject, maxConversations, concu let exchanges; try { // Copy to archive (ensure parent dirs exist for subagent files) - if (!fs.existsSync(archivePath)) { - fs.mkdirSync(path.dirname(archivePath), { recursive: true }); - fs.copyFileSync(sourcePath, archivePath); + if (await archiveAdmittedConversation(sourcePath, archivePath)) console.log(` Archived: ${file}`); - } // Parse conversation exchanges = await parseConversation(sourcePath, project, archivePath); } catch (error) { + if (error.code !== 'ENOENT') { + db.close(); + throw error; + } console.log(` Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); continue; } @@ -159,6 +162,7 @@ export async function indexConversations(limitToProject, maxConversations, concu console.log(`\n✅ Indexing complete! Conversations: ${conversationsProcessed}, Exchanges: ${totalExchanges}`); } export async function indexSession(sessionId, concurrency = 1, noSummaries = false) { + readRecordExclusions(); console.log(`Indexing session: ${sessionId}`); // Find the conversation file for this session const sourceDirs = getConversationSourceDirs(); @@ -187,15 +191,14 @@ export async function indexSession(sessionId, concurrency = 1, noSummaries = fal // Archive + parse — source may vanish mid-run (Claude Code cleanup). let exchanges; try { - if (!fs.existsSync(archivePath)) { - fs.mkdirSync(path.dirname(archivePath), { recursive: true }); - fs.copyFileSync(sourcePath, archivePath); - } + await archiveAdmittedConversation(sourcePath, archivePath); exchanges = await parseConversation(sourcePath, project, archivePath); } catch (error) { - console.log(`Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); db.close(); + if (error.code !== 'ENOENT') + throw error; + console.log(`Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); break; } if (exchanges.length > 0) { @@ -249,6 +252,7 @@ export async function indexSession(sessionId, concurrency = 1, noSummaries = fal } } export async function indexUnprocessed(concurrency = 1, noSummaries = false) { + readRecordExclusions(); console.log('Finding unprocessed conversations...'); if (concurrency > 1) console.log(`Concurrency: ${concurrency}`); @@ -284,9 +288,7 @@ export async function indexUnprocessed(concurrency = 1, noSummaries = false) { try { fs.mkdirSync(path.dirname(archivePath), { recursive: true }); // Refresh the archive when the source may have grown beyond what we've seen. - if (!fs.existsSync(archivePath) || maxIndexedLine > 0) { - fs.copyFileSync(sourcePath, archivePath); - } + await archiveAdmittedConversation(sourcePath, archivePath); // Parse and filter to exchanges past the high-water mark const exchanges = await parseConversation(sourcePath, project, archivePath); const newExchanges = maxIndexedLine > 0 @@ -297,6 +299,10 @@ export async function indexUnprocessed(concurrency = 1, noSummaries = false) { unprocessed.push({ project, file, sourcePath, archivePath, summaryPath, exchanges: newExchanges }); } catch (error) { + if (error.code !== 'ENOENT') { + db.close(); + throw error; + } console.log(` Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); continue; } diff --git a/dist/mcp-server.js b/dist/mcp-server.js index e3a9adac..d0c94d05 100644 --- a/dist/mcp-server.js +++ b/dist/mcp-server.js @@ -6,7 +6,11 @@ var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + try { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + } catch (e) { + throw mod = 0, e; + } }; var __export = (target, all) => { for (var name in all) @@ -29,9 +33,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge mod )); -// node_modules/ajv/dist/compile/codegen/code.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js var require_code = __commonJS({ - "node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; @@ -183,9 +187,9 @@ var require_code = __commonJS({ } }); -// node_modules/ajv/dist/compile/codegen/scope.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js var require_scope = __commonJS({ - "node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; @@ -328,9 +332,9 @@ var require_scope = __commonJS({ } }); -// node_modules/ajv/dist/compile/codegen/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js var require_codegen = __commonJS({ - "node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; @@ -1048,9 +1052,9 @@ var require_codegen = __commonJS({ } }); -// node_modules/ajv/dist/compile/util.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js var require_util = __commonJS({ - "node_modules/ajv/dist/compile/util.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; @@ -1215,9 +1219,9 @@ var require_util = __commonJS({ } }); -// node_modules/ajv/dist/compile/names.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js var require_names = __commonJS({ - "node_modules/ajv/dist/compile/names.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -1254,9 +1258,9 @@ var require_names = __commonJS({ } }); -// node_modules/ajv/dist/compile/errors.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js var require_errors = __commonJS({ - "node_modules/ajv/dist/compile/errors.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; @@ -1376,9 +1380,9 @@ var require_errors = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/boolSchema.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js var require_boolSchema = __commonJS({ - "node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; @@ -1427,9 +1431,9 @@ var require_boolSchema = __commonJS({ } }); -// node_modules/ajv/dist/compile/rules.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js var require_rules = __commonJS({ - "node_modules/ajv/dist/compile/rules.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getRules = exports.isJSONType = void 0; @@ -1458,9 +1462,9 @@ var require_rules = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/applicability.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js var require_applicability = __commonJS({ - "node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; @@ -1481,9 +1485,9 @@ var require_applicability = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/dataType.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js var require_dataType = __commonJS({ - "node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; @@ -1665,9 +1669,9 @@ var require_dataType = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/defaults.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js var require_defaults = __commonJS({ - "node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.assignDefaults = void 0; @@ -1702,9 +1706,9 @@ var require_defaults = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/code.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js var require_code2 = __commonJS({ - "node_modules/ajv/dist/vocabularies/code.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; @@ -1775,13 +1779,13 @@ var require_code2 = __commonJS({ exports.callValidateCode = callValidateCode; var newRegExp = (0, codegen_1._)`new RegExp`; function usePattern({ gen, it: { opts } }, pattern) { - const u3 = opts.unicodeRegExp ? "u" : ""; + const u = opts.unicodeRegExp ? "u" : ""; const { regExp } = opts.code; - const rx = regExp(pattern, u3); + const rx = regExp(pattern, u); return gen.scopeValue("pattern", { key: rx.toString(), ref: rx, - code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u3})` + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` }); } exports.usePattern = usePattern; @@ -1835,9 +1839,9 @@ var require_code2 = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/keyword.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js var require_keyword = __commonJS({ - "node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; @@ -1953,9 +1957,9 @@ var require_keyword = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/subschema.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js var require_subschema = __commonJS({ - "node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; @@ -2044,7 +2048,7 @@ var require_fast_deep_equal = __commonJS({ if (a === b2) return true; if (a && b2 && typeof a == "object" && typeof b2 == "object") { if (a.constructor !== b2.constructor) return false; - var length, i, keys; + var length, i, keys2; if (Array.isArray(a)) { length = a.length; if (length != b2.length) return false; @@ -2055,13 +2059,13 @@ var require_fast_deep_equal = __commonJS({ if (a.constructor === RegExp) return a.source === b2.source && a.flags === b2.flags; if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b2.valueOf(); if (a.toString !== Object.prototype.toString) return a.toString() === b2.toString(); - keys = Object.keys(a); - length = keys.length; + keys2 = Object.keys(a); + length = keys2.length; if (length !== Object.keys(b2).length) return false; for (i = length; i-- !== 0; ) - if (!Object.prototype.hasOwnProperty.call(b2, keys[i])) return false; + if (!Object.prototype.hasOwnProperty.call(b2, keys2[i])) return false; for (i = length; i-- !== 0; ) { - var key = keys[i]; + var key = keys2[i]; if (!equal(a[key], b2[key])) return false; } return true; @@ -2159,9 +2163,9 @@ var require_json_schema_traverse = __commonJS({ } }); -// node_modules/ajv/dist/compile/resolve.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js var require_resolve = __commonJS({ - "node_modules/ajv/dist/compile/resolve.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; @@ -2315,9 +2319,9 @@ var require_resolve = __commonJS({ } }); -// node_modules/ajv/dist/compile/validate/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js var require_validate = __commonJS({ - "node_modules/ajv/dist/compile/validate/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; @@ -2823,9 +2827,9 @@ var require_validate = __commonJS({ } }); -// node_modules/ajv/dist/runtime/validation_error.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js var require_validation_error = __commonJS({ - "node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ValidationError = class extends Error { @@ -2839,9 +2843,9 @@ var require_validation_error = __commonJS({ } }); -// node_modules/ajv/dist/compile/ref_error.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js var require_ref_error = __commonJS({ - "node_modules/ajv/dist/compile/ref_error.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var resolve_1 = require_resolve(); @@ -2856,9 +2860,9 @@ var require_ref_error = __commonJS({ } }); -// node_modules/ajv/dist/compile/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js var require_compile = __commonJS({ - "node_modules/ajv/dist/compile/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; @@ -3080,9 +3084,9 @@ var require_compile = __commonJS({ } }); -// node_modules/ajv/dist/refs/data.json +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json var require_data = __commonJS({ - "node_modules/ajv/dist/refs/data.json"(exports, module) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json"(exports, module) { module.exports = { $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", @@ -3258,8 +3262,8 @@ var require_utils = __commonJS({ } return ind; } - function removeDotSegments(path3) { - let input2 = path3; + function removeDotSegments(path4) { + let input2 = path4; const output2 = []; let nextSlash = -1; let len = 0; @@ -3668,8 +3672,8 @@ var require_schemes = __commonJS({ } if (wsComponent.resourceName) { const queryIndex = wsComponent.resourceName.indexOf("?"); - const path3 = queryIndex === -1 ? wsComponent.resourceName : wsComponent.resourceName.slice(0, queryIndex); - wsComponent.path = path3 && path3 !== "/" ? path3 : void 0; + const path4 = queryIndex === -1 ? wsComponent.resourceName : wsComponent.resourceName.slice(0, queryIndex); + wsComponent.path = path4 && path4 !== "/" ? path4 : void 0; wsComponent.query = queryIndex === -1 ? void 0 : wsComponent.resourceName.slice(queryIndex + 1); wsComponent.resourceName = void 0; } @@ -4217,9 +4221,9 @@ var require_fast_uri = __commonJS({ } }); -// node_modules/ajv/dist/runtime/uri.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js var require_uri = __commonJS({ - "node_modules/ajv/dist/runtime/uri.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var uri = require_fast_uri(); @@ -4228,9 +4232,9 @@ var require_uri = __commonJS({ } }); -// node_modules/ajv/dist/core.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js var require_core = __commonJS({ - "node_modules/ajv/dist/core.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; @@ -4839,9 +4843,9 @@ var require_core = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/core/id.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js var require_id = __commonJS({ - "node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var def = { @@ -4854,9 +4858,9 @@ var require_id = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/core/ref.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js var require_ref = __commonJS({ - "node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.callRef = exports.getValidate = void 0; @@ -4976,9 +4980,9 @@ var require_ref = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/core/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js var require_core2 = __commonJS({ - "node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var id_1 = require_id(); @@ -4997,9 +5001,9 @@ var require_core2 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitNumber.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js var require_limitNumber = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5029,9 +5033,9 @@ var require_limitNumber = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/multipleOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js var require_multipleOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5057,9 +5061,9 @@ var require_multipleOf = __commonJS({ } }); -// node_modules/ajv/dist/runtime/ucs2length.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js var require_ucs2length = __commonJS({ - "node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function ucs2length(str) { @@ -5083,9 +5087,9 @@ var require_ucs2length = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitLength.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js var require_limitLength = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5115,9 +5119,9 @@ var require_limitLength = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/pattern.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js var require_pattern = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5135,12 +5139,12 @@ var require_pattern = __commonJS({ error: error61, code(cxt) { const { gen, data, $data, schema, schemaCode, it } = cxt; - const u3 = it.opts.unicodeRegExp ? "u" : ""; + const u = it.opts.unicodeRegExp ? "u" : ""; if ($data) { const { regExp } = it.opts.code; const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); const valid = gen.let("valid"); - gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u3}).test(${data})`), () => gen.assign(valid, false)); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); cxt.fail$data((0, codegen_1._)`!${valid}`); } else { const regExp = (0, code_1.usePattern)(cxt, schema); @@ -5152,9 +5156,9 @@ var require_pattern = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitProperties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js var require_limitProperties = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5181,9 +5185,9 @@ var require_limitProperties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/required.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js var require_required = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5263,9 +5267,9 @@ var require_required = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/limitItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js var require_limitItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5292,9 +5296,9 @@ var require_limitItems = __commonJS({ } }); -// node_modules/ajv/dist/runtime/equal.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js var require_equal = __commonJS({ - "node_modules/ajv/dist/runtime/equal.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var equal = require_fast_deep_equal(); @@ -5303,9 +5307,9 @@ var require_equal = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js var require_uniqueItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var dataType_1 = require_dataType(); @@ -5370,9 +5374,9 @@ var require_uniqueItems = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/const.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js var require_const = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5399,9 +5403,9 @@ var require_const = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/enum.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js var require_enum = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5448,9 +5452,9 @@ var require_enum = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/validation/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js var require_validation = __commonJS({ - "node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var limitNumber_1 = require_limitNumber(); @@ -5486,9 +5490,9 @@ var require_validation = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js var require_additionalItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateAdditionalItems = void 0; @@ -5539,9 +5543,9 @@ var require_additionalItems = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/items.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js var require_items = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateTuple = void 0; @@ -5583,10 +5587,10 @@ var require_items = __commonJS({ }); function checkStrictTuple(sch) { const { opts, errSchemaPath } = it; - const l = schArr.length; - const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false); + const l3 = schArr.length; + const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); if (opts.strictTuples && !fullTuple) { - const msg = `"${keyword}" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); } } @@ -5596,9 +5600,9 @@ var require_items = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js var require_prefixItems = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var items_1 = require_items(); @@ -5613,9 +5617,9 @@ var require_prefixItems = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/items2020.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js var require_items2020 = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5648,9 +5652,9 @@ var require_items2020 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/contains.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js var require_contains = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5742,9 +5746,9 @@ var require_contains = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/dependencies.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js var require_dependencies = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; @@ -5836,9 +5840,9 @@ var require_dependencies = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js var require_propertyNames = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5879,9 +5883,9 @@ var require_propertyNames = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js var require_additionalProperties = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5985,9 +5989,9 @@ var require_additionalProperties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/properties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js var require_properties = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var validate_1 = require_validate(); @@ -6043,9 +6047,9 @@ var require_properties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js var require_patternProperties = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6117,9 +6121,9 @@ var require_patternProperties = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/not.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js var require_not = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6148,9 +6152,9 @@ var require_not = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/anyOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js var require_anyOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6165,9 +6169,9 @@ var require_anyOf = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/oneOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js var require_oneOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6223,9 +6227,9 @@ var require_oneOf = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/allOf.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js var require_allOf = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6250,9 +6254,9 @@ var require_allOf = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/if.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js var require_if = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6319,9 +6323,9 @@ var require_if = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/thenElse.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js var require_thenElse = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6337,9 +6341,9 @@ var require_thenElse = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/applicator/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js var require_applicator = __commonJS({ - "node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var additionalItems_1 = require_additionalItems(); @@ -6385,9 +6389,9 @@ var require_applicator = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/format/format.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js var require_format = __commonJS({ - "node_modules/ajv/dist/vocabularies/format/format.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6475,9 +6479,9 @@ var require_format = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/format/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js var require_format2 = __commonJS({ - "node_modules/ajv/dist/vocabularies/format/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var format_1 = require_format(); @@ -6486,9 +6490,9 @@ var require_format2 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/metadata.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js var require_metadata = __commonJS({ - "node_modules/ajv/dist/vocabularies/metadata.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.contentVocabulary = exports.metadataVocabulary = void 0; @@ -6509,9 +6513,9 @@ var require_metadata = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/draft7.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js var require_draft7 = __commonJS({ - "node_modules/ajv/dist/vocabularies/draft7.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var core_1 = require_core2(); @@ -6531,9 +6535,9 @@ var require_draft7 = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/discriminator/types.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js var require_types = __commonJS({ - "node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DiscrError = void 0; @@ -6545,9 +6549,9 @@ var require_types = __commonJS({ } }); -// node_modules/ajv/dist/vocabularies/discriminator/index.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js var require_discriminator = __commonJS({ - "node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6650,9 +6654,9 @@ var require_discriminator = __commonJS({ } }); -// node_modules/ajv/dist/refs/json-schema-draft-07.json +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json var require_json_schema_draft_07 = __commonJS({ - "node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { module.exports = { $schema: "http://json-schema.org/draft-07/schema#", $id: "http://json-schema.org/draft-07/schema#", @@ -6807,9 +6811,9 @@ var require_json_schema_draft_07 = __commonJS({ } }); -// node_modules/ajv/dist/ajv.js +// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js var require_ajv = __commonJS({ - "node_modules/ajv/dist/ajv.js"(exports, module) { + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js"(exports, module) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; @@ -6843,11 +6847,5821 @@ var require_ajv = __commonJS({ module.exports.Ajv = Ajv2; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Ajv2; - var validate_1 = require_validate(); + var validate_1 = require_validate(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error(); + Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { + return validation_error_1.default; + } }); + var ref_error_1 = require_ref_error(); + Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { + return ref_error_1.default; + } }); + } +}); + +// node_modules/ajv-formats/dist/formats.js +var require_formats = __commonJS({ + "node_modules/ajv-formats/dist/formats.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.formatNames = exports.fastFormats = exports.fullFormats = void 0; + function fmtDef(validate2, compare) { + return { validate: validate2, compare }; + } + exports.fullFormats = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: fmtDef(date5, compareDate), + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: fmtDef(getTime(true), compareTime), + "date-time": fmtDef(getDateTime(true), compareDateTime), + "iso-time": fmtDef(getTime(), compareIsoTime), + "iso-date-time": fmtDef(getDateTime(), compareIsoDateTime), + // duration: https://tools.ietf.org/html/rfc3339#appendix-A + duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, + uri, + "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i, + // uri-template: https://tools.ietf.org/html/rfc6570 + "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i, + // For the source: https://gist.github.com/dperini/729294 + // For test cases: https://mathiasbynens.be/demo/url-regex + url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/, + ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, + regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/, + "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/, + // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types + // byte: https://github.com/miguelmota/is-base64 + byte, + // signed 32 bit integer + int32: { type: "number", validate: validateInt32 }, + // signed 64 bit integer + int64: { type: "number", validate: validateInt64 }, + // C-type float + float: { type: "number", validate: validateNumber }, + // C-type double + double: { type: "number", validate: validateNumber }, + // hint to the UI to hide input strings + password: true, + // unchecked string payload + binary: true + }; + exports.fastFormats = { + ...exports.fullFormats, + date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate), + time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime), + "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), + "iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime), + "iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime), + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, + "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i + }; + exports.formatNames = Object.keys(exports.fullFormats); + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; + var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function date5(str) { + const matches = DATE.exec(str); + if (!matches) + return false; + const year = +matches[1]; + const month = +matches[2]; + const day = +matches[3]; + return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]); + } + function compareDate(d1, d2) { + if (!(d1 && d2)) + return void 0; + if (d1 > d2) + return 1; + if (d1 < d2) + return -1; + return 0; + } + var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i; + function getTime(strictTimeZone) { + return function time3(str) { + const matches = TIME.exec(str); + if (!matches) + return false; + const hr = +matches[1]; + const min = +matches[2]; + const sec = +matches[3]; + const tz = matches[4]; + const tzSign = matches[5] === "-" ? -1 : 1; + const tzH = +(matches[6] || 0); + const tzM = +(matches[7] || 0); + if (tzH > 23 || tzM > 59 || strictTimeZone && !tz) + return false; + if (hr <= 23 && min <= 59 && sec < 60) + return true; + const utcMin = min - tzM * tzSign; + const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0); + return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61; + }; + } + function compareTime(s1, s2) { + if (!(s1 && s2)) + return void 0; + const t1 = (/* @__PURE__ */ new Date("2020-01-01T" + s1)).valueOf(); + const t2 = (/* @__PURE__ */ new Date("2020-01-01T" + s2)).valueOf(); + if (!(t1 && t2)) + return void 0; + return t1 - t2; + } + function compareIsoTime(t1, t2) { + if (!(t1 && t2)) + return void 0; + const a1 = TIME.exec(t1); + const a2 = TIME.exec(t2); + if (!(a1 && a2)) + return void 0; + t1 = a1[1] + a1[2] + a1[3]; + t2 = a2[1] + a2[2] + a2[3]; + if (t1 > t2) + return 1; + if (t1 < t2) + return -1; + return 0; + } + var DATE_TIME_SEPARATOR = /t|\s/i; + function getDateTime(strictTimeZone) { + const time3 = getTime(strictTimeZone); + return function date_time(str) { + const dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length === 2 && date5(dateTime[0]) && time3(dateTime[1]); + }; + } + function compareDateTime(dt1, dt2) { + if (!(dt1 && dt2)) + return void 0; + const d1 = new Date(dt1).valueOf(); + const d2 = new Date(dt2).valueOf(); + if (!(d1 && d2)) + return void 0; + return d1 - d2; + } + function compareIsoDateTime(dt1, dt2) { + if (!(dt1 && dt2)) + return void 0; + const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR); + const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR); + const res = compareDate(d1, d2); + if (res === void 0) + return void 0; + return res || compareTime(t1, t2); + } + var NOT_URI_FRAGMENT = /\/|:/; + var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; + function uri(str) { + return NOT_URI_FRAGMENT.test(str) && URI.test(str); + } + var BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm; + function byte(str) { + BYTE.lastIndex = 0; + return BYTE.test(str); + } + var MIN_INT32 = -(2 ** 31); + var MAX_INT32 = 2 ** 31 - 1; + function validateInt32(value) { + return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32; + } + function validateInt64(value) { + return Number.isInteger(value); + } + function validateNumber() { + return true; + } + var Z_ANCHOR = /[^\\]\\Z/; + function regex(str) { + if (Z_ANCHOR.test(str)) + return false; + try { + new RegExp(str); + return true; + } catch (e) { + return false; + } + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js +var require_code3 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; + var _CodeOrName = class { + }; + exports._CodeOrName = _CodeOrName; + exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; + var Name = class extends _CodeOrName { + constructor(s) { + super(); + if (!exports.IDENTIFIER.test(s)) + throw new Error("CodeGen: name must be a valid identifier"); + this.str = s; + } + toString() { + return this.str; + } + emptyStr() { + return false; + } + get names() { + return { [this.str]: 1 }; + } + }; + exports.Name = Name; + var _Code = class extends _CodeOrName { + constructor(code) { + super(); + this._items = typeof code === "string" ? [code] : code; + } + toString() { + return this.str; + } + emptyStr() { + if (this._items.length > 1) + return false; + const item = this._items[0]; + return item === "" || item === '""'; + } + get str() { + var _a3; + return (_a3 = this._str) !== null && _a3 !== void 0 ? _a3 : this._str = this._items.reduce((s, c) => `${s}${c}`, ""); + } + get names() { + var _a3; + return (_a3 = this._names) !== null && _a3 !== void 0 ? _a3 : this._names = this._items.reduce((names, c) => { + if (c instanceof Name) + names[c.str] = (names[c.str] || 0) + 1; + return names; + }, {}); + } + }; + exports._Code = _Code; + exports.nil = new _Code(""); + function _2(strs, ...args) { + const code = [strs[0]]; + let i = 0; + while (i < args.length) { + addCodeArg(code, args[i]); + code.push(strs[++i]); + } + return new _Code(code); + } + exports._ = _2; + var plus = new _Code("+"); + function str(strs, ...args) { + const expr = [safeStringify(strs[0])]; + let i = 0; + while (i < args.length) { + expr.push(plus); + addCodeArg(expr, args[i]); + expr.push(plus, safeStringify(strs[++i])); + } + optimize(expr); + return new _Code(expr); + } + exports.str = str; + function addCodeArg(code, arg) { + if (arg instanceof _Code) + code.push(...arg._items); + else if (arg instanceof Name) + code.push(arg); + else + code.push(interpolate(arg)); + } + exports.addCodeArg = addCodeArg; + function optimize(expr) { + let i = 1; + while (i < expr.length - 1) { + if (expr[i] === plus) { + const res = mergeExprItems(expr[i - 1], expr[i + 1]); + if (res !== void 0) { + expr.splice(i - 1, 3, res); + continue; + } + expr[i++] = "+"; + } + i++; + } + } + function mergeExprItems(a, b2) { + if (b2 === '""') + return a; + if (a === '""') + return b2; + if (typeof a == "string") { + if (b2 instanceof Name || a[a.length - 1] !== '"') + return; + if (typeof b2 != "string") + return `${a.slice(0, -1)}${b2}"`; + if (b2[0] === '"') + return a.slice(0, -1) + b2.slice(1); + return; + } + if (typeof b2 == "string" && b2[0] === '"' && !(a instanceof Name)) + return `"${a}${b2.slice(1)}`; + return; + } + function strConcat(c1, c2) { + return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str`${c1}${c2}`; + } + exports.strConcat = strConcat; + function interpolate(x2) { + return typeof x2 == "number" || typeof x2 == "boolean" || x2 === null ? x2 : safeStringify(Array.isArray(x2) ? x2.join(",") : x2); + } + function stringify(x2) { + return new _Code(safeStringify(x2)); + } + exports.stringify = stringify; + function safeStringify(x2) { + return JSON.stringify(x2).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); + } + exports.safeStringify = safeStringify; + function getProperty(key) { + return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _2`[${key}]`; + } + exports.getProperty = getProperty; + function getEsmExportName(key) { + if (typeof key == "string" && exports.IDENTIFIER.test(key)) { + return new _Code(`${key}`); + } + throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`); + } + exports.getEsmExportName = getEsmExportName; + function regexpCode(rx) { + return new _Code(rx.toString()); + } + exports.regexpCode = regexpCode; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js +var require_scope2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; + var code_1 = require_code3(); + var ValueError = class extends Error { + constructor(name) { + super(`CodeGen: "code" for ${name} not defined`); + this.value = name.value; + } + }; + var UsedValueState; + (function(UsedValueState2) { + UsedValueState2[UsedValueState2["Started"] = 0] = "Started"; + UsedValueState2[UsedValueState2["Completed"] = 1] = "Completed"; + })(UsedValueState || (exports.UsedValueState = UsedValueState = {})); + exports.varKinds = { + const: new code_1.Name("const"), + let: new code_1.Name("let"), + var: new code_1.Name("var") + }; + var Scope = class { + constructor({ prefixes, parent } = {}) { + this._names = {}; + this._prefixes = prefixes; + this._parent = parent; + } + toName(nameOrPrefix) { + return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix); + } + name(prefix) { + return new code_1.Name(this._newName(prefix)); + } + _newName(prefix) { + const ng = this._names[prefix] || this._nameGroup(prefix); + return `${prefix}${ng.index++}`; + } + _nameGroup(prefix) { + var _a3, _b; + if (((_b = (_a3 = this._parent) === null || _a3 === void 0 ? void 0 : _a3._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || this._prefixes && !this._prefixes.has(prefix)) { + throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`); + } + return this._names[prefix] = { prefix, index: 0 }; + } + }; + exports.Scope = Scope; + var ValueScopeName = class extends code_1.Name { + constructor(prefix, nameStr) { + super(nameStr); + this.prefix = prefix; + } + setValue(value, { property, itemIndex }) { + this.value = value; + this.scopePath = (0, code_1._)`.${new code_1.Name(property)}[${itemIndex}]`; + } + }; + exports.ValueScopeName = ValueScopeName; + var line = (0, code_1._)`\n`; + var ValueScope = class extends Scope { + constructor(opts) { + super(opts); + this._values = {}; + this._scope = opts.scope; + this.opts = { ...opts, _n: opts.lines ? line : code_1.nil }; + } + get() { + return this._scope; + } + name(prefix) { + return new ValueScopeName(prefix, this._newName(prefix)); + } + value(nameOrPrefix, value) { + var _a3; + if (value.ref === void 0) + throw new Error("CodeGen: ref must be passed in value"); + const name = this.toName(nameOrPrefix); + const { prefix } = name; + const valueKey = (_a3 = value.key) !== null && _a3 !== void 0 ? _a3 : value.ref; + let vs = this._values[prefix]; + if (vs) { + const _name = vs.get(valueKey); + if (_name) + return _name; + } else { + vs = this._values[prefix] = /* @__PURE__ */ new Map(); + } + vs.set(valueKey, name); + const s = this._scope[prefix] || (this._scope[prefix] = []); + const itemIndex = s.length; + s[itemIndex] = value.ref; + name.setValue(value, { property: prefix, itemIndex }); + return name; + } + getValue(prefix, keyOrRef) { + const vs = this._values[prefix]; + if (!vs) + return; + return vs.get(keyOrRef); + } + scopeRefs(scopeName, values = this._values) { + return this._reduceValues(values, (name) => { + if (name.scopePath === void 0) + throw new Error(`CodeGen: name "${name}" has no value`); + return (0, code_1._)`${scopeName}${name.scopePath}`; + }); + } + scopeCode(values = this._values, usedValues, getCode) { + return this._reduceValues(values, (name) => { + if (name.value === void 0) + throw new Error(`CodeGen: name "${name}" has no value`); + return name.value.code; + }, usedValues, getCode); + } + _reduceValues(values, valueCode, usedValues = {}, getCode) { + let code = code_1.nil; + for (const prefix in values) { + const vs = values[prefix]; + if (!vs) + continue; + const nameSet = usedValues[prefix] = usedValues[prefix] || /* @__PURE__ */ new Map(); + vs.forEach((name) => { + if (nameSet.has(name)) + return; + nameSet.set(name, UsedValueState.Started); + let c = valueCode(name); + if (c) { + const def = this.opts.es5 ? exports.varKinds.var : exports.varKinds.const; + code = (0, code_1._)`${code}${def} ${name} = ${c};${this.opts._n}`; + } else if (c = getCode === null || getCode === void 0 ? void 0 : getCode(name)) { + code = (0, code_1._)`${code}${c}${this.opts._n}`; + } else { + throw new ValueError(name); + } + nameSet.set(name, UsedValueState.Completed); + }); + } + return code; + } + }; + exports.ValueScope = ValueScope; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js +var require_codegen2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; + var code_1 = require_code3(); + var scope_1 = require_scope2(); + var code_2 = require_code3(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return code_2._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return code_2.str; + } }); + Object.defineProperty(exports, "strConcat", { enumerable: true, get: function() { + return code_2.strConcat; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return code_2.nil; + } }); + Object.defineProperty(exports, "getProperty", { enumerable: true, get: function() { + return code_2.getProperty; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return code_2.stringify; + } }); + Object.defineProperty(exports, "regexpCode", { enumerable: true, get: function() { + return code_2.regexpCode; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return code_2.Name; + } }); + var scope_2 = require_scope2(); + Object.defineProperty(exports, "Scope", { enumerable: true, get: function() { + return scope_2.Scope; + } }); + Object.defineProperty(exports, "ValueScope", { enumerable: true, get: function() { + return scope_2.ValueScope; + } }); + Object.defineProperty(exports, "ValueScopeName", { enumerable: true, get: function() { + return scope_2.ValueScopeName; + } }); + Object.defineProperty(exports, "varKinds", { enumerable: true, get: function() { + return scope_2.varKinds; + } }); + exports.operators = { + GT: new code_1._Code(">"), + GTE: new code_1._Code(">="), + LT: new code_1._Code("<"), + LTE: new code_1._Code("<="), + EQ: new code_1._Code("==="), + NEQ: new code_1._Code("!=="), + NOT: new code_1._Code("!"), + OR: new code_1._Code("||"), + AND: new code_1._Code("&&"), + ADD: new code_1._Code("+") + }; + var Node = class { + optimizeNodes() { + return this; + } + optimizeNames(_names, _constants) { + return this; + } + }; + var Def = class extends Node { + constructor(varKind, name, rhs) { + super(); + this.varKind = varKind; + this.name = name; + this.rhs = rhs; + } + render({ es5, _n }) { + const varKind = es5 ? scope_1.varKinds.var : this.varKind; + const rhs = this.rhs === void 0 ? "" : ` = ${this.rhs}`; + return `${varKind} ${this.name}${rhs};` + _n; + } + optimizeNames(names, constants) { + if (!names[this.name.str]) + return; + if (this.rhs) + this.rhs = optimizeExpr(this.rhs, names, constants); + return this; + } + get names() { + return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {}; + } + }; + var Assign = class extends Node { + constructor(lhs, rhs, sideEffects) { + super(); + this.lhs = lhs; + this.rhs = rhs; + this.sideEffects = sideEffects; + } + render({ _n }) { + return `${this.lhs} = ${this.rhs};` + _n; + } + optimizeNames(names, constants) { + if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects) + return; + this.rhs = optimizeExpr(this.rhs, names, constants); + return this; + } + get names() { + const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names }; + return addExprNames(names, this.rhs); + } + }; + var AssignOp = class extends Assign { + constructor(lhs, op, rhs, sideEffects) { + super(lhs, rhs, sideEffects); + this.op = op; + } + render({ _n }) { + return `${this.lhs} ${this.op}= ${this.rhs};` + _n; + } + }; + var Label = class extends Node { + constructor(label) { + super(); + this.label = label; + this.names = {}; + } + render({ _n }) { + return `${this.label}:` + _n; + } + }; + var Break = class extends Node { + constructor(label) { + super(); + this.label = label; + this.names = {}; + } + render({ _n }) { + const label = this.label ? ` ${this.label}` : ""; + return `break${label};` + _n; + } + }; + var Throw = class extends Node { + constructor(error61) { + super(); + this.error = error61; + } + render({ _n }) { + return `throw ${this.error};` + _n; + } + get names() { + return this.error.names; + } + }; + var AnyCode = class extends Node { + constructor(code) { + super(); + this.code = code; + } + render({ _n }) { + return `${this.code};` + _n; + } + optimizeNodes() { + return `${this.code}` ? this : void 0; + } + optimizeNames(names, constants) { + this.code = optimizeExpr(this.code, names, constants); + return this; + } + get names() { + return this.code instanceof code_1._CodeOrName ? this.code.names : {}; + } + }; + var ParentNode = class extends Node { + constructor(nodes = []) { + super(); + this.nodes = nodes; + } + render(opts) { + return this.nodes.reduce((code, n) => code + n.render(opts), ""); + } + optimizeNodes() { + const { nodes } = this; + let i = nodes.length; + while (i--) { + const n = nodes[i].optimizeNodes(); + if (Array.isArray(n)) + nodes.splice(i, 1, ...n); + else if (n) + nodes[i] = n; + else + nodes.splice(i, 1); + } + return nodes.length > 0 ? this : void 0; + } + optimizeNames(names, constants) { + const { nodes } = this; + let i = nodes.length; + while (i--) { + const n = nodes[i]; + if (n.optimizeNames(names, constants)) + continue; + subtractNames(names, n.names); + nodes.splice(i, 1); + } + return nodes.length > 0 ? this : void 0; + } + get names() { + return this.nodes.reduce((names, n) => addNames(names, n.names), {}); + } + }; + var BlockNode = class extends ParentNode { + render(opts) { + return "{" + opts._n + super.render(opts) + "}" + opts._n; + } + }; + var Root = class extends ParentNode { + }; + var Else = class extends BlockNode { + }; + Else.kind = "else"; + var If = class _If extends BlockNode { + constructor(condition, nodes) { + super(nodes); + this.condition = condition; + } + render(opts) { + let code = `if(${this.condition})` + super.render(opts); + if (this.else) + code += "else " + this.else.render(opts); + return code; + } + optimizeNodes() { + super.optimizeNodes(); + const cond = this.condition; + if (cond === true) + return this.nodes; + let e = this.else; + if (e) { + const ns = e.optimizeNodes(); + e = this.else = Array.isArray(ns) ? new Else(ns) : ns; + } + if (e) { + if (cond === false) + return e instanceof _If ? e : e.nodes; + if (this.nodes.length) + return this; + return new _If(not(cond), e instanceof _If ? [e] : e.nodes); + } + if (cond === false || !this.nodes.length) + return void 0; + return this; + } + optimizeNames(names, constants) { + var _a3; + this.else = (_a3 = this.else) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); + if (!(super.optimizeNames(names, constants) || this.else)) + return; + this.condition = optimizeExpr(this.condition, names, constants); + return this; + } + get names() { + const names = super.names; + addExprNames(names, this.condition); + if (this.else) + addNames(names, this.else.names); + return names; + } + }; + If.kind = "if"; + var For = class extends BlockNode { + }; + For.kind = "for"; + var ForLoop = class extends For { + constructor(iteration) { + super(); + this.iteration = iteration; + } + render(opts) { + return `for(${this.iteration})` + super.render(opts); + } + optimizeNames(names, constants) { + if (!super.optimizeNames(names, constants)) + return; + this.iteration = optimizeExpr(this.iteration, names, constants); + return this; + } + get names() { + return addNames(super.names, this.iteration.names); + } + }; + var ForRange = class extends For { + constructor(varKind, name, from, to) { + super(); + this.varKind = varKind; + this.name = name; + this.from = from; + this.to = to; + } + render(opts) { + const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind; + const { name, from, to } = this; + return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts); + } + get names() { + const names = addExprNames(super.names, this.from); + return addExprNames(names, this.to); + } + }; + var ForIter = class extends For { + constructor(loop, varKind, name, iterable) { + super(); + this.loop = loop; + this.varKind = varKind; + this.name = name; + this.iterable = iterable; + } + render(opts) { + return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts); + } + optimizeNames(names, constants) { + if (!super.optimizeNames(names, constants)) + return; + this.iterable = optimizeExpr(this.iterable, names, constants); + return this; + } + get names() { + return addNames(super.names, this.iterable.names); + } + }; + var Func = class extends BlockNode { + constructor(name, args, async) { + super(); + this.name = name; + this.args = args; + this.async = async; + } + render(opts) { + const _async = this.async ? "async " : ""; + return `${_async}function ${this.name}(${this.args})` + super.render(opts); + } + }; + Func.kind = "func"; + var Return = class extends ParentNode { + render(opts) { + return "return " + super.render(opts); + } + }; + Return.kind = "return"; + var Try = class extends BlockNode { + render(opts) { + let code = "try" + super.render(opts); + if (this.catch) + code += this.catch.render(opts); + if (this.finally) + code += this.finally.render(opts); + return code; + } + optimizeNodes() { + var _a3, _b; + super.optimizeNodes(); + (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNodes(); + (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes(); + return this; + } + optimizeNames(names, constants) { + var _a3, _b; + super.optimizeNames(names, constants); + (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); + (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants); + return this; + } + get names() { + const names = super.names; + if (this.catch) + addNames(names, this.catch.names); + if (this.finally) + addNames(names, this.finally.names); + return names; + } + }; + var Catch = class extends BlockNode { + constructor(error61) { + super(); + this.error = error61; + } + render(opts) { + return `catch(${this.error})` + super.render(opts); + } + }; + Catch.kind = "catch"; + var Finally = class extends BlockNode { + render(opts) { + return "finally" + super.render(opts); + } + }; + Finally.kind = "finally"; + var CodeGen = class { + constructor(extScope, opts = {}) { + this._values = {}; + this._blockStarts = []; + this._constants = {}; + this.opts = { ...opts, _n: opts.lines ? "\n" : "" }; + this._extScope = extScope; + this._scope = new scope_1.Scope({ parent: extScope }); + this._nodes = [new Root()]; + } + toString() { + return this._root.render(this.opts); + } + // returns unique name in the internal scope + name(prefix) { + return this._scope.name(prefix); + } + // reserves unique name in the external scope + scopeName(prefix) { + return this._extScope.name(prefix); + } + // reserves unique name in the external scope and assigns value to it + scopeValue(prefixOrName, value) { + const name = this._extScope.value(prefixOrName, value); + const vs = this._values[name.prefix] || (this._values[name.prefix] = /* @__PURE__ */ new Set()); + vs.add(name); + return name; + } + getScopeValue(prefix, keyOrRef) { + return this._extScope.getValue(prefix, keyOrRef); + } + // return code that assigns values in the external scope to the names that are used internally + // (same names that were returned by gen.scopeName or gen.scopeValue) + scopeRefs(scopeName) { + return this._extScope.scopeRefs(scopeName, this._values); + } + scopeCode() { + return this._extScope.scopeCode(this._values); + } + _def(varKind, nameOrPrefix, rhs, constant) { + const name = this._scope.toName(nameOrPrefix); + if (rhs !== void 0 && constant) + this._constants[name.str] = rhs; + this._leafNode(new Def(varKind, name, rhs)); + return name; + } + // `const` declaration (`var` in es5 mode) + const(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant); + } + // `let` declaration with optional assignment (`var` in es5 mode) + let(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant); + } + // `var` declaration with optional assignment + var(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant); + } + // assignment code + assign(lhs, rhs, sideEffects) { + return this._leafNode(new Assign(lhs, rhs, sideEffects)); + } + // `+=` code + add(lhs, rhs) { + return this._leafNode(new AssignOp(lhs, exports.operators.ADD, rhs)); + } + // appends passed SafeExpr to code or executes Block + code(c) { + if (typeof c == "function") + c(); + else if (c !== code_1.nil) + this._leafNode(new AnyCode(c)); + return this; + } + // returns code for object literal for the passed argument list of key-value pairs + object(...keyValues) { + const code = ["{"]; + for (const [key, value] of keyValues) { + if (code.length > 1) + code.push(","); + code.push(key); + if (key !== value || this.opts.es5) { + code.push(":"); + (0, code_1.addCodeArg)(code, value); + } + } + code.push("}"); + return new code_1._Code(code); + } + // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed) + if(condition, thenBody, elseBody) { + this._blockNode(new If(condition)); + if (thenBody && elseBody) { + this.code(thenBody).else().code(elseBody).endIf(); + } else if (thenBody) { + this.code(thenBody).endIf(); + } else if (elseBody) { + throw new Error('CodeGen: "else" body without "then" body'); + } + return this; + } + // `else if` clause - invalid without `if` or after `else` clauses + elseIf(condition) { + return this._elseNode(new If(condition)); + } + // `else` clause - only valid after `if` or `else if` clauses + else() { + return this._elseNode(new Else()); + } + // end `if` statement (needed if gen.if was used only with condition) + endIf() { + return this._endBlockNode(If, Else); + } + _for(node2, forBody) { + this._blockNode(node2); + if (forBody) + this.code(forBody).endFor(); + return this; + } + // a generic `for` clause (or statement if `forBody` is passed) + for(iteration, forBody) { + return this._for(new ForLoop(iteration), forBody); + } + // `for` statement for a range of values + forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) { + const name = this._scope.toName(nameOrPrefix); + return this._for(new ForRange(varKind, name, from, to), () => forBody(name)); + } + // `for-of` statement (in es5 mode replace with a normal for loop) + forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) { + const name = this._scope.toName(nameOrPrefix); + if (this.opts.es5) { + const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable); + return this.forRange("_i", 0, (0, code_1._)`${arr}.length`, (i) => { + this.var(name, (0, code_1._)`${arr}[${i}]`); + forBody(name); + }); + } + return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name)); + } + // `for-in` statement. + // With option `ownProperties` replaced with a `for-of` loop for object keys + forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) { + if (this.opts.ownProperties) { + return this.forOf(nameOrPrefix, (0, code_1._)`Object.keys(${obj})`, forBody); + } + const name = this._scope.toName(nameOrPrefix); + return this._for(new ForIter("in", varKind, name, obj), () => forBody(name)); + } + // end `for` loop + endFor() { + return this._endBlockNode(For); + } + // `label` statement + label(label) { + return this._leafNode(new Label(label)); + } + // `break` statement + break(label) { + return this._leafNode(new Break(label)); + } + // `return` statement + return(value) { + const node2 = new Return(); + this._blockNode(node2); + this.code(value); + if (node2.nodes.length !== 1) + throw new Error('CodeGen: "return" should have one node'); + return this._endBlockNode(Return); + } + // `try` statement + try(tryBody, catchCode, finallyCode) { + if (!catchCode && !finallyCode) + throw new Error('CodeGen: "try" without "catch" and "finally"'); + const node2 = new Try(); + this._blockNode(node2); + this.code(tryBody); + if (catchCode) { + const error61 = this.name("e"); + this._currNode = node2.catch = new Catch(error61); + catchCode(error61); + } + if (finallyCode) { + this._currNode = node2.finally = new Finally(); + this.code(finallyCode); + } + return this._endBlockNode(Catch, Finally); + } + // `throw` statement + throw(error61) { + return this._leafNode(new Throw(error61)); + } + // start self-balancing block + block(body, nodeCount) { + this._blockStarts.push(this._nodes.length); + if (body) + this.code(body).endBlock(nodeCount); + return this; + } + // end the current self-balancing block + endBlock(nodeCount) { + const len = this._blockStarts.pop(); + if (len === void 0) + throw new Error("CodeGen: not in self-balancing block"); + const toClose = this._nodes.length - len; + if (toClose < 0 || nodeCount !== void 0 && toClose !== nodeCount) { + throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`); + } + this._nodes.length = len; + return this; + } + // `function` heading (or definition if funcBody is passed) + func(name, args = code_1.nil, async, funcBody) { + this._blockNode(new Func(name, args, async)); + if (funcBody) + this.code(funcBody).endFunc(); + return this; + } + // end function definition + endFunc() { + return this._endBlockNode(Func); + } + optimize(n = 1) { + while (n-- > 0) { + this._root.optimizeNodes(); + this._root.optimizeNames(this._root.names, this._constants); + } + } + _leafNode(node2) { + this._currNode.nodes.push(node2); + return this; + } + _blockNode(node2) { + this._currNode.nodes.push(node2); + this._nodes.push(node2); + } + _endBlockNode(N1, N2) { + const n = this._currNode; + if (n instanceof N1 || N2 && n instanceof N2) { + this._nodes.pop(); + return this; + } + throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`); + } + _elseNode(node2) { + const n = this._currNode; + if (!(n instanceof If)) { + throw new Error('CodeGen: "else" without "if"'); + } + this._currNode = n.else = node2; + return this; + } + get _root() { + return this._nodes[0]; + } + get _currNode() { + const ns = this._nodes; + return ns[ns.length - 1]; + } + set _currNode(node2) { + const ns = this._nodes; + ns[ns.length - 1] = node2; + } + }; + exports.CodeGen = CodeGen; + function addNames(names, from) { + for (const n in from) + names[n] = (names[n] || 0) + (from[n] || 0); + return names; + } + function addExprNames(names, from) { + return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names; + } + function optimizeExpr(expr, names, constants) { + if (expr instanceof code_1.Name) + return replaceName(expr); + if (!canOptimize(expr)) + return expr; + return new code_1._Code(expr._items.reduce((items, c) => { + if (c instanceof code_1.Name) + c = replaceName(c); + if (c instanceof code_1._Code) + items.push(...c._items); + else + items.push(c); + return items; + }, [])); + function replaceName(n) { + const c = constants[n.str]; + if (c === void 0 || names[n.str] !== 1) + return n; + delete names[n.str]; + return c; + } + function canOptimize(e) { + return e instanceof code_1._Code && e._items.some((c) => c instanceof code_1.Name && names[c.str] === 1 && constants[c.str] !== void 0); + } + } + function subtractNames(names, from) { + for (const n in from) + names[n] = (names[n] || 0) - (from[n] || 0); + } + function not(x2) { + return typeof x2 == "boolean" || typeof x2 == "number" || x2 === null ? !x2 : (0, code_1._)`!${par(x2)}`; + } + exports.not = not; + var andCode = mappend(exports.operators.AND); + function and(...args) { + return args.reduce(andCode); + } + exports.and = and; + var orCode = mappend(exports.operators.OR); + function or(...args) { + return args.reduce(orCode); + } + exports.or = or; + function mappend(op) { + return (x2, y2) => x2 === code_1.nil ? y2 : y2 === code_1.nil ? x2 : (0, code_1._)`${par(x2)} ${op} ${par(y2)}`; + } + function par(x2) { + return x2 instanceof code_1.Name ? x2 : (0, code_1._)`(${x2})`; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js +var require_util2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; + var codegen_1 = require_codegen2(); + var code_1 = require_code3(); + function toHash(arr) { + const hash2 = {}; + for (const item of arr) + hash2[item] = true; + return hash2; + } + exports.toHash = toHash; + function alwaysValidSchema(it, schema) { + if (typeof schema == "boolean") + return schema; + if (Object.keys(schema).length === 0) + return true; + checkUnknownRules(it, schema); + return !schemaHasRules(schema, it.self.RULES.all); + } + exports.alwaysValidSchema = alwaysValidSchema; + function checkUnknownRules(it, schema = it.schema) { + const { opts, self } = it; + if (!opts.strictSchema) + return; + if (typeof schema === "boolean") + return; + const rules = self.RULES.keywords; + for (const key in schema) { + if (!rules[key]) + checkStrictMode(it, `unknown keyword: "${key}"`); + } + } + exports.checkUnknownRules = checkUnknownRules; + function schemaHasRules(schema, rules) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (rules[key]) + return true; + return false; + } + exports.schemaHasRules = schemaHasRules; + function schemaHasRulesButRef(schema, RULES) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (key !== "$ref" && RULES.all[key]) + return true; + return false; + } + exports.schemaHasRulesButRef = schemaHasRulesButRef; + function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) { + if (!$data) { + if (typeof schema == "number" || typeof schema == "boolean") + return schema; + if (typeof schema == "string") + return (0, codegen_1._)`${schema}`; + } + return (0, codegen_1._)`${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`; + } + exports.schemaRefOrVal = schemaRefOrVal; + function unescapeFragment(str) { + return unescapeJsonPointer(decodeURIComponent(str)); + } + exports.unescapeFragment = unescapeFragment; + function escapeFragment(str) { + return encodeURIComponent(escapeJsonPointer(str)); + } + exports.escapeFragment = escapeFragment; + function escapeJsonPointer(str) { + if (typeof str == "number") + return `${str}`; + return str.replace(/~/g, "~0").replace(/\//g, "~1"); + } + exports.escapeJsonPointer = escapeJsonPointer; + function unescapeJsonPointer(str) { + return str.replace(/~1/g, "/").replace(/~0/g, "~"); + } + exports.unescapeJsonPointer = unescapeJsonPointer; + function eachItem(xs, f) { + if (Array.isArray(xs)) { + for (const x2 of xs) + f(x2); + } else { + f(xs); + } + } + exports.eachItem = eachItem; + function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues: mergeValues2, resultToName }) { + return (gen, from, to, toName) => { + const res = to === void 0 ? from : to instanceof codegen_1.Name ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to) : from instanceof codegen_1.Name ? (mergeToName(gen, to, from), from) : mergeValues2(from, to); + return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res; + }; + } + exports.mergeEvaluated = { + props: makeMergeEvaluated({ + mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => { + gen.if((0, codegen_1._)`${from} === true`, () => gen.assign(to, true), () => gen.assign(to, (0, codegen_1._)`${to} || {}`).code((0, codegen_1._)`Object.assign(${to}, ${from})`)); + }), + mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => { + if (from === true) { + gen.assign(to, true); + } else { + gen.assign(to, (0, codegen_1._)`${to} || {}`); + setEvaluated(gen, to, from); + } + }), + mergeValues: (from, to) => from === true ? true : { ...from, ...to }, + resultToName: evaluatedPropsToName + }), + items: makeMergeEvaluated({ + mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => gen.assign(to, (0, codegen_1._)`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)), + mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => gen.assign(to, from === true ? true : (0, codegen_1._)`${to} > ${from} ? ${to} : ${from}`)), + mergeValues: (from, to) => from === true ? true : Math.max(from, to), + resultToName: (gen, items) => gen.var("items", items) + }) + }; + function evaluatedPropsToName(gen, ps) { + if (ps === true) + return gen.var("props", true); + const props = gen.var("props", (0, codegen_1._)`{}`); + if (ps !== void 0) + setEvaluated(gen, props, ps); + return props; + } + exports.evaluatedPropsToName = evaluatedPropsToName; + function setEvaluated(gen, props, ps) { + Object.keys(ps).forEach((p) => gen.assign((0, codegen_1._)`${props}${(0, codegen_1.getProperty)(p)}`, true)); + } + exports.setEvaluated = setEvaluated; + var snippets = {}; + function useFunc(gen, f) { + return gen.scopeValue("func", { + ref: f, + code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code)) + }); + } + exports.useFunc = useFunc; + var Type; + (function(Type2) { + Type2[Type2["Num"] = 0] = "Num"; + Type2[Type2["Str"] = 1] = "Str"; + })(Type || (exports.Type = Type = {})); + function getErrorPath(dataProp, dataPropType, jsPropertySyntax) { + if (dataProp instanceof codegen_1.Name) { + const isNumber = dataPropType === Type.Num; + return jsPropertySyntax ? isNumber ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`; + } + return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp); + } + exports.getErrorPath = getErrorPath; + function checkStrictMode(it, msg, mode = it.opts.strictSchema) { + if (!mode) + return; + msg = `strict mode: ${msg}`; + if (mode === true) + throw new Error(msg); + it.self.logger.warn(msg); + } + exports.checkStrictMode = checkStrictMode; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js +var require_names2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var names = { + // validation function arguments + data: new codegen_1.Name("data"), + // data passed to validation function + // args passed from referencing schema + valCxt: new codegen_1.Name("valCxt"), + // validation/data context - should not be used directly, it is destructured to the names below + instancePath: new codegen_1.Name("instancePath"), + parentData: new codegen_1.Name("parentData"), + parentDataProperty: new codegen_1.Name("parentDataProperty"), + rootData: new codegen_1.Name("rootData"), + // root data - same as the data passed to the first/top validation function + dynamicAnchors: new codegen_1.Name("dynamicAnchors"), + // used to support recursiveRef and dynamicRef + // function scoped variables + vErrors: new codegen_1.Name("vErrors"), + // null or array of validation errors + errors: new codegen_1.Name("errors"), + // counter of validation errors + this: new codegen_1.Name("this"), + // "globals" + self: new codegen_1.Name("self"), + scope: new codegen_1.Name("scope"), + // JTD serialize/parse name for JSON string and position + json: new codegen_1.Name("json"), + jsonPos: new codegen_1.Name("jsonPos"), + jsonLen: new codegen_1.Name("jsonLen"), + jsonPart: new codegen_1.Name("jsonPart") + }; + exports.default = names; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js +var require_errors2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var names_1 = require_names2(); + exports.keywordError = { + message: ({ keyword }) => (0, codegen_1.str)`must pass "${keyword}" keyword validation` + }; + exports.keyword$DataError = { + message: ({ keyword, schemaType }) => schemaType ? (0, codegen_1.str)`"${keyword}" keyword must be ${schemaType} ($data)` : (0, codegen_1.str)`"${keyword}" keyword is invalid ($data)` + }; + function reportError(cxt, error61 = exports.keywordError, errorPaths, overrideAllErrors) { + const { it } = cxt; + const { gen, compositeRule, allErrors } = it; + const errObj = errorObjectCode(cxt, error61, errorPaths); + if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : compositeRule || allErrors) { + addError(gen, errObj); + } else { + returnErrors(it, (0, codegen_1._)`[${errObj}]`); + } + } + exports.reportError = reportError; + function reportExtraError(cxt, error61 = exports.keywordError, errorPaths) { + const { it } = cxt; + const { gen, compositeRule, allErrors } = it; + const errObj = errorObjectCode(cxt, error61, errorPaths); + addError(gen, errObj); + if (!(compositeRule || allErrors)) { + returnErrors(it, names_1.default.vErrors); + } + } + exports.reportExtraError = reportExtraError; + function resetErrorsCount(gen, errsCount) { + gen.assign(names_1.default.errors, errsCount); + gen.if((0, codegen_1._)`${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign((0, codegen_1._)`${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null))); + } + exports.resetErrorsCount = resetErrorsCount; + function extendErrors({ gen, keyword, schemaValue, data, errsCount, it }) { + if (errsCount === void 0) + throw new Error("ajv implementation error"); + const err = gen.name("err"); + gen.forRange("i", errsCount, names_1.default.errors, (i) => { + gen.const(err, (0, codegen_1._)`${names_1.default.vErrors}[${i}]`); + gen.if((0, codegen_1._)`${err}.instancePath === undefined`, () => gen.assign((0, codegen_1._)`${err}.instancePath`, (0, codegen_1.strConcat)(names_1.default.instancePath, it.errorPath))); + gen.assign((0, codegen_1._)`${err}.schemaPath`, (0, codegen_1.str)`${it.errSchemaPath}/${keyword}`); + if (it.opts.verbose) { + gen.assign((0, codegen_1._)`${err}.schema`, schemaValue); + gen.assign((0, codegen_1._)`${err}.data`, data); + } + }); + } + exports.extendErrors = extendErrors; + function addError(gen, errObj) { + const err = gen.const("err", errObj); + gen.if((0, codegen_1._)`${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, (0, codegen_1._)`[${err}]`), (0, codegen_1._)`${names_1.default.vErrors}.push(${err})`); + gen.code((0, codegen_1._)`${names_1.default.errors}++`); + } + function returnErrors(it, errs) { + const { gen, validateName, schemaEnv } = it; + if (schemaEnv.$async) { + gen.throw((0, codegen_1._)`new ${it.ValidationError}(${errs})`); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, errs); + gen.return(false); + } + } + var E2 = { + keyword: new codegen_1.Name("keyword"), + schemaPath: new codegen_1.Name("schemaPath"), + // also used in JTD errors + params: new codegen_1.Name("params"), + propertyName: new codegen_1.Name("propertyName"), + message: new codegen_1.Name("message"), + schema: new codegen_1.Name("schema"), + parentSchema: new codegen_1.Name("parentSchema") + }; + function errorObjectCode(cxt, error61, errorPaths) { + const { createErrors } = cxt.it; + if (createErrors === false) + return (0, codegen_1._)`{}`; + return errorObject(cxt, error61, errorPaths); + } + function errorObject(cxt, error61, errorPaths = {}) { + const { gen, it } = cxt; + const keyValues = [ + errorInstancePath(it, errorPaths), + errorSchemaPath(cxt, errorPaths) + ]; + extraErrorProps(cxt, error61, keyValues); + return gen.object(...keyValues); + } + function errorInstancePath({ errorPath }, { instancePath }) { + const instPath = instancePath ? (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(instancePath, util_1.Type.Str)}` : errorPath; + return [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, instPath)]; + } + function errorSchemaPath({ keyword, it: { errSchemaPath } }, { schemaPath, parentSchema }) { + let schPath = parentSchema ? errSchemaPath : (0, codegen_1.str)`${errSchemaPath}/${keyword}`; + if (schemaPath) { + schPath = (0, codegen_1.str)`${schPath}${(0, util_1.getErrorPath)(schemaPath, util_1.Type.Str)}`; + } + return [E2.schemaPath, schPath]; + } + function extraErrorProps(cxt, { params, message }, keyValues) { + const { keyword, data, schemaValue, it } = cxt; + const { opts, propertyName, topSchemaRef, schemaPath } = it; + keyValues.push([E2.keyword, keyword], [E2.params, typeof params == "function" ? params(cxt) : params || (0, codegen_1._)`{}`]); + if (opts.messages) { + keyValues.push([E2.message, typeof message == "function" ? message(cxt) : message]); + } + if (opts.verbose) { + keyValues.push([E2.schema, schemaValue], [E2.parentSchema, (0, codegen_1._)`${topSchemaRef}${schemaPath}`], [names_1.default.data, data]); + } + if (propertyName) + keyValues.push([E2.propertyName, propertyName]); + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js +var require_boolSchema2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; + var errors_1 = require_errors2(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var boolError = { + message: "boolean schema is false" + }; + function topBoolOrEmptySchema(it) { + const { gen, schema, validateName } = it; + if (schema === false) { + falseSchemaError(it, false); + } else if (typeof schema == "object" && schema.$async === true) { + gen.return(names_1.default.data); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, null); + gen.return(true); + } + } + exports.topBoolOrEmptySchema = topBoolOrEmptySchema; + function boolOrEmptySchema(it, valid) { + const { gen, schema } = it; + if (schema === false) { + gen.var(valid, false); + falseSchemaError(it); + } else { + gen.var(valid, true); + } + } + exports.boolOrEmptySchema = boolOrEmptySchema; + function falseSchemaError(it, overrideAllErrors) { + const { gen, data } = it; + const cxt = { + gen, + keyword: "false schema", + data, + schema: false, + schemaCode: false, + schemaValue: false, + params: {}, + it + }; + (0, errors_1.reportError)(cxt, boolError, void 0, overrideAllErrors); + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js +var require_rules2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getRules = exports.isJSONType = void 0; + var _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"]; + var jsonTypes = new Set(_jsonTypes); + function isJSONType(x2) { + return typeof x2 == "string" && jsonTypes.has(x2); + } + exports.isJSONType = isJSONType; + function getRules() { + const groups = { + number: { type: "number", rules: [] }, + string: { type: "string", rules: [] }, + array: { type: "array", rules: [] }, + object: { type: "object", rules: [] } + }; + return { + types: { ...groups, integer: true, boolean: true, null: true }, + rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object], + post: { rules: [] }, + all: {}, + keywords: {} + }; + } + exports.getRules = getRules; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js +var require_applicability2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; + function schemaHasRulesForType({ schema, self }, type) { + const group = self.RULES.types[type]; + return group && group !== true && shouldUseGroup(schema, group); + } + exports.schemaHasRulesForType = schemaHasRulesForType; + function shouldUseGroup(schema, group) { + return group.rules.some((rule) => shouldUseRule(schema, rule)); + } + exports.shouldUseGroup = shouldUseGroup; + function shouldUseRule(schema, rule) { + var _a3; + return schema[rule.keyword] !== void 0 || ((_a3 = rule.definition.implements) === null || _a3 === void 0 ? void 0 : _a3.some((kwd) => schema[kwd] !== void 0)); + } + exports.shouldUseRule = shouldUseRule; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js +var require_dataType2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; + var rules_1 = require_rules2(); + var applicability_1 = require_applicability2(); + var errors_1 = require_errors2(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var DataType; + (function(DataType2) { + DataType2[DataType2["Correct"] = 0] = "Correct"; + DataType2[DataType2["Wrong"] = 1] = "Wrong"; + })(DataType || (exports.DataType = DataType = {})); + function getSchemaTypes(schema) { + const types = getJSONTypes(schema.type); + const hasNull = types.includes("null"); + if (hasNull) { + if (schema.nullable === false) + throw new Error("type: null contradicts nullable: false"); + } else { + if (!types.length && schema.nullable !== void 0) { + throw new Error('"nullable" cannot be used without "type"'); + } + if (schema.nullable === true) + types.push("null"); + } + return types; + } + exports.getSchemaTypes = getSchemaTypes; + function getJSONTypes(ts) { + const types = Array.isArray(ts) ? ts : ts ? [ts] : []; + if (types.every(rules_1.isJSONType)) + return types; + throw new Error("type must be JSONType or JSONType[]: " + types.join(",")); + } + exports.getJSONTypes = getJSONTypes; + function coerceAndCheckDataType(it, types) { + const { gen, data, opts } = it; + const coerceTo = coerceToTypes(types, opts.coerceTypes); + const checkTypes = types.length > 0 && !(coerceTo.length === 0 && types.length === 1 && (0, applicability_1.schemaHasRulesForType)(it, types[0])); + if (checkTypes) { + const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong); + gen.if(wrongType, () => { + if (coerceTo.length) + coerceData(it, types, coerceTo); + else + reportTypeError(it); + }); + } + return checkTypes; + } + exports.coerceAndCheckDataType = coerceAndCheckDataType; + var COERCIBLE = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean", "null"]); + function coerceToTypes(types, coerceTypes) { + return coerceTypes ? types.filter((t) => COERCIBLE.has(t) || coerceTypes === "array" && t === "array") : []; + } + function coerceData(it, types, coerceTo) { + const { gen, data, opts } = it; + const dataType = gen.let("dataType", (0, codegen_1._)`typeof ${data}`); + const coerced = gen.let("coerced", (0, codegen_1._)`undefined`); + if (opts.coerceTypes === "array") { + gen.if((0, codegen_1._)`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen.assign(data, (0, codegen_1._)`${data}[0]`).assign(dataType, (0, codegen_1._)`typeof ${data}`).if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))); + } + gen.if((0, codegen_1._)`${coerced} !== undefined`); + for (const t of coerceTo) { + if (COERCIBLE.has(t) || t === "array" && opts.coerceTypes === "array") { + coerceSpecificType(t); + } + } + gen.else(); + reportTypeError(it); + gen.endIf(); + gen.if((0, codegen_1._)`${coerced} !== undefined`, () => { + gen.assign(data, coerced); + assignParentData(it, coerced); + }); + function coerceSpecificType(t) { + switch (t) { + case "string": + gen.elseIf((0, codegen_1._)`${dataType} == "number" || ${dataType} == "boolean"`).assign(coerced, (0, codegen_1._)`"" + ${data}`).elseIf((0, codegen_1._)`${data} === null`).assign(coerced, (0, codegen_1._)`""`); + return; + case "number": + gen.elseIf((0, codegen_1._)`${dataType} == "boolean" || ${data} === null + || (${dataType} == "string" && ${data} && ${data} == +${data})`).assign(coerced, (0, codegen_1._)`+${data}`); + return; + case "integer": + gen.elseIf((0, codegen_1._)`${dataType} === "boolean" || ${data} === null + || (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`).assign(coerced, (0, codegen_1._)`+${data}`); + return; + case "boolean": + gen.elseIf((0, codegen_1._)`${data} === "false" || ${data} === 0 || ${data} === null`).assign(coerced, false).elseIf((0, codegen_1._)`${data} === "true" || ${data} === 1`).assign(coerced, true); + return; + case "null": + gen.elseIf((0, codegen_1._)`${data} === "" || ${data} === 0 || ${data} === false`); + gen.assign(coerced, null); + return; + case "array": + gen.elseIf((0, codegen_1._)`${dataType} === "string" || ${dataType} === "number" + || ${dataType} === "boolean" || ${data} === null`).assign(coerced, (0, codegen_1._)`[${data}]`); + } + } + } + function assignParentData({ gen, parentData, parentDataProperty }, expr) { + gen.if((0, codegen_1._)`${parentData} !== undefined`, () => gen.assign((0, codegen_1._)`${parentData}[${parentDataProperty}]`, expr)); + } + function checkDataType(dataType, data, strictNums, correct = DataType.Correct) { + const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ; + let cond; + switch (dataType) { + case "null": + return (0, codegen_1._)`${data} ${EQ} null`; + case "array": + cond = (0, codegen_1._)`Array.isArray(${data})`; + break; + case "object": + cond = (0, codegen_1._)`${data} && typeof ${data} == "object" && !Array.isArray(${data})`; + break; + case "integer": + cond = numCond((0, codegen_1._)`!(${data} % 1) && !isNaN(${data})`); + break; + case "number": + cond = numCond(); + break; + default: + return (0, codegen_1._)`typeof ${data} ${EQ} ${dataType}`; + } + return correct === DataType.Correct ? cond : (0, codegen_1.not)(cond); + function numCond(_cond = codegen_1.nil) { + return (0, codegen_1.and)((0, codegen_1._)`typeof ${data} == "number"`, _cond, strictNums ? (0, codegen_1._)`isFinite(${data})` : codegen_1.nil); + } + } + exports.checkDataType = checkDataType; + function checkDataTypes(dataTypes, data, strictNums, correct) { + if (dataTypes.length === 1) { + return checkDataType(dataTypes[0], data, strictNums, correct); + } + let cond; + const types = (0, util_1.toHash)(dataTypes); + if (types.array && types.object) { + const notObj = (0, codegen_1._)`typeof ${data} != "object"`; + cond = types.null ? notObj : (0, codegen_1._)`!${data} || ${notObj}`; + delete types.null; + delete types.array; + delete types.object; + } else { + cond = codegen_1.nil; + } + if (types.number) + delete types.integer; + for (const t in types) + cond = (0, codegen_1.and)(cond, checkDataType(t, data, strictNums, correct)); + return cond; + } + exports.checkDataTypes = checkDataTypes; + var typeError = { + message: ({ schema }) => `must be ${schema}`, + params: ({ schema, schemaValue }) => typeof schema == "string" ? (0, codegen_1._)`{type: ${schema}}` : (0, codegen_1._)`{type: ${schemaValue}}` + }; + function reportTypeError(it) { + const cxt = getTypeErrorContext(it); + (0, errors_1.reportError)(cxt, typeError); + } + exports.reportTypeError = reportTypeError; + function getTypeErrorContext(it) { + const { gen, data, schema } = it; + const schemaCode = (0, util_1.schemaRefOrVal)(it, schema, "type"); + return { + gen, + keyword: "type", + data, + schema: schema.type, + schemaCode, + schemaValue: schemaCode, + parentSchema: schema, + params: {}, + it + }; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js +var require_defaults2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.assignDefaults = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + function assignDefaults(it, ty) { + const { properties, items } = it.schema; + if (ty === "object" && properties) { + for (const key in properties) { + assignDefault(it, key, properties[key].default); + } + } else if (ty === "array" && Array.isArray(items)) { + items.forEach((sch, i) => assignDefault(it, i, sch.default)); + } + } + exports.assignDefaults = assignDefaults; + function assignDefault(it, prop, defaultValue) { + const { gen, compositeRule, data, opts } = it; + if (defaultValue === void 0) + return; + const childData = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(prop)}`; + if (compositeRule) { + (0, util_1.checkStrictMode)(it, `default is ignored for: ${childData}`); + return; + } + let condition = (0, codegen_1._)`${childData} === undefined`; + if (opts.useDefaults === "empty") { + condition = (0, codegen_1._)`${condition} || ${childData} === null || ${childData} === ""`; + } + gen.if(condition, (0, codegen_1._)`${childData} = ${(0, codegen_1.stringify)(defaultValue)}`); + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js +var require_code4 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var names_1 = require_names2(); + var util_2 = require_util2(); + function checkReportMissingProp(cxt, prop) { + const { gen, data, it } = cxt; + gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => { + cxt.setParams({ missingProperty: (0, codegen_1._)`${prop}` }, true); + cxt.error(); + }); + } + exports.checkReportMissingProp = checkReportMissingProp; + function checkMissingProp({ gen, data, it: { opts } }, properties, missing) { + return (0, codegen_1.or)(...properties.map((prop) => (0, codegen_1.and)(noPropertyInData(gen, data, prop, opts.ownProperties), (0, codegen_1._)`${missing} = ${prop}`))); + } + exports.checkMissingProp = checkMissingProp; + function reportMissingProp(cxt, missing) { + cxt.setParams({ missingProperty: missing }, true); + cxt.error(); + } + exports.reportMissingProp = reportMissingProp; + function hasPropFunc(gen) { + return gen.scopeValue("func", { + // eslint-disable-next-line @typescript-eslint/unbound-method + ref: Object.prototype.hasOwnProperty, + code: (0, codegen_1._)`Object.prototype.hasOwnProperty` + }); + } + exports.hasPropFunc = hasPropFunc; + function isOwnProperty(gen, data, property) { + return (0, codegen_1._)`${hasPropFunc(gen)}.call(${data}, ${property})`; + } + exports.isOwnProperty = isOwnProperty; + function propertyInData(gen, data, property, ownProperties) { + const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} !== undefined`; + return ownProperties ? (0, codegen_1._)`${cond} && ${isOwnProperty(gen, data, property)}` : cond; + } + exports.propertyInData = propertyInData; + function noPropertyInData(gen, data, property, ownProperties) { + const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} === undefined`; + return ownProperties ? (0, codegen_1.or)(cond, (0, codegen_1.not)(isOwnProperty(gen, data, property))) : cond; + } + exports.noPropertyInData = noPropertyInData; + function allSchemaProperties(schemaMap) { + return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : []; + } + exports.allSchemaProperties = allSchemaProperties; + function schemaProperties(it, schemaMap) { + return allSchemaProperties(schemaMap).filter((p) => !(0, util_1.alwaysValidSchema)(it, schemaMap[p])); + } + exports.schemaProperties = schemaProperties; + function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) { + const dataAndSchema = passSchema ? (0, codegen_1._)`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data; + const valCxt = [ + [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, errorPath)], + [names_1.default.parentData, it.parentData], + [names_1.default.parentDataProperty, it.parentDataProperty], + [names_1.default.rootData, names_1.default.rootData] + ]; + if (it.opts.dynamicRef) + valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]); + const args = (0, codegen_1._)`${dataAndSchema}, ${gen.object(...valCxt)}`; + return context !== codegen_1.nil ? (0, codegen_1._)`${func}.call(${context}, ${args})` : (0, codegen_1._)`${func}(${args})`; + } + exports.callValidateCode = callValidateCode; + var newRegExp = (0, codegen_1._)`new RegExp`; + function usePattern({ gen, it: { opts } }, pattern) { + const u = opts.unicodeRegExp ? "u" : ""; + const { regExp } = opts.code; + const rx = regExp(pattern, u); + return gen.scopeValue("pattern", { + key: rx.toString(), + ref: rx, + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` + }); + } + exports.usePattern = usePattern; + function validateArray(cxt) { + const { gen, data, keyword, it } = cxt; + const valid = gen.name("valid"); + if (it.allErrors) { + const validArr = gen.let("valid", true); + validateItems(() => gen.assign(validArr, false)); + return validArr; + } + gen.var(valid, true); + validateItems(() => gen.break()); + return valid; + function validateItems(notValid) { + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + gen.forRange("i", 0, len, (i) => { + cxt.subschema({ + keyword, + dataProp: i, + dataPropType: util_1.Type.Num + }, valid); + gen.if((0, codegen_1.not)(valid), notValid); + }); + } + } + exports.validateArray = validateArray; + function validateUnion(cxt) { + const { gen, schema, keyword, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const alwaysValid = schema.some((sch) => (0, util_1.alwaysValidSchema)(it, sch)); + if (alwaysValid && !it.opts.unevaluated) + return; + const valid = gen.let("valid", false); + const schValid = gen.name("_valid"); + gen.block(() => schema.forEach((_sch, i) => { + const schCxt = cxt.subschema({ + keyword, + schemaProp: i, + compositeRule: true + }, schValid); + gen.assign(valid, (0, codegen_1._)`${valid} || ${schValid}`); + const merged = cxt.mergeValidEvaluated(schCxt, schValid); + if (!merged) + gen.if((0, codegen_1.not)(valid)); + })); + cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); + } + exports.validateUnion = validateUnion; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js +var require_keyword2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var code_1 = require_code4(); + var errors_1 = require_errors2(); + function macroKeywordCode(cxt, def) { + const { gen, keyword, schema, parentSchema, it } = cxt; + const macroSchema = def.macro.call(it.self, schema, parentSchema, it); + const schemaRef = useKeyword(gen, keyword, macroSchema); + if (it.opts.validateSchema !== false) + it.self.validateSchema(macroSchema, true); + const valid = gen.name("valid"); + cxt.subschema({ + schema: macroSchema, + schemaPath: codegen_1.nil, + errSchemaPath: `${it.errSchemaPath}/${keyword}`, + topSchemaRef: schemaRef, + compositeRule: true + }, valid); + cxt.pass(valid, () => cxt.error(true)); + } + exports.macroKeywordCode = macroKeywordCode; + function funcKeywordCode(cxt, def) { + var _a3; + const { gen, keyword, schema, parentSchema, $data, it } = cxt; + checkAsyncKeyword(it, def); + const validate2 = !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate; + const validateRef = useKeyword(gen, keyword, validate2); + const valid = gen.let("valid"); + cxt.block$data(valid, validateKeyword); + cxt.ok((_a3 = def.valid) !== null && _a3 !== void 0 ? _a3 : valid); + function validateKeyword() { + if (def.errors === false) { + assignValid(); + if (def.modifying) + modifyData(cxt); + reportErrs(() => cxt.error()); + } else { + const ruleErrs = def.async ? validateAsync2() : validateSync(); + if (def.modifying) + modifyData(cxt); + reportErrs(() => addErrs(cxt, ruleErrs)); + } + } + function validateAsync2() { + const ruleErrs = gen.let("ruleErrs", null); + gen.try(() => assignValid((0, codegen_1._)`await `), (e) => gen.assign(valid, false).if((0, codegen_1._)`${e} instanceof ${it.ValidationError}`, () => gen.assign(ruleErrs, (0, codegen_1._)`${e}.errors`), () => gen.throw(e))); + return ruleErrs; + } + function validateSync() { + const validateErrs = (0, codegen_1._)`${validateRef}.errors`; + gen.assign(validateErrs, null); + assignValid(codegen_1.nil); + return validateErrs; + } + function assignValid(_await = def.async ? (0, codegen_1._)`await ` : codegen_1.nil) { + const passCxt = it.opts.passContext ? names_1.default.this : names_1.default.self; + const passSchema = !("compile" in def && !$data || def.schema === false); + gen.assign(valid, (0, codegen_1._)`${_await}${(0, code_1.callValidateCode)(cxt, validateRef, passCxt, passSchema)}`, def.modifying); + } + function reportErrs(errors) { + var _a4; + gen.if((0, codegen_1.not)((_a4 = def.valid) !== null && _a4 !== void 0 ? _a4 : valid), errors); + } + } + exports.funcKeywordCode = funcKeywordCode; + function modifyData(cxt) { + const { gen, data, it } = cxt; + gen.if(it.parentData, () => gen.assign(data, (0, codegen_1._)`${it.parentData}[${it.parentDataProperty}]`)); + } + function addErrs(cxt, errs) { + const { gen } = cxt; + gen.if((0, codegen_1._)`Array.isArray(${errs})`, () => { + gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`).assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); + (0, errors_1.extendErrors)(cxt); + }, () => cxt.error()); + } + function checkAsyncKeyword({ schemaEnv }, def) { + if (def.async && !schemaEnv.$async) + throw new Error("async keyword in sync schema"); + } + function useKeyword(gen, keyword, result) { + if (result === void 0) + throw new Error(`keyword "${keyword}" failed to compile`); + return gen.scopeValue("keyword", typeof result == "function" ? { ref: result } : { ref: result, code: (0, codegen_1.stringify)(result) }); + } + function validSchemaType(schema, schemaType, allowUndefined = false) { + return !schemaType.length || schemaType.some((st) => st === "array" ? Array.isArray(schema) : st === "object" ? schema && typeof schema == "object" && !Array.isArray(schema) : typeof schema == st || allowUndefined && typeof schema == "undefined"); + } + exports.validSchemaType = validSchemaType; + function validateKeywordUsage({ schema, opts, self, errSchemaPath }, def, keyword) { + if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) { + throw new Error("ajv implementation error"); + } + const deps = def.dependencies; + if (deps === null || deps === void 0 ? void 0 : deps.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) { + throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(",")}`); + } + if (def.validateSchema) { + const valid = def.validateSchema(schema[keyword]); + if (!valid) { + const msg = `keyword "${keyword}" value is invalid at path "${errSchemaPath}": ` + self.errorsText(def.validateSchema.errors); + if (opts.validateSchema === "log") + self.logger.error(msg); + else + throw new Error(msg); + } + } + } + exports.validateKeywordUsage = validateKeywordUsage; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js +var require_subschema2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + function getSubschema(it, { keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef }) { + if (keyword !== void 0 && schema !== void 0) { + throw new Error('both "keyword" and "schema" passed, only one allowed'); + } + if (keyword !== void 0) { + const sch = it.schema[keyword]; + return schemaProp === void 0 ? { + schema: sch, + schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}`, + errSchemaPath: `${it.errSchemaPath}/${keyword}` + } : { + schema: sch[schemaProp], + schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}${(0, codegen_1.getProperty)(schemaProp)}`, + errSchemaPath: `${it.errSchemaPath}/${keyword}/${(0, util_1.escapeFragment)(schemaProp)}` + }; + } + if (schema !== void 0) { + if (schemaPath === void 0 || errSchemaPath === void 0 || topSchemaRef === void 0) { + throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"'); + } + return { + schema, + schemaPath, + topSchemaRef, + errSchemaPath + }; + } + throw new Error('either "keyword" or "schema" must be passed'); + } + exports.getSubschema = getSubschema; + function extendSubschemaData(subschema, it, { dataProp, dataPropType: dpType, data, dataTypes, propertyName }) { + if (data !== void 0 && dataProp !== void 0) { + throw new Error('both "data" and "dataProp" passed, only one allowed'); + } + const { gen } = it; + if (dataProp !== void 0) { + const { errorPath, dataPathArr, opts } = it; + const nextData = gen.let("data", (0, codegen_1._)`${it.data}${(0, codegen_1.getProperty)(dataProp)}`, true); + dataContextProps(nextData); + subschema.errorPath = (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(dataProp, dpType, opts.jsPropertySyntax)}`; + subschema.parentDataProperty = (0, codegen_1._)`${dataProp}`; + subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty]; + } + if (data !== void 0) { + const nextData = data instanceof codegen_1.Name ? data : gen.let("data", data, true); + dataContextProps(nextData); + if (propertyName !== void 0) + subschema.propertyName = propertyName; + } + if (dataTypes) + subschema.dataTypes = dataTypes; + function dataContextProps(_nextData) { + subschema.data = _nextData; + subschema.dataLevel = it.dataLevel + 1; + subschema.dataTypes = []; + it.definedProperties = /* @__PURE__ */ new Set(); + subschema.parentData = it.data; + subschema.dataNames = [...it.dataNames, _nextData]; + } + } + exports.extendSubschemaData = extendSubschemaData; + function extendSubschemaMode(subschema, { jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors }) { + if (compositeRule !== void 0) + subschema.compositeRule = compositeRule; + if (createErrors !== void 0) + subschema.createErrors = createErrors; + if (allErrors !== void 0) + subschema.allErrors = allErrors; + subschema.jtdDiscriminator = jtdDiscriminator; + subschema.jtdMetadata = jtdMetadata; + } + exports.extendSubschemaMode = extendSubschemaMode; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js +var require_resolve2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; + var util_1 = require_util2(); + var equal = require_fast_deep_equal(); + var traverse = require_json_schema_traverse(); + var SIMPLE_INLINED = /* @__PURE__ */ new Set([ + "type", + "format", + "pattern", + "maxLength", + "minLength", + "maxProperties", + "minProperties", + "maxItems", + "minItems", + "maximum", + "minimum", + "uniqueItems", + "multipleOf", + "required", + "enum", + "const" + ]); + function inlineRef(schema, limit = true) { + if (typeof schema == "boolean") + return true; + if (limit === true) + return !hasRef(schema); + if (!limit) + return false; + return countKeys(schema) <= limit; + } + exports.inlineRef = inlineRef; + var REF_KEYWORDS = /* @__PURE__ */ new Set([ + "$ref", + "$recursiveRef", + "$recursiveAnchor", + "$dynamicRef", + "$dynamicAnchor" + ]); + function hasRef(schema) { + for (const key in schema) { + if (REF_KEYWORDS.has(key)) + return true; + const sch = schema[key]; + if (Array.isArray(sch) && sch.some(hasRef)) + return true; + if (typeof sch == "object" && hasRef(sch)) + return true; + } + return false; + } + function countKeys(schema) { + let count = 0; + for (const key in schema) { + if (key === "$ref") + return Infinity; + count++; + if (SIMPLE_INLINED.has(key)) + continue; + if (typeof schema[key] == "object") { + (0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch)); + } + if (count === Infinity) + return Infinity; + } + return count; + } + function getFullPath(resolver, id = "", normalize) { + if (normalize !== false) + id = normalizeId(id); + const p = resolver.parse(id); + return _getFullPath(resolver, p); + } + exports.getFullPath = getFullPath; + function _getFullPath(resolver, p) { + const serialized = resolver.serialize(p); + return serialized.split("#")[0] + "#"; + } + exports._getFullPath = _getFullPath; + var TRAILING_SLASH_HASH = /#\/?$/; + function normalizeId(id) { + return id ? id.replace(TRAILING_SLASH_HASH, "") : ""; + } + exports.normalizeId = normalizeId; + function resolveUrl(resolver, baseId, id) { + id = normalizeId(id); + return resolver.resolve(baseId, id); + } + exports.resolveUrl = resolveUrl; + var ANCHOR = /^[a-z_][-a-z0-9._]*$/i; + function getSchemaRefs(schema, baseId) { + if (typeof schema == "boolean") + return {}; + const { schemaId, uriResolver } = this.opts; + const schId = normalizeId(schema[schemaId] || baseId); + const baseIds = { "": schId }; + const pathPrefix = getFullPath(uriResolver, schId, false); + const localRefs = {}; + const schemaRefs = /* @__PURE__ */ new Set(); + traverse(schema, { allKeys: true }, (sch, jsonPtr, _2, parentJsonPtr) => { + if (parentJsonPtr === void 0) + return; + const fullPath = pathPrefix + jsonPtr; + let innerBaseId = baseIds[parentJsonPtr]; + if (typeof sch[schemaId] == "string") + innerBaseId = addRef.call(this, sch[schemaId]); + addAnchor.call(this, sch.$anchor); + addAnchor.call(this, sch.$dynamicAnchor); + baseIds[jsonPtr] = innerBaseId; + function addRef(ref) { + const _resolve = this.opts.uriResolver.resolve; + ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref); + if (schemaRefs.has(ref)) + throw ambiguos(ref); + schemaRefs.add(ref); + let schOrRef = this.refs[ref]; + if (typeof schOrRef == "string") + schOrRef = this.refs[schOrRef]; + if (typeof schOrRef == "object") { + checkAmbiguosRef(sch, schOrRef.schema, ref); + } else if (ref !== normalizeId(fullPath)) { + if (ref[0] === "#") { + checkAmbiguosRef(sch, localRefs[ref], ref); + localRefs[ref] = sch; + } else { + this.refs[ref] = fullPath; + } + } + return ref; + } + function addAnchor(anchor2) { + if (typeof anchor2 == "string") { + if (!ANCHOR.test(anchor2)) + throw new Error(`invalid anchor "${anchor2}"`); + addRef.call(this, `#${anchor2}`); + } + } + }); + return localRefs; + function checkAmbiguosRef(sch1, sch2, ref) { + if (sch2 !== void 0 && !equal(sch1, sch2)) + throw ambiguos(ref); + } + function ambiguos(ref) { + return new Error(`reference "${ref}" resolves to more than one schema`); + } + } + exports.getSchemaRefs = getSchemaRefs; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js +var require_validate2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; + var boolSchema_1 = require_boolSchema2(); + var dataType_1 = require_dataType2(); + var applicability_1 = require_applicability2(); + var dataType_2 = require_dataType2(); + var defaults_1 = require_defaults2(); + var keyword_1 = require_keyword2(); + var subschema_1 = require_subschema2(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var resolve_1 = require_resolve2(); + var util_1 = require_util2(); + var errors_1 = require_errors2(); + function validateFunctionCode(it) { + if (isSchemaObj(it)) { + checkKeywords(it); + if (schemaCxtHasRules(it)) { + topSchemaObjCode(it); + return; + } + } + validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it)); + } + exports.validateFunctionCode = validateFunctionCode; + function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) { + if (opts.code.es5) { + gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => { + gen.code((0, codegen_1._)`"use strict"; ${funcSourceUrl(schema, opts)}`); + destructureValCxtES5(gen, opts); + gen.code(body); + }); + } else { + gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body)); + } + } + function destructureValCxt(opts) { + return (0, codegen_1._)`{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._)`, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`; + } + function destructureValCxtES5(gen, opts) { + gen.if(names_1.default.valCxt, () => { + gen.var(names_1.default.instancePath, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.instancePath}`); + gen.var(names_1.default.parentData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentData}`); + gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentDataProperty}`); + gen.var(names_1.default.rootData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.rootData}`); + if (opts.dynamicRef) + gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`); + }, () => { + gen.var(names_1.default.instancePath, (0, codegen_1._)`""`); + gen.var(names_1.default.parentData, (0, codegen_1._)`undefined`); + gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`undefined`); + gen.var(names_1.default.rootData, names_1.default.data); + if (opts.dynamicRef) + gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`{}`); + }); + } + function topSchemaObjCode(it) { + const { schema, opts, gen } = it; + validateFunction(it, () => { + if (opts.$comment && schema.$comment) + commentKeyword(it); + checkNoDefault(it); + gen.let(names_1.default.vErrors, null); + gen.let(names_1.default.errors, 0); + if (opts.unevaluated) + resetEvaluated(it); + typeAndKeywords(it); + returnResults(it); + }); + return; + } + function resetEvaluated(it) { + const { gen, validateName } = it; + it.evaluated = gen.const("evaluated", (0, codegen_1._)`${validateName}.evaluated`); + gen.if((0, codegen_1._)`${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._)`${it.evaluated}.props`, (0, codegen_1._)`undefined`)); + gen.if((0, codegen_1._)`${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._)`${it.evaluated}.items`, (0, codegen_1._)`undefined`)); + } + function funcSourceUrl(schema, opts) { + const schId = typeof schema == "object" && schema[opts.schemaId]; + return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._)`/*# sourceURL=${schId} */` : codegen_1.nil; + } + function subschemaCode(it, valid) { + if (isSchemaObj(it)) { + checkKeywords(it); + if (schemaCxtHasRules(it)) { + subSchemaObjCode(it, valid); + return; + } + } + (0, boolSchema_1.boolOrEmptySchema)(it, valid); + } + function schemaCxtHasRules({ schema, self }) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (self.RULES.all[key]) + return true; + return false; + } + function isSchemaObj(it) { + return typeof it.schema != "boolean"; + } + function subSchemaObjCode(it, valid) { + const { schema, gen, opts } = it; + if (opts.$comment && schema.$comment) + commentKeyword(it); + updateContext(it); + checkAsyncSchema(it); + const errsCount = gen.const("_errs", names_1.default.errors); + typeAndKeywords(it, errsCount); + gen.var(valid, (0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + } + function checkKeywords(it) { + (0, util_1.checkUnknownRules)(it); + checkRefsAndKeywords(it); + } + function typeAndKeywords(it, errsCount) { + if (it.opts.jtd) + return schemaKeywords(it, [], false, errsCount); + const types = (0, dataType_1.getSchemaTypes)(it.schema); + const checkedTypes = (0, dataType_1.coerceAndCheckDataType)(it, types); + schemaKeywords(it, types, !checkedTypes, errsCount); + } + function checkRefsAndKeywords(it) { + const { schema, errSchemaPath, opts, self } = it; + if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) { + self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`); + } + } + function checkNoDefault(it) { + const { schema, opts } = it; + if (schema.default !== void 0 && opts.useDefaults && opts.strictSchema) { + (0, util_1.checkStrictMode)(it, "default is ignored in the schema root"); + } + } + function updateContext(it) { + const schId = it.schema[it.opts.schemaId]; + if (schId) + it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId); + } + function checkAsyncSchema(it) { + if (it.schema.$async && !it.schemaEnv.$async) + throw new Error("async schema in sync schema"); + } + function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) { + const msg = schema.$comment; + if (opts.$comment === true) { + gen.code((0, codegen_1._)`${names_1.default.self}.logger.log(${msg})`); + } else if (typeof opts.$comment == "function") { + const schemaPath = (0, codegen_1.str)`${errSchemaPath}/$comment`; + const rootName = gen.scopeValue("root", { ref: schemaEnv.root }); + gen.code((0, codegen_1._)`${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`); + } + } + function returnResults(it) { + const { gen, schemaEnv, validateName, ValidationError, opts } = it; + if (schemaEnv.$async) { + gen.if((0, codegen_1._)`${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._)`new ${ValidationError}(${names_1.default.vErrors})`)); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, names_1.default.vErrors); + if (opts.unevaluated) + assignEvaluated(it); + gen.return((0, codegen_1._)`${names_1.default.errors} === 0`); + } + } + function assignEvaluated({ gen, evaluated, props, items }) { + if (props instanceof codegen_1.Name) + gen.assign((0, codegen_1._)`${evaluated}.props`, props); + if (items instanceof codegen_1.Name) + gen.assign((0, codegen_1._)`${evaluated}.items`, items); + } + function schemaKeywords(it, types, typeErrors, errsCount) { + const { gen, schema, data, allErrors, opts, self } = it; + const { RULES } = self; + if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) { + gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition)); + return; + } + if (!opts.jtd) + checkStrictTypes(it, types); + gen.block(() => { + for (const group of RULES.rules) + groupKeywords(group); + groupKeywords(RULES.post); + }); + function groupKeywords(group) { + if (!(0, applicability_1.shouldUseGroup)(schema, group)) + return; + if (group.type) { + gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers)); + iterateKeywords(it, group); + if (types.length === 1 && types[0] === group.type && typeErrors) { + gen.else(); + (0, dataType_2.reportTypeError)(it); + } + gen.endIf(); + } else { + iterateKeywords(it, group); + } + if (!allErrors) + gen.if((0, codegen_1._)`${names_1.default.errors} === ${errsCount || 0}`); + } + } + function iterateKeywords(it, group) { + const { gen, schema, opts: { useDefaults } } = it; + if (useDefaults) + (0, defaults_1.assignDefaults)(it, group.type); + gen.block(() => { + for (const rule of group.rules) { + if ((0, applicability_1.shouldUseRule)(schema, rule)) { + keywordCode(it, rule.keyword, rule.definition, group.type); + } + } + }); + } + function checkStrictTypes(it, types) { + if (it.schemaEnv.meta || !it.opts.strictTypes) + return; + checkContextTypes(it, types); + if (!it.opts.allowUnionTypes) + checkMultipleTypes(it, types); + checkKeywordTypes(it, it.dataTypes); + } + function checkContextTypes(it, types) { + if (!types.length) + return; + if (!it.dataTypes.length) { + it.dataTypes = types; + return; + } + types.forEach((t) => { + if (!includesType(it.dataTypes, t)) { + strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`); + } + }); + narrowSchemaTypes(it, types); + } + function checkMultipleTypes(it, ts) { + if (ts.length > 1 && !(ts.length === 2 && ts.includes("null"))) { + strictTypesError(it, "use allowUnionTypes to allow union type keyword"); + } + } + function checkKeywordTypes(it, ts) { + const rules = it.self.RULES.all; + for (const keyword in rules) { + const rule = rules[keyword]; + if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) { + const { type } = rule.definition; + if (type.length && !type.some((t) => hasApplicableType(ts, t))) { + strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`); + } + } + } + } + function hasApplicableType(schTs, kwdT) { + return schTs.includes(kwdT) || kwdT === "number" && schTs.includes("integer"); + } + function includesType(ts, t) { + return ts.includes(t) || t === "integer" && ts.includes("number"); + } + function narrowSchemaTypes(it, withTypes) { + const ts = []; + for (const t of it.dataTypes) { + if (includesType(withTypes, t)) + ts.push(t); + else if (withTypes.includes("integer") && t === "number") + ts.push("integer"); + } + it.dataTypes = ts; + } + function strictTypesError(it, msg) { + const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; + msg += ` at "${schemaPath}" (strictTypes)`; + (0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes); + } + var KeywordCxt = class { + constructor(it, def, keyword) { + (0, keyword_1.validateKeywordUsage)(it, def, keyword); + this.gen = it.gen; + this.allErrors = it.allErrors; + this.keyword = keyword; + this.data = it.data; + this.schema = it.schema[keyword]; + this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data; + this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data); + this.schemaType = def.schemaType; + this.parentSchema = it.schema; + this.params = {}; + this.it = it; + this.def = def; + if (this.$data) { + this.schemaCode = it.gen.const("vSchema", getData(this.$data, it)); + } else { + this.schemaCode = this.schemaValue; + if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) { + throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`); + } + } + if ("code" in def ? def.trackErrors : def.errors !== false) { + this.errsCount = it.gen.const("_errs", names_1.default.errors); + } + } + result(condition, successAction, failAction) { + this.failResult((0, codegen_1.not)(condition), successAction, failAction); + } + failResult(condition, successAction, failAction) { + this.gen.if(condition); + if (failAction) + failAction(); + else + this.error(); + if (successAction) { + this.gen.else(); + successAction(); + if (this.allErrors) + this.gen.endIf(); + } else { + if (this.allErrors) + this.gen.endIf(); + else + this.gen.else(); + } + } + pass(condition, failAction) { + this.failResult((0, codegen_1.not)(condition), void 0, failAction); + } + fail(condition) { + if (condition === void 0) { + this.error(); + if (!this.allErrors) + this.gen.if(false); + return; + } + this.gen.if(condition); + this.error(); + if (this.allErrors) + this.gen.endIf(); + else + this.gen.else(); + } + fail$data(condition) { + if (!this.$data) + return this.fail(condition); + const { schemaCode } = this; + this.fail((0, codegen_1._)`${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`); + } + error(append, errorParams, errorPaths) { + if (errorParams) { + this.setParams(errorParams); + this._error(append, errorPaths); + this.setParams({}); + return; + } + this._error(append, errorPaths); + } + _error(append, errorPaths) { + ; + (append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths); + } + $dataError() { + (0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError); + } + reset() { + if (this.errsCount === void 0) + throw new Error('add "trackErrors" to keyword definition'); + (0, errors_1.resetErrorsCount)(this.gen, this.errsCount); + } + ok(cond) { + if (!this.allErrors) + this.gen.if(cond); + } + setParams(obj, assign) { + if (assign) + Object.assign(this.params, obj); + else + this.params = obj; + } + block$data(valid, codeBlock, $dataValid = codegen_1.nil) { + this.gen.block(() => { + this.check$data(valid, $dataValid); + codeBlock(); + }); + } + check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) { + if (!this.$data) + return; + const { gen, schemaCode, schemaType, def } = this; + gen.if((0, codegen_1.or)((0, codegen_1._)`${schemaCode} === undefined`, $dataValid)); + if (valid !== codegen_1.nil) + gen.assign(valid, true); + if (schemaType.length || def.validateSchema) { + gen.elseIf(this.invalid$data()); + this.$dataError(); + if (valid !== codegen_1.nil) + gen.assign(valid, false); + } + gen.else(); + } + invalid$data() { + const { gen, schemaCode, schemaType, def, it } = this; + return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema()); + function wrong$DataType() { + if (schemaType.length) { + if (!(schemaCode instanceof codegen_1.Name)) + throw new Error("ajv implementation error"); + const st = Array.isArray(schemaType) ? schemaType : [schemaType]; + return (0, codegen_1._)`${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`; + } + return codegen_1.nil; + } + function invalid$DataSchema() { + if (def.validateSchema) { + const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema }); + return (0, codegen_1._)`!${validateSchemaRef}(${schemaCode})`; + } + return codegen_1.nil; + } + } + subschema(appl, valid) { + const subschema = (0, subschema_1.getSubschema)(this.it, appl); + (0, subschema_1.extendSubschemaData)(subschema, this.it, appl); + (0, subschema_1.extendSubschemaMode)(subschema, appl); + const nextContext = { ...this.it, ...subschema, items: void 0, props: void 0 }; + subschemaCode(nextContext, valid); + return nextContext; + } + mergeEvaluated(schemaCxt, toName) { + const { it, gen } = this; + if (!it.opts.unevaluated) + return; + if (it.props !== true && schemaCxt.props !== void 0) { + it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName); + } + if (it.items !== true && schemaCxt.items !== void 0) { + it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName); + } + } + mergeValidEvaluated(schemaCxt, valid) { + const { it, gen } = this; + if (it.opts.unevaluated && (it.props !== true || it.items !== true)) { + gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name)); + return true; + } + } + }; + exports.KeywordCxt = KeywordCxt; + function keywordCode(it, keyword, def, ruleType) { + const cxt = new KeywordCxt(it, def, keyword); + if ("code" in def) { + def.code(cxt, ruleType); + } else if (cxt.$data && def.validate) { + (0, keyword_1.funcKeywordCode)(cxt, def); + } else if ("macro" in def) { + (0, keyword_1.macroKeywordCode)(cxt, def); + } else if (def.compile || def.validate) { + (0, keyword_1.funcKeywordCode)(cxt, def); + } + } + var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/; + var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/; + function getData($data, { dataLevel, dataNames, dataPathArr }) { + let jsonPointer; + let data; + if ($data === "") + return names_1.default.rootData; + if ($data[0] === "/") { + if (!JSON_POINTER.test($data)) + throw new Error(`Invalid JSON-pointer: ${$data}`); + jsonPointer = $data; + data = names_1.default.rootData; + } else { + const matches = RELATIVE_JSON_POINTER.exec($data); + if (!matches) + throw new Error(`Invalid JSON-pointer: ${$data}`); + const up = +matches[1]; + jsonPointer = matches[2]; + if (jsonPointer === "#") { + if (up >= dataLevel) + throw new Error(errorMsg("property/index", up)); + return dataPathArr[dataLevel - up]; + } + if (up > dataLevel) + throw new Error(errorMsg("data", up)); + data = dataNames[dataLevel - up]; + if (!jsonPointer) + return data; + } + let expr = data; + const segments = jsonPointer.split("/"); + for (const segment of segments) { + if (segment) { + data = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`; + expr = (0, codegen_1._)`${expr} && ${data}`; + } + } + return expr; + function errorMsg(pointerType, up) { + return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`; + } + } + exports.getData = getData; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js +var require_validation_error2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var ValidationError = class extends Error { + constructor(errors) { + super("validation failed"); + this.errors = errors; + this.ajv = this.validation = true; + } + }; + exports.default = ValidationError; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js +var require_ref_error2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var resolve_1 = require_resolve2(); + var MissingRefError = class extends Error { + constructor(resolver, baseId, ref, msg) { + super(msg || `can't resolve reference ${ref} from id ${baseId}`); + this.missingRef = (0, resolve_1.resolveUrl)(resolver, baseId, ref); + this.missingSchema = (0, resolve_1.normalizeId)((0, resolve_1.getFullPath)(resolver, this.missingRef)); + } + }; + exports.default = MissingRefError; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js +var require_compile2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; + var codegen_1 = require_codegen2(); + var validation_error_1 = require_validation_error2(); + var names_1 = require_names2(); + var resolve_1 = require_resolve2(); + var util_1 = require_util2(); + var validate_1 = require_validate2(); + var SchemaEnv = class { + constructor(env) { + var _a3; + this.refs = {}; + this.dynamicAnchors = {}; + let schema; + if (typeof env.schema == "object") + schema = env.schema; + this.schema = env.schema; + this.schemaId = env.schemaId; + this.root = env.root || this; + this.baseId = (_a3 = env.baseId) !== null && _a3 !== void 0 ? _a3 : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]); + this.schemaPath = env.schemaPath; + this.localRefs = env.localRefs; + this.meta = env.meta; + this.$async = schema === null || schema === void 0 ? void 0 : schema.$async; + this.refs = {}; + } + }; + exports.SchemaEnv = SchemaEnv; + function compileSchema(sch) { + const _sch = getCompilingSchema.call(this, sch); + if (_sch) + return _sch; + const rootId = (0, resolve_1.getFullPath)(this.opts.uriResolver, sch.root.baseId); + const { es5, lines } = this.opts.code; + const { ownProperties } = this.opts; + const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties }); + let _ValidationError; + if (sch.$async) { + _ValidationError = gen.scopeValue("Error", { + ref: validation_error_1.default, + code: (0, codegen_1._)`require("ajv/dist/runtime/validation_error").default` + }); + } + const validateName = gen.scopeName("validate"); + sch.validateName = validateName; + const schemaCxt = { + gen, + allErrors: this.opts.allErrors, + data: names_1.default.data, + parentData: names_1.default.parentData, + parentDataProperty: names_1.default.parentDataProperty, + dataNames: [names_1.default.data], + dataPathArr: [codegen_1.nil], + // TODO can its length be used as dataLevel if nil is removed? + dataLevel: 0, + dataTypes: [], + definedProperties: /* @__PURE__ */ new Set(), + topSchemaRef: gen.scopeValue("schema", this.opts.code.source === true ? { ref: sch.schema, code: (0, codegen_1.stringify)(sch.schema) } : { ref: sch.schema }), + validateName, + ValidationError: _ValidationError, + schema: sch.schema, + schemaEnv: sch, + rootId, + baseId: sch.baseId || rootId, + schemaPath: codegen_1.nil, + errSchemaPath: sch.schemaPath || (this.opts.jtd ? "" : "#"), + errorPath: (0, codegen_1._)`""`, + opts: this.opts, + self: this + }; + let sourceCode; + try { + this._compilations.add(sch); + (0, validate_1.validateFunctionCode)(schemaCxt); + gen.optimize(this.opts.code.optimize); + const validateCode = gen.toString(); + sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${validateCode}`; + if (this.opts.code.process) + sourceCode = this.opts.code.process(sourceCode, sch); + const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); + const validate2 = makeValidate(this, this.scope.get()); + this.scope.value(validateName, { ref: validate2 }); + validate2.errors = null; + validate2.schema = sch.schema; + validate2.schemaEnv = sch; + if (sch.$async) + validate2.$async = true; + if (this.opts.code.source === true) { + validate2.source = { validateName, validateCode, scopeValues: gen._values }; + } + if (this.opts.unevaluated) { + const { props, items } = schemaCxt; + validate2.evaluated = { + props: props instanceof codegen_1.Name ? void 0 : props, + items: items instanceof codegen_1.Name ? void 0 : items, + dynamicProps: props instanceof codegen_1.Name, + dynamicItems: items instanceof codegen_1.Name + }; + if (validate2.source) + validate2.source.evaluated = (0, codegen_1.stringify)(validate2.evaluated); + } + sch.validate = validate2; + return sch; + } catch (e) { + delete sch.validate; + delete sch.validateName; + if (sourceCode) + this.logger.error("Error compiling schema, function code:", sourceCode); + throw e; + } finally { + this._compilations.delete(sch); + } + } + exports.compileSchema = compileSchema; + function resolveRef2(root, baseId, ref) { + var _a3; + ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref); + const schOrFunc = root.refs[ref]; + if (schOrFunc) + return schOrFunc; + let _sch = resolve.call(this, root, ref); + if (_sch === void 0) { + const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref]; + const { schemaId } = this.opts; + if (schema) + _sch = new SchemaEnv({ schema, schemaId, root, baseId }); + } + if (_sch === void 0) + return; + return root.refs[ref] = inlineOrCompile.call(this, _sch); + } + exports.resolveRef = resolveRef2; + function inlineOrCompile(sch) { + if ((0, resolve_1.inlineRef)(sch.schema, this.opts.inlineRefs)) + return sch.schema; + return sch.validate ? sch : compileSchema.call(this, sch); + } + function getCompilingSchema(schEnv) { + for (const sch of this._compilations) { + if (sameSchemaEnv(sch, schEnv)) + return sch; + } + } + exports.getCompilingSchema = getCompilingSchema; + function sameSchemaEnv(s1, s2) { + return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId; + } + function resolve(root, ref) { + let sch; + while (typeof (sch = this.refs[ref]) == "string") + ref = sch; + return sch || this.schemas[ref] || resolveSchema.call(this, root, ref); + } + function resolveSchema(root, ref) { + const p = this.opts.uriResolver.parse(ref); + const refPath = (0, resolve_1._getFullPath)(this.opts.uriResolver, p); + let baseId = (0, resolve_1.getFullPath)(this.opts.uriResolver, root.baseId, void 0); + if (Object.keys(root.schema).length > 0 && refPath === baseId) { + return getJsonPointer.call(this, p, root); + } + const id = (0, resolve_1.normalizeId)(refPath); + const schOrRef = this.refs[id] || this.schemas[id]; + if (typeof schOrRef == "string") { + const sch = resolveSchema.call(this, root, schOrRef); + if (typeof (sch === null || sch === void 0 ? void 0 : sch.schema) !== "object") + return; + return getJsonPointer.call(this, p, sch); + } + if (typeof (schOrRef === null || schOrRef === void 0 ? void 0 : schOrRef.schema) !== "object") + return; + if (!schOrRef.validate) + compileSchema.call(this, schOrRef); + if (id === (0, resolve_1.normalizeId)(ref)) { + const { schema } = schOrRef; + const { schemaId } = this.opts; + const schId = schema[schemaId]; + if (schId) + baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); + return new SchemaEnv({ schema, schemaId, root, baseId }); + } + return getJsonPointer.call(this, p, schOrRef); + } + exports.resolveSchema = resolveSchema; + var PREVENT_SCOPE_CHANGE = /* @__PURE__ */ new Set([ + "properties", + "patternProperties", + "enum", + "dependencies", + "definitions" + ]); + function getJsonPointer(parsedRef, { baseId, schema, root }) { + var _a3; + if (((_a3 = parsedRef.fragment) === null || _a3 === void 0 ? void 0 : _a3[0]) !== "/") + return; + for (const part of parsedRef.fragment.slice(1).split("/")) { + if (typeof schema === "boolean") + return; + const partSchema = schema[(0, util_1.unescapeFragment)(part)]; + if (partSchema === void 0) + return; + schema = partSchema; + const schId = typeof schema === "object" && schema[this.opts.schemaId]; + if (!PREVENT_SCOPE_CHANGE.has(part) && schId) { + baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); + } + } + let env; + if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) { + const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref); + env = resolveSchema.call(this, root, $ref); + } + const { schemaId } = this.opts; + env = env || new SchemaEnv({ schema, schemaId, root, baseId }); + if (env.schema !== env.root.schema) + return env; + return void 0; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json +var require_data2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json"(exports, module) { + module.exports = { + $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", + description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", + type: "object", + required: ["$data"], + properties: { + $data: { + type: "string", + anyOf: [{ format: "relative-json-pointer" }, { format: "json-pointer" }] + } + }, + additionalProperties: false + }; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js +var require_uri2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var uri = require_fast_uri(); + uri.code = 'require("ajv/dist/runtime/uri").default'; + exports.default = uri; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/core.js +var require_core3 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/core.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; + var validate_1 = require_validate2(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen2(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error2(); + var ref_error_1 = require_ref_error2(); + var rules_1 = require_rules2(); + var compile_1 = require_compile2(); + var codegen_2 = require_codegen2(); + var resolve_1 = require_resolve2(); + var dataType_1 = require_dataType2(); + var util_1 = require_util2(); + var $dataRefSchema = require_data2(); + var uri_1 = require_uri2(); + var defaultRegExp = (str, flags) => new RegExp(str, flags); + defaultRegExp.code = "new RegExp"; + var META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes"]; + var EXT_SCOPE_NAMES = /* @__PURE__ */ new Set([ + "validate", + "serialize", + "parse", + "wrapper", + "root", + "schema", + "keyword", + "pattern", + "formats", + "validate$data", + "func", + "obj", + "Error" + ]); + var removedOptions = { + errorDataPath: "", + format: "`validateFormats: false` can be used instead.", + nullable: '"nullable" keyword is supported by default.', + jsonPointers: "Deprecated jsPropertySyntax can be used instead.", + extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.", + missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.", + processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`", + sourceCode: "Use option `code: {source: true}`", + strictDefaults: "It is default now, see option `strict`.", + strictKeywords: "It is default now, see option `strict`.", + uniqueItems: '"uniqueItems" keyword is always validated.', + unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).", + cache: "Map is used as cache, schema object as key.", + serialize: "Map is used as cache, schema object as key.", + ajvErrors: "It is default now." + }; + var deprecatedOptions = { + ignoreKeywordsWithRef: "", + jsPropertySyntax: "", + unicode: '"minLength"/"maxLength" account for unicode characters by default.' + }; + var MAX_EXPRESSION = 200; + function requiredOptions(o) { + var _a3, _b, _c, _d, _e2, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; + const s = o.strict; + const _optz = (_a3 = o.code) === null || _a3 === void 0 ? void 0 : _a3.optimize; + const optimize = _optz === true || _optz === void 0 ? 1 : _optz || 0; + const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp; + const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default; + return { + strictSchema: (_f = (_e2 = o.strictSchema) !== null && _e2 !== void 0 ? _e2 : s) !== null && _f !== void 0 ? _f : true, + strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true, + strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log", + strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log", + strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false, + code: o.code ? { ...o.code, optimize, regExp } : { optimize, regExp }, + loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION, + loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION, + meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true, + messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true, + inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true, + schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id", + addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true, + validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true, + validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true, + unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true, + int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true, + uriResolver + }; + } + var Ajv2 = class { + constructor(opts = {}) { + this.schemas = {}; + this.refs = {}; + this.formats = /* @__PURE__ */ Object.create(null); + this._compilations = /* @__PURE__ */ new Set(); + this._loading = {}; + this._cache = /* @__PURE__ */ new Map(); + opts = this.opts = { ...opts, ...requiredOptions(opts) }; + const { es5, lines } = this.opts.code; + this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines }); + this.logger = getLogger(opts.logger); + const formatOpt = opts.validateFormats; + opts.validateFormats = false; + this.RULES = (0, rules_1.getRules)(); + checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED"); + checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn"); + this._metaOpts = getMetaSchemaOptions.call(this); + if (opts.formats) + addInitialFormats.call(this); + this._addVocabularies(); + this._addDefaultMetaSchema(); + if (opts.keywords) + addInitialKeywords.call(this, opts.keywords); + if (typeof opts.meta == "object") + this.addMetaSchema(opts.meta); + addInitialSchemas.call(this); + opts.validateFormats = formatOpt; + } + _addVocabularies() { + this.addKeyword("$async"); + } + _addDefaultMetaSchema() { + const { $data, meta: meta3, schemaId } = this.opts; + let _dataRefSchema = $dataRefSchema; + if (schemaId === "id") { + _dataRefSchema = { ...$dataRefSchema }; + _dataRefSchema.id = _dataRefSchema.$id; + delete _dataRefSchema.$id; + } + if (meta3 && $data) + this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false); + } + defaultMeta() { + const { meta: meta3, schemaId } = this.opts; + return this.opts.defaultMeta = typeof meta3 == "object" ? meta3[schemaId] || meta3 : void 0; + } + validate(schemaKeyRef, data) { + let v2; + if (typeof schemaKeyRef == "string") { + v2 = this.getSchema(schemaKeyRef); + if (!v2) + throw new Error(`no schema with key or ref "${schemaKeyRef}"`); + } else { + v2 = this.compile(schemaKeyRef); + } + const valid = v2(data); + if (!("$async" in v2)) + this.errors = v2.errors; + return valid; + } + compile(schema, _meta) { + const sch = this._addSchema(schema, _meta); + return sch.validate || this._compileSchemaEnv(sch); + } + compileAsync(schema, meta3) { + if (typeof this.opts.loadSchema != "function") { + throw new Error("options.loadSchema should be a function"); + } + const { loadSchema } = this.opts; + return runCompileAsync.call(this, schema, meta3); + async function runCompileAsync(_schema, _meta) { + await loadMetaSchema.call(this, _schema.$schema); + const sch = this._addSchema(_schema, _meta); + return sch.validate || _compileAsync.call(this, sch); + } + async function loadMetaSchema($ref) { + if ($ref && !this.getSchema($ref)) { + await runCompileAsync.call(this, { $ref }, true); + } + } + async function _compileAsync(sch) { + try { + return this._compileSchemaEnv(sch); + } catch (e) { + if (!(e instanceof ref_error_1.default)) + throw e; + checkLoaded.call(this, e); + await loadMissingSchema.call(this, e.missingSchema); + return _compileAsync.call(this, sch); + } + } + function checkLoaded({ missingSchema: ref, missingRef }) { + if (this.refs[ref]) { + throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`); + } + } + async function loadMissingSchema(ref) { + const _schema = await _loadSchema.call(this, ref); + if (!this.refs[ref]) + await loadMetaSchema.call(this, _schema.$schema); + if (!this.refs[ref]) + this.addSchema(_schema, ref, meta3); + } + async function _loadSchema(ref) { + const p = this._loading[ref]; + if (p) + return p; + try { + return await (this._loading[ref] = loadSchema(ref)); + } finally { + delete this._loading[ref]; + } + } + } + // Adds schema to the instance + addSchema(schema, key, _meta, _validateSchema = this.opts.validateSchema) { + if (Array.isArray(schema)) { + for (const sch of schema) + this.addSchema(sch, void 0, _meta, _validateSchema); + return this; + } + let id; + if (typeof schema === "object") { + const { schemaId } = this.opts; + id = schema[schemaId]; + if (id !== void 0 && typeof id != "string") { + throw new Error(`schema ${schemaId} must be string`); + } + } + key = (0, resolve_1.normalizeId)(key || id); + this._checkUnique(key); + this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true); + return this; + } + // Add schema that will be used to validate other schemas + // options in META_IGNORE_OPTIONS are alway set to false + addMetaSchema(schema, key, _validateSchema = this.opts.validateSchema) { + this.addSchema(schema, key, true, _validateSchema); + return this; + } + // Validate schema against its meta-schema + validateSchema(schema, throwOrLogError) { + if (typeof schema == "boolean") + return true; + let $schema; + $schema = schema.$schema; + if ($schema !== void 0 && typeof $schema != "string") { + throw new Error("$schema must be a string"); + } + $schema = $schema || this.opts.defaultMeta || this.defaultMeta(); + if (!$schema) { + this.logger.warn("meta-schema not available"); + this.errors = null; + return true; + } + const valid = this.validate($schema, schema); + if (!valid && throwOrLogError) { + const message = "schema is invalid: " + this.errorsText(); + if (this.opts.validateSchema === "log") + this.logger.error(message); + else + throw new Error(message); + } + return valid; + } + // Get compiled schema by `key` or `ref`. + // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id) + getSchema(keyRef) { + let sch; + while (typeof (sch = getSchEnv.call(this, keyRef)) == "string") + keyRef = sch; + if (sch === void 0) { + const { schemaId } = this.opts; + const root = new compile_1.SchemaEnv({ schema: {}, schemaId }); + sch = compile_1.resolveSchema.call(this, root, keyRef); + if (!sch) + return; + this.refs[keyRef] = sch; + } + return sch.validate || this._compileSchemaEnv(sch); + } + // Remove cached schema(s). + // If no parameter is passed all schemas but meta-schemas are removed. + // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. + // Even if schema is referenced by other schemas it still can be removed as other schemas have local references. + removeSchema(schemaKeyRef) { + if (schemaKeyRef instanceof RegExp) { + this._removeAllSchemas(this.schemas, schemaKeyRef); + this._removeAllSchemas(this.refs, schemaKeyRef); + return this; + } + switch (typeof schemaKeyRef) { + case "undefined": + this._removeAllSchemas(this.schemas); + this._removeAllSchemas(this.refs); + this._cache.clear(); + return this; + case "string": { + const sch = getSchEnv.call(this, schemaKeyRef); + if (typeof sch == "object") + this._cache.delete(sch.schema); + delete this.schemas[schemaKeyRef]; + delete this.refs[schemaKeyRef]; + return this; + } + case "object": { + const cacheKey = schemaKeyRef; + this._cache.delete(cacheKey); + let id = schemaKeyRef[this.opts.schemaId]; + if (id) { + id = (0, resolve_1.normalizeId)(id); + delete this.schemas[id]; + delete this.refs[id]; + } + return this; + } + default: + throw new Error("ajv.removeSchema: invalid parameter"); + } + } + // add "vocabulary" - a collection of keywords + addVocabulary(definitions) { + for (const def of definitions) + this.addKeyword(def); + return this; + } + addKeyword(kwdOrDef, def) { + let keyword; + if (typeof kwdOrDef == "string") { + keyword = kwdOrDef; + if (typeof def == "object") { + this.logger.warn("these parameters are deprecated, see docs for addKeyword"); + def.keyword = keyword; + } + } else if (typeof kwdOrDef == "object" && def === void 0) { + def = kwdOrDef; + keyword = def.keyword; + if (Array.isArray(keyword) && !keyword.length) { + throw new Error("addKeywords: keyword must be string or non-empty array"); + } + } else { + throw new Error("invalid addKeywords parameters"); + } + checkKeyword.call(this, keyword, def); + if (!def) { + (0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd)); + return this; + } + keywordMetaschema.call(this, def); + const definition = { + ...def, + type: (0, dataType_1.getJSONTypes)(def.type), + schemaType: (0, dataType_1.getJSONTypes)(def.schemaType) + }; + (0, util_1.eachItem)(keyword, definition.type.length === 0 ? (k2) => addRule.call(this, k2, definition) : (k2) => definition.type.forEach((t) => addRule.call(this, k2, definition, t))); + return this; + } + getKeyword(keyword) { + const rule = this.RULES.all[keyword]; + return typeof rule == "object" ? rule.definition : !!rule; + } + // Remove keyword + removeKeyword(keyword) { + const { RULES } = this; + delete RULES.keywords[keyword]; + delete RULES.all[keyword]; + for (const group of RULES.rules) { + const i = group.rules.findIndex((rule) => rule.keyword === keyword); + if (i >= 0) + group.rules.splice(i, 1); + } + return this; + } + // Add format + addFormat(name, format) { + if (typeof format == "string") + format = new RegExp(format); + this.formats[name] = format; + return this; + } + errorsText(errors = this.errors, { separator = ", ", dataVar = "data" } = {}) { + if (!errors || errors.length === 0) + return "No errors"; + return errors.map((e) => `${dataVar}${e.instancePath} ${e.message}`).reduce((text, msg) => text + separator + msg); + } + $dataMetaSchema(metaSchema, keywordsJsonPointers) { + const rules = this.RULES.all; + metaSchema = JSON.parse(JSON.stringify(metaSchema)); + for (const jsonPointer of keywordsJsonPointers) { + const segments = jsonPointer.split("/").slice(1); + let keywords = metaSchema; + for (const seg of segments) + keywords = keywords[seg]; + for (const key in rules) { + const rule = rules[key]; + if (typeof rule != "object") + continue; + const { $data } = rule.definition; + const schema = keywords[key]; + if ($data && schema) + keywords[key] = schemaOrData(schema); + } + } + return metaSchema; + } + _removeAllSchemas(schemas, regex) { + for (const keyRef in schemas) { + const sch = schemas[keyRef]; + if (!regex || regex.test(keyRef)) { + if (typeof sch == "string") { + delete schemas[keyRef]; + } else if (sch && !sch.meta) { + this._cache.delete(sch.schema); + delete schemas[keyRef]; + } + } + } + } + _addSchema(schema, meta3, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) { + let id; + const { schemaId } = this.opts; + if (typeof schema == "object") { + id = schema[schemaId]; + } else { + if (this.opts.jtd) + throw new Error("schema must be object"); + else if (typeof schema != "boolean") + throw new Error("schema must be object or boolean"); + } + let sch = this._cache.get(schema); + if (sch !== void 0) + return sch; + baseId = (0, resolve_1.normalizeId)(id || baseId); + const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId); + sch = new compile_1.SchemaEnv({ schema, schemaId, meta: meta3, baseId, localRefs }); + this._cache.set(sch.schema, sch); + if (addSchema && !baseId.startsWith("#")) { + if (baseId) + this._checkUnique(baseId); + this.refs[baseId] = sch; + } + if (validateSchema) + this.validateSchema(schema, true); + return sch; + } + _checkUnique(id) { + if (this.schemas[id] || this.refs[id]) { + throw new Error(`schema with key or id "${id}" already exists`); + } + } + _compileSchemaEnv(sch) { + if (sch.meta) + this._compileMetaSchema(sch); + else + compile_1.compileSchema.call(this, sch); + if (!sch.validate) + throw new Error("ajv implementation error"); + return sch.validate; + } + _compileMetaSchema(sch) { + const currentOpts = this.opts; + this.opts = this._metaOpts; + try { + compile_1.compileSchema.call(this, sch); + } finally { + this.opts = currentOpts; + } + } + }; + Ajv2.ValidationError = validation_error_1.default; + Ajv2.MissingRefError = ref_error_1.default; + exports.default = Ajv2; + function checkOptions(checkOpts, options, msg, log = "error") { + for (const key in checkOpts) { + const opt = key; + if (opt in options) + this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`); + } + } + function getSchEnv(keyRef) { + keyRef = (0, resolve_1.normalizeId)(keyRef); + return this.schemas[keyRef] || this.refs[keyRef]; + } + function addInitialSchemas() { + const optsSchemas = this.opts.schemas; + if (!optsSchemas) + return; + if (Array.isArray(optsSchemas)) + this.addSchema(optsSchemas); + else + for (const key in optsSchemas) + this.addSchema(optsSchemas[key], key); + } + function addInitialFormats() { + for (const name in this.opts.formats) { + const format = this.opts.formats[name]; + if (format) + this.addFormat(name, format); + } + } + function addInitialKeywords(defs) { + if (Array.isArray(defs)) { + this.addVocabulary(defs); + return; + } + this.logger.warn("keywords option as map is deprecated, pass array"); + for (const keyword in defs) { + const def = defs[keyword]; + if (!def.keyword) + def.keyword = keyword; + this.addKeyword(def); + } + } + function getMetaSchemaOptions() { + const metaOpts = { ...this.opts }; + for (const opt of META_IGNORE_OPTIONS) + delete metaOpts[opt]; + return metaOpts; + } + var noLogs = { log() { + }, warn() { + }, error() { + } }; + function getLogger(logger) { + if (logger === false) + return noLogs; + if (logger === void 0) + return console; + if (logger.log && logger.warn && logger.error) + return logger; + throw new Error("logger must implement log, warn and error methods"); + } + var KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i; + function checkKeyword(keyword, def) { + const { RULES } = this; + (0, util_1.eachItem)(keyword, (kwd) => { + if (RULES.keywords[kwd]) + throw new Error(`Keyword ${kwd} is already defined`); + if (!KEYWORD_NAME.test(kwd)) + throw new Error(`Keyword ${kwd} has invalid name`); + }); + if (!def) + return; + if (def.$data && !("code" in def || "validate" in def)) { + throw new Error('$data keyword must have "code" or "validate" function'); + } + } + function addRule(keyword, definition, dataType) { + var _a3; + const post = definition === null || definition === void 0 ? void 0 : definition.post; + if (dataType && post) + throw new Error('keyword with "post" flag cannot have "type"'); + const { RULES } = this; + let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType); + if (!ruleGroup) { + ruleGroup = { type: dataType, rules: [] }; + RULES.rules.push(ruleGroup); + } + RULES.keywords[keyword] = true; + if (!definition) + return; + const rule = { + keyword, + definition: { + ...definition, + type: (0, dataType_1.getJSONTypes)(definition.type), + schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType) + } + }; + if (definition.before) + addBeforeRule.call(this, ruleGroup, rule, definition.before); + else + ruleGroup.rules.push(rule); + RULES.all[keyword] = rule; + (_a3 = definition.implements) === null || _a3 === void 0 ? void 0 : _a3.forEach((kwd) => this.addKeyword(kwd)); + } + function addBeforeRule(ruleGroup, rule, before) { + const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before); + if (i >= 0) { + ruleGroup.rules.splice(i, 0, rule); + } else { + ruleGroup.rules.push(rule); + this.logger.warn(`rule ${before} is not defined`); + } + } + function keywordMetaschema(def) { + let { metaSchema } = def; + if (metaSchema === void 0) + return; + if (def.$data && this.opts.$data) + metaSchema = schemaOrData(metaSchema); + def.validateSchema = this.compile(metaSchema, true); + } + var $dataRef = { + $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" + }; + function schemaOrData(schema) { + return { anyOf: [schema, $dataRef] }; + } + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js +var require_id2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var def = { + keyword: "id", + code() { + throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID'); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js +var require_ref2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.callRef = exports.getValidate = void 0; + var ref_error_1 = require_ref_error2(); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var compile_1 = require_compile2(); + var util_1 = require_util2(); + var def = { + keyword: "$ref", + schemaType: "string", + code(cxt) { + const { gen, schema: $ref, it } = cxt; + const { baseId, schemaEnv: env, validateName, opts, self } = it; + const { root } = env; + if (($ref === "#" || $ref === "#/") && baseId === root.baseId) + return callRootRef(); + const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref); + if (schOrEnv === void 0) + throw new ref_error_1.default(it.opts.uriResolver, baseId, $ref); + if (schOrEnv instanceof compile_1.SchemaEnv) + return callValidate(schOrEnv); + return inlineRefSchema(schOrEnv); + function callRootRef() { + if (env === root) + return callRef(cxt, validateName, env, env.$async); + const rootName = gen.scopeValue("root", { ref: root }); + return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async); + } + function callValidate(sch) { + const v2 = getValidate(cxt, sch); + callRef(cxt, v2, sch, sch.$async); + } + function inlineRefSchema(sch) { + const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: (0, codegen_1.stringify)(sch) } : { ref: sch }); + const valid = gen.name("valid"); + const schCxt = cxt.subschema({ + schema: sch, + dataTypes: [], + schemaPath: codegen_1.nil, + topSchemaRef: schName, + errSchemaPath: $ref + }, valid); + cxt.mergeEvaluated(schCxt); + cxt.ok(valid); + } + } + }; + function getValidate(cxt, sch) { + const { gen } = cxt; + return sch.validate ? gen.scopeValue("validate", { ref: sch.validate }) : (0, codegen_1._)`${gen.scopeValue("wrapper", { ref: sch })}.validate`; + } + exports.getValidate = getValidate; + function callRef(cxt, v2, sch, $async) { + const { gen, it } = cxt; + const { allErrors, schemaEnv: env, opts } = it; + const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil; + if ($async) + callAsyncRef(); + else + callSyncRef(); + function callAsyncRef() { + if (!env.$async) + throw new Error("async schema referenced by sync schema"); + const valid = gen.let("valid"); + gen.try(() => { + gen.code((0, codegen_1._)`await ${(0, code_1.callValidateCode)(cxt, v2, passCxt)}`); + addEvaluatedFrom(v2); + if (!allErrors) + gen.assign(valid, true); + }, (e) => { + gen.if((0, codegen_1._)`!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e)); + addErrorsFrom(e); + if (!allErrors) + gen.assign(valid, false); + }); + cxt.ok(valid); + } + function callSyncRef() { + cxt.result((0, code_1.callValidateCode)(cxt, v2, passCxt), () => addEvaluatedFrom(v2), () => addErrorsFrom(v2)); + } + function addErrorsFrom(source) { + const errs = (0, codegen_1._)`${source}.errors`; + gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`); + gen.assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); + } + function addEvaluatedFrom(source) { + var _a3; + if (!it.opts.unevaluated) + return; + const schEvaluated = (_a3 = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a3 === void 0 ? void 0 : _a3.evaluated; + if (it.props !== true) { + if (schEvaluated && !schEvaluated.dynamicProps) { + if (schEvaluated.props !== void 0) { + it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props); + } + } else { + const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`); + it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name); + } + } + if (it.items !== true) { + if (schEvaluated && !schEvaluated.dynamicItems) { + if (schEvaluated.items !== void 0) { + it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items); + } + } else { + const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`); + it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name); + } + } + } + } + exports.callRef = callRef; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js +var require_core4 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var id_1 = require_id2(); + var ref_1 = require_ref2(); + var core = [ + "$schema", + "$id", + "$defs", + "$vocabulary", + { keyword: "$comment" }, + "definitions", + id_1.default, + ref_1.default + ]; + exports.default = core; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +var require_limitNumber2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var ops = codegen_1.operators; + var KWDs = { + maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, + minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, + exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, + exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE } + }; + var error61 = { + message: ({ keyword, schemaCode }) => (0, codegen_1.str)`must be ${KWDs[keyword].okStr} ${schemaCode}`, + params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}` + }; + var def = { + keyword: Object.keys(KWDs), + type: "number", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + cxt.fail$data((0, codegen_1._)`${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +var require_multipleOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must be multiple of ${schemaCode}`, + params: ({ schemaCode }) => (0, codegen_1._)`{multipleOf: ${schemaCode}}` + }; + var def = { + keyword: "multipleOf", + type: "number", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { gen, data, schemaCode, it } = cxt; + const prec = it.opts.multipleOfPrecision; + const res = gen.let("res"); + const invalid = prec ? (0, codegen_1._)`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}` : (0, codegen_1._)`${res} !== parseInt(${res})`; + cxt.fail$data((0, codegen_1._)`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js +var require_ucs2length2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + function ucs2length(str) { + const len = str.length; + let length = 0; + let pos = 0; + let value; + while (pos < len) { + length++; + value = str.charCodeAt(pos++); + if (value >= 55296 && value <= 56319 && pos < len) { + value = str.charCodeAt(pos); + if ((value & 64512) === 56320) + pos++; + } + } + return length; + } + exports.default = ucs2length; + ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default'; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js +var require_limitLength2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var ucs2length_1 = require_ucs2length2(); + var error61 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxLength" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} characters`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxLength", "minLength"], + type: "string", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode, it } = cxt; + const op = keyword === "maxLength" ? codegen_1.operators.GT : codegen_1.operators.LT; + const len = it.opts.unicode === false ? (0, codegen_1._)`${data}.length` : (0, codegen_1._)`${(0, util_1.useFunc)(cxt.gen, ucs2length_1.default)}(${data})`; + cxt.fail$data((0, codegen_1._)`${len} ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js +var require_pattern2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var util_1 = require_util2(); + var codegen_1 = require_codegen2(); + var error61 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must match pattern "${schemaCode}"`, + params: ({ schemaCode }) => (0, codegen_1._)`{pattern: ${schemaCode}}` + }; + var def = { + keyword: "pattern", + type: "string", + schemaType: "string", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + const u = it.opts.unicodeRegExp ? "u" : ""; + if ($data) { + const { regExp } = it.opts.code; + const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); + const valid = gen.let("valid"); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); + cxt.fail$data((0, codegen_1._)`!${valid}`); + } else { + const regExp = (0, code_1.usePattern)(cxt, schema); + cxt.fail$data((0, codegen_1._)`!${regExp}.test(${data})`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +var require_limitProperties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxProperties" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} properties`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxProperties", "minProperties"], + type: "object", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT; + cxt.fail$data((0, codegen_1._)`Object.keys(${data}).length ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js +var require_required2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { missingProperty } }) => (0, codegen_1.str)`must have required property '${missingProperty}'`, + params: ({ params: { missingProperty } }) => (0, codegen_1._)`{missingProperty: ${missingProperty}}` + }; + var def = { + keyword: "required", + type: "object", + schemaType: "array", + $data: true, + error: error61, + code(cxt) { + const { gen, schema, schemaCode, data, $data, it } = cxt; + const { opts } = it; + if (!$data && schema.length === 0) + return; + const useLoop = schema.length >= opts.loopRequired; + if (it.allErrors) + allErrorsMode(); + else + exitOnErrorMode(); + if (opts.strictRequired) { + const props = cxt.parentSchema.properties; + const { definedProperties } = cxt.it; + for (const requiredKey of schema) { + if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === void 0 && !definedProperties.has(requiredKey)) { + const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; + const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`; + (0, util_1.checkStrictMode)(it, msg, it.opts.strictRequired); + } + } + } + function allErrorsMode() { + if (useLoop || $data) { + cxt.block$data(codegen_1.nil, loopAllRequired); + } else { + for (const prop of schema) { + (0, code_1.checkReportMissingProp)(cxt, prop); + } + } + } + function exitOnErrorMode() { + const missing = gen.let("missing"); + if (useLoop || $data) { + const valid = gen.let("valid", true); + cxt.block$data(valid, () => loopUntilMissing(missing, valid)); + cxt.ok(valid); + } else { + gen.if((0, code_1.checkMissingProp)(cxt, schema, missing)); + (0, code_1.reportMissingProp)(cxt, missing); + gen.else(); + } + } + function loopAllRequired() { + gen.forOf("prop", schemaCode, (prop) => { + cxt.setParams({ missingProperty: prop }); + gen.if((0, code_1.noPropertyInData)(gen, data, prop, opts.ownProperties), () => cxt.error()); + }); + } + function loopUntilMissing(missing, valid) { + cxt.setParams({ missingProperty: missing }); + gen.forOf(missing, schemaCode, () => { + gen.assign(valid, (0, code_1.propertyInData)(gen, data, missing, opts.ownProperties)); + gen.if((0, codegen_1.not)(valid), () => { + cxt.error(); + gen.break(); + }); + }, codegen_1.nil); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js +var require_limitItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxItems" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} items`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxItems", "minItems"], + type: "array", + schemaType: "number", + $data: true, + error: error61, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + const op = keyword === "maxItems" ? codegen_1.operators.GT : codegen_1.operators.LT; + cxt.fail$data((0, codegen_1._)`${data}.length ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js +var require_equal2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var equal = require_fast_deep_equal(); + equal.code = 'require("ajv/dist/runtime/equal").default'; + exports.default = equal; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +var require_uniqueItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dataType_1 = require_dataType2(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var equal_1 = require_equal2(); + var error61 = { + message: ({ params: { i, j: j2 } }) => (0, codegen_1.str)`must NOT have duplicate items (items ## ${j2} and ${i} are identical)`, + params: ({ params: { i, j: j2 } }) => (0, codegen_1._)`{i: ${i}, j: ${j2}}` + }; + var def = { + keyword: "uniqueItems", + type: "array", + schemaType: "boolean", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt; + if (!$data && !schema) + return; + const valid = gen.let("valid"); + const itemTypes = parentSchema.items ? (0, dataType_1.getSchemaTypes)(parentSchema.items) : []; + cxt.block$data(valid, validateUniqueItems, (0, codegen_1._)`${schemaCode} === false`); + cxt.ok(valid); + function validateUniqueItems() { + const i = gen.let("i", (0, codegen_1._)`${data}.length`); + const j2 = gen.let("j"); + cxt.setParams({ i, j: j2 }); + gen.assign(valid, true); + gen.if((0, codegen_1._)`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j2)); + } + function canOptimize() { + return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array"); + } + function loopN(i, j2) { + const item = gen.name("item"); + const wrongType = (0, dataType_1.checkDataTypes)(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong); + const indices = gen.const("indices", (0, codegen_1._)`{}`); + gen.for((0, codegen_1._)`;${i}--;`, () => { + gen.let(item, (0, codegen_1._)`${data}[${i}]`); + gen.if(wrongType, (0, codegen_1._)`continue`); + if (itemTypes.length > 1) + gen.if((0, codegen_1._)`typeof ${item} == "string"`, (0, codegen_1._)`${item} += "_"`); + gen.if((0, codegen_1._)`typeof ${indices}[${item}] == "number"`, () => { + gen.assign(j2, (0, codegen_1._)`${indices}[${item}]`); + cxt.error(); + gen.assign(valid, false).break(); + }).code((0, codegen_1._)`${indices}[${item}] = ${i}`); + }); + } + function loopN2(i, j2) { + const eql = (0, util_1.useFunc)(gen, equal_1.default); + const outer = gen.name("outer"); + gen.label(outer).for((0, codegen_1._)`;${i}--;`, () => gen.for((0, codegen_1._)`${j2} = ${i}; ${j2}--;`, () => gen.if((0, codegen_1._)`${eql}(${data}[${i}], ${data}[${j2}])`, () => { + cxt.error(); + gen.assign(valid, false).break(outer); + }))); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js +var require_const2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var equal_1 = require_equal2(); + var error61 = { + message: "must be equal to constant", + params: ({ schemaCode }) => (0, codegen_1._)`{allowedValue: ${schemaCode}}` + }; + var def = { + keyword: "const", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schemaCode, schema } = cxt; + if ($data || schema && typeof schema == "object") { + cxt.fail$data((0, codegen_1._)`!${(0, util_1.useFunc)(gen, equal_1.default)}(${data}, ${schemaCode})`); + } else { + cxt.fail((0, codegen_1._)`${schema} !== ${data}`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js +var require_enum2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var equal_1 = require_equal2(); + var error61 = { + message: "must be equal to one of the allowed values", + params: ({ schemaCode }) => (0, codegen_1._)`{allowedValues: ${schemaCode}}` + }; + var def = { + keyword: "enum", + schemaType: "array", + $data: true, + error: error61, + code(cxt) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + if (!$data && schema.length === 0) + throw new Error("enum must have non-empty array"); + const useLoop = schema.length >= it.opts.loopEnum; + let eql; + const getEql = () => eql !== null && eql !== void 0 ? eql : eql = (0, util_1.useFunc)(gen, equal_1.default); + let valid; + if (useLoop || $data) { + valid = gen.let("valid"); + cxt.block$data(valid, loopEnum); + } else { + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const vSchema = gen.const("vSchema", schemaCode); + valid = (0, codegen_1.or)(...schema.map((_x, i) => equalCode(vSchema, i))); + } + cxt.pass(valid); + function loopEnum() { + gen.assign(valid, false); + gen.forOf("v", schemaCode, (v2) => gen.if((0, codegen_1._)`${getEql()}(${data}, ${v2})`, () => gen.assign(valid, true).break())); + } + function equalCode(vSchema, i) { + const sch = schema[i]; + return typeof sch === "object" && sch !== null ? (0, codegen_1._)`${getEql()}(${data}, ${vSchema}[${i}])` : (0, codegen_1._)`${data} === ${sch}`; + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js +var require_validation2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var limitNumber_1 = require_limitNumber2(); + var multipleOf_1 = require_multipleOf2(); + var limitLength_1 = require_limitLength2(); + var pattern_1 = require_pattern2(); + var limitProperties_1 = require_limitProperties2(); + var required_1 = require_required2(); + var limitItems_1 = require_limitItems2(); + var uniqueItems_1 = require_uniqueItems2(); + var const_1 = require_const2(); + var enum_1 = require_enum2(); + var validation = [ + // number + limitNumber_1.default, + multipleOf_1.default, + // string + limitLength_1.default, + pattern_1.default, + // object + limitProperties_1.default, + required_1.default, + // array + limitItems_1.default, + uniqueItems_1.default, + // any + { keyword: "type", schemaType: ["string", "array"] }, + { keyword: "nullable", schemaType: "boolean" }, + const_1.default, + enum_1.default + ]; + exports.default = validation; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +var require_additionalItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateAdditionalItems = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "additionalItems", + type: "array", + schemaType: ["boolean", "object"], + before: "uniqueItems", + error: error61, + code(cxt) { + const { parentSchema, it } = cxt; + const { items } = parentSchema; + if (!Array.isArray(items)) { + (0, util_1.checkStrictMode)(it, '"additionalItems" is ignored when "items" is not an array of schemas'); + return; + } + validateAdditionalItems(cxt, items); + } + }; + function validateAdditionalItems(cxt, items) { + const { gen, schema, data, keyword, it } = cxt; + it.items = true; + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + if (schema === false) { + cxt.setParams({ len: items.length }); + cxt.pass((0, codegen_1._)`${len} <= ${items.length}`); + } else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.var("valid", (0, codegen_1._)`${len} <= ${items.length}`); + gen.if((0, codegen_1.not)(valid), () => validateItems(valid)); + cxt.ok(valid); + } + function validateItems(valid) { + gen.forRange("i", items.length, len, (i) => { + cxt.subschema({ keyword, dataProp: i, dataPropType: util_1.Type.Num }, valid); + if (!it.allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + }); + } + } + exports.validateAdditionalItems = validateAdditionalItems; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js +var require_items2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateTuple = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var code_1 = require_code4(); + var def = { + keyword: "items", + type: "array", + schemaType: ["object", "array", "boolean"], + before: "uniqueItems", + code(cxt) { + const { schema, it } = cxt; + if (Array.isArray(schema)) + return validateTuple(cxt, "additionalItems", schema); + it.items = true; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + cxt.ok((0, code_1.validateArray)(cxt)); + } + }; + function validateTuple(cxt, extraItems, schArr = cxt.schema) { + const { gen, parentSchema, data, keyword, it } = cxt; + checkStrictTuple(parentSchema); + if (it.opts.unevaluated && schArr.length && it.items !== true) { + it.items = util_1.mergeEvaluated.items(gen, schArr.length, it.items); + } + const valid = gen.name("valid"); + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + schArr.forEach((sch, i) => { + if ((0, util_1.alwaysValidSchema)(it, sch)) + return; + gen.if((0, codegen_1._)`${len} > ${i}`, () => cxt.subschema({ + keyword, + schemaProp: i, + dataProp: i + }, valid)); + cxt.ok(valid); + }); + function checkStrictTuple(sch) { + const { opts, errSchemaPath } = it; + const l3 = schArr.length; + const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); + if (opts.strictTuples && !fullTuple) { + const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); + } + } + } + exports.validateTuple = validateTuple; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +var require_prefixItems2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var items_1 = require_items2(); + var def = { + keyword: "prefixItems", + type: "array", + schemaType: ["array"], + before: "uniqueItems", + code: (cxt) => (0, items_1.validateTuple)(cxt, "items") + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js +var require_items20202 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var code_1 = require_code4(); + var additionalItems_1 = require_additionalItems2(); + var error61 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "items", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + error: error61, + code(cxt) { + const { schema, parentSchema, it } = cxt; + const { prefixItems } = parentSchema; + it.items = true; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + if (prefixItems) + (0, additionalItems_1.validateAdditionalItems)(cxt, prefixItems); + else + cxt.ok((0, code_1.validateArray)(cxt)); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js +var require_contains2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1.str)`must contain at least ${min} valid item(s)` : (0, codegen_1.str)`must contain at least ${min} and no more than ${max} valid item(s)`, + params: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1._)`{minContains: ${min}}` : (0, codegen_1._)`{minContains: ${min}, maxContains: ${max}}` + }; + var def = { + keyword: "contains", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + trackErrors: true, + error: error61, + code(cxt) { + const { gen, schema, parentSchema, data, it } = cxt; + let min; + let max; + const { minContains, maxContains } = parentSchema; + if (it.opts.next) { + min = minContains === void 0 ? 1 : minContains; + max = maxContains; + } else { + min = 1; + } + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + cxt.setParams({ min, max }); + if (max === void 0 && min === 0) { + (0, util_1.checkStrictMode)(it, `"minContains" == 0 without "maxContains": "contains" keyword ignored`); + return; + } + if (max !== void 0 && min > max) { + (0, util_1.checkStrictMode)(it, `"minContains" > "maxContains" is always invalid`); + cxt.fail(); + return; + } + if ((0, util_1.alwaysValidSchema)(it, schema)) { + let cond = (0, codegen_1._)`${len} >= ${min}`; + if (max !== void 0) + cond = (0, codegen_1._)`${cond} && ${len} <= ${max}`; + cxt.pass(cond); + return; + } + it.items = true; + const valid = gen.name("valid"); + if (max === void 0 && min === 1) { + validateItems(valid, () => gen.if(valid, () => gen.break())); + } else if (min === 0) { + gen.let(valid, true); + if (max !== void 0) + gen.if((0, codegen_1._)`${data}.length > 0`, validateItemsWithCount); + } else { + gen.let(valid, false); + validateItemsWithCount(); + } + cxt.result(valid, () => cxt.reset()); + function validateItemsWithCount() { + const schValid = gen.name("_valid"); + const count = gen.let("count", 0); + validateItems(schValid, () => gen.if(schValid, () => checkLimits(count))); + } + function validateItems(_valid, block) { + gen.forRange("i", 0, len, (i) => { + cxt.subschema({ + keyword: "contains", + dataProp: i, + dataPropType: util_1.Type.Num, + compositeRule: true + }, _valid); + block(); + }); + } + function checkLimits(count) { + gen.code((0, codegen_1._)`${count}++`); + if (max === void 0) { + gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break()); + } else { + gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break()); + if (min === 1) + gen.assign(valid, true); + else + gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true)); + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +var require_dependencies2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var code_1 = require_code4(); + exports.error = { + message: ({ params: { property, depsCount, deps } }) => { + const property_ies = depsCount === 1 ? "property" : "properties"; + return (0, codegen_1.str)`must have ${property_ies} ${deps} when property ${property} is present`; + }, + params: ({ params: { property, depsCount, deps, missingProperty } }) => (0, codegen_1._)`{property: ${property}, + missingProperty: ${missingProperty}, + depsCount: ${depsCount}, + deps: ${deps}}` + // TODO change to reference + }; + var def = { + keyword: "dependencies", + type: "object", + schemaType: "object", + error: exports.error, + code(cxt) { + const [propDeps, schDeps] = splitDependencies(cxt); + validatePropertyDeps(cxt, propDeps); + validateSchemaDeps(cxt, schDeps); + } + }; + function splitDependencies({ schema }) { + const propertyDeps = {}; + const schemaDeps = {}; + for (const key in schema) { + if (key === "__proto__") + continue; + const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps; + deps[key] = schema[key]; + } + return [propertyDeps, schemaDeps]; + } + function validatePropertyDeps(cxt, propertyDeps = cxt.schema) { + const { gen, data, it } = cxt; + if (Object.keys(propertyDeps).length === 0) + return; + const missing = gen.let("missing"); + for (const prop in propertyDeps) { + const deps = propertyDeps[prop]; + if (deps.length === 0) + continue; + const hasProperty = (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties); + cxt.setParams({ + property: prop, + depsCount: deps.length, + deps: deps.join(", ") + }); + if (it.allErrors) { + gen.if(hasProperty, () => { + for (const depProp of deps) { + (0, code_1.checkReportMissingProp)(cxt, depProp); + } + }); + } else { + gen.if((0, codegen_1._)`${hasProperty} && (${(0, code_1.checkMissingProp)(cxt, deps, missing)})`); + (0, code_1.reportMissingProp)(cxt, missing); + gen.else(); + } + } + } + exports.validatePropertyDeps = validatePropertyDeps; + function validateSchemaDeps(cxt, schemaDeps = cxt.schema) { + const { gen, data, keyword, it } = cxt; + const valid = gen.name("valid"); + for (const prop in schemaDeps) { + if ((0, util_1.alwaysValidSchema)(it, schemaDeps[prop])) + continue; + gen.if( + (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties), + () => { + const schCxt = cxt.subschema({ keyword, schemaProp: prop }, valid); + cxt.mergeValidEvaluated(schCxt, valid); + }, + () => gen.var(valid, true) + // TODO var + ); + cxt.ok(valid); + } + } + exports.validateSchemaDeps = validateSchemaDeps; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +var require_propertyNames2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: "property name must be valid", + params: ({ params }) => (0, codegen_1._)`{propertyName: ${params.propertyName}}` + }; + var def = { + keyword: "propertyNames", + type: "object", + schemaType: ["object", "boolean"], + error: error61, + code(cxt) { + const { gen, schema, data, it } = cxt; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + const valid = gen.name("valid"); + gen.forIn("key", data, (key) => { + cxt.setParams({ propertyName: key }); + cxt.subschema({ + keyword: "propertyNames", + data: key, + dataTypes: ["string"], + propertyName: key, + compositeRule: true + }, valid); + gen.if((0, codegen_1.not)(valid), () => { + cxt.error(true); + if (!it.allErrors) + gen.break(); + }); + }); + cxt.ok(valid); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +var require_additionalProperties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var names_1 = require_names2(); + var util_1 = require_util2(); + var error61 = { + message: "must NOT have additional properties", + params: ({ params }) => (0, codegen_1._)`{additionalProperty: ${params.additionalProperty}}` + }; + var def = { + keyword: "additionalProperties", + type: ["object"], + schemaType: ["boolean", "object"], + allowUndefined: true, + trackErrors: true, + error: error61, + code(cxt) { + const { gen, schema, parentSchema, data, errsCount, it } = cxt; + if (!errsCount) + throw new Error("ajv implementation error"); + const { allErrors, opts } = it; + it.props = true; + if (opts.removeAdditional !== "all" && (0, util_1.alwaysValidSchema)(it, schema)) + return; + const props = (0, code_1.allSchemaProperties)(parentSchema.properties); + const patProps = (0, code_1.allSchemaProperties)(parentSchema.patternProperties); + checkAdditionalProperties(); + cxt.ok((0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + function checkAdditionalProperties() { + gen.forIn("key", data, (key) => { + if (!props.length && !patProps.length) + additionalPropertyCode(key); + else + gen.if(isAdditional(key), () => additionalPropertyCode(key)); + }); + } + function isAdditional(key) { + let definedProp; + if (props.length > 8) { + const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema.properties, "properties"); + definedProp = (0, code_1.isOwnProperty)(gen, propsSchema, key); + } else if (props.length) { + definedProp = (0, codegen_1.or)(...props.map((p) => (0, codegen_1._)`${key} === ${p}`)); + } else { + definedProp = codegen_1.nil; + } + if (patProps.length) { + definedProp = (0, codegen_1.or)(definedProp, ...patProps.map((p) => (0, codegen_1._)`${(0, code_1.usePattern)(cxt, p)}.test(${key})`)); + } + return (0, codegen_1.not)(definedProp); + } + function deleteAdditional(key) { + gen.code((0, codegen_1._)`delete ${data}[${key}]`); + } + function additionalPropertyCode(key) { + if (opts.removeAdditional === "all" || opts.removeAdditional && schema === false) { + deleteAdditional(key); + return; + } + if (schema === false) { + cxt.setParams({ additionalProperty: key }); + cxt.error(); + if (!allErrors) + gen.break(); + return; + } + if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.name("valid"); + if (opts.removeAdditional === "failing") { + applyAdditionalSchema(key, valid, false); + gen.if((0, codegen_1.not)(valid), () => { + cxt.reset(); + deleteAdditional(key); + }); + } else { + applyAdditionalSchema(key, valid); + if (!allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + } + } + function applyAdditionalSchema(key, valid, errors) { + const subschema = { + keyword: "additionalProperties", + dataProp: key, + dataPropType: util_1.Type.Str + }; + if (errors === false) { + Object.assign(subschema, { + compositeRule: true, + createErrors: false, + allErrors: false + }); + } + cxt.subschema(subschema, valid); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js +var require_properties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var validate_1 = require_validate2(); + var code_1 = require_code4(); + var util_1 = require_util2(); + var additionalProperties_1 = require_additionalProperties2(); + var def = { + keyword: "properties", + type: "object", + schemaType: "object", + code(cxt) { + const { gen, schema, parentSchema, data, it } = cxt; + if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === void 0) { + additionalProperties_1.default.code(new validate_1.KeywordCxt(it, additionalProperties_1.default, "additionalProperties")); + } + const allProps = (0, code_1.allSchemaProperties)(schema); + for (const prop of allProps) { + it.definedProperties.add(prop); + } + if (it.opts.unevaluated && allProps.length && it.props !== true) { + it.props = util_1.mergeEvaluated.props(gen, (0, util_1.toHash)(allProps), it.props); + } + const properties = allProps.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p])); + if (properties.length === 0) + return; + const valid = gen.name("valid"); + for (const prop of properties) { + if (hasDefault(prop)) { + applyPropertySchema(prop); + } else { + gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties)); + applyPropertySchema(prop); + if (!it.allErrors) + gen.else().var(valid, true); + gen.endIf(); + } + cxt.it.definedProperties.add(prop); + cxt.ok(valid); + } + function hasDefault(prop) { + return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== void 0; + } + function applyPropertySchema(prop) { + cxt.subschema({ + keyword: "properties", + schemaProp: prop, + dataProp: prop + }, valid); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +var require_patternProperties2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var util_2 = require_util2(); + var def = { + keyword: "patternProperties", + type: "object", + schemaType: "object", + code(cxt) { + const { gen, schema, data, parentSchema, it } = cxt; + const { opts } = it; + const patterns = (0, code_1.allSchemaProperties)(schema); + const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p])); + if (patterns.length === 0 || alwaysValidPatterns.length === patterns.length && (!it.opts.unevaluated || it.props === true)) { + return; + } + const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties; + const valid = gen.name("valid"); + if (it.props !== true && !(it.props instanceof codegen_1.Name)) { + it.props = (0, util_2.evaluatedPropsToName)(gen, it.props); + } + const { props } = it; + validatePatternProperties(); + function validatePatternProperties() { + for (const pat of patterns) { + if (checkProperties) + checkMatchingProperties(pat); + if (it.allErrors) { + validateProperties(pat); + } else { + gen.var(valid, true); + validateProperties(pat); + gen.if(valid); + } + } + } + function checkMatchingProperties(pat) { + for (const prop in checkProperties) { + if (new RegExp(pat).test(prop)) { + (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`); + } + } + } + function validateProperties(pat) { + gen.forIn("key", data, (key) => { + gen.if((0, codegen_1._)`${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => { + const alwaysValid = alwaysValidPatterns.includes(pat); + if (!alwaysValid) { + cxt.subschema({ + keyword: "patternProperties", + schemaProp: pat, + dataProp: key, + dataPropType: util_2.Type.Str + }, valid); + } + if (it.opts.unevaluated && props !== true) { + gen.assign((0, codegen_1._)`${props}[${key}]`, true); + } else if (!alwaysValid && !it.allErrors) { + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + }); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js +var require_not2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util2(); + var def = { + keyword: "not", + schemaType: ["object", "boolean"], + trackErrors: true, + code(cxt) { + const { gen, schema, it } = cxt; + if ((0, util_1.alwaysValidSchema)(it, schema)) { + cxt.fail(); + return; + } + const valid = gen.name("valid"); + cxt.subschema({ + keyword: "not", + compositeRule: true, + createErrors: false, + allErrors: false + }, valid); + cxt.failResult(valid, () => cxt.reset(), () => cxt.error()); + }, + error: { message: "must NOT be valid" } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +var require_anyOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code4(); + var def = { + keyword: "anyOf", + schemaType: "array", + trackErrors: true, + code: code_1.validateUnion, + error: { message: "must match a schema in anyOf" } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +var require_oneOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: "must match exactly one schema in oneOf", + params: ({ params }) => (0, codegen_1._)`{passingSchemas: ${params.passing}}` + }; + var def = { + keyword: "oneOf", + schemaType: "array", + trackErrors: true, + error: error61, + code(cxt) { + const { gen, schema, parentSchema, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + if (it.opts.discriminator && parentSchema.discriminator) + return; + const schArr = schema; + const valid = gen.let("valid", false); + const passing = gen.let("passing", null); + const schValid = gen.name("_valid"); + cxt.setParams({ passing }); + gen.block(validateOneOf); + cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); + function validateOneOf() { + schArr.forEach((sch, i) => { + let schCxt; + if ((0, util_1.alwaysValidSchema)(it, sch)) { + gen.var(schValid, true); + } else { + schCxt = cxt.subschema({ + keyword: "oneOf", + schemaProp: i, + compositeRule: true + }, schValid); + } + if (i > 0) { + gen.if((0, codegen_1._)`${schValid} && ${valid}`).assign(valid, false).assign(passing, (0, codegen_1._)`[${passing}, ${i}]`).else(); + } + gen.if(schValid, () => { + gen.assign(valid, true); + gen.assign(passing, i); + if (schCxt) + cxt.mergeEvaluated(schCxt, codegen_1.Name); + }); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js +var require_allOf2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util2(); + var def = { + keyword: "allOf", + schemaType: "array", + code(cxt) { + const { gen, schema, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const valid = gen.name("valid"); + schema.forEach((sch, i) => { + if ((0, util_1.alwaysValidSchema)(it, sch)) + return; + const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid); + cxt.ok(valid); + cxt.mergeEvaluated(schCxt); + }); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js +var require_if2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`, + params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}` + }; + var def = { + keyword: "if", + schemaType: ["object", "boolean"], + trackErrors: true, + error: error61, + code(cxt) { + const { gen, parentSchema, it } = cxt; + if (parentSchema.then === void 0 && parentSchema.else === void 0) { + (0, util_1.checkStrictMode)(it, '"if" without "then" and "else" is ignored'); + } + const hasThen = hasSchema(it, "then"); + const hasElse = hasSchema(it, "else"); + if (!hasThen && !hasElse) + return; + const valid = gen.let("valid", true); + const schValid = gen.name("_valid"); + validateIf(); + cxt.reset(); + if (hasThen && hasElse) { + const ifClause = gen.let("ifClause"); + cxt.setParams({ ifClause }); + gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause)); + } else if (hasThen) { + gen.if(schValid, validateClause("then")); + } else { + gen.if((0, codegen_1.not)(schValid), validateClause("else")); + } + cxt.pass(valid, () => cxt.error(true)); + function validateIf() { + const schCxt = cxt.subschema({ + keyword: "if", + compositeRule: true, + createErrors: false, + allErrors: false + }, schValid); + cxt.mergeEvaluated(schCxt); + } + function validateClause(keyword, ifClause) { + return () => { + const schCxt = cxt.subschema({ keyword }, schValid); + gen.assign(valid, schValid); + cxt.mergeValidEvaluated(schCxt, valid); + if (ifClause) + gen.assign(ifClause, (0, codegen_1._)`${keyword}`); + else + cxt.setParams({ ifClause: keyword }); + }; + } + } + }; + function hasSchema(it, keyword) { + const schema = it.schema[keyword]; + return schema !== void 0 && !(0, util_1.alwaysValidSchema)(it, schema); + } + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +var require_thenElse2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util2(); + var def = { + keyword: ["then", "else"], + schemaType: ["object", "boolean"], + code({ keyword, parentSchema, it }) { + if (parentSchema.if === void 0) + (0, util_1.checkStrictMode)(it, `"${keyword}" without "if" is ignored`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js +var require_applicator2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var additionalItems_1 = require_additionalItems2(); + var prefixItems_1 = require_prefixItems2(); + var items_1 = require_items2(); + var items2020_1 = require_items20202(); + var contains_1 = require_contains2(); + var dependencies_1 = require_dependencies2(); + var propertyNames_1 = require_propertyNames2(); + var additionalProperties_1 = require_additionalProperties2(); + var properties_1 = require_properties2(); + var patternProperties_1 = require_patternProperties2(); + var not_1 = require_not2(); + var anyOf_1 = require_anyOf2(); + var oneOf_1 = require_oneOf2(); + var allOf_1 = require_allOf2(); + var if_1 = require_if2(); + var thenElse_1 = require_thenElse2(); + function getApplicator(draft2020 = false) { + const applicator = [ + // any + not_1.default, + anyOf_1.default, + oneOf_1.default, + allOf_1.default, + if_1.default, + thenElse_1.default, + // object + propertyNames_1.default, + additionalProperties_1.default, + dependencies_1.default, + properties_1.default, + patternProperties_1.default + ]; + if (draft2020) + applicator.push(prefixItems_1.default, items2020_1.default); + else + applicator.push(additionalItems_1.default, items_1.default); + applicator.push(contains_1.default); + return applicator; + } + exports.default = getApplicator; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js +var require_format3 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var error61 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`, + params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}` + }; + var def = { + keyword: "format", + type: ["number", "string"], + schemaType: "string", + $data: true, + error: error61, + code(cxt, ruleType) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + const { opts, errSchemaPath, schemaEnv, self } = it; + if (!opts.validateFormats) + return; + if ($data) + validate$DataFormat(); + else + validateFormat(); + function validate$DataFormat() { + const fmts = gen.scopeValue("formats", { + ref: self.formats, + code: opts.code.formats + }); + const fDef = gen.const("fDef", (0, codegen_1._)`${fmts}[${schemaCode}]`); + const fType = gen.let("fType"); + const format = gen.let("format"); + gen.if((0, codegen_1._)`typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._)`${fDef}.type || "string"`).assign(format, (0, codegen_1._)`${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._)`"string"`).assign(format, fDef)); + cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt())); + function unknownFmt() { + if (opts.strictSchema === false) + return codegen_1.nil; + return (0, codegen_1._)`${schemaCode} && !${format}`; + } + function invalidFmt() { + const callFormat = schemaEnv.$async ? (0, codegen_1._)`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))` : (0, codegen_1._)`${format}(${data})`; + const validData = (0, codegen_1._)`(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`; + return (0, codegen_1._)`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`; + } + } + function validateFormat() { + const formatDef = self.formats[schema]; + if (!formatDef) { + unknownFormat(); + return; + } + if (formatDef === true) + return; + const [fmtType, format, fmtRef] = getFormat(formatDef); + if (fmtType === ruleType) + cxt.pass(validCondition()); + function unknownFormat() { + if (opts.strictSchema === false) { + self.logger.warn(unknownMsg()); + return; + } + throw new Error(unknownMsg()); + function unknownMsg() { + return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`; + } + } + function getFormat(fmtDef) { + const code = fmtDef instanceof RegExp ? (0, codegen_1.regexpCode)(fmtDef) : opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(schema)}` : void 0; + const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code }); + if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) { + return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._)`${fmt}.validate`]; + } + return ["string", fmtDef, fmt]; + } + function validCondition() { + if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) { + if (!schemaEnv.$async) + throw new Error("async format in sync schema"); + return (0, codegen_1._)`await ${fmtRef}(${data})`; + } + return typeof format == "function" ? (0, codegen_1._)`${fmtRef}(${data})` : (0, codegen_1._)`${fmtRef}.test(${data})`; + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js +var require_format4 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var format_1 = require_format3(); + var format = [format_1.default]; + exports.default = format; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js +var require_metadata2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.contentVocabulary = exports.metadataVocabulary = void 0; + exports.metadataVocabulary = [ + "title", + "description", + "default", + "deprecated", + "readOnly", + "writeOnly", + "examples" + ]; + exports.contentVocabulary = [ + "contentMediaType", + "contentEncoding", + "contentSchema" + ]; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js +var require_draft72 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var core_1 = require_core4(); + var validation_1 = require_validation2(); + var applicator_1 = require_applicator2(); + var format_1 = require_format4(); + var metadata_1 = require_metadata2(); + var draft7Vocabularies = [ + core_1.default, + validation_1.default, + (0, applicator_1.default)(), + format_1.default, + metadata_1.metadataVocabulary, + metadata_1.contentVocabulary + ]; + exports.default = draft7Vocabularies; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js +var require_types2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.DiscrError = void 0; + var DiscrError; + (function(DiscrError2) { + DiscrError2["Tag"] = "tag"; + DiscrError2["Mapping"] = "mapping"; + })(DiscrError || (exports.DiscrError = DiscrError = {})); + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js +var require_discriminator2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen2(); + var types_1 = require_types2(); + var compile_1 = require_compile2(); + var ref_error_1 = require_ref_error2(); + var util_1 = require_util2(); + var error61 = { + message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`, + params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}` + }; + var def = { + keyword: "discriminator", + type: "object", + schemaType: "object", + error: error61, + code(cxt) { + const { gen, data, schema, parentSchema, it } = cxt; + const { oneOf } = parentSchema; + if (!it.opts.discriminator) { + throw new Error("discriminator: requires discriminator option"); + } + const tagName = schema.propertyName; + if (typeof tagName != "string") + throw new Error("discriminator: requires propertyName"); + if (schema.mapping) + throw new Error("discriminator: mapping is not supported"); + if (!oneOf) + throw new Error("discriminator: requires oneOf keyword"); + const valid = gen.let("valid", false); + const tag = gen.const("tag", (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(tagName)}`); + gen.if((0, codegen_1._)`typeof ${tag} == "string"`, () => validateMapping(), () => cxt.error(false, { discrError: types_1.DiscrError.Tag, tag, tagName })); + cxt.ok(valid); + function validateMapping() { + const mapping = getMapping(); + gen.if(false); + for (const tagValue in mapping) { + gen.elseIf((0, codegen_1._)`${tag} === ${tagValue}`); + gen.assign(valid, applyTagSchema(mapping[tagValue])); + } + gen.else(); + cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag, tagName }); + gen.endIf(); + } + function applyTagSchema(schemaProp) { + const _valid = gen.name("valid"); + const schCxt = cxt.subschema({ keyword: "oneOf", schemaProp }, _valid); + cxt.mergeEvaluated(schCxt, codegen_1.Name); + return _valid; + } + function getMapping() { + var _a3; + const oneOfMapping = {}; + const topRequired = hasRequired(parentSchema); + let tagRequired = true; + for (let i = 0; i < oneOf.length; i++) { + let sch = oneOf[i]; + if ((sch === null || sch === void 0 ? void 0 : sch.$ref) && !(0, util_1.schemaHasRulesButRef)(sch, it.self.RULES)) { + const ref = sch.$ref; + sch = compile_1.resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref); + if (sch instanceof compile_1.SchemaEnv) + sch = sch.schema; + if (sch === void 0) + throw new ref_error_1.default(it.opts.uriResolver, it.baseId, ref); + } + const propSch = (_a3 = sch === null || sch === void 0 ? void 0 : sch.properties) === null || _a3 === void 0 ? void 0 : _a3[tagName]; + if (typeof propSch != "object") { + throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`); + } + tagRequired = tagRequired && (topRequired || hasRequired(sch)); + addMappings(propSch, i); + } + if (!tagRequired) + throw new Error(`discriminator: "${tagName}" must be required`); + return oneOfMapping; + function hasRequired({ required: required2 }) { + return Array.isArray(required2) && required2.includes(tagName); + } + function addMappings(sch, i) { + if (sch.const) { + addMapping(sch.const, i); + } else if (sch.enum) { + for (const tagValue of sch.enum) { + addMapping(tagValue, i); + } + } else { + throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`); + } + } + function addMapping(tagValue, i) { + if (typeof tagValue != "string" || tagValue in oneOfMapping) { + throw new Error(`discriminator: "${tagName}" values must be unique strings`); + } + oneOfMapping[tagValue] = i; + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json +var require_json_schema_draft_072 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { + module.exports = { + $schema: "http://json-schema.org/draft-07/schema#", + $id: "http://json-schema.org/draft-07/schema#", + title: "Core schema meta-schema", + definitions: { + schemaArray: { + type: "array", + minItems: 1, + items: { $ref: "#" } + }, + nonNegativeInteger: { + type: "integer", + minimum: 0 + }, + nonNegativeIntegerDefault0: { + allOf: [{ $ref: "#/definitions/nonNegativeInteger" }, { default: 0 }] + }, + simpleTypes: { + enum: ["array", "boolean", "integer", "null", "number", "object", "string"] + }, + stringArray: { + type: "array", + items: { type: "string" }, + uniqueItems: true, + default: [] + } + }, + type: ["object", "boolean"], + properties: { + $id: { + type: "string", + format: "uri-reference" + }, + $schema: { + type: "string", + format: "uri" + }, + $ref: { + type: "string", + format: "uri-reference" + }, + $comment: { + type: "string" + }, + title: { + type: "string" + }, + description: { + type: "string" + }, + default: true, + readOnly: { + type: "boolean", + default: false + }, + examples: { + type: "array", + items: true + }, + multipleOf: { + type: "number", + exclusiveMinimum: 0 + }, + maximum: { + type: "number" + }, + exclusiveMaximum: { + type: "number" + }, + minimum: { + type: "number" + }, + exclusiveMinimum: { + type: "number" + }, + maxLength: { $ref: "#/definitions/nonNegativeInteger" }, + minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + pattern: { + type: "string", + format: "regex" + }, + additionalItems: { $ref: "#" }, + items: { + anyOf: [{ $ref: "#" }, { $ref: "#/definitions/schemaArray" }], + default: true + }, + maxItems: { $ref: "#/definitions/nonNegativeInteger" }, + minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + uniqueItems: { + type: "boolean", + default: false + }, + contains: { $ref: "#" }, + maxProperties: { $ref: "#/definitions/nonNegativeInteger" }, + minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + required: { $ref: "#/definitions/stringArray" }, + additionalProperties: { $ref: "#" }, + definitions: { + type: "object", + additionalProperties: { $ref: "#" }, + default: {} + }, + properties: { + type: "object", + additionalProperties: { $ref: "#" }, + default: {} + }, + patternProperties: { + type: "object", + additionalProperties: { $ref: "#" }, + propertyNames: { format: "regex" }, + default: {} + }, + dependencies: { + type: "object", + additionalProperties: { + anyOf: [{ $ref: "#" }, { $ref: "#/definitions/stringArray" }] + } + }, + propertyNames: { $ref: "#" }, + const: true, + enum: { + type: "array", + items: true, + minItems: 1, + uniqueItems: true + }, + type: { + anyOf: [ + { $ref: "#/definitions/simpleTypes" }, + { + type: "array", + items: { $ref: "#/definitions/simpleTypes" }, + minItems: 1, + uniqueItems: true + } + ] + }, + format: { type: "string" }, + contentMediaType: { type: "string" }, + contentEncoding: { type: "string" }, + if: { $ref: "#" }, + then: { $ref: "#" }, + else: { $ref: "#" }, + allOf: { $ref: "#/definitions/schemaArray" }, + anyOf: { $ref: "#/definitions/schemaArray" }, + oneOf: { $ref: "#/definitions/schemaArray" }, + not: { $ref: "#" } + }, + default: true + }; + } +}); + +// node_modules/ajv-formats/node_modules/ajv/dist/ajv.js +var require_ajv2 = __commonJS({ + "node_modules/ajv-formats/node_modules/ajv/dist/ajv.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; + var core_1 = require_core3(); + var draft7_1 = require_draft72(); + var discriminator_1 = require_discriminator2(); + var draft7MetaSchema = require_json_schema_draft_072(); + var META_SUPPORT_DATA = ["/properties"]; + var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema"; + var Ajv2 = class extends core_1.default { + _addVocabularies() { + super._addVocabularies(); + draft7_1.default.forEach((v2) => this.addVocabulary(v2)); + if (this.opts.discriminator) + this.addKeyword(discriminator_1.default); + } + _addDefaultMetaSchema() { + super._addDefaultMetaSchema(); + if (!this.opts.meta) + return; + const metaSchema = this.opts.$data ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA) : draft7MetaSchema; + this.addMetaSchema(metaSchema, META_SCHEMA_ID, false); + this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID; + } + defaultMeta() { + return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0); + } + }; + exports.Ajv = Ajv2; + module.exports = exports = Ajv2; + module.exports.Ajv = Ajv2; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = Ajv2; + var validate_1 = require_validate2(); Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { return validate_1.KeywordCxt; } }); - var codegen_1 = require_codegen(); + var codegen_1 = require_codegen2(); Object.defineProperty(exports, "_", { enumerable: true, get: function() { return codegen_1._; } }); @@ -6866,228 +12680,25 @@ var require_ajv = __commonJS({ Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { return codegen_1.CodeGen; } }); - var validation_error_1 = require_validation_error(); + var validation_error_1 = require_validation_error2(); Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { return validation_error_1.default; } }); - var ref_error_1 = require_ref_error(); + var ref_error_1 = require_ref_error2(); Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { return ref_error_1.default; } }); } }); -// node_modules/ajv-formats/dist/formats.js -var require_formats = __commonJS({ - "node_modules/ajv-formats/dist/formats.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.formatNames = exports.fastFormats = exports.fullFormats = void 0; - function fmtDef(validate2, compare) { - return { validate: validate2, compare }; - } - exports.fullFormats = { - // date: http://tools.ietf.org/html/rfc3339#section-5.6 - date: fmtDef(date5, compareDate), - // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 - time: fmtDef(getTime(true), compareTime), - "date-time": fmtDef(getDateTime(true), compareDateTime), - "iso-time": fmtDef(getTime(), compareIsoTime), - "iso-date-time": fmtDef(getDateTime(), compareIsoDateTime), - // duration: https://tools.ietf.org/html/rfc3339#appendix-A - duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, - uri, - "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i, - // uri-template: https://tools.ietf.org/html/rfc6570 - "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i, - // For the source: https://gist.github.com/dperini/729294 - // For test cases: https://mathiasbynens.be/demo/url-regex - url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu, - email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, - hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i, - // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/, - ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, - regex, - // uuid: http://tools.ietf.org/html/rfc4122 - uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, - // JSON-pointer: https://tools.ietf.org/html/rfc6901 - // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A - "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/, - "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i, - // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 - "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/, - // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types - // byte: https://github.com/miguelmota/is-base64 - byte, - // signed 32 bit integer - int32: { type: "number", validate: validateInt32 }, - // signed 64 bit integer - int64: { type: "number", validate: validateInt64 }, - // C-type float - float: { type: "number", validate: validateNumber }, - // C-type double - double: { type: "number", validate: validateNumber }, - // hint to the UI to hide input strings - password: true, - // unchecked string payload - binary: true - }; - exports.fastFormats = { - ...exports.fullFormats, - date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate), - time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime), - "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), - "iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime), - "iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime), - // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js - uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, - "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, - // email (sources from jsen validator): - // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 - // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation') - email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i - }; - exports.formatNames = Object.keys(exports.fullFormats); - function isLeapYear(year) { - return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - } - var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; - var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - function date5(str) { - const matches = DATE.exec(str); - if (!matches) - return false; - const year = +matches[1]; - const month = +matches[2]; - const day = +matches[3]; - return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]); - } - function compareDate(d1, d2) { - if (!(d1 && d2)) - return void 0; - if (d1 > d2) - return 1; - if (d1 < d2) - return -1; - return 0; - } - var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i; - function getTime(strictTimeZone) { - return function time3(str) { - const matches = TIME.exec(str); - if (!matches) - return false; - const hr = +matches[1]; - const min = +matches[2]; - const sec = +matches[3]; - const tz = matches[4]; - const tzSign = matches[5] === "-" ? -1 : 1; - const tzH = +(matches[6] || 0); - const tzM = +(matches[7] || 0); - if (tzH > 23 || tzM > 59 || strictTimeZone && !tz) - return false; - if (hr <= 23 && min <= 59 && sec < 60) - return true; - const utcMin = min - tzM * tzSign; - const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0); - return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61; - }; - } - function compareTime(s1, s2) { - if (!(s1 && s2)) - return void 0; - const t1 = (/* @__PURE__ */ new Date("2020-01-01T" + s1)).valueOf(); - const t2 = (/* @__PURE__ */ new Date("2020-01-01T" + s2)).valueOf(); - if (!(t1 && t2)) - return void 0; - return t1 - t2; - } - function compareIsoTime(t1, t2) { - if (!(t1 && t2)) - return void 0; - const a1 = TIME.exec(t1); - const a2 = TIME.exec(t2); - if (!(a1 && a2)) - return void 0; - t1 = a1[1] + a1[2] + a1[3]; - t2 = a2[1] + a2[2] + a2[3]; - if (t1 > t2) - return 1; - if (t1 < t2) - return -1; - return 0; - } - var DATE_TIME_SEPARATOR = /t|\s/i; - function getDateTime(strictTimeZone) { - const time3 = getTime(strictTimeZone); - return function date_time(str) { - const dateTime = str.split(DATE_TIME_SEPARATOR); - return dateTime.length === 2 && date5(dateTime[0]) && time3(dateTime[1]); - }; - } - function compareDateTime(dt1, dt2) { - if (!(dt1 && dt2)) - return void 0; - const d1 = new Date(dt1).valueOf(); - const d2 = new Date(dt2).valueOf(); - if (!(d1 && d2)) - return void 0; - return d1 - d2; - } - function compareIsoDateTime(dt1, dt2) { - if (!(dt1 && dt2)) - return void 0; - const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR); - const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR); - const res = compareDate(d1, d2); - if (res === void 0) - return void 0; - return res || compareTime(t1, t2); - } - var NOT_URI_FRAGMENT = /\/|:/; - var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; - function uri(str) { - return NOT_URI_FRAGMENT.test(str) && URI.test(str); - } - var BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm; - function byte(str) { - BYTE.lastIndex = 0; - return BYTE.test(str); - } - var MIN_INT32 = -(2 ** 31); - var MAX_INT32 = 2 ** 31 - 1; - function validateInt32(value) { - return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32; - } - function validateInt64(value) { - return Number.isInteger(value); - } - function validateNumber() { - return true; - } - var Z_ANCHOR = /[^\\]\\Z/; - function regex(str) { - if (Z_ANCHOR.test(str)) - return false; - try { - new RegExp(str); - return true; - } catch (e) { - return false; - } - } - } -}); - // node_modules/ajv-formats/dist/limit.js var require_limit = __commonJS({ "node_modules/ajv-formats/dist/limit.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatLimitDefinition = void 0; - var ajv_1 = require_ajv(); - var codegen_1 = require_codegen(); + var ajv_1 = require_ajv2(); + var codegen_1 = require_codegen2(); var ops = codegen_1.operators; var KWDs = { formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, @@ -7159,7 +12770,7 @@ var require_dist = __commonJS({ Object.defineProperty(exports, "__esModule", { value: true }); var formats_1 = require_formats(); var limit_1 = require_limit(); - var codegen_1 = require_codegen(); + var codegen_1 = require_codegen2(); var fullName = new codegen_1.Name("fullFormats"); var fastName = new codegen_1.Name("fastFormats"); var formatsPlugin = (ajv, opts = { keywords: true }) => { @@ -7181,12 +12792,12 @@ var require_dist = __commonJS({ throw new Error(`Unknown format "${name}"`); return f; }; - function addFormats(ajv, list, fs5, exportName) { + function addFormats(ajv, list, fs6, exportName) { var _a3; var _b; (_a3 = (_b = ajv.opts.code).formats) !== null && _a3 !== void 0 ? _a3 : _b.formats = (0, codegen_1._)`require("ajv-formats/dist/formats").${exportName}`; for (const f of list) - ajv.addFormat(f, fs5[f]); + ajv.addFormat(f, fs6[f]); } module.exports = exports = formatsPlugin; Object.defineProperty(exports, "__esModule", { value: true }); @@ -7637,9 +13248,9 @@ function floatSafeRemainder(val, step) { return ratio - roundedRatio; } var EVALUATING = /* @__PURE__ */ Symbol("evaluating"); -function defineLazy(object3, key, getter) { +function defineLazy(object4, key, getter) { let value = void 0; - Object.defineProperty(object3, key, { + Object.defineProperty(object4, key, { get() { if (value === EVALUATING) { return void 0; @@ -7651,7 +13262,7 @@ function defineLazy(object3, key, getter) { return value; }, set(v2) { - Object.defineProperty(object3, key, { + Object.defineProperty(object4, key, { value: v2 // configurable: true, }); @@ -7681,18 +13292,18 @@ function mergeDefs(...defs) { function cloneDef(schema) { return mergeDefs(schema._zod.def); } -function getElementAtPath(obj, path3) { - if (!path3) +function getElementAtPath(obj, path4) { + if (!path4) return obj; - return path3.reduce((acc, key) => acc?.[key], obj); + return path4.reduce((acc, key) => acc?.[key], obj); } function promiseAllObject(promisesObj) { - const keys = Object.keys(promisesObj); - const promises = keys.map((key) => promisesObj[key]); + const keys2 = Object.keys(promisesObj); + const promises = keys2.map((key) => promisesObj[key]); return Promise.all(promises).then((results) => { const resolvedObj = {}; - for (let i = 0; i < keys.length; i++) { - resolvedObj[keys[i]] = results[i]; + for (let i = 0; i < keys2.length; i++) { + resolvedObj[keys2[i]] = results[i]; } return resolvedObj; }); @@ -8096,11 +13707,11 @@ function explicitlyAborted(x2, startIndex = 0) { } return false; } -function prefixIssues(path3, issues) { +function prefixIssues(path4, issues) { return issues.map((iss) => { var _a3; (_a3 = iss).path ?? (_a3.path = []); - iss.path.unshift(path3); + iss.path.unshift(path4); return iss; }); } @@ -8533,16 +14144,16 @@ function flattenError(error61, mapper = (issue2) => issue2.message) { } function formatError(error61, mapper = (issue2) => issue2.message) { const fieldErrors = { _errors: [] }; - const processError = (error62, path3 = []) => { + const processError = (error62, path4 = []) => { for (const issue2 of error62.issues) { if (issue2.code === "invalid_union" && issue2.errors.length) { - issue2.errors.map((issues) => processError({ issues }, [...path3, ...issue2.path])); + issue2.errors.map((issues) => processError({ issues }, [...path4, ...issue2.path])); } else if (issue2.code === "invalid_key") { - processError({ issues: issue2.issues }, [...path3, ...issue2.path]); + processError({ issues: issue2.issues }, [...path4, ...issue2.path]); } else if (issue2.code === "invalid_element") { - processError({ issues: issue2.issues }, [...path3, ...issue2.path]); + processError({ issues: issue2.issues }, [...path4, ...issue2.path]); } else { - const fullpath = [...path3, ...issue2.path]; + const fullpath = [...path4, ...issue2.path]; if (fullpath.length === 0) { fieldErrors._errors.push(mapper(issue2)); } else { @@ -8581,17 +14192,17 @@ function formatError(error61, mapper = (issue2) => issue2.message) { } function treeifyError(error61, mapper = (issue2) => issue2.message) { const result = { errors: [] }; - const processError = (error62, path3 = []) => { + const processError = (error62, path4 = []) => { var _a3; for (const issue2 of error62.issues) { if (issue2.code === "invalid_union" && issue2.errors.length) { - issue2.errors.map((issues) => processError({ issues }, [...path3, ...issue2.path])); + issue2.errors.map((issues) => processError({ issues }, [...path4, ...issue2.path])); } else if (issue2.code === "invalid_key") { - processError({ issues: issue2.issues }, [...path3, ...issue2.path]); + processError({ issues: issue2.issues }, [...path4, ...issue2.path]); } else if (issue2.code === "invalid_element") { - processError({ issues: issue2.issues }, [...path3, ...issue2.path]); + processError({ issues: issue2.issues }, [...path4, ...issue2.path]); } else { - const fullpath = [...path3, ...issue2.path]; + const fullpath = [...path4, ...issue2.path]; if (fullpath.length === 0) { result.errors.push(mapper(issue2)); continue; @@ -8630,8 +14241,8 @@ function treeifyError(error61, mapper = (issue2) => issue2.message) { } function toDotPath(_path) { const segs = []; - const path3 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); - for (const seg of path3) { + const path4 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); + for (const seg of path4) { if (typeof seg === "number") segs.push(`[${seg}]`); else if (typeof seg === "symbol") @@ -10330,10 +15941,10 @@ function handlePropertyResult(result, final, key, input2, optin, optout) { } var NO_SYMBOL_KEYS = []; function normalizeDef(def) { - const keys = Object.keys(def.shape); + const keys2 = Object.keys(def.shape); const ownSymbols = Object.getOwnPropertySymbols(def.shape); const symbolKeys = ownSymbols.length ? ownSymbols : NO_SYMBOL_KEYS; - const allKeys = symbolKeys.length ? [...keys, ...symbolKeys] : keys; + const allKeys = symbolKeys.length ? [...keys2, ...symbolKeys] : keys2; for (const k2 of allKeys) { if (!def.shape?.[k2]?._zod?.traits?.has("$ZodType")) { throw new Error(`Invalid element at key "${String(k2)}": expected a Zod schema`); @@ -10345,8 +15956,8 @@ function normalizeDef(def) { allKeys, symbolKeys, // string-only: handleCatchall matches it against `for...in`, which never yields a symbol - keySet: new Set(keys), - numKeys: keys.length, + keySet: new Set(keys2), + numKeys: keys2.length, optionalKeys: new Set(okeys) }; } @@ -10864,19 +16475,19 @@ function handleIntersectionResults(result, left, right) { let unrecIssue; const keyIssues = /* @__PURE__ */ new Map(); const collect = (iss, side) => { - let keys; + let keys2; if (iss.code === "unrecognized_keys" && !iss.path?.length) { unrecIssue ?? (unrecIssue = iss); - keys = iss.keys; + keys2 = iss.keys; } else if (iss.code === "invalid_key" && iss.origin === "record" && iss.path?.length === 1) { const k2 = String(iss.path[0]); if (!keyIssues.has(k2)) keyIssues.set(k2, iss); - keys = [k2]; + keys2 = [k2]; } else { return false; } - for (const k2 of keys) { + for (const k2 of keys2) { if (!unrecKeys.has(k2)) unrecKeys.set(k2, {}); unrecKeys.get(k2)[side] = true; @@ -19439,8 +25050,8 @@ function registry() { var globalRegistry = globalThis.__zod_globalRegistry; // node_modules/zod/v4/core/compile.js -var INVALID = Symbol.for("zod.compile.invalid"); -var FALLBACK_FLAG = Symbol.for("zod.compile.fallback"); +var INVALID = /* @__PURE__ */ Symbol.for("zod.compile.invalid"); +var FALLBACK_FLAG = /* @__PURE__ */ Symbol.for("zod.compile.fallback"); var ZodCompileAsyncError = class extends Error { constructor(message = "z.compile does not support async refinements, transforms, or checks") { super(message); @@ -20160,13 +25771,13 @@ function generateObjectCheck(doc, ctx, schema, accessor, buildsValue = true) { const def = schema._zod.def; doc.write(`if (typeof ${accessor} !== "object" || ${accessor} === null || Array.isArray(${accessor})) return INVALID;`); const shape = def.shape; - const keys = Object.keys(shape); + const keys2 = Object.keys(shape); const symbolKeys = Object.getOwnPropertySymbols(shape); - const allKeys = symbolKeys.length ? [...keys, ...symbolKeys] : keys; + const allKeys = symbolKeys.length ? [...keys2, ...symbolKeys] : keys2; const keyExpr = (k2) => typeof k2 === "symbol" ? addConstant(ctx, k2) : esc(k2); const propKey = (k2) => typeof k2 === "symbol" ? `[${keyExpr(k2)}]` : esc(k2); const propShape = shape; - if (keys.includes("__proto__")) { + if (keys2.includes("__proto__")) { throw new ZodCompileUnsupportedError('object shape key "__proto__"'); } const propOutputs = /* @__PURE__ */ new Map(); @@ -20208,7 +25819,7 @@ function generateObjectCheck(doc, ctx, schema, accessor, buildsValue = true) { if (catchall) { const catchallType = catchall._zod.def.type; if (catchallType === "never") { - const condition = keys.map((k2) => `k !== ${esc(k2)}`).join(" && ") || "true"; + const condition = keys2.map((k2) => `k !== ${esc(k2)}`).join(" && ") || "true"; doc.write(`for (const k in ${accessor}) {`); doc.indented((d2) => { d2.write(`if (${condition}) return INVALID;`); @@ -20224,7 +25835,7 @@ function generateObjectCheck(doc, ctx, schema, accessor, buildsValue = true) { const hasConditionalKeys = allKeys.some((k2) => mayOutputUndefined(propShape[k2]) || dropsWhenAbsent(propShape[k2])); if (!buildsValue) { if (unknownKeysMode === "schema") { - const knownSet = keys.length > 0 ? addConstant(ctx, new Set(keys)) : null; + const knownSet = keys2.length > 0 ? addConstant(ctx, new Set(keys2)) : null; doc.write(`for (const k in ${accessor}) {`); doc.indented((d2) => { d2.write(`if (k === "__proto__") continue;`); @@ -20256,7 +25867,7 @@ function generateObjectCheck(doc, ctx, schema, accessor, buildsValue = true) { } } if (unknownKeysMode !== "none") { - const knownSet = keys.length > 0 ? addConstant(ctx, new Set(keys)) : null; + const knownSet = keys2.length > 0 ? addConstant(ctx, new Set(keys2)) : null; doc.write(`for (const k in ${accessor}) {`); doc.indented((d2) => { d2.write(`if (k === "__proto__") continue;`); @@ -22244,8 +27855,8 @@ function compactTypeUnion(schema) { if (!option || typeof option !== "object") return; compactTypeUnion(option); - const keys = Object.keys(option); - if (keys.length !== 1 || keys[0] !== "type") + const keys2 = Object.keys(option); + if (keys2.length !== 1 || keys2[0] !== "type") return; const type = option.type; for (const member of Array.isArray(type) ? type : [type]) { @@ -22279,8 +27890,8 @@ function foldObjects(members2) { } const properties = {}; const required2 = /* @__PURE__ */ new Set(); - for (const object3 of objects) { - for (const key in object3.properties) { + for (const object4 of objects) { + for (const key in object4.properties) { if (Object.prototype.hasOwnProperty.call(properties, key)) continue; const parts = []; @@ -22294,18 +27905,18 @@ function foldObjects(members2) { const merged = parts.length === 1 ? parts[0] : foldObjects(parts) ?? { allOf: parts }; assignProp(properties, key, merged); } - for (const key of object3.required ?? []) + for (const key of object4.required ?? []) required2.add(key); } const folded = { type: "object", properties }; if (required2.size) folded.required = [...required2]; - if (objects.every((object3) => object3.additionalProperties === false)) { + if (objects.every((object4) => object4.additionalProperties === false)) { folded.additionalProperties = false; } else { const constraints = []; - for (const object3 of objects) { - const constraint = undeclaredConstraint(object3); + for (const object4 of objects) { + const constraint = undeclaredConstraint(object4); if (constraint && !constraints.some((seen) => JSON.stringify(seen) === JSON.stringify(constraint))) constraints.push(constraint); } @@ -23069,7 +28680,7 @@ var nonoptionalProcessor = (schema, ctx, _json, params) => { const seen = ctx.seen.get(schema); seen.ref = def.innerType; }; -var UNREPRESENTABLE_DEFAULT = Symbol(); +var UNREPRESENTABLE_DEFAULT = /* @__PURE__ */ Symbol(); function serializeDefaultValue(value, schema, ctx, json2, params) { let unrepresentable = false; const serialized = JSON.stringify(value, (_2, val) => { @@ -23308,7 +28919,7 @@ var JSONSchemaGenerator = class { var json_schema_exports = {}; // node_modules/zod/v4/core/visit.js -var RESOLVING = Symbol("z.visit/resolving"); +var RESOLVING = /* @__PURE__ */ Symbol("z.visit/resolving"); function visit(schema, fnOrHandlers) { const fn = typeof fnOrHandlers === "function" ? fnOrHandlers : (node2, rewritten) => { const h = fnOrHandlers[node2._zod.def.type]; @@ -23337,10 +28948,10 @@ function visit(schema, fnOrHandlers) { switch (kind) { case "object": { const oldShape = def.shape; - const keys = Object.keys(oldShape); + const keys2 = Object.keys(oldShape); let changed = false; const newShape = {}; - for (const k2 of keys) { + for (const k2 of keys2) { const mapped = run(oldShape[k2]); if (mapped !== oldShape[k2]) changed = true; @@ -25062,11 +30673,11 @@ var ZodEnum = /* @__PURE__ */ $constructor("ZodEnum", (inst, def) => { inst._zod.processJSONSchema = (ctx, json2, params) => enumProcessor(inst, ctx, json2, params); inst.enum = def.entries; inst.options = Object.values(def.entries); - const keys = new Set(Object.keys(def.entries)); + const keys2 = new Set(Object.keys(def.entries)); inst.extract = (values, params) => { const newEntries = {}; for (const value of values) { - if (keys.has(value)) { + if (keys2.has(value)) { newEntries[value] = def.entries[value]; } else throw new Error(`Key ${value} not found in enum`); @@ -25081,7 +30692,7 @@ var ZodEnum = /* @__PURE__ */ $constructor("ZodEnum", (inst, def) => { inst.exclude = (values, params) => { const newEntries = { ...def.entries }; for (const value of values) { - if (keys.has(value)) { + if (keys2.has(value)) { delete newEntries[value]; } else throw new Error(`Key ${value} not found in enum`); @@ -25616,13 +31227,13 @@ function resolveRef(ref, ctx) { if (!ref.startsWith("#")) { throw new Error("External $ref is not supported, only local refs (#/...) are allowed"); } - const path3 = ref.slice(1).split("/").filter(Boolean); - if (path3.length === 0) { + const path4 = ref.slice(1).split("/").filter(Boolean); + if (path4.length === 0) { return ctx.rootSchema; } const defsKey = ctx.version === "draft-2020-12" ? "$defs" : "definitions"; - if (path3[0] === defsKey) { - const key = path3[1] === void 0 ? void 0 : decodeJSONPointerSegment(path3[1]); + if (path4[0] === defsKey) { + const key = path4[1] === void 0 ? void 0 : decodeJSONPointerSegment(path4[1]); if (!key || !ctx.defs[key]) { throw new Error(`Reference not found: ${ref}`); } @@ -27647,10 +33258,7 @@ function isTerminal(status) { return status === "completed" || status === "failed" || status === "cancelled"; } -// node_modules/zod-to-json-schema/dist/esm/Options.js -var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use"); - -// node_modules/zod-to-json-schema/dist/esm/parsers/string.js +// node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/parsers/string.js var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789"); // node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js @@ -29424,9 +35032,16 @@ var StdioServerTransport = class { // src/db.ts import Database from "better-sqlite3"; -import path2 from "path"; -import fs2 from "fs"; -import * as sqliteVec from "sqlite-vec"; + +// src/record-admission.ts +import fs2 from "node:fs"; +import path2 from "node:path"; +import crypto from "node:crypto"; +import os2 from "node:os"; +import { spawnSync } from "node:child_process"; + +// src/constants.ts +var SUMMARIZER_CONTEXT_MARKER = "Context: This summary will be shown in a list to help users and Claude choose which conversations are relevant"; // src/paths.ts import os from "os"; @@ -29464,6 +35079,430 @@ function getDbPath() { return path.join(getIndexDir(), "db.sqlite"); } +// src/record-admission.ts +var EXCLUSION_MARKERS = [ + "DO NOT INDEX THIS CHAT", + "Only use NO_INSIGHTS_FOUND", + SUMMARIZER_CONTEXT_MARKER +]; +var MARKER_SCAN_CHUNK_BYTES = 1 << 20; +function instructionText(record2) { + if (!object3(record2)) return ""; + if (record2.type === "event_msg" && object3(record2.payload)) { + return record2.payload.type === "user_message" && typeof record2.payload.message === "string" ? record2.payload.message : ""; + } + const message = record2.type === "response_item" ? record2.payload : record2.message; + if (!object3(message) || (message.role ?? record2.role) !== "user") return ""; + const content = record2.type === "opencode_message" ? record2.parts : message.content; + if (typeof content === "string") return content; + if (!Array.isArray(content)) return ""; + return content.filter((part) => object3(part) && ["text", "input_text"].includes(String(part.type)) && typeof part.text === "string").map((part) => part.text).join("\n"); +} +function descriptorHasExclusionMarker(fd, byteLimit = Infinity, digest) { + if (!fs2.fstatSync(fd).isFile()) throw new Error("Conversation input must be a regular file"); + const buffer = Buffer.allocUnsafe(MARKER_SCAN_CHUNK_BYTES); + const decoder = new TextDecoder("utf-8", { fatal: true }); + let pending = Buffer.alloc(0); + let position = 0; + const excluded = (bytes) => { + const line = decoder.decode(bytes); + let text; + try { + text = instructionText(JSON.parse(line)); + } catch { + text = line; + } + return EXCLUSION_MARKERS.some((marker) => text.includes(marker)); + }; + let count; + while (position < byteLimit && (count = fs2.readSync(fd, buffer, 0, Math.min(buffer.length, byteLimit - position), position)) > 0) { + position += count; + digest?.update(buffer.subarray(0, count)); + pending = Buffer.concat([pending, buffer.subarray(0, count)]); + let newline; + while ((newline = pending.indexOf(10)) !== -1) { + if (newline > 64 * 1024 * 1024) throw new Error("Conversation record exceeds admission byte limit"); + if (excluded(pending.subarray(0, newline))) return true; + pending = pending.subarray(newline + 1); + } + if (pending.length > 64 * 1024 * 1024) throw new Error("Conversation record exceeds admission byte limit"); + } + if (position < byteLimit && byteLimit !== Infinity) throw new Error("Conversation changed during record admission"); + return pending.length > 0 && excluded(pending); +} +function assertUnchangedInput(file2, initial) { + const current = fs2.lstatSync(file2); + if (!current.isFile() || initial.dev !== current.dev || initial.ino !== current.ino || initial.size !== current.size || initial.mtimeMs !== current.mtimeMs || initial.ctimeMs !== current.ctimeMs) { + throw new Error("Conversation changed during record admission"); + } +} +function assertUnchangedSearchPrefix(file2, initial, expectedDigest) { + const changed = () => new Error("Conversation changed during record admission"); + let current; + try { + current = fs2.lstatSync(file2); + } catch { + throw changed(); + } + if (!current.isFile() || initial.dev !== current.dev || initial.ino !== current.ino || current.size < initial.size) { + throw changed(); + } + if (current.size === initial.size && current.mtimeMs === initial.mtimeMs && current.ctimeMs === initial.ctimeMs) return; + let fd; + try { + fd = fs2.openSync(file2, fs2.constants.O_RDONLY | fs2.constants.O_NOFOLLOW); + const opened = fs2.fstatSync(fd); + if (!opened.isFile() || opened.dev !== initial.dev || opened.ino !== initial.ino || opened.size < initial.size) throw changed(); + const digest = crypto.createHash("sha256"); + const buffer = Buffer.allocUnsafe(MARKER_SCAN_CHUNK_BYTES); + let position = 0; + while (position < initial.size) { + const count = fs2.readSync(fd, buffer, 0, Math.min(buffer.length, initial.size - position), position); + if (count <= 0) throw changed(); + digest.update(buffer.subarray(0, count)); + position += count; + } + if (digest.digest("hex") !== expectedDigest) throw changed(); + current = fs2.lstatSync(file2); + if (!current.isFile() || current.dev !== initial.dev || current.ino !== initial.ino || current.size < initial.size) throw changed(); + } catch { + throw changed(); + } finally { + if (fd !== void 0) fs2.closeSync(fd); + } +} +function assertUnchangedPolicy(expected) { + if (JSON.stringify(readRecordExclusions()) !== expected) { + throw new Error("Record exclusion policy changed during record admission"); + } +} +var POLICY_ERROR = "Invalid or unreadable record exclusion policy"; +var UUID = /[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}/ig; +function object3(value) { + return value !== null && typeof value === "object" && !Array.isArray(value); +} +function keys(value, expected) { + return Object.keys(value).length === expected.length && expected.every((key) => key in value); +} +function transcriptName(value) { + return identity(value) && !/[\\/]/.test(value) && value.endsWith(".jsonl") && value !== ".jsonl"; +} +function identity(value) { + return typeof value === "string" && value.length > 0 && value.length <= 512 && !/[\x00-\x1f]/.test(value); +} +function screeningText(value, depth = 0) { + if (depth > 24) throw new Error("Record screening nesting limit exceeded"); + if (typeof value === "string") { + let decoded; + try { + decoded = JSON.parse(value); + } catch { + return value; + } + if (typeof decoded === "string" || object3(decoded) || Array.isArray(decoded)) { + return screeningText(decoded, depth + 1); + } + return value; + } + if (Array.isArray(value)) return value.map((item) => screeningText(item, depth + 1)).join("\n"); + if (object3(value)) { + return Object.entries(value).map(([key, item]) => `${key} = ${screeningText(item, depth + 1)}`).join("\n"); + } + return value == null ? "" : String(value); +} +function createRecordScreener(policy) { + const config2 = policy?.screening; + if (!config2) return { scan() { + }, close() { + } }; + const unavailable = () => new Error("Record screening unavailable"); + let initial; + let fd; + try { + if (fs2.realpathSync(config2.executable) !== config2.executable) throw unavailable(); + fd = fs2.openSync(config2.executable, fs2.constants.O_RDONLY | fs2.constants.O_NOFOLLOW); + initial = fs2.fstatSync(fd); + if (!initial.isFile() || initial.size < 1 || initial.size > 134217728 || (initial.mode & 18) !== 0 || typeof process.getuid === "function" && initial.uid !== 0 && initial.uid !== process.getuid()) { + throw unavailable(); + } + fs2.accessSync(config2.executable, fs2.constants.X_OK); + const digest = crypto.createHash("sha256").update(fs2.readFileSync(fd)).digest("hex"); + if (digest !== config2.sha256) throw unavailable(); + } catch { + throw unavailable(); + } finally { + if (fd !== void 0) fs2.closeSync(fd); + } + let directory; + try { + directory = fs2.mkdtempSync(path2.join(os2.tmpdir(), "episodic-screen-")); + fs2.chmodSync(directory, 448); + } catch { + throw unavailable(); + } + const unchanged = () => { + try { + const current = fs2.lstatSync(config2.executable); + if (!current.isFile() || current.dev !== initial.dev || current.ino !== initial.ino || current.size !== initial.size || current.mtimeMs !== initial.mtimeMs || current.ctimeMs !== initial.ctimeMs) throw unavailable(); + } catch { + throw unavailable(); + } + }; + return { + scan(value) { + const raw = typeof value === "string" ? value : JSON.stringify(value); + if (raw === void 0) return; + if (Buffer.byteLength(raw) > config2.max_record_bytes) throw new Error("Record screening byte limit exceeded"); + const input2 = screeningText(value); + if (Buffer.byteLength(input2) > config2.max_record_bytes) throw new Error("Record screening byte limit exceeded"); + if (!input2.trim()) return; + unchanged(); + const result = spawnSync(config2.executable, [ + "stdin", + "--redact", + "--no-banner", + "--log-level", + "error", + "--ignore-gitleaks-allow", + "--exit-code", + "10", + "--report-format", + "json", + "--report-path", + "-" + ], { + input: input2, + encoding: "utf8", + cwd: directory, + shell: false, + env: { HOME: directory, USERPROFILE: directory, PATH: path2.dirname(config2.executable) }, + timeout: config2.timeout_ms, + killSignal: "SIGKILL", + maxBuffer: 1048576, + windowsHide: true + }); + unchanged(); + if (result.error || result.signal || ![0, 10].includes(result.status ?? -1)) throw unavailable(); + let report; + try { + report = JSON.parse(result.stdout); + } catch { + throw unavailable(); + } + if (!Array.isArray(report) || result.status === 0 && report.length !== 0 || result.status === 10 && (report.length === 0 || !report.every((item) => object3(item) && typeof item.RuleID === "string"))) { + throw unavailable(); + } + if (result.status === 10) throw new Error("Record content rejected by screening"); + }, + close() { + fs2.rmSync(directory, { recursive: true, force: true }); + } + }; +} +function readRecordExclusions() { + const file2 = path2.join(getSuperpowersDir(), "record-exclusions.json"); + let fd; + try { + fd = fs2.openSync(file2, fs2.constants.O_RDONLY | fs2.constants.O_NOFOLLOW); + const info = fs2.fstatSync(fd); + if (!info.isFile() || info.size > 4 * 1024 * 1024) throw new Error(POLICY_ERROR); + const value = JSON.parse(fs2.readFileSync(fd, "utf8")); + if (!object3(value) || !keys(value, "screening" in value ? ["version", "exchanges", "tool_calls", "screening"] : ["version", "exchanges", "tool_calls"]) || value.version !== 1 || !Array.isArray(value.exchanges) || !Array.isArray(value.tool_calls)) throw new Error(POLICY_ERROR); + if ("screening" in value) { + const s = value.screening; + if (!object3(s) || !keys(s, ["engine", "executable", "sha256", "timeout_ms", "max_record_bytes"]) || s.engine !== "gitleaks" || typeof s.executable !== "string" || !path2.isAbsolute(s.executable) || /[\x00-\x1f]/.test(s.executable) || typeof s.sha256 !== "string" || !/^[a-f0-9]{64}$/.test(s.sha256) || !Number.isSafeInteger(s.timeout_ms) || Number(s.timeout_ms) < 50 || Number(s.timeout_ms) > 3e4 || !Number.isSafeInteger(s.max_record_bytes) || Number(s.max_record_bytes) < 1 || Number(s.max_record_bytes) > 8388608) { + throw new Error(POLICY_ERROR); + } + } + for (const row of value.exchanges) { + if (!object3(row) || !keys(row, ["session_id", "transcript", "line_start", "line_end"]) || !identity(row.session_id) || !transcriptName(row.transcript) || !Number.isSafeInteger(row.line_start) || !Number.isSafeInteger(row.line_end) || row.line_start < 1 || row.line_end < row.line_start) throw new Error(POLICY_ERROR); + } + for (const row of value.tool_calls) { + if (!object3(row) || !keys(row, ["session_id", "transcript", "call_id"]) || !identity(row.session_id) || !transcriptName(row.transcript) || !identity(row.call_id)) throw new Error(POLICY_ERROR); + } + return value; + } catch (error61) { + if (fd === void 0 && error61.code === "ENOENT") return null; + throw new Error(POLICY_ERROR); + } finally { + if (fd !== void 0) fs2.closeSync(fd); + } +} +function excludedSession(policy, sessionId) { + return !!sessionId && !!policy && (policy.exchanges.some((x2) => x2.session_id === sessionId) || policy.tool_calls.some((x2) => x2.session_id === sessionId)); +} +function sessionFromPath(file2) { + return path2.basename(file2).match(UUID)?.at(-1); +} +function sessionFromRecord(value) { + if (value?.type === "session_meta") return value.payload?.id; + if (value?.type === "session") return value.id; + if (value?.type === "opencode_session") return value.session?.id; + return value?.sessionId ?? value?.sessionID ?? value?.message?.sessionID; +} +function blockedCall(policy, sessionId, transcript, callId) { + return typeof callId === "string" && policy.tool_calls.some((x2) => x2.session_id === sessionId && x2.transcript === transcript && x2.call_id === callId); +} +function filterRecord(line, number4, policy, transcript, sessionId) { + if (!policy || !sessionId) return line; + if (policy.exchanges.some((x2) => x2.session_id === sessionId && x2.transcript === transcript && number4 >= x2.line_start && number4 <= x2.line_end)) return ""; + let value; + try { + value = JSON.parse(line); + } catch { + return line; + } + if (blockedCall(policy, sessionId, transcript, value?.payload?.call_id) || blockedCall(policy, sessionId, transcript, value?.call_id)) return ""; + const content = value?.message?.content; + if (Array.isArray(content)) { + const kept = content.filter((block) => !blockedCall(policy, sessionId, transcript, block?.id ?? block?.tool_use_id)); + if (kept.length !== content.length) { + return JSON.stringify({ ...value, message: { ...value.message, content: kept } }); + } + } + if (Array.isArray(value?.parts)) { + const kept = value.parts.filter((part) => !blockedCall(policy, sessionId, transcript, part?.callID ?? part?.id)); + if (kept.length !== value.parts.length) return JSON.stringify({ ...value, parts: kept }); + } + return line; +} +async function* admittedRecords(file2, policy, startLine = 1, endLine = Infinity) { + const policySnapshot = JSON.stringify(policy); + assertUnchangedPolicy(policySnapshot); + const input2 = fs2.openSync(file2, fs2.constants.O_RDONLY | fs2.constants.O_NOFOLLOW); + const initial = fs2.fstatSync(input2); + let stream; + let screener; + const decoder = new TextDecoder("utf-8", { fatal: true }); + let pending = Buffer.alloc(0); + let sessionId = sessionFromPath(file2); + let primaryIdentitySeen = false; + let number4 = 0; + const admit = (bytes, terminated) => { + number4++; + const crlf = terminated && bytes.at(-1) === 13; + const line = decoder.decode(crlf ? bytes.subarray(0, -1) : bytes); + let recordSession; + try { + recordSession = sessionFromRecord(JSON.parse(line)); + } catch { + } + if (recordSession && !primaryIdentitySeen) { + if (sessionId && recordSession !== sessionId && (excludedSession(policy, sessionId) || excludedSession(policy, recordSession))) { + throw new Error("Record exclusion session identity mismatch"); + } + sessionId = recordSession; + primaryIdentitySeen = true; + } + const filtered = number4 >= startLine && number4 <= endLine ? filterRecord(line, number4, policy, path2.basename(file2), sessionId) : ""; + screener?.scan(filtered); + return { line: filtered, ending: terminated ? crlf ? "\r\n" : "\n" : "" }; + }; + try { + if (descriptorHasExclusionMarker(input2)) return; + assertUnchangedInput(file2, initial); + screener = createRecordScreener(policy); + stream = fs2.createReadStream(file2, { fd: input2, autoClose: true, start: 0 }); + for await (const chunk of stream) { + assertUnchangedInput(file2, initial); + assertUnchangedPolicy(policySnapshot); + pending = Buffer.concat([pending, chunk]); + let newline; + while ((newline = pending.indexOf(10)) !== -1) { + yield admit(pending.subarray(0, newline), true); + pending = pending.subarray(newline + 1); + } + if (pending.length > 64 * 1024 * 1024) throw new Error("Conversation record exceeds admission byte limit"); + } + if (pending.length) yield admit(pending, false); + assertUnchangedInput(file2, initial); + assertUnchangedPolicy(policySnapshot); + } finally { + if (stream) stream.destroy(); + else fs2.closeSync(input2); + screener?.close(); + } +} +async function readAdmittedConversation(file2, startLine = 1, endLine = Infinity) { + if (!Number.isSafeInteger(startLine) || startLine < 1 || endLine !== Infinity && (!Number.isSafeInteger(endLine) || endLine < startLine)) { + throw new Error("Invalid conversation line range"); + } + const lines = []; + for await (const record2 of admittedRecords(file2, readRecordExclusions(), startLine, endLine)) lines.push(record2.line); + return lines.join("\n"); +} +function admitExchange(exchange, policy = readRecordExclusions()) { + if (!policy) return exchange; + const sessionIds = [exchange.sessionId, sessionFromPath(exchange.archivePath)].filter((id) => !!id); + const transcript = path2.basename(exchange.archivePath); + if (policy.exchanges.some((x2) => sessionIds.includes(x2.session_id) && x2.transcript === transcript && exchange.lineStart <= x2.line_end && exchange.lineEnd >= x2.line_start)) return null; + const kept = exchange.toolCalls?.filter((call) => !sessionIds.some((id) => blockedCall(policy, id, transcript, call.id))); + const admitted = kept && kept.length !== exchange.toolCalls?.length ? { ...exchange, toolCalls: kept } : exchange; + const screener = createRecordScreener(policy); + try { + screener.scan(admitted.userMessage); + screener.scan(admitted.assistantMessage); + for (const call of admitted.toolCalls ?? []) screener.scan(call); + const { userMessage, assistantMessage, toolCalls, ...metadata } = admitted; + screener.scan(metadata); + return admitted; + } finally { + screener.close(); + } +} +function createSearchAdmission() { + const policy = readRecordExclusions(); + const policySnapshot = JSON.stringify(policy); + const files = /* @__PURE__ */ new Map(); + const checkFile = (file2) => { + assertUnchangedPolicy(policySnapshot); + const cached2 = files.get(file2); + if (cached2) return !cached2.excluded; + let fd; + try { + const pathInfo = fs2.lstatSync(file2); + if (!pathInfo.isFile()) throw new Error("Conversation changed during record admission"); + fd = fs2.openSync(file2, fs2.constants.O_RDONLY | fs2.constants.O_NOFOLLOW); + const initial = fs2.fstatSync(fd); + if (!initial.isFile() || initial.dev !== pathInfo.dev || initial.ino !== pathInfo.ino || !Number.isSafeInteger(initial.size)) throw new Error("Conversation changed during record admission"); + const hash2 = crypto.createHash("sha256"); + const excluded = descriptorHasExclusionMarker(fd, initial.size, hash2); + files.set(file2, { initial, excluded, digest: excluded ? void 0 : hash2.digest("hex") }); + return !excluded; + } catch { + throw new Error("Conversation changed during record admission"); + } finally { + if (fd !== void 0) fs2.closeSync(fd); + } + }; + return { + admit(exchange) { + if (!checkFile(exchange.archivePath)) return null; + const admitted = admitExchange(exchange, policy); + assertUnchangedPolicy(policySnapshot); + return admitted; + }, + summary(exchange, text) { + const ids = [exchange.sessionId, sessionFromPath(exchange.archivePath)]; + const transcript = path2.basename(exchange.archivePath); + if (policy && [...policy.exchanges, ...policy.tool_calls].some((row) => row.transcript === transcript && ids.includes(row.session_id))) return void 0; + return admitExchange({ ...exchange, userMessage: text, assistantMessage: "", toolCalls: [] }, policy) ? text : void 0; + }, + verify() { + assertUnchangedPolicy(policySnapshot); + for (const [file2, { initial, digest }] of files) { + if (digest !== void 0) assertUnchangedSearchPrefix(file2, initial, digest); + } + assertUnchangedPolicy(policySnapshot); + } + }; +} + +// src/db.ts +import path3 from "path"; +import fs3 from "fs"; +import * as sqliteVec from "sqlite-vec"; + // src/file-lock.ts import * as lockfile from "proper-lockfile"; var DEFAULT_STALE_MS = 10 * 60 * 1e3; @@ -29545,9 +35584,9 @@ function migrateToolCallsCascade(db) { } function initDatabase() { const dbPath = getDbPath(); - const dbDir = path2.dirname(dbPath); - if (!fs2.existsSync(dbDir)) { - fs2.mkdirSync(dbDir, { recursive: true }); + const dbDir = path3.dirname(dbPath); + if (!fs3.existsSync(dbDir)) { + fs3.mkdirSync(dbDir, { recursive: true }); } const db = new Database(dbPath); sqliteVec.load(db); @@ -29708,7 +35747,7 @@ function isErroredSentinel(content) { } // src/search.ts -import fs3 from "fs"; +import fs4 from "fs"; import readline from "readline"; var SIDECHAIN_DISTANCE_PENALTY = 0.05; function buildSearchFilters(options) { @@ -29826,69 +35865,71 @@ async function searchConversations(query, options = {}) { const sidechainClause = includeSidechains ? "" : "AND e.is_sidechain = 0"; if (after) validateISODate(after, "--after"); if (before) validateISODate(before, "--before"); + const admission = createSearchAdmission(); const db = initDatabase(); + const admitted = (row) => admission.admit(exchangeFromRow(row)) !== null; let results = []; const { sql: filterClause, params: filterParams } = buildSearchFilters(options); - if (mode === "vector" || mode === "both") { - await initEmbeddings(); - const queryEmbedding = await generateQueryEmbedding(query); - const k2 = limit * 3; - const stmt = db.prepare(` - SELECT - ${EXCHANGE_SELECT_COLUMNS}, - vec.distance - FROM vec_exchanges AS vec - JOIN exchanges AS e ON vec.id = e.id - WHERE vec.embedding MATCH ? - AND k = ? - ${sidechainClause} - ${filterClause} - ORDER BY (vec.distance + e.is_sidechain * ?) ASC - `); - results = stmt.all( - Buffer.from(new Float32Array(queryEmbedding).buffer), - k2, - ...filterParams, - SIDECHAIN_DISTANCE_PENALTY - ); - if (results.length > limit) { - results = results.slice(0, limit); - } - } - if (mode === "text" || mode === "both") { - const { sql: textMatchSql, params: textMatchParams } = buildTextMatchClause(query); - const textStmt = db.prepare(` - SELECT - ${EXCHANGE_SELECT_COLUMNS}, - 0 as distance - FROM exchanges AS e - WHERE ${textMatchSql} - ${sidechainClause} - ${filterClause} - ORDER BY e.is_sidechain ASC, e.timestamp DESC - LIMIT ? - `); - const textResults = textStmt.all(...textMatchParams, ...filterParams, limit); - if (mode === "both") { - const seenIds = new Set(results.map((r) => r.id)); - for (const textResult of textResults) { - if (!seenIds.has(textResult.id)) { - results.push(textResult); + try { + if (mode === "vector" || mode === "both") { + await initEmbeddings(); + const queryEmbedding = await generateQueryEmbedding(query); + const stmt = db.prepare(` + SELECT ${EXCHANGE_SELECT_COLUMNS}, + vec_distance_l2(vec.embedding, ?) AS distance + FROM vec_exchanges AS vec + JOIN exchanges AS e ON vec.id = e.id + WHERE 1 = 1 ${sidechainClause} ${filterClause} + ORDER BY (distance + e.is_sidechain * ?) ASC + `); + for (const row of stmt.iterate( + Buffer.from(new Float32Array(queryEmbedding).buffer), + ...filterParams, + SIDECHAIN_DISTANCE_PENALTY + )) { + if (admitted(row)) results.push(row); + if (results.length === limit) break; + } + } + if (mode === "text" || mode === "both") { + const { sql: textMatchSql, params: textMatchParams } = buildTextMatchClause(query); + const textStmt = db.prepare(` + SELECT + ${EXCHANGE_SELECT_COLUMNS}, + 0 as distance + FROM exchanges AS e + WHERE ${textMatchSql} + ${sidechainClause} + ${filterClause} + ORDER BY e.is_sidechain ASC, e.timestamp DESC + `); + const textResults = []; + for (const row of textStmt.iterate(...textMatchParams, ...filterParams)) { + if (admitted(row)) textResults.push(row); + if (textResults.length === limit) break; + } + if (mode === "both") { + const seenIds = new Set(results.map((r) => r.id)); + for (const textResult of textResults) { + if (!seenIds.has(textResult.id)) { + results.push(textResult); + } } + } else { + results = textResults; } - } else { - results = textResults; } + } finally { + db.close(); } - db.close(); - return results.map((row) => { + const output2 = results.map((row) => { const exchange = exchangeFromRow(row); const summaryPath = row.archive_path.replace(".jsonl", "-summary.txt"); let summary; - if (fs3.existsSync(summaryPath)) { - const raw = fs3.readFileSync(summaryPath, "utf-8"); + if (fs4.existsSync(summaryPath)) { + const raw = fs4.readFileSync(summaryPath, "utf-8"); if (!isErroredSentinel(raw)) { - summary = raw.trim(); + summary = admission.summary(exchange, raw.trim()); } } const snippetText = exchange.userMessage.substring(0, 200).replace(/\s+/g, " ").trim(); @@ -29900,10 +35941,12 @@ async function searchConversations(query, options = {}) { summary }; }); + admission.verify(); + return output2; } async function countLines(filePath) { try { - const fileStream = fs3.createReadStream(filePath); + const fileStream = fs4.createReadStream(filePath); const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity @@ -29919,7 +35962,7 @@ async function countLines(filePath) { } function getFileSizeInKB(filePath) { try { - const stats = fs3.statSync(filePath); + const stats = fs4.statSync(filePath); return Math.round(stats.size / 1024 * 10) / 10; } catch (error61) { return 0; @@ -30046,140 +36089,147 @@ function L() { return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null }; } var T = L(); -function G(u3) { - T = u3; +function G(l3) { + T = l3; } -var I = { exec: () => null }; -function d(u3, e = "") { - let t = typeof u3 == "string" ? u3 : u3.source, n = { replace: (r, i) => { +var E = { exec: () => null }; +function d(l3, e = "") { + let t = typeof l3 == "string" ? l3 : l3.source, n = { replace: (r, i) => { let s = typeof i == "string" ? i : i.source; return s = s.replace(m.caret, "$1"), t = t.replace(r, s), n; }, getRegex: () => new RegExp(t, e) }; return n; } -var m = { codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, outputLinkReplace: /\\([\[\]])/g, indentCodeCompensation: /^(\s+)(?:```)/, beginningSpace: /^\s+/, endingHash: /#$/, startingSpaceChar: /^ /, endingSpaceChar: / $/, nonSpaceChar: /[^ ]/, newLineCharGlobal: /\n/g, tabCharGlobal: /\t/g, multipleSpaceGlobal: /\s+/g, blankLine: /^[ \t]*$/, doubleBlankLine: /\n[ \t]*\n[ \t]*$/, blockquoteStart: /^ {0,3}>/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (u3) => new RegExp(`^( {0,3}${u3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}#`), htmlBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; -var be = /^(?:[ \t]*(?:\n|$))+/; -var Re = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; -var Te = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; -var E = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; -var Oe = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; +var be = (() => { + try { + return !!new RegExp("(?<=1)(?/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (l3) => new RegExp(`^( {0,3}${l3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}#`), htmlBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; +var Re = /^(?:[ \t]*(?:\n|$))+/; +var Te = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; +var Oe = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; +var I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; +var we = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; var F = /(?:[*+-]|\d{1,9}[.)])/; var ie = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/; var oe = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(); -var we = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); +var ye = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); var j = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; -var ye = /^[^\n]+/; +var Pe = /^[^\n]+/; var Q = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/; -var Pe = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); -var Se = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); +var Se = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); +var $e = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); var v = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; var U = /|$))/; -var $e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); -var ae = d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var _e = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); -var K = { blockquote: _e, code: Re, def: Pe, fences: Te, heading: Oe, hr: E, html: $e, lheading: oe, list: Se, newline: be, paragraph: ae, table: I, text: ye }; -var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var Le = { ...K, lheading: we, table: re, paragraph: d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; -var Me = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: I, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", E).replace("heading", ` *#{1,6} *[^ +var _e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); +var ae = d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var Le = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); +var K = { blockquote: Le, code: Te, def: Se, fences: Oe, heading: we, hr: I, html: _e, lheading: oe, list: $e, newline: Re, paragraph: ae, table: E, text: Pe }; +var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var Me = { ...K, lheading: ye, table: re, paragraph: d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; +var ze = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: E, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", I).replace("heading", ` *#{1,6} *[^ ]`).replace("lheading", oe).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }; -var ze = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; -var Ae = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; +var Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; +var Ee = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; var le = /^( {2,}|\\)\n(?!\s*$)/; var Ie = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g; +var Be = /(?!~)[\s\p{P}\p{S}]/u; +var qe = /(?:[^\s\p{P}\p{S}]|~)/u; +var ve = d(/link|precode-code|html/, "g").replace("link", /\[(?:[^\[\]`]|(?`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", be ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(); var ce = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/; -var ve = d(ce, "u").replace(/punct/g, D).getRegex(); -var De = d(ce, "u").replace(/punct/g, pe).getRegex(); +var De = d(ce, "u").replace(/punct/g, D).getRegex(); +var He = d(ce, "u").replace(/punct/g, pe).getRegex(); var he = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)"; -var He = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Ze = d(he, "gu").replace(/notPunctSpace/g, Be).replace(/punctSpace/g, Ce).replace(/punct/g, pe).getRegex(); -var Ge = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Ne = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); -var Fe = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); -var je = d(U).replace("(?:-->|$)", "-->").getRegex(); -var Qe = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", je).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); +var Ze = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Ge = d(he, "gu").replace(/notPunctSpace/g, qe).replace(/punctSpace/g, Be).replace(/punct/g, pe).getRegex(); +var Ne = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Fe = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); +var je = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); +var Qe = d(U).replace("(?:-->|$)", "-->").getRegex(); +var Ue = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", Qe).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); var q = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/; -var Ue = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); +var Ke = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); var de = d(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", Q).getRegex(); var ke = d(/^!?\[(ref)\](?:\[\])?/).replace("ref", Q).getRegex(); -var Ke = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); +var We = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); var se = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/; -var X = { _backpedal: I, anyPunctuation: Ne, autolink: Fe, blockSkip: qe, br: le, code: Ae, del: I, emStrongLDelim: ve, emStrongRDelimAst: He, emStrongRDelimUnd: Ge, escape: ze, link: Ue, nolink: ke, punctuation: Ee, reflink: de, reflinkSearch: Ke, tag: Qe, text: Ie, url: I }; -var We = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; -var N = { ...X, emStrongRDelimAst: Ze, emStrongLDelim: De, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; -var ge = (u3) => Je[u3]; -function w(u3, e) { +var X = { _backpedal: E, anyPunctuation: Fe, autolink: je, blockSkip: ve, br: le, code: Ee, del: E, emStrongLDelim: De, emStrongRDelimAst: Ze, emStrongRDelimUnd: Ne, escape: Ae, link: Ke, nolink: ke, punctuation: Ce, reflink: de, reflinkSearch: We, tag: Ue, text: Ie, url: E }; +var Xe = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; +var N = { ...X, emStrongRDelimAst: Ge, emStrongLDelim: He, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; +var ge = (l3) => Ve[l3]; +function w(l3, e) { if (e) { - if (m.escapeTest.test(u3)) return u3.replace(m.escapeReplace, ge); - } else if (m.escapeTestNoEncode.test(u3)) return u3.replace(m.escapeReplaceNoEncode, ge); - return u3; + if (m.escapeTest.test(l3)) return l3.replace(m.escapeReplace, ge); + } else if (m.escapeTestNoEncode.test(l3)) return l3.replace(m.escapeReplaceNoEncode, ge); + return l3; } -function J(u3) { +function J(l3) { try { - u3 = encodeURI(u3).replace(m.percentDecode, "%"); + l3 = encodeURI(l3).replace(m.percentDecode, "%"); } catch { return null; } - return u3; + return l3; } -function V(u3, e) { - let t = u3.replace(m.findPipe, (i, s, o) => { - let a = false, l = s; - for (; --l >= 0 && o[l] === "\\"; ) a = !a; - return a ? "|" : " |"; +function V(l3, e) { + let t = l3.replace(m.findPipe, (i, s, a) => { + let o = false, p = s; + for (; --p >= 0 && a[p] === "\\"; ) o = !o; + return o ? "|" : " |"; }), n = t.split(m.splitPipe), r = 0; if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e) if (n.length > e) n.splice(e); else for (; n.length < e; ) n.push(""); for (; r < n.length; r++) n[r] = n[r].trim().replace(m.slashPipe, "|"); return n; } -function z2(u3, e, t) { - let n = u3.length; +function z2(l3, e, t) { + let n = l3.length; if (n === 0) return ""; let r = 0; for (; r < n; ) { - let i = u3.charAt(n - r - 1); + let i = l3.charAt(n - r - 1); if (i === e && !t) r++; else if (i !== e && t) r++; else break; } - return u3.slice(0, n - r); + return l3.slice(0, n - r); } -function fe(u3, e) { - if (u3.indexOf(e[1]) === -1) return -1; +function fe(l3, e) { + if (l3.indexOf(e[1]) === -1) return -1; let t = 0; - for (let n = 0; n < u3.length; n++) if (u3[n] === "\\") n++; - else if (u3[n] === e[0]) t++; - else if (u3[n] === e[1] && (t--, t < 0)) return n; + for (let n = 0; n < l3.length; n++) if (l3[n] === "\\") n++; + else if (l3[n] === e[0]) t++; + else if (l3[n] === e[1] && (t--, t < 0)) return n; return t > 0 ? -2 : -1; } -function me(u3, e, t, n, r) { - let i = e.href, s = e.title || null, o = u3[1].replace(r.other.outputLinkReplace, "$1"); +function me(l3, e, t, n, r) { + let i = e.href, s = e.title || null, a = l3[1].replace(r.other.outputLinkReplace, "$1"); n.state.inLink = true; - let a = { type: u3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: o, tokens: n.inlineTokens(o) }; - return n.state.inLink = false, a; + let o = { type: l3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: a, tokens: n.inlineTokens(a) }; + return n.state.inLink = false, o; } -function Ve(u3, e, t) { - let n = u3.match(t.other.indentCodeCompensation); +function Ye(l3, e, t) { + let n = l3.match(t.other.indentCodeCompensation); if (n === null) return e; let r = n[1]; return e.split(` `).map((i) => { let s = i.match(t.other.beginningSpace); if (s === null) return i; - let [o] = s; - return o.length >= r.length ? i.slice(r.length) : i; + let [a] = s; + return a.length >= r.length ? i.slice(r.length) : i; }).join(` `); } @@ -30205,7 +36255,7 @@ var y = class { fences(e) { let t = this.rules.block.fences.exec(e); if (t) { - let n = t[0], r = Ve(n, t[3] || "", this.rules); + let n = t[0], r = Ye(n, t[3] || "", this.rules); return { type: "code", raw: n, lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2], text: r }; } } @@ -30232,19 +36282,19 @@ var y = class { `).split(` `), r = "", i = "", s = []; for (; n.length > 0; ) { - let o = false, a = [], l; - for (l = 0; l < n.length; l++) if (this.rules.other.blockquoteStart.test(n[l])) a.push(n[l]), o = true; - else if (!o) a.push(n[l]); + let a = false, o = [], p; + for (p = 0; p < n.length; p++) if (this.rules.other.blockquoteStart.test(n[p])) o.push(n[p]), a = true; + else if (!a) o.push(n[p]); else break; - n = n.slice(l); - let c = a.join(` -`), p = c.replace(this.rules.other.blockquoteSetextReplace, ` + n = n.slice(p); + let u = o.join(` +`), c = u.replace(this.rules.other.blockquoteSetextReplace, ` $1`).replace(this.rules.other.blockquoteSetextReplace2, ""); r = r ? `${r} -${c}` : c, i = i ? `${i} -${p}` : p; +${u}` : u, i = i ? `${i} +${c}` : c; let g = this.lexer.state.top; - if (this.lexer.state.top = true, this.lexer.blockTokens(p, s, true), this.lexer.state.top = g, n.length === 0) break; + if (this.lexer.state.top = true, this.lexer.blockTokens(c, s, true), this.lexer.state.top = g, n.length === 0) break; let h = s.at(-1); if (h?.type === "code") break; if (h?.type === "blockquote") { @@ -30270,45 +36320,45 @@ ${p}` : p; if (t) { let n = t[1].trim(), r = n.length > 1, i = { type: "list", raw: "", ordered: r, start: r ? +n.slice(0, -1) : "", loose: false, items: [] }; n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); - let s = this.rules.other.listItemRegex(n), o = false; + let s = this.rules.other.listItemRegex(n), a = false; for (; e; ) { - let l = false, c = "", p = ""; + let p = false, u = "", c = ""; if (!(t = s.exec(e)) || this.rules.block.hr.test(e)) break; - c = t[0], e = e.substring(c.length); + u = t[0], e = e.substring(u.length); let g = t[2].split(` `, 1)[0].replace(this.rules.other.listReplaceTabs, (H) => " ".repeat(3 * H.length)), h = e.split(` `, 1)[0], R = !g.trim(), f = 0; - if (this.options.pedantic ? (f = 2, p = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, p = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (c += h + ` -`, e = e.substring(h.length + 1), l = true), !l) { + if (this.options.pedantic ? (f = 2, c = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, c = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (u += h + ` +`, e = e.substring(h.length + 1), p = true), !p) { let H = this.rules.other.nextBulletRegex(f), ee = this.rules.other.hrRegex(f), te = this.rules.other.fencesBeginRegex(f), ne = this.rules.other.headingBeginRegex(f), xe = this.rules.other.htmlBeginRegex(f); for (; e; ) { let Z = e.split(` `, 1)[0], A; if (h = Z, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, " "), A = h) : A = h.replace(this.rules.other.tabCharGlobal, " "), te.test(h) || ne.test(h) || xe.test(h) || H.test(h) || ee.test(h)) break; - if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) p += ` + if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) c += ` ` + A.slice(f); else { if (R || g.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || te.test(g) || ne.test(g) || ee.test(g)) break; - p += ` + c += ` ` + h; } - !R && !h.trim() && (R = true), c += Z + ` + !R && !h.trim() && (R = true), u += Z + ` `, e = e.substring(Z.length + 1), g = A.slice(f); } } - i.loose || (o ? i.loose = true : this.rules.other.doubleBlankLine.test(c) && (o = true)); + i.loose || (a ? i.loose = true : this.rules.other.doubleBlankLine.test(u) && (a = true)); let O = null, Y; - this.options.gfm && (O = this.rules.other.listIsTask.exec(p), O && (Y = O[0] !== "[ ] ", p = p.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: c, task: !!O, checked: Y, loose: false, text: p, tokens: [] }), i.raw += c; + this.options.gfm && (O = this.rules.other.listIsTask.exec(c), O && (Y = O[0] !== "[ ] ", c = c.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: u, task: !!O, checked: Y, loose: false, text: c, tokens: [] }), i.raw += u; } - let a = i.items.at(-1); - if (a) a.raw = a.raw.trimEnd(), a.text = a.text.trimEnd(); + let o = i.items.at(-1); + if (o) o.raw = o.raw.trimEnd(), o.text = o.text.trimEnd(); else return; i.raw = i.raw.trimEnd(); - for (let l = 0; l < i.items.length; l++) if (this.lexer.state.top = false, i.items[l].tokens = this.lexer.blockTokens(i.items[l].text, []), !i.loose) { - let c = i.items[l].tokens.filter((g) => g.type === "space"), p = c.length > 0 && c.some((g) => this.rules.other.anyLine.test(g.raw)); - i.loose = p; + for (let p = 0; p < i.items.length; p++) if (this.lexer.state.top = false, i.items[p].tokens = this.lexer.blockTokens(i.items[p].text, []), !i.loose) { + let u = i.items[p].tokens.filter((g) => g.type === "space"), c = u.length > 0 && u.some((g) => this.rules.other.anyLine.test(g.raw)); + i.loose = c; } - if (i.loose) for (let l = 0; l < i.items.length; l++) i.items[l].loose = true; + if (i.loose) for (let p = 0; p < i.items.length; p++) i.items[p].loose = true; return i; } } @@ -30329,9 +36379,9 @@ ${p}` : p; let n = V(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(` `) : [], s = { type: "table", raw: t[0], header: [], align: [], rows: [] }; if (n.length === r.length) { - for (let o of r) this.rules.other.tableAlignRight.test(o) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(o) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(o) ? s.align.push("left") : s.align.push(null); - for (let o = 0; o < n.length; o++) s.header.push({ text: n[o], tokens: this.lexer.inline(n[o]), header: true, align: s.align[o] }); - for (let o of i) s.rows.push(V(o, s.header.length).map((a, l) => ({ text: a, tokens: this.lexer.inline(a), header: false, align: s.align[l] }))); + for (let a of r) this.rules.other.tableAlignRight.test(a) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(a) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(a) ? s.align.push("left") : s.align.push(null); + for (let a = 0; a < n.length; a++) s.header.push({ text: n[a], tokens: this.lexer.inline(n[a]), header: true, align: s.align[a] }); + for (let a of i) s.rows.push(V(a, s.header.length).map((o, p) => ({ text: o, tokens: this.lexer.inline(o), header: false, align: s.align[p] }))); return s; } } @@ -30371,8 +36421,8 @@ ${p}` : p; let s = fe(t[2], "()"); if (s === -2) return; if (s > -1) { - let a = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; - t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, a).trim(), t[3] = ""; + let o = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; + t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, o).trim(), t[3] = ""; } } let r = t[2], i = ""; @@ -30398,20 +36448,20 @@ ${p}` : p; let r = this.rules.inline.emStrongLDelim.exec(e); if (!r || r[3] && n.match(this.rules.other.unicodeAlphaNumeric)) return; if (!(r[1] || r[2] || "") || !n || this.rules.inline.punctuation.exec(n)) { - let s = [...r[0]].length - 1, o, a, l = s, c = 0, p = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; - for (p.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = p.exec(t)) != null; ) { - if (o = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !o) continue; - if (a = [...o].length, r[3] || r[4]) { - l += a; + let s = [...r[0]].length - 1, a, o, p = s, u = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + for (c.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = c.exec(t)) != null; ) { + if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a) continue; + if (o = [...a].length, r[3] || r[4]) { + p += o; continue; - } else if ((r[5] || r[6]) && s % 3 && !((s + a) % 3)) { - c += a; + } else if ((r[5] || r[6]) && s % 3 && !((s + o) % 3)) { + u += o; continue; } - if (l -= a, l > 0) continue; - a = Math.min(a, a + l + c); - let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + a); - if (Math.min(s, a) % 2) { + if (p -= o, p > 0) continue; + o = Math.min(o, o + p + u); + let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + o); + if (Math.min(s, o) % 2) { let f = h.slice(1, -1); return { type: "em", raw: h, text: f, tokens: this.lexer.inlineTokens(f) }; } @@ -30465,7 +36515,7 @@ ${p}` : p; } } }; -var x = class u { +var x = class l { tokens; options; state; @@ -30480,10 +36530,10 @@ var x = class u { return { block: C, inline: M }; } static lex(e, t) { - return new u(t).lex(e); + return new l(t).lex(e); } static lexInline(e, t) { - return new u(t).inlineTokens(e); + return new l(t).inlineTokens(e); } lex(e) { e = e.replace(m.carriageReturn, ` @@ -30557,9 +36607,9 @@ var x = class u { } let i = e; if (this.options.extensions?.startBlock) { - let s = 1 / 0, o = e.slice(1), a; - this.options.extensions.startBlock.forEach((l) => { - a = l.call({ lexer: this }, o), typeof a == "number" && a >= 0 && (s = Math.min(s, a)); + let s = 1 / 0, a = e.slice(1), o; + this.options.extensions.startBlock.forEach((p) => { + o = p.call({ lexer: this }, a), typeof o == "number" && o >= 0 && (s = Math.min(s, o)); }), s < 1 / 0 && s >= 0 && (i = e.substring(0, s + 1)); } if (this.state.top && (r = this.tokenizer.paragraph(i))) { @@ -30599,13 +36649,14 @@ var x = class u { if (o.length > 0) for (; (r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) != null; ) o.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); } for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null; ) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); - for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + let i; + for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) i = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i) + "[" + "a".repeat(r[0].length - i - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n; - let i = false, s = ""; + let s = false, a = ""; for (; e; ) { - i || (s = ""), i = false; + s || (a = ""), s = false; let o; - if (this.options.extensions?.inline?.some((l) => (o = l.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; + if (this.options.extensions?.inline?.some((u) => (o = u.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; if (o = this.tokenizer.escape(e)) { e = e.substring(o.raw.length), t.push(o); continue; @@ -30620,11 +36671,11 @@ var x = class u { } if (o = this.tokenizer.reflink(e, this.tokens.links)) { e = e.substring(o.raw.length); - let l = t.at(-1); - o.type === "text" && l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); + let u = t.at(-1); + o.type === "text" && u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); continue; } - if (o = this.tokenizer.emStrong(e, n, s)) { + if (o = this.tokenizer.emStrong(e, n, a)) { e = e.substring(o.raw.length), t.push(o); continue; } @@ -30648,25 +36699,25 @@ var x = class u { e = e.substring(o.raw.length), t.push(o); continue; } - let a = e; + let p = e; if (this.options.extensions?.startInline) { - let l = 1 / 0, c = e.slice(1), p; - this.options.extensions.startInline.forEach((g) => { - p = g.call({ lexer: this }, c), typeof p == "number" && p >= 0 && (l = Math.min(l, p)); - }), l < 1 / 0 && l >= 0 && (a = e.substring(0, l + 1)); - } - if (o = this.tokenizer.inlineText(a)) { - e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (s = o.raw.slice(-1)), i = true; - let l = t.at(-1); - l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); + let u = 1 / 0, c = e.slice(1), g; + this.options.extensions.startInline.forEach((h) => { + g = h.call({ lexer: this }, c), typeof g == "number" && g >= 0 && (u = Math.min(u, g)); + }), u < 1 / 0 && u >= 0 && (p = e.substring(0, u + 1)); + } + if (o = this.tokenizer.inlineText(p)) { + e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (a = o.raw.slice(-1)), s = true; + let u = t.at(-1); + u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); continue; } if (e) { - let l = "Infinite loop on byte: " + e.charCodeAt(0); + let u = "Infinite loop on byte: " + e.charCodeAt(0); if (this.options.silent) { - console.error(l); + console.error(u); break; - } else throw new Error(l); + } else throw new Error(u); } } return t; @@ -30709,9 +36760,9 @@ ${this.parser.parse(e)} } list(e) { let t = e.ordered, n = e.start, r = ""; - for (let o = 0; o < e.items.length; o++) { - let a = e.items[o]; - r += this.listitem(a); + for (let a = 0; a < e.items.length; a++) { + let o = e.items[a]; + r += this.listitem(o); } let i = t ? "ol" : "ul", s = t && n !== 1 ? ' start="' + n + '"' : ""; return "<" + i + s + `> @@ -30742,7 +36793,7 @@ ${this.parser.parse(e)} for (let i = 0; i < e.rows.length; i++) { let s = e.rows[i]; n = ""; - for (let o = 0; o < s.length; o++) n += this.tablecell(s[o]); + for (let a = 0; a < s.length; a++) n += this.tablecell(s[a]); r += this.tablerow({ text: n }); } return r && (r = `${r}`), `
@@ -30824,7 +36875,7 @@ var $ = class { return ""; } }; -var b = class u2 { +var b = class l2 { options; renderer; textRenderer; @@ -30832,19 +36883,19 @@ var b = class u2 { this.options = e || T, this.options.renderer = this.options.renderer || new P(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new $(); } static parse(e, t) { - return new u2(t).parse(e); + return new l2(t).parse(e); } static parseInline(e, t) { - return new u2(t).parseInline(e); + return new l2(t).parseInline(e); } parse(e, t = true) { let n = ""; for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let o = i, a = this.options.extensions.renderers[o.type].call({ parser: this }, o); - if (a !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(o.type)) { - n += a || ""; + let a = i, o = this.options.extensions.renderers[a.type].call({ parser: this }, a); + if (o !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(a.type)) { + n += o || ""; continue; } } @@ -30891,16 +36942,16 @@ var b = class u2 { continue; } case "text": { - let o = s, a = this.renderer.text(o); - for (; r + 1 < e.length && e[r + 1].type === "text"; ) o = e[++r], a += ` -` + this.renderer.text(o); - t ? n += this.renderer.paragraph({ type: "paragraph", raw: a, text: a, tokens: [{ type: "text", raw: a, text: a, escaped: true }] }) : n += a; + let a = s, o = this.renderer.text(a); + for (; r + 1 < e.length && e[r + 1].type === "text"; ) a = e[++r], o += ` +` + this.renderer.text(a); + t ? n += this.renderer.paragraph({ type: "paragraph", raw: o, text: o, tokens: [{ type: "text", raw: o, text: o, escaped: true }] }) : n += o; continue; } default: { - let o = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(o), ""; - throw new Error(o); + let a = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(a), ""; + throw new Error(a); } } } @@ -30911,9 +36962,9 @@ var b = class u2 { for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let o = this.options.extensions.renderers[i.type].call({ parser: this }, i); - if (o !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { - n += o || ""; + let a = this.options.extensions.renderers[i.type].call({ parser: this }, i); + if (a !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { + n += a || ""; continue; } } @@ -30960,9 +37011,9 @@ var b = class u2 { break; } default: { - let o = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(o), ""; - throw new Error(o); + let a = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(a), ""; + throw new Error(a); } } } @@ -31016,7 +37067,7 @@ var B = class { case "table": { let i = r; for (let s of i.header) n = n.concat(this.walkTokens(s.tokens, t)); - for (let s of i.rows) for (let o of s) n = n.concat(this.walkTokens(o.tokens, t)); + for (let s of i.rows) for (let a of s) n = n.concat(this.walkTokens(a.tokens, t)); break; } case "list": { @@ -31027,8 +37078,8 @@ var B = class { default: { let i = r; this.defaults.extensions?.childTokens?.[i.type] ? this.defaults.extensions.childTokens[i.type].forEach((s) => { - let o = i[s].flat(1 / 0); - n = n.concat(this.walkTokens(o, t)); + let a = i[s].flat(1 / 0); + n = n.concat(this.walkTokens(a, t)); }) : i.tokens && (n = n.concat(this.walkTokens(i.tokens, t))); } } @@ -31042,9 +37093,9 @@ var B = class { if (!i.name) throw new Error("extension name required"); if ("renderer" in i) { let s = t.renderers[i.name]; - s ? t.renderers[i.name] = function(...o) { - let a = i.renderer.apply(this, o); - return a === false && (a = s.apply(this, o)), a; + s ? t.renderers[i.name] = function(...a) { + let o = i.renderer.apply(this, a); + return o === false && (o = s.apply(this, a)), o; } : t.renderers[i.name] = i.renderer; } if ("tokenizer" in i) { @@ -31058,10 +37109,10 @@ var B = class { for (let s in n.renderer) { if (!(s in i)) throw new Error(`renderer '${s}' does not exist`); if (["options", "parser"].includes(s)) continue; - let o = s, a = n.renderer[o], l = i[o]; - i[o] = (...c) => { - let p = a.apply(i, c); - return p === false && (p = l.apply(i, c)), p || ""; + let a = s, o = n.renderer[a], p = i[a]; + i[a] = (...u) => { + let c = o.apply(i, u); + return c === false && (c = p.apply(i, u)), c || ""; }; } r.renderer = i; @@ -31071,10 +37122,10 @@ var B = class { for (let s in n.tokenizer) { if (!(s in i)) throw new Error(`tokenizer '${s}' does not exist`); if (["options", "rules", "lexer"].includes(s)) continue; - let o = s, a = n.tokenizer[o], l = i[o]; - i[o] = (...c) => { - let p = a.apply(i, c); - return p === false && (p = l.apply(i, c)), p; + let a = s, o = n.tokenizer[a], p = i[a]; + i[a] = (...u) => { + let c = o.apply(i, u); + return c === false && (c = p.apply(i, u)), c; }; } r.tokenizer = i; @@ -31084,30 +37135,30 @@ var B = class { for (let s in n.hooks) { if (!(s in i)) throw new Error(`hook '${s}' does not exist`); if (["options", "block"].includes(s)) continue; - let o = s, a = n.hooks[o], l = i[o]; - S.passThroughHooks.has(s) ? i[o] = (c) => { + let a = s, o = n.hooks[a], p = i[a]; + S.passThroughHooks.has(s) ? i[a] = (u) => { if (this.defaults.async && S.passThroughHooksRespectAsync.has(s)) return (async () => { - let g = await a.call(i, c); - return l.call(i, g); + let g = await o.call(i, u); + return p.call(i, g); })(); - let p = a.call(i, c); - return l.call(i, p); - } : i[o] = (...c) => { + let c = o.call(i, u); + return p.call(i, c); + } : i[a] = (...u) => { if (this.defaults.async) return (async () => { - let g = await a.apply(i, c); - return g === false && (g = await l.apply(i, c)), g; + let g = await o.apply(i, u); + return g === false && (g = await p.apply(i, u)), g; })(); - let p = a.apply(i, c); - return p === false && (p = l.apply(i, c)), p; + let c = o.apply(i, u); + return c === false && (c = p.apply(i, u)), c; }; } r.hooks = i; } if (n.walkTokens) { let i = this.defaults.walkTokens, s = n.walkTokens; - r.walkTokens = function(o) { - let a = []; - return a.push(s.call(this, o)), i && (a = a.concat(i.call(this, o))), a; + r.walkTokens = function(a) { + let o = []; + return o.push(s.call(this, a)), i && (o = o.concat(i.call(this, a))), o; }; } this.defaults = { ...this.defaults, ...r }; @@ -31124,24 +37175,24 @@ var B = class { } parseMarkdown(e) { return (n, r) => { - let i = { ...r }, s = { ...this.defaults, ...i }, o = this.onError(!!s.silent, !!s.async); - if (this.defaults.async === true && i.async === false) return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); - if (typeof n > "u" || n === null) return o(new Error("marked(): input parameter is undefined or null")); - if (typeof n != "string") return o(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); + let i = { ...r }, s = { ...this.defaults, ...i }, a = this.onError(!!s.silent, !!s.async); + if (this.defaults.async === true && i.async === false) return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + if (typeof n > "u" || n === null) return a(new Error("marked(): input parameter is undefined or null")); + if (typeof n != "string") return a(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); if (s.hooks && (s.hooks.options = s, s.hooks.block = e), s.async) return (async () => { - let a = s.hooks ? await s.hooks.preprocess(n) : n, c = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(a, s), p = s.hooks ? await s.hooks.processAllTokens(c) : c; - s.walkTokens && await Promise.all(this.walkTokens(p, s.walkTokens)); - let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); + let o = s.hooks ? await s.hooks.preprocess(n) : n, u = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(o, s), c = s.hooks ? await s.hooks.processAllTokens(u) : u; + s.walkTokens && await Promise.all(this.walkTokens(c, s.walkTokens)); + let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(c, s); return s.hooks ? await s.hooks.postprocess(h) : h; - })().catch(o); + })().catch(a); try { s.hooks && (n = s.hooks.preprocess(n)); - let l = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); - s.hooks && (l = s.hooks.processAllTokens(l)), s.walkTokens && this.walkTokens(l, s.walkTokens); - let p = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(l, s); - return s.hooks && (p = s.hooks.postprocess(p)), p; - } catch (a) { - return o(a); + let p = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); + s.hooks && (p = s.hooks.processAllTokens(p)), s.walkTokens && this.walkTokens(p, s.walkTokens); + let c = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); + return s.hooks && (c = s.hooks.postprocess(c)), c; + } catch (o) { + return a(o); } }; } @@ -31158,19 +37209,19 @@ Please report this to https://github.com/markedjs/marked.`, e) { } }; var _ = new B(); -function k(u3, e) { - return _.parse(u3, e); +function k(l3, e) { + return _.parse(l3, e); } -k.options = k.setOptions = function(u3) { - return _.setOptions(u3), k.defaults = _.defaults, G(k.defaults), k; +k.options = k.setOptions = function(l3) { + return _.setOptions(l3), k.defaults = _.defaults, G(k.defaults), k; }; k.getDefaults = L; k.defaults = T; -k.use = function(...u3) { - return _.use(...u3), k.defaults = _.defaults, G(k.defaults), k; +k.use = function(...l3) { + return _.use(...l3), k.defaults = _.defaults, G(k.defaults), k; }; -k.walkTokens = function(u3, e) { - return _.walkTokens(u3, e); +k.walkTokens = function(l3, e) { + return _.walkTokens(l3, e); }; k.parseInline = _.parseInline; k.Parser = b; @@ -31182,21 +37233,22 @@ k.lexer = x.lex; k.Tokenizer = y; k.Hooks = S; k.parse = k; -var Ht = k.options; -var Zt = k.setOptions; -var Gt = k.use; -var Nt = k.walkTokens; -var Ft = k.parseInline; -var Qt = b.parse; -var Ut = x.lex; +var Zt = k.options; +var Gt = k.setOptions; +var Nt = k.use; +var Ft = k.walkTokens; +var jt = k.parseInline; +var Ut = b.parse; +var Kt = x.lex; // src/show.ts function formatConversationAsMarkdown(jsonl, startLine, endLine) { - const allLines = jsonl.trim().split("\n").filter((line) => line.trim()); - const lines = startLine !== void 0 || endLine !== void 0 ? allLines.slice( + const allLines = jsonl.split("\n"); + const selectedLines = startLine !== void 0 || endLine !== void 0 ? allLines.slice( startLine !== void 0 ? startLine - 1 : 0, endLine !== void 0 ? endLine : void 0 ) : allLines; + const lines = selectedLines.filter((line) => line.trim()); if (isCodexRollout(lines)) { return formatCodexConversationAsMarkdown(lines); } @@ -31861,7 +37913,7 @@ function formatCursorConversationAsMarkdown(lines) { var VERSION = "1.6.0"; // src/mcp-server.ts -import fs4 from "fs"; +import fs5 from "fs"; var SearchModeEnum = external_exports.enum(["vector", "text", "both"]); var ResponseFormatEnum = external_exports.enum(["markdown", "json"]); var SearchInputSchema = external_exports.object({ @@ -32040,10 +38092,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { } if (name === "read") { const params = ShowConversationInputSchema.parse(args); - if (!fs4.existsSync(params.path)) { + if (!fs5.existsSync(params.path)) { throw new Error(`File not found: ${params.path}`); } - const jsonlContent = fs4.readFileSync(params.path, "utf-8"); + const jsonlContent = await readAdmittedConversation(params.path, params.startLine, params.endLine); const markdownContent = formatConversationAsMarkdown( jsonlContent, params.startLine, diff --git a/dist/parser.js b/dist/parser.js index dcc1c270..08b3befc 100644 --- a/dist/parser.js +++ b/dist/parser.js @@ -1,13 +1,9 @@ import fs from 'fs'; -import readline from 'readline'; import path from 'path'; import crypto from 'crypto'; +import { admittedConversationLines } from './record-admission.js'; async function detectConversationHarness(filePath) { - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); for await (const line of rl) { if (!line.trim()) continue; @@ -73,11 +69,7 @@ export async function parseConversation(filePath, projectName, archivePath) { } async function parseClaudeConversation(filePath, projectName, archivePath) { const exchanges = []; - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); let lineNumber = 0; let currentExchange = null; const finalizeExchange = () => { @@ -343,11 +335,7 @@ function extractOpencodeToolCalls(parts, fallbackTimestamp) { } async function parseOpencodeConversation(filePath, projectName, archivePath) { const exchanges = []; - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); let lineNumber = 0; let sessionId; let cwd; @@ -524,11 +512,7 @@ function extractOmpText(content) { */ async function parseOmpConversation(filePath, projectName, archivePath) { const exchanges = []; - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); let sessionId; let cwd; let headerTimestamp; @@ -632,11 +616,7 @@ async function parseOmpConversation(filePath, projectName, archivePath) { } async function parseCodexConversation(filePath, projectName, archivePath) { const exchanges = []; - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); let lineNumber = 0; let sessionId; let cwd; @@ -763,7 +743,8 @@ async function parseCodexConversation(filePath, projectName, archivePath) { const payload = parsed.payload; const timestamp = parsed.timestamp || new Date().toISOString(); if (parsed.type === 'session_meta' && payload) { - sessionId = payload.id || sessionId; + // Forked transcripts may retain ancestor headers after the primary one. + sessionId = sessionId || payload.id; cwd = payload.cwd || cwd; gitBranch = payload.git?.branch || gitBranch; agentVersion = payload.cli_version || agentVersion; @@ -884,11 +865,7 @@ function cursorProjectFromPath(filePath) { const UUID_PATTERN = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i; async function parseCursorConversation(filePath, projectName, archivePath) { const exchanges = []; - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); // Live Cursor transcripts carry no per-message timestamps; fall back to the // file mtime (preserved from the source by sync's copyIfNewer). Legacy // exports from import-cursor-history embed real per-message timestamps. diff --git a/dist/record-admission.d.ts b/dist/record-admission.d.ts new file mode 100644 index 00000000..a62ddb17 --- /dev/null +++ b/dist/record-admission.d.ts @@ -0,0 +1,43 @@ +import type { ConversationExchange } from './types.js'; +/** Scan decoded instruction records without retaining the whole transcript. */ +export declare function shouldSkipConversation(filePath: string): boolean; +interface ExchangeExclusion { + session_id: string; + transcript: string; + line_start: number; + line_end: number; +} +interface ToolExclusion { + session_id: string; + transcript: string; + call_id: string; +} +export interface RecordExclusions { + version: 1; + exchanges: ExchangeExclusion[]; + tool_calls: ToolExclusion[]; + screening?: { + engine: 'gitleaks'; + executable: string; + sha256: string; + timeout_ms: number; + max_record_bytes: number; + }; +} +export declare function readRecordExclusions(): RecordExclusions | null; +export declare function excludedSession(policy: RecordExclusions | null, sessionId?: string): boolean; +/** Read original inputs without mutation, preserving their physical line numbers. */ +export declare function admittedConversationLines(file: string, policy?: RecordExclusions | null): AsyncGenerator; +/** Read the admitted display input without changing original physical coordinates. */ +export declare function readAdmittedConversation(file: string, startLine?: number, endLine?: number): Promise; +/** Enforce the same rule for direct callers that bypass transcript parsing. */ +export declare function admitExchange(exchange: ConversationExchange, policy?: RecordExclusions | null): ConversationExchange | null; +/** Publish only admitted bytes. Never write an unfiltered temporary copy. */ +export declare function archiveAdmittedConversation(source: string, destination: string, policy?: RecordExclusions | null): Promise; +/** Request-local admission: retained search rows are not trusted merely because they were indexed. */ +export declare function createSearchAdmission(): { + admit(exchange: ConversationExchange): ConversationExchange | null; + summary(exchange: ConversationExchange, text: string): string | undefined; + verify(): void; +}; +export {}; diff --git a/dist/record-admission.js b/dist/record-admission.js new file mode 100644 index 00000000..f0ea0e83 --- /dev/null +++ b/dist/record-admission.js @@ -0,0 +1,636 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import crypto from 'node:crypto'; +import os from 'node:os'; +import { spawnSync } from 'node:child_process'; +import { SUMMARIZER_CONTEXT_MARKER } from './constants.js'; +import { getSuperpowersDir } from './paths.js'; +const EXCLUSION_MARKERS = [ + 'DO NOT INDEX THIS CHAT', + 'Only use NO_INSIGHTS_FOUND', + SUMMARIZER_CONTEXT_MARKER, +]; +const MARKER_SCAN_CHUNK_BYTES = 1 << 20; // 1 MiB +/** Scan decoded instruction records without retaining the whole transcript. */ +export function shouldSkipConversation(filePath) { + let fd; + try { + fd = fs.openSync(filePath, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + const initial = fs.fstatSync(fd); + const excluded = descriptorHasExclusionMarker(fd); + assertUnchangedInput(filePath, initial); + return excluded; + } + catch { + return true; + } + finally { + if (fd !== undefined) + fs.closeSync(fd); + } +} +function instructionText(record) { + if (!object(record)) + return ''; + // Codex records both the response item and its user-message event. + if (record.type === 'event_msg' && object(record.payload)) { + return record.payload.type === 'user_message' && typeof record.payload.message === 'string' + ? record.payload.message : ''; + } + const message = record.type === 'response_item' ? record.payload : record.message; + if (!object(message) || (message.role ?? record.role) !== 'user') + return ''; + const content = record.type === 'opencode_message' ? record.parts : message.content; + if (typeof content === 'string') + return content; + if (!Array.isArray(content)) + return ''; + // Claude tool results are wrapped in a user envelope, but are not instructions. + return content.filter(part => object(part) && ['text', 'input_text'].includes(String(part.type)) + && typeof part.text === 'string').map(part => part.text).join('\n'); +} +function descriptorHasExclusionMarker(fd, byteLimit = Infinity, digest) { + if (!fs.fstatSync(fd).isFile()) + throw new Error('Conversation input must be a regular file'); + const buffer = Buffer.allocUnsafe(MARKER_SCAN_CHUNK_BYTES); + const decoder = new TextDecoder('utf-8', { fatal: true }); + let pending = Buffer.alloc(0); + let position = 0; + const excluded = (bytes) => { + const line = decoder.decode(bytes); + let text; + try { + text = instructionText(JSON.parse(line)); + } + catch { + text = line; + } // Preserve conservative handling of legacy raw transcripts. + return EXCLUSION_MARKERS.some(marker => text.includes(marker)); + }; + let count; + while (position < byteLimit && (count = fs.readSync(fd, buffer, 0, Math.min(buffer.length, byteLimit - position), position)) > 0) { + position += count; + digest?.update(buffer.subarray(0, count)); + pending = Buffer.concat([pending, buffer.subarray(0, count)]); + let newline; + while ((newline = pending.indexOf(10)) !== -1) { + if (newline > 64 * 1024 * 1024) + throw new Error('Conversation record exceeds admission byte limit'); + if (excluded(pending.subarray(0, newline))) + return true; + pending = pending.subarray(newline + 1); + } + if (pending.length > 64 * 1024 * 1024) + throw new Error('Conversation record exceeds admission byte limit'); + } + if (position < byteLimit && byteLimit !== Infinity) + throw new Error('Conversation changed during record admission'); + return pending.length > 0 && excluded(pending); +} +function assertUnchangedInput(file, initial) { + const current = fs.lstatSync(file); + if (!current.isFile() || initial.dev !== current.dev || initial.ino !== current.ino || + initial.size !== current.size || initial.mtimeMs !== current.mtimeMs || initial.ctimeMs !== current.ctimeMs) { + throw new Error('Conversation changed during record admission'); + } +} +function assertUnchangedSearchPrefix(file, initial, expectedDigest) { + // A live transcript may grow after the search snapshot. Rehash the pinned + // prefix only when metadata changes, so appended bytes cannot hide a rewrite. + const changed = () => new Error('Conversation changed during record admission'); + let current; + try { + current = fs.lstatSync(file); + } + catch { + throw changed(); + } + if (!current.isFile() || initial.dev !== current.dev || initial.ino !== current.ino || current.size < initial.size) { + throw changed(); + } + if (current.size === initial.size && current.mtimeMs === initial.mtimeMs && current.ctimeMs === initial.ctimeMs) + return; + let fd; + try { + fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + const opened = fs.fstatSync(fd); + if (!opened.isFile() || opened.dev !== initial.dev || opened.ino !== initial.ino || opened.size < initial.size) + throw changed(); + const digest = crypto.createHash('sha256'); + const buffer = Buffer.allocUnsafe(MARKER_SCAN_CHUNK_BYTES); + let position = 0; + while (position < initial.size) { + const count = fs.readSync(fd, buffer, 0, Math.min(buffer.length, initial.size - position), position); + if (count <= 0) + throw changed(); + digest.update(buffer.subarray(0, count)); + position += count; + } + if (digest.digest('hex') !== expectedDigest) + throw changed(); + current = fs.lstatSync(file); + if (!current.isFile() || current.dev !== initial.dev || current.ino !== initial.ino || current.size < initial.size) + throw changed(); + } + catch { + throw changed(); + } + finally { + if (fd !== undefined) + fs.closeSync(fd); + } +} +function assertUnchangedPolicy(expected) { + if (JSON.stringify(readRecordExclusions()) !== expected) { + throw new Error('Record exclusion policy changed during record admission'); + } +} +function prepareArchiveParent(directory) { + try { + const info = fs.lstatSync(directory); + if (!info.isDirectory() || info.isSymbolicLink()) + throw new Error('Archive parent must be a non-symlink directory'); + } + catch (error) { + if (error.code !== 'ENOENT') + throw error; + const parent = path.dirname(directory); + if (parent === directory) + throw error; + prepareArchiveParent(parent); + fs.mkdirSync(directory, { mode: 0o700 }); + } + return fs.realpathSync(directory); +} +const POLICY_ERROR = 'Invalid or unreadable record exclusion policy'; +const UUID = /[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}/ig; +function object(value) { + return value !== null && typeof value === 'object' && !Array.isArray(value); +} +function keys(value, expected) { + return Object.keys(value).length === expected.length && expected.every(key => key in value); +} +function transcriptName(value) { + return identity(value) && !/[\\/]/.test(value) && value.endsWith('.jsonl') && value !== '.jsonl'; +} +function identity(value) { + return typeof value === 'string' && value.length > 0 && value.length <= 512 && !/[\x00-\x1f]/.test(value); +} +/** Keep scanner inputs local to one record, including JSON-escaped text. */ +function screeningText(value, depth = 0) { + if (depth > 24) + throw new Error('Record screening nesting limit exceeded'); + if (typeof value === 'string') { + let decoded; + try { + decoded = JSON.parse(value); + } + catch { + return value; + } + if (typeof decoded === 'string' || object(decoded) || Array.isArray(decoded)) { + return screeningText(decoded, depth + 1); + } + return value; + } + if (Array.isArray(value)) + return value.map(item => screeningText(item, depth + 1)).join('\n'); + if (object(value)) { + // Generic credential rules need an assignment delimiter, not just a nearby + // keyword. Decode nested text without destroying its key/value relation. + return Object.entries(value).map(([key, item]) => `${key} = ${screeningText(item, depth + 1)}`).join('\n'); + } + return value == null ? '' : String(value); +} +/** One pinned, short-lived local scanner context; no secret-bearing cache. */ +function createRecordScreener(policy) { + const config = policy?.screening; + if (!config) + return { scan() { }, close() { } }; + const unavailable = () => new Error('Record screening unavailable'); + let initial; + let fd; + try { + if (fs.realpathSync(config.executable) !== config.executable) + throw unavailable(); + fd = fs.openSync(config.executable, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + initial = fs.fstatSync(fd); + if (!initial.isFile() || initial.size < 1 || initial.size > 134_217_728 || + (initial.mode & 0o022) !== 0 || + (typeof process.getuid === 'function' && initial.uid !== 0 && initial.uid !== process.getuid())) { + throw unavailable(); + } + fs.accessSync(config.executable, fs.constants.X_OK); + const digest = crypto.createHash('sha256').update(fs.readFileSync(fd)).digest('hex'); + if (digest !== config.sha256) + throw unavailable(); + } + catch { + throw unavailable(); + } + finally { + if (fd !== undefined) + fs.closeSync(fd); + } + let directory; + try { + directory = fs.mkdtempSync(path.join(os.tmpdir(), 'episodic-screen-')); + fs.chmodSync(directory, 0o700); + } + catch { + throw unavailable(); + } + const unchanged = () => { + try { + const current = fs.lstatSync(config.executable); + if (!current.isFile() || current.dev !== initial.dev || current.ino !== initial.ino || + current.size !== initial.size || current.mtimeMs !== initial.mtimeMs || + current.ctimeMs !== initial.ctimeMs) + throw unavailable(); + } + catch { + throw unavailable(); + } + }; + return { + scan(value) { + const raw = typeof value === 'string' ? value : JSON.stringify(value); + if (raw === undefined) + return; + if (Buffer.byteLength(raw) > config.max_record_bytes) + throw new Error('Record screening byte limit exceeded'); + const input = screeningText(value); + if (Buffer.byteLength(input) > config.max_record_bytes) + throw new Error('Record screening byte limit exceeded'); + if (!input.trim()) + return; + unchanged(); + const result = spawnSync(config.executable, [ + 'stdin', '--redact', '--no-banner', '--log-level', 'error', + '--ignore-gitleaks-allow', '--exit-code', '10', '--report-format', 'json', '--report-path', '-', + ], { + input, encoding: 'utf8', cwd: directory, shell: false, + env: { HOME: directory, USERPROFILE: directory, PATH: path.dirname(config.executable) }, + timeout: config.timeout_ms, killSignal: 'SIGKILL', maxBuffer: 1_048_576, + windowsHide: true, + }); + unchanged(); + // Exit zero alone is not a clean scan. Validate the full report and never + // forward stdout/stderr, findings, fingerprints or input into errors. + if (result.error || result.signal || ![0, 10].includes(result.status ?? -1)) + throw unavailable(); + let report; + try { + report = JSON.parse(result.stdout); + } + catch { + throw unavailable(); + } + if (!Array.isArray(report) || (result.status === 0 && report.length !== 0) || + (result.status === 10 && (report.length === 0 || !report.every(item => object(item) && typeof item.RuleID === 'string')))) { + throw unavailable(); + } + if (result.status === 10) + throw new Error('Record content rejected by screening'); + }, + close() { fs.rmSync(directory, { recursive: true, force: true }); }, + }; +} +export function readRecordExclusions() { + const file = path.join(getSuperpowersDir(), 'record-exclusions.json'); + let fd; + try { + fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + const info = fs.fstatSync(fd); + if (!info.isFile() || info.size > 4 * 1024 * 1024) + throw new Error(POLICY_ERROR); + const value = JSON.parse(fs.readFileSync(fd, 'utf8')); + if (!object(value) || !keys(value, 'screening' in value + ? ['version', 'exchanges', 'tool_calls', 'screening'] : ['version', 'exchanges', 'tool_calls']) || value.version !== 1 || + !Array.isArray(value.exchanges) || !Array.isArray(value.tool_calls)) + throw new Error(POLICY_ERROR); + if ('screening' in value) { + const s = value.screening; + if (!object(s) || !keys(s, ['engine', 'executable', 'sha256', 'timeout_ms', 'max_record_bytes']) || + s.engine !== 'gitleaks' || typeof s.executable !== 'string' || !path.isAbsolute(s.executable) || + /[\x00-\x1f]/.test(s.executable) || typeof s.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(s.sha256) || + !Number.isSafeInteger(s.timeout_ms) || Number(s.timeout_ms) < 50 || Number(s.timeout_ms) > 30_000 || + !Number.isSafeInteger(s.max_record_bytes) || Number(s.max_record_bytes) < 1 || Number(s.max_record_bytes) > 8_388_608) { + throw new Error(POLICY_ERROR); + } + } + for (const row of value.exchanges) { + if (!object(row) || !keys(row, ['session_id', 'transcript', 'line_start', 'line_end']) || !identity(row.session_id) || !transcriptName(row.transcript) || + !Number.isSafeInteger(row.line_start) || !Number.isSafeInteger(row.line_end) || + row.line_start < 1 || row.line_end < row.line_start) + throw new Error(POLICY_ERROR); + } + for (const row of value.tool_calls) { + if (!object(row) || !keys(row, ['session_id', 'transcript', 'call_id']) || !identity(row.session_id) || !transcriptName(row.transcript) || !identity(row.call_id)) + throw new Error(POLICY_ERROR); + } + return value; + } + catch (error) { + if (fd === undefined && error.code === 'ENOENT') + return null; + throw new Error(POLICY_ERROR); + } + finally { + if (fd !== undefined) + fs.closeSync(fd); + } +} +export function excludedSession(policy, sessionId) { + return !!sessionId && !!policy && (policy.exchanges.some(x => x.session_id === sessionId) || + policy.tool_calls.some(x => x.session_id === sessionId)); +} +function sessionFromPath(file) { + return path.basename(file).match(UUID)?.at(-1); +} +function sessionFromRecord(value) { + if (value?.type === 'session_meta') + return value.payload?.id; + if (value?.type === 'session') + return value.id; + if (value?.type === 'opencode_session') + return value.session?.id; + return value?.sessionId ?? value?.sessionID ?? value?.message?.sessionID; +} +function blockedCall(policy, sessionId, transcript, callId) { + return typeof callId === 'string' && policy.tool_calls.some(x => x.session_id === sessionId && x.transcript === transcript && x.call_id === callId); +} +function filterRecord(line, number, policy, transcript, sessionId) { + if (!policy || !sessionId) + return line; + if (policy.exchanges.some(x => x.session_id === sessionId && x.transcript === transcript && number >= x.line_start && number <= x.line_end)) + return ''; + let value; + try { + value = JSON.parse(line); + } + catch { + return line; + } + if (blockedCall(policy, sessionId, transcript, value?.payload?.call_id) || blockedCall(policy, sessionId, transcript, value?.call_id)) + return ''; + // Claude and Cursor may combine safe text and tool payloads in one physical record. + // Preserve the record and safe blocks rather than excluding the entire exchange. + const content = value?.message?.content; + if (Array.isArray(content)) { + const kept = content.filter(block => !blockedCall(policy, sessionId, transcript, block?.id ?? block?.tool_use_id)); + if (kept.length !== content.length) { + return JSON.stringify({ ...value, message: { ...value.message, content: kept } }); + } + } + if (Array.isArray(value?.parts)) { + const kept = value.parts.filter((part) => !blockedCall(policy, sessionId, transcript, part?.callID ?? part?.id)); + if (kept.length !== value.parts.length) + return JSON.stringify({ ...value, parts: kept }); + } + return line; +} +/** Keep byte delimiters and physical line coordinates stable in derived copies. */ +async function* admittedRecords(file, policy, startLine = 1, endLine = Infinity) { + const policySnapshot = JSON.stringify(policy); + assertUnchangedPolicy(policySnapshot); + const input = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + const initial = fs.fstatSync(input); + let stream; + let screener; + const decoder = new TextDecoder('utf-8', { fatal: true }); + let pending = Buffer.alloc(0); + let sessionId = sessionFromPath(file); + let primaryIdentitySeen = false; + let number = 0; + const admit = (bytes, terminated) => { + number++; + const crlf = terminated && bytes.at(-1) === 13; + const line = decoder.decode(crlf ? bytes.subarray(0, -1) : bytes); + let recordSession; + try { + recordSession = sessionFromRecord(JSON.parse(line)); + } + catch { /* Parser owns malformed records. */ } + if (recordSession && !primaryIdentitySeen) { + if (sessionId && recordSession !== sessionId && (excludedSession(policy, sessionId) || excludedSession(policy, recordSession))) { + throw new Error('Record exclusion session identity mismatch'); + } + sessionId = recordSession; + primaryIdentitySeen = true; + } + const filtered = number >= startLine && number <= endLine + ? filterRecord(line, number, policy, path.basename(file), sessionId) : ''; + screener?.scan(filtered); + return { line: filtered, ending: terminated ? (crlf ? '\r\n' : '\n') : '' }; + }; + try { + // The marker scan and record stream share one descriptor and identity. + // A path replacement cannot substitute a different unscanned transcript. + if (descriptorHasExclusionMarker(input)) + return; + assertUnchangedInput(file, initial); + screener = createRecordScreener(policy); + stream = fs.createReadStream(file, { fd: input, autoClose: true, start: 0 }); + for await (const chunk of stream) { + assertUnchangedInput(file, initial); + assertUnchangedPolicy(policySnapshot); + pending = Buffer.concat([pending, chunk]); + let newline; + while ((newline = pending.indexOf(10)) !== -1) { + yield admit(pending.subarray(0, newline), true); + pending = pending.subarray(newline + 1); + } + if (pending.length > 64 * 1024 * 1024) + throw new Error('Conversation record exceeds admission byte limit'); + } + if (pending.length) + yield admit(pending, false); + assertUnchangedInput(file, initial); + assertUnchangedPolicy(policySnapshot); + } + finally { + if (stream) + stream.destroy(); + else + fs.closeSync(input); + screener?.close(); + } +} +/** Read original inputs without mutation, preserving their physical line numbers. */ +export async function* admittedConversationLines(file, policy = readRecordExclusions()) { + if (!fs.lstatSync(file).isFile()) + throw new Error('Conversation input must be a regular non-symlink file'); + if (shouldSkipConversation(file)) + return; + for await (const record of admittedRecords(file, policy)) + yield record.line; +} +/** Read the admitted display input without changing original physical coordinates. */ +export async function readAdmittedConversation(file, startLine = 1, endLine = Infinity) { + if (!Number.isSafeInteger(startLine) || startLine < 1 || + (endLine !== Infinity && (!Number.isSafeInteger(endLine) || endLine < startLine))) { + throw new Error('Invalid conversation line range'); + } + const lines = []; + for await (const record of admittedRecords(file, readRecordExclusions(), startLine, endLine)) + lines.push(record.line); + return lines.join('\n'); +} +/** Enforce the same rule for direct callers that bypass transcript parsing. */ +export function admitExchange(exchange, policy = readRecordExclusions()) { + if (!policy) + return exchange; + // Historical Codex rows may carry a fork ancestor's ID. Neither that metadata + // nor the filename may override a denial bound to the other known identity. + const sessionIds = [exchange.sessionId, sessionFromPath(exchange.archivePath)].filter((id) => !!id); + const transcript = path.basename(exchange.archivePath); + if (policy.exchanges.some(x => sessionIds.includes(x.session_id) && x.transcript === transcript && exchange.lineStart <= x.line_end && exchange.lineEnd >= x.line_start)) + return null; + const kept = exchange.toolCalls?.filter(call => !sessionIds.some(id => blockedCall(policy, id, transcript, call.id))); + const admitted = kept && kept.length !== exchange.toolCalls?.length ? { ...exchange, toolCalls: kept } : exchange; + const screener = createRecordScreener(policy); + try { + // These are separate original records, not one keyword-prefilter fragment. + screener.scan(admitted.userMessage); + screener.scan(admitted.assistantMessage); + for (const call of admitted.toolCalls ?? []) + screener.scan(call); + const { userMessage, assistantMessage, toolCalls, ...metadata } = admitted; + screener.scan(metadata); + return admitted; + } + finally { + screener.close(); + } +} +/** Publish only admitted bytes. Never write an unfiltered temporary copy. */ +export async function archiveAdmittedConversation(source, destination, policy = readRecordExclusions()) { + const policySnapshot = JSON.stringify(policy); + assertUnchangedPolicy(policySnapshot); + if (shouldSkipConversation(source)) + return false; + if (path.resolve(source) === path.resolve(destination)) + throw new Error('Source and derived archive must be distinct'); + const original = fs.lstatSync(source); + if (!original.isFile()) + throw new Error('Conversation source must be a regular non-symlink file'); + if (fs.existsSync(destination)) { + const target = fs.lstatSync(destination); + if (!target.isFile() || target.dev === original.dev && target.ino === original.ino) { + throw new Error('Source and derived archive must be distinct regular files'); + } + } + if (!policy && fs.existsSync(destination) && fs.statSync(destination).mtimeMs >= original.mtimeMs) + return false; + const initial = fs.statSync(source); + const parent = prepareArchiveParent(path.dirname(path.resolve(destination))); + const parentIdentity = fs.statSync(parent); + destination = path.join(parent, path.basename(destination)); + const temp = destination + '.tmp.' + process.pid + '.' + crypto.randomUUID(); + const fd = fs.openSync(temp, 'wx', 0o600); + const hash = crypto.createHash('sha256'); + try { + for await (const record of admittedRecords(source, policy)) { + const bytes = Buffer.from(record.line + record.ending); + hash.update(bytes); + fs.writeFileSync(fd, bytes); + } + fs.fsyncSync(fd); + } + catch (error) { + fs.closeSync(fd); + fs.unlinkSync(temp); + throw error; + } + fs.closeSync(fd); + try { + const final = fs.statSync(source); + if (initial.dev !== final.dev || initial.ino !== final.ino || initial.size !== final.size || initial.mtimeMs !== final.mtimeMs) { + throw new Error('Conversation changed during record admission'); + } + if (fs.existsSync(destination)) { + const existing = crypto.createHash('sha256'); + for await (const chunk of fs.createReadStream(destination)) + existing.update(chunk); + if (existing.digest('hex') === hash.digest('hex')) + return false; + } + assertUnchangedInput(source, original); + assertUnchangedPolicy(policySnapshot); + const currentParent = fs.lstatSync(parent); + if (!currentParent.isDirectory() || currentParent.dev !== parentIdentity.dev || currentParent.ino !== parentIdentity.ino) { + throw new Error('Archive parent changed during record admission'); + } + fs.renameSync(temp, destination); + fs.utimesSync(destination, initial.atimeMs / 1000, Math.ceil(initial.mtimeMs) / 1000); + return true; + } + finally { + if (fs.existsSync(temp)) + fs.unlinkSync(temp); + } +} +/** Request-local admission: retained search rows are not trusted merely because they were indexed. */ +export function createSearchAdmission() { + const policy = readRecordExclusions(); + const policySnapshot = JSON.stringify(policy); + const files = new Map(); + const checkFile = (file) => { + assertUnchangedPolicy(policySnapshot); + const cached = files.get(file); + if (cached) + return !cached.excluded; + let fd; + try { + const pathInfo = fs.lstatSync(file); + if (!pathInfo.isFile()) + throw new Error('Conversation changed during record admission'); + fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + const initial = fs.fstatSync(fd); + if (!initial.isFile() || initial.dev !== pathInfo.dev || initial.ino !== pathInfo.ino || + !Number.isSafeInteger(initial.size)) + throw new Error('Conversation changed during record admission'); + const hash = crypto.createHash('sha256'); + // The observed size is this request's snapshot boundary. Records appended + // later are admitted by the next request, including conversation opt-outs. + const excluded = descriptorHasExclusionMarker(fd, initial.size, hash); + files.set(file, { initial, excluded, digest: excluded ? undefined : hash.digest('hex') }); + return !excluded; + } + catch { + throw new Error('Conversation changed during record admission'); + } + finally { + if (fd !== undefined) + fs.closeSync(fd); + } + }; + return { + admit(exchange) { + if (!checkFile(exchange.archivePath)) + return null; + const admitted = admitExchange(exchange, policy); + assertUnchangedPolicy(policySnapshot); + return admitted; + }, + summary(exchange, text) { + // An old summary has no record-level provenance. A filtered source may have + // contributed any of its text, so do not expose that derived summary. + const ids = [exchange.sessionId, sessionFromPath(exchange.archivePath)]; + const transcript = path.basename(exchange.archivePath); + if (policy && [...policy.exchanges, ...policy.tool_calls].some(row => row.transcript === transcript && ids.includes(row.session_id))) + return undefined; + return admitExchange({ ...exchange, userMessage: text, assistantMessage: '', toolCalls: [] }, policy) + ? text : undefined; + }, + verify() { + assertUnchangedPolicy(policySnapshot); + for (const [file, { initial, digest }] of files) { + if (digest !== undefined) + assertUnchangedSearchPrefix(file, initial, digest); + } + assertUnchangedPolicy(policySnapshot); + }, + }; +} diff --git a/dist/search.js b/dist/search.js index 281b4f0f..0c5f4978 100644 --- a/dist/search.js +++ b/dist/search.js @@ -1,4 +1,5 @@ import { initDatabase } from './db.js'; +import { createSearchAdmission } from './record-admission.js'; import { initEmbeddings, generateQueryEmbedding } from './embeddings.js'; import { isErroredSentinel } from './summary-sentinel.js'; import fs from 'fs'; @@ -160,67 +161,74 @@ export async function searchConversations(query, options = {}) { validateISODate(after, '--after'); if (before) validateISODate(before, '--before'); + const admission = createSearchAdmission(); const db = initDatabase(); + const admitted = (row) => admission.admit(exchangeFromRow(row)) !== null; let results = []; const { sql: filterClause, params: filterParams } = buildSearchFilters(options); - if (mode === 'vector' || mode === 'both') { - // Vector similarity search. - // vec0 applies KNN before the WHERE clause and before our sidechain - // de-rank, so we over-fetch candidates and trim after the final ordering. - await initEmbeddings(); - const queryEmbedding = await generateQueryEmbedding(query); - const k = limit * 3; - const stmt = db.prepare(` - SELECT - ${EXCHANGE_SELECT_COLUMNS}, - vec.distance - FROM vec_exchanges AS vec - JOIN exchanges AS e ON vec.id = e.id - WHERE vec.embedding MATCH ? - AND k = ? - ${sidechainClause} - ${filterClause} - ORDER BY (vec.distance + e.is_sidechain * ?) ASC - `); - results = stmt.all(Buffer.from(new Float32Array(queryEmbedding).buffer), k, ...filterParams, SIDECHAIN_DISTANCE_PENALTY); - if (results.length > limit) { - results = results.slice(0, limit); + try { + if (mode === 'vector' || mode === 'both') { + // Order the filtered candidates before admission. The vec0 KNN API caps k; + // increasing k cannot find safe results beyond a large excluded prefix. + await initEmbeddings(); + const queryEmbedding = await generateQueryEmbedding(query); + const stmt = db.prepare(` + SELECT ${EXCHANGE_SELECT_COLUMNS}, + vec_distance_l2(vec.embedding, ?) AS distance + FROM vec_exchanges AS vec + JOIN exchanges AS e ON vec.id = e.id + WHERE 1 = 1 ${sidechainClause} ${filterClause} + ORDER BY (distance + e.is_sidechain * ?) ASC + `); + for (const row of stmt.iterate(Buffer.from(new Float32Array(queryEmbedding).buffer), ...filterParams, SIDECHAIN_DISTANCE_PENALTY)) { + if (admitted(row)) + results.push(row); + if (results.length === limit) + break; + } } - } - if (mode === 'text' || mode === 'both') { - // Text search: AND of per-token LIKE patterns so multi-word queries match - // when every term appears somewhere in the exchange (any order, either field). - // See #127 — whole-query contiguous substring matching returned empty for - // typical multi-word searches that are not verbatim phrases. Sidechain rows - // are de-ranked (ordered after main-thread rows), not excluded (#128). - const { sql: textMatchSql, params: textMatchParams } = buildTextMatchClause(query); - const textStmt = db.prepare(` - SELECT - ${EXCHANGE_SELECT_COLUMNS}, - 0 as distance - FROM exchanges AS e - WHERE ${textMatchSql} - ${sidechainClause} - ${filterClause} - ORDER BY e.is_sidechain ASC, e.timestamp DESC - LIMIT ? - `); - const textResults = textStmt.all(...textMatchParams, ...filterParams, limit); - if (mode === 'both') { - // Merge and deduplicate by ID - const seenIds = new Set(results.map(r => r.id)); - for (const textResult of textResults) { - if (!seenIds.has(textResult.id)) { - results.push(textResult); + if (mode === 'text' || mode === 'both') { + // Text search: AND of per-token LIKE patterns so multi-word queries match + // when every term appears somewhere in the exchange (any order, either field). + // See #127 — whole-query contiguous substring matching returned empty for + // typical multi-word searches that are not verbatim phrases. Sidechain rows + // are de-ranked (ordered after main-thread rows), not excluded (#128). + const { sql: textMatchSql, params: textMatchParams } = buildTextMatchClause(query); + const textStmt = db.prepare(` + SELECT + ${EXCHANGE_SELECT_COLUMNS}, + 0 as distance + FROM exchanges AS e + WHERE ${textMatchSql} + ${sidechainClause} + ${filterClause} + ORDER BY e.is_sidechain ASC, e.timestamp DESC + `); + const textResults = []; + for (const row of textStmt.iterate(...textMatchParams, ...filterParams)) { + if (admitted(row)) + textResults.push(row); + if (textResults.length === limit) + break; + } + if (mode === 'both') { + // Merge and deduplicate by ID + const seenIds = new Set(results.map(r => r.id)); + for (const textResult of textResults) { + if (!seenIds.has(textResult.id)) { + results.push(textResult); + } } } - } - else { - results = textResults; + else { + results = textResults; + } } } - db.close(); - return results.map((row) => { + finally { + db.close(); + } + const output = results.map((row) => { const exchange = exchangeFromRow(row); // Try to load summary if available. Skip error sentinels (#96) so failed // summarizations don't surface as the conversation's summary in results. @@ -229,7 +237,7 @@ export async function searchConversations(query, options = {}) { if (fs.existsSync(summaryPath)) { const raw = fs.readFileSync(summaryPath, 'utf-8'); if (!isErroredSentinel(raw)) { - summary = raw.trim(); + summary = admission.summary(exchange, raw.trim()); } } // Create snippet (first 200 chars, collapse newlines) @@ -242,6 +250,8 @@ export async function searchConversations(query, options = {}) { summary }; }); + admission.verify(); + return output; } // Helper function to count lines in a file efficiently async function countLines(filePath) { diff --git a/dist/show-cli.js b/dist/show-cli.js index 53ca9739..c5693d30 100644 --- a/dist/show-cli.js +++ b/dist/show-cli.js @@ -1,4 +1,4 @@ -import { readFileSync } from 'fs'; +import { readAdmittedConversation } from './record-admission.js'; import { formatConversationAsMarkdown, formatConversationAsHTML } from './show.js'; const args = process.argv.slice(2); // Parse arguments @@ -42,7 +42,7 @@ if (!filePath) { process.exit(1); } try { - const jsonl = readFileSync(filePath, 'utf-8'); + const jsonl = await readAdmittedConversation(filePath); if (format === 'html') { console.log(formatConversationAsHTML(jsonl)); } diff --git a/dist/show.js b/dist/show.js index 2f297196..9d1d01f9 100644 --- a/dist/show.js +++ b/dist/show.js @@ -1,10 +1,11 @@ import { marked } from 'marked'; export function formatConversationAsMarkdown(jsonl, startLine, endLine) { - const allLines = jsonl.trim().split('\n').filter(line => line.trim()); + const allLines = jsonl.split('\n'); // Apply line range if specified (1-indexed, inclusive) - const lines = startLine !== undefined || endLine !== undefined + const selectedLines = startLine !== undefined || endLine !== undefined ? allLines.slice(startLine !== undefined ? startLine - 1 : 0, endLine !== undefined ? endLine : undefined) : allLines; + const lines = selectedLines.filter(line => line.trim()); if (isCodexRollout(lines)) { return formatCodexConversationAsMarkdown(lines); } diff --git a/dist/summarizer.d.ts b/dist/summarizer.d.ts index 4c97be52..039d6252 100644 --- a/dist/summarizer.d.ts +++ b/dist/summarizer.d.ts @@ -57,10 +57,11 @@ export interface CodexSummarizerCommand { command: string; args: string[]; prompt: string; - sessionId: string; + sessionId?: string; model?: string; versionArgs?: string[]; skipVersionCheck?: boolean; + isolated?: boolean; } /** * Get API environment overrides for summarization calls. @@ -150,10 +151,11 @@ export declare function buildSummarizerQueryOptions(args: { }): Record; export declare function buildCodexSummaryPrompt(): string; export declare function buildCodexSummarizerCommand(args: { - sessionId: string; + sessionId?: string; prompt: string; model?: string; codexBin?: string; + isolated?: boolean; }): CodexSummarizerCommand; export declare function runCodexCommand(command: CodexSummarizerCommand): Promise; /** diff --git a/dist/summarizer.js b/dist/summarizer.js index 60719809..84d99970 100644 --- a/dist/summarizer.js +++ b/dist/summarizer.js @@ -1,4 +1,7 @@ import fs from 'fs'; +import os from 'node:os'; +import path from 'node:path'; +import { admitExchange, readRecordExclusions } from './record-admission.js'; import { query } from '@anthropic-ai/claude-agent-sdk'; import { SUMMARIZER_CONTEXT_MARKER } from './constants.js'; import { VERSION } from './version.js'; @@ -362,12 +365,27 @@ Bad: } export function buildCodexSummarizerCommand(args) { const command = args.codexBin || process.env.EPISODIC_MEMORY_CODEX_BIN || 'codex'; + if (args.isolated && args.sessionId) + throw new Error('An isolated summary cannot resume a source session'); + const restrictions = args.isolated ? [ + ...['shell_tool', 'unified_exec', 'shell_snapshot', 'apps', 'plugins', 'remote_plugin', + 'hooks', 'multi_agent', 'multi_agent_v2', 'memories', 'goals', 'computer_use', + 'browser_use', 'browser_use_external', 'image_generation', 'workspace_dependencies', + 'skill_search', 'skill_mcp_dependency_install', 'tool_suggest', 'code_mode_host', + 'sleep_tool', 'view_image', 'default_mode_request_user_input'] + .map(feature => `features.${feature}=false`), + 'features.skip_host_skill_discovery=true', 'skills.bundled.enabled=false', + 'skills.include_instructions=false', 'project_doc_max_bytes=0', + 'tools.experimental_request_user_input.enabled=false', 'web_search="disabled"', + 'history.persistence="none"', + ].flatMap(value => ['-c', value]) : []; return { command, - args: ['app-server'], + args: ['app-server', ...restrictions], prompt: args.prompt, sessionId: args.sessionId, model: args.model, + ...(args.isolated ? { isolated: true } : {}), }; } async function callClaude(prompt, sessionId, useFallback = false, cwd) { @@ -421,6 +439,9 @@ async function assertSupportedCodexVersion(command) { } const output = await readCommandOutput(command.command, command.versionArgs || ['--version']); const version = parseCodexCliVersion(output); + if (command.isolated && (!version || !versionMeetsMinimum(version, '0.154.0'))) { + throw new Error('Isolated record-policy summarization requires codex-cli >= 0.154.0'); + } if (!version || !versionMeetsMinimum(version)) { throw new Error(codexVersionRequirementMessage(output)); } @@ -440,10 +461,16 @@ function requireTurnId(result, method) { return turnId; } export async function runCodexCommand(command) { + if (command.isolated && command.sessionId) + throw new Error('An isolated summary cannot resume a source session'); await assertSupportedCodexVersion(command); + const summaryCwd = command.isolated + ? fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'episodic-memory-summary-'))) + : undefined; return new Promise((resolve, reject) => { const child = spawn(command.command, command.args, { env: getApiEnv(), + ...(summaryCwd ? { cwd: summaryCwd } : {}), stdio: ['pipe', 'pipe', 'pipe'] }); let stderr = ''; @@ -451,6 +478,7 @@ export async function runCodexCommand(command) { let nextRequestId = 1; let targetTurnId; let finished = false; + let terminalOutcome; let timeout; const pending = new Map(); const lines = createInterface({ input: child.stdout }); @@ -471,6 +499,12 @@ export async function runCodexCommand(command) { return; finished = true; cleanup(); + if (command.isolated) { + // Wait for process termination before removing its owned directory. + // Provider payloads may repeat input; never persist them in error sidecars. + terminalOutcome = { error: error ? new Error('Isolated Codex summary failed; provider details suppressed') : undefined, result }; + return; + } if (error) { reject(error); } @@ -544,6 +578,23 @@ export async function runCodexCommand(command) { finish(new Error(detail)); } }); + child.on('close', () => { + if (!command.isolated) + return; + try { + if (summaryCwd) + fs.rmSync(summaryCwd, { recursive: true, force: true }); + if (terminalOutcome?.error) + reject(terminalOutcome.error); + else if (terminalOutcome) + resolve(terminalOutcome.result); + else + reject(new Error('Isolated Codex summary ended without a terminal result')); + } + catch { + reject(new Error('Isolated Codex summary cleanup failed')); + } + }); (async () => { try { await send('initialize', { @@ -557,15 +608,45 @@ export async function runCodexCommand(command) { }, }); notify('initialized'); - const fork = await send('thread/fork', { - threadId: command.sessionId, + let isolation = {}; + if (command.isolated) { + const configured = await send('config/read', { includeLayers: false }); + const servers = configured?.config?.mcp_servers; + if (!configured?.config || servers !== undefined && (!servers || typeof servers !== 'object' || Array.isArray(servers))) { + throw new Error('Cannot establish configured MCP boundary'); + } + const listed = await send('skills/list', { cwds: [summaryCwd], forceReload: true }); + if (!Array.isArray(listed?.data) || listed.data.some((entry) => !Array.isArray(entry.skills) || !Array.isArray(entry.errors) || entry.errors.length)) { + throw new Error('Cannot establish configured skill boundary'); + } + const skills = listed.data.flatMap((entry) => entry.skills).map((skill) => { + if (typeof skill.path !== 'string' || !path.isAbsolute(skill.path)) + throw new Error('Invalid configured skill identity'); + return { path: skill.path, enabled: false }; + }); + isolation = { + cwd: summaryCwd, + dynamicTools: [], environments: [], selectedCapabilityRoots: [], + allowProviderModelFallback: false, + baseInstructions: 'Summarize only the admitted transcript. Do not use tools or recover external context.', + developerInstructions: 'Output only a concise factual summary inside .', + config: { + mcp_servers: Object.fromEntries(Object.keys(servers ?? {}).map(name => [name, { enabled: false }])), + 'skills.config': skills, + }, + }; + } + const method = command.sessionId ? 'thread/fork' : 'thread/start'; + const fork = await send(method, { + ...(command.sessionId ? { threadId: command.sessionId } : {}), ephemeral: true, excludeTurns: true, sandbox: 'read-only', approvalPolicy: 'never', ...(command.model ? { model: command.model } : {}), + ...isolation, }); - const forkThreadId = requireThreadId(fork, 'thread/fork'); + const forkThreadId = requireThreadId(fork, method); const turn = await send('turn/start', { threadId: forkThreadId, input: [{ @@ -582,8 +663,8 @@ export async function runCodexCommand(command) { })(); }); } -async function callCodex(prompt, sessionId, model) { - const command = buildCodexSummarizerCommand({ sessionId, prompt, model }); +async function callCodex(prompt, sessionId, model, isolated = false) { + const command = buildCodexSummarizerCommand({ sessionId, prompt, model, isolated }); return runCodexCommand(command); } function chunkExchanges(exchanges, chunkSize) { @@ -618,6 +699,10 @@ export function getCodexModel(_exchanges) { return process.env.EPISODIC_MEMORY_CODEX_MODEL || undefined; } export async function summarizeConversation(exchanges, sessionId) { + const recordPolicy = readRecordExclusions(); + exchanges = exchanges.map(exchange => admitExchange(exchange, recordPolicy)).filter((exchange) => exchange !== null); + if (recordPolicy) + sessionId = undefined; // Handle trivial conversations if (exchanges.length === 0) { return 'Trivial conversation with no substantive content.'; @@ -631,10 +716,15 @@ export async function summarizeConversation(exchanges, sessionId) { const codexSessionId = getCodexSessionId(exchanges, sessionId); if (codexSessionId) { try { - const result = await callCodex(buildCodexSummaryPrompt(), codexSessionId, getCodexModel(exchanges)); + const prompt = recordPolicy + ? `${SUMMARIZER_CONTEXT_MARKER}. Summarize only the following admitted transcript in 2-4 factual sentences inside . Do not inspect files, use tools or recover any original session.\n\n${formatConversationText(exchanges)}` + : buildCodexSummaryPrompt(); + const result = await callCodex(prompt, recordPolicy ? undefined : codexSessionId, getCodexModel(exchanges), !!recordPolicy); return extractSummary(result); } catch (error) { + if (recordPolicy) + throw error; // Keep the selected provider; never recover excluded source context. console.log(` Codex summarizer unavailable, falling back to transcript text: ${error instanceof Error ? error.message : String(error)}`); } } diff --git a/dist/sync-cli.js b/dist/sync-cli.js index 26172c70..c4709fb9 100644 --- a/dist/sync-cli.js +++ b/dist/sync-cli.js @@ -203,7 +203,13 @@ async function syncAll() { totals.summarized += result.summarized; totals.errors.push(...result.errors); } - console.log(`\n✅ Sync complete!`); + // Admission failure is a partial run, not successful synchronization. + // Finish migration before emitting a success claim as well. + if (totals.errors.length === 0) + await runEmbeddingMigrationPhase(); + else + process.exitCode = 1; + console.log(totals.errors.length ? '\nSync finished with errors.' : '\n✅ Sync complete!'); console.log(` Copied: ${totals.copied}`); console.log(` Skipped: ${totals.skipped}`); console.log(` Indexed: ${totals.indexed}`); @@ -223,10 +229,6 @@ async function syncAll() { console.log(` Check your API configuration (EPISODIC_MEMORY_API_BASE_URL / ANTHROPIC_API_KEY).`); } } - // After regular sync, do a batch of embedding migration if any rows are - // still on the old encoder. Lock-protected; if another process is already - // migrating, this is a no-op. - await runEmbeddingMigrationPhase(); } const MIGRATION_BATCH_SIZE = parseInt(process.env.EPISODIC_MEMORY_MIGRATION_BATCH || '500', 10); async function runEmbeddingMigrationPhase() { @@ -246,6 +248,7 @@ async function runEmbeddingMigrationPhase() { } catch (err) { console.error('episodic-memory: migration phase error:', err instanceof Error ? err.message : err); + throw err; } finally { db.close(); diff --git a/dist/sync.d.ts b/dist/sync.d.ts index 658e98ad..529aa0f0 100644 --- a/dist/sync.d.ts +++ b/dist/sync.d.ts @@ -1,13 +1,4 @@ -/** - * Stream and scan for any exclusion marker, carrying an overlap between - * chunks so a marker split across a boundary is still found. A single - * fs.readFileSync(path, 'utf-8') throws ERR_STRING_TOO_LONG above Node's - * ~512 MB max string length; the old catch returned false (fail OPEN), - * silently indexing a file whose DO NOT INDEX marker we never read (#152). - * Streaming confirms cleanliness at any size, and a real read error now - * fails CLOSED (skip) rather than open. - */ -export declare function shouldSkipConversation(filePath: string): boolean; +export { shouldSkipConversation } from './record-admission.js'; export interface SyncResult { copied: number; skipped: number; diff --git a/dist/sync.js b/dist/sync.js index 0629761d..58b64be5 100644 --- a/dist/sync.js +++ b/dist/sync.js @@ -1,56 +1,11 @@ import fs from 'fs'; +import { archiveAdmittedConversation, readRecordExclusions } from './record-admission.js'; import path from 'path'; -import { StringDecoder } from 'string_decoder'; -import { SUMMARIZER_CONTEXT_MARKER } from './constants.js'; import { getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { formatErrorSentinel, shouldQueueForSummary } from './summary-sentinel.js'; import { getMaxMessageBytes, isOversizeExchange } from './message-size.js'; -const EXCLUSION_MARKERS = [ - 'DO NOT INDEX THIS CHAT', - 'Only use NO_INSIGHTS_FOUND', - SUMMARIZER_CONTEXT_MARKER, -]; -const MARKER_SCAN_CHUNK_BYTES = 1 << 20; // 1 MiB -/** - * Stream and scan for any exclusion marker, carrying an overlap between - * chunks so a marker split across a boundary is still found. A single - * fs.readFileSync(path, 'utf-8') throws ERR_STRING_TOO_LONG above Node's - * ~512 MB max string length; the old catch returned false (fail OPEN), - * silently indexing a file whose DO NOT INDEX marker we never read (#152). - * Streaming confirms cleanliness at any size, and a real read error now - * fails CLOSED (skip) rather than open. - */ -export function shouldSkipConversation(filePath) { - const maxMarkerLen = Math.max(...EXCLUSION_MARKERS.map(m => m.length)); - let fd; - try { - fd = fs.openSync(filePath, 'r'); - const buf = Buffer.allocUnsafe(MARKER_SCAN_CHUNK_BYTES); - const decoder = new StringDecoder('utf8'); - let carry = ''; - let bytesRead; - while ((bytesRead = fs.readSync(fd, buf, 0, buf.length, null)) > 0) { - const window = carry + decoder.write(buf.subarray(0, bytesRead)); - if (EXCLUSION_MARKERS.some(marker => window.includes(marker))) { - return true; - } - carry = window.slice(Math.max(0, window.length - (maxMarkerLen - 1))); - } - const tail = carry + decoder.end(); - return EXCLUSION_MARKERS.some(marker => tail.includes(marker)); - } - catch { - return true; // fail closed (#152) - } - finally { - if (fd !== undefined) { - try { - fs.closeSync(fd); - } - catch { } - } - } -} +export { shouldSkipConversation } from './record-admission.js'; +import { shouldSkipConversation } from './record-admission.js'; /** * True when a transcript contains at least one message line in any supported * harness format. Summarizer-spawned Agent SDK sessions materialize as @@ -122,33 +77,6 @@ function hasConversationContent(filePath) { export function buildSyncOptionsFromEnv(env) { return { skipSummaries: env.EPISODIC_MEMORY_SKIP_SUMMARIES === '1' }; } -function copyIfNewer(src, dest) { - // Ensure destination directory exists - const destDir = path.dirname(dest); - if (!fs.existsSync(destDir)) { - fs.mkdirSync(destDir, { recursive: true }); - } - // Check if destination exists and is up-to-date - if (fs.existsSync(dest)) { - const srcStat = fs.statSync(src); - const destStat = fs.statSync(dest); - if (destStat.mtimeMs >= srcStat.mtimeMs) { - return false; // Dest is current, skip - } - } - // Atomic copy: temp file + rename - const tempDest = dest + '.tmp.' + process.pid; - fs.copyFileSync(src, tempDest); - fs.renameSync(tempDest, dest); // Atomic on same filesystem - // Preserve source mtime: harnesses without per-message timestamps (Cursor - // agent transcripts) fall back to file mtime. Round up to the next whole - // millisecond — utimes can't always represent the source's sub-millisecond - // precision, and a dest mtime even fractionally older would defeat the - // skip-if-current check above on every subsequent sync. - const srcStat = fs.statSync(src); - fs.utimesSync(dest, srcStat.atimeMs / 1000, Math.ceil(srcStat.mtimeMs) / 1000); - return true; -} export function extractSessionIdFromPath(filePath) { // Extract session ID from Claude filename or Codex rollout filename. const basename = path.basename(filePath, '.jsonl'); @@ -160,6 +88,7 @@ export function extractSessionIdFromPath(filePath) { return null; } export async function syncConversations(sourceDir, destDir, options = {}) { + const exclusions = readRecordExclusions(); const result = { copied: 0, skipped: 0, @@ -198,7 +127,7 @@ export async function syncConversations(sourceDir, destDir, options = {}) { result.skipped++; continue; } - const wasCopied = copyIfNewer(srcFile, destFile); + const wasCopied = await archiveAdmittedConversation(srcFile, destFile, exclusions); if (wasCopied) { result.copied++; filesToIndex.push(destFile); diff --git a/dist/verify.js b/dist/verify.js index dd4535d2..9b0dd9c8 100644 --- a/dist/verify.js +++ b/dist/verify.js @@ -4,6 +4,7 @@ import { parseConversation } from './parser.js'; import { initDatabase, getAllExchanges, getFileLastIndexed } from './db.js'; import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { isErroredSentinel } from './summary-sentinel.js'; +import { readRecordExclusions } from './record-admission.js'; export async function verifyIndex() { const result = { missing: [], @@ -92,6 +93,7 @@ export async function verifyIndex() { return result; } export async function repairIndex(issues) { + readRecordExclusions(); console.log('Repairing index...'); // To avoid circular dependencies, we import the indexer functions dynamically const { initDatabase, insertExchange, deleteExchange } = await import('./db.js'); @@ -138,6 +140,8 @@ export async function repairIndex(issues) { } catch (error) { console.error(`Failed to re-index ${conversationPath}:`, error); + db.close(); + throw error; } } db.close(); diff --git a/src/db.ts b/src/db.ts index 8c7a73ad..1a76cc8c 100644 --- a/src/db.ts +++ b/src/db.ts @@ -1,4 +1,5 @@ import Database from 'better-sqlite3'; +import { admitExchange } from './record-admission.js'; import { ConversationExchange } from './types.js'; import path from 'path'; import fs from 'fs'; @@ -216,6 +217,9 @@ export function insertExchange( embedding: number[], toolNames?: string[] ): void { + const admitted = admitExchange(exchange); + if (!admitted) return; + exchange = admitted; const now = Date.now(); const stmt = db.prepare(` diff --git a/src/indexer.ts b/src/indexer.ts index 173ef679..f6e67ae2 100644 --- a/src/indexer.ts +++ b/src/indexer.ts @@ -1,4 +1,5 @@ import fs from 'fs'; +import { archiveAdmittedConversation, readRecordExclusions } from './record-admission.js'; import path from 'path'; import os from 'os'; import { initDatabase, insertExchange } from './db.js'; @@ -44,6 +45,7 @@ export async function indexConversations( concurrency: number = 1, noSummaries: boolean = false ): Promise { + readRecordExclusions(); console.log('Initializing database...'); const db = initDatabase(); @@ -114,15 +116,12 @@ export async function indexConversations( let exchanges; try { // Copy to archive (ensure parent dirs exist for subagent files) - if (!fs.existsSync(archivePath)) { - fs.mkdirSync(path.dirname(archivePath), { recursive: true }); - fs.copyFileSync(sourcePath, archivePath); - console.log(` Archived: ${file}`); - } + if (await archiveAdmittedConversation(sourcePath, archivePath)) console.log(` Archived: ${file}`); // Parse conversation exchanges = await parseConversation(sourcePath, project, archivePath); } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { db.close(); throw error; } console.log(` Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); continue; } @@ -210,6 +209,7 @@ export async function indexConversations( } export async function indexSession(sessionId: string, concurrency: number = 1, noSummaries: boolean = false): Promise { + readRecordExclusions(); console.log(`Indexing session: ${sessionId}`); // Find the conversation file for this session @@ -246,14 +246,12 @@ export async function indexSession(sessionId: string, concurrency: number = 1, n // Archive + parse — source may vanish mid-run (Claude Code cleanup). let exchanges; try { - if (!fs.existsSync(archivePath)) { - fs.mkdirSync(path.dirname(archivePath), { recursive: true }); - fs.copyFileSync(sourcePath, archivePath); - } + await archiveAdmittedConversation(sourcePath, archivePath); exchanges = await parseConversation(sourcePath, project, archivePath); } catch (error) { - console.log(`Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); db.close(); + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error; + console.log(`Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); break; } @@ -313,6 +311,7 @@ export async function indexSession(sessionId: string, concurrency: number = 1, n } export async function indexUnprocessed(concurrency: number = 1, noSummaries: boolean = false): Promise { + readRecordExclusions(); console.log('Finding unprocessed conversations...'); if (concurrency > 1) console.log(`Concurrency: ${concurrency}`); if (noSummaries) console.log('⚠️ Running in no-summaries mode (skipping AI summaries)'); @@ -366,9 +365,7 @@ export async function indexUnprocessed(concurrency: number = 1, noSummaries: boo fs.mkdirSync(path.dirname(archivePath), { recursive: true }); // Refresh the archive when the source may have grown beyond what we've seen. - if (!fs.existsSync(archivePath) || maxIndexedLine > 0) { - fs.copyFileSync(sourcePath, archivePath); - } + await archiveAdmittedConversation(sourcePath, archivePath); // Parse and filter to exchanges past the high-water mark const exchanges = await parseConversation(sourcePath, project, archivePath); @@ -379,6 +376,7 @@ export async function indexUnprocessed(concurrency: number = 1, noSummaries: boo unprocessed.push({ project, file, sourcePath, archivePath, summaryPath, exchanges: newExchanges }); } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { db.close(); throw error; } console.log(` Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); continue; } diff --git a/src/mcp-server.ts b/src/mcp-server.ts index c1cbd0e3..1dce206c 100644 --- a/src/mcp-server.ts +++ b/src/mcp-server.ts @@ -23,6 +23,7 @@ import { import { formatConversationAsMarkdown } from './show.js'; import { VERSION } from './version.js'; import fs from 'fs'; +import { readAdmittedConversation } from './record-admission.js'; // Zod Schemas for Input Validation @@ -291,7 +292,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { } // Read and format conversation with optional line range - const jsonlContent = fs.readFileSync(params.path, 'utf-8'); + const jsonlContent = await readAdmittedConversation(params.path, params.startLine, params.endLine); const markdownContent = formatConversationAsMarkdown( jsonlContent, params.startLine, diff --git a/src/parser.ts b/src/parser.ts index a416a113..9cef9f17 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,8 +1,8 @@ import fs from 'fs'; -import readline from 'readline'; import path from 'path'; import { ConversationExchange, ConversationHarness, ToolCall } from './types.js'; import crypto from 'crypto'; +import { admittedConversationLines } from './record-admission.js'; interface JSONLMessage { type: string; @@ -91,11 +91,7 @@ interface ExchangeBuilder { } async function detectConversationHarness(filePath: string): Promise { - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); for await (const line of rl) { if (!line.trim()) continue; @@ -175,11 +171,7 @@ async function parseClaudeConversation( archivePath: string ): Promise { const exchanges: ConversationExchange[] = []; - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); let lineNumber = 0; let currentExchange: ExchangeBuilder | null = null; @@ -479,11 +471,7 @@ async function parseOpencodeConversation( archivePath: string ): Promise { const exchanges: ConversationExchange[] = []; - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); let lineNumber = 0; let sessionId: string | undefined; @@ -687,11 +675,7 @@ async function parseOmpConversation( archivePath: string ): Promise { const exchanges: ConversationExchange[] = []; - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); let sessionId: string | undefined; let cwd: string | undefined; @@ -811,11 +795,7 @@ async function parseCodexConversation( archivePath: string ): Promise { const exchanges: ConversationExchange[] = []; - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); let lineNumber = 0; let sessionId: string | undefined; @@ -955,7 +935,8 @@ async function parseCodexConversation( const timestamp = parsed.timestamp || new Date().toISOString(); if (parsed.type === 'session_meta' && payload) { - sessionId = payload.id || sessionId; + // Forked transcripts may retain ancestor headers after the primary one. + sessionId = sessionId || payload.id; cwd = payload.cwd || cwd; gitBranch = payload.git?.branch || gitBranch; agentVersion = payload.cli_version || agentVersion; @@ -1092,11 +1073,7 @@ async function parseCursorConversation( archivePath: string ): Promise { const exchanges: ConversationExchange[] = []; - const fileStream = fs.createReadStream(filePath); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const rl = admittedConversationLines(filePath); // Live Cursor transcripts carry no per-message timestamps; fall back to the // file mtime (preserved from the source by sync's copyIfNewer). Legacy diff --git a/src/record-admission.ts b/src/record-admission.ts new file mode 100644 index 00000000..3b862fd1 --- /dev/null +++ b/src/record-admission.ts @@ -0,0 +1,561 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import crypto from 'node:crypto'; +import os from 'node:os'; +import { spawnSync } from 'node:child_process'; +import { SUMMARIZER_CONTEXT_MARKER } from './constants.js'; +import type { ConversationExchange } from './types.js'; +import { getSuperpowersDir } from './paths.js'; + +const EXCLUSION_MARKERS = [ + 'DO NOT INDEX THIS CHAT', + 'Only use NO_INSIGHTS_FOUND', + SUMMARIZER_CONTEXT_MARKER, +]; + +const MARKER_SCAN_CHUNK_BYTES = 1 << 20; // 1 MiB + +/** Scan decoded instruction records without retaining the whole transcript. */ +export function shouldSkipConversation(filePath: string): boolean { + let fd: number | undefined; + try { + fd = fs.openSync(filePath, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + const initial = fs.fstatSync(fd); + const excluded = descriptorHasExclusionMarker(fd); + assertUnchangedInput(filePath, initial); + return excluded; + } catch { + return true; + } finally { + if (fd !== undefined) fs.closeSync(fd); + } +} + +function instructionText(record: unknown): string { + if (!object(record)) return ''; + // Codex records both the response item and its user-message event. + if (record.type === 'event_msg' && object(record.payload)) { + return record.payload.type === 'user_message' && typeof record.payload.message === 'string' + ? record.payload.message : ''; + } + const message = record.type === 'response_item' ? record.payload : record.message; + if (!object(message) || (message.role ?? record.role) !== 'user') return ''; + const content = record.type === 'opencode_message' ? record.parts : message.content; + if (typeof content === 'string') return content; + if (!Array.isArray(content)) return ''; + // Claude tool results are wrapped in a user envelope, but are not instructions. + return content.filter(part => object(part) && ['text', 'input_text'].includes(String(part.type)) + && typeof part.text === 'string').map(part => part.text).join('\n'); +} + +function descriptorHasExclusionMarker(fd: number, byteLimit = Infinity, digest?: crypto.Hash): boolean { + if (!fs.fstatSync(fd).isFile()) throw new Error('Conversation input must be a regular file'); + const buffer = Buffer.allocUnsafe(MARKER_SCAN_CHUNK_BYTES); + const decoder = new TextDecoder('utf-8', { fatal: true }); + let pending = Buffer.alloc(0); + let position = 0; + const excluded = (bytes: Buffer) => { + const line = decoder.decode(bytes); + let text: string; + try { text = instructionText(JSON.parse(line)); } + catch { text = line; } // Preserve conservative handling of legacy raw transcripts. + return EXCLUSION_MARKERS.some(marker => text.includes(marker)); + }; + let count: number; + while (position < byteLimit && (count = fs.readSync(fd, buffer, 0, Math.min(buffer.length, byteLimit - position), position)) > 0) { + position += count; + digest?.update(buffer.subarray(0, count)); + pending = Buffer.concat([pending, buffer.subarray(0, count)]); + let newline: number; + while ((newline = pending.indexOf(10)) !== -1) { + if (newline > 64 * 1024 * 1024) throw new Error('Conversation record exceeds admission byte limit'); + if (excluded(pending.subarray(0, newline))) return true; + pending = pending.subarray(newline + 1); + } + if (pending.length > 64 * 1024 * 1024) throw new Error('Conversation record exceeds admission byte limit'); + } + if (position < byteLimit && byteLimit !== Infinity) throw new Error('Conversation changed during record admission'); + return pending.length > 0 && excluded(pending); +} + +function assertUnchangedInput(file: string, initial: fs.Stats): void { + const current = fs.lstatSync(file); + if (!current.isFile() || initial.dev !== current.dev || initial.ino !== current.ino || + initial.size !== current.size || initial.mtimeMs !== current.mtimeMs || initial.ctimeMs !== current.ctimeMs) { + throw new Error('Conversation changed during record admission'); + } +} + +function assertUnchangedSearchPrefix(file: string, initial: fs.Stats, expectedDigest: string): void { + // A live transcript may grow after the search snapshot. Rehash the pinned + // prefix only when metadata changes, so appended bytes cannot hide a rewrite. + const changed = () => new Error('Conversation changed during record admission'); + let current: fs.Stats; + try { current = fs.lstatSync(file); } catch { throw changed(); } + if (!current.isFile() || initial.dev !== current.dev || initial.ino !== current.ino || current.size < initial.size) { + throw changed(); + } + if (current.size === initial.size && current.mtimeMs === initial.mtimeMs && current.ctimeMs === initial.ctimeMs) return; + + let fd: number | undefined; + try { + fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + const opened = fs.fstatSync(fd); + if (!opened.isFile() || opened.dev !== initial.dev || opened.ino !== initial.ino || opened.size < initial.size) throw changed(); + const digest = crypto.createHash('sha256'); + const buffer = Buffer.allocUnsafe(MARKER_SCAN_CHUNK_BYTES); + let position = 0; + while (position < initial.size) { + const count = fs.readSync(fd, buffer, 0, Math.min(buffer.length, initial.size - position), position); + if (count <= 0) throw changed(); + digest.update(buffer.subarray(0, count)); + position += count; + } + if (digest.digest('hex') !== expectedDigest) throw changed(); + current = fs.lstatSync(file); + if (!current.isFile() || current.dev !== initial.dev || current.ino !== initial.ino || current.size < initial.size) throw changed(); + } catch { throw changed(); } + finally { if (fd !== undefined) fs.closeSync(fd); } +} + +function assertUnchangedPolicy(expected: string): void { + if (JSON.stringify(readRecordExclusions()) !== expected) { + throw new Error('Record exclusion policy changed during record admission'); + } +} + +function prepareArchiveParent(directory: string): string { + try { + const info = fs.lstatSync(directory); + if (!info.isDirectory() || info.isSymbolicLink()) throw new Error('Archive parent must be a non-symlink directory'); + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error; + const parent = path.dirname(directory); + if (parent === directory) throw error; + prepareArchiveParent(parent); + fs.mkdirSync(directory, { mode: 0o700 }); + } + return fs.realpathSync(directory); +} + +interface ExchangeExclusion { + session_id: string; + transcript: string; + line_start: number; + line_end: number; +} + +interface ToolExclusion { + session_id: string; + transcript: string; + call_id: string; +} + +export interface RecordExclusions { + version: 1; + exchanges: ExchangeExclusion[]; + tool_calls: ToolExclusion[]; + screening?: { + engine: 'gitleaks'; + executable: string; + sha256: string; + timeout_ms: number; + max_record_bytes: number; + }; +} + +const POLICY_ERROR = 'Invalid or unreadable record exclusion policy'; +const UUID = /[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}/ig; + +function object(value: unknown): value is Record { + return value !== null && typeof value === 'object' && !Array.isArray(value); +} + +function keys(value: Record, expected: string[]): boolean { + return Object.keys(value).length === expected.length && expected.every(key => key in value); +} + +function transcriptName(value: unknown): value is string { + return identity(value) && !/[\\/]/.test(value) && value.endsWith('.jsonl') && value !== '.jsonl'; +} + +function identity(value: unknown): value is string { + return typeof value === 'string' && value.length > 0 && value.length <= 512 && !/[\x00-\x1f]/.test(value); +} + +/** Keep scanner inputs local to one record, including JSON-escaped text. */ +function screeningText(value: unknown, depth = 0): string { + if (depth > 24) throw new Error('Record screening nesting limit exceeded'); + if (typeof value === 'string') { + let decoded: unknown; + try { decoded = JSON.parse(value); } catch { return value; } + if (typeof decoded === 'string' || object(decoded) || Array.isArray(decoded)) { + return screeningText(decoded, depth + 1); + } + return value; + } + if (Array.isArray(value)) return value.map(item => screeningText(item, depth + 1)).join('\n'); + if (object(value)) { + // Generic credential rules need an assignment delimiter, not just a nearby + // keyword. Decode nested text without destroying its key/value relation. + return Object.entries(value).map(([key, item]) => `${key} = ${screeningText(item, depth + 1)}`).join('\n'); + } + return value == null ? '' : String(value); +} + +/** One pinned, short-lived local scanner context; no secret-bearing cache. */ +function createRecordScreener(policy: RecordExclusions | null): { scan(value: unknown): void; close(): void } { + const config = policy?.screening; + if (!config) return { scan() {}, close() {} }; + const unavailable = () => new Error('Record screening unavailable'); + let initial: fs.Stats; + let fd: number | undefined; + try { + if (fs.realpathSync(config.executable) !== config.executable) throw unavailable(); + fd = fs.openSync(config.executable, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + initial = fs.fstatSync(fd); + if (!initial.isFile() || initial.size < 1 || initial.size > 134_217_728 || + (initial.mode & 0o022) !== 0 || + (typeof process.getuid === 'function' && initial.uid !== 0 && initial.uid !== process.getuid())) { + throw unavailable(); + } + fs.accessSync(config.executable, fs.constants.X_OK); + const digest = crypto.createHash('sha256').update(fs.readFileSync(fd)).digest('hex'); + if (digest !== config.sha256) throw unavailable(); + } catch { throw unavailable(); } + finally { if (fd !== undefined) fs.closeSync(fd); } + let directory: string; + try { + directory = fs.mkdtempSync(path.join(os.tmpdir(), 'episodic-screen-')); + fs.chmodSync(directory, 0o700); + } catch { throw unavailable(); } + const unchanged = () => { + try { + const current = fs.lstatSync(config.executable); + if (!current.isFile() || current.dev !== initial.dev || current.ino !== initial.ino || + current.size !== initial.size || current.mtimeMs !== initial.mtimeMs || + current.ctimeMs !== initial.ctimeMs) throw unavailable(); + } catch { throw unavailable(); } + }; + return { + scan(value: unknown) { + const raw = typeof value === 'string' ? value : JSON.stringify(value); + if (raw === undefined) return; + if (Buffer.byteLength(raw) > config.max_record_bytes) throw new Error('Record screening byte limit exceeded'); + const input = screeningText(value); + if (Buffer.byteLength(input) > config.max_record_bytes) throw new Error('Record screening byte limit exceeded'); + if (!input.trim()) return; + unchanged(); + const result = spawnSync(config.executable, [ + 'stdin', '--redact', '--no-banner', '--log-level', 'error', + '--ignore-gitleaks-allow', '--exit-code', '10', '--report-format', 'json', '--report-path', '-', + ], { + input, encoding: 'utf8', cwd: directory, shell: false, + env: { HOME: directory, USERPROFILE: directory, PATH: path.dirname(config.executable) }, + timeout: config.timeout_ms, killSignal: 'SIGKILL', maxBuffer: 1_048_576, + windowsHide: true, + }); + unchanged(); + // Exit zero alone is not a clean scan. Validate the full report and never + // forward stdout/stderr, findings, fingerprints or input into errors. + if (result.error || result.signal || ![0, 10].includes(result.status ?? -1)) throw unavailable(); + let report: unknown; + try { report = JSON.parse(result.stdout); } catch { throw unavailable(); } + if (!Array.isArray(report) || (result.status === 0 && report.length !== 0) || + (result.status === 10 && (report.length === 0 || !report.every(item => object(item) && typeof item.RuleID === 'string')))) { + throw unavailable(); + } + if (result.status === 10) throw new Error('Record content rejected by screening'); + }, + close() { fs.rmSync(directory, { recursive: true, force: true }); }, + }; +} + +export function readRecordExclusions(): RecordExclusions | null { + const file = path.join(getSuperpowersDir(), 'record-exclusions.json'); + let fd: number | undefined; + try { + fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + const info = fs.fstatSync(fd); + if (!info.isFile() || info.size > 4 * 1024 * 1024) throw new Error(POLICY_ERROR); + const value: unknown = JSON.parse(fs.readFileSync(fd, 'utf8')); + if (!object(value) || !keys(value, 'screening' in value + ? ['version', 'exchanges', 'tool_calls', 'screening'] : ['version', 'exchanges', 'tool_calls']) || value.version !== 1 || + !Array.isArray(value.exchanges) || !Array.isArray(value.tool_calls)) throw new Error(POLICY_ERROR); + if ('screening' in value) { + const s = value.screening; + if (!object(s) || !keys(s, ['engine', 'executable', 'sha256', 'timeout_ms', 'max_record_bytes']) || + s.engine !== 'gitleaks' || typeof s.executable !== 'string' || !path.isAbsolute(s.executable) || + /[\x00-\x1f]/.test(s.executable) || typeof s.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(s.sha256) || + !Number.isSafeInteger(s.timeout_ms) || Number(s.timeout_ms) < 50 || Number(s.timeout_ms) > 30_000 || + !Number.isSafeInteger(s.max_record_bytes) || Number(s.max_record_bytes) < 1 || Number(s.max_record_bytes) > 8_388_608) { + throw new Error(POLICY_ERROR); + } + } + for (const row of value.exchanges) { + if (!object(row) || !keys(row, ['session_id', 'transcript', 'line_start', 'line_end']) || !identity(row.session_id) || !transcriptName(row.transcript) || + !Number.isSafeInteger(row.line_start) || !Number.isSafeInteger(row.line_end) || + (row.line_start as number) < 1 || (row.line_end as number) < (row.line_start as number)) throw new Error(POLICY_ERROR); + } + for (const row of value.tool_calls) { + if (!object(row) || !keys(row, ['session_id', 'transcript', 'call_id']) || !identity(row.session_id) || !transcriptName(row.transcript) || !identity(row.call_id)) throw new Error(POLICY_ERROR); + } + return value as unknown as RecordExclusions; + } catch (error) { + if (fd === undefined && (error as NodeJS.ErrnoException).code === 'ENOENT') return null; + throw new Error(POLICY_ERROR); + } finally { + if (fd !== undefined) fs.closeSync(fd); + } +} + +export function excludedSession(policy: RecordExclusions | null, sessionId?: string): boolean { + return !!sessionId && !!policy && (policy.exchanges.some(x => x.session_id === sessionId) || + policy.tool_calls.some(x => x.session_id === sessionId)); +} + +function sessionFromPath(file: string): string | undefined { + return path.basename(file).match(UUID)?.at(-1); +} + +function sessionFromRecord(value: any): string | undefined { + if (value?.type === 'session_meta') return value.payload?.id; + if (value?.type === 'session') return value.id; + if (value?.type === 'opencode_session') return value.session?.id; + return value?.sessionId ?? value?.sessionID ?? value?.message?.sessionID; +} + +function blockedCall(policy: RecordExclusions, sessionId: string, transcript: string, callId: unknown): boolean { + return typeof callId === 'string' && policy.tool_calls.some(x => x.session_id === sessionId && x.transcript === transcript && x.call_id === callId); +} + +function filterRecord(line: string, number: number, policy: RecordExclusions | null, transcript: string, sessionId?: string): string { + if (!policy || !sessionId) return line; + if (policy.exchanges.some(x => x.session_id === sessionId && x.transcript === transcript && number >= x.line_start && number <= x.line_end)) return ''; + let value: any; + try { value = JSON.parse(line); } catch { return line; } + if (blockedCall(policy, sessionId, transcript, value?.payload?.call_id) || blockedCall(policy, sessionId, transcript, value?.call_id)) return ''; + // Claude and Cursor may combine safe text and tool payloads in one physical record. + // Preserve the record and safe blocks rather than excluding the entire exchange. + const content = value?.message?.content; + if (Array.isArray(content)) { + const kept = content.filter(block => !blockedCall(policy, sessionId, transcript, block?.id ?? block?.tool_use_id)); + if (kept.length !== content.length) { + return JSON.stringify({ ...value, message: { ...value.message, content: kept } }); + } + } + if (Array.isArray(value?.parts)) { + const kept = value.parts.filter((part: any) => !blockedCall(policy, sessionId, transcript, part?.callID ?? part?.id)); + if (kept.length !== value.parts.length) return JSON.stringify({ ...value, parts: kept }); + } + return line; +} + +/** Keep byte delimiters and physical line coordinates stable in derived copies. */ +async function* admittedRecords(file: string, policy: RecordExclusions | null, startLine = 1, endLine = Infinity): AsyncGenerator<{ line: string; ending: string }> { + const policySnapshot = JSON.stringify(policy); + assertUnchangedPolicy(policySnapshot); + const input = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + const initial = fs.fstatSync(input); + let stream: fs.ReadStream | undefined; + let screener: ReturnType | undefined; + const decoder = new TextDecoder('utf-8', { fatal: true }); + let pending = Buffer.alloc(0); + let sessionId = sessionFromPath(file); + let primaryIdentitySeen = false; + let number = 0; + const admit = (bytes: Buffer, terminated: boolean) => { + number++; + const crlf = terminated && bytes.at(-1) === 13; + const line = decoder.decode(crlf ? bytes.subarray(0, -1) : bytes); + let recordSession: string | undefined; + try { recordSession = sessionFromRecord(JSON.parse(line)); } catch { /* Parser owns malformed records. */ } + if (recordSession && !primaryIdentitySeen) { + if (sessionId && recordSession !== sessionId && (excludedSession(policy, sessionId) || excludedSession(policy, recordSession))) { + throw new Error('Record exclusion session identity mismatch'); + } + sessionId = recordSession; + primaryIdentitySeen = true; + } + const filtered = number >= startLine && number <= endLine + ? filterRecord(line, number, policy, path.basename(file), sessionId) : ''; + screener?.scan(filtered); + return { line: filtered, ending: terminated ? (crlf ? '\r\n' : '\n') : '' }; + }; + try { + // The marker scan and record stream share one descriptor and identity. + // A path replacement cannot substitute a different unscanned transcript. + if (descriptorHasExclusionMarker(input)) return; + assertUnchangedInput(file, initial); + screener = createRecordScreener(policy); + stream = fs.createReadStream(file, { fd: input, autoClose: true, start: 0 }); + for await (const chunk of stream) { + assertUnchangedInput(file, initial); + assertUnchangedPolicy(policySnapshot); + pending = Buffer.concat([pending, chunk]); + let newline: number; + while ((newline = pending.indexOf(10)) !== -1) { + yield admit(pending.subarray(0, newline), true); + pending = pending.subarray(newline + 1); + } + if (pending.length > 64 * 1024 * 1024) throw new Error('Conversation record exceeds admission byte limit'); + } + if (pending.length) yield admit(pending, false); + assertUnchangedInput(file, initial); + assertUnchangedPolicy(policySnapshot); + } finally { + if (stream) stream.destroy(); + else fs.closeSync(input); + screener?.close(); + } +} + +/** Read original inputs without mutation, preserving their physical line numbers. */ +export async function* admittedConversationLines(file: string, policy = readRecordExclusions()): AsyncGenerator { + if (!fs.lstatSync(file).isFile()) throw new Error('Conversation input must be a regular non-symlink file'); + if (shouldSkipConversation(file)) return; + for await (const record of admittedRecords(file, policy)) yield record.line; +} + +/** Read the admitted display input without changing original physical coordinates. */ +export async function readAdmittedConversation(file: string, startLine = 1, endLine = Infinity): Promise { + if (!Number.isSafeInteger(startLine) || startLine < 1 || + (endLine !== Infinity && (!Number.isSafeInteger(endLine) || endLine < startLine))) { + throw new Error('Invalid conversation line range'); + } + const lines: string[] = []; + for await (const record of admittedRecords(file, readRecordExclusions(), startLine, endLine)) lines.push(record.line); + return lines.join('\n'); +} + +/** Enforce the same rule for direct callers that bypass transcript parsing. */ +export function admitExchange(exchange: ConversationExchange, policy = readRecordExclusions()): ConversationExchange | null { + if (!policy) return exchange; + // Historical Codex rows may carry a fork ancestor's ID. Neither that metadata + // nor the filename may override a denial bound to the other known identity. + const sessionIds = [exchange.sessionId, sessionFromPath(exchange.archivePath)].filter((id): id is string => !!id); + const transcript = path.basename(exchange.archivePath); + if (policy.exchanges.some(x => sessionIds.includes(x.session_id) && x.transcript === transcript && exchange.lineStart <= x.line_end && exchange.lineEnd >= x.line_start)) return null; + const kept = exchange.toolCalls?.filter(call => !sessionIds.some(id => blockedCall(policy, id, transcript, call.id))); + const admitted = kept && kept.length !== exchange.toolCalls?.length ? { ...exchange, toolCalls: kept } : exchange; + const screener = createRecordScreener(policy); + try { + // These are separate original records, not one keyword-prefilter fragment. + screener.scan(admitted.userMessage); + screener.scan(admitted.assistantMessage); + for (const call of admitted.toolCalls ?? []) screener.scan(call); + const { userMessage, assistantMessage, toolCalls, ...metadata } = admitted; + screener.scan(metadata); + return admitted; + } finally { screener.close(); } +} + +/** Publish only admitted bytes. Never write an unfiltered temporary copy. */ +export async function archiveAdmittedConversation(source: string, destination: string, policy = readRecordExclusions()): Promise { + const policySnapshot = JSON.stringify(policy); + assertUnchangedPolicy(policySnapshot); + if (shouldSkipConversation(source)) return false; + if (path.resolve(source) === path.resolve(destination)) throw new Error('Source and derived archive must be distinct'); + const original = fs.lstatSync(source); + if (!original.isFile()) throw new Error('Conversation source must be a regular non-symlink file'); + if (fs.existsSync(destination)) { + const target = fs.lstatSync(destination); + if (!target.isFile() || target.dev === original.dev && target.ino === original.ino) { + throw new Error('Source and derived archive must be distinct regular files'); + } + } + if (!policy && fs.existsSync(destination) && fs.statSync(destination).mtimeMs >= original.mtimeMs) return false; + const initial = fs.statSync(source); + const parent = prepareArchiveParent(path.dirname(path.resolve(destination))); + const parentIdentity = fs.statSync(parent); + destination = path.join(parent, path.basename(destination)); + const temp = destination + '.tmp.' + process.pid + '.' + crypto.randomUUID(); + const fd = fs.openSync(temp, 'wx', 0o600); + const hash = crypto.createHash('sha256'); + try { + for await (const record of admittedRecords(source, policy)) { + const bytes = Buffer.from(record.line + record.ending); + hash.update(bytes); + fs.writeFileSync(fd, bytes); + } + fs.fsyncSync(fd); + } catch (error) { + fs.closeSync(fd); + fs.unlinkSync(temp); + throw error; + } + fs.closeSync(fd); + try { + const final = fs.statSync(source); + if (initial.dev !== final.dev || initial.ino !== final.ino || initial.size !== final.size || initial.mtimeMs !== final.mtimeMs) { + throw new Error('Conversation changed during record admission'); + } + if (fs.existsSync(destination)) { + const existing = crypto.createHash('sha256'); + for await (const chunk of fs.createReadStream(destination)) existing.update(chunk); + if (existing.digest('hex') === hash.digest('hex')) return false; + } + assertUnchangedInput(source, original); + assertUnchangedPolicy(policySnapshot); + const currentParent = fs.lstatSync(parent); + if (!currentParent.isDirectory() || currentParent.dev !== parentIdentity.dev || currentParent.ino !== parentIdentity.ino) { + throw new Error('Archive parent changed during record admission'); + } + fs.renameSync(temp, destination); + fs.utimesSync(destination, initial.atimeMs / 1000, Math.ceil(initial.mtimeMs) / 1000); + return true; + } finally { if (fs.existsSync(temp)) fs.unlinkSync(temp); } +} + +/** Request-local admission: retained search rows are not trusted merely because they were indexed. */ +export function createSearchAdmission() { + const policy = readRecordExclusions(); + const policySnapshot = JSON.stringify(policy); + const files = new Map(); + const checkFile = (file: string) => { + assertUnchangedPolicy(policySnapshot); + const cached = files.get(file); + if (cached) return !cached.excluded; + let fd: number | undefined; + try { + const pathInfo = fs.lstatSync(file); + if (!pathInfo.isFile()) throw new Error('Conversation changed during record admission'); + fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + const initial = fs.fstatSync(fd); + if (!initial.isFile() || initial.dev !== pathInfo.dev || initial.ino !== pathInfo.ino || + !Number.isSafeInteger(initial.size)) throw new Error('Conversation changed during record admission'); + const hash = crypto.createHash('sha256'); + // The observed size is this request's snapshot boundary. Records appended + // later are admitted by the next request, including conversation opt-outs. + const excluded = descriptorHasExclusionMarker(fd, initial.size, hash); + files.set(file, { initial, excluded, digest: excluded ? undefined : hash.digest('hex') }); + return !excluded; + } catch { throw new Error('Conversation changed during record admission'); } + finally { if (fd !== undefined) fs.closeSync(fd); } + }; + return { + admit(exchange: ConversationExchange): ConversationExchange | null { + if (!checkFile(exchange.archivePath)) return null; + const admitted = admitExchange(exchange, policy); + assertUnchangedPolicy(policySnapshot); + return admitted; + }, + summary(exchange: ConversationExchange, text: string): string | undefined { + // An old summary has no record-level provenance. A filtered source may have + // contributed any of its text, so do not expose that derived summary. + const ids = [exchange.sessionId, sessionFromPath(exchange.archivePath)]; + const transcript = path.basename(exchange.archivePath); + if (policy && [...policy.exchanges, ...policy.tool_calls].some(row => + row.transcript === transcript && ids.includes(row.session_id))) return undefined; + return admitExchange({ ...exchange, userMessage: text, assistantMessage: '', toolCalls: [] }, policy) + ? text : undefined; + }, + verify() { + assertUnchangedPolicy(policySnapshot); + for (const [file, { initial, digest }] of files) { + if (digest !== undefined) assertUnchangedSearchPrefix(file, initial, digest); + } + assertUnchangedPolicy(policySnapshot); + }, + }; +} diff --git a/src/search.ts b/src/search.ts index 786d5119..d12e779a 100644 --- a/src/search.ts +++ b/src/search.ts @@ -1,5 +1,6 @@ import Database from 'better-sqlite3'; import { initDatabase } from './db.js'; +import { createSearchAdmission } from './record-admission.js'; import { initEmbeddings, generateQueryEmbedding } from './embeddings.js'; import { SearchResult, ConversationExchange, MultiConceptResult } from './types.js'; import { isErroredSentinel } from './summary-sentinel.js'; @@ -188,81 +189,77 @@ export async function searchConversations( if (after) validateISODate(after, '--after'); if (before) validateISODate(before, '--before'); + const admission = createSearchAdmission(); const db = initDatabase(); + const admitted = (row: any) => admission.admit(exchangeFromRow(row)) !== null; let results: any[] = []; const { sql: filterClause, params: filterParams } = buildSearchFilters(options); - if (mode === 'vector' || mode === 'both') { - // Vector similarity search. - // vec0 applies KNN before the WHERE clause and before our sidechain - // de-rank, so we over-fetch candidates and trim after the final ordering. - await initEmbeddings(); - const queryEmbedding = await generateQueryEmbedding(query); - const k = limit * 3; - - const stmt = db.prepare(` - SELECT - ${EXCHANGE_SELECT_COLUMNS}, - vec.distance - FROM vec_exchanges AS vec - JOIN exchanges AS e ON vec.id = e.id - WHERE vec.embedding MATCH ? - AND k = ? - ${sidechainClause} - ${filterClause} - ORDER BY (vec.distance + e.is_sidechain * ?) ASC - `); - - results = stmt.all( - Buffer.from(new Float32Array(queryEmbedding).buffer), - k, - ...filterParams, - SIDECHAIN_DISTANCE_PENALTY - ); - if (results.length > limit) { - results = results.slice(0, limit); + try { + if (mode === 'vector' || mode === 'both') { + // Order the filtered candidates before admission. The vec0 KNN API caps k; + // increasing k cannot find safe results beyond a large excluded prefix. + await initEmbeddings(); + const queryEmbedding = await generateQueryEmbedding(query); + const stmt = db.prepare(` + SELECT ${EXCHANGE_SELECT_COLUMNS}, + vec_distance_l2(vec.embedding, ?) AS distance + FROM vec_exchanges AS vec + JOIN exchanges AS e ON vec.id = e.id + WHERE 1 = 1 ${sidechainClause} ${filterClause} + ORDER BY (distance + e.is_sidechain * ?) ASC + `); + for (const row of stmt.iterate( + Buffer.from(new Float32Array(queryEmbedding).buffer), + ...filterParams, SIDECHAIN_DISTANCE_PENALTY + )) { + if (admitted(row)) results.push(row); + if (results.length === limit) break; + } } - } - if (mode === 'text' || mode === 'both') { - // Text search: AND of per-token LIKE patterns so multi-word queries match - // when every term appears somewhere in the exchange (any order, either field). - // See #127 — whole-query contiguous substring matching returned empty for - // typical multi-word searches that are not verbatim phrases. Sidechain rows - // are de-ranked (ordered after main-thread rows), not excluded (#128). - const { sql: textMatchSql, params: textMatchParams } = buildTextMatchClause(query); - const textStmt = db.prepare(` - SELECT - ${EXCHANGE_SELECT_COLUMNS}, - 0 as distance - FROM exchanges AS e - WHERE ${textMatchSql} - ${sidechainClause} - ${filterClause} - ORDER BY e.is_sidechain ASC, e.timestamp DESC - LIMIT ? - `); - - const textResults = textStmt.all(...textMatchParams, ...filterParams, limit); - - if (mode === 'both') { - // Merge and deduplicate by ID - const seenIds = new Set(results.map(r => r.id)); - for (const textResult of textResults) { - if (!seenIds.has((textResult as any).id)) { - results.push(textResult); + if (mode === 'text' || mode === 'both') { + // Text search: AND of per-token LIKE patterns so multi-word queries match + // when every term appears somewhere in the exchange (any order, either field). + // See #127 — whole-query contiguous substring matching returned empty for + // typical multi-word searches that are not verbatim phrases. Sidechain rows + // are de-ranked (ordered after main-thread rows), not excluded (#128). + const { sql: textMatchSql, params: textMatchParams } = buildTextMatchClause(query); + const textStmt = db.prepare(` + SELECT + ${EXCHANGE_SELECT_COLUMNS}, + 0 as distance + FROM exchanges AS e + WHERE ${textMatchSql} + ${sidechainClause} + ${filterClause} + ORDER BY e.is_sidechain ASC, e.timestamp DESC + `); + + const textResults: any[] = []; + for (const row of textStmt.iterate(...textMatchParams, ...filterParams)) { + if (admitted(row)) textResults.push(row); + if (textResults.length === limit) break; + } + + if (mode === 'both') { + // Merge and deduplicate by ID + const seenIds = new Set(results.map(r => r.id)); + for (const textResult of textResults) { + if (!seenIds.has((textResult as any).id)) { + results.push(textResult); + } } + } else { + results = textResults; } - } else { - results = textResults; } - } - db.close(); + } finally { db.close(); } - return results.map((row: any) => { + const output = results.map((row: any) => { const exchange = exchangeFromRow(row); // Try to load summary if available. Skip error sentinels (#96) so failed @@ -272,7 +269,7 @@ export async function searchConversations( if (fs.existsSync(summaryPath)) { const raw = fs.readFileSync(summaryPath, 'utf-8'); if (!isErroredSentinel(raw)) { - summary = raw.trim(); + summary = admission.summary(exchange, raw.trim()); } } @@ -287,6 +284,8 @@ export async function searchConversations( summary } as SearchResult & { summary?: string }; }); + admission.verify(); + return output; } // Helper function to count lines in a file efficiently diff --git a/src/show-cli.ts b/src/show-cli.ts index 397267e0..689e1aff 100644 --- a/src/show-cli.ts +++ b/src/show-cli.ts @@ -1,4 +1,4 @@ -import { readFileSync } from 'fs'; +import { readAdmittedConversation } from './record-admission.js'; import { formatConversationAsMarkdown, formatConversationAsHTML } from './show.js'; const args = process.argv.slice(2); @@ -46,7 +46,7 @@ if (!filePath) { } try { - const jsonl = readFileSync(filePath, 'utf-8'); + const jsonl = await readAdmittedConversation(filePath); if (format === 'html') { console.log(formatConversationAsHTML(jsonl)); diff --git a/src/show.ts b/src/show.ts index 06a34b45..acab547c 100644 --- a/src/show.ts +++ b/src/show.ts @@ -24,15 +24,16 @@ interface ConversationMessage { } export function formatConversationAsMarkdown(jsonl: string, startLine?: number, endLine?: number): string { - const allLines = jsonl.trim().split('\n').filter(line => line.trim()); + const allLines = jsonl.split('\n'); // Apply line range if specified (1-indexed, inclusive) - const lines = startLine !== undefined || endLine !== undefined + const selectedLines = startLine !== undefined || endLine !== undefined ? allLines.slice( startLine !== undefined ? startLine - 1 : 0, endLine !== undefined ? endLine : undefined ) : allLines; + const lines = selectedLines.filter(line => line.trim()); if (isCodexRollout(lines)) { return formatCodexConversationAsMarkdown(lines); diff --git a/src/summarizer.ts b/src/summarizer.ts index d7e3cc04..58f12c0d 100644 --- a/src/summarizer.ts +++ b/src/summarizer.ts @@ -1,4 +1,7 @@ import fs from 'fs'; +import os from 'node:os'; +import path from 'node:path'; +import { admitExchange, readRecordExclusions } from './record-admission.js'; import { ConversationExchange } from './types.js'; import { query } from '@anthropic-ai/claude-agent-sdk'; import { SUMMARIZER_CONTEXT_MARKER } from './constants.js'; @@ -121,10 +124,11 @@ export interface CodexSummarizerCommand { command: string; args: string[]; prompt: string; - sessionId: string; + sessionId?: string; model?: string; versionArgs?: string[]; skipVersionCheck?: boolean; + isolated?: boolean; } /** @@ -404,19 +408,34 @@ Bad: } export function buildCodexSummarizerCommand(args: { - sessionId: string; + sessionId?: string; prompt: string; model?: string; codexBin?: string; + isolated?: boolean; }): CodexSummarizerCommand { const command = args.codexBin || process.env.EPISODIC_MEMORY_CODEX_BIN || 'codex'; + if (args.isolated && args.sessionId) throw new Error('An isolated summary cannot resume a source session'); + const restrictions = args.isolated ? [ + ...['shell_tool', 'unified_exec', 'shell_snapshot', 'apps', 'plugins', 'remote_plugin', + 'hooks', 'multi_agent', 'multi_agent_v2', 'memories', 'goals', 'computer_use', + 'browser_use', 'browser_use_external', 'image_generation', 'workspace_dependencies', + 'skill_search', 'skill_mcp_dependency_install', 'tool_suggest', 'code_mode_host', + 'sleep_tool', 'view_image', 'default_mode_request_user_input'] + .map(feature => `features.${feature}=false`), + 'features.skip_host_skill_discovery=true', 'skills.bundled.enabled=false', + 'skills.include_instructions=false', 'project_doc_max_bytes=0', + 'tools.experimental_request_user_input.enabled=false', 'web_search="disabled"', + 'history.persistence="none"', + ].flatMap(value => ['-c', value]) : []; return { command, - args: ['app-server'], + args: ['app-server', ...restrictions], prompt: args.prompt, sessionId: args.sessionId, model: args.model, + ...(args.isolated ? { isolated: true } : {}), }; } @@ -484,6 +503,9 @@ async function assertSupportedCodexVersion(command: CodexSummarizerCommand): Pro const output = await readCommandOutput(command.command, command.versionArgs || ['--version']); const version = parseCodexCliVersion(output); + if (command.isolated && (!version || !versionMeetsMinimum(version, '0.154.0'))) { + throw new Error('Isolated record-policy summarization requires codex-cli >= 0.154.0'); + } if (!version || !versionMeetsMinimum(version)) { throw new Error(codexVersionRequirementMessage(output)); } @@ -506,11 +528,16 @@ function requireTurnId(result: any, method: string): string { } export async function runCodexCommand(command: CodexSummarizerCommand): Promise { + if (command.isolated && command.sessionId) throw new Error('An isolated summary cannot resume a source session'); await assertSupportedCodexVersion(command); + const summaryCwd = command.isolated + ? fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'episodic-memory-summary-'))) + : undefined; return new Promise((resolve, reject) => { const child = spawn(command.command, command.args, { env: getApiEnv(), + ...(summaryCwd ? { cwd: summaryCwd } : {}), stdio: ['pipe', 'pipe', 'pipe'] }); @@ -519,6 +546,7 @@ export async function runCodexCommand(command: CodexSummarizerCommand): Promise< let nextRequestId = 1; let targetTurnId: string | undefined; let finished = false; + let terminalOutcome: { error?: Error; result: string } | undefined; let timeout: NodeJS.Timeout | undefined; const pending = new Map(); const lines = createInterface({ input: child.stdout }); @@ -541,6 +569,12 @@ export async function runCodexCommand(command: CodexSummarizerCommand): Promise< if (finished) return; finished = true; cleanup(); + if (command.isolated) { + // Wait for process termination before removing its owned directory. + // Provider payloads may repeat input; never persist them in error sidecars. + terminalOutcome = { error: error ? new Error('Isolated Codex summary failed; provider details suppressed') : undefined, result }; + return; + } if (error) { reject(error); } else { @@ -622,6 +656,15 @@ export async function runCodexCommand(command: CodexSummarizerCommand): Promise< finish(new Error(detail)); } }); + child.on('close', () => { + if (!command.isolated) return; + try { + if (summaryCwd) fs.rmSync(summaryCwd, { recursive: true, force: true }); + if (terminalOutcome?.error) reject(terminalOutcome.error); + else if (terminalOutcome) resolve(terminalOutcome.result); + else reject(new Error('Isolated Codex summary ended without a terminal result')); + } catch { reject(new Error('Isolated Codex summary cleanup failed')); } + }); (async () => { try { @@ -637,15 +680,44 @@ export async function runCodexCommand(command: CodexSummarizerCommand): Promise< }); notify('initialized'); - const fork = await send('thread/fork', { - threadId: command.sessionId, + let isolation: Record = {}; + if (command.isolated) { + const configured = await send('config/read', { includeLayers: false }); + const servers = configured?.config?.mcp_servers; + if (!configured?.config || servers !== undefined && (!servers || typeof servers !== 'object' || Array.isArray(servers))) { + throw new Error('Cannot establish configured MCP boundary'); + } + const listed = await send('skills/list', { cwds: [summaryCwd], forceReload: true }); + if (!Array.isArray(listed?.data) || listed.data.some((entry: any) => !Array.isArray(entry.skills) || !Array.isArray(entry.errors) || entry.errors.length)) { + throw new Error('Cannot establish configured skill boundary'); + } + const skills = listed.data.flatMap((entry: any) => entry.skills).map((skill: any) => { + if (typeof skill.path !== 'string' || !path.isAbsolute(skill.path)) throw new Error('Invalid configured skill identity'); + return { path: skill.path, enabled: false }; + }); + isolation = { + cwd: summaryCwd, + dynamicTools: [], environments: [], selectedCapabilityRoots: [], + allowProviderModelFallback: false, + baseInstructions: 'Summarize only the admitted transcript. Do not use tools or recover external context.', + developerInstructions: 'Output only a concise factual summary inside .', + config: { + mcp_servers: Object.fromEntries(Object.keys(servers ?? {}).map(name => [name, { enabled: false }])), + 'skills.config': skills, + }, + }; + } + const method = command.sessionId ? 'thread/fork' : 'thread/start'; + const fork = await send(method, { + ...(command.sessionId ? { threadId: command.sessionId } : {}), ephemeral: true, excludeTurns: true, sandbox: 'read-only', approvalPolicy: 'never', ...(command.model ? { model: command.model } : {}), + ...isolation, }); - const forkThreadId = requireThreadId(fork, 'thread/fork'); + const forkThreadId = requireThreadId(fork, method); const turn = await send('turn/start', { threadId: forkThreadId, @@ -663,8 +735,8 @@ export async function runCodexCommand(command: CodexSummarizerCommand): Promise< }); } -async function callCodex(prompt: string, sessionId: string, model?: string): Promise { - const command = buildCodexSummarizerCommand({ sessionId, prompt, model }); +async function callCodex(prompt: string, sessionId?: string, model?: string, isolated = false): Promise { + const command = buildCodexSummarizerCommand({ sessionId, prompt, model, isolated }); return runCodexCommand(command); } @@ -703,6 +775,9 @@ export function getCodexModel(_exchanges: ConversationExchange[]): string | unde } export async function summarizeConversation(exchanges: ConversationExchange[], sessionId?: string): Promise { + const recordPolicy = readRecordExclusions(); + exchanges = exchanges.map(exchange => admitExchange(exchange, recordPolicy)).filter((exchange): exchange is ConversationExchange => exchange !== null); + if (recordPolicy) sessionId = undefined; // Handle trivial conversations if (exchanges.length === 0) { return 'Trivial conversation with no substantive content.'; @@ -718,9 +793,13 @@ export async function summarizeConversation(exchanges: ConversationExchange[], s const codexSessionId = getCodexSessionId(exchanges, sessionId); if (codexSessionId) { try { - const result = await callCodex(buildCodexSummaryPrompt(), codexSessionId, getCodexModel(exchanges)); + const prompt = recordPolicy + ? `${SUMMARIZER_CONTEXT_MARKER}. Summarize only the following admitted transcript in 2-4 factual sentences inside . Do not inspect files, use tools or recover any original session.\n\n${formatConversationText(exchanges)}` + : buildCodexSummaryPrompt(); + const result = await callCodex(prompt, recordPolicy ? undefined : codexSessionId, getCodexModel(exchanges), !!recordPolicy); return extractSummary(result); } catch (error) { + if (recordPolicy) throw error; // Keep the selected provider; never recover excluded source context. console.log(` Codex summarizer unavailable, falling back to transcript text: ${error instanceof Error ? error.message : String(error)}`); } } diff --git a/src/sync-cli.ts b/src/sync-cli.ts index 297b20f8..d9b1476b 100644 --- a/src/sync-cli.ts +++ b/src/sync-cli.ts @@ -224,7 +224,12 @@ async function syncAll() { totals.errors.push(...result.errors); } - console.log(`\n✅ Sync complete!`); + // Admission failure is a partial run, not successful synchronization. + // Finish migration before emitting a success claim as well. + if (totals.errors.length === 0) await runEmbeddingMigrationPhase(); + else process.exitCode = 1; + + console.log(totals.errors.length ? '\nSync finished with errors.' : '\n✅ Sync complete!'); console.log(` Copied: ${totals.copied}`); console.log(` Skipped: ${totals.skipped}`); console.log(` Indexed: ${totals.indexed}`); @@ -246,10 +251,6 @@ async function syncAll() { } } - // After regular sync, do a batch of embedding migration if any rows are - // still on the old encoder. Lock-protected; if another process is already - // migrating, this is a no-op. - await runEmbeddingMigrationPhase(); } const MIGRATION_BATCH_SIZE = parseInt(process.env.EPISODIC_MEMORY_MIGRATION_BATCH || '500', 10); @@ -270,6 +271,7 @@ async function runEmbeddingMigrationPhase(): Promise { } } catch (err) { console.error('episodic-memory: migration phase error:', err instanceof Error ? err.message : err); + throw err; } finally { db.close(); } diff --git a/src/sync.ts b/src/sync.ts index d9ee6810..f8ae0ad7 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -1,52 +1,12 @@ import fs from 'fs'; +import { archiveAdmittedConversation, readRecordExclusions } from './record-admission.js'; import path from 'path'; -import { StringDecoder } from 'string_decoder'; -import { SUMMARIZER_CONTEXT_MARKER } from './constants.js'; import { getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { formatErrorSentinel, shouldQueueForSummary } from './summary-sentinel.js'; import { getMaxMessageBytes, isOversizeExchange } from './message-size.js'; -const EXCLUSION_MARKERS = [ - 'DO NOT INDEX THIS CHAT', - 'Only use NO_INSIGHTS_FOUND', - SUMMARIZER_CONTEXT_MARKER, -]; - -const MARKER_SCAN_CHUNK_BYTES = 1 << 20; // 1 MiB - -/** - * Stream and scan for any exclusion marker, carrying an overlap between - * chunks so a marker split across a boundary is still found. A single - * fs.readFileSync(path, 'utf-8') throws ERR_STRING_TOO_LONG above Node's - * ~512 MB max string length; the old catch returned false (fail OPEN), - * silently indexing a file whose DO NOT INDEX marker we never read (#152). - * Streaming confirms cleanliness at any size, and a real read error now - * fails CLOSED (skip) rather than open. - */ -export function shouldSkipConversation(filePath: string): boolean { - const maxMarkerLen = Math.max(...EXCLUSION_MARKERS.map(m => m.length)); - let fd: number | undefined; - try { - fd = fs.openSync(filePath, 'r'); - const buf = Buffer.allocUnsafe(MARKER_SCAN_CHUNK_BYTES); - const decoder = new StringDecoder('utf8'); - let carry = ''; - let bytesRead: number; - while ((bytesRead = fs.readSync(fd, buf, 0, buf.length, null)) > 0) { - const window = carry + decoder.write(buf.subarray(0, bytesRead)); - if (EXCLUSION_MARKERS.some(marker => window.includes(marker))) { - return true; - } - carry = window.slice(Math.max(0, window.length - (maxMarkerLen - 1))); - } - const tail = carry + decoder.end(); - return EXCLUSION_MARKERS.some(marker => tail.includes(marker)); - } catch { - return true; // fail closed (#152) - } finally { - if (fd !== undefined) { try { fs.closeSync(fd); } catch {} } - } -} +export { shouldSkipConversation } from './record-admission.js'; +import { shouldSkipConversation } from './record-admission.js'; /** * True when a transcript contains at least one message line in any supported @@ -132,37 +92,6 @@ export function buildSyncOptionsFromEnv(env: NodeJS.ProcessEnv): SyncOptions { return { skipSummaries: env.EPISODIC_MEMORY_SKIP_SUMMARIES === '1' }; } -function copyIfNewer(src: string, dest: string): boolean { - // Ensure destination directory exists - const destDir = path.dirname(dest); - if (!fs.existsSync(destDir)) { - fs.mkdirSync(destDir, { recursive: true }); - } - - // Check if destination exists and is up-to-date - if (fs.existsSync(dest)) { - const srcStat = fs.statSync(src); - const destStat = fs.statSync(dest); - if (destStat.mtimeMs >= srcStat.mtimeMs) { - return false; // Dest is current, skip - } - } - - // Atomic copy: temp file + rename - const tempDest = dest + '.tmp.' + process.pid; - fs.copyFileSync(src, tempDest); - fs.renameSync(tempDest, dest); // Atomic on same filesystem - - // Preserve source mtime: harnesses without per-message timestamps (Cursor - // agent transcripts) fall back to file mtime. Round up to the next whole - // millisecond — utimes can't always represent the source's sub-millisecond - // precision, and a dest mtime even fractionally older would defeat the - // skip-if-current check above on every subsequent sync. - const srcStat = fs.statSync(src); - fs.utimesSync(dest, srcStat.atimeMs / 1000, Math.ceil(srcStat.mtimeMs) / 1000); - return true; -} - export function extractSessionIdFromPath(filePath: string): string | null { // Extract session ID from Claude filename or Codex rollout filename. const basename = path.basename(filePath, '.jsonl'); @@ -179,6 +108,7 @@ export async function syncConversations( destDir: string, options: SyncOptions = {} ): Promise { + const exclusions = readRecordExclusions(); const result: SyncResult = { copied: 0, skipped: 0, @@ -226,7 +156,7 @@ export async function syncConversations( continue; } - const wasCopied = copyIfNewer(srcFile, destFile); + const wasCopied = await archiveAdmittedConversation(srcFile, destFile, exclusions); if (wasCopied) { result.copied++; filesToIndex.push(destFile); diff --git a/src/verify.ts b/src/verify.ts index 0dd2c5db..2be8c1b7 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -4,6 +4,7 @@ import { parseConversation } from './parser.js'; import { initDatabase, getAllExchanges, getFileLastIndexed } from './db.js'; import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { isErroredSentinel } from './summary-sentinel.js'; +import { readRecordExclusions } from './record-admission.js'; export interface VerificationResult { missing: Array<{ path: string; reason: string }>; @@ -119,6 +120,7 @@ export async function verifyIndex(): Promise { } export async function repairIndex(issues: VerificationResult): Promise { + readRecordExclusions(); console.log('Repairing index...'); // To avoid circular dependencies, we import the indexer functions dynamically @@ -178,6 +180,8 @@ export async function repairIndex(issues: VerificationResult): Promise { console.log(` Indexed ${exchanges.length} exchanges`); } catch (error) { console.error(`Failed to re-index ${conversationPath}:`, error); + db.close(); + throw error; } } diff --git a/test/mcp-server.test.ts b/test/mcp-server.test.ts index 47382c96..c70b565c 100644 --- a/test/mcp-server.test.ts +++ b/test/mcp-server.test.ts @@ -1,7 +1,7 @@ import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'; -import { existsSync, mkdirSync, mkdtempSync, rmSync } from 'node:fs'; +import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync, readFileSync, unlinkSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -87,6 +87,47 @@ describe('MCP search tool', () => { } }); + it('enforces changed exclusions through the packaged MCP search entrypoint', async () => { + const { initDatabase, insertExchange } = await import('../src/db.js'); + const priorDb = process.env.EPISODIC_MEMORY_DB_PATH; + const priorTestDb = process.env.TEST_DB_PATH; + const priorConfig = process.env.EPISODIC_MEMORY_CONFIG_DIR; + const session = '00000000-1111-4222-8333-444444444444'; + const file = join(testDir!, `packaged-${session}.jsonl`); + const policy = join(testDir!, 'config', 'record-exclusions.json'); + mkdirSync(join(testDir!, 'config'), { recursive: true }); + const original = [ + { type: 'session_meta', payload: { id: session } }, + { type: 'response_item', payload: { type: 'message', role: 'user', content: [{ type: 'input_text', text: 'packaged-admission-probe' }] } }, + { type: 'response_item', payload: { type: 'message', role: 'assistant', content: [{ type: 'output_text', text: 'safe answer' }] } }, + ].map(row => JSON.stringify(row)).join('\n'); + writeFileSync(file, original); + try { + delete process.env.EPISODIC_MEMORY_DB_PATH; + process.env.TEST_DB_PATH = testDbPath; + process.env.EPISODIC_MEMORY_CONFIG_DIR = join(testDir!, 'config'); + const db = initDatabase(); + insertExchange(db, { id: 'packaged-admission', project: 'fixture', timestamp: '2026-01-01T00:00:00Z', + userMessage: 'packaged-admission-probe', assistantMessage: 'safe answer', archivePath: file, + lineStart: 2, lineEnd: 3, sessionId: session }, new Array(384).fill(0.1)); + db.close(); + const search = () => client.callTool({ name: 'search', arguments: { + query: 'packaged-admission-probe', mode: 'text', response_format: 'json', limit: 1, + } }); + expect(JSON.parse(getTextContent((await search()).content as ToolContent[])).count).toBe(1); + writeFileSync(policy, JSON.stringify({ version: 1, exchanges: [{ session_id: session, + transcript: `packaged-${session}.jsonl`, line_start: 2, line_end: 3 }], tool_calls: [] })); + const denied = await search(); expect(denied.isError).toBeFalsy(); + expect(JSON.parse(getTextContent(denied.content as ToolContent[])).count).toBe(0); + expect(readFileSync(file, 'utf8')).toBe(original); + } finally { + if (priorDb === undefined) delete process.env.EPISODIC_MEMORY_DB_PATH; else process.env.EPISODIC_MEMORY_DB_PATH = priorDb; + if (priorTestDb === undefined) delete process.env.TEST_DB_PATH; else process.env.TEST_DB_PATH = priorTestDb; + if (priorConfig === undefined) delete process.env.EPISODIC_MEMORY_CONFIG_DIR; else process.env.EPISODIC_MEMORY_CONFIG_DIR = priorConfig; + if (existsSync(policy)) unlinkSync(policy); + } + }); + it('advertises search and read tools with single and multi-concept queries', async () => { const tools = await client.listTools(); const searchTool = tools.tools.find((tool) => tool.name === 'search'); @@ -121,4 +162,34 @@ describe('MCP search tool', () => { }); expect(existsSync(testDbPath)).toBe(true); }); + + it('applies live record exclusions to direct reads and keeps physical range coordinates', async () => { + const session = '00000000-1111-4222-8333-444444444444'; + const file = join(testDir!, `rollout-${session}.jsonl`); + const config = join(testDir!, 'config', 'record-exclusions.json'); + mkdirSync(join(testDir!, 'config'), { recursive: true }); + const rows = [ + { type: 'session_meta', payload: { id: session } }, + ...['safe first', 'EXCLUDED_PUBLIC_FIXTURE', 'safe last'].map(text => ({ type: 'response_item', + payload: { type: 'message', role: 'user', content: [{ type: 'text', text }] } })), + ]; + const original = rows.map(row => JSON.stringify(row)).join('\n') + '\n'; + writeFileSync(file, original); + writeFileSync(config, JSON.stringify({ version: 1, + exchanges: [{ session_id: session, transcript: `rollout-${session}.jsonl`, line_start: 3, line_end: 3 }], tool_calls: [] })); + try { + const result = await client.callTool({ name: 'read', arguments: { path: file } }); + expect(result.isError).toBeFalsy(); + const text = getTextContent(result.content as ToolContent[]); + expect(text).not.toContain('EXCLUDED_PUBLIC_FIXTURE'); + expect(text).toContain('safe first'); + expect(text).toContain('safe last'); + const ranged = await client.callTool({ name: 'read', arguments: { path: file, startLine: 4, endLine: 4 } }); + expect(ranged.isError).toBeFalsy(); + const rangedText = getTextContent(ranged.content as ToolContent[]); + expect(rangedText).toContain('safe last'); + expect(rangedText).not.toContain('safe first'); + expect(readFileSync(file, 'utf8')).toBe(original); + } finally { unlinkSync(config); unlinkSync(file); } + }); }); diff --git a/test/record-admission.test.ts b/test/record-admission.test.ts new file mode 100644 index 00000000..3e560f82 --- /dev/null +++ b/test/record-admission.test.ts @@ -0,0 +1,421 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { syncConversations } from '../src/sync.js'; +import { parseConversation } from '../src/parser.js'; +import { initDatabase, insertExchange } from '../src/db.js'; +import { indexConversations, indexSession, indexUnprocessed } from '../src/indexer.js'; +import { summarizeConversation, runCodexCommand } from '../src/summarizer.js'; +import { query } from '@anthropic-ai/claude-agent-sdk'; +import { admittedConversationLines, archiveAdmittedConversation } from '../src/record-admission.js'; + +vi.mock('../src/embeddings.js', () => ({ + initEmbeddings: vi.fn(async () => {}), + generateExchangeEmbedding: vi.fn(async () => new Array(384).fill(0)), +})); +vi.mock('@anthropic-ai/claude-agent-sdk', () => ({ query: vi.fn() })); +import type { ConversationExchange } from '../src/types.js'; + +const SESSION = '00000000-1111-4222-8333-444444444444'; +const PRIVATE = 'public-fixture-excluded-content'; +let root: string; +let source: string; +let archive: string; +let config: string; +let sourceFile: string; +let archiveFile: string; +let previous: NodeJS.ProcessEnv; + +function message(role: string, text: string): object { + return { type: 'response_item', timestamp: '2026-01-01T00:00:00Z', + payload: { type: 'message', role, content: [{ type: 'text', text }] } }; +} + +function transcript(): string { + return [ + { type: 'session_meta', payload: { id: SESSION, cwd: '/synthetic/project' } }, + message('user', 'safe question one'), + message('assistant', 'safe answer one'), + message('user', PRIVATE), + message('assistant', PRIVATE), + message('user', 'safe question two'), + { type: 'response_item', payload: { type: 'function_call', call_id: 'call-denied', name: 'fixture', arguments: JSON.stringify({ value: PRIVATE }) } }, + { type: 'response_item', payload: { type: 'function_call_output', call_id: 'call-denied', output: PRIVATE } }, + message('assistant', 'safe answer two'), + ].map(value => JSON.stringify(value)).join('\n') + '\n'; +} + +function policy(value: object = { + version: 1, + exchanges: [{ session_id: SESSION, transcript: `rollout-${SESSION}.jsonl`, line_start: 4, line_end: 5 }], + tool_calls: [{ session_id: SESSION, transcript: `rollout-${SESSION}.jsonl`, call_id: 'call-denied' }], +}): void { + fs.mkdirSync(config, { recursive: true }); + fs.writeFileSync(path.join(config, 'record-exclusions.json'), JSON.stringify(value)); +} + +beforeEach(() => { + previous = { ...process.env }; + root = fs.mkdtempSync(path.join(os.tmpdir(), 'record-admission-')); + source = path.join(root, 'source'); + archive = path.join(root, 'archive'); + config = path.join(root, 'config'); + process.env.EPISODIC_MEMORY_CONFIG_DIR = config; + process.env.EPISODIC_MEMORY_DB_PATH = path.join(root, 'index.sqlite'); + delete process.env.CONVERSATION_SEARCH_EXCLUDE_PROJECTS; + process.env.TEST_PROJECTS_DIR = source; + process.env.TEST_ARCHIVE_DIR = archive; + fs.mkdirSync(path.join(source, '2026'), { recursive: true }); + sourceFile = path.join(source, '2026', `rollout-${SESSION}.jsonl`); + archiveFile = path.join(archive, '2026', `rollout-${SESSION}.jsonl`); + fs.writeFileSync(sourceFile, transcript()); +}); + +afterEach(() => { + process.env = previous; + fs.rmSync(root, { recursive: true, force: true }); + expect(fs.existsSync(root)).toBe(false); + vi.restoreAllMocks(); +}); + +describe('persistent record exclusion at native ingestion boundaries', () => { + it('does not apply one transcript range to a sibling that shares its session', async () => { + policy({ version: 1, exchanges: [{ session_id: SESSION, transcript: `rollout-${SESSION}.jsonl`, line_start: 4, line_end: 5 }], tool_calls: [] }); + const sibling = path.join(source, '2026', 'agent-sibling.jsonl'); + fs.writeFileSync(sibling, transcript()); + const result = await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + expect(result.errors).toEqual([]); + expect(fs.readFileSync(path.join(archive, '2026', 'agent-sibling.jsonl'), 'utf8')).toBe(transcript()); + const admitted = await parseConversation(archiveFile, '2026', archiveFile); + expect(admitted.map(x => x.userMessage)).toEqual(['safe question one', 'safe question two']); + }); + + it('keeps the first transcript identity when fork history contains ancestor headers', async () => { + policy({ version: 1, exchanges: [{ session_id: SESSION, transcript: `rollout-${SESSION}.jsonl`, line_start: 5, line_end: 6 }], tool_calls: [] }); + const rows = transcript().trimEnd().split('\n'); + rows.splice(1, 0, JSON.stringify({ type: 'session_meta', payload: { id: '00000000-aaaa-4bbb-8ccc-dddddddddddd' } })); + fs.writeFileSync(sourceFile, rows.join('\n') + '\n'); + const result = await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + expect(result.errors).toEqual([]); + const exchanges = await parseConversation(archiveFile, '2026', archiveFile); + expect(exchanges.map(x => x.userMessage)).toEqual(['safe question one', 'safe question two']); + expect(exchanges.every(x => x.sessionId === SESSION)).toBe(true); + }); + + it('retains safe Claude text in a block shared with an excluded native tool call', async () => { + policy({ version: 1, exchanges: [], tool_calls: [{ session_id: SESSION, transcript: `rollout-${SESSION}.jsonl`, call_id: 'toolu-denied' }] }); + const lines = [ + { type: 'user', sessionId: SESSION, message: { role: 'user', content: 'safe Claude question' } }, + { type: 'assistant', sessionId: SESSION, message: { role: 'assistant', content: [ + { type: 'text', text: 'safe Claude reply' }, + { type: 'tool_use', id: 'toolu-denied', name: 'fixture', input: { value: PRIVATE } }, + { type: 'tool_use', id: 'toolu-allowed', name: 'fixture', input: { value: 'safe input' } }, + ] } }, + ].map(JSON.stringify).join('\n') + '\n'; + fs.writeFileSync(sourceFile, lines); + await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + const copied = fs.readFileSync(archiveFile, 'utf8'); + expect(copied).not.toContain(PRIVATE); + expect(copied).toContain('safe Claude reply'); + expect(copied).toContain('toolu-allowed'); + const exchanges = await parseConversation(sourceFile, 'fixture', archiveFile); + expect(exchanges).toHaveLength(1); + expect(exchanges[0].toolCalls).toHaveLength(1); + expect(exchanges[0].assistantMessage).toBe('safe Claude reply'); + expect(fs.readFileSync(sourceFile, 'utf8')).toBe(lines); + }); + + it('filters only denied records before copying and preserves physical line coordinates', async () => { + policy(); + const before = fs.readFileSync(sourceFile); + const result = await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + expect(result.errors).toEqual([]); + expect(fs.readFileSync(sourceFile)).toEqual(before); + const copied = fs.readFileSync(archiveFile, 'utf8'); + expect(copied).not.toContain(PRIVATE); + expect(copied.split('\n')).toHaveLength(transcript().split('\n').length); + const exchanges = await parseConversation(archiveFile, '2026', archiveFile); + expect(exchanges.map(x => x.userMessage)).toEqual(['safe question one', 'safe question two']); + expect(exchanges.map(x => x.lineStart)).toEqual([2, 6]); + expect(exchanges.flatMap(x => x.toolCalls ?? [])).toEqual([]); + }); + + it('applies exclusions when directly parsing original input without rewriting it', async () => { + policy(); + const before = fs.readFileSync(sourceFile); + const exchanges = await parseConversation(sourceFile, '2026', archiveFile); + expect(exchanges.map(x => x.userMessage)).toEqual(['safe question one', 'safe question two']); + expect(JSON.stringify(exchanges)).not.toContain(PRIVATE); + expect(fs.readFileSync(sourceFile)).toEqual(before); + }); + + it('reapplies a changed policy even when source mtime did not advance', async () => { + await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + expect(fs.readFileSync(archiveFile, 'utf8')).toContain(PRIVATE); + policy(); + await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + expect(fs.readFileSync(archiveFile, 'utf8')).not.toContain(PRIVATE); + }); + + it('fails closed on malformed policy before any destination write', async () => { + policy({ version: 1, exchanges: [{ session_id: SESSION, transcript: `rollout-${SESSION}.jsonl`, line_start: '4', line_end: 5 }], tool_calls: [] }); + await expect(syncConversations(source, archive, { skipIndex: true, skipSummaries: true })).rejects.toThrow(/record.*exclusion/i); + expect(fs.existsSync(archiveFile)).toBe(false); + }); + + it('honors whole-conversation opt-out before any archive copy or parsing', async () => { + const marker = 'DO NOT INDEX THIS CHAT'; + fs.writeFileSync(sourceFile, transcript().replace('safe question one', marker)); + const original = fs.readFileSync(sourceFile); + await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + expect(fs.existsSync(archiveFile)).toBe(false); + expect(await parseConversation(sourceFile, '2026', archiveFile)).toEqual([]); + expect(fs.readFileSync(sourceFile)).toEqual(original); + }); + + it('rejects policy identity mismatch rather than silently selecting a different session', async () => { + policy(); + fs.writeFileSync(sourceFile, transcript().replace(`"id":"${SESSION}"`, '"id":"00000000-aaaa-4bbb-8ccc-dddddddddddd"')); + const result = await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + expect(result.errors).toHaveLength(1); + expect(fs.existsSync(archiveFile)).toBe(false); + }); + + it.each(['all', 'session', 'incremental'] as const)('does not report %s indexing success after an admission rejection', async mode => { + policy(); + fs.writeFileSync(sourceFile, transcript().replace(`"id":"${SESSION}"`, '"id":"00000000-aaaa-4bbb-8ccc-dddddddddddd"')); + const run = mode === 'all' ? indexConversations(undefined, undefined, 1, true) + : mode === 'session' ? indexSession(SESSION, 1, true) : indexUnprocessed(1, true); + await expect(run).rejects.toThrow(/session identity mismatch/); + expect(fs.existsSync(archiveFile)).toBe(false); + }); + + it('fails closed when the policy itself is a symlink', async () => { + policy(); + const file = path.join(config, 'record-exclusions.json'); + fs.renameSync(file, path.join(root, 'policy.json')); + fs.symlinkSync(path.join(root, 'policy.json'), file); + await expect(syncConversations(source, archive, { skipIndex: true, skipSummaries: true })).rejects.toThrow(/record.*exclusion/i); + expect(fs.existsSync(archiveFile)).toBe(false); + }); + + it('rejects original/archive hardlink aliasing without modifying either input', async () => { + policy(); + fs.mkdirSync(path.dirname(archiveFile), { recursive: true }); + fs.linkSync(sourceFile, archiveFile); + const before = fs.readFileSync(sourceFile); + const result = await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + expect(result.errors).toHaveLength(1); + expect(fs.readFileSync(sourceFile)).toEqual(before); + expect(fs.statSync(sourceFile).ino).toBe(fs.statSync(archiveFile).ino); + }); + + it('rejects a symlinked destination parent without creating an external archive', async () => { + policy(); + const outside = path.join(root, 'outside'); + fs.mkdirSync(outside); + fs.mkdirSync(archive); + fs.symlinkSync(outside, path.dirname(archiveFile)); + await expect(archiveAdmittedConversation(sourceFile, archiveFile)).rejects.toThrow(/archive parent.*symlink/i); + expect(fs.readdirSync(outside)).toEqual([]); + }); + + it('preserves nonmatching final newline bytes with an active empty policy', async () => { + policy({ version: 1, exchanges: [], tool_calls: [] }); + const bytes = transcript().replace(/\n$/, ''); + fs.writeFileSync(sourceFile, bytes); + await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + expect(fs.readFileSync(archiveFile, 'utf8')).toBe(bytes); + }); + + it('rejects source mutation during streaming without publishing a derived file', async () => { + policy(); + const original = fs.createReadStream; + let changed = false; + vi.spyOn(fs, 'createReadStream').mockImplementation(((file: any, options: any) => { + if (file === sourceFile && !changed) { + changed = true; + fs.appendFileSync(sourceFile, JSON.stringify(message('user', 'later public content')) + '\n'); + } + return original(file, options); + }) as typeof fs.createReadStream); + await expect(archiveAdmittedConversation(sourceFile, archiveFile)).rejects.toThrow(/changed during record admission/); + expect(fs.existsSync(archiveFile)).toBe(false); + expect(fs.readdirSync(path.dirname(archiveFile))).toEqual([]); + }); + + it('does not copy unscanned bytes when an opt-out is appended without a record policy', async () => { + const original = fs.createReadStream; + const copy = fs.copyFileSync; + let changed = false; + const change = () => { + if (!changed) { + changed = true; + fs.appendFileSync(sourceFile, JSON.stringify(message('user', 'DO NOT INDEX THIS CHAT')) + '\n'); + } + }; + vi.spyOn(fs, 'createReadStream').mockImplementation(((file: any, options: any) => { + if (file === sourceFile) change(); + return original(file, options); + }) as typeof fs.createReadStream); + vi.spyOn(fs, 'copyFileSync').mockImplementation(((src: any, dest: any, flags: any) => { + if (src === sourceFile) change(); + return copy(src, dest, flags); + }) as typeof fs.copyFileSync); + await expect(archiveAdmittedConversation(sourceFile, archiveFile)).rejects.toThrow(/changed during record admission/); + expect(fs.existsSync(archiveFile)).toBe(false); + }); + + it('rejects a policy change during a derived copy rather than publishing stale admission', async () => { + policy({ version: 1, exchanges: [], tool_calls: [] }); + const original = fs.createReadStream; + let changed = false; + vi.spyOn(fs, 'createReadStream').mockImplementation(((file: any, options: any) => { + if (file === sourceFile && !changed) { changed = true; policy(); } + return original(file, options); + }) as typeof fs.createReadStream); + await expect(archiveAdmittedConversation(sourceFile, archiveFile)).rejects.toThrow(/policy changed during record admission/); + expect(fs.existsSync(archiveFile)).toBe(false); + expect(fs.readdirSync(path.dirname(archiveFile))).toEqual([]); + }); + + it('rejects a parser input replaced between marker scan and stream consumption', async () => { + policy(); + const original = fs.createReadStream; + let changed = false; + vi.spyOn(fs, 'createReadStream').mockImplementation(((file: any, options: any) => { + if (file === sourceFile && !changed) { + changed = true; + fs.renameSync(sourceFile, sourceFile + '.previous'); + fs.writeFileSync(sourceFile, transcript()); + } + return original(file, options); + }) as typeof fs.createReadStream); + await expect((async () => { + for await (const _line of admittedConversationLines(sourceFile)) { /* Consume to the verification boundary. */ } + })()).rejects.toThrow(/changed during record admission/); + }); + + it('does not let project-exclusion environment override record policy', async () => { + policy(); + process.env.CONVERSATION_SEARCH_EXCLUDE_PROJECTS = 'unrelated-project'; + await syncConversations(source, archive, { skipIndex: true, skipSummaries: true }); + expect(fs.readFileSync(archiveFile, 'utf8')).not.toContain(PRIVATE); + }); + + it.each(['all', 'session', 'incremental'] as const)('filters before the %s index archive copy', async mode => { + policy(); + if (mode === 'all') await indexConversations(undefined, undefined, 1, true); + if (mode === 'session') await indexSession(SESSION, 1, true); + if (mode === 'incremental') await indexUnprocessed(1, true); + expect(fs.readFileSync(archiveFile, 'utf8')).not.toContain(PRIVATE); + const db = initDatabase(); + try { + expect(db.prepare('SELECT count(*) AS n FROM exchanges').get()).toEqual({ n: 2 }); + expect(db.prepare('SELECT count(*) AS n FROM tool_calls').get()).toEqual({ n: 0 }); + } finally { db.close(); } + }); + + it('starts an ephemeral Codex text-only context rather than forking hidden history', async () => { + const fake = ` + const readline = require('readline'); + const lines = readline.createInterface({ input: process.stdin }); + const emit = value => process.stdout.write(JSON.stringify(value) + '\\n'); + lines.on('line', line => { + const m = JSON.parse(line); + if (m.method === 'initialize') emit({ id: m.id, result: {} }); + if (m.method === 'thread/fork') process.exit(9); + if (m.method === 'thread/start') { + if (!m.params.ephemeral || m.params.threadId) process.exit(10); + emit({ id: m.id, result: { thread: { id: 'synthetic-ephemeral' } } }); + } + if (m.method === 'turn/start') { + emit({ id: m.id, result: { turn: { id: 'synthetic-turn' } } }); + emit({ method: 'item/completed', params: { item: { type: 'agentMessage', text: 'Safe text only.' } } }); + emit({ method: 'turn/completed', params: { turn: { id: 'synthetic-turn', status: 'completed' } } }); + } + }); + `; + expect(await runCodexCommand({ command: process.execPath, args: ['-e', fake], + prompt: 'Only synthetic admitted content.', skipVersionCheck: true })).toContain('Safe text only.'); + }); + + it('does not resume a source session when a native record policy is active', async () => { + policy(); + vi.mocked(query).mockReturnValue({ + async *[Symbol.asyncIterator]() { + yield { type: 'result', is_error: false, result: 'Safe summary.' }; + }, + } as any); + const exchange: ConversationExchange = { id: 'safe-summary', project: 'fixture', + timestamp: '2026-01-01T00:00:00Z', userMessage: 'Explain the selected project architecture and its acceptance boundaries.', + assistantMessage: 'This is an ordinary safe answer that must remain available for summarization without any original hidden session context.', + archivePath: archiveFile, lineStart: 2, lineEnd: 3, sessionId: SESSION, harness: 'claude' }; + expect(await summarizeConversation([exchange], SESSION)).toBe('Safe summary.'); + const request = vi.mocked(query).mock.calls.at(-1)![0]; + expect(request.options.resume).toBeUndefined(); + expect(request.prompt).toContain(exchange.userMessage); + expect(request.prompt).not.toContain(PRIVATE); + }); + + it('refuses direct database reinsertion after native deletion across reopen', () => { + policy(); + const exchange: ConversationExchange = { id: 'denied-body', project: 'fixture', + timestamp: '2026-01-01T00:00:00Z', userMessage: PRIVATE, assistantMessage: PRIVATE, + archivePath: archiveFile, lineStart: 4, lineEnd: 5, sessionId: SESSION, harness: 'codex' }; + for (let n = 0; n < 2; n++) { + const db = initDatabase(); + try { + insertExchange(db, exchange, new Array(384).fill(0)); + expect(db.prepare('SELECT count(*) AS n FROM exchanges').get()).toEqual({ n: 0 }); + expect(db.prepare('SELECT count(*) AS n FROM vec_exchanges').get()).toEqual({ n: 0 }); + } finally { db.close(); } + } + }); + + it('does not trust an inherited ancestor ID over the transcript identity at direct insertion', () => { + policy(); + const db = initDatabase(); + try { + const exchange: ConversationExchange = { id: 'ancestor-metadata', project: 'fixture', + timestamp: '2026-01-01T00:00:00Z', userMessage: PRIVATE, assistantMessage: PRIVATE, + archivePath: archiveFile, lineStart: 4, lineEnd: 5, + sessionId: '00000000-aaaa-4bbb-8ccc-dddddddddddd', harness: 'codex' }; + insertExchange(db, exchange, new Array(384).fill(0)); + expect(db.prepare('SELECT count(*) AS n FROM exchanges').get()).toEqual({ n: 0 }); + expect(db.prepare('SELECT count(*) AS n FROM vec_exchanges').get()).toEqual({ n: 0 }); + } finally { db.close(); } + }); + + it('filters denied native tool IDs even when direct callers retain ancestor metadata', () => { + policy(); + const db = initDatabase(); + try { + const exchange: ConversationExchange = { id: 'ancestor-safe-body', project: 'fixture', + timestamp: '2026-01-01T00:00:00Z', userMessage: 'safe question', assistantMessage: 'safe answer', + archivePath: archiveFile, lineStart: 6, lineEnd: 9, + sessionId: '00000000-aaaa-4bbb-8ccc-dddddddddddd', harness: 'codex', + toolCalls: [{ id: 'call-denied', exchangeId: 'ancestor-safe-body', toolName: 'fixture', + toolInput: { value: PRIVATE }, toolResult: PRIVATE, isError: false, timestamp: '2026-01-01T00:00:00Z' }] }; + insertExchange(db, exchange, new Array(384).fill(0)); + expect(db.prepare('SELECT count(*) AS n FROM exchanges').get()).toEqual({ n: 1 }); + expect(db.prepare('SELECT count(*) AS n FROM tool_calls').get()).toEqual({ n: 0 }); + } finally { db.close(); } + }); + + it('retains a safe body but removes denied tool calls at database insertion', () => { + policy(); + const db = initDatabase(); + try { + const exchange: ConversationExchange = { id: 'safe-body', project: 'fixture', + timestamp: '2026-01-01T00:00:00Z', userMessage: 'safe question', assistantMessage: 'safe answer', + archivePath: archiveFile, lineStart: 6, lineEnd: 9, sessionId: SESSION, harness: 'codex', + toolCalls: [{ id: 'call-denied', exchangeId: 'safe-body', toolName: 'fixture', toolInput: { value: PRIVATE }, toolResult: PRIVATE, isError: false, timestamp: '2026-01-01T00:00:00Z' }] }; + insertExchange(db, exchange, new Array(384).fill(0)); + expect(db.prepare('SELECT count(*) AS n FROM exchanges').get()).toEqual({ n: 1 }); + expect(db.prepare('SELECT count(*) AS n FROM tool_calls').get()).toEqual({ n: 0 }); + expect(exchange.toolCalls).toHaveLength(1); + } finally { db.close(); } + }); +}); diff --git a/test/record-screening.test.ts b/test/record-screening.test.ts new file mode 100644 index 00000000..fb74bedd --- /dev/null +++ b/test/record-screening.test.ts @@ -0,0 +1,270 @@ +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import crypto from 'node:crypto'; +import { + admitExchange, + archiveAdmittedConversation, + readAdmittedConversation, + readRecordExclusions, +} from '../src/record-admission.js'; +import { initDatabase, insertExchange } from '../src/db.js'; +import { searchConversations } from '../src/search.js'; +import type { ConversationExchange } from '../src/types.js'; + +const session = '00000000-1111-4222-8333-444444444444'; +// Deliberately public nonfunctional fixture, never a production credential. +const token = 'ghp_' + 'A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8'; +const scannerName = process.platform === 'win32' ? 'gitleaks.exe' : 'gitleaks'; +const realScannerPath = process.env.TEST_GITLEAKS_PATH || (process.env.PATH || '').split(path.delimiter) + .map(directory => path.join(directory, scannerName)).find(file => fs.existsSync(file)); +let scanner: string; +let digest: string; +let root: string; +let prior: NodeJS.ProcessEnv; +let source: string; +let destination: string; + +function policy(overrides: Record = {}): void { + fs.writeFileSync(path.join(root, 'record-exclusions.json'), JSON.stringify({ + version: 1, + exchanges: [], + tool_calls: [], + screening: { + engine: 'gitleaks', executable: scanner, sha256: digest, + timeout_ms: 10_000, max_record_bytes: 1_048_576, ...overrides, + }, + }), { mode: 0o600 }); +} + +function exchange(text = 'ordinary safe explanation'): ConversationExchange { + return { + id: 'fixture-exchange', project: 'fixture', timestamp: '2026-01-01T00:00:00Z', + userMessage: text, assistantMessage: 'safe answer', archivePath: source, + lineStart: 2, lineEnd: 3, sessionId: session, harness: 'codex', + }; +} + +function transcript(text: string): string { + return [ + { type: 'session_meta', payload: { id: session, cwd: '/synthetic' } }, + { type: 'response_item', payload: { type: 'message', role: 'user', + content: [{ type: 'input_text', text }] } }, + { type: 'response_item', payload: { type: 'message', role: 'assistant', + content: [{ type: 'output_text', text: 'safe answer' }] } }, + ].map(JSON.stringify).join('\n') + '\n'; +} + +// Contract probes are executable and digest-pinned without requiring Gitleaks +// on every CI host. A separate optional integration test exercises Gitleaks. +function scannerProbe(body: string): string { + const file = path.join(root, 'scanner-probe'); + fs.writeFileSync(file, `#!${process.execPath}\n${body}\n`, { mode: 0o700 }); + policy({ executable: fs.realpathSync(file), + sha256: crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex') }); + return file; +} + +beforeEach(() => { + prior = { ...process.env }; + root = fs.mkdtempSync(path.join(os.tmpdir(), 'record-screening-test-')); + process.env.EPISODIC_MEMORY_CONFIG_DIR = root; + process.env.EPISODIC_MEMORY_DB_PATH = path.join(root, 'test.sqlite'); + scanner = path.join(root, 'scanner-fixture'); + fs.writeFileSync(scanner, `#!${process.execPath} +const fs = require('node:fs'); +const input = fs.readFileSync(0, 'utf8'); +const found = input.includes('ghp_') || /api_key\\s*=\\s*\\S{20}/i.test(input) || + (input.includes('Sourcegraph') && /[a-f0-9]{40}/i.test(input)); +process.stdout.write(found ? '[{"RuleID":"fixture"}]' : '[]'); +process.exit(found ? 10 : 0); +`, { mode: 0o700 }); + scanner = fs.realpathSync(scanner); + digest = crypto.createHash('sha256').update(fs.readFileSync(scanner)).digest('hex'); + source = path.join(root, `rollout-${session}.jsonl`); + destination = path.join(root, 'archive', path.basename(source)); + fs.writeFileSync(source, transcript('safe question')); + policy(); +}); + +afterEach(() => { + process.env = prior; + fs.rmSync(root, { recursive: true, force: true }); + expect(fs.existsSync(root)).toBe(false); +}); + +describe('pinned record-local screening at native admission', () => { + it.skipIf(!realScannerPath)('rejects a synthetic token with the actual Gitleaks executable', () => { + const executable = fs.realpathSync(realScannerPath!); + policy({ executable, sha256: crypto.createHash('sha256').update(fs.readFileSync(executable)).digest('hex') }); + expect(() => admitExchange(exchange(token))).toThrow(/content rejected by screening/i); + }); + + it('screens retained search content and summaries against the current pinned scanner', async () => { + const db = initDatabase(); + insertExchange(db, exchange(), new Array(384).fill(0)); + db.prepare('UPDATE exchanges SET assistant_message = ?').run(token); + db.close(); + await expect(searchConversations('ordinary', { mode: 'text' })).rejects.toThrow(/content rejected by screening/i); + const repaired = initDatabase(); + repaired.prepare('UPDATE exchanges SET assistant_message = ?').run('safe answer'); + repaired.close(); + fs.writeFileSync(source.replace('.jsonl', '-summary.txt'), token); + await expect(searchConversations('ordinary', { mode: 'text' })).rejects.toThrow(/content rejected by screening/i); + fs.unlinkSync(source.replace('.jsonl', '-summary.txt')); + policy({ sha256: '0'.repeat(64) }); + await expect(searchConversations('ordinary', { mode: 'text' })).rejects.toThrow(/screening unavailable/i); + }); + + it('accepts an explicitly configured scanner without changing exclusion identity', () => { + expect(readRecordExclusions()).toMatchObject({ version: 1, screening: { engine: 'gitleaks' } }); + expect(admitExchange(exchange())).toEqual(exchange()); + }); + + it('rejects a new synthetic token at direct database ingress without inserting rows', () => { + const db = initDatabase(); + try { + expect(() => insertExchange(db, exchange(token), new Array(384).fill(0))) + .toThrow(/content rejected by screening/i); + expect(db.prepare('SELECT count(*) AS n FROM exchanges').get()).toEqual({ n: 0 }); + expect(db.prepare('SELECT count(*) AS n FROM vec_exchanges').get()).toEqual({ n: 0 }); + } finally { db.close(); } + }); + + it('preserves original and previous archive when new content fails screening', async () => { + const original = transcript(token); + fs.writeFileSync(source, original); + fs.mkdirSync(path.dirname(destination)); + fs.writeFileSync(destination, 'previous admitted bytes\n'); + await expect(archiveAdmittedConversation(source, destination)).rejects.toThrow(/content rejected by screening/i); + expect(fs.readFileSync(source, 'utf8')).toBe(original); + expect(fs.readFileSync(destination, 'utf8')).toBe('previous admitted bytes\n'); + expect(fs.readdirSync(path.dirname(destination))).toEqual([path.basename(destination)]); + }); + + it('does not expose newly detected content through native read', async () => { + fs.writeFileSync(source, transcript(token)); + await expect(readAdmittedConversation(source)).rejects.toThrow(/content rejected by screening/i); + }); + + it('screens decoded JSON strings rather than trusting escaped token spelling', async () => { + fs.writeFileSync(source, transcript(token).replace('ghp_', '\\u0067hp_')); + await expect(archiveAdmittedConversation(source, destination)).rejects.toThrow(/content rejected by screening/i); + expect(fs.existsSync(destination)).toBe(false); + }); + + it('keeps separate user and assistant records from contaminating keyword screening', () => { + const x = exchange('Sourcegraph'); + x.assistantMessage = ['01234567', '89abcdef', '01234567', '89abcdef', '01234567'].join(''); + expect(admitExchange(x)).toEqual(x); + }); + + it('rejects newly detected tool payloads without exposing their values in errors', () => { + const x = exchange(); + x.toolCalls = [{ id: 'tool', exchangeId: x.id, toolName: 'fixture', + toolInput: { value: token }, toolResult: 'safe result', timestamp: x.timestamp, isError: false }]; + let message = ''; + try { admitExchange(x); } catch (error) { message = String(error); } + expect(message).toMatch(/content rejected by screening/i); + expect(message).not.toContain(token); + }); + + it('applies exact known exclusions before scanning so safe neighboring records survive', async () => { + const file = path.join(root, 'record-exclusions.json'); + const configured = JSON.parse(fs.readFileSync(file, 'utf8')); + configured.exchanges = [{ session_id: session, transcript: path.basename(source), line_start: 2, line_end: 2 }]; + fs.writeFileSync(file, JSON.stringify(configured)); + fs.writeFileSync(source, transcript(token)); + expect(await archiveAdmittedConversation(source, destination)).toBe(true); + const actual = fs.readFileSync(destination, 'utf8'); + expect(actual).not.toContain(token); + expect(actual.split('\n')[1]).toBe(''); + expect(actual).toContain('safe answer'); + }); + + it('fails closed when the scanner is unavailable or has the wrong digest', () => { + policy({ executable: path.join(root, 'missing') }); + expect(() => admitExchange(exchange())).toThrow(/screening unavailable/i); + policy({ sha256: '0'.repeat(64) }); + expect(() => admitExchange(exchange())).toThrow(/screening unavailable/i); + }); + + it('rejects oversized input before execution and never logs it', () => { + policy({ max_record_bytes: 32 }); + expect(() => admitExchange(exchange('x'.repeat(33)))).toThrow(/screening byte limit/i); + }); + + it('cannot disable configured screening through ambient scanner config or allow comments', () => { + process.env.GITLEAKS_CONFIG = '/nonexistent/ambient.toml'; + expect(() => admitExchange(exchange(token + ' # gitleaks:allow'))) + .toThrow(/content rejected by screening/i); + }); + + it('retains byte-identical safe archives and idempotent retry behavior', async () => { + const raw = fs.readFileSync(source); + expect(await archiveAdmittedConversation(source, destination)).toBe(true); + expect(fs.readFileSync(destination)).toEqual(raw); + expect(await archiveAdmittedConversation(source, destination)).toBe(false); + expect(fs.readFileSync(source)).toEqual(raw); + }); + + it('retains key/value assignment syntax required by generic credential rules', () => { + const text = JSON.stringify({ api_key: ['rP8v2Ls7', 'Qm4Zx9Nc', '6Tb3Wy5H', 'd1Kf0Aj8'].join('') }); + expect(() => admitExchange(exchange(text))).toThrow(/content rejected by screening/i); + }); + + it('does not bypass screening when session identity is absent', () => { + const x = exchange(token); + delete x.sessionId; + x.archivePath = path.join(root, 'anonymous.jsonl'); + expect(() => admitExchange(x)).toThrow(/content rejected by screening/i); + }); + + it.each([ + ['empty report', '', 0], + ['malformed report', '{', 0], + ['non-array report', '{}', 0], + ['contradictory clean exit', '[{"RuleID":"fixture"}]', 0], + ['empty detection', '[]', 10], + ['invalid detection', '[{}]', 10], + ['scanner failure', '[]', 2], + ])('rejects %s without exposing subprocess output', (_name, stdout, status) => { + scannerProbe(`process.stderr.write('private-probe-diagnostic'); + process.stdout.write(${JSON.stringify(stdout)}); process.exit(${status});`); + let message = ''; + try { admitExchange(exchange()); } catch (error) { message = String(error); } + expect(message).toMatch(/screening unavailable/i); + expect(message).not.toContain('private-probe-diagnostic'); + }); + + it('terminates a hung scanner within its bounded timeout', () => { + scannerProbe('setInterval(() => {}, 1000);'); + const file = path.join(root, 'record-exclusions.json'); + const configured = JSON.parse(fs.readFileSync(file, 'utf8')); + configured.screening.timeout_ms = 100; + fs.writeFileSync(file, JSON.stringify(configured)); + const start = performance.now(); + expect(() => admitExchange(exchange())).toThrow(/screening unavailable/i); + expect(performance.now() - start).toBeLessThan(3000); + }); + + it('rejects non-executable and symlink scanner identities', () => { + const file = scannerProbe("process.stdout.write('[]');"); + fs.chmodSync(file, 0o600); + expect(() => admitExchange(exchange())).toThrow(/screening unavailable/i); + fs.chmodSync(file, 0o700); + const alias = path.join(root, 'scanner-link'); + fs.symlinkSync(file, alias); + const configured = JSON.parse(fs.readFileSync(path.join(root, 'record-exclusions.json'), 'utf8')); + policy({ ...configured.screening, executable: alias }); + expect(() => admitExchange(exchange())).toThrow(/screening unavailable/i); + }); + + it('rejects scanner mutation during execution and cleans private work directories', () => { + const before = fs.readdirSync(os.tmpdir()).filter(name => name.startsWith('episodic-screen-')).sort(); + scannerProbe("require('node:fs').appendFileSync(__filename, '\\n// changed'); process.stdout.write('[]');"); + expect(() => admitExchange(exchange())).toThrow(/screening unavailable/i); + expect(fs.readdirSync(os.tmpdir()).filter(name => name.startsWith('episodic-screen-')).sort()).toEqual(before); + }); +}); diff --git a/test/search-admission.test.ts b/test/search-admission.test.ts new file mode 100644 index 00000000..a53b47b9 --- /dev/null +++ b/test/search-admission.test.ts @@ -0,0 +1,185 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { initDatabase, insertExchange } from '../src/db.js'; +import { searchConversations } from '../src/search.js'; +import { readAdmittedConversation, shouldSkipConversation } from '../src/record-admission.js'; + +vi.mock('../src/embeddings.js', () => ({ + initEmbeddings: vi.fn(async () => {}), + generateQueryEmbedding: vi.fn(async () => new Array(384).fill(0.1)), +})); +const marker = 'DO NOT INDEX THIS CHAT'; +const session = '00000000-1111-4222-8333-444444444444'; +const message = (role: string, text: string) => ({ type: 'response_item', payload: { + type: 'message', role, content: [{ type: 'input_text', text }], +} }); +let root: string; +let previous: NodeJS.ProcessEnv; +beforeEach(() => { + previous = { ...process.env }; + root = fs.mkdtempSync(path.join(os.tmpdir(), 'em-search-admission-')); + process.env.EPISODIC_MEMORY_CONFIG_DIR = root; + process.env.TEST_DB_PATH = path.join(root, 'test.db'); + delete process.env.EPISODIC_MEMORY_DB_PATH; +}); +afterEach(() => { vi.restoreAllMocks(); process.env = previous; fs.rmSync(root, { recursive: true, force: true }); }); +function seed(id: string, timestamp = '2026-01-01T00:00:00Z') { + const file = path.join(root, `${id}-${session}.jsonl`); + fs.writeFileSync(file, [ + { type: 'session_meta', payload: { id: session } }, + message('user', `needle ${id}`), message('assistant', 'safe answer'), + ].map(x => JSON.stringify(x)).join('\n') + '\n'); + const db = initDatabase(); + insertExchange(db, { id, project: 'fixture', timestamp, archivePath: file, + lineStart: 2, lineEnd: 3, userMessage: `needle ${id}`, assistantMessage: 'safe answer', sessionId: session, + }, new Array(384).fill(0.1)); + db.close(); return file; +} +function exclude(file: string, start = 2, end = 3) { + fs.writeFileSync(path.join(root, 'record-exclusions.json'), JSON.stringify({ version: 1, + exchanges: [{ session_id: session, transcript: path.basename(file), line_start: start, line_end: end }], tool_calls: [], + })); +} + +describe('decoded user instruction markers', () => { + it('retains physical line coordinates while loading only a requested range', async () => { + const file = path.join(root, 'range.jsonl'); + fs.writeFileSync(file, [message('user', 'outside'), message('assistant', 'selected \u2028 text'), message('user', 'outside after')].map(x => JSON.stringify(x)).join('\r\n')); + const result = await readAdmittedConversation(file, 2, 2); + expect(result.split('\n')).toHaveLength(3); + expect(result.split('\n')[0]).toBe(''); + expect(result.split('\n')[1]).toContain('selected'); + expect(result).not.toContain('outside'); + fs.appendFileSync(file, '\n' + JSON.stringify(message('user', marker))); + expect(await readAdmittedConversation(file, 2, 2)).toBe(''); + }); + + it.each([ + ['assistant quote', message('assistant', marker)], + ['tool output', { type: 'response_item', payload: { type: 'function_call_output', output: marker } }], + ['Claude tool result', { type: 'user', message: { role: 'user', content: [{ type: 'tool_result', content: marker }] } }], + ])('does not opt out for %s', async (_, record) => { + const file = path.join(root, 'quoted.jsonl'); + const bytes = JSON.stringify(record) + '\n'; fs.writeFileSync(file, bytes); + expect(shouldSkipConversation(file)).toBe(false); + expect(await readAdmittedConversation(file)).toContain(marker); + expect(fs.readFileSync(file, 'utf8')).toBe(bytes); + }); + it.each([ + ['Codex response', message('user', marker)], + ['Codex event', { type: 'event_msg', payload: { type: 'user_message', message: marker } }], + ['Claude', { type: 'user', message: { role: 'user', content: marker } }], + ['Cursor', { role: 'user', message: { content: marker } }], + ['OMP', { type: 'message', message: { role: 'user', content: [{ type: 'text', text: marker }] } }], + ['opencode', { type: 'opencode_message', message: { role: 'user' }, parts: [{ type: 'text', text: marker }] }], + ])('honors JSON-escaped opt out in %s', async (_, record) => { + const file = path.join(root, 'escaped.jsonl'); + fs.writeFileSync(file, JSON.stringify(record).replaceAll('<', '\\u003c')); + expect(shouldSkipConversation(file)).toBe(true); + expect(await readAdmittedConversation(file)).toBe(''); + }); +}); + +describe('retained search admission', () => { + it('finds an admitted vector beyond the native KNN candidate ceiling', async () => { + const file = seed('denied'); seed('safe'); + const db = initDatabase(); + db.transaction(() => { + for (let i = 0; i < 4096; i++) { + insertExchange(db, { id: `denied-${i}`, project: 'fixture', timestamp: '2026-01-01T00:00:00Z', + archivePath: file, lineStart: 2, lineEnd: 3, userMessage: 'needle denied', assistantMessage: 'safe', sessionId: session, + }, new Array(384).fill(0.1)); + } + db.prepare('UPDATE vec_exchanges SET embedding = ? WHERE id = ?') + .run(Buffer.from(new Float32Array(new Array(384).fill(0.2)).buffer), 'safe'); + })(); + db.close(); exclude(file); + expect((await searchConversations('needle', { mode: 'vector', limit: 1 })).map(x => x.exchange.id)).toEqual(['safe']); + }); + + it('never follows a substituted transcript symlink', async () => { + const file = seed('safe'); + fs.renameSync(file, file + '.original'); + fs.symlinkSync(file + '.original', file); + await expect(searchConversations('needle', { mode: 'text' })).rejects.toThrow(/changed during record admission/); + }); + it('keeps an indexed exchange searchable while its transcript grows during admission', async () => { + const file = seed('safe'); + const original = fs.readSync; + let appended = false; + vi.spyOn(fs, 'readSync').mockImplementation(((...args: Parameters) => { + const count = original(...args); + if (!appended && count > 0) { + appended = true; + fs.appendFileSync(file, JSON.stringify({ type: 'event_msg', payload: { type: 'agent_message', message: 'later' } }) + '\n'); + } + return count; + }) as typeof fs.readSync); + + const results = await searchConversations('needle', { mode: 'text', before: '2026-09-14' }); + expect(appended).toBe(true); + expect(results.map(result => result.exchange.id)).toEqual(['safe']); + }); + it('rejects an indexed-range rewrite even when the transcript also grows', async () => { + const file = seed('safe'); + const summary = file.replace('.jsonl', '-summary.txt'); + fs.writeFileSync(summary, 'summary'); + const offset = fs.readFileSync(file).indexOf('needle safe'); + expect(offset).toBeGreaterThanOrEqual(0); + const original = fs.readFileSync; + let changed = false; + vi.spyOn(fs, 'readFileSync').mockImplementation(((p: any, ...args: any[]) => { + if (p === summary && !changed) { + changed = true; + fs.appendFileSync(file, JSON.stringify({ type: 'event_msg', payload: { type: 'agent_message', message: 'later' } }) + '\n'); + const fd = fs.openSync(file, 'r+'); + try { fs.writeSync(fd, Buffer.from('secret safe'), 0, 11, offset); } + finally { fs.closeSync(fd); } + } + return (original as any)(p, ...args); + }) as typeof fs.readFileSync); + + await expect(searchConversations('needle', { mode: 'text' })).rejects.toThrow(/changed during record admission/); + expect(changed).toBe(true); + }); + it('rejects policy changes while building results', async () => { + const file = seed('safe'); + const summary = file.replace('.jsonl', '-summary.txt'); fs.writeFileSync(summary, 'summary'); + const original = fs.readFileSync; + vi.spyOn(fs, 'readFileSync').mockImplementation(((p: any, ...args: any[]) => { + if (p === summary) exclude(file); + return (original as any)(p, ...args); + }) as typeof fs.readFileSync); + await expect(searchConversations('needle', { mode: 'text' })).rejects.toThrow(/policy changed/); + }); + + it.each(['text', 'vector', 'both'] as const)('applies current exclusions before limit in %s mode', async mode => { + seed('safe'); const denied = seed('denied', '2026-02-01T00:00:00Z'); + exclude(denied); + const results = await searchConversations('needle', { mode, limit: 1 }); + expect(results.map(x => x.exchange.id)).toEqual(['safe']); + expect(await readAdmittedConversation(denied)).not.toContain('needle denied'); + }); + it('rechecks opt-out appended after indexing, but not quoted tool output', async () => { + const file = seed('later'); + fs.appendFileSync(file, JSON.stringify({ type: 'response_item', payload: { type: 'function_call_output', output: marker } }) + '\n'); + expect(await searchConversations('needle', { mode: 'text' })).toHaveLength(1); + fs.appendFileSync(file, JSON.stringify(message('user', marker)).replaceAll('<', '\\u003c') + '\n'); + expect(await searchConversations('needle', { mode: 'text' })).toEqual([]); + }); + it('omits a stale whole-conversation summary when any source record is excluded', async () => { + const file = seed('safe'); + fs.appendFileSync(file, JSON.stringify(message('user', 'excluded summary phrase')) + '\n'); + fs.writeFileSync(file.replace('.jsonl', '-summary.txt'), 'excluded summary phrase'); + exclude(file, 4, 4); + const results = await searchConversations('needle', { mode: 'text' }); + expect(results).toHaveLength(1); + expect(JSON.stringify(results)).not.toContain('excluded summary phrase'); + }); + it('fails closed on invalid exclusion policy', async () => { + seed('safe'); fs.writeFileSync(path.join(root, 'record-exclusions.json'), '{invalid'); + await expect(searchConversations('needle', { mode: 'text' })).rejects.toThrow(/exclusion policy/i); + }); +}); diff --git a/test/setup-isolated-config.ts b/test/setup-isolated-config.ts index 71b3e795..2b298c07 100644 --- a/test/setup-isolated-config.ts +++ b/test/setup-isolated-config.ts @@ -13,6 +13,7 @@ const isolatedRoot = mkdtempSync(join(tmpdir(), 'episodic-memory-vitest-')); process.env.EPISODIC_MEMORY_CONFIG_DIR = join(isolatedRoot, 'superpowers'); process.env.CLAUDE_CONFIG_DIR = join(isolatedRoot, 'claude'); process.env.CODEX_HOME = join(isolatedRoot, 'codex'); +process.env.OMP_HOME = join(isolatedRoot, 'omp'); // Clear any ambient summarizer-billing signals so tests get deterministic // cost-guard (#104) and timeout (#160) behavior regardless of the developer's diff --git a/test/summarizer-options.test.ts b/test/summarizer-options.test.ts index 1267b880..b7260a0e 100644 --- a/test/summarizer-options.test.ts +++ b/test/summarizer-options.test.ts @@ -110,6 +110,22 @@ describe('isResumeFailure', () => { }); describe('buildCodexSummarizerCommand', () => { + it('disables host capabilities before an isolated summary server can load them', () => { + const command = buildCodexSummarizerCommand({ prompt: 'Admitted text.', isolated: true }); + expect(command.isolated).toBe(true); + for (const option of ['features.shell_tool=false', 'features.plugins=false', 'features.hooks=false', + 'features.apps=false', 'features.code_mode_host=false', 'features.skip_host_skill_discovery=true', + 'skills.bundled.enabled=false', 'skills.include_instructions=false', 'project_doc_max_bytes=0', + 'tools.experimental_request_user_input.enabled=false', 'web_search="disabled"']) { + expect(command.args).toContain(option); + } + }); + + it('refuses to combine isolated admitted text with an original session identity', () => { + expect(() => buildCodexSummarizerCommand({ prompt: 'Admitted text.', isolated: true, sessionId: 'original' })) + .toThrow(/isolated.*session/i); + }); + it('starts the Codex app-server so the summarizer can fork ephemerally', () => { const command = buildCodexSummarizerCommand({ sessionId: '019e4c75-d5bf-7c71-9df7-77f5fb86b711', @@ -129,6 +145,55 @@ describe('buildCodexSummarizerCommand', () => { }); describe('runCodexCommand', () => { + it('disables inherited MCP and skill entries per subject and removes its temporary cwd', async () => { + const fake = ` + const fs = require('fs'); + const readline = require('readline'); + const emit = value => console.log(JSON.stringify(value)); + readline.createInterface({ input: process.stdin }).on('line', line => { + const m = JSON.parse(line); + if (m.method === 'initialize') emit({ id: m.id, result: {} }); + if (m.method === 'config/read') emit({ id: m.id, result: { config: { mcp_servers: { inherited: { command: 'false', enabled: true } } } } }); + if (m.method === 'skills/list') emit({ id: m.id, result: { data: [{ skills: [{ path: '/public-fixture/SKILL.md', enabled: true }], errors: [] }] } }); + if (m.method === 'thread/fork') process.exit(8); + if (m.method === 'thread/start') { + const p = m.params; + if (p.config?.mcp_servers?.inherited?.enabled !== false) process.exit(9); + if (p.config?.['skills.config']?.[0]?.enabled !== false) process.exit(10); + if ([p.dynamicTools, p.environments, p.selectedCapabilityRoots].some(x => !Array.isArray(x) || x.length)) process.exit(11); + if (p.cwd !== process.cwd() || !fs.existsSync(p.cwd)) process.exit(12); + if (!p.ephemeral || p.allowProviderModelFallback !== false) process.exit(13); + emit({ id: m.id, result: { thread: { id: 'isolated' } } }); + } + if (m.method === 'turn/start') { + emit({ id: m.id, result: { turn: { id: 'turn' } } }); + emit({ method: 'item/completed', params: { item: { type: 'agentMessage', text: process.cwd() } } }); + emit({ method: 'turn/completed', params: { turn: { id: 'turn', status: 'completed' } } }); + } + }); + `; + const result = await runCodexCommand({ command: process.execPath, args: ['-e', fake], + prompt: 'Admitted public fixture.', isolated: true, skipVersionCheck: true }); + expect(result).toMatch(/episodic-memory-summary-/); + const { existsSync } = await import('fs'); + expect(existsSync(result)).toBe(false); + }); + + it('does not echo a provider error payload from an isolated summary', async () => { + const fake = ` + const readline = require('readline'); + readline.createInterface({ input: process.stdin }).on('line', line => { + const m = JSON.parse(line); + console.log(JSON.stringify(m.method === 'initialize' + ? { id: m.id, result: {} } + : { id: m.id, error: { message: 'EXCLUDED_PUBLIC_FIXTURE' } })); + }); + `; + await expect(runCodexCommand({ command: process.execPath, args: ['-e', fake], + prompt: 'Admitted text.', isolated: true, skipVersionCheck: true })) + .rejects.toThrow(/^Isolated Codex summary failed; provider details suppressed$/); + }); + it('forks the session ephemerally and returns the completed agent message', async () => { const fakeAppServer = ` const readline = require('readline'); diff --git a/test/sync-cli-single-instance.test.ts b/test/sync-cli-single-instance.test.ts index b1505559..c43e8421 100644 --- a/test/sync-cli-single-instance.test.ts +++ b/test/sync-cli-single-instance.test.ts @@ -103,6 +103,24 @@ describe('sync-cli single-instance lock (#97)', () => { expect(result.stdout).toMatch(/Sync complete/); }); + it('exits nonzero without a success claim when record admission rejects a source', () => { + const session = '00000000-0000-0000-0000-000000000002'; + const transcript = `rollout-${session}.jsonl`; + writeFileSync(join(testDir, 'projects', 'project-a', transcript), [ + { type: 'session_meta', payload: { id: '00000000-aaaa-4bbb-8ccc-dddddddddddd' } }, + { type: 'response_item', payload: { type: 'message', role: 'user', content: [{ type: 'text', text: 'public fixture' }] } }, + ].map(row => JSON.stringify(row)).join('\n') + '\n'); + writeFileSync(join(testDir, 'config', 'record-exclusions.json'), JSON.stringify({ + version: 1, exchanges: [{ session_id: session, transcript, line_start: 2, line_end: 2 }], tool_calls: [], + })); + const result = runWith({ ...envOverrides, EPISODIC_MEMORY_SKIP_SUMMARIES: '1' }); + expect(result.stdout + result.stderr).toMatch(/session identity mismatch/); + expect(result.status).toBe(1); + expect(result.stdout).not.toMatch(/Sync complete/); + expect(existsSync(join(testDir, 'archive', 'project-a', transcript))).toBe(false); + expect(existsSync(join(testDir, 'config', 'logs', 'episodic-memory-sync.lock'))).toBe(false); + }); + it('releases the lock on normal exit — a subsequent run is not skipped', () => { const first = runWith(envOverrides); expect(first.status).toBe(0); diff --git a/test/sync.test.ts b/test/sync.test.ts index f35f9a00..551fd7b9 100644 --- a/test/sync.test.ts +++ b/test/sync.test.ts @@ -240,10 +240,12 @@ describe('sync command', () => { // Sync with indexing enabled const result = await syncConversations(sourceDir, destDir); - // Both files should be copied - expect(result.copied).toBe(2); + // Whole-conversation opt-out now rejects copying as well as indexing. + expect(result.copied).toBe(1); + expect(existsSync(join(destDir, 'project-a', 'marked.jsonl'))).toBe(false); + expect(existsSync(join(destDir, 'project-a', 'normal.jsonl'))).toBe(true); - // But only normal conversation should be indexed + // Only the normal conversation should be indexed expect(result.indexed).toBe(1); // Verify in database diff --git a/test/verify.test.ts b/test/verify.test.ts index ae70da81..53348e78 100644 --- a/test/verify.test.ts +++ b/test/verify.test.ts @@ -281,6 +281,13 @@ describe('repairIndex', () => { dbAfter.close(); }); + it('rejects a failed repair instead of reporting completion', async () => { + const input = path.join(archiveDir, 'not-a-transcript'); + fs.mkdirSync(input, { recursive: true }); + await expect(repairIndex({ missing: [{ path: input, reason: 'synthetic invalid source' }], + outdated: [], orphaned: [], corrupted: [] })).rejects.toThrow(/regular non-symlink file/); + }); + it('re-indexes outdated files during repair', { timeout: 30000 }, async () => { // Create conversation file with summary const projectArchive = path.join(archiveDir, 'test-project'); From cf210033b1cd2417a9a4e05b208c4b54838f02cd Mon Sep 17 00:00:00 2001 From: HengYang Date: Sat, 26 Sep 2026 13:45:33 +0800 Subject: [PATCH 04/33] fix(search): rank admitted vectors by computed distance --- dist/mcp-server.js | 8 ++++---- dist/search.js | 8 ++++---- src/search.ts | 8 ++++---- test/search-admission.test.ts | 25 +++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/dist/mcp-server.js b/dist/mcp-server.js index d0c94d05..a6862460 100644 --- a/dist/mcp-server.js +++ b/dist/mcp-server.js @@ -35876,11 +35876,11 @@ async function searchConversations(query, options = {}) { const queryEmbedding = await generateQueryEmbedding(query); const stmt = db.prepare(` SELECT ${EXCHANGE_SELECT_COLUMNS}, - vec_distance_l2(vec.embedding, ?) AS distance + vec_distance_l2(vec.embedding, ?) AS retrieval_distance FROM vec_exchanges AS vec JOIN exchanges AS e ON vec.id = e.id WHERE 1 = 1 ${sidechainClause} ${filterClause} - ORDER BY (distance + e.is_sidechain * ?) ASC + ORDER BY (retrieval_distance + e.is_sidechain * ?) ASC `); for (const row of stmt.iterate( Buffer.from(new Float32Array(queryEmbedding).buffer), @@ -35896,7 +35896,7 @@ async function searchConversations(query, options = {}) { const textStmt = db.prepare(` SELECT ${EXCHANGE_SELECT_COLUMNS}, - 0 as distance + 0 as retrieval_distance FROM exchanges AS e WHERE ${textMatchSql} ${sidechainClause} @@ -35936,7 +35936,7 @@ async function searchConversations(query, options = {}) { const snippet = snippetText + (exchange.userMessage.length > 200 ? "..." : ""); return { exchange, - similarity: mode === "text" ? void 0 : l2DistanceToCosineSimilarity(row.distance), + similarity: mode === "text" ? void 0 : l2DistanceToCosineSimilarity(row.retrieval_distance), snippet, summary }; diff --git a/dist/search.js b/dist/search.js index 0c5f4978..ae5497de 100644 --- a/dist/search.js +++ b/dist/search.js @@ -174,11 +174,11 @@ export async function searchConversations(query, options = {}) { const queryEmbedding = await generateQueryEmbedding(query); const stmt = db.prepare(` SELECT ${EXCHANGE_SELECT_COLUMNS}, - vec_distance_l2(vec.embedding, ?) AS distance + vec_distance_l2(vec.embedding, ?) AS retrieval_distance FROM vec_exchanges AS vec JOIN exchanges AS e ON vec.id = e.id WHERE 1 = 1 ${sidechainClause} ${filterClause} - ORDER BY (distance + e.is_sidechain * ?) ASC + ORDER BY (retrieval_distance + e.is_sidechain * ?) ASC `); for (const row of stmt.iterate(Buffer.from(new Float32Array(queryEmbedding).buffer), ...filterParams, SIDECHAIN_DISTANCE_PENALTY)) { if (admitted(row)) @@ -197,7 +197,7 @@ export async function searchConversations(query, options = {}) { const textStmt = db.prepare(` SELECT ${EXCHANGE_SELECT_COLUMNS}, - 0 as distance + 0 as retrieval_distance FROM exchanges AS e WHERE ${textMatchSql} ${sidechainClause} @@ -245,7 +245,7 @@ export async function searchConversations(query, options = {}) { const snippet = snippetText + (exchange.userMessage.length > 200 ? '...' : ''); return { exchange, - similarity: mode === 'text' ? undefined : l2DistanceToCosineSimilarity(row.distance), + similarity: mode === 'text' ? undefined : l2DistanceToCosineSimilarity(row.retrieval_distance), snippet, summary }; diff --git a/src/search.ts b/src/search.ts index d12e779a..b6c5e3fb 100644 --- a/src/search.ts +++ b/src/search.ts @@ -205,11 +205,11 @@ export async function searchConversations( const queryEmbedding = await generateQueryEmbedding(query); const stmt = db.prepare(` SELECT ${EXCHANGE_SELECT_COLUMNS}, - vec_distance_l2(vec.embedding, ?) AS distance + vec_distance_l2(vec.embedding, ?) AS retrieval_distance FROM vec_exchanges AS vec JOIN exchanges AS e ON vec.id = e.id WHERE 1 = 1 ${sidechainClause} ${filterClause} - ORDER BY (distance + e.is_sidechain * ?) ASC + ORDER BY (retrieval_distance + e.is_sidechain * ?) ASC `); for (const row of stmt.iterate( Buffer.from(new Float32Array(queryEmbedding).buffer), @@ -230,7 +230,7 @@ export async function searchConversations( const textStmt = db.prepare(` SELECT ${EXCHANGE_SELECT_COLUMNS}, - 0 as distance + 0 as retrieval_distance FROM exchanges AS e WHERE ${textMatchSql} ${sidechainClause} @@ -279,7 +279,7 @@ export async function searchConversations( return { exchange, - similarity: mode === 'text' ? undefined : l2DistanceToCosineSimilarity(row.distance), + similarity: mode === 'text' ? undefined : l2DistanceToCosineSimilarity(row.retrieval_distance), snippet, summary } as SearchResult & { summary?: string }; diff --git a/test/search-admission.test.ts b/test/search-admission.test.ts index a53b47b9..f339c533 100644 --- a/test/search-admission.test.ts +++ b/test/search-admission.test.ts @@ -83,6 +83,31 @@ describe('decoded user instruction markers', () => { }); describe('retained search admission', () => { + it('orders admitted vectors by computed distance before applying the result limit', async () => { + seed('far'); seed('near'); seed('middle'); + const db = initDatabase(); + const update = db.prepare('UPDATE vec_exchanges SET embedding = ? WHERE id = ?'); + for (const [id, coordinate] of [['far', 0.8], ['near', 0.1], ['middle', 0.3]] as const) { + update.run(Buffer.from(new Float32Array(new Array(384).fill(coordinate)).buffer), id); + } + db.close(); + + const results = await searchConversations('needle', { mode: 'vector', limit: 2 }); + expect(results.map(result => result.exchange.id)).toEqual(['near', 'middle']); + expect(results[0].similarity).toBeGreaterThan(results[1].similarity!); + }); + + it('applies the sidechain penalty to computed distance rather than storage order', async () => { + seed('sidechain'); seed('primary'); + const db = initDatabase(); + db.prepare('UPDATE exchanges SET is_sidechain = 1 WHERE id = ?').run('sidechain'); + db.close(); + + const results = await searchConversations('needle', { mode: 'vector', limit: 2 }); + expect(results.map(result => result.exchange.id)).toEqual(['primary', 'sidechain']); + expect(results[0].similarity).toBeCloseTo(results[1].similarity!); + }); + it('finds an admitted vector beyond the native KNN candidate ceiling', async () => { const file = seed('denied'); seed('safe'); const db = initDatabase(); From adda5d62b3488b67e2920630b4c9b1ea43456240 Mon Sep 17 00:00:00 2001 From: HengYang Date: Sat, 26 Sep 2026 13:50:07 +0800 Subject: [PATCH 05/33] fix(verify): keep verification read-only and signal lock contention --- dist/index-cli.js | 8 ++++---- dist/mcp-server.js | 17 +++++++++-------- dist/verify.js | 24 +++++++++++++----------- src/index-cli.ts | 8 ++++---- src/verify.ts | 24 +++++++++++++----------- test/index-cli-single-instance.test.ts | 4 ++-- test/verify.test.ts | 15 +++++++++++++++ 7 files changed, 60 insertions(+), 40 deletions(-) diff --git a/dist/index-cli.js b/dist/index-cli.js index f8b34bc7..fbdb3ba3 100644 --- a/dist/index-cli.js +++ b/dist/index-cli.js @@ -7,16 +7,16 @@ import path from 'path'; import { getSyncLockPath } from './logging.js'; import { acquireFileLock, readLockHolder, releaseFileLock } from './file-lock.js'; const command = process.argv[2]; -// Serialize the whole CLI with `sync-cli`: every command can initialize or -// migrate the database, and rebuild also deletes the database and summaries. +// Serialize the whole CLI with `sync-cli`: writers mutate the index/archive, +// and verification must not claim a consistent result while one is active. const syncLockPath = getSyncLockPath(); const syncLock = acquireFileLock(syncLockPath); if (!syncLock) { const holder = readLockHolder(syncLockPath); const holderLabel = holder !== null ? `pid ${holder}` : 'another process'; - // stderr keeps this out of stdout consumers; status 0 so hooks don't fail. + // A skipped write may be retried by a hook; a skipped verifier is not a result. console.error(`episodic-memory: sync already running (${holderLabel}); skipping`); - process.exit(0); + process.exit(command === 'verify' ? 2 : 0); } const releaseSyncLockOnce = () => { if (releaseSyncLockOnce.done) diff --git a/dist/mcp-server.js b/dist/mcp-server.js index ca13e73b..5ea6dcfa 100644 --- a/dist/mcp-server.js +++ b/dist/mcp-server.js @@ -6,7 +6,11 @@ var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + try { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + } catch (e) { + throw mod = 0, e; + } }; var __export = (target, all) => { for (var name in all) @@ -25046,8 +25050,8 @@ function registry() { var globalRegistry = globalThis.__zod_globalRegistry; // node_modules/zod/v4/core/compile.js -var INVALID = Symbol.for("zod.compile.invalid"); -var FALLBACK_FLAG = Symbol.for("zod.compile.fallback"); +var INVALID = /* @__PURE__ */ Symbol.for("zod.compile.invalid"); +var FALLBACK_FLAG = /* @__PURE__ */ Symbol.for("zod.compile.fallback"); var ZodCompileAsyncError = class extends Error { constructor(message = "z.compile does not support async refinements, transforms, or checks") { super(message); @@ -28676,7 +28680,7 @@ var nonoptionalProcessor = (schema, ctx, _json, params) => { const seen = ctx.seen.get(schema); seen.ref = def.innerType; }; -var UNREPRESENTABLE_DEFAULT = Symbol(); +var UNREPRESENTABLE_DEFAULT = /* @__PURE__ */ Symbol(); function serializeDefaultValue(value, schema, ctx, json2, params) { let unrepresentable = false; const serialized = JSON.stringify(value, (_2, val) => { @@ -28915,7 +28919,7 @@ var JSONSchemaGenerator = class { var json_schema_exports = {}; // node_modules/zod/v4/core/visit.js -var RESOLVING = Symbol("z.visit/resolving"); +var RESOLVING = /* @__PURE__ */ Symbol("z.visit/resolving"); function visit(schema, fnOrHandlers) { const fn = typeof fnOrHandlers === "function" ? fnOrHandlers : (node2, rewritten) => { const h = fnOrHandlers[node2._zod.def.type]; @@ -33254,9 +33258,6 @@ function isTerminal(status) { return status === "completed" || status === "failed" || status === "cancelled"; } -// node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/Options.js -var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use"); - // node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/parsers/string.js var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789"); diff --git a/dist/verify.js b/dist/verify.js index d9456181..c84ed676 100644 --- a/dist/verify.js +++ b/dist/verify.js @@ -1,8 +1,9 @@ import fs from 'fs'; import path from 'path'; +import Database from 'better-sqlite3'; import { parseConversation } from './parser.js'; -import { initDatabase, getAllExchanges } from './db.js'; -import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; +import { getAllExchanges } from './db.js'; +import { getArchiveDir, getDbPath, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { isErroredSentinel } from './summary-sentinel.js'; export async function verifyIndex() { const result = { @@ -20,9 +21,10 @@ export async function verifyIndex() { if (!fs.existsSync(archiveDir)) { return result; } - // Initialize database once for all checks - const db = initDatabase(); - const indexState = db.prepare(` + // Verification must not create or migrate the index it is measuring. + const dbPath = getDbPath(); + const db = fs.existsSync(dbPath) ? new Database(dbPath, { readonly: true, fileMustExist: true }) : null; + const indexState = db?.prepare(` SELECT MAX(line_end) AS maxLineEnd, MAX(last_indexed) AS lastIndexed FROM exchanges WHERE archive_path = ? `); @@ -57,8 +59,8 @@ export async function verifyIndex() { else if (isErroredSentinel(fs.readFileSync(summaryPath, 'utf-8'))) { result.missing.push({ path: conversationPath, reason: 'Previous summarization failed (error sentinel)' }); } - const state = indexState.get(conversationPath); - const maxLineEnd = state.maxLineEnd; + const state = indexState?.get(conversationPath); + const maxLineEnd = state?.maxLineEnd ?? null; if (maxLineEnd === null) result.unindexed.push({ path: conversationPath }); // Parse independently of summary state and mtime. Only exchanges past @@ -67,11 +69,11 @@ export async function verifyIndex() { const exchanges = await parseConversation(conversationPath, project, conversationPath); if (maxLineEnd !== null) { const fileTime = fs.statSync(conversationPath).mtimeMs; - const dbTime = state.lastIndexed ?? 0; + const dbTime = state?.lastIndexed ?? 0; if (exchanges.some(exchange => exchange.lineEnd > maxLineEnd)) { result.outdated.push({ path: conversationPath, fileTime, dbTime }); } - else if (state.lastIndexed !== null && fileTime > state.lastIndexed) { + else if (state?.lastIndexed != null && fileTime > state.lastIndexed) { result.archiveRefreshes.push({ path: conversationPath, fileTime, dbTime }); } } @@ -86,8 +88,8 @@ export async function verifyIndex() { } console.log(`Verified ${totalChecked} conversations.`); // Check for orphaned database entries - const dbExchanges = getAllExchanges(db); - db.close(); + const dbExchanges = db ? getAllExchanges(db) : []; + db?.close(); for (const exchange of dbExchanges) { if (!foundFiles.has(exchange.archivePath) && !statIfExists(exchange.archivePath)?.isFile()) { result.orphaned.push({ diff --git a/src/index-cli.ts b/src/index-cli.ts index d3042677..49773283 100644 --- a/src/index-cli.ts +++ b/src/index-cli.ts @@ -10,16 +10,16 @@ import { acquireFileLock, readLockHolder, releaseFileLock } from './file-lock.js const command = process.argv[2]; -// Serialize the whole CLI with `sync-cli`: every command can initialize or -// migrate the database, and rebuild also deletes the database and summaries. +// Serialize the whole CLI with `sync-cli`: writers mutate the index/archive, +// and verification must not claim a consistent result while one is active. const syncLockPath = getSyncLockPath(); const syncLock = acquireFileLock(syncLockPath); if (!syncLock) { const holder = readLockHolder(syncLockPath); const holderLabel = holder !== null ? `pid ${holder}` : 'another process'; - // stderr keeps this out of stdout consumers; status 0 so hooks don't fail. + // A skipped write may be retried by a hook; a skipped verifier is not a result. console.error(`episodic-memory: sync already running (${holderLabel}); skipping`); - process.exit(0); + process.exit(command === 'verify' ? 2 : 0); } const releaseSyncLockOnce = () => { if ((releaseSyncLockOnce as any).done) return; diff --git a/src/verify.ts b/src/verify.ts index 0a0a9c3d..e70173ad 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -1,8 +1,9 @@ import fs from 'fs'; import path from 'path'; +import Database from 'better-sqlite3'; import { parseConversation } from './parser.js'; -import { initDatabase, getAllExchanges } from './db.js'; -import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; +import { getAllExchanges } from './db.js'; +import { getArchiveDir, getDbPath, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { isErroredSentinel } from './summary-sentinel.js'; export interface VerificationResult { @@ -34,9 +35,10 @@ export async function verifyIndex(): Promise { return result; } - // Initialize database once for all checks - const db = initDatabase(); - const indexState = db.prepare(` + // Verification must not create or migrate the index it is measuring. + const dbPath = getDbPath(); + const db = fs.existsSync(dbPath) ? new Database(dbPath, { readonly: true, fileMustExist: true }) : null; + const indexState = db?.prepare(` SELECT MAX(line_end) AS maxLineEnd, MAX(last_indexed) AS lastIndexed FROM exchanges WHERE archive_path = ? `); @@ -80,8 +82,8 @@ export async function verifyIndex(): Promise { result.missing.push({ path: conversationPath, reason: 'Previous summarization failed (error sentinel)' }); } - const state = indexState.get(conversationPath) as { maxLineEnd: number | null; lastIndexed: number | null }; - const maxLineEnd = state.maxLineEnd; + const state = indexState?.get(conversationPath) as { maxLineEnd: number | null; lastIndexed: number | null } | undefined; + const maxLineEnd = state?.maxLineEnd ?? null; if (maxLineEnd === null) result.unindexed.push({ path: conversationPath }); // Parse independently of summary state and mtime. Only exchanges past @@ -90,10 +92,10 @@ export async function verifyIndex(): Promise { const exchanges = await parseConversation(conversationPath, project, conversationPath); if (maxLineEnd !== null) { const fileTime = fs.statSync(conversationPath).mtimeMs; - const dbTime = state.lastIndexed ?? 0; + const dbTime = state?.lastIndexed ?? 0; if (exchanges.some(exchange => exchange.lineEnd > maxLineEnd)) { result.outdated.push({ path: conversationPath, fileTime, dbTime }); - } else if (state.lastIndexed !== null && fileTime > state.lastIndexed) { + } else if (state?.lastIndexed != null && fileTime > state.lastIndexed) { result.archiveRefreshes.push({ path: conversationPath, fileTime, dbTime }); } } @@ -109,8 +111,8 @@ export async function verifyIndex(): Promise { console.log(`Verified ${totalChecked} conversations.`); // Check for orphaned database entries - const dbExchanges = getAllExchanges(db); - db.close(); + const dbExchanges = db ? getAllExchanges(db) : []; + db?.close(); for (const exchange of dbExchanges) { if (!foundFiles.has(exchange.archivePath) && !statIfExists(exchange.archivePath)?.isFile()) { diff --git a/test/index-cli-single-instance.test.ts b/test/index-cli-single-instance.test.ts index 21bf02d3..c9c9f23a 100644 --- a/test/index-cli-single-instance.test.ts +++ b/test/index-cli-single-instance.test.ts @@ -75,13 +75,13 @@ describe('index-cli single-instance lock (#97)', () => { expect(existsSync(join(testDir, 'test.db'))).toBe(false); }); - it('skips `verify`, which can initialize and migrate the database', () => { + it('reports a lock-blocked `verify` as incomplete rather than healthy', () => { heldLock = acquireFileLock(lockPath); expect(heldLock).not.toBeNull(); const result = runIndexCli(['verify']); - expect(result.status).toBe(0); + expect(result.status).toBe(2); expect(result.stderr).toMatch(/sync already running.*skipping/); expect(result.stdout).not.toMatch(/Verifying conversation index/); expect(existsSync(join(testDir, 'test.db'))).toBe(false); diff --git a/test/verify.test.ts b/test/verify.test.ts index fbb3c272..927192e8 100644 --- a/test/verify.test.ts +++ b/test/verify.test.ts @@ -46,6 +46,21 @@ describe('verifyIndex', () => { delete process.env.TEST_DB_PATH; }); + it('does not create an index database merely by verifying an archive', async () => { + const projectArchive = path.join(archiveDir, 'read-only-project'); + fs.mkdirSync(projectArchive, { recursive: true }); + const conversationPath = path.join(projectArchive, 'conversation.jsonl'); + fs.writeFileSync(conversationPath, [ + JSON.stringify({ type: 'user', message: { role: 'user', content: 'Hello' }, timestamp: '2024-01-01T00:00:00Z' }), + JSON.stringify({ type: 'assistant', message: { role: 'assistant', content: 'Hi' }, timestamp: '2024-01-01T00:00:01Z' }), + ].join('\n')); + + expect(fs.existsSync(dbPath)).toBe(false); + const result = await verifyIndex(); + expect(result.unindexed.map(item => item.path)).toContain(conversationPath); + expect(fs.existsSync(dbPath)).toBe(false); + }); + it('should skip excluded projects', async () => { // Create two projects in archive const projectA = path.join(archiveDir, 'project-a'); From 5f277c28ca282cfc8a44bc0984e5482ea6b5e42d Mon Sep 17 00:00:00 2001 From: HengYang Date: Sat, 26 Sep 2026 13:53:25 +0800 Subject: [PATCH 06/33] fix(admission): keep sessionless Codex summaries on Codex --- dist/summarizer.js | 4 +++- src/summarizer.ts | 4 +++- test/record-admission.test.ts | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/dist/summarizer.js b/dist/summarizer.js index 84d99970..5de91a6f 100644 --- a/dist/summarizer.js +++ b/dist/summarizer.js @@ -714,7 +714,9 @@ export async function summarizeConversation(exchanges, sessionId) { } } const codexSessionId = getCodexSessionId(exchanges, sessionId); - if (codexSessionId) { + // A record policy must never send a Codex transcript to the Claude path, + // even when no source session ID is available for an ordinary fork. + if (codexSessionId || (recordPolicy !== null && exchanges.some(exchange => exchange.harness === 'codex'))) { try { const prompt = recordPolicy ? `${SUMMARIZER_CONTEXT_MARKER}. Summarize only the following admitted transcript in 2-4 factual sentences inside . Do not inspect files, use tools or recover any original session.\n\n${formatConversationText(exchanges)}` diff --git a/src/summarizer.ts b/src/summarizer.ts index 58f12c0d..aaa4a671 100644 --- a/src/summarizer.ts +++ b/src/summarizer.ts @@ -791,7 +791,9 @@ export async function summarizeConversation(exchanges: ConversationExchange[], s } const codexSessionId = getCodexSessionId(exchanges, sessionId); - if (codexSessionId) { + // A record policy must never send a Codex transcript to the Claude path, + // even when no source session ID is available for an ordinary fork. + if (codexSessionId || (recordPolicy !== null && exchanges.some(exchange => exchange.harness === 'codex'))) { try { const prompt = recordPolicy ? `${SUMMARIZER_CONTEXT_MARKER}. Summarize only the following admitted transcript in 2-4 factual sentences inside . Do not inspect files, use tools or recover any original session.\n\n${formatConversationText(exchanges)}` diff --git a/test/record-admission.test.ts b/test/record-admission.test.ts index 3e560f82..e475aeb3 100644 --- a/test/record-admission.test.ts +++ b/test/record-admission.test.ts @@ -359,6 +359,24 @@ describe('persistent record exclusion at native ingestion boundaries', () => { expect(request.prompt).not.toContain(PRIVATE); }); + it('does not route a policy-admitted Codex transcript without a session ID to Claude', async () => { + policy(); + process.env.EPISODIC_MEMORY_CODEX_BIN = path.join(root, 'missing-codex'); + vi.mocked(query).mockReset(); + vi.mocked(query).mockReturnValue({ + async *[Symbol.asyncIterator]() { + yield { type: 'result', is_error: false, result: 'Wrong provider.' }; + }, + } as any); + const exchange: ConversationExchange = { id: 'codex-no-id', project: 'fixture', + timestamp: '2026-01-01T00:00:00Z', userMessage: 'Explain the selected project architecture and its acceptance boundaries.', + assistantMessage: 'This admitted answer is long enough to require a summary but must never reach a different provider.', + archivePath: archiveFile, lineStart: 2, lineEnd: 3, harness: 'codex' }; + + await expect(summarizeConversation([exchange])).rejects.toThrow(); + expect(query).not.toHaveBeenCalled(); + }); + it('refuses direct database reinsertion after native deletion across reopen', () => { policy(); const exchange: ConversationExchange = { id: 'denied-body', project: 'fixture', From 0c7c541d8ec4e6a93503c0334bfae0b7cdcf79b4 Mon Sep 17 00:00:00 2001 From: HengYang Date: Sat, 26 Sep 2026 15:00:06 +0800 Subject: [PATCH 07/33] fix(verify): classify record screening and stop unsafe repair --- README.md | 3 +++ dist/index-cli.js | 12 ++++++++-- dist/verify.d.ts | 6 +++++ dist/verify.js | 26 ++++++++++++++++------ src/index-cli.ts | 12 ++++++++-- src/verify.ts | 27 ++++++++++++++++------- test/record-screening.test.ts | 41 +++++++++++++++++++++++++++++++++++ test/verify.test.ts | 2 +- 8 files changed, 109 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index ed2f4fa7..0fff8dcb 100644 --- a/README.md +++ b/README.md @@ -536,6 +536,9 @@ retaining key/value assignment context; separate exchange messages are screened separately. A finding rejects the operation rather than silently dropping a new message and breaking conversation pairing. Missing/changed executables, byte or nesting limits, timeouts and malformed or contradictory reports fail closed. +Verification reports scanner rejections and scanner unavailability separately +from transcript corruption, even when a summary is missing. A broad repair +refuses to start while either screening failure remains. No findings, input, scanner diagnostics or secret fingerprints appear in errors. The scanner receives stdin in a private empty working directory with no inherited environment/configuration and with inline allow comments disabled. Its temporary diff --git a/dist/index-cli.js b/dist/index-cli.js index 950a4c7d..28219ede 100644 --- a/dist/index-cli.js +++ b/dist/index-cli.js @@ -65,13 +65,16 @@ async function main() { console.log(`Missing summaries: ${issues.missing.length}`); console.log(`Orphaned entries: ${issues.orphaned.length}`); console.log(`Outdated files: ${issues.outdated.length}`); + console.log(`Screening-rejected archives: ${issues.screeningRejected.length}`); + console.log(`Screening-unavailable archives: ${issues.screeningUnavailable.length}`); console.log(`Corrupted files: ${issues.corrupted.length}`); if (issues.missing.length > 0) { console.log('\nMissing summaries:'); issues.missing.forEach(m => console.log(` ${m.path}`)); } - if (issues.missing.length + issues.orphaned.length + issues.outdated.length + issues.corrupted.length > 0) { - console.log('\nRun with --repair to fix these issues.'); + if (issues.missing.length + issues.orphaned.length + issues.outdated.length + + issues.screeningRejected.length + issues.screeningUnavailable.length + issues.corrupted.length > 0) { + console.log('\nReview the reported categories before repair; --repair may regenerate embeddings and AI summaries.'); process.exit(1); } else { @@ -81,6 +84,11 @@ async function main() { case 'repair': console.log('Verifying conversation index...'); const repairIssues = await verifyIndex(); + if (repairIssues.screeningRejected.length + repairIssues.screeningUnavailable.length > 0) { + console.error('Record screening failures require review; repair was not started.'); + process.exitCode = 1; + break; + } if (repairIssues.missing.length + repairIssues.orphaned.length + repairIssues.outdated.length > 0) { await repairIndex(repairIssues); } diff --git a/dist/verify.d.ts b/dist/verify.d.ts index 9558c879..6e543c60 100644 --- a/dist/verify.d.ts +++ b/dist/verify.d.ts @@ -12,6 +12,12 @@ export interface VerificationResult { fileTime: number; dbTime: number; }>; + screeningRejected: Array<{ + path: string; + }>; + screeningUnavailable: Array<{ + path: string; + }>; corrupted: Array<{ path: string; error: string; diff --git a/dist/verify.js b/dist/verify.js index 9b0dd9c8..5d7e8396 100644 --- a/dist/verify.js +++ b/dist/verify.js @@ -6,10 +6,13 @@ import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from import { isErroredSentinel } from './summary-sentinel.js'; import { readRecordExclusions } from './record-admission.js'; export async function verifyIndex() { + readRecordExclusions(); const result = { missing: [], orphaned: [], outdated: [], + screeningRejected: [], + screeningUnavailable: [], corrupted: [] }; const archiveDir = getArchiveDir(); @@ -48,11 +51,9 @@ export async function verifyIndex() { // re-attempts it rather than reporting the conversation as healthy. if (!fs.existsSync(summaryPath)) { result.missing.push({ path: conversationPath, reason: 'No summary file' }); - continue; } - if (isErroredSentinel(fs.readFileSync(summaryPath, 'utf-8'))) { + else if (isErroredSentinel(fs.readFileSync(summaryPath, 'utf-8'))) { result.missing.push({ path: conversationPath, reason: 'Previous summarization failed (error sentinel)' }); - continue; } // Check if file is outdated (modified after last_indexed) const lastIndexed = getFileLastIndexed(db, conversationPath); @@ -71,10 +72,18 @@ export async function verifyIndex() { await parseConversation(conversationPath, project, conversationPath); } catch (error) { - result.corrupted.push({ - path: conversationPath, - error: error instanceof Error ? error.message : String(error) - }); + const message = error instanceof Error ? error.message : String(error); + if (message === 'Record content rejected by screening' || + message === 'Record screening byte limit exceeded' || + message === 'Record screening nesting limit exceeded') { + result.screeningRejected.push({ path: conversationPath }); + } + else if (message === 'Record screening unavailable') { + result.screeningUnavailable.push({ path: conversationPath }); + } + else { + result.corrupted.push({ path: conversationPath, error: message }); + } } } } @@ -93,6 +102,9 @@ export async function verifyIndex() { return result; } export async function repairIndex(issues) { + if (issues.screeningRejected.length + issues.screeningUnavailable.length > 0) { + throw new Error('Resolve record screening failures before repair'); + } readRecordExclusions(); console.log('Repairing index...'); // To avoid circular dependencies, we import the indexer functions dynamically diff --git a/src/index-cli.ts b/src/index-cli.ts index 272ecdba..7b724acf 100644 --- a/src/index-cli.ts +++ b/src/index-cli.ts @@ -73,6 +73,8 @@ async function main() { console.log(`Missing summaries: ${issues.missing.length}`); console.log(`Orphaned entries: ${issues.orphaned.length}`); console.log(`Outdated files: ${issues.outdated.length}`); + console.log(`Screening-rejected archives: ${issues.screeningRejected.length}`); + console.log(`Screening-unavailable archives: ${issues.screeningUnavailable.length}`); console.log(`Corrupted files: ${issues.corrupted.length}`); if (issues.missing.length > 0) { @@ -80,8 +82,9 @@ async function main() { issues.missing.forEach(m => console.log(` ${m.path}`)); } - if (issues.missing.length + issues.orphaned.length + issues.outdated.length + issues.corrupted.length > 0) { - console.log('\nRun with --repair to fix these issues.'); + if (issues.missing.length + issues.orphaned.length + issues.outdated.length + + issues.screeningRejected.length + issues.screeningUnavailable.length + issues.corrupted.length > 0) { + console.log('\nReview the reported categories before repair; --repair may regenerate embeddings and AI summaries.'); process.exit(1); } else { console.log('\n✅ Index is healthy!'); @@ -92,6 +95,11 @@ async function main() { console.log('Verifying conversation index...'); const repairIssues = await verifyIndex(); + if (repairIssues.screeningRejected.length + repairIssues.screeningUnavailable.length > 0) { + console.error('Record screening failures require review; repair was not started.'); + process.exitCode = 1; + break; + } if (repairIssues.missing.length + repairIssues.orphaned.length + repairIssues.outdated.length > 0) { await repairIndex(repairIssues); } else { diff --git a/src/verify.ts b/src/verify.ts index 2be8c1b7..0cb61a56 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -10,14 +10,19 @@ export interface VerificationResult { missing: Array<{ path: string; reason: string }>; orphaned: Array<{ uuid: string; path: string }>; outdated: Array<{ path: string; fileTime: number; dbTime: number }>; + screeningRejected: Array<{ path: string }>; + screeningUnavailable: Array<{ path: string }>; corrupted: Array<{ path: string; error: string }>; } export async function verifyIndex(): Promise { + readRecordExclusions(); const result: VerificationResult = { missing: [], orphaned: [], outdated: [], + screeningRejected: [], + screeningUnavailable: [], corrupted: [] }; @@ -69,11 +74,8 @@ export async function verifyIndex(): Promise { // re-attempts it rather than reporting the conversation as healthy. if (!fs.existsSync(summaryPath)) { result.missing.push({ path: conversationPath, reason: 'No summary file' }); - continue; - } - if (isErroredSentinel(fs.readFileSync(summaryPath, 'utf-8'))) { + } else if (isErroredSentinel(fs.readFileSync(summaryPath, 'utf-8'))) { result.missing.push({ path: conversationPath, reason: 'Previous summarization failed (error sentinel)' }); - continue; } // Check if file is outdated (modified after last_indexed) @@ -93,10 +95,16 @@ export async function verifyIndex(): Promise { try { await parseConversation(conversationPath, project, conversationPath); } catch (error) { - result.corrupted.push({ - path: conversationPath, - error: error instanceof Error ? error.message : String(error) - }); + const message = error instanceof Error ? error.message : String(error); + if (message === 'Record content rejected by screening' || + message === 'Record screening byte limit exceeded' || + message === 'Record screening nesting limit exceeded') { + result.screeningRejected.push({ path: conversationPath }); + } else if (message === 'Record screening unavailable') { + result.screeningUnavailable.push({ path: conversationPath }); + } else { + result.corrupted.push({ path: conversationPath, error: message }); + } } } } @@ -120,6 +128,9 @@ export async function verifyIndex(): Promise { } export async function repairIndex(issues: VerificationResult): Promise { + if (issues.screeningRejected.length + issues.screeningUnavailable.length > 0) { + throw new Error('Resolve record screening failures before repair'); + } readRecordExclusions(); console.log('Repairing index...'); diff --git a/test/record-screening.test.ts b/test/record-screening.test.ts index fb74bedd..0640d95f 100644 --- a/test/record-screening.test.ts +++ b/test/record-screening.test.ts @@ -3,6 +3,7 @@ import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; import crypto from 'node:crypto'; +import { spawnSync } from 'node:child_process'; import { admitExchange, archiveAdmittedConversation, @@ -11,6 +12,7 @@ import { } from '../src/record-admission.js'; import { initDatabase, insertExchange } from '../src/db.js'; import { searchConversations } from '../src/search.js'; +import { verifyIndex } from '../src/verify.js'; import type { ConversationExchange } from '../src/types.js'; const session = '00000000-1111-4222-8333-444444444444'; @@ -56,6 +58,17 @@ function transcript(text: string): string { ].map(JSON.stringify).join('\n') + '\n'; } +function archivedTranscript(text: string, withSummary = false): string { + const archiveDir = path.join(root, 'archive'); + const projectDir = path.join(archiveDir, 'project'); + fs.mkdirSync(projectDir, { recursive: true }); + process.env.TEST_ARCHIVE_DIR = archiveDir; + const file = path.join(projectDir, path.basename(source)); + fs.writeFileSync(file, transcript(text)); + if (withSummary) fs.writeFileSync(file.replace('.jsonl', '-summary.txt'), 'Existing summary'); + return file; +} + // Contract probes are executable and digest-pinned without requiring Gitleaks // on every CI host. A separate optional integration test exercises Gitleaks. function scannerProbe(body: string): string { @@ -95,6 +108,34 @@ afterEach(() => { }); describe('pinned record-local screening at native admission', () => { + it('fails verification on an invalid record policy even with no archived files', async () => { + fs.writeFileSync(path.join(root, 'record-exclusions.json'), '{invalid'); + process.env.TEST_ARCHIVE_DIR = path.join(root, 'empty-archive'); + await expect(verifyIndex()).rejects.toThrow(/record exclusion policy/i); + }); + + it.each(['rejected', 'unavailable'] as const)('classifies %s screening independently from corruption and missing summary', async outcome => { + const file = archivedTranscript(token); + if (outcome === 'unavailable') policy({ sha256: '0'.repeat(64) }); + + const result = await verifyIndex(); + expect(result.missing.map(item => item.path)).toContain(file); + expect(result.corrupted).toEqual([]); + expect(result.screeningRejected.map(item => item.path)).toEqual(outcome === 'rejected' ? [file] : []); + expect(result.screeningUnavailable.map(item => item.path)).toEqual(outcome === 'unavailable' ? [file] : []); + }); + + it('does not report a green repair when configured screening rejects an archive', () => { + archivedTranscript(token, true); + const cli = path.join(import.meta.dirname, '..', 'dist', 'index-cli.js'); + const result = spawnSync(process.execPath, [cli, 'repair'], { + env: process.env, encoding: 'utf8', timeout: 30_000, + }); + expect(result.status).toBe(1); + expect(result.stdout).not.toContain('No issues to repair!'); + expect(result.stdout).not.toContain('Repair complete.'); + }); + it.skipIf(!realScannerPath)('rejects a synthetic token with the actual Gitleaks executable', () => { const executable = fs.realpathSync(realScannerPath!); policy({ executable, sha256: crypto.createHash('sha256').update(fs.readFileSync(executable)).digest('hex') }); diff --git a/test/verify.test.ts b/test/verify.test.ts index 53348e78..fa47e457 100644 --- a/test/verify.test.ts +++ b/test/verify.test.ts @@ -285,7 +285,7 @@ describe('repairIndex', () => { const input = path.join(archiveDir, 'not-a-transcript'); fs.mkdirSync(input, { recursive: true }); await expect(repairIndex({ missing: [{ path: input, reason: 'synthetic invalid source' }], - outdated: [], orphaned: [], corrupted: [] })).rejects.toThrow(/regular non-symlink file/); + outdated: [], orphaned: [], screeningRejected: [], screeningUnavailable: [], corrupted: [] })).rejects.toThrow(/regular non-symlink file/); }); it('re-indexes outdated files during repair', { timeout: 30000 }, async () => { From 5e5d6b0c4d690eb9e9d6d84f777cf34a229f0abb Mon Sep 17 00:00:00 2001 From: HengYang Date: Sat, 26 Sep 2026 15:11:21 +0800 Subject: [PATCH 08/33] fix(admission): refresh same-mtime appended archives --- dist/record-admission.js | 5 +++-- src/record-admission.ts | 5 +++-- test/record-admission.test.ts | 10 ++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/dist/record-admission.js b/dist/record-admission.js index f0ea0e83..396a9166 100644 --- a/dist/record-admission.js +++ b/dist/record-admission.js @@ -515,13 +515,14 @@ export async function archiveAdmittedConversation(source, destination, policy = const original = fs.lstatSync(source); if (!original.isFile()) throw new Error('Conversation source must be a regular non-symlink file'); + let target; if (fs.existsSync(destination)) { - const target = fs.lstatSync(destination); + target = fs.lstatSync(destination); if (!target.isFile() || target.dev === original.dev && target.ino === original.ino) { throw new Error('Source and derived archive must be distinct regular files'); } } - if (!policy && fs.existsSync(destination) && fs.statSync(destination).mtimeMs >= original.mtimeMs) + if (!policy && target && target.mtimeMs >= original.mtimeMs && target.size === original.size) return false; const initial = fs.statSync(source); const parent = prepareArchiveParent(path.dirname(path.resolve(destination))); diff --git a/src/record-admission.ts b/src/record-admission.ts index 3b862fd1..3254fd10 100644 --- a/src/record-admission.ts +++ b/src/record-admission.ts @@ -458,13 +458,14 @@ export async function archiveAdmittedConversation(source: string, destination: s if (path.resolve(source) === path.resolve(destination)) throw new Error('Source and derived archive must be distinct'); const original = fs.lstatSync(source); if (!original.isFile()) throw new Error('Conversation source must be a regular non-symlink file'); + let target: fs.Stats | undefined; if (fs.existsSync(destination)) { - const target = fs.lstatSync(destination); + target = fs.lstatSync(destination); if (!target.isFile() || target.dev === original.dev && target.ino === original.ino) { throw new Error('Source and derived archive must be distinct regular files'); } } - if (!policy && fs.existsSync(destination) && fs.statSync(destination).mtimeMs >= original.mtimeMs) return false; + if (!policy && target && target.mtimeMs >= original.mtimeMs && target.size === original.size) return false; const initial = fs.statSync(source); const parent = prepareArchiveParent(path.dirname(path.resolve(destination))); const parentIdentity = fs.statSync(parent); diff --git a/test/record-admission.test.ts b/test/record-admission.test.ts index e475aeb3..b7c40e78 100644 --- a/test/record-admission.test.ts +++ b/test/record-admission.test.ts @@ -229,6 +229,16 @@ describe('persistent record exclusion at native ingestion boundaries', () => { expect(fs.readFileSync(archiveFile, 'utf8')).toBe(bytes); }); + it('refreshes an archive when the source grows but its mtime ties the archive', async () => { + expect(await archiveAdmittedConversation(sourceFile, archiveFile)).toBe(true); + const archiveTime = fs.statSync(archiveFile).mtime; + fs.appendFileSync(sourceFile, JSON.stringify(message('user', 'An appended safe exchange')) + '\n'); + fs.utimesSync(sourceFile, archiveTime, archiveTime); + + expect(await archiveAdmittedConversation(sourceFile, archiveFile)).toBe(true); + expect(fs.readFileSync(archiveFile)).toEqual(fs.readFileSync(sourceFile)); + }); + it('rejects source mutation during streaming without publishing a derived file', async () => { policy(); const original = fs.createReadStream; From c8c190007661c50bafbb6753228658b6031b56e4 Mon Sep 17 00:00:00 2001 From: HengYang Date: Sat, 26 Sep 2026 15:15:15 +0800 Subject: [PATCH 09/33] test(verify): derive repair fixture from verifier result --- test/verify.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/verify.test.ts b/test/verify.test.ts index 927192e8..14eb223d 100644 --- a/test/verify.test.ts +++ b/test/verify.test.ts @@ -340,6 +340,7 @@ describe('repairIndex', () => { vi.mocked(summarizeConversation).mockClear(); await repairIndex({ + ...await verifyIndex(), missing: [{ path: conversationPath, reason: 'No summary file' }], outdated: [{ path: conversationPath, fileTime: 2, dbTime: 1 }], orphaned: [], corrupted: [] From b9f880a722a44379c4a006851b5ffc3147931c40 Mon Sep 17 00:00:00 2001 From: HengYang Date: Sat, 26 Sep 2026 17:03:58 +0800 Subject: [PATCH 10/33] fix(codex): keep sessionless summaries on Codex --- README.md | 4 +- dist/summarizer.js | 26 +++--- dist/sync.js | 8 +- docs/CODEX.md | 4 +- src/summarizer.ts | 24 +++--- src/sync.ts | 8 +- test/codex-summary-routing.test.ts | 132 +++++++++++++++++++++++++++++ 7 files changed, 164 insertions(+), 42 deletions(-) create mode 100644 test/codex-summary-routing.test.ts diff --git a/README.md b/README.md index 0fff8dcb..dde6d0eb 100644 --- a/README.md +++ b/README.md @@ -229,7 +229,7 @@ In Codex and opencode, the skill guides the agent to use the episodic-memory MCP ## API Configuration -By default, episodic-memory uses your Claude Code authentication for Claude Code summarization. Codex-indexed sessions with a session ID are summarized through `codex app-server` by creating an ephemeral `thread/fork`, so the summary can use Codex session context and reasoning summaries without appending to the original rollout. +By default, episodic-memory uses your Claude Code authentication for Claude Code summarization. Codex-indexed sessions with a session ID are summarized through `codex app-server` by creating an ephemeral `thread/fork`, so the summary can use Codex session context and reasoning summaries without appending to the original rollout. A Codex transcript without a session ID is summarized from its admitted text in an isolated ephemeral `thread/start`; it is never sent to Claude. To route summarization through a custom Anthropic-compatible endpoint or override the model: @@ -309,7 +309,7 @@ These pass through unchanged to episodic-memory's summarizer subprocess. Because These settings only affect episodic-memory's summarization calls, not your interactive Claude Code or Codex sessions. -Codex summarization requires `codex-cli 0.130.0` or newer. If Codex app-server summarization is unavailable, sync logs the reason and falls back to transcript-text summarization. +Codex summarization requires `codex-cli 0.130.0` or newer; isolated transcript-only summaries require `0.154.0` or newer. If Codex app-server summarization is unavailable, sync records a retryable summary failure rather than switching providers. ### What's Affected diff --git a/dist/summarizer.js b/dist/summarizer.js index 5de91a6f..2ffac728 100644 --- a/dist/summarizer.js +++ b/dist/summarizer.js @@ -678,7 +678,7 @@ function getCodexSessionId(exchanges, sessionId) { if (!exchanges.some(exchange => exchange.harness === 'codex')) { return undefined; } - return sessionId || exchanges.find(exchange => exchange.sessionId)?.sessionId; + return sessionId || exchanges.find(exchange => exchange.harness === 'codex' && exchange.sessionId)?.sessionId; } /** * Resolve the model to pass into Codex `thread/fork` for summarization. @@ -714,21 +714,15 @@ export async function summarizeConversation(exchanges, sessionId) { } } const codexSessionId = getCodexSessionId(exchanges, sessionId); - // A record policy must never send a Codex transcript to the Claude path, - // even when no source session ID is available for an ordinary fork. - if (codexSessionId || (recordPolicy !== null && exchanges.some(exchange => exchange.harness === 'codex'))) { - try { - const prompt = recordPolicy - ? `${SUMMARIZER_CONTEXT_MARKER}. Summarize only the following admitted transcript in 2-4 factual sentences inside . Do not inspect files, use tools or recover any original session.\n\n${formatConversationText(exchanges)}` - : buildCodexSummaryPrompt(); - const result = await callCodex(prompt, recordPolicy ? undefined : codexSessionId, getCodexModel(exchanges), !!recordPolicy); - return extractSummary(result); - } - catch (error) { - if (recordPolicy) - throw error; // Keep the selected provider; never recover excluded source context. - console.log(` Codex summarizer unavailable, falling back to transcript text: ${error instanceof Error ? error.message : String(error)}`); - } + if (exchanges.some(exchange => exchange.harness === 'codex')) { + // A sessionless or policy-filtered transcript has no source context to fork. + // Summarize its admitted text in a fresh, isolated Codex thread instead. + const isolated = recordPolicy !== null || !codexSessionId; + const prompt = isolated + ? `${SUMMARIZER_CONTEXT_MARKER}. Summarize only the following admitted transcript in 2-4 factual sentences inside . Do not inspect files, use tools or recover any original session.\n\n${formatConversationText(exchanges)}` + : buildCodexSummaryPrompt(); + const result = await callCodex(prompt, isolated ? undefined : codexSessionId, getCodexModel(exchanges), isolated); + return extractSummary(result); } // Cost safety (#104): everything below this point calls the metered Claude API // path. If a stray global ANTHROPIC_API_KEY would be billed and the user hasn't diff --git a/dist/sync.js b/dist/sync.js index 58b64be5..e3bfea2b 100644 --- a/dist/sync.js +++ b/dist/sync.js @@ -141,10 +141,10 @@ export async function syncConversations(sourceDir, destDir, options = {}) { if (!options.skipSummaries) { const summaryPath = destFile.replace('.jsonl', '-summary.txt'); if (shouldQueueForSummary(summaryPath) && !shouldSkipConversation(destFile)) { - // sessionId enables Claude session-resume summarization; when the - // filename has no UUID to extract (e.g. subagent transcripts named - // agent-.jsonl), queue anyway — summarizeConversation falls - // back to summarizing from the transcript text. + // sessionId enables source-session summarization. When the filename + // has no UUID (e.g. agent-.jsonl), queue anyway: Codex uses an + // isolated transcript-only thread; other harnesses use their own + // transcript-text route without resuming a source session. const sessionId = extractSessionIdFromPath(destFile) ?? undefined; filesToSummarize.push({ path: destFile, sessionId }); } diff --git a/docs/CODEX.md b/docs/CODEX.md index c3d83f97..b0a2d513 100644 --- a/docs/CODEX.md +++ b/docs/CODEX.md @@ -90,6 +90,6 @@ The test creates an isolated temporary `CODEX_HOME`, copies your existing Codex ## Summaries -Codex summaries use `codex app-server`, `thread/fork`, and `ephemeral: true`. This matters: `codex exec --ephemeral resume ` was tested and still appended to the resumed rollout, so it is not the quality bar for summarization. +Codex summaries with a session ID use `codex app-server`, `thread/fork`, and `ephemeral: true`. This matters: `codex exec --ephemeral resume ` was tested and still appended to the resumed rollout, so it is not the quality bar for summarization. Without a session ID, an isolated ephemeral `thread/start` receives only the admitted transcript text and requires Codex `0.154.0` or newer. -If the Codex app-server summarizer is unavailable or below the support floor, Episodic Memory logs the reason and falls back to transcript-text summarization instead of silently skipping the conversation. +If the Codex app-server summarizer is unavailable or below the applicable support floor, Episodic Memory records a retryable summary failure. It does not send Codex transcripts to Claude. diff --git a/src/summarizer.ts b/src/summarizer.ts index aaa4a671..a0d308c9 100644 --- a/src/summarizer.ts +++ b/src/summarizer.ts @@ -752,7 +752,7 @@ function getCodexSessionId(exchanges: ConversationExchange[], sessionId?: string if (!exchanges.some(exchange => exchange.harness === 'codex')) { return undefined; } - return sessionId || exchanges.find(exchange => exchange.sessionId)?.sessionId; + return sessionId || exchanges.find(exchange => exchange.harness === 'codex' && exchange.sessionId)?.sessionId; } /** @@ -791,19 +791,15 @@ export async function summarizeConversation(exchanges: ConversationExchange[], s } const codexSessionId = getCodexSessionId(exchanges, sessionId); - // A record policy must never send a Codex transcript to the Claude path, - // even when no source session ID is available for an ordinary fork. - if (codexSessionId || (recordPolicy !== null && exchanges.some(exchange => exchange.harness === 'codex'))) { - try { - const prompt = recordPolicy - ? `${SUMMARIZER_CONTEXT_MARKER}. Summarize only the following admitted transcript in 2-4 factual sentences inside . Do not inspect files, use tools or recover any original session.\n\n${formatConversationText(exchanges)}` - : buildCodexSummaryPrompt(); - const result = await callCodex(prompt, recordPolicy ? undefined : codexSessionId, getCodexModel(exchanges), !!recordPolicy); - return extractSummary(result); - } catch (error) { - if (recordPolicy) throw error; // Keep the selected provider; never recover excluded source context. - console.log(` Codex summarizer unavailable, falling back to transcript text: ${error instanceof Error ? error.message : String(error)}`); - } + if (exchanges.some(exchange => exchange.harness === 'codex')) { + // A sessionless or policy-filtered transcript has no source context to fork. + // Summarize its admitted text in a fresh, isolated Codex thread instead. + const isolated = recordPolicy !== null || !codexSessionId; + const prompt = isolated + ? `${SUMMARIZER_CONTEXT_MARKER}. Summarize only the following admitted transcript in 2-4 factual sentences inside . Do not inspect files, use tools or recover any original session.\n\n${formatConversationText(exchanges)}` + : buildCodexSummaryPrompt(); + const result = await callCodex(prompt, isolated ? undefined : codexSessionId, getCodexModel(exchanges), isolated); + return extractSummary(result); } // Cost safety (#104): everything below this point calls the metered Claude API diff --git a/src/sync.ts b/src/sync.ts index f8ae0ad7..40efdfad 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -170,10 +170,10 @@ export async function syncConversations( if (!options.skipSummaries) { const summaryPath = destFile.replace('.jsonl', '-summary.txt'); if (shouldQueueForSummary(summaryPath) && !shouldSkipConversation(destFile)) { - // sessionId enables Claude session-resume summarization; when the - // filename has no UUID to extract (e.g. subagent transcripts named - // agent-.jsonl), queue anyway — summarizeConversation falls - // back to summarizing from the transcript text. + // sessionId enables source-session summarization. When the filename + // has no UUID (e.g. agent-.jsonl), queue anyway: Codex uses an + // isolated transcript-only thread; other harnesses use their own + // transcript-text route without resuming a source session. const sessionId = extractSessionIdFromPath(destFile) ?? undefined; filesToSummarize.push({ path: destFile, sessionId }); } diff --git a/test/codex-summary-routing.test.ts b/test/codex-summary-routing.test.ts new file mode 100644 index 00000000..8daea696 --- /dev/null +++ b/test/codex-summary-routing.test.ts @@ -0,0 +1,132 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import type { ConversationExchange } from '../src/types.js'; + +vi.mock('@anthropic-ai/claude-agent-sdk', () => ({ query: vi.fn() })); + +import { query } from '@anthropic-ai/claude-agent-sdk'; +import { summarizeConversation } from '../src/summarizer.js'; + +let testDir: string; +let previousEnv: NodeJS.ProcessEnv; + +function exchange(sessionId?: string): ConversationExchange { + return { + id: 'codex-summary-fixture', + project: 'fixture', + timestamp: '2026-01-01T00:00:00Z', + userMessage: 'Explain the design and acceptance boundary for this synthetic Codex conversation.', + assistantMessage: 'The design keeps provider ownership and validates the route with an isolated local app-server fixture.', + archivePath: path.join(testDir, 'synthetic.jsonl'), + lineStart: 1, + lineEnd: 2, + harness: 'codex', + ...(sessionId ? { sessionId } : {}), + }; +} + +function installFakeCodex(failMethod?: 'thread/start' | 'thread/fork'): void { + const executable = path.join(testDir, 'fake-codex'); + fs.writeFileSync(executable, `#!/usr/bin/env node +const readline = require('node:readline'); +if (process.argv.includes('--version')) { + console.log('codex-cli 0.154.0'); + process.exit(0); +} +if (!process.argv.includes('app-server')) process.exit(2); +const emit = value => process.stdout.write(JSON.stringify(value) + '\\n'); +readline.createInterface({ input: process.stdin }).on('line', line => { + const message = JSON.parse(line); + if (message.method === 'initialize') emit({ id: message.id, result: {} }); + if (message.method === 'config/read') emit({ id: message.id, result: { config: { mcp_servers: {} } } }); + if (message.method === 'skills/list') emit({ id: message.id, result: { data: [{ skills: [], errors: [] }] } }); + if (message.method === 'thread/start') { + if (${failMethod === 'thread/start'}) process.exit(7); + const params = message.params; + if (!params.ephemeral || params.threadId || params.sandbox !== 'read-only' || + params.allowProviderModelFallback !== false || !params.cwd) process.exit(8); + emit({ id: message.id, result: { thread: { id: 'ephemeral-summary' } } }); + } + if (message.method === 'thread/fork') { + if (${failMethod === 'thread/fork'}) process.exit(7); + if (message.params.threadId !== 'source-session' || !message.params.ephemeral) process.exit(9); + emit({ id: message.id, result: { thread: { id: 'forked-summary' } } }); + } + if (message.method === 'turn/start') { + const prompt = message.params.input[0].text; + if (message.params.threadId === 'ephemeral-summary' && + (!prompt.includes('synthetic Codex conversation') || !prompt.includes('isolated local app-server fixture'))) process.exit(10); + emit({ id: message.id, result: { turn: { id: 'summary-turn' } } }); + emit({ method: 'item/completed', params: { item: { type: 'agentMessage', text: 'Codex kept provider ownership.' } } }); + emit({ method: 'turn/completed', params: { turn: { id: 'summary-turn', status: 'completed' } } }); + } +}); +`); + fs.chmodSync(executable, 0o700); + process.env.EPISODIC_MEMORY_CODEX_BIN = executable; +} + +beforeEach(() => { + previousEnv = { ...process.env }; + testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-summary-routing-')); + process.env.EPISODIC_MEMORY_CONFIG_DIR = path.join(testDir, 'config'); + vi.mocked(query).mockReset(); + vi.mocked(query).mockReturnValue({ + async *[Symbol.asyncIterator]() { + yield { type: 'result', is_error: false, result: 'Wrong provider.' }; + }, + } as any); +}); + +afterEach(() => { + process.env = previousEnv; + fs.rmSync(testDir, { recursive: true, force: true }); +}); + +describe('Codex summary provider ownership', () => { + it('summarizes a sessionless Codex transcript in an isolated ephemeral Codex thread', async () => { + installFakeCodex(); + + expect(await summarizeConversation([exchange()])).toBe('Codex kept provider ownership.'); + expect(query).not.toHaveBeenCalled(); + }); + + it('does not borrow another harness session ID for a sessionless Codex exchange', async () => { + installFakeCodex(); + const otherHarness: ConversationExchange = { + ...exchange('other-provider-session'), + id: 'other-provider-exchange', + harness: 'claude', + }; + + expect(await summarizeConversation([otherHarness, exchange()])) + .toBe('Codex kept provider ownership.'); + expect(query).not.toHaveBeenCalled(); + }); + + it('does not fall back to Claude when a sessionless Codex summary fails', async () => { + installFakeCodex('thread/start'); + + await expect(summarizeConversation([exchange()])) + .rejects.toThrow('Isolated Codex summary failed; provider details suppressed'); + expect(query).not.toHaveBeenCalled(); + }); + + it('keeps the ephemeral fork for a Codex transcript with a session ID', async () => { + installFakeCodex(); + + expect(await summarizeConversation([exchange('source-session')])) + .toBe('Codex kept provider ownership.'); + expect(query).not.toHaveBeenCalled(); + }); + + it('does not fall back to Claude when a Codex fork fails', async () => { + installFakeCodex('thread/fork'); + + await expect(summarizeConversation([exchange('source-session')])) + .rejects.toThrow(); + expect(query).not.toHaveBeenCalled(); + }); +}); From 1dfaf610f561143bf8f862f9f5063933407b9f4a Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 22:28:12 +0000 Subject: [PATCH 11/33] docs(redaction): Phase 0 findings and choke-point decision Survey of the sync/index/summarize pipeline for the inline secret redaction fork. Picks the archive write as the choke point (option b) and records the three supporting changes it needs: indexer parses the archive, summarizer resume/fork disabled under redaction, staging exports redacted at write. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0141gGbp343kbYP6imaJaji2 --- docs/redaction/PHASE0-FINDINGS.md | 184 ++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 docs/redaction/PHASE0-FINDINGS.md diff --git a/docs/redaction/PHASE0-FINDINGS.md b/docs/redaction/PHASE0-FINDINGS.md new file mode 100644 index 00000000..d73e34eb --- /dev/null +++ b/docs/redaction/PHASE0-FINDINGS.md @@ -0,0 +1,184 @@ +# Redaction — Phase 0 findings + +Research note for the inline secret redaction fork. Read-only survey of +`src/`, `cli/`, and `hooks/` at upstream `7e06519` (v1.6.0 + fixes). This +note answers the six Phase 0 questions and records the choke-point decision. + +## Pipeline as it exists today + +``` +SessionStart hook (hooks/hooks.json) + └─ cli/episodic-memory.js sync --background + └─ dist/sync-cli.js + ├─ exportOpencodeSessions() opencode.db → /opencode-transcripts/*.jsonl + └─ syncConversations(src, archive) for each source dir + ├─ copyIfNewer(src → archive) byte-for-byte copy + ├─ parseConversation(archive) → exchanges + │ ├─ generateExchangeEmbedding(user, assistant, toolNames) + │ └─ insertExchange() → SQLite exchanges + tool_calls + vec_exchanges + └─ summarizeConversation(exchanges, sessionId) → -summary.txt + +episodic-memory index (cli/index-conversations.js → dist/index-cli.js → indexer.ts) + └─ copyFileSync(src → archive), parseConversation(**src**), embed, insert, summarize + +episodic-memory import-cursor-history (cursor-legacy.ts) + └─ state.vscdb → /cursor-legacy-export/*.jsonl (a sync source dir) + +episodic-memory index --repair (verify.ts) parses archive files, re-embeds, re-summarizes +``` + +## Answers + +### 1. Where does sync copy into the archive? Byte-for-byte or parsed first? + +Byte-for-byte. `copyIfNewer()` in `src/sync.ts` does `fs.copyFileSync` to +`.tmp.` then `renameSync`, then stamps the source mtime on the +destination (the mtime is the "is the archive current?" check on the next +run). Parsing happens **after** the copy, and in `sync.ts` it parses the +archive file, not the source. + +There are three more copy sites, all in `src/indexer.ts` +(`indexConversations`, `indexSession`, `indexUnprocessed`). They also use +`fs.copyFileSync`, but they **parse the source path**, not the archive. That +matters: redacting the archive copy alone would not reach the index on the +`episodic-memory index` path. + +### 2. One shared parse path or one per source? + +One entry point, `parseConversation()` in `src/parser.ts`. It sniffs the file +and dispatches to one of five per-harness parsers (Claude, Codex, Cursor, +opencode, OMP). More important for redaction: every harness reaches the +archive through the same copy step. opencode and legacy Cursor are first +exported from their SQLite stores into staging JSONL directories under the +plugin's config dir (`opencode-transcripts/`, `cursor-legacy-export/`), and +those staging directories are then ordinary sync sources. + +The staging exports are plugin-owned plaintext copies outside any harness's +own retention, so they count as a fourth sink even though the spec's table +doesn't list them. + +### 3. Where is exchange text written to SQLite, and where is the embedding input built? + +- `insertExchange()` in `src/db.ts` writes `exchanges.user_message`, + `exchanges.assistant_message`, `tool_calls.tool_input` (JSON-stringified + tool input), and `tool_calls.tool_result`. Text search (`search.ts`) runs + `LIKE` over `user_message`/`assistant_message`. +- Embedding input is `generateExchangeEmbedding(userMessage, assistantMessage, + toolNames)` in `src/embeddings.ts`, called from `sync.ts`, `indexer.ts`, + `verify.ts`, and `embedding-migration.ts`. The migration re-embeds from the + **SQLite rows**, so it inherits whatever text is already stored. + +All of these are built from the parsed `ConversationExchange` objects, so a +clean parse input gives clean SQLite text and clean embedding input. + +### 4. Where does the summarizer get its input? + +Usually from the parsed exchanges (`formatConversationText(exchanges)`), and +`sync.ts` parses those from the archive. **But two paths bypass the archive +entirely:** + +- **Claude session resume.** For Claude conversations with at most 15 + exchanges, `summarizeConversation()` calls the Agent SDK with + `resume: sessionId`. The SDK loads the **source** transcript from + `~/.claude/projects/...` and sends it to the model. The prompt carries no + transcript text on this path. +- **Codex fork.** For Codex conversations, `callCodex()` runs + `thread/fork` on the **source** rollout via `codex app-server`. Note that + `getCodexSessionId()` derives the id from the exchanges when no + `sessionId` is passed, so passing `undefined` is not enough to stop it. + +Both paths send unredacted source content to a model endpoint no matter what +the archive holds. Redaction therefore has to turn resume and fork off and +force the transcript-text path, which is built from redacted exchanges. + +### 5. How does the `DO NOT INDEX THIS CHAT` marker work? + +`shouldSkipConversation()` in `src/sync.ts` streams a file in 1 MiB chunks +and looks for any of three markers. If the read fails, it fails closed +(skips the file). Sync calls it on the **archive** path, after the copy, to +gate both indexing and summary queueing. So an excluded conversation is +still copied to the archive; only the index and the summarizer skip it. + +The hint holds: the archive file is the reference that every downstream +stage of `sync` reads. The marker check sits right after the archive write, +and that is where the redaction hook belongs. + +### 6. Must the archive stay valid harness JSONL? + +Yes, on two counts: + +- **Structure.** `show.ts` (CLI `show`, MCP `read`) runs `JSON.parse` on every + line, and one invalid line throws. Harness detection in both `parser.ts` + and `show.ts` keys off line shapes (`type`, `payload`, `role`, ...). +- **Line numbers.** `exchanges.line_start`/`line_end` index into archive lines. + MCP `read` takes `startLine`/`endLine`, and incremental indexing resumes + from `MAX(line_end)` (#152). Redaction must keep **exactly one output line + per input line**. + +So redaction parses each line as JSON, redacts string values, and +re-serializes only the lines that changed. Unchanged lines stay +byte-identical. A line that isn't valid JSON (for example, a partially +written last line) is redacted as raw text, because it was already invalid. + +## Decision: choke point (b), the archive write + +Option (a) doesn't exist. No single function sees every source *before* the +archive write. The only place every harness converges is the copy into the +archive itself. + +So the hook goes at the **archive write**, which becomes a redacting copy +(`copyFileRedacted()` in `src/redaction.ts`), and every downstream stage +reads from the archive. Three supporting changes are needed to make +"downstream reads the archive" actually true: + +1. **`indexer.ts` parses the archive, not the source.** All three copy sites + switch to the redacting copy. They now refresh the archive when the source + is newer, as `sync` already does, so parsing the archive loses no data. +2. **Summarizer resume and fork are disabled while redaction is active.** + `summarizeConversation()` gains an `allowResume` option. `sync.ts`, + `indexer.ts`, and `verify.ts` pass `allowResume: false` when a redactor is + active, which forces the transcript-text path built from redacted + exchanges. Trade-off: Codex-only users then summarize through the Claude + transcript path. If no Claude auth is available, that writes a retryable + error sentinel. `EPISODIC_MEMORY_SKIP_SUMMARIES=1` turns summaries off + entirely. +3. **Staging exports are redacted at write time.** The opencode export + (`opencode-sync.ts`) and the Cursor legacy export (`cursor-legacy.ts`) run + each JSONL line through the same `redactJsonlLine()` before writing. They + are plugin-owned copies, and the archive hook alone would leave a + plaintext copy beside it. + +Everything else (SQLite text, `tool_calls`, embeddings, summaries, `show`, +MCP `read`, embedding migration) reads the archive or the rows built from +it, so it inherits clean text with no further hooks. + +## SOPS + +Decrypted SOPS output (`sops -d`, `sops exec-env`) **drops** the `sops:` +metadata block and comes out as plain YAML, JSON, or dotenv. Its shape is +not reliable. There is no dedicated SOPS rule. Coverage comes from the +value-level rules (storage keys, client secrets, connection strings, private +keys) plus the keyword-assignment rule (`password: ...`, `client_secret=...`). +Encrypted values (`ENC[AES256_GCM,data:...]`) are left alone because they +are safe to keep. + +## Windows + +The redaction code is pure Node `fs` plus regex, and it adds no native +dependencies. The temp-file-and-rename pattern already runs on Windows in +upstream `copyIfNewer`. I could **not** verify sqlite-vec or Transformers.js +on Windows from this Linux container. That is unchanged upstream surface, +and it still needs a manual check on a Windows host before rollout. + +## Other observations + +- `embedding-migration.ts` re-embeds from SQLite text. After a + `redact --rewrite` cleans the rows, the migration can't reintroduce + secrets. +- The summarizer's `SummarizerSdkError` keeps up to 300 characters of the + SDK's `result` text in logs and error sentinels. If a model ever echoed a + secret, it would land there. Feeding the summarizer redacted input removes + that source. +- `verify.ts --repair` re-summarizes without a `sessionId`, but the Codex fork + still fires through `getCodexSessionId()`'s fallback. It needs + `allowResume: false` too. From 9b16810c75a779018a98de1cd1618404e1b64f81 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 22:42:53 +0000 Subject: [PATCH 12/33] feat(redaction): redact secrets at the archive write, before index/embed/summarize Adds an inline, rules-driven redaction stage at the one point every harness passes through: the copy into the conversation archive (Phase 0 option b). Secrets become typed tokens ([REDACTED:]); every downstream sink reads the archive, so SQLite text, tool_calls, embeddings, summaries and show/read only see redacted text. - src/redaction.ts: engine, rules loading/validation, JSONL-preserving line redaction, streaming copyFileRedacted. Findings are rule IDs and counts only. Idempotent: tokens never re-match. - src/redaction-rules.ts: bundled defaults ported from gitleaks for this stack (Azure client secret / storage key / SAS / connection strings, private keys, JWT, provider keys, url creds, key=value assignments); git SHA + GUID allowlist; entropy fallback off by default. - sync.ts / indexer.ts: archive copy goes through the redactor; indexer now parses the archive instead of the source. - summarizer: allowResume option; callers disable Claude resume and Codex fork under redaction, since both read the unredacted source transcript. - opencode / legacy Cursor staging exports are redacted at write time. - Fail closed: strict mode (default) aborts sync/index/import when rules fail to load. Env: EPISODIC_MEMORY_REDACTION, _RULES, _STRICT. - `episodic-memory redact --rewrite [--dry-run]` backfills the existing archive, staging dirs and index in place (re-embeds changed rows, deletes summaries built from unredacted text); also --stdin and --print-default-rules. - Tests: per-rule positives, allowlist negatives, idempotency, config, JSONL structure, end-to-end pipeline (archive/SQLite/embedding input/ summarizer input/logs), fail-closed, rewrite. Fake secrets are built at runtime; no literal in the repo matches a rule. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0141gGbp343kbYP6imaJaji2 --- CHANGELOG.md | 17 + README.md | 33 ++ cli/episodic-memory.js | 5 + dist/cursor-legacy.d.ts | 3 + dist/cursor-legacy.js | 9 +- dist/indexer.js | 54 +-- dist/opencode-sync.d.ts | 3 + dist/opencode-sync.js | 13 +- dist/redact-cli.d.ts | 1 + dist/redact-cli.js | 123 +++++++ dist/redact-rewrite.d.ts | 40 +++ dist/redact-rewrite.js | 170 +++++++++ dist/redaction-rules.d.ts | 27 ++ dist/redaction-rules.js | 164 +++++++++ dist/redaction.d.ts | 137 +++++++ dist/redaction.js | 484 +++++++++++++++++++++++++ dist/summarizer.d.ts | 11 +- dist/summarizer.js | 7 +- dist/sync-cli.js | 35 +- dist/sync.d.ts | 15 + dist/sync.js | 43 ++- dist/verify.js | 4 +- docs/REDACTION.md | 167 +++++++++ src/cursor-legacy.ts | 11 +- src/indexer.ts | 59 +-- src/opencode-sync.ts | 17 +- src/redact-cli.ts | 141 ++++++++ src/redact-rewrite.ts | 220 ++++++++++++ src/redaction-rules.ts | 168 +++++++++ src/redaction.ts | 618 ++++++++++++++++++++++++++++++++ src/summarizer.ts | 22 +- src/sync-cli.ts | 36 +- src/sync.ts | 52 ++- src/verify.ts | 4 +- test/fake-secrets.ts | 146 ++++++++ test/redact-rewrite.test.ts | 172 +++++++++ test/redaction-pipeline.test.ts | 353 ++++++++++++++++++ test/redaction.test.ts | 526 +++++++++++++++++++++++++++ 38 files changed, 4034 insertions(+), 76 deletions(-) create mode 100644 dist/redact-cli.d.ts create mode 100644 dist/redact-cli.js create mode 100644 dist/redact-rewrite.d.ts create mode 100644 dist/redact-rewrite.js create mode 100644 dist/redaction-rules.d.ts create mode 100644 dist/redaction-rules.js create mode 100644 dist/redaction.d.ts create mode 100644 dist/redaction.js create mode 100644 docs/REDACTION.md create mode 100644 src/redact-cli.ts create mode 100644 src/redact-rewrite.ts create mode 100644 src/redaction-rules.ts create mode 100644 src/redaction.ts create mode 100644 test/fake-secrets.ts create mode 100644 test/redact-rewrite.test.ts create mode 100644 test/redaction-pipeline.test.ts create mode 100644 test/redaction.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 511074ff..5d74d39d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Security + +- Secrets no longer leak into your conversation memory. Azure client secrets, storage keys, SAS signatures, connection-string passwords, private keys, JWTs, GitHub, Anthropic, OpenAI, and AWS keys, and `password: …` style assignments are now replaced with tokens like `[REDACTED:azure-storage-key]` before a conversation is archived, indexed, embedded, or summarized. Before this, every pasted secret was copied into three new places on disk and could be sent to the summarization model. The rest of the conversation stays searchable, and so do git SHAs and Azure tenant, client, and object IDs. Redaction is on by default and fails closed: if the rules can't load, sync won't run rather than store secrets. +- With redaction on, summaries no longer resume Claude Code sessions or fork Codex threads. Both of those let the model read the original, unredacted transcript. Summaries now come from the redacted text. Codex-only users without Claude configured can set `EPISODIC_MEMORY_SKIP_SUMMARIES=1`. + +### Added + +- `episodic-memory redact --rewrite` cleans data you indexed before upgrading. It redacts the archive and the search index in place, re-embeds only the messages that changed, and deletes summaries built from unredacted text so they regenerate. Use `--dry-run` to preview. +- Custom redaction rules via `~/.config/superpowers/redaction-rules.json`, which extends the bundled defaults. Try rules with `episodic-memory redact --stdin`. See `docs/REDACTION.md`. +- New settings: `EPISODIC_MEMORY_REDACTION` (`on`/`off`), `EPISODIC_MEMORY_REDACTION_RULES`, and `EPISODIC_MEMORY_REDACTION_STRICT`. + +### Changed + +- `episodic-memory index` now parses the archived copy instead of the source transcript, and refreshes that copy when the source has grown. This is the same behavior `sync` already had. + ## [1.6.0] - 2026-09-08 Adds a fifth conversation source, an off switch for automatic syncing, and two fixes for real-world resource problems. diff --git a/README.md b/README.md index ee952317..c8105431 100644 --- a/README.md +++ b/README.md @@ -327,6 +327,17 @@ Add to `.claude/hooks/session-end`: episodic-memory sync ``` +### `episodic-memory redact` + +```bash +episodic-memory redact --rewrite --dry-run # what would change +episodic-memory redact --rewrite # redact the existing archive + index in place +episodic-memory redact --stdin < file.jsonl # try the rules on some text +episodic-memory redact --print-default-rules +``` + +See [docs/REDACTION.md](docs/REDACTION.md). + ### `episodic-memory stats` Display index statistics including conversation counts, date ranges, and project breakdown. @@ -415,6 +426,28 @@ open output.html 4. **Index** - Stores in SQLite with sqlite-vec for fast similarity search 5. **Search** - Semantic search using vector similarity or exact text matching +## Secret Redaction + +Secrets in your conversations (Azure client secrets, storage keys, SAS +signatures, connection-string passwords, private keys, JWTs, provider API keys, +`password: …` assignments) are replaced with typed tokens such as +`[REDACTED:azure-storage-key]` **before** anything is archived, indexed, +embedded, or sent to the summarizer. Git SHAs and GUIDs are never redacted, so +they stay searchable. The tokens are searchable too. + +Redaction is on by default and fails closed: if the rules can't be loaded, sync +won't run. After upgrading, run `episodic-memory redact --rewrite` once to clean +data you indexed before. + +| Variable | Default | Meaning | +|---|---|---| +| `EPISODIC_MEMORY_REDACTION` | `on` | `off` disables redaction | +| `EPISODIC_MEMORY_REDACTION_RULES` | `/redaction-rules.json` | Custom rules file (extends the defaults) | +| `EPISODIC_MEMORY_REDACTION_STRICT` | `1` | `0` continues unredacted (with a warning) when rules fail to load | + +See [docs/REDACTION.md](docs/REDACTION.md) for the rule list, the custom-rules +format, and what is and isn't covered. + ## Excluding Conversations Conversations containing this marker anywhere in their content will be archived but not indexed: diff --git a/cli/episodic-memory.js b/cli/episodic-memory.js index 08ebccc8..45c61da1 100755 --- a/cli/episodic-memory.js +++ b/cli/episodic-memory.js @@ -44,6 +44,7 @@ COMMANDS: stats Show index statistics doctor Diagnose Claude Code or Codex integration issues import-cursor-history Export legacy Cursor conversations from state.vscdb for indexing + redact Re-run secret redaction over the archive and index (--rewrite) Run 'episodic-memory --help' for command-specific help. @@ -94,6 +95,10 @@ async function main() { await runScript(join(distDir, 'cursor-import-cli.js'), args); break; + case 'redact': + await runScript(join(distDir, 'redact-cli.js'), args); + break; + case '--help': case '-h': case undefined: diff --git a/dist/cursor-legacy.d.ts b/dist/cursor-legacy.d.ts index a035ba0f..77340197 100644 --- a/dist/cursor-legacy.d.ts +++ b/dist/cursor-legacy.d.ts @@ -1,3 +1,4 @@ +import { type Redactor } from './redaction.js'; export declare function getDefaultCursorVscdbPath(): string | undefined; /** * Collect composer IDs that already have live agent transcripts under @@ -14,6 +15,8 @@ export interface CursorLegacyImportOptions { force?: boolean; /** Report what would be exported without writing files. */ dryRun?: boolean; + /** `undefined` loads from the environment (strict mode throws on bad rules); `null` disables. */ + redactor?: Redactor | null; } export interface CursorLegacyImportResult { exported: number; diff --git a/dist/cursor-legacy.js b/dist/cursor-legacy.js index 811e5637..7b140e0c 100644 --- a/dist/cursor-legacy.js +++ b/dist/cursor-legacy.js @@ -3,6 +3,7 @@ import os from 'os'; import path from 'path'; import Database from 'better-sqlite3'; import { detectCursorCwd } from './parser.js'; +import { loadRedactor, redactJsonlLine } from './redaction.js'; /** * Import legacy Cursor conversations from Cursor's global SQLite store * (state.vscdb) into JSONL files compatible with the Cursor transcript parser. @@ -111,6 +112,7 @@ export function importCursorLegacy(options) { skippedEmpty: 0, errors: [], }; + const redactor = options.redactor === undefined ? loadRedactor() : options.redactor; const liveIds = options.liveTranscriptIds ?? new Set(); const db = new Database(options.dbPath, { readonly: true, fileMustExist: true }); try { @@ -200,9 +202,14 @@ export function importCursorLegacy(options) { if (!options.dryRun) { // Re-serialize with cwd now that it's known (it's derived from the // whole conversation's tool calls). - const finalLines = cwd + const withCwd = cwd ? lines.map(line => JSON.stringify({ ...JSON.parse(line), cwd })) : lines; + // The export dir is a plugin-owned plaintext copy, so redact it at + // write time like the archive (docs/redaction/PHASE0-FINDINGS.md). + const finalLines = redactor + ? withCwd.map(line => redactJsonlLine(line, redactor, { source: 'cursor-legacy', path: outFile })) + : withCwd; fs.mkdirSync(path.dirname(outFile), { recursive: true }); fs.writeFileSync(outFile, finalLines.join('\n') + '\n', 'utf-8'); // Stamp the conversation's end time so mtime-based fallbacks and diff --git a/dist/indexer.js b/dist/indexer.js index 8afa1d35..5b4c803d 100644 --- a/dist/indexer.js +++ b/dist/indexer.js @@ -7,6 +7,8 @@ import { summarizeConversation } from './summarizer.js'; import { getArchiveDir, getExcludedProjects, getConversationSourceDirs, findJsonlFiles, statIfExists } from './paths.js'; import { formatErrorSentinel, shouldQueueForSummary } from './summary-sentinel.js'; import { getMaxMessageBytes, isOversizeExchange } from './message-size.js'; +import { FindingsTally, formatFindings, loadRedactor } from './redaction.js'; +import { copyIfNewer } from './sync.js'; // Set max output tokens for Claude SDK (used by summarizer) process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS = '20000'; // Increase max listeners for concurrent API calls @@ -25,7 +27,18 @@ async function processBatch(items, processor, concurrency) { function sessionIdForSummary(exchanges) { return exchanges.find(exchange => exchange.sessionId)?.sessionId; } +// Resume/fork would summarize the unredacted source transcript; see sync.ts. +function summarizeOptions(redactor) { + return { allowResume: redactor === null }; +} +function logRedactions(tally) { + if (tally.total > 0) + console.log(` Redaction: ${formatFindings(tally.toArray())}`); +} export async function indexConversations(limitToProject, maxConversations, concurrency = 1, noSummaries = false) { + // Load before touching the archive: strict mode fails closed here. + const redactor = loadRedactor(); + const tally = new FindingsTally(); console.log('Initializing database...'); const db = initDatabase(); console.log('Loading embedding model...'); @@ -73,14 +86,13 @@ export async function indexConversations(limitToProject, maxConversations, concu // Source transcripts can vanish mid-run (Claude Code cleanup). Skip loudly. let exchanges; try { - // Copy to archive (ensure parent dirs exist for subagent files) - if (!fs.existsSync(archivePath)) { - fs.mkdirSync(path.dirname(archivePath), { recursive: true }); - fs.copyFileSync(sourcePath, archivePath); + // Copy (redacted) to the archive, then parse the archive, so the index + // and summaries only ever see redacted text. + if (copyIfNewer(sourcePath, archivePath, redactor, tally)) { console.log(` Archived: ${file}`); } // Parse conversation - exchanges = await parseConversation(sourcePath, project, archivePath); + exchanges = await parseConversation(archivePath, project, archivePath); } catch (error) { console.log(` Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); @@ -105,7 +117,7 @@ export async function indexConversations(limitToProject, maxConversations, concu console.log(` Generating ${needsSummary.length} summaries (concurrency: ${concurrency})...`); await processBatch(needsSummary, async (conv) => { try { - const summary = await summarizeConversation(conv.exchanges, sessionIdForSummary(conv.exchanges)); + const summary = await summarizeConversation(conv.exchanges, sessionIdForSummary(conv.exchanges), summarizeOptions(redactor)); fs.writeFileSync(conv.summaryPath, summary, 'utf-8'); const wordCount = summary.split(/\s+/).length; console.log(` ✓ ${conv.file}: ${wordCount} words`); @@ -145,6 +157,7 @@ export async function indexConversations(limitToProject, maxConversations, concu // Check if we hit the limit if (maxConversations && conversationsProcessed >= maxConversations) { console.log(`\nReached limit of ${maxConversations} conversations`); + logRedactions(tally); db.close(); console.log(`✅ Indexing complete! Conversations: ${conversationsProcessed}, Exchanges: ${totalExchanges}`); return; @@ -155,11 +168,14 @@ export async function indexConversations(limitToProject, maxConversations, concu if (oversizeSkipped > 0) { console.log(` Skipped ${oversizeSkipped} oversize exchange(s) (> ${maxMessageBytes} bytes; set EPISODIC_MEMORY_MAX_MESSAGE_BYTES to change) — likely embedded-transcript payloads (#139)`); } + logRedactions(tally); db.close(); console.log(`\n✅ Indexing complete! Conversations: ${conversationsProcessed}, Exchanges: ${totalExchanges}`); } export async function indexSession(sessionId, concurrency = 1, noSummaries = false) { console.log(`Indexing session: ${sessionId}`); + const redactor = loadRedactor(); + const tally = new FindingsTally(); // Find the conversation file for this session const sourceDirs = getConversationSourceDirs(); const ARCHIVE_DIR = getArchiveDir(); @@ -187,11 +203,8 @@ export async function indexSession(sessionId, concurrency = 1, noSummaries = fal // Archive + parse — source may vanish mid-run (Claude Code cleanup). let exchanges; try { - if (!fs.existsSync(archivePath)) { - fs.mkdirSync(path.dirname(archivePath), { recursive: true }); - fs.copyFileSync(sourcePath, archivePath); - } - exchanges = await parseConversation(sourcePath, project, archivePath); + copyIfNewer(sourcePath, archivePath, redactor, tally); + exchanges = await parseConversation(archivePath, project, archivePath); } catch (error) { console.log(`Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); @@ -204,7 +217,7 @@ export async function indexSession(sessionId, concurrency = 1, noSummaries = fal if (!noSummaries && shouldQueueForSummary(summaryPath)) { fs.mkdirSync(path.dirname(summaryPath), { recursive: true }); try { - const summary = await summarizeConversation(exchanges, sessionIdForSummary(exchanges)); + const summary = await summarizeConversation(exchanges, sessionIdForSummary(exchanges), summarizeOptions(redactor)); fs.writeFileSync(summaryPath, summary, 'utf-8'); console.log(`Summary: ${summary.split(/\s+/).length} words`); } @@ -235,6 +248,7 @@ export async function indexSession(sessionId, concurrency = 1, noSummaries = fal if (oversizeSkipped > 0) { console.log(` Skipped ${oversizeSkipped} oversize exchange(s) (> ${maxMessageBytes} bytes; set EPISODIC_MEMORY_MAX_MESSAGE_BYTES to change) — likely embedded-transcript payloads (#139)`); } + logRedactions(tally); console.log(`✅ Indexed session ${sessionId}: ${exchanges.length} exchanges`); } db.close(); @@ -254,6 +268,8 @@ export async function indexUnprocessed(concurrency = 1, noSummaries = false) { console.log(`Concurrency: ${concurrency}`); if (noSummaries) console.log('⚠️ Running in no-summaries mode (skipping AI summaries)'); + const redactor = loadRedactor(); + const tally = new FindingsTally(); const db = initDatabase(); await initEmbeddings(); const sourceDirs = getConversationSourceDirs(); @@ -280,15 +296,12 @@ export async function indexUnprocessed(concurrency = 1, noSummaries = false) { // Transcript JSONLs are append-only, so MAX(line_end) tells us where to resume. const hw = db.prepare('SELECT COALESCE(MAX(line_end), 0) as maxLine FROM exchanges WHERE archive_path = ?').get(archivePath); const maxIndexedLine = hw.maxLine; - // Ensure parent dirs exist for subagent files try { - fs.mkdirSync(path.dirname(archivePath), { recursive: true }); - // Refresh the archive when the source may have grown beyond what we've seen. - if (!fs.existsSync(archivePath) || maxIndexedLine > 0) { - fs.copyFileSync(sourcePath, archivePath); - } + // Refresh the (redacted) archive when the source has grown, then parse + // the archive so the index only sees redacted text. + copyIfNewer(sourcePath, archivePath, redactor, tally); // Parse and filter to exchanges past the high-water mark - const exchanges = await parseConversation(sourcePath, project, archivePath); + const exchanges = await parseConversation(archivePath, project, archivePath); const newExchanges = maxIndexedLine > 0 ? exchanges.filter(e => e.lineStart > maxIndexedLine) : exchanges; @@ -303,6 +316,7 @@ export async function indexUnprocessed(concurrency = 1, noSummaries = false) { } } } // end sourceDir loop + logRedactions(tally); if (unprocessed.length === 0) { console.log('✅ All conversations are already processed!'); db.close(); @@ -316,7 +330,7 @@ export async function indexUnprocessed(concurrency = 1, noSummaries = false) { console.log(`Generating ${needsSummary.length} summaries (concurrency: ${concurrency})...\n`); await processBatch(needsSummary, async (conv) => { try { - const summary = await summarizeConversation(conv.exchanges, sessionIdForSummary(conv.exchanges)); + const summary = await summarizeConversation(conv.exchanges, sessionIdForSummary(conv.exchanges), summarizeOptions(redactor)); fs.writeFileSync(conv.summaryPath, summary, 'utf-8'); const wordCount = summary.split(/\s+/).length; console.log(` ✓ ${conv.project}/${conv.file}: ${wordCount} words`); diff --git a/dist/opencode-sync.d.ts b/dist/opencode-sync.d.ts index fff32c4c..64215225 100644 --- a/dist/opencode-sync.d.ts +++ b/dist/opencode-sync.d.ts @@ -1,3 +1,4 @@ +import { type Redactor } from './redaction.js'; export interface OpencodeExportResult { exported: number; skipped: number; @@ -15,4 +16,6 @@ export declare function getOpencodeTranscriptFilePath(transcriptDir: string, inp export declare function exportOpencodeSessions(options?: { dbPath?: string; transcriptDir?: string; + /** `undefined` loads from the environment (strict mode throws on bad rules); `null` disables. */ + redactor?: Redactor | null; }): OpencodeExportResult; diff --git a/dist/opencode-sync.js b/dist/opencode-sync.js index 2f90ab75..c4bd4a8b 100644 --- a/dist/opencode-sync.js +++ b/dist/opencode-sync.js @@ -2,6 +2,7 @@ import fs from 'fs'; import path from 'path'; import Database from 'better-sqlite3'; import { getOpencodeDbPath, getOpencodeTranscriptDir } from './paths.js'; +import { loadRedactor, redactJsonlLine } from './redaction.js'; function safeParseJson(value) { if (!value) return undefined; @@ -40,7 +41,7 @@ function shouldExportSession(filePath, sessionUpdatedMs) { const stat = fs.statSync(filePath); return Math.floor(stat.mtimeMs) < Math.floor(sessionUpdatedMs); } -function writeSessionTranscript(db, session, filePath) { +function writeSessionTranscript(db, session, filePath, redactor) { const messages = db.prepare(` SELECT id, session_id, time_created, time_updated, data FROM message @@ -115,14 +116,20 @@ function writeSessionTranscript(db, session, filePath) { parts, })); } + // The staging transcript is a plugin-owned plaintext copy, so redact it at + // write time like the archive (docs/redaction/PHASE0-FINDINGS.md). + const output = redactor + ? lines.map(line => redactJsonlLine(line, redactor, { source: 'opencode', path: filePath })) + : lines; fs.mkdirSync(path.dirname(filePath), { recursive: true }); const tempPath = `${filePath}.tmp.${process.pid}`; - fs.writeFileSync(tempPath, `${lines.join('\n')}\n`, 'utf-8'); + fs.writeFileSync(tempPath, `${output.join('\n')}\n`, 'utf-8'); fs.renameSync(tempPath, filePath); const mtime = dateFromMillis(session.time_updated); fs.utimesSync(filePath, mtime, mtime); } export function exportOpencodeSessions(options = {}) { + const redactor = options.redactor === undefined ? loadRedactor() : options.redactor; const dbPath = options.dbPath || getOpencodeDbPath(); const transcriptDir = options.transcriptDir || getOpencodeTranscriptDir(); const result = { @@ -168,7 +175,7 @@ export function exportOpencodeSessions(options = {}) { result.skipped++; continue; } - writeSessionTranscript(db, session, filePath); + writeSessionTranscript(db, session, filePath, redactor); result.exported++; } catch (error) { diff --git a/dist/redact-cli.d.ts b/dist/redact-cli.d.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/dist/redact-cli.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/dist/redact-cli.js b/dist/redact-cli.js new file mode 100644 index 00000000..97044bb2 --- /dev/null +++ b/dist/redact-cli.js @@ -0,0 +1,123 @@ +import fs from 'fs'; +import { getArchiveDir, getCursorLegacyExportDir, getOpencodeTranscriptDir } from './paths.js'; +import { acquireFileLock, readLockHolder, releaseFileLock } from './file-lock.js'; +import { getSyncLockPath } from './logging.js'; +import { DEFAULT_REDACTION_CONFIG, FindingsTally, formatFindings, getRedactionSettings, loadRedactor, redactJsonlLine, } from './redaction.js'; +const args = process.argv.slice(2); +const HELP = ` +Usage: episodic-memory redact [--rewrite [--dry-run]] [--stdin] [--print-default-rules] + +Secret redaction for the conversation archive and index. + +OPTIONS: + --rewrite Re-run redaction over the existing archive, staging exports, + and search index (in place). Rows that change are re-embedded, + and summaries built from unredacted text are deleted (the next + sync regenerates them). Run once after upgrading, and again + after adding rules. + --dry-run With --rewrite: report what would change, write nothing. + --stdin Redact stdin to stdout, one JSONL/text line at a time, and + print rule counts to stderr. Handy for testing rules. + --print-default-rules Print the bundled rules as JSON (a starting point for + redaction-rules.json). + --help, -h Show this help + +ENVIRONMENT: + EPISODIC_MEMORY_REDACTION on (default) | off + EPISODIC_MEMORY_REDACTION_RULES custom rules file (default: /redaction-rules.json) + EPISODIC_MEMORY_REDACTION_STRICT 1 (default) fails closed on a bad rules file | 0 passes through + +Output names rule IDs and counts only; matched values are never printed. +`; +function fail(message) { + console.error(`episodic-memory: ${message}`); + process.exit(1); +} +function requireRedactor() { + if (!getRedactionSettings().enabled) { + fail('redaction is off (EPISODIC_MEMORY_REDACTION=off); unset it to use this command.'); + } + let redactor; + try { + // Always strict here: a rewrite with no rules would be a silent no-op. + redactor = loadRedactor({ ...process.env, EPISODIC_MEMORY_REDACTION_STRICT: '1' }); + } + catch (error) { + fail(error instanceof Error ? error.message : String(error)); + } + return redactor; +} +async function runRewrite(dryRun) { + const redactor = requireRedactor(); + // Share sync's single-instance lock so a background sync can't write + // between our reads and renames. + const lockPath = getSyncLockPath(); + const lock = acquireFileLock(lockPath); + if (!lock) { + const holder = readLockHolder(lockPath); + fail(`a sync or index run is in progress (${holder !== null ? `pid ${holder}` : 'another process'}); try again when it finishes.`); + } + const release = () => releaseFileLock(lock); + process.on('exit', release); + const { rewriteArchive } = await import('./redact-rewrite.js'); + let embeddingsReady = false; + const embed = async (user, assistant, toolNames) => { + const embeddings = await import('./embeddings.js'); + if (!embeddingsReady) { + await embeddings.initEmbeddings(); + embeddingsReady = true; + } + return embeddings.generateExchangeEmbedding(user, assistant, toolNames); + }; + const archiveDir = getArchiveDir(); + const stagingDirs = [getOpencodeTranscriptDir(), getCursorLegacyExportDir()].filter(d => fs.existsSync(d)); + console.log(`Redacting${dryRun ? ' (dry run)' : ''}: ${archiveDir}`); + for (const dir of stagingDirs) + console.log(` + staging: ${dir}`); + const result = await rewriteArchive({ + archiveDir, + stagingDirs, + redactor, + embed, + dryRun, + log: message => console.log(` ${message}`), + }); + console.log(`\n${dryRun ? 'Would redact' : 'Redacted'} across archive, staging, and index: ${formatFindings(result.findings)}`); + if (dryRun && (result.filesRewritten || result.rowsUpdated || result.summariesRemoved || result.stagingFilesRewritten)) { + console.log('Run without --dry-run to apply.'); + } +} +async function runStdin() { + const redactor = requireRedactor(); + const chunks = []; + for await (const chunk of process.stdin) + chunks.push(chunk); + const input = Buffer.concat(chunks).toString('utf-8'); + const tally = new FindingsTally(); + const output = input.split('\n').map(line => redactJsonlLine(line, redactor, { source: 'stdin', path: '-' }, tally)); + process.stdout.write(output.join('\n')); + console.error(formatFindings(tally.toArray())); +} +async function main() { + if (args.length === 0 || args.includes('--help') || args.includes('-h')) { + console.log(HELP); + return; + } + if (args.includes('--print-default-rules')) { + console.log(JSON.stringify(DEFAULT_REDACTION_CONFIG, null, 2)); + return; + } + if (args.includes('--stdin')) { + await runStdin(); + return; + } + if (args.includes('--rewrite')) { + await runRewrite(args.includes('--dry-run')); + return; + } + fail(`unknown option(s): ${args.join(' ')}. Try: episodic-memory redact --help`); +} +main().catch(error => { + console.error('Error:', error instanceof Error ? error.message : error); + process.exit(1); +}); diff --git a/dist/redact-rewrite.d.ts b/dist/redact-rewrite.d.ts new file mode 100644 index 00000000..0900d8e4 --- /dev/null +++ b/dist/redact-rewrite.d.ts @@ -0,0 +1,40 @@ +import { type RedactionFinding, type Redactor } from './redaction.js'; +/** + * Backfill for `episodic-memory redact --rewrite`: re-run redaction over data + * written before redaction existed (or before a rule was added). + * + * 1. Archive: every .jsonl is redacted in place. Line count and mtime are + * preserved, so index line ranges stay valid and sync still sees the + * archive as current. + * 2. Staging dirs (opencode / legacy Cursor exports): same, in place. + * 3. Index: every exchanges/tool_calls row is redacted in place. Changed rows + * are re-embedded from the redacted text, so no vector is left that was + * derived from a secret. + * 4. Summaries: a `-summary.txt` for a conversation that had findings (in the + * archive or the index), or one that matches a rule itself, is deleted. + * It was generated from unredacted text, and the next sync regenerates it + * from the redacted archive. + * + * Idempotent: a second run finds nothing to change. + */ +export type EmbedFn = (user: string, assistant: string, toolNames?: string[]) => Promise; +export interface RewriteOptions { + archiveDir: string; + redactor: Redactor; + embed: EmbedFn; + /** Count what would change without writing anything. */ + dryRun?: boolean; + /** Plugin-owned staging dirs to redact in place (not indexed). */ + stagingDirs?: string[]; + log?: (message: string) => void; +} +export interface RewriteResult { + filesScanned: number; + filesRewritten: number; + stagingFilesRewritten: number; + rowsUpdated: number; + summariesRemoved: number; + /** Rule IDs and counts only — never matched values. */ + findings: RedactionFinding[]; +} +export declare function rewriteArchive(options: RewriteOptions): Promise; diff --git a/dist/redact-rewrite.js b/dist/redact-rewrite.js new file mode 100644 index 00000000..7c0317f6 --- /dev/null +++ b/dist/redact-rewrite.js @@ -0,0 +1,170 @@ +import fs from 'fs'; +import path from 'path'; +import { initDatabase } from './db.js'; +import { recordReembedded } from './embedding-migration.js'; +import { copyFileRedacted, FindingsTally, redactJsonlLine, } from './redaction.js'; +const SUMMARY_SUFFIX = '-summary.txt'; +const PAGE_SIZE = 500; +function walk(dir) { + const out = []; + let entries; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } + catch { + return out; + } + for (const entry of entries) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) + out.push(...walk(full)); + else if (entry.isFile()) + out.push(full); + } + return out; +} +function summaryPathFor(jsonlPath) { + return jsonlPath.replace(/\.jsonl$/, SUMMARY_SUFFIX); +} +/** Redact one JSONL file in place. Returns the number of values redacted. */ +function rewriteFileInPlace(file, redactor, dryRun, tally) { + const fileTally = new FindingsTally(); + const temp = `${file}.redact.${process.pid}`; + try { + copyFileRedacted(file, temp, redactor, { source: 'rewrite', path: file }, fileTally); + if (fileTally.total > 0 && !dryRun) { + const stat = fs.statSync(file); + fs.renameSync(temp, file); + // Same rounding as sync's copyIfNewer: never leave the archive older than its source. + fs.utimesSync(file, stat.atimeMs / 1000, Math.ceil(stat.mtimeMs) / 1000); + } + } + finally { + try { + fs.unlinkSync(temp); + } + catch { } + } + tally.add(fileTally.toArray()); + return fileTally.total; +} +export async function rewriteArchive(options) { + const { archiveDir, redactor, embed } = options; + const dryRun = options.dryRun === true; + const log = options.log ?? (() => { }); + const tally = new FindingsTally(); + const result = { + filesScanned: 0, + filesRewritten: 0, + stagingFilesRewritten: 0, + rowsUpdated: 0, + summariesRemoved: 0, + findings: [], + }; + // Conversations whose summary was built from unredacted text. + const staleSummaries = new Set(); + // 1. Archive files. + const archiveFiles = walk(archiveDir); + for (const file of archiveFiles.filter(f => f.endsWith('.jsonl'))) { + result.filesScanned++; + if (rewriteFileInPlace(file, redactor, dryRun, tally) > 0) { + result.filesRewritten++; + staleSummaries.add(summaryPathFor(file)); + } + } + log(`Archive: ${result.filesRewritten} of ${result.filesScanned} file(s) ${dryRun ? 'would be ' : ''}rewritten`); + // 2. Staging dirs. + for (const dir of options.stagingDirs ?? []) { + for (const file of walk(dir).filter(f => f.endsWith('.jsonl'))) { + if (rewriteFileInPlace(file, redactor, dryRun, tally) > 0) + result.stagingFilesRewritten++; + } + } + if (options.stagingDirs?.length) { + log(`Staging exports: ${result.stagingFilesRewritten} file(s) ${dryRun ? 'would be ' : ''}rewritten`); + } + // 3. Index rows. Page by rowid so writes between pages don't disturb the scan. + const db = initDatabase(); + try { + const page = db.prepare('SELECT rowid AS rid, id, user_message, assistant_message, archive_path FROM exchanges WHERE rowid > ? ORDER BY rowid LIMIT ?'); + const toolsFor = db.prepare('SELECT id, tool_name, tool_input, tool_result FROM tool_calls WHERE exchange_id = ? ORDER BY rowid'); + const updateExchange = db.prepare('UPDATE exchanges SET user_message = ?, assistant_message = ? WHERE id = ?'); + const updateTool = db.prepare('UPDATE tool_calls SET tool_input = ?, tool_result = ? WHERE id = ?'); + let lastRowid = 0; + for (;;) { + const rows = page.all(lastRowid, PAGE_SIZE); + if (rows.length === 0) + break; + lastRowid = rows[rows.length - 1].rid; + for (const row of rows) { + const rowTally = new FindingsTally(); + const ctx = { source: 'index', path: row.archive_path }; + const user = redactor.redact(row.user_message, ctx); + const assistant = redactor.redact(row.assistant_message, ctx); + rowTally.add(user.findings); + rowTally.add(assistant.findings); + const tools = toolsFor.all(row.id); + const toolUpdates = []; + for (const tool of tools) { + // tool_input is JSON text; redactJsonlLine keeps it valid JSON. + const input = tool.tool_input === null ? null : redactJsonlLine(tool.tool_input, redactor, ctx, rowTally); + let output = tool.tool_result; + if (output !== null) { + const r = redactor.redact(output, ctx); + rowTally.add(r.findings); + output = r.text; + } + if (input !== tool.tool_input || output !== tool.tool_result) { + toolUpdates.push({ id: tool.id, input, result: output }); + } + } + if (rowTally.total === 0) + continue; + tally.add(rowTally.toArray()); + result.rowsUpdated++; + staleSummaries.add(summaryPathFor(row.archive_path)); + if (dryRun) + continue; + const toolNames = tools.length > 0 ? tools.map(t => t.tool_name) : undefined; + const embedding = await embed(user.text, assistant.text, toolNames); + db.transaction(() => { + updateExchange.run(user.text, assistant.text, row.id); + for (const t of toolUpdates) + updateTool.run(t.input, t.result, t.id); + recordReembedded(db, row.id, embedding); + })(); + } + } + } + finally { + db.close(); + } + log(`Index: ${result.rowsUpdated} exchange(s) ${dryRun ? 'would be ' : ''}redacted and re-embedded`); + // 4. Summaries: stale ones, plus any summary that itself matches a rule. + for (const file of archiveFiles.filter(f => f.endsWith(SUMMARY_SUFFIX))) { + if (staleSummaries.has(file)) + continue; + let text; + try { + text = fs.readFileSync(file, 'utf-8'); + } + catch { + continue; + } + const r = redactor.redact(text, { source: 'summary', path: file }); + if (r.findings.length > 0) { + tally.add(r.findings); + staleSummaries.add(file); + } + } + for (const summary of staleSummaries) { + if (!fs.existsSync(summary)) + continue; + result.summariesRemoved++; + if (!dryRun) + fs.unlinkSync(summary); + } + log(`Summaries: ${result.summariesRemoved} ${dryRun ? 'would be ' : ''}removed (regenerated from redacted text on the next sync)`); + result.findings = tally.toArray(); + return result; +} diff --git a/dist/redaction-rules.d.ts b/dist/redaction-rules.d.ts new file mode 100644 index 00000000..a9fa089b --- /dev/null +++ b/dist/redaction-rules.d.ts @@ -0,0 +1,27 @@ +import type { RedactionConfig } from './redaction.js'; +/** + * Bundled default redaction rules. + * + * Patterns are ported from gitleaks' rule set (https://github.com/gitleaks/gitleaks, + * MIT), trimmed to the credentials that realistically show up in Claude Code / + * Codex transcripts for an Azure-heavy stack, and rewritten for JavaScript + * regex (lookbehind instead of gitleaks' consuming boundary groups, so + * adjacent matches aren't swallowed). + * + * Order matters: rules run top to bottom, and a later rule never re-matches + * inside an earlier rule's `[REDACTED:...]` token. Specific shapes go first so + * the token names the most precise rule; the generic `secret-assignment` + * keyword rule goes last. + * + * `secretGroup` replaces only that capture group, so surrounding context + * (connection-string server names, SAS URL paths, usernames) stays searchable. + * + * `keywords` is a case-insensitive prefilter: a rule only runs on text that + * contains at least one keyword. It keeps the per-string cost low on large + * transcripts and bounds the generic rules' work. + * + * Users extend or override these with `redaction-rules.json`; see + * docs/REDACTION.md. `episodic-memory redact --print-default-rules` dumps + * this object as JSON. + */ +export declare const DEFAULT_REDACTION_CONFIG: RedactionConfig; diff --git a/dist/redaction-rules.js b/dist/redaction-rules.js new file mode 100644 index 00000000..5adc1c46 --- /dev/null +++ b/dist/redaction-rules.js @@ -0,0 +1,164 @@ +/** + * Bundled default redaction rules. + * + * Patterns are ported from gitleaks' rule set (https://github.com/gitleaks/gitleaks, + * MIT), trimmed to the credentials that realistically show up in Claude Code / + * Codex transcripts for an Azure-heavy stack, and rewritten for JavaScript + * regex (lookbehind instead of gitleaks' consuming boundary groups, so + * adjacent matches aren't swallowed). + * + * Order matters: rules run top to bottom, and a later rule never re-matches + * inside an earlier rule's `[REDACTED:...]` token. Specific shapes go first so + * the token names the most precise rule; the generic `secret-assignment` + * keyword rule goes last. + * + * `secretGroup` replaces only that capture group, so surrounding context + * (connection-string server names, SAS URL paths, usernames) stays searchable. + * + * `keywords` is a case-insensitive prefilter: a rule only runs on text that + * contains at least one keyword. It keeps the per-string cost low on large + * transcripts and bounds the generic rules' work. + * + * Users extend or override these with `redaction-rules.json`; see + * docs/REDACTION.md. `episodic-memory redact --print-default-rules` dumps + * this object as JSON. + */ +export const DEFAULT_REDACTION_CONFIG = { + rules: [ + { + id: 'private-key-block', + description: 'PEM/OpenSSH private key block; a truncated block (no END line) is redacted to the end of the text', + pattern: String.raw `-----BEGIN[A-Z0-9 _-]{0,40}PRIVATE KEY(?: BLOCK)?-----[\s\S]*?(?:-----END[A-Z0-9 _-]{0,40}PRIVATE KEY(?: BLOCK)?-----|$)`, + keywords: ['private key'], + }, + { + id: 'connection-string-secret', + description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept', + pattern: String.raw `\b(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password|Pwd)[ \t]*=[ \t]*(?![\[$<{%])([^;"'\s]+)`, + secretGroup: 1, + keywords: ['accountkey', 'sharedaccess', 'sharedsecret', 'clientsecret', 'password', 'pwd'], + }, + { + id: 'azure-sas-token', + description: 'Signature of an Azure SAS token; the resource URL and other SAS parameters are kept', + pattern: String.raw `\bsig=([A-Za-z0-9%+/=_-]{16,})`, + secretGroup: 1, + keywords: ['sig='], + }, + { + id: 'jwt', + description: 'JSON Web Token (Entra ID / Azure access tokens, id tokens)', + pattern: String.raw `\beyJ[A-Za-z0-9_-]{8,}\.eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}`, + keywords: ['eyj'], + }, + { + id: 'anthropic-api-key', + pattern: String.raw `\bsk-ant-[a-z]{2,10}\d{2}-[A-Za-z0-9_-]{32,}`, + keywords: ['sk-ant-'], + }, + { + id: 'openai-api-key', + pattern: String.raw `\bsk-(?:[a-z]+-)?[A-Za-z0-9_-]{16,}T3BlbkFJ[A-Za-z0-9_-]{16,}`, + keywords: ['t3blbkfj'], + }, + { + id: 'github-token', + description: 'GitHub classic, OAuth, app and fine-grained tokens', + pattern: String.raw `\b(?:gh[pousr]_[A-Za-z0-9]{36,255}|github_pat_[A-Za-z0-9_]{22,255})\b`, + keywords: ['ghp_', 'gho_', 'ghu_', 'ghs_', 'ghr_', 'github_pat_'], + }, + { + id: 'aws-access-key-id', + pattern: String.raw `\b(?:AKIA|ASIA|ABIA|ACCA)[A-Z2-7]{16}\b`, + keywords: ['akia', 'asia', 'abia', 'acca'], + }, + { + id: 'aws-secret-access-key', + pattern: String.raw `aws[_-]?secret[_-]?access[_-]?key["']?[ \t]*[:=][ \t]*["']?([A-Za-z0-9/+]{40})(?![A-Za-z0-9/+])`, + flags: 'i', + secretGroup: 1, + keywords: ['secret'], + }, + { + id: 'slack-token', + pattern: String.raw `\bxox[abposr]-[A-Za-z0-9-]{10,}`, + keywords: ['xox'], + }, + { + id: 'google-api-key', + pattern: String.raw `\bAIza[0-9A-Za-z_-]{35}(?![0-9A-Za-z_-])`, + keywords: ['aiza'], + }, + { + id: 'npm-token', + pattern: String.raw `\bnpm_[A-Za-z0-9]{36}\b`, + keywords: ['npm_'], + }, + { + id: 'azure-client-secret', + description: 'Entra ID (Azure AD) application client secret: 3 chars, a digit, "Q~", 31-34 chars', + pattern: String.raw `(?]+:(?![\[$<{%])([^\s@/"'<>]+)@`, + secretGroup: 1, + keywords: ['://'], + }, + { + id: 'bearer-token', + pattern: String.raw `\bBearer\s+([A-Za-z0-9\-._~+/]{20,}=*)`, + flags: 'i', + secretGroup: 1, + keywords: ['bearer'], + }, + { + id: 'basic-auth', + pattern: String.raw `\bAuthorization[ \t]*:[ \t]*Basic\s+([A-Za-z0-9+/]{8,}={0,2})`, + flags: 'i', + secretGroup: 1, + keywords: ['basic'], + }, + { + id: 'secret-assignment', + description: 'Value assigned to a secret-looking key (password: x, CLIENT_SECRET=x, "apiKey": "x"). ' + + 'Covers decrypted SOPS/YAML/dotenv/JSON. Requires 8+ chars including a digit; ' + + 'skips placeholders (${X}, , %X%, {{x}}) and code (calls, dotted member access)', + pattern: String.raw `\b[A-Za-z0-9_.-]{0,40}?(?:secret|password|passwd|passphrase|api[_-]?key|access[_-]?key|private[_-]?key|token)` + + String.raw `["']?[ \t]*[:=][ \t]*["']?(?![\[$<{%])(?=[^\s"',;&\\]*\d)` + + // Not a dotted identifier path (env.AUTH0_SECRET, this.config.token2): code, not a value. + String.raw `(?![A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+(?:$|[\s"',;&\\)}\]]))` + + String.raw `([^\s"',;&\\()<>{}\[\]]{8,})(?=$|[\s"',;&\\)}\]])`, + flags: 'i', + secretGroup: 1, + keywords: ['secret', 'passw', 'passphrase', 'key', 'token'], + }, + ], + allowlist: [ + { + id: 'git-sha', + description: 'Full or short git commit SHA', + pattern: String.raw `\b[0-9a-f]{7,40}\b`, + }, + { + id: 'guid', + description: 'GUID/UUID (Entra tenant, client and object IDs, subscription IDs)', + pattern: String.raw `\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b`, + }, + ], + entropy: { + enabled: false, + minLength: 32, + threshold: 4.5, + requireKeyword: true, + keywords: ['secret', 'key', 'token', 'password', 'passwd', 'credential', 'signature'], + window: 40, + }, +}; diff --git a/dist/redaction.d.ts b/dist/redaction.d.ts new file mode 100644 index 00000000..d45dcd6b --- /dev/null +++ b/dist/redaction.d.ts @@ -0,0 +1,137 @@ +import { DEFAULT_REDACTION_CONFIG } from './redaction-rules.js'; +/** + * Inline secret redaction. + * + * Secrets are replaced with typed tokens (`[REDACTED:]`) at the archive + * write, the one point every harness's transcripts pass through (see + * docs/redaction/PHASE0-FINDINGS.md). Everything downstream (SQLite text, + * tool_calls, embeddings, summaries, show/read) reads the archive, so it only + * ever sees redacted text. + * + * Invariants: + * - Findings carry rule IDs and counts only. A matched value is never logged, + * returned, or thrown. + * - Idempotent: a `[REDACTED:...]` token never matches a rule, so redacting + * redacted text is a no-op. + * - JSONL structure is preserved: one output line per input line, valid JSON in + * gives valid JSON out, and unchanged lines are byte-identical. + */ +export { DEFAULT_REDACTION_CONFIG }; +/** Fork default. Flip to false for an opt-in upstream build. */ +export declare const REDACTION_ENABLED_BY_DEFAULT = true; +export declare const REDACTION_RULES_FILENAME = "redaction-rules.json"; +export interface RedactionRuleSpec { + id: string; + pattern: string; + /** Extra RegExp flags from [imsu]; `g` and `d` are always added. */ + flags?: string; + /** Case-insensitive prefilter: skip the rule unless the text contains one. */ + keywords?: string[]; + /** Replace only this capture group instead of the whole match. */ + secretGroup?: number; + description?: string; +} +export interface AllowlistSpec { + id: string; + /** Matched against the whole candidate secret; a full match keeps it. */ + pattern: string; + flags?: string; + description?: string; +} +export interface EntropySpec { + enabled: boolean; + minLength: number; + /** Shannon entropy in bits per character. */ + threshold: number; + /** Only fire when a keyword appears shortly before the candidate, on the same line. */ + requireKeyword: boolean; + keywords: string[]; + /** How many characters before the candidate to search for a keyword. */ + window: number; +} +export interface RedactionConfig { + rules: RedactionRuleSpec[]; + allowlist: AllowlistSpec[]; + entropy: EntropySpec; +} +/** Shape of a user `redaction-rules.json`. Every field is optional. */ +export interface RedactionRulesFile { + /** Merge with the bundled defaults (default true). */ + includeDefaults?: boolean; + /** Added after the defaults; a rule with a default's id replaces it in place. */ + rules?: RedactionRuleSpec[]; + /** Default rule ids to turn off. */ + disableRules?: string[]; + /** Added to the default allowlist (same id replaces). */ + allowlist?: AllowlistSpec[]; + entropy?: Partial; +} +export interface RedactionContext { + source: string; + path: string; +} +export interface RedactionFinding { + ruleId: string; + count: number; +} +export interface RedactionResult { + text: string; + findings: RedactionFinding[]; +} +export interface Redactor { + redact(text: string, ctx?: RedactionContext): RedactionResult; + readonly ruleIds: string[]; +} +export interface RedactionSettings { + enabled: boolean; + strict: boolean; + /** Explicit EPISODIC_MEMORY_REDACTION_RULES path, if set. */ + rulesPath?: string; +} +/** Rules could not be loaded or are invalid. Messages describe config only. */ +export declare class RedactionConfigError extends Error { + constructor(message: string); +} +/** + * EPISODIC_MEMORY_REDACTION on (fork default) | off + * EPISODIC_MEMORY_REDACTION_RULES path to a custom rules file + * EPISODIC_MEMORY_REDACTION_STRICT 1 (default) | 0; strict fails closed on a rules-load error + */ +export declare function getRedactionSettings(env?: NodeJS.ProcessEnv): RedactionSettings; +/** + * Merge a rules file with the bundled defaults and validate the result. + * Throws RedactionConfigError on any invalid rule. + */ +export declare function loadRedactionConfig(file: RedactionRulesFile): RedactionConfig; +/** + * Load the active redactor from the environment. + * + * Returns null when redaction is off. When the rules can't be loaded: strict + * mode (the default) throws RedactionConfigError so callers fail closed; + * non-strict mode warns and returns null, so text passes through unredacted. + */ +export declare function loadRedactor(env?: NodeJS.ProcessEnv, warn?: (message: string) => void): Redactor | null; +export declare function createRedactor(config: RedactionConfig): Redactor; +/** Aggregates findings by rule id. Never holds matched values. */ +export declare class FindingsTally { + private counts; + add(findings: RedactionFinding[]): void; + get total(): number; + toArray(): RedactionFinding[]; +} +/** "7 value(s) redacted (azure-storage-key: 2, jwt: 5)" */ +export declare function formatFindings(findings: RedactionFinding[]): string; +/** + * Redact one JSONL line. Valid JSON stays valid (string values are redacted + * and the line is re-serialized only if something changed); a line that isn't + * JSON (e.g. a torn last line mid-write) is redacted as raw text. A trailing + * `\r` is preserved. + */ +export declare function redactJsonlLine(line: string, redactor: Redactor, ctx?: RedactionContext, tally?: FindingsTally): string; +/** + * Stream `src` to `dest`, redacting line by line. Writes `dest` directly; + * callers that need atomicity write to a temp path and rename. Line count and + * trailing-newline shape match the source exactly, so archive line numbers + * (exchanges.line_start/line_end, MCP read ranges) stay valid. + */ +export declare function copyFileRedacted(src: string, dest: string, redactor: Redactor, ctx?: RedactionContext, tally?: FindingsTally): void; diff --git a/dist/redaction.js b/dist/redaction.js new file mode 100644 index 00000000..c4190658 --- /dev/null +++ b/dist/redaction.js @@ -0,0 +1,484 @@ +import fs from 'fs'; +import path from 'path'; +import { StringDecoder } from 'string_decoder'; +import { getSuperpowersDir } from './paths.js'; +import { DEFAULT_REDACTION_CONFIG } from './redaction-rules.js'; +/** + * Inline secret redaction. + * + * Secrets are replaced with typed tokens (`[REDACTED:]`) at the archive + * write, the one point every harness's transcripts pass through (see + * docs/redaction/PHASE0-FINDINGS.md). Everything downstream (SQLite text, + * tool_calls, embeddings, summaries, show/read) reads the archive, so it only + * ever sees redacted text. + * + * Invariants: + * - Findings carry rule IDs and counts only. A matched value is never logged, + * returned, or thrown. + * - Idempotent: a `[REDACTED:...]` token never matches a rule, so redacting + * redacted text is a no-op. + * - JSONL structure is preserved: one output line per input line, valid JSON in + * gives valid JSON out, and unchanged lines are byte-identical. + */ +export { DEFAULT_REDACTION_CONFIG }; +/** Fork default. Flip to false for an opt-in upstream build. */ +export const REDACTION_ENABLED_BY_DEFAULT = true; +export const REDACTION_RULES_FILENAME = 'redaction-rules.json'; +const RULE_ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/; +const TOKEN_PATTERN = /\[REDACTED:[a-z0-9][a-z0-9-]*\]/g; +const TOKEN_PREFIX = '[REDACTED:'; +const ALLOWED_FLAGS = /^[imsu]*$/; +const ENTROPY_RULE_ID = 'high-entropy'; +/** Rules could not be loaded or are invalid. Messages describe config only. */ +export class RedactionConfigError extends Error { + constructor(message) { + super(message); + this.name = 'RedactionConfigError'; + } +} +// --------------------------------------------------------------------------- +// Settings and loading +// --------------------------------------------------------------------------- +const OFF_VALUES = new Set(['off', '0', 'false', 'no', 'disabled']); +const ON_VALUES = new Set(['on', '1', 'true', 'yes', 'enabled']); +/** Unknown values fall back to the default, which is the safe side for both switches. */ +function parseToggle(raw, fallback) { + const value = raw?.trim().toLowerCase(); + if (!value) + return fallback; + if (OFF_VALUES.has(value)) + return false; + if (ON_VALUES.has(value)) + return true; + return fallback; +} +/** + * EPISODIC_MEMORY_REDACTION on (fork default) | off + * EPISODIC_MEMORY_REDACTION_RULES path to a custom rules file + * EPISODIC_MEMORY_REDACTION_STRICT 1 (default) | 0; strict fails closed on a rules-load error + */ +export function getRedactionSettings(env = process.env) { + return { + enabled: parseToggle(env.EPISODIC_MEMORY_REDACTION, REDACTION_ENABLED_BY_DEFAULT), + strict: parseToggle(env.EPISODIC_MEMORY_REDACTION_STRICT, true), + rulesPath: env.EPISODIC_MEMORY_REDACTION_RULES || undefined, + }; +} +function readRulesFile(settings) { + let rulesPath = settings.rulesPath; + if (!rulesPath) { + const candidate = path.join(getSuperpowersDir(), REDACTION_RULES_FILENAME); + if (!fs.existsSync(candidate)) + return {}; + rulesPath = candidate; + } + let raw; + try { + raw = fs.readFileSync(rulesPath, 'utf-8'); + } + catch (error) { + throw new RedactionConfigError(`Redaction rules failed to load from ${rulesPath}: ${error instanceof Error ? error.message : String(error)}`); + } + try { + return JSON.parse(raw); + } + catch (error) { + throw new RedactionConfigError(`Redaction rules file ${rulesPath} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`); + } +} +function replaceById(base, additions) { + const out = [...base]; + for (const item of additions) { + const at = out.findIndex(existing => existing.id === item.id); + if (at >= 0) + out[at] = item; + else + out.push(item); + } + return out; +} +/** + * Merge a rules file with the bundled defaults and validate the result. + * Throws RedactionConfigError on any invalid rule. + */ +export function loadRedactionConfig(file) { + if (!file || typeof file !== 'object' || Array.isArray(file)) { + throw new RedactionConfigError('Redaction rules file must contain a JSON object'); + } + for (const key of ['rules', 'allowlist', 'disableRules']) { + if (file[key] !== undefined && !Array.isArray(file[key])) { + throw new RedactionConfigError(`Redaction rules file: "${key}" must be an array`); + } + } + if (file.entropy !== undefined && (typeof file.entropy !== 'object' || file.entropy === null)) { + throw new RedactionConfigError('Redaction rules file: "entropy" must be an object'); + } + const includeDefaults = file.includeDefaults !== false; + const disabled = new Set(file.disableRules ?? []); + const baseRules = includeDefaults ? DEFAULT_REDACTION_CONFIG.rules : []; + const baseAllowlist = includeDefaults ? DEFAULT_REDACTION_CONFIG.allowlist : []; + const config = { + rules: replaceById(baseRules, file.rules ?? []).filter(rule => !disabled.has(rule.id)), + allowlist: replaceById(baseAllowlist, file.allowlist ?? []), + entropy: { ...DEFAULT_REDACTION_CONFIG.entropy, ...(file.entropy ?? {}) }, + }; + compileConfig(config); // validate + return config; +} +/** + * Load the active redactor from the environment. + * + * Returns null when redaction is off. When the rules can't be loaded: strict + * mode (the default) throws RedactionConfigError so callers fail closed; + * non-strict mode warns and returns null, so text passes through unredacted. + */ +export function loadRedactor(env = process.env, warn = message => console.error(message)) { + const settings = getRedactionSettings(env); + if (!settings.enabled) + return null; + try { + return createRedactor(loadRedactionConfig(readRulesFile(settings))); + } + catch (error) { + const err = error instanceof RedactionConfigError + ? error + : new RedactionConfigError(`Redaction rules failed to load: ${error instanceof Error ? error.message : String(error)}`); + if (settings.strict) + throw err; + warn(`episodic-memory: ${err.message}. EPISODIC_MEMORY_REDACTION_STRICT=0, so conversations ` + + 'will be archived and indexed WITHOUT redaction this run.'); + return null; + } +} +function checkFlags(flags, what) { + const value = flags ?? ''; + if (typeof value !== 'string' || !ALLOWED_FLAGS.test(value)) { + throw new RedactionConfigError(`${what}: flags must be a combination of "imsu"`); + } + return value; +} +function compileRule(spec) { + if (!spec || typeof spec !== 'object') { + throw new RedactionConfigError('Redaction rule must be an object'); + } + if (typeof spec.id !== 'string' || !RULE_ID_PATTERN.test(spec.id)) { + throw new RedactionConfigError(`Redaction rule id ${JSON.stringify(spec.id)} is invalid: use lowercase letters, digits and dashes`); + } + if (spec.id === ENTROPY_RULE_ID) { + throw new RedactionConfigError(`Redaction rule id "${ENTROPY_RULE_ID}" is reserved`); + } + const what = `Redaction rule "${spec.id}"`; + if (typeof spec.pattern !== 'string' || spec.pattern.length === 0) { + throw new RedactionConfigError(`${what}: pattern must be a non-empty string`); + } + const flags = checkFlags(spec.flags, what); + let regex; + let groupCount; + try { + regex = new RegExp(spec.pattern, flags + 'gd'); + groupCount = new RegExp(`(?:${spec.pattern})|`, flags).exec('').length - 1; + } + catch (error) { + throw new RedactionConfigError(`${what}: invalid regular expression (${error instanceof Error ? error.message : String(error)})`); + } + if (new RegExp(spec.pattern, flags).test('')) { + throw new RedactionConfigError(`${what}: pattern matches the empty string`); + } + const secretGroup = spec.secretGroup ?? 0; + if (!Number.isInteger(secretGroup) || secretGroup < 0 || secretGroup > groupCount) { + throw new RedactionConfigError(`${what}: secretGroup ${secretGroup} does not exist in the pattern (${groupCount} group(s))`); + } + let keywords; + if (spec.keywords !== undefined) { + if (!Array.isArray(spec.keywords) || spec.keywords.some(k => typeof k !== 'string' || k.length === 0)) { + throw new RedactionConfigError(`${what}: keywords must be an array of non-empty strings`); + } + keywords = spec.keywords.length > 0 ? spec.keywords.map(k => k.toLowerCase()) : undefined; + } + return { id: spec.id, regex, keywords, secretGroup }; +} +function compileAllowlist(spec) { + const what = `Redaction allowlist entry ${JSON.stringify(spec?.id)}`; + if (!spec || typeof spec.pattern !== 'string' || spec.pattern.length === 0) { + throw new RedactionConfigError(`${what}: pattern must be a non-empty string`); + } + const flags = checkFlags(spec.flags, what); + try { + return new RegExp(`^(?:${spec.pattern})$`, flags); + } + catch (error) { + throw new RedactionConfigError(`${what}: invalid regular expression (${error instanceof Error ? error.message : String(error)})`); + } +} +function compileConfig(config) { + const seen = new Set(); + const rules = config.rules.map(spec => { + const rule = compileRule(spec); + if (seen.has(rule.id)) + throw new RedactionConfigError(`Duplicate redaction rule id "${rule.id}"`); + seen.add(rule.id); + return rule; + }); + const allowlist = config.allowlist.map(compileAllowlist); + const e = config.entropy; + if (typeof e.enabled !== 'boolean' || typeof e.requireKeyword !== 'boolean' || + !Number.isInteger(e.minLength) || e.minLength < 8 || + typeof e.threshold !== 'number' || !(e.threshold > 0) || + !Number.isInteger(e.window) || e.window < 0 || + !Array.isArray(e.keywords) || e.keywords.some(k => typeof k !== 'string' || !k)) { + throw new RedactionConfigError('Redaction entropy settings are invalid (need enabled, requireKeyword: boolean; minLength >= 8; threshold > 0; window >= 0; keywords: string[])'); + } + return { rules, allowlist, entropy: { ...e, keywords: e.keywords.map(k => k.toLowerCase()) } }; +} +// --------------------------------------------------------------------------- +// Redaction engine +// --------------------------------------------------------------------------- +function tokenFor(ruleId) { + return `${TOKEN_PREFIX}${ruleId}]`; +} +function tokenSpans(text) { + const spans = []; + for (const m of text.matchAll(TOKEN_PATTERN)) + spans.push([m.index, m.index + m[0].length]); + return spans; +} +function overlapsAny(spans, start, end) { + for (const [s, e] of spans) + if (start < e && end > s) + return true; + return false; +} +function shannonEntropy(text) { + const counts = new Map(); + for (const ch of text) + counts.set(ch, (counts.get(ch) ?? 0) + 1); + let entropy = 0; + for (const n of counts.values()) { + const p = n / text.length; + entropy -= p * Math.log2(p); + } + return entropy; +} +/** + * Replace each accepted match (or its secretGroup) with a token. A candidate is + * skipped when it overlaps an existing token (idempotency) or fully matches an + * allowlist pattern. + */ +function applyRule(text, rule, isAllowed) { + const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; + const token = tokenFor(rule.id); + let out = ''; + let last = 0; + let count = 0; + for (const m of text.matchAll(rule.regex)) { + const range = m.indices?.[rule.secretGroup]; + if (!range) + continue; + const [start, end] = range; + if (end <= start || start < last) + continue; + if (spans && overlapsAny(spans, start, end)) + continue; + if (isAllowed(text.slice(start, end))) + continue; + out += text.slice(last, start) + token; + last = end; + count++; + } + return count === 0 ? { text, count } : { text: out + text.slice(last), count }; +} +function applyEntropy(text, spec, isAllowed) { + const candidates = new RegExp(`[A-Za-z0-9+/=_.~-]{${spec.minLength},}`, 'g'); + const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; + const token = tokenFor(ENTROPY_RULE_ID); + let out = ''; + let last = 0; + let count = 0; + for (const m of text.matchAll(candidates)) { + const start = m.index; + const end = start + m[0].length; + if (spans && overlapsAny(spans, start, end)) + continue; + if (isAllowed(m[0])) + continue; + if (shannonEntropy(m[0]) < spec.threshold) + continue; + if (spec.requireKeyword) { + let before = text.slice(Math.max(0, start - spec.window), start); + before = before.slice(before.lastIndexOf('\n') + 1).toLowerCase(); + if (!spec.keywords.some(k => before.includes(k))) + continue; + } + out += text.slice(last, start) + token; + last = end; + count++; + } + return count === 0 ? { text, count } : { text: out + text.slice(last), count }; +} +export function createRedactor(config) { + const compiled = compileConfig(config); + const isAllowed = (secret) => compiled.allowlist.some(re => re.test(secret)); + return { + ruleIds: compiled.rules.map(r => r.id), + redact(text, _ctx) { + if (typeof text !== 'string' || text.length === 0) + return { text, findings: [] }; + let current = text; + let lower = null; + const counts = new Map(); + for (const rule of compiled.rules) { + if (rule.keywords) { + lower ??= current.toLowerCase(); + if (!rule.keywords.some(k => lower.includes(k))) + continue; + } + const r = applyRule(current, rule, isAllowed); + if (r.count > 0) { + current = r.text; + lower = null; + counts.set(rule.id, (counts.get(rule.id) ?? 0) + r.count); + } + } + if (compiled.entropy.enabled) { + const r = applyEntropy(current, compiled.entropy, isAllowed); + if (r.count > 0) { + current = r.text; + counts.set(ENTROPY_RULE_ID, r.count); + } + } + return { text: current, findings: [...counts].map(([ruleId, count]) => ({ ruleId, count })) }; + }, + }; +} +// --------------------------------------------------------------------------- +// Findings +// --------------------------------------------------------------------------- +/** Aggregates findings by rule id. Never holds matched values. */ +export class FindingsTally { + counts = new Map(); + add(findings) { + for (const f of findings) + this.counts.set(f.ruleId, (this.counts.get(f.ruleId) ?? 0) + f.count); + } + get total() { + let n = 0; + for (const c of this.counts.values()) + n += c; + return n; + } + toArray() { + return [...this.counts].map(([ruleId, count]) => ({ ruleId, count })); + } +} +/** "7 value(s) redacted (azure-storage-key: 2, jwt: 5)" */ +export function formatFindings(findings) { + const total = findings.reduce((n, f) => n + f.count, 0); + if (total === 0) + return 'no values redacted'; + const detail = [...findings] + .sort((a, b) => b.count - a.count || a.ruleId.localeCompare(b.ruleId)) + .map(f => `${f.ruleId}: ${f.count}`) + .join(', '); + return `${total} value(s) redacted (${detail})`; +} +// --------------------------------------------------------------------------- +// JSON / JSONL / files +// --------------------------------------------------------------------------- +/** Redact every string value in a parsed JSON tree, in place. Keys are left alone. */ +function redactTree(node, redactor, ctx, tally) { + if (typeof node === 'string') { + const r = redactor.redact(node, ctx); + if (r.findings.length === 0) + return { value: node, changed: false }; + tally?.add(r.findings); + return { value: r.text, changed: r.text !== node }; + } + if (node === null || typeof node !== 'object') + return { value: node, changed: false }; + let changed = false; + if (Array.isArray(node)) { + for (let i = 0; i < node.length; i++) { + const r = redactTree(node[i], redactor, ctx, tally); + if (r.changed) { + node[i] = r.value; + changed = true; + } + } + return { value: node, changed }; + } + const obj = node; + for (const key of Object.keys(obj)) { + const r = redactTree(obj[key], redactor, ctx, tally); + if (r.changed) { + Object.defineProperty(obj, key, { value: r.value, writable: true, enumerable: true, configurable: true }); + changed = true; + } + } + return { value: obj, changed }; +} +/** + * Redact one JSONL line. Valid JSON stays valid (string values are redacted + * and the line is re-serialized only if something changed); a line that isn't + * JSON (e.g. a torn last line mid-write) is redacted as raw text. A trailing + * `\r` is preserved. + */ +export function redactJsonlLine(line, redactor, ctx, tally) { + const cr = line.endsWith('\r') ? '\r' : ''; + const body = cr ? line.slice(0, -1) : line; + if (body.trim().length === 0) + return line; + let parsed; + try { + parsed = JSON.parse(body); + } + catch { + const r = redactor.redact(body, ctx); + if (r.findings.length === 0) + return line; + tally?.add(r.findings); + return r.text + cr; + } + const r = redactTree(parsed, redactor, ctx, tally); + return r.changed ? JSON.stringify(r.value) + cr : line; +} +const COPY_CHUNK_BYTES = 1 << 20; // 1 MiB +/** + * Stream `src` to `dest`, redacting line by line. Writes `dest` directly; + * callers that need atomicity write to a temp path and rename. Line count and + * trailing-newline shape match the source exactly, so archive line numbers + * (exchanges.line_start/line_end, MCP read ranges) stay valid. + */ +export function copyFileRedacted(src, dest, redactor, ctx, tally) { + const fdIn = fs.openSync(src, 'r'); + let fdOut; + try { + fdOut = fs.openSync(dest, 'w'); + const buf = Buffer.allocUnsafe(COPY_CHUNK_BYTES); + const decoder = new StringDecoder('utf8'); + let pending = ''; + let bytesRead; + while ((bytesRead = fs.readSync(fdIn, buf, 0, buf.length, null)) > 0) { + let scanFrom = pending.length; + pending += decoder.write(buf.subarray(0, bytesRead)); + const out = []; + let start = 0; + let nl; + while ((nl = pending.indexOf('\n', scanFrom)) !== -1) { + out.push(redactJsonlLine(pending.slice(start, nl), redactor, ctx, tally), '\n'); + start = nl + 1; + scanFrom = start; + } + if (out.length > 0) + fs.writeSync(fdOut, out.join('')); + pending = pending.slice(start); + } + pending += decoder.end(); + if (pending.length > 0) + fs.writeSync(fdOut, redactJsonlLine(pending, redactor, ctx, tally)); + } + finally { + fs.closeSync(fdIn); + if (fdOut !== undefined) + fs.closeSync(fdOut); + } +} diff --git a/dist/summarizer.d.ts b/dist/summarizer.d.ts index 4c97be52..c4b5595d 100644 --- a/dist/summarizer.d.ts +++ b/dist/summarizer.d.ts @@ -172,4 +172,13 @@ export declare function runCodexCommand(command: CodexSummarizerCommand): Promis * See https://github.com/obra/episodic-memory/issues/98. */ export declare function getCodexModel(_exchanges: ConversationExchange[]): string | undefined; -export declare function summarizeConversation(exchanges: ConversationExchange[], sessionId?: string): Promise; +export interface SummarizeOptions { + /** + * Allow Claude session resume and Codex thread/fork (default true). Both + * paths make the model read the *source* transcript rather than `exchanges`, + * so callers pass false when the exchanges were redacted (see + * docs/redaction/PHASE0-FINDINGS.md) to force the transcript-text path. + */ + allowResume?: boolean; +} +export declare function summarizeConversation(exchanges: ConversationExchange[], sessionId?: string, options?: SummarizeOptions): Promise; diff --git a/dist/summarizer.js b/dist/summarizer.js index 60719809..48e78be2 100644 --- a/dist/summarizer.js +++ b/dist/summarizer.js @@ -617,7 +617,8 @@ function getCodexSessionId(exchanges, sessionId) { export function getCodexModel(_exchanges) { return process.env.EPISODIC_MEMORY_CODEX_MODEL || undefined; } -export async function summarizeConversation(exchanges, sessionId) { +export async function summarizeConversation(exchanges, sessionId, options = {}) { + const allowResume = options.allowResume !== false; // Handle trivial conversations if (exchanges.length === 0) { return 'Trivial conversation with no substantive content.'; @@ -628,7 +629,7 @@ export async function summarizeConversation(exchanges, sessionId) { return 'Trivial conversation with no substantive content.'; } } - const codexSessionId = getCodexSessionId(exchanges, sessionId); + const codexSessionId = allowResume ? getCodexSessionId(exchanges, sessionId) : undefined; if (codexSessionId) { try { const result = await callCodex(buildCodexSummaryPrompt(), codexSessionId, getCodexModel(exchanges)); @@ -652,7 +653,7 @@ export async function summarizeConversation(exchanges, sessionId) { // would fail on every one before the no-resume retry kicks in. Treat // missing harness as Claude for backward compatibility with old archives. const isClaudeSession = exchanges.some(e => e.harness === 'claude' || e.harness === undefined); - const claudeSessionId = !codexSessionId && isClaudeSession ? sessionId : undefined; + const claudeSessionId = allowResume && !codexSessionId && isClaudeSession ? sessionId : undefined; const cwd = claudeSessionId ? exchanges.find(e => e.cwd)?.cwd : undefined; const conversationText = claudeSessionId ? '' // When resuming, no need to include conversation text - it's already in context diff --git a/dist/sync-cli.js b/dist/sync-cli.js index 26172c70..b4450162 100644 --- a/dist/sync-cli.js +++ b/dist/sync-cli.js @@ -9,6 +9,7 @@ import { spawn } from 'child_process'; import fs from 'fs'; import { formatLogLine, getSyncLogPath, getSyncLockPath } from './logging.js'; import { acquireFileLock, readLockHolder, releaseFileLock } from './file-lock.js'; +import { FindingsTally, formatFindings, getRedactionSettings, loadRedactor } from './redaction.js'; const args = process.argv.slice(2); // Reentrancy guard (#87): if this sync was triggered by a SessionStart hook // inside a Claude subprocess that the summarizer just spawned, exit silently. @@ -39,10 +40,13 @@ Sync conversations from Claude Code, Codex, and opencode transcript sources to a This command: 1. Exports opencode sessions from its SQLite database when available -2. Copies new or updated .jsonl files to conversation archive +2. Copies new or updated .jsonl files to conversation archive, redacting secrets 3. Generates embeddings for semantic search 4. Updates the search index +Secrets are replaced with [REDACTED:] tokens before anything is archived, +indexed, embedded, or summarized. See EPISODIC_MEMORY_REDACTION* in the README. + Only processes files that are new or have been modified since last sync. Safe to run multiple times - subsequent runs are fast no-ops. @@ -142,8 +146,21 @@ if (isBackground) { console.log(`Sync started in background. Log: ${logPath}`); process.exit(0); } +// Load redaction rules before anything is exported, copied, or indexed. In +// strict mode (the default) a bad rules file stops the sync here: fail closed +// rather than archive unredacted text. +let redactor; +try { + redactor = loadRedactor(); +} +catch (error) { + console.error(`episodic-memory: ${error instanceof Error ? error.message : String(error)}`); + console.error('episodic-memory: refusing to sync without redaction (strict mode). Fix the rules file, ' + + 'or set EPISODIC_MEMORY_REDACTION_STRICT=0 to sync unredacted, or EPISODIC_MEMORY_REDACTION=off.'); + process.exit(1); +} if (!onlyHarnesses || onlyHarnesses.includes('opencode')) { - const opencodeExport = exportOpencodeSessions(); + const opencodeExport = exportOpencodeSessions({ redactor }); if (opencodeExport.exported > 0 || opencodeExport.skipped > 0) { console.log(`opencode export: ${opencodeExport.exported} exported, ${opencodeExport.skipped} skipped`); } @@ -195,8 +212,10 @@ console.log(`Sources: ${sourceDirs.join(', ')}`); console.log(`Destination: ${destDir}\n`); async function syncAll() { const totals = { copied: 0, skipped: 0, indexed: 0, summarized: 0, errors: [], sourcesWithSummaryWork: 0, totalNeedingSummaries: 0 }; + const redactions = new FindingsTally(); for (const sourceDir of sourceDirs) { - const result = await syncConversations(sourceDir, destDir, { ...syncOptions, summaryLimit }); + const result = await syncConversations(sourceDir, destDir, { ...syncOptions, summaryLimit, redactor }); + redactions.add(result.redactions); totals.copied += result.copied; totals.skipped += result.skipped; totals.indexed += result.indexed; @@ -213,6 +232,16 @@ async function syncAll() { else { console.log(` Summarized: ${totals.summarized}`); } + // Rule IDs and counts only — never matched values. + if (redactor) { + console.log(` Redaction: ${formatFindings(redactions.toArray())}`); + } + else if (getRedactionSettings().enabled) { + console.log(' Redaction: NOT APPLIED (rules failed to load; EPISODIC_MEMORY_REDACTION_STRICT=0)'); + } + else { + console.log(' Redaction: off (EPISODIC_MEMORY_REDACTION=off)'); + } if (totals.errors.length > 0) { console.log(`\n⚠️ Errors: ${totals.errors.length}`); totals.errors.forEach(err => console.log(` ${err.file}: ${err.error}`)); diff --git a/dist/sync.d.ts b/dist/sync.d.ts index 658e98ad..065e5386 100644 --- a/dist/sync.d.ts +++ b/dist/sync.d.ts @@ -1,3 +1,4 @@ +import { FindingsTally, type RedactionFinding, type Redactor } from './redaction.js'; /** * Stream and scan for any exclusion marker, carrying an overlap between * chunks so a marker split across a boundary is still found. A single @@ -17,11 +18,18 @@ export interface SyncResult { file: string; error: string; }>; + /** Rule IDs and counts only — never matched values. */ + redactions: RedactionFinding[]; } export interface SyncOptions { skipIndex?: boolean; skipSummaries?: boolean; summaryLimit?: number; + /** + * Redactor applied at the archive write. `undefined` loads it from the + * environment (loadRedactor); `null` means redaction is off. + */ + redactor?: Redactor | null; } /** * Derive sync options from the process environment. @@ -39,5 +47,12 @@ export interface SyncOptions { * Claude quota and can stall on a permission prompt. */ export declare function buildSyncOptionsFromEnv(env: NodeJS.ProcessEnv): SyncOptions; +/** + * Copy `src` into the archive at `dest` when the archive copy is missing or + * older. This is the redaction choke point: with a redactor, the copy is + * redacted line by line (see redaction.ts), and every downstream stage + * (index, embeddings, summaries, show/read) reads the archive. + */ +export declare function copyIfNewer(src: string, dest: string, redactor?: Redactor | null, tally?: FindingsTally): boolean; export declare function extractSessionIdFromPath(filePath: string): string | null; export declare function syncConversations(sourceDir: string, destDir: string, options?: SyncOptions): Promise; diff --git a/dist/sync.js b/dist/sync.js index 0629761d..380037e1 100644 --- a/dist/sync.js +++ b/dist/sync.js @@ -5,6 +5,7 @@ import { SUMMARIZER_CONTEXT_MARKER } from './constants.js'; import { getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { formatErrorSentinel, shouldQueueForSummary } from './summary-sentinel.js'; import { getMaxMessageBytes, isOversizeExchange } from './message-size.js'; +import { copyFileRedacted, FindingsTally, loadRedactor } from './redaction.js'; const EXCLUSION_MARKERS = [ 'DO NOT INDEX THIS CHAT', 'Only use NO_INSIGHTS_FOUND', @@ -122,7 +123,13 @@ function hasConversationContent(filePath) { export function buildSyncOptionsFromEnv(env) { return { skipSummaries: env.EPISODIC_MEMORY_SKIP_SUMMARIES === '1' }; } -function copyIfNewer(src, dest) { +/** + * Copy `src` into the archive at `dest` when the archive copy is missing or + * older. This is the redaction choke point: with a redactor, the copy is + * redacted line by line (see redaction.ts), and every downstream stage + * (index, embeddings, summaries, show/read) reads the archive. + */ +export function copyIfNewer(src, dest, redactor = null, tally) { // Ensure destination directory exists const destDir = path.dirname(dest); if (!fs.existsSync(destDir)) { @@ -138,8 +145,22 @@ function copyIfNewer(src, dest) { } // Atomic copy: temp file + rename const tempDest = dest + '.tmp.' + process.pid; - fs.copyFileSync(src, tempDest); - fs.renameSync(tempDest, dest); // Atomic on same filesystem + try { + if (redactor) { + copyFileRedacted(src, tempDest, redactor, { source: 'archive', path: src }, tally); + } + else { + fs.copyFileSync(src, tempDest); + } + fs.renameSync(tempDest, dest); // Atomic on same filesystem + } + catch (error) { + try { + fs.unlinkSync(tempDest); + } + catch { } + throw error; + } // Preserve source mtime: harnesses without per-message timestamps (Cursor // agent transcripts) fall back to file mtime. Round up to the next whole // millisecond — utimes can't always represent the source's sub-millisecond @@ -165,8 +186,14 @@ export async function syncConversations(sourceDir, destDir, options = {}) { skipped: 0, indexed: 0, summarized: 0, - errors: [] + errors: [], + redactions: [] }; + // Load the redactor before touching the archive. In strict mode (the + // default) a rules-load failure throws here, so nothing unredacted is + // archived, indexed, or summarized (fail closed). + const redactor = options.redactor === undefined ? loadRedactor() : options.redactor; + const tally = new FindingsTally(); // Ensure source directory exists if (!fs.existsSync(sourceDir)) { return result; @@ -198,7 +225,7 @@ export async function syncConversations(sourceDir, destDir, options = {}) { result.skipped++; continue; } - const wasCopied = copyIfNewer(srcFile, destFile); + const wasCopied = copyIfNewer(srcFile, destFile, redactor, tally); if (wasCopied) { result.copied++; filesToIndex.push(destFile); @@ -229,6 +256,7 @@ export async function syncConversations(sourceDir, destDir, options = {}) { } } } + result.redactions = tally.toArray(); // Index copied files (unless skipIndex is set) if (!options.skipIndex && filesToIndex.length > 0) { const { parseConversation } = await import('./parser.js'); @@ -343,7 +371,10 @@ export async function syncConversations(sourceDir, destDir, options = {}) { continue; } console.log(` Summarizing ${path.basename(filePath)} (${exchanges.length} exchanges)...`); - const summary = await summarizeConversation(exchanges, sessionId); + // With redaction on, never resume/fork the session: those paths hand + // the model the unredacted source transcript instead of these + // (redacted) exchanges. + const summary = await summarizeConversation(exchanges, sessionId, { allowResume: redactor === null }); const summaryPath = filePath.replace('.jsonl', '-summary.txt'); fs.writeFileSync(summaryPath, summary, 'utf-8'); result.summarized++; diff --git a/dist/verify.js b/dist/verify.js index dd4535d2..d2fba59f 100644 --- a/dist/verify.js +++ b/dist/verify.js @@ -4,6 +4,7 @@ import { parseConversation } from './parser.js'; import { initDatabase, getAllExchanges, getFileLastIndexed } from './db.js'; import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { isErroredSentinel } from './summary-sentinel.js'; +import { getRedactionSettings } from './redaction.js'; export async function verifyIndex() { const result = { missing: [], @@ -125,7 +126,8 @@ export async function repairIndex(issues) { } // Generate/update summary const summaryPath = conversationPath.replace('.jsonl', '-summary.txt'); - const summary = await summarizeConversation(exchanges); + // Under redaction, don't let the Codex fork fallback read the source rollout. + const summary = await summarizeConversation(exchanges, undefined, { allowResume: !getRedactionSettings().enabled }); fs.writeFileSync(summaryPath, summary, 'utf-8'); console.log(` Created summary: ${summary.split(/\s+/).length} words`); // Index exchanges diff --git a/docs/REDACTION.md b/docs/REDACTION.md new file mode 100644 index 00000000..85d967c9 --- /dev/null +++ b/docs/REDACTION.md @@ -0,0 +1,167 @@ +# Secret redaction + +episodic-memory replaces secrets in your conversations with typed tokens +**before** it archives, indexes, embeds, or summarizes them: + +``` +AccountKey=Zm9v...== → AccountKey=[REDACTED:connection-string-secret] +"password": "abc1Q~..." → "password": "[REDACTED:azure-client-secret]" +Authorization: Bearer eyJ → Authorization: Bearer [REDACTED:jwt] +``` + +Values are redacted, not dropped. The rest of the conversation stays +searchable, and the token tells you what kind of value was there. You can +search for the tokens too: `episodic-memory search --text "[REDACTED:azure-storage-key]"` +finds every conversation where a storage key was pasted. + +Redaction is **on by default**, and it **fails closed**. If the rules can't be +loaded, sync refuses to run. It won't archive unredacted text. + +## What's covered + +| Where | Redacted? | +|---|---| +| Conversation archive (`~/.config/superpowers/conversation-archive`) | Yes. This is the hook point. | +| SQLite index: message text and tool inputs/outputs | Yes. Built from the archive. | +| Embeddings | Yes. Built from redacted text. | +| Summaries (sent to a model) | Yes. Built from redacted text. Session resume and Codex fork are turned off (see below). | +| opencode and legacy Cursor staging exports | Yes. Redacted when written. | +| `show`, MCP `read` | Yes. They read the archive. | +| Sync logs | Rule IDs and counts only. Matched values are never logged. | +| Claude Code's own `~/.claude/projects`, Codex's `~/.codex/sessions`, etc. | **No.** Those files belong to the harness. Use its retention settings. | + +### Summaries + +Without redaction, the summarizer can *resume* a Claude Code session or *fork* +a Codex thread. Both make the model read the original, unredacted transcript. +With redaction on, summaries always come from the redacted conversation text. +This has one side effect for Codex-only setups: summarization then goes +through the Claude Agent SDK. If you don't have Claude set up, summaries fail +and retry on later syncs. Set `EPISODIC_MEMORY_SKIP_SUMMARIES=1` to turn them +off. Summaries are display-only, so search quality is unaffected. + +## Default rules + +Run `episodic-memory redact --print-default-rules` for the full set. In +summary: + +| Rule ID | Catches | +|---|---| +| `private-key-block` | PEM and OpenSSH private keys, including truncated ones | +| `connection-string-secret` | `AccountKey=`, `SharedAccessKey=`, `SharedAccessSignature=`, `Password=`, `Pwd=` in connection strings. Only the value is redacted; server, account, and database names stay. | +| `azure-sas-token` | The `sig=` of a SAS URL. The URL and other parameters stay. | +| `jwt` | JWTs, including Entra ID / Azure access tokens | +| `anthropic-api-key`, `openai-api-key`, `github-token`, `aws-access-key-id`, `aws-secret-access-key`, `slack-token`, `google-api-key`, `npm-token` | Provider keys with a recognizable prefix | +| `azure-client-secret` | Entra ID app client secrets (the `…Q~…` format) | +| `azure-storage-key` | Standalone 88-character base64 keys (Storage, Cosmos DB, Function keys) | +| `url-credentials` | The password in `scheme://user:password@host` | +| `bearer-token`, `basic-auth` | `Authorization` header values | +| `secret-assignment` | A value assigned to a secret-looking key: `password: …`, `CLIENT_SECRET=…`, `"apiKey": "…"`. Covers decrypted SOPS, YAML, dotenv, and JSON. Needs 8+ characters including a digit, and skips placeholders (`${X}`, ``, `%X%`) and code (`env.X`, `getPassword()`). | + +**Allowlisted** (never redacted, even when a rule matches): git SHAs and +GUIDs. Tenant, client, object, and subscription IDs stay searchable, and so do +commit hashes. + +**Entropy fallback:** off by default. When it's on, a long, high-entropy string +is redacted only if a keyword (`secret`, `key`, `token`, …) appears just before +it in the same text value. + +**SOPS:** decrypted SOPS output drops its `sops:` metadata block, so it has no +reliable shape. It's covered by the value rules plus `secret-assignment`. +Encrypted values (`ENC[AES256_GCM,…]`) are left alone. + +## Configuration + +| Variable | Default | Meaning | +|---|---|---| +| `EPISODIC_MEMORY_REDACTION` | `on` | `off` disables redaction entirely: archive copies become byte-for-byte again, and summaries may resume sessions again. | +| `EPISODIC_MEMORY_REDACTION_RULES` | `/redaction-rules.json` if it exists | Path to a custom rules file. If you set this and the file is missing, that's an error. | +| `EPISODIC_MEMORY_REDACTION_STRICT` | `1` | When the rules fail to load, `1` stops sync, index, and import (exit 1, nothing written). `0` logs a loud warning and continues **unredacted**. | + +`` is `~/.config/superpowers` unless `EPISODIC_MEMORY_CONFIG_DIR`, +`PERSONAL_SUPERPOWERS_DIR`, or `XDG_CONFIG_HOME` say otherwise. + +### Custom rules + +Create `~/.config/superpowers/redaction-rules.json`. By default it extends the +bundled rules: + +```jsonc +{ + // Add rules (a rule with a default's id replaces that default) + "rules": [ + { + "id": "contoso-api-key", // lowercase, digits, dashes + "pattern": "\\bctso_[A-Za-z0-9]{32}\\b", // JavaScript regex + "flags": "i", // optional, any of "imsu" + "keywords": ["ctso_"], // optional prefilter (case-insensitive) + "secretGroup": 0 // optional: redact only this capture group + } + ], + "disableRules": ["basic-auth"], // turn off defaults by id + "allowlist": [ // full-match patterns that are never redacted + { "id": "build-ids", "pattern": "build-[0-9]{8}" } + ], + "entropy": { "enabled": true }, // partial override of the entropy settings + "includeDefaults": true // false = use only this file's rules +} +``` + +Every rule is validated when it loads. An invalid regex, a bad id, a pattern +that matches the empty string, or a `secretGroup` that doesn't exist is a +rules-load failure, which strict mode treats as fatal. To try rules out: + +```bash +echo 'password: hunter2hunter2' | episodic-memory redact --stdin +# password: [REDACTED:secret-assignment] +# 1 value(s) redacted (secret-assignment: 1) (stderr) +``` + +## Cleaning up existing data + +New syncs only redact new or changed files. To redact everything indexed +before you upgraded, or after you add a rule: + +```bash +episodic-memory redact --rewrite --dry-run # report what would change +episodic-memory redact --rewrite # apply +``` + +`--rewrite`: + +- redacts every archive file in place, keeping line numbers and timestamps +- redacts the opencode and Cursor staging exports in place +- redacts every index row in place and re-embeds only the rows that changed +- deletes summaries that were generated from unredacted text, so the next + sync regenerates them from the redacted archive + +It takes the same lock as `sync`, so it won't run while a sync is in progress. +Running it twice is safe: the second run finds nothing to change. + +Before your first sync with this version, consider a one-time scan of your +existing `~/.claude/projects` history. Those source files are never modified. + +## How it works + +The hook point is the copy into the archive. Every harness (Claude Code, +Codex, Cursor, opencode, OMP) passes through that copy, and every later stage +reads the archive rather than the source. The design and the research behind +it are in [redaction/PHASE0-FINDINGS.md](redaction/PHASE0-FINDINGS.md). + +Each archive line is parsed as JSON, every string value is redacted, and only +lines that changed are re-serialized. Lines with no secrets stay byte-for-byte +identical. The archive keeps exactly one line per source line, so index line +ranges and MCP `read` ranges still line up. A line that isn't valid JSON (for +example, a half-written last line) is redacted as plain text. + +## Limitations + +- Pattern rules miss secrets that have no recognizable shape and no + `key: value` context. The entropy fallback helps when it's on, but recall + isn't perfect. +- Each JSON string value is checked on its own. Context split across fields + (`{"name": "DB_PASSWORD", "value": "…"}`) isn't linked, so the `value` is + caught only if its own shape matches a rule. +- JSON object *keys* aren't redacted. Only values are. +- On lines that get redacted, re-serializing can change number formatting for + integers above 2^53. No supported harness writes such numbers. diff --git a/src/cursor-legacy.ts b/src/cursor-legacy.ts index a62f4b56..8c91897f 100644 --- a/src/cursor-legacy.ts +++ b/src/cursor-legacy.ts @@ -3,6 +3,7 @@ import os from 'os'; import path from 'path'; import Database from 'better-sqlite3'; import { detectCursorCwd } from './parser.js'; +import { loadRedactor, redactJsonlLine, type Redactor } from './redaction.js'; /** * Import legacy Cursor conversations from Cursor's global SQLite store @@ -141,6 +142,8 @@ export interface CursorLegacyImportOptions { force?: boolean; /** Report what would be exported without writing files. */ dryRun?: boolean; + /** `undefined` loads from the environment (strict mode throws on bad rules); `null` disables. */ + redactor?: Redactor | null; } export interface CursorLegacyImportResult { @@ -160,6 +163,7 @@ export function importCursorLegacy(options: CursorLegacyImportOptions): CursorLe errors: [], }; + const redactor = options.redactor === undefined ? loadRedactor() : options.redactor; const liveIds = options.liveTranscriptIds ?? new Set(); const db = new Database(options.dbPath, { readonly: true, fileMustExist: true }); @@ -264,9 +268,14 @@ export function importCursorLegacy(options: CursorLegacyImportOptions): CursorLe if (!options.dryRun) { // Re-serialize with cwd now that it's known (it's derived from the // whole conversation's tool calls). - const finalLines = cwd + const withCwd = cwd ? lines.map(line => JSON.stringify({ ...JSON.parse(line), cwd })) : lines; + // The export dir is a plugin-owned plaintext copy, so redact it at + // write time like the archive (docs/redaction/PHASE0-FINDINGS.md). + const finalLines = redactor + ? withCwd.map(line => redactJsonlLine(line, redactor, { source: 'cursor-legacy', path: outFile })) + : withCwd; fs.mkdirSync(path.dirname(outFile), { recursive: true }); fs.writeFileSync(outFile, finalLines.join('\n') + '\n', 'utf-8'); diff --git a/src/indexer.ts b/src/indexer.ts index 173ef679..5ba56ae2 100644 --- a/src/indexer.ts +++ b/src/indexer.ts @@ -9,6 +9,8 @@ import { ConversationExchange } from './types.js'; import { getArchiveDir, getExcludedProjects, getConversationSourceDirs, findJsonlFiles, statIfExists } from './paths.js'; import { formatErrorSentinel, shouldQueueForSummary } from './summary-sentinel.js'; import { getMaxMessageBytes, isOversizeExchange } from './message-size.js'; +import { FindingsTally, formatFindings, loadRedactor, type Redactor } from './redaction.js'; +import { copyIfNewer } from './sync.js'; // Set max output tokens for Claude SDK (used by summarizer) process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS = '20000'; @@ -38,12 +40,25 @@ function sessionIdForSummary(exchanges: ConversationExchange[]): string | undefi return exchanges.find(exchange => exchange.sessionId)?.sessionId; } +// Resume/fork would summarize the unredacted source transcript; see sync.ts. +function summarizeOptions(redactor: Redactor | null) { + return { allowResume: redactor === null }; +} + +function logRedactions(tally: FindingsTally): void { + if (tally.total > 0) console.log(` Redaction: ${formatFindings(tally.toArray())}`); +} + export async function indexConversations( limitToProject?: string, maxConversations?: number, concurrency: number = 1, noSummaries: boolean = false ): Promise { + // Load before touching the archive: strict mode fails closed here. + const redactor = loadRedactor(); + const tally = new FindingsTally(); + console.log('Initializing database...'); const db = initDatabase(); @@ -113,15 +128,14 @@ export async function indexConversations( // Source transcripts can vanish mid-run (Claude Code cleanup). Skip loudly. let exchanges; try { - // Copy to archive (ensure parent dirs exist for subagent files) - if (!fs.existsSync(archivePath)) { - fs.mkdirSync(path.dirname(archivePath), { recursive: true }); - fs.copyFileSync(sourcePath, archivePath); + // Copy (redacted) to the archive, then parse the archive, so the index + // and summaries only ever see redacted text. + if (copyIfNewer(sourcePath, archivePath, redactor, tally)) { console.log(` Archived: ${file}`); } // Parse conversation - exchanges = await parseConversation(sourcePath, project, archivePath); + exchanges = await parseConversation(archivePath, project, archivePath); } catch (error) { console.log(` Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); continue; @@ -150,7 +164,7 @@ export async function indexConversations( await processBatch(needsSummary, async (conv) => { try { - const summary = await summarizeConversation(conv.exchanges, sessionIdForSummary(conv.exchanges)); + const summary = await summarizeConversation(conv.exchanges, sessionIdForSummary(conv.exchanges), summarizeOptions(redactor)); fs.writeFileSync(conv.summaryPath, summary, 'utf-8'); const wordCount = summary.split(/\s+/).length; console.log(` ✓ ${conv.file}: ${wordCount} words`); @@ -193,6 +207,7 @@ export async function indexConversations( // Check if we hit the limit if (maxConversations && conversationsProcessed >= maxConversations) { console.log(`\nReached limit of ${maxConversations} conversations`); + logRedactions(tally); db.close(); console.log(`✅ Indexing complete! Conversations: ${conversationsProcessed}, Exchanges: ${totalExchanges}`); return; @@ -205,12 +220,15 @@ export async function indexConversations( console.log(` Skipped ${oversizeSkipped} oversize exchange(s) (> ${maxMessageBytes} bytes; set EPISODIC_MEMORY_MAX_MESSAGE_BYTES to change) — likely embedded-transcript payloads (#139)`); } + logRedactions(tally); db.close(); console.log(`\n✅ Indexing complete! Conversations: ${conversationsProcessed}, Exchanges: ${totalExchanges}`); } export async function indexSession(sessionId: string, concurrency: number = 1, noSummaries: boolean = false): Promise { console.log(`Indexing session: ${sessionId}`); + const redactor = loadRedactor(); + const tally = new FindingsTally(); // Find the conversation file for this session const sourceDirs = getConversationSourceDirs(); @@ -246,11 +264,8 @@ export async function indexSession(sessionId: string, concurrency: number = 1, n // Archive + parse — source may vanish mid-run (Claude Code cleanup). let exchanges; try { - if (!fs.existsSync(archivePath)) { - fs.mkdirSync(path.dirname(archivePath), { recursive: true }); - fs.copyFileSync(sourcePath, archivePath); - } - exchanges = await parseConversation(sourcePath, project, archivePath); + copyIfNewer(sourcePath, archivePath, redactor, tally); + exchanges = await parseConversation(archivePath, project, archivePath); } catch (error) { console.log(`Skipped ${file} (read failed: ${error instanceof Error ? error.message : error})`); db.close(); @@ -263,7 +278,7 @@ export async function indexSession(sessionId: string, concurrency: number = 1, n if (!noSummaries && shouldQueueForSummary(summaryPath)) { fs.mkdirSync(path.dirname(summaryPath), { recursive: true }); try { - const summary = await summarizeConversation(exchanges, sessionIdForSummary(exchanges)); + const summary = await summarizeConversation(exchanges, sessionIdForSummary(exchanges), summarizeOptions(redactor)); fs.writeFileSync(summaryPath, summary, 'utf-8'); console.log(`Summary: ${summary.split(/\s+/).length} words`); } catch (error) { @@ -297,6 +312,7 @@ export async function indexSession(sessionId: string, concurrency: number = 1, n console.log(` Skipped ${oversizeSkipped} oversize exchange(s) (> ${maxMessageBytes} bytes; set EPISODIC_MEMORY_MAX_MESSAGE_BYTES to change) — likely embedded-transcript payloads (#139)`); } + logRedactions(tally); console.log(`✅ Indexed session ${sessionId}: ${exchanges.length} exchanges`); } @@ -317,6 +333,9 @@ export async function indexUnprocessed(concurrency: number = 1, noSummaries: boo if (concurrency > 1) console.log(`Concurrency: ${concurrency}`); if (noSummaries) console.log('⚠️ Running in no-summaries mode (skipping AI summaries)'); + const redactor = loadRedactor(); + const tally = new FindingsTally(); + const db = initDatabase(); await initEmbeddings(); @@ -361,17 +380,13 @@ export async function indexUnprocessed(concurrency: number = 1, noSummaries: boo ).get(archivePath) as { maxLine: number }; const maxIndexedLine = hw.maxLine; - // Ensure parent dirs exist for subagent files try { - fs.mkdirSync(path.dirname(archivePath), { recursive: true }); - - // Refresh the archive when the source may have grown beyond what we've seen. - if (!fs.existsSync(archivePath) || maxIndexedLine > 0) { - fs.copyFileSync(sourcePath, archivePath); - } + // Refresh the (redacted) archive when the source has grown, then parse + // the archive so the index only sees redacted text. + copyIfNewer(sourcePath, archivePath, redactor, tally); // Parse and filter to exchanges past the high-water mark - const exchanges = await parseConversation(sourcePath, project, archivePath); + const exchanges = await parseConversation(archivePath, project, archivePath); const newExchanges = maxIndexedLine > 0 ? exchanges.filter(e => e.lineStart > maxIndexedLine) : exchanges; @@ -386,6 +401,8 @@ export async function indexUnprocessed(concurrency: number = 1, noSummaries: boo } } // end sourceDir loop + logRedactions(tally); + if (unprocessed.length === 0) { console.log('✅ All conversations are already processed!'); db.close(); @@ -402,7 +419,7 @@ export async function indexUnprocessed(concurrency: number = 1, noSummaries: boo await processBatch(needsSummary, async (conv) => { try { - const summary = await summarizeConversation(conv.exchanges, sessionIdForSummary(conv.exchanges)); + const summary = await summarizeConversation(conv.exchanges, sessionIdForSummary(conv.exchanges), summarizeOptions(redactor)); fs.writeFileSync(conv.summaryPath, summary, 'utf-8'); const wordCount = summary.split(/\s+/).length; console.log(` ✓ ${conv.project}/${conv.file}: ${wordCount} words`); diff --git a/src/opencode-sync.ts b/src/opencode-sync.ts index b61f8ef4..60dae458 100644 --- a/src/opencode-sync.ts +++ b/src/opencode-sync.ts @@ -2,6 +2,7 @@ import fs from 'fs'; import path from 'path'; import Database from 'better-sqlite3'; import { getOpencodeDbPath, getOpencodeTranscriptDir } from './paths.js'; +import { loadRedactor, redactJsonlLine, type Redactor } from './redaction.js'; export interface OpencodeExportResult { exported: number; @@ -92,7 +93,8 @@ function shouldExportSession(filePath: string, sessionUpdatedMs: number): boolea function writeSessionTranscript( db: Database.Database, session: OpencodeSessionRow, - filePath: string + filePath: string, + redactor: Redactor | null ): void { const messages = db.prepare(` SELECT id, session_id, time_created, time_updated, data @@ -173,9 +175,15 @@ function writeSessionTranscript( })); } + // The staging transcript is a plugin-owned plaintext copy, so redact it at + // write time like the archive (docs/redaction/PHASE0-FINDINGS.md). + const output = redactor + ? lines.map(line => redactJsonlLine(line, redactor, { source: 'opencode', path: filePath })) + : lines; + fs.mkdirSync(path.dirname(filePath), { recursive: true }); const tempPath = `${filePath}.tmp.${process.pid}`; - fs.writeFileSync(tempPath, `${lines.join('\n')}\n`, 'utf-8'); + fs.writeFileSync(tempPath, `${output.join('\n')}\n`, 'utf-8'); fs.renameSync(tempPath, filePath); const mtime = dateFromMillis(session.time_updated); fs.utimesSync(filePath, mtime, mtime); @@ -184,7 +192,10 @@ function writeSessionTranscript( export function exportOpencodeSessions(options: { dbPath?: string; transcriptDir?: string; + /** `undefined` loads from the environment (strict mode throws on bad rules); `null` disables. */ + redactor?: Redactor | null; } = {}): OpencodeExportResult { + const redactor = options.redactor === undefined ? loadRedactor() : options.redactor; const dbPath = options.dbPath || getOpencodeDbPath(); const transcriptDir = options.transcriptDir || getOpencodeTranscriptDir(); const result: OpencodeExportResult = { @@ -234,7 +245,7 @@ export function exportOpencodeSessions(options: { result.skipped++; continue; } - writeSessionTranscript(db, session, filePath); + writeSessionTranscript(db, session, filePath, redactor); result.exported++; } catch (error) { result.errors.push({ diff --git a/src/redact-cli.ts b/src/redact-cli.ts new file mode 100644 index 00000000..6e75b0a6 --- /dev/null +++ b/src/redact-cli.ts @@ -0,0 +1,141 @@ +import fs from 'fs'; +import { getArchiveDir, getCursorLegacyExportDir, getOpencodeTranscriptDir } from './paths.js'; +import { acquireFileLock, readLockHolder, releaseFileLock } from './file-lock.js'; +import { getSyncLockPath } from './logging.js'; +import { + DEFAULT_REDACTION_CONFIG, + FindingsTally, + formatFindings, + getRedactionSettings, + loadRedactor, + redactJsonlLine, + type Redactor, +} from './redaction.js'; + +const args = process.argv.slice(2); + +const HELP = ` +Usage: episodic-memory redact [--rewrite [--dry-run]] [--stdin] [--print-default-rules] + +Secret redaction for the conversation archive and index. + +OPTIONS: + --rewrite Re-run redaction over the existing archive, staging exports, + and search index (in place). Rows that change are re-embedded, + and summaries built from unredacted text are deleted (the next + sync regenerates them). Run once after upgrading, and again + after adding rules. + --dry-run With --rewrite: report what would change, write nothing. + --stdin Redact stdin to stdout, one JSONL/text line at a time, and + print rule counts to stderr. Handy for testing rules. + --print-default-rules Print the bundled rules as JSON (a starting point for + redaction-rules.json). + --help, -h Show this help + +ENVIRONMENT: + EPISODIC_MEMORY_REDACTION on (default) | off + EPISODIC_MEMORY_REDACTION_RULES custom rules file (default: /redaction-rules.json) + EPISODIC_MEMORY_REDACTION_STRICT 1 (default) fails closed on a bad rules file | 0 passes through + +Output names rule IDs and counts only; matched values are never printed. +`; + +function fail(message: string): never { + console.error(`episodic-memory: ${message}`); + process.exit(1); +} + +function requireRedactor(): Redactor { + if (!getRedactionSettings().enabled) { + fail('redaction is off (EPISODIC_MEMORY_REDACTION=off); unset it to use this command.'); + } + let redactor: Redactor | null; + try { + // Always strict here: a rewrite with no rules would be a silent no-op. + redactor = loadRedactor({ ...process.env, EPISODIC_MEMORY_REDACTION_STRICT: '1' }); + } catch (error) { + fail(error instanceof Error ? error.message : String(error)); + } + return redactor!; +} + +async function runRewrite(dryRun: boolean): Promise { + const redactor = requireRedactor(); + + // Share sync's single-instance lock so a background sync can't write + // between our reads and renames. + const lockPath = getSyncLockPath(); + const lock = acquireFileLock(lockPath); + if (!lock) { + const holder = readLockHolder(lockPath); + fail(`a sync or index run is in progress (${holder !== null ? `pid ${holder}` : 'another process'}); try again when it finishes.`); + } + const release = () => releaseFileLock(lock); + process.on('exit', release); + + const { rewriteArchive } = await import('./redact-rewrite.js'); + let embeddingsReady = false; + const embed = async (user: string, assistant: string, toolNames?: string[]) => { + const embeddings = await import('./embeddings.js'); + if (!embeddingsReady) { + await embeddings.initEmbeddings(); + embeddingsReady = true; + } + return embeddings.generateExchangeEmbedding(user, assistant, toolNames); + }; + + const archiveDir = getArchiveDir(); + const stagingDirs = [getOpencodeTranscriptDir(), getCursorLegacyExportDir()].filter(d => fs.existsSync(d)); + console.log(`Redacting${dryRun ? ' (dry run)' : ''}: ${archiveDir}`); + for (const dir of stagingDirs) console.log(` + staging: ${dir}`); + + const result = await rewriteArchive({ + archiveDir, + stagingDirs, + redactor, + embed, + dryRun, + log: message => console.log(` ${message}`), + }); + + console.log(`\n${dryRun ? 'Would redact' : 'Redacted'} across archive, staging, and index: ${formatFindings(result.findings)}`); + if (dryRun && (result.filesRewritten || result.rowsUpdated || result.summariesRemoved || result.stagingFilesRewritten)) { + console.log('Run without --dry-run to apply.'); + } +} + +async function runStdin(): Promise { + const redactor = requireRedactor(); + const chunks: Buffer[] = []; + for await (const chunk of process.stdin) chunks.push(chunk as Buffer); + const input = Buffer.concat(chunks).toString('utf-8'); + const tally = new FindingsTally(); + const output = input.split('\n').map(line => redactJsonlLine(line, redactor, { source: 'stdin', path: '-' }, tally)); + process.stdout.write(output.join('\n')); + console.error(formatFindings(tally.toArray())); +} + +async function main(): Promise { + if (args.length === 0 || args.includes('--help') || args.includes('-h')) { + console.log(HELP); + return; + } + if (args.includes('--print-default-rules')) { + console.log(JSON.stringify(DEFAULT_REDACTION_CONFIG, null, 2)); + return; + } + if (args.includes('--stdin')) { + await runStdin(); + return; + } + if (args.includes('--rewrite')) { + await runRewrite(args.includes('--dry-run')); + return; + } + fail(`unknown option(s): ${args.join(' ')}. Try: episodic-memory redact --help`); +} + +main().catch(error => { + console.error('Error:', error instanceof Error ? error.message : error); + process.exit(1); +}); diff --git a/src/redact-rewrite.ts b/src/redact-rewrite.ts new file mode 100644 index 00000000..390f74b0 --- /dev/null +++ b/src/redact-rewrite.ts @@ -0,0 +1,220 @@ +import fs from 'fs'; +import path from 'path'; +import { initDatabase } from './db.js'; +import { recordReembedded } from './embedding-migration.js'; +import { + copyFileRedacted, + FindingsTally, + redactJsonlLine, + type RedactionFinding, + type Redactor, +} from './redaction.js'; + +/** + * Backfill for `episodic-memory redact --rewrite`: re-run redaction over data + * written before redaction existed (or before a rule was added). + * + * 1. Archive: every .jsonl is redacted in place. Line count and mtime are + * preserved, so index line ranges stay valid and sync still sees the + * archive as current. + * 2. Staging dirs (opencode / legacy Cursor exports): same, in place. + * 3. Index: every exchanges/tool_calls row is redacted in place. Changed rows + * are re-embedded from the redacted text, so no vector is left that was + * derived from a secret. + * 4. Summaries: a `-summary.txt` for a conversation that had findings (in the + * archive or the index), or one that matches a rule itself, is deleted. + * It was generated from unredacted text, and the next sync regenerates it + * from the redacted archive. + * + * Idempotent: a second run finds nothing to change. + */ + +export type EmbedFn = (user: string, assistant: string, toolNames?: string[]) => Promise; + +export interface RewriteOptions { + archiveDir: string; + redactor: Redactor; + embed: EmbedFn; + /** Count what would change without writing anything. */ + dryRun?: boolean; + /** Plugin-owned staging dirs to redact in place (not indexed). */ + stagingDirs?: string[]; + log?: (message: string) => void; +} + +export interface RewriteResult { + filesScanned: number; + filesRewritten: number; + stagingFilesRewritten: number; + rowsUpdated: number; + summariesRemoved: number; + /** Rule IDs and counts only — never matched values. */ + findings: RedactionFinding[]; +} + +const SUMMARY_SUFFIX = '-summary.txt'; +const PAGE_SIZE = 500; + +function walk(dir: string): string[] { + const out: string[] = []; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return out; + } + for (const entry of entries) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) out.push(...walk(full)); + else if (entry.isFile()) out.push(full); + } + return out; +} + +function summaryPathFor(jsonlPath: string): string { + return jsonlPath.replace(/\.jsonl$/, SUMMARY_SUFFIX); +} + +/** Redact one JSONL file in place. Returns the number of values redacted. */ +function rewriteFileInPlace(file: string, redactor: Redactor, dryRun: boolean, tally: FindingsTally): number { + const fileTally = new FindingsTally(); + const temp = `${file}.redact.${process.pid}`; + try { + copyFileRedacted(file, temp, redactor, { source: 'rewrite', path: file }, fileTally); + if (fileTally.total > 0 && !dryRun) { + const stat = fs.statSync(file); + fs.renameSync(temp, file); + // Same rounding as sync's copyIfNewer: never leave the archive older than its source. + fs.utimesSync(file, stat.atimeMs / 1000, Math.ceil(stat.mtimeMs) / 1000); + } + } finally { + try { fs.unlinkSync(temp); } catch {} + } + tally.add(fileTally.toArray()); + return fileTally.total; +} + +export async function rewriteArchive(options: RewriteOptions): Promise { + const { archiveDir, redactor, embed } = options; + const dryRun = options.dryRun === true; + const log = options.log ?? (() => {}); + const tally = new FindingsTally(); + const result: RewriteResult = { + filesScanned: 0, + filesRewritten: 0, + stagingFilesRewritten: 0, + rowsUpdated: 0, + summariesRemoved: 0, + findings: [], + }; + // Conversations whose summary was built from unredacted text. + const staleSummaries = new Set(); + + // 1. Archive files. + const archiveFiles = walk(archiveDir); + for (const file of archiveFiles.filter(f => f.endsWith('.jsonl'))) { + result.filesScanned++; + if (rewriteFileInPlace(file, redactor, dryRun, tally) > 0) { + result.filesRewritten++; + staleSummaries.add(summaryPathFor(file)); + } + } + log(`Archive: ${result.filesRewritten} of ${result.filesScanned} file(s) ${dryRun ? 'would be ' : ''}rewritten`); + + // 2. Staging dirs. + for (const dir of options.stagingDirs ?? []) { + for (const file of walk(dir).filter(f => f.endsWith('.jsonl'))) { + if (rewriteFileInPlace(file, redactor, dryRun, tally) > 0) result.stagingFilesRewritten++; + } + } + if (options.stagingDirs?.length) { + log(`Staging exports: ${result.stagingFilesRewritten} file(s) ${dryRun ? 'would be ' : ''}rewritten`); + } + + // 3. Index rows. Page by rowid so writes between pages don't disturb the scan. + const db = initDatabase(); + try { + const page = db.prepare( + 'SELECT rowid AS rid, id, user_message, assistant_message, archive_path FROM exchanges WHERE rowid > ? ORDER BY rowid LIMIT ?' + ); + const toolsFor = db.prepare('SELECT id, tool_name, tool_input, tool_result FROM tool_calls WHERE exchange_id = ? ORDER BY rowid'); + const updateExchange = db.prepare('UPDATE exchanges SET user_message = ?, assistant_message = ? WHERE id = ?'); + const updateTool = db.prepare('UPDATE tool_calls SET tool_input = ?, tool_result = ? WHERE id = ?'); + + let lastRowid = 0; + for (;;) { + const rows = page.all(lastRowid, PAGE_SIZE) as Array<{ + rid: number; id: string; user_message: string; assistant_message: string; archive_path: string; + }>; + if (rows.length === 0) break; + lastRowid = rows[rows.length - 1].rid; + + for (const row of rows) { + const rowTally = new FindingsTally(); + const ctx = { source: 'index', path: row.archive_path }; + const user = redactor.redact(row.user_message, ctx); + const assistant = redactor.redact(row.assistant_message, ctx); + rowTally.add(user.findings); + rowTally.add(assistant.findings); + + const tools = toolsFor.all(row.id) as Array<{ id: string; tool_name: string; tool_input: string | null; tool_result: string | null }>; + const toolUpdates: Array<{ id: string; input: string | null; result: string | null }> = []; + for (const tool of tools) { + // tool_input is JSON text; redactJsonlLine keeps it valid JSON. + const input = tool.tool_input === null ? null : redactJsonlLine(tool.tool_input, redactor, ctx, rowTally); + let output = tool.tool_result; + if (output !== null) { + const r = redactor.redact(output, ctx); + rowTally.add(r.findings); + output = r.text; + } + if (input !== tool.tool_input || output !== tool.tool_result) { + toolUpdates.push({ id: tool.id, input, result: output }); + } + } + + if (rowTally.total === 0) continue; + tally.add(rowTally.toArray()); + result.rowsUpdated++; + staleSummaries.add(summaryPathFor(row.archive_path)); + if (dryRun) continue; + + const toolNames = tools.length > 0 ? tools.map(t => t.tool_name) : undefined; + const embedding = await embed(user.text, assistant.text, toolNames); + db.transaction(() => { + updateExchange.run(user.text, assistant.text, row.id); + for (const t of toolUpdates) updateTool.run(t.input, t.result, t.id); + recordReembedded(db, row.id, embedding); + })(); + } + } + } finally { + db.close(); + } + log(`Index: ${result.rowsUpdated} exchange(s) ${dryRun ? 'would be ' : ''}redacted and re-embedded`); + + // 4. Summaries: stale ones, plus any summary that itself matches a rule. + for (const file of archiveFiles.filter(f => f.endsWith(SUMMARY_SUFFIX))) { + if (staleSummaries.has(file)) continue; + let text: string; + try { + text = fs.readFileSync(file, 'utf-8'); + } catch { + continue; + } + const r = redactor.redact(text, { source: 'summary', path: file }); + if (r.findings.length > 0) { + tally.add(r.findings); + staleSummaries.add(file); + } + } + for (const summary of staleSummaries) { + if (!fs.existsSync(summary)) continue; + result.summariesRemoved++; + if (!dryRun) fs.unlinkSync(summary); + } + log(`Summaries: ${result.summariesRemoved} ${dryRun ? 'would be ' : ''}removed (regenerated from redacted text on the next sync)`); + + result.findings = tally.toArray(); + return result; +} diff --git a/src/redaction-rules.ts b/src/redaction-rules.ts new file mode 100644 index 00000000..d73a043f --- /dev/null +++ b/src/redaction-rules.ts @@ -0,0 +1,168 @@ +import type { RedactionConfig } from './redaction.js'; + +/** + * Bundled default redaction rules. + * + * Patterns are ported from gitleaks' rule set (https://github.com/gitleaks/gitleaks, + * MIT), trimmed to the credentials that realistically show up in Claude Code / + * Codex transcripts for an Azure-heavy stack, and rewritten for JavaScript + * regex (lookbehind instead of gitleaks' consuming boundary groups, so + * adjacent matches aren't swallowed). + * + * Order matters: rules run top to bottom, and a later rule never re-matches + * inside an earlier rule's `[REDACTED:...]` token. Specific shapes go first so + * the token names the most precise rule; the generic `secret-assignment` + * keyword rule goes last. + * + * `secretGroup` replaces only that capture group, so surrounding context + * (connection-string server names, SAS URL paths, usernames) stays searchable. + * + * `keywords` is a case-insensitive prefilter: a rule only runs on text that + * contains at least one keyword. It keeps the per-string cost low on large + * transcripts and bounds the generic rules' work. + * + * Users extend or override these with `redaction-rules.json`; see + * docs/REDACTION.md. `episodic-memory redact --print-default-rules` dumps + * this object as JSON. + */ +export const DEFAULT_REDACTION_CONFIG: RedactionConfig = { + rules: [ + { + id: 'private-key-block', + description: 'PEM/OpenSSH private key block; a truncated block (no END line) is redacted to the end of the text', + pattern: String.raw`-----BEGIN[A-Z0-9 _-]{0,40}PRIVATE KEY(?: BLOCK)?-----[\s\S]*?(?:-----END[A-Z0-9 _-]{0,40}PRIVATE KEY(?: BLOCK)?-----|$)`, + keywords: ['private key'], + }, + { + id: 'connection-string-secret', + description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept', + pattern: String.raw`\b(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password|Pwd)[ \t]*=[ \t]*(?![\[$<{%])([^;"'\s]+)`, + secretGroup: 1, + keywords: ['accountkey', 'sharedaccess', 'sharedsecret', 'clientsecret', 'password', 'pwd'], + }, + { + id: 'azure-sas-token', + description: 'Signature of an Azure SAS token; the resource URL and other SAS parameters are kept', + pattern: String.raw`\bsig=([A-Za-z0-9%+/=_-]{16,})`, + secretGroup: 1, + keywords: ['sig='], + }, + { + id: 'jwt', + description: 'JSON Web Token (Entra ID / Azure access tokens, id tokens)', + pattern: String.raw`\beyJ[A-Za-z0-9_-]{8,}\.eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}`, + keywords: ['eyj'], + }, + { + id: 'anthropic-api-key', + pattern: String.raw`\bsk-ant-[a-z]{2,10}\d{2}-[A-Za-z0-9_-]{32,}`, + keywords: ['sk-ant-'], + }, + { + id: 'openai-api-key', + pattern: String.raw`\bsk-(?:[a-z]+-)?[A-Za-z0-9_-]{16,}T3BlbkFJ[A-Za-z0-9_-]{16,}`, + keywords: ['t3blbkfj'], + }, + { + id: 'github-token', + description: 'GitHub classic, OAuth, app and fine-grained tokens', + pattern: String.raw`\b(?:gh[pousr]_[A-Za-z0-9]{36,255}|github_pat_[A-Za-z0-9_]{22,255})\b`, + keywords: ['ghp_', 'gho_', 'ghu_', 'ghs_', 'ghr_', 'github_pat_'], + }, + { + id: 'aws-access-key-id', + pattern: String.raw`\b(?:AKIA|ASIA|ABIA|ACCA)[A-Z2-7]{16}\b`, + keywords: ['akia', 'asia', 'abia', 'acca'], + }, + { + id: 'aws-secret-access-key', + pattern: String.raw`aws[_-]?secret[_-]?access[_-]?key["']?[ \t]*[:=][ \t]*["']?([A-Za-z0-9/+]{40})(?![A-Za-z0-9/+])`, + flags: 'i', + secretGroup: 1, + keywords: ['secret'], + }, + { + id: 'slack-token', + pattern: String.raw`\bxox[abposr]-[A-Za-z0-9-]{10,}`, + keywords: ['xox'], + }, + { + id: 'google-api-key', + pattern: String.raw`\bAIza[0-9A-Za-z_-]{35}(?![0-9A-Za-z_-])`, + keywords: ['aiza'], + }, + { + id: 'npm-token', + pattern: String.raw`\bnpm_[A-Za-z0-9]{36}\b`, + keywords: ['npm_'], + }, + { + id: 'azure-client-secret', + description: 'Entra ID (Azure AD) application client secret: 3 chars, a digit, "Q~", 31-34 chars', + pattern: String.raw`(?]+:(?![\[$<{%])([^\s@/"'<>]+)@`, + secretGroup: 1, + keywords: ['://'], + }, + { + id: 'bearer-token', + pattern: String.raw`\bBearer\s+([A-Za-z0-9\-._~+/]{20,}=*)`, + flags: 'i', + secretGroup: 1, + keywords: ['bearer'], + }, + { + id: 'basic-auth', + pattern: String.raw`\bAuthorization[ \t]*:[ \t]*Basic\s+([A-Za-z0-9+/]{8,}={0,2})`, + flags: 'i', + secretGroup: 1, + keywords: ['basic'], + }, + { + id: 'secret-assignment', + description: + 'Value assigned to a secret-looking key (password: x, CLIENT_SECRET=x, "apiKey": "x"). ' + + 'Covers decrypted SOPS/YAML/dotenv/JSON. Requires 8+ chars including a digit; ' + + 'skips placeholders (${X}, , %X%, {{x}}) and code (calls, dotted member access)', + pattern: + String.raw`\b[A-Za-z0-9_.-]{0,40}?(?:secret|password|passwd|passphrase|api[_-]?key|access[_-]?key|private[_-]?key|token)` + + String.raw`["']?[ \t]*[:=][ \t]*["']?(?![\[$<{%])(?=[^\s"',;&\\]*\d)` + + // Not a dotted identifier path (env.AUTH0_SECRET, this.config.token2): code, not a value. + String.raw`(?![A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+(?:$|[\s"',;&\\)}\]]))` + + String.raw`([^\s"',;&\\()<>{}\[\]]{8,})(?=$|[\s"',;&\\)}\]])`, + flags: 'i', + secretGroup: 1, + keywords: ['secret', 'passw', 'passphrase', 'key', 'token'], + }, + ], + allowlist: [ + { + id: 'git-sha', + description: 'Full or short git commit SHA', + pattern: String.raw`\b[0-9a-f]{7,40}\b`, + }, + { + id: 'guid', + description: 'GUID/UUID (Entra tenant, client and object IDs, subscription IDs)', + pattern: String.raw`\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b`, + }, + ], + entropy: { + enabled: false, + minLength: 32, + threshold: 4.5, + requireKeyword: true, + keywords: ['secret', 'key', 'token', 'password', 'passwd', 'credential', 'signature'], + window: 40, + }, +}; diff --git a/src/redaction.ts b/src/redaction.ts new file mode 100644 index 00000000..ccd95a12 --- /dev/null +++ b/src/redaction.ts @@ -0,0 +1,618 @@ +import fs from 'fs'; +import path from 'path'; +import { StringDecoder } from 'string_decoder'; +import { getSuperpowersDir } from './paths.js'; +import { DEFAULT_REDACTION_CONFIG } from './redaction-rules.js'; + +/** + * Inline secret redaction. + * + * Secrets are replaced with typed tokens (`[REDACTED:]`) at the archive + * write, the one point every harness's transcripts pass through (see + * docs/redaction/PHASE0-FINDINGS.md). Everything downstream (SQLite text, + * tool_calls, embeddings, summaries, show/read) reads the archive, so it only + * ever sees redacted text. + * + * Invariants: + * - Findings carry rule IDs and counts only. A matched value is never logged, + * returned, or thrown. + * - Idempotent: a `[REDACTED:...]` token never matches a rule, so redacting + * redacted text is a no-op. + * - JSONL structure is preserved: one output line per input line, valid JSON in + * gives valid JSON out, and unchanged lines are byte-identical. + */ + +export { DEFAULT_REDACTION_CONFIG }; + +/** Fork default. Flip to false for an opt-in upstream build. */ +export const REDACTION_ENABLED_BY_DEFAULT = true; + +export const REDACTION_RULES_FILENAME = 'redaction-rules.json'; + +const RULE_ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/; +const TOKEN_PATTERN = /\[REDACTED:[a-z0-9][a-z0-9-]*\]/g; +const TOKEN_PREFIX = '[REDACTED:'; +const ALLOWED_FLAGS = /^[imsu]*$/; +const ENTROPY_RULE_ID = 'high-entropy'; + +export interface RedactionRuleSpec { + id: string; + pattern: string; + /** Extra RegExp flags from [imsu]; `g` and `d` are always added. */ + flags?: string; + /** Case-insensitive prefilter: skip the rule unless the text contains one. */ + keywords?: string[]; + /** Replace only this capture group instead of the whole match. */ + secretGroup?: number; + description?: string; +} + +export interface AllowlistSpec { + id: string; + /** Matched against the whole candidate secret; a full match keeps it. */ + pattern: string; + flags?: string; + description?: string; +} + +export interface EntropySpec { + enabled: boolean; + minLength: number; + /** Shannon entropy in bits per character. */ + threshold: number; + /** Only fire when a keyword appears shortly before the candidate, on the same line. */ + requireKeyword: boolean; + keywords: string[]; + /** How many characters before the candidate to search for a keyword. */ + window: number; +} + +export interface RedactionConfig { + rules: RedactionRuleSpec[]; + allowlist: AllowlistSpec[]; + entropy: EntropySpec; +} + +/** Shape of a user `redaction-rules.json`. Every field is optional. */ +export interface RedactionRulesFile { + /** Merge with the bundled defaults (default true). */ + includeDefaults?: boolean; + /** Added after the defaults; a rule with a default's id replaces it in place. */ + rules?: RedactionRuleSpec[]; + /** Default rule ids to turn off. */ + disableRules?: string[]; + /** Added to the default allowlist (same id replaces). */ + allowlist?: AllowlistSpec[]; + entropy?: Partial; +} + +export interface RedactionContext { + source: string; + path: string; +} + +export interface RedactionFinding { + ruleId: string; + count: number; +} + +export interface RedactionResult { + text: string; + findings: RedactionFinding[]; +} + +export interface Redactor { + redact(text: string, ctx?: RedactionContext): RedactionResult; + readonly ruleIds: string[]; +} + +export interface RedactionSettings { + enabled: boolean; + strict: boolean; + /** Explicit EPISODIC_MEMORY_REDACTION_RULES path, if set. */ + rulesPath?: string; +} + +/** Rules could not be loaded or are invalid. Messages describe config only. */ +export class RedactionConfigError extends Error { + constructor(message: string) { + super(message); + this.name = 'RedactionConfigError'; + } +} + +// --------------------------------------------------------------------------- +// Settings and loading +// --------------------------------------------------------------------------- + +const OFF_VALUES = new Set(['off', '0', 'false', 'no', 'disabled']); +const ON_VALUES = new Set(['on', '1', 'true', 'yes', 'enabled']); + +/** Unknown values fall back to the default, which is the safe side for both switches. */ +function parseToggle(raw: string | undefined, fallback: boolean): boolean { + const value = raw?.trim().toLowerCase(); + if (!value) return fallback; + if (OFF_VALUES.has(value)) return false; + if (ON_VALUES.has(value)) return true; + return fallback; +} + +/** + * EPISODIC_MEMORY_REDACTION on (fork default) | off + * EPISODIC_MEMORY_REDACTION_RULES path to a custom rules file + * EPISODIC_MEMORY_REDACTION_STRICT 1 (default) | 0; strict fails closed on a rules-load error + */ +export function getRedactionSettings(env: NodeJS.ProcessEnv = process.env): RedactionSettings { + return { + enabled: parseToggle(env.EPISODIC_MEMORY_REDACTION, REDACTION_ENABLED_BY_DEFAULT), + strict: parseToggle(env.EPISODIC_MEMORY_REDACTION_STRICT, true), + rulesPath: env.EPISODIC_MEMORY_REDACTION_RULES || undefined, + }; +} + +function readRulesFile(settings: RedactionSettings): RedactionRulesFile { + let rulesPath = settings.rulesPath; + if (!rulesPath) { + const candidate = path.join(getSuperpowersDir(), REDACTION_RULES_FILENAME); + if (!fs.existsSync(candidate)) return {}; + rulesPath = candidate; + } + let raw: string; + try { + raw = fs.readFileSync(rulesPath, 'utf-8'); + } catch (error) { + throw new RedactionConfigError( + `Redaction rules failed to load from ${rulesPath}: ${error instanceof Error ? error.message : String(error)}` + ); + } + try { + return JSON.parse(raw) as RedactionRulesFile; + } catch (error) { + throw new RedactionConfigError( + `Redaction rules file ${rulesPath} is not valid JSON: ${error instanceof Error ? error.message : String(error)}` + ); + } +} + +function replaceById(base: T[], additions: T[]): T[] { + const out = [...base]; + for (const item of additions) { + const at = out.findIndex(existing => existing.id === item.id); + if (at >= 0) out[at] = item; + else out.push(item); + } + return out; +} + +/** + * Merge a rules file with the bundled defaults and validate the result. + * Throws RedactionConfigError on any invalid rule. + */ +export function loadRedactionConfig(file: RedactionRulesFile): RedactionConfig { + if (!file || typeof file !== 'object' || Array.isArray(file)) { + throw new RedactionConfigError('Redaction rules file must contain a JSON object'); + } + for (const key of ['rules', 'allowlist', 'disableRules'] as const) { + if (file[key] !== undefined && !Array.isArray(file[key])) { + throw new RedactionConfigError(`Redaction rules file: "${key}" must be an array`); + } + } + if (file.entropy !== undefined && (typeof file.entropy !== 'object' || file.entropy === null)) { + throw new RedactionConfigError('Redaction rules file: "entropy" must be an object'); + } + + const includeDefaults = file.includeDefaults !== false; + const disabled = new Set(file.disableRules ?? []); + const baseRules = includeDefaults ? DEFAULT_REDACTION_CONFIG.rules : []; + const baseAllowlist = includeDefaults ? DEFAULT_REDACTION_CONFIG.allowlist : []; + + const config: RedactionConfig = { + rules: replaceById(baseRules, file.rules ?? []).filter(rule => !disabled.has(rule.id)), + allowlist: replaceById(baseAllowlist, file.allowlist ?? []), + entropy: { ...DEFAULT_REDACTION_CONFIG.entropy, ...(file.entropy ?? {}) }, + }; + compileConfig(config); // validate + return config; +} + +/** + * Load the active redactor from the environment. + * + * Returns null when redaction is off. When the rules can't be loaded: strict + * mode (the default) throws RedactionConfigError so callers fail closed; + * non-strict mode warns and returns null, so text passes through unredacted. + */ +export function loadRedactor( + env: NodeJS.ProcessEnv = process.env, + warn: (message: string) => void = message => console.error(message) +): Redactor | null { + const settings = getRedactionSettings(env); + if (!settings.enabled) return null; + try { + return createRedactor(loadRedactionConfig(readRulesFile(settings))); + } catch (error) { + const err = error instanceof RedactionConfigError + ? error + : new RedactionConfigError(`Redaction rules failed to load: ${error instanceof Error ? error.message : String(error)}`); + if (settings.strict) throw err; + warn( + `episodic-memory: ${err.message}. EPISODIC_MEMORY_REDACTION_STRICT=0, so conversations ` + + 'will be archived and indexed WITHOUT redaction this run.' + ); + return null; + } +} + +// --------------------------------------------------------------------------- +// Compilation +// --------------------------------------------------------------------------- + +interface CompiledRule { + id: string; + regex: RegExp; + keywords?: string[]; + secretGroup: number; +} + +interface CompiledConfig { + rules: CompiledRule[]; + allowlist: RegExp[]; + entropy: EntropySpec; +} + +function checkFlags(flags: string | undefined, what: string): string { + const value = flags ?? ''; + if (typeof value !== 'string' || !ALLOWED_FLAGS.test(value)) { + throw new RedactionConfigError(`${what}: flags must be a combination of "imsu"`); + } + return value; +} + +function compileRule(spec: RedactionRuleSpec): CompiledRule { + if (!spec || typeof spec !== 'object') { + throw new RedactionConfigError('Redaction rule must be an object'); + } + if (typeof spec.id !== 'string' || !RULE_ID_PATTERN.test(spec.id)) { + throw new RedactionConfigError( + `Redaction rule id ${JSON.stringify(spec.id)} is invalid: use lowercase letters, digits and dashes` + ); + } + if (spec.id === ENTROPY_RULE_ID) { + throw new RedactionConfigError(`Redaction rule id "${ENTROPY_RULE_ID}" is reserved`); + } + const what = `Redaction rule "${spec.id}"`; + if (typeof spec.pattern !== 'string' || spec.pattern.length === 0) { + throw new RedactionConfigError(`${what}: pattern must be a non-empty string`); + } + const flags = checkFlags(spec.flags, what); + + let regex: RegExp; + let groupCount: number; + try { + regex = new RegExp(spec.pattern, flags + 'gd'); + groupCount = new RegExp(`(?:${spec.pattern})|`, flags).exec('')!.length - 1; + } catch (error) { + throw new RedactionConfigError(`${what}: invalid regular expression (${error instanceof Error ? error.message : String(error)})`); + } + if (new RegExp(spec.pattern, flags).test('')) { + throw new RedactionConfigError(`${what}: pattern matches the empty string`); + } + + const secretGroup = spec.secretGroup ?? 0; + if (!Number.isInteger(secretGroup) || secretGroup < 0 || secretGroup > groupCount) { + throw new RedactionConfigError(`${what}: secretGroup ${secretGroup} does not exist in the pattern (${groupCount} group(s))`); + } + + let keywords: string[] | undefined; + if (spec.keywords !== undefined) { + if (!Array.isArray(spec.keywords) || spec.keywords.some(k => typeof k !== 'string' || k.length === 0)) { + throw new RedactionConfigError(`${what}: keywords must be an array of non-empty strings`); + } + keywords = spec.keywords.length > 0 ? spec.keywords.map(k => k.toLowerCase()) : undefined; + } + + return { id: spec.id, regex, keywords, secretGroup }; +} + +function compileAllowlist(spec: AllowlistSpec): RegExp { + const what = `Redaction allowlist entry ${JSON.stringify(spec?.id)}`; + if (!spec || typeof spec.pattern !== 'string' || spec.pattern.length === 0) { + throw new RedactionConfigError(`${what}: pattern must be a non-empty string`); + } + const flags = checkFlags(spec.flags, what); + try { + return new RegExp(`^(?:${spec.pattern})$`, flags); + } catch (error) { + throw new RedactionConfigError(`${what}: invalid regular expression (${error instanceof Error ? error.message : String(error)})`); + } +} + +function compileConfig(config: RedactionConfig): CompiledConfig { + const seen = new Set(); + const rules = config.rules.map(spec => { + const rule = compileRule(spec); + if (seen.has(rule.id)) throw new RedactionConfigError(`Duplicate redaction rule id "${rule.id}"`); + seen.add(rule.id); + return rule; + }); + const allowlist = config.allowlist.map(compileAllowlist); + + const e = config.entropy; + if ( + typeof e.enabled !== 'boolean' || typeof e.requireKeyword !== 'boolean' || + !Number.isInteger(e.minLength) || e.minLength < 8 || + typeof e.threshold !== 'number' || !(e.threshold > 0) || + !Number.isInteger(e.window) || e.window < 0 || + !Array.isArray(e.keywords) || e.keywords.some(k => typeof k !== 'string' || !k) + ) { + throw new RedactionConfigError( + 'Redaction entropy settings are invalid (need enabled, requireKeyword: boolean; minLength >= 8; threshold > 0; window >= 0; keywords: string[])' + ); + } + return { rules, allowlist, entropy: { ...e, keywords: e.keywords.map(k => k.toLowerCase()) } }; +} + +// --------------------------------------------------------------------------- +// Redaction engine +// --------------------------------------------------------------------------- + +function tokenFor(ruleId: string): string { + return `${TOKEN_PREFIX}${ruleId}]`; +} + +function tokenSpans(text: string): Array<[number, number]> { + const spans: Array<[number, number]> = []; + for (const m of text.matchAll(TOKEN_PATTERN)) spans.push([m.index!, m.index! + m[0].length]); + return spans; +} + +function overlapsAny(spans: Array<[number, number]>, start: number, end: number): boolean { + for (const [s, e] of spans) if (start < e && end > s) return true; + return false; +} + +function shannonEntropy(text: string): number { + const counts = new Map(); + for (const ch of text) counts.set(ch, (counts.get(ch) ?? 0) + 1); + let entropy = 0; + for (const n of counts.values()) { + const p = n / text.length; + entropy -= p * Math.log2(p); + } + return entropy; +} + +/** + * Replace each accepted match (or its secretGroup) with a token. A candidate is + * skipped when it overlaps an existing token (idempotency) or fully matches an + * allowlist pattern. + */ +function applyRule(text: string, rule: CompiledRule, isAllowed: (s: string) => boolean): { text: string; count: number } { + const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; + const token = tokenFor(rule.id); + let out = ''; + let last = 0; + let count = 0; + for (const m of text.matchAll(rule.regex)) { + const range = m.indices?.[rule.secretGroup]; + if (!range) continue; + const [start, end] = range; + if (end <= start || start < last) continue; + if (spans && overlapsAny(spans, start, end)) continue; + if (isAllowed(text.slice(start, end))) continue; + out += text.slice(last, start) + token; + last = end; + count++; + } + return count === 0 ? { text, count } : { text: out + text.slice(last), count }; +} + +function applyEntropy(text: string, spec: EntropySpec, isAllowed: (s: string) => boolean): { text: string; count: number } { + const candidates = new RegExp(`[A-Za-z0-9+/=_.~-]{${spec.minLength},}`, 'g'); + const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; + const token = tokenFor(ENTROPY_RULE_ID); + let out = ''; + let last = 0; + let count = 0; + for (const m of text.matchAll(candidates)) { + const start = m.index!; + const end = start + m[0].length; + if (spans && overlapsAny(spans, start, end)) continue; + if (isAllowed(m[0])) continue; + if (shannonEntropy(m[0]) < spec.threshold) continue; + if (spec.requireKeyword) { + let before = text.slice(Math.max(0, start - spec.window), start); + before = before.slice(before.lastIndexOf('\n') + 1).toLowerCase(); + if (!spec.keywords.some(k => before.includes(k))) continue; + } + out += text.slice(last, start) + token; + last = end; + count++; + } + return count === 0 ? { text, count } : { text: out + text.slice(last), count }; +} + +export function createRedactor(config: RedactionConfig): Redactor { + const compiled = compileConfig(config); + const isAllowed = (secret: string) => compiled.allowlist.some(re => re.test(secret)); + + return { + ruleIds: compiled.rules.map(r => r.id), + redact(text: string, _ctx?: RedactionContext): RedactionResult { + if (typeof text !== 'string' || text.length === 0) return { text, findings: [] }; + let current = text; + let lower: string | null = null; + const counts = new Map(); + + for (const rule of compiled.rules) { + if (rule.keywords) { + lower ??= current.toLowerCase(); + if (!rule.keywords.some(k => lower!.includes(k))) continue; + } + const r = applyRule(current, rule, isAllowed); + if (r.count > 0) { + current = r.text; + lower = null; + counts.set(rule.id, (counts.get(rule.id) ?? 0) + r.count); + } + } + + if (compiled.entropy.enabled) { + const r = applyEntropy(current, compiled.entropy, isAllowed); + if (r.count > 0) { + current = r.text; + counts.set(ENTROPY_RULE_ID, r.count); + } + } + + return { text: current, findings: [...counts].map(([ruleId, count]) => ({ ruleId, count })) }; + }, + }; +} + +// --------------------------------------------------------------------------- +// Findings +// --------------------------------------------------------------------------- + +/** Aggregates findings by rule id. Never holds matched values. */ +export class FindingsTally { + private counts = new Map(); + + add(findings: RedactionFinding[]): void { + for (const f of findings) this.counts.set(f.ruleId, (this.counts.get(f.ruleId) ?? 0) + f.count); + } + + get total(): number { + let n = 0; + for (const c of this.counts.values()) n += c; + return n; + } + + toArray(): RedactionFinding[] { + return [...this.counts].map(([ruleId, count]) => ({ ruleId, count })); + } +} + +/** "7 value(s) redacted (azure-storage-key: 2, jwt: 5)" */ +export function formatFindings(findings: RedactionFinding[]): string { + const total = findings.reduce((n, f) => n + f.count, 0); + if (total === 0) return 'no values redacted'; + const detail = [...findings] + .sort((a, b) => b.count - a.count || a.ruleId.localeCompare(b.ruleId)) + .map(f => `${f.ruleId}: ${f.count}`) + .join(', '); + return `${total} value(s) redacted (${detail})`; +} + +// --------------------------------------------------------------------------- +// JSON / JSONL / files +// --------------------------------------------------------------------------- + +/** Redact every string value in a parsed JSON tree, in place. Keys are left alone. */ +function redactTree( + node: unknown, + redactor: Redactor, + ctx: RedactionContext | undefined, + tally: FindingsTally | undefined +): { value: unknown; changed: boolean } { + if (typeof node === 'string') { + const r = redactor.redact(node, ctx); + if (r.findings.length === 0) return { value: node, changed: false }; + tally?.add(r.findings); + return { value: r.text, changed: r.text !== node }; + } + if (node === null || typeof node !== 'object') return { value: node, changed: false }; + + let changed = false; + if (Array.isArray(node)) { + for (let i = 0; i < node.length; i++) { + const r = redactTree(node[i], redactor, ctx, tally); + if (r.changed) { node[i] = r.value; changed = true; } + } + return { value: node, changed }; + } + const obj = node as Record; + for (const key of Object.keys(obj)) { + const r = redactTree(obj[key], redactor, ctx, tally); + if (r.changed) { + Object.defineProperty(obj, key, { value: r.value, writable: true, enumerable: true, configurable: true }); + changed = true; + } + } + return { value: obj, changed }; +} + +/** + * Redact one JSONL line. Valid JSON stays valid (string values are redacted + * and the line is re-serialized only if something changed); a line that isn't + * JSON (e.g. a torn last line mid-write) is redacted as raw text. A trailing + * `\r` is preserved. + */ +export function redactJsonlLine( + line: string, + redactor: Redactor, + ctx?: RedactionContext, + tally?: FindingsTally +): string { + const cr = line.endsWith('\r') ? '\r' : ''; + const body = cr ? line.slice(0, -1) : line; + if (body.trim().length === 0) return line; + + let parsed: unknown; + try { + parsed = JSON.parse(body); + } catch { + const r = redactor.redact(body, ctx); + if (r.findings.length === 0) return line; + tally?.add(r.findings); + return r.text + cr; + } + + const r = redactTree(parsed, redactor, ctx, tally); + return r.changed ? JSON.stringify(r.value) + cr : line; +} + +const COPY_CHUNK_BYTES = 1 << 20; // 1 MiB + +/** + * Stream `src` to `dest`, redacting line by line. Writes `dest` directly; + * callers that need atomicity write to a temp path and rename. Line count and + * trailing-newline shape match the source exactly, so archive line numbers + * (exchanges.line_start/line_end, MCP read ranges) stay valid. + */ +export function copyFileRedacted( + src: string, + dest: string, + redactor: Redactor, + ctx?: RedactionContext, + tally?: FindingsTally +): void { + const fdIn = fs.openSync(src, 'r'); + let fdOut: number | undefined; + try { + fdOut = fs.openSync(dest, 'w'); + const buf = Buffer.allocUnsafe(COPY_CHUNK_BYTES); + const decoder = new StringDecoder('utf8'); + let pending = ''; + let bytesRead: number; + while ((bytesRead = fs.readSync(fdIn, buf, 0, buf.length, null)) > 0) { + let scanFrom = pending.length; + pending += decoder.write(buf.subarray(0, bytesRead)); + const out: string[] = []; + let start = 0; + let nl: number; + while ((nl = pending.indexOf('\n', scanFrom)) !== -1) { + out.push(redactJsonlLine(pending.slice(start, nl), redactor, ctx, tally), '\n'); + start = nl + 1; + scanFrom = start; + } + if (out.length > 0) fs.writeSync(fdOut, out.join('')); + pending = pending.slice(start); + } + pending += decoder.end(); + if (pending.length > 0) fs.writeSync(fdOut, redactJsonlLine(pending, redactor, ctx, tally)); + } finally { + fs.closeSync(fdIn); + if (fdOut !== undefined) fs.closeSync(fdOut); + } +} diff --git a/src/summarizer.ts b/src/summarizer.ts index d7e3cc04..23b0f31d 100644 --- a/src/summarizer.ts +++ b/src/summarizer.ts @@ -702,7 +702,23 @@ export function getCodexModel(_exchanges: ConversationExchange[]): string | unde return process.env.EPISODIC_MEMORY_CODEX_MODEL || undefined; } -export async function summarizeConversation(exchanges: ConversationExchange[], sessionId?: string): Promise { +export interface SummarizeOptions { + /** + * Allow Claude session resume and Codex thread/fork (default true). Both + * paths make the model read the *source* transcript rather than `exchanges`, + * so callers pass false when the exchanges were redacted (see + * docs/redaction/PHASE0-FINDINGS.md) to force the transcript-text path. + */ + allowResume?: boolean; +} + +export async function summarizeConversation( + exchanges: ConversationExchange[], + sessionId?: string, + options: SummarizeOptions = {} +): Promise { + const allowResume = options.allowResume !== false; + // Handle trivial conversations if (exchanges.length === 0) { return 'Trivial conversation with no substantive content.'; @@ -715,7 +731,7 @@ export async function summarizeConversation(exchanges: ConversationExchange[], s } } - const codexSessionId = getCodexSessionId(exchanges, sessionId); + const codexSessionId = allowResume ? getCodexSessionId(exchanges, sessionId) : undefined; if (codexSessionId) { try { const result = await callCodex(buildCodexSummaryPrompt(), codexSessionId, getCodexModel(exchanges)); @@ -742,7 +758,7 @@ export async function summarizeConversation(exchanges: ConversationExchange[], s const isClaudeSession = exchanges.some( e => e.harness === 'claude' || e.harness === undefined ); - const claudeSessionId = !codexSessionId && isClaudeSession ? sessionId : undefined; + const claudeSessionId = allowResume && !codexSessionId && isClaudeSession ? sessionId : undefined; const cwd = claudeSessionId ? exchanges.find(e => e.cwd)?.cwd : undefined; const conversationText = claudeSessionId ? '' // When resuming, no need to include conversation text - it's already in context diff --git a/src/sync-cli.ts b/src/sync-cli.ts index 297b20f8..b12ca46b 100644 --- a/src/sync-cli.ts +++ b/src/sync-cli.ts @@ -14,6 +14,7 @@ import { spawn } from 'child_process'; import fs from 'fs'; import { formatLogLine, getSyncLogPath, getSyncLockPath } from './logging.js'; import { acquireFileLock, readLockHolder, releaseFileLock } from './file-lock.js'; +import { FindingsTally, formatFindings, getRedactionSettings, loadRedactor, type Redactor } from './redaction.js'; const args = process.argv.slice(2); @@ -48,10 +49,13 @@ Sync conversations from Claude Code, Codex, and opencode transcript sources to a This command: 1. Exports opencode sessions from its SQLite database when available -2. Copies new or updated .jsonl files to conversation archive +2. Copies new or updated .jsonl files to conversation archive, redacting secrets 3. Generates embeddings for semantic search 4. Updates the search index +Secrets are replaced with [REDACTED:] tokens before anything is archived, +indexed, embedded, or summarized. See EPISODIC_MEMORY_REDACTION* in the README. + Only processes files that are new or have been modified since last sync. Safe to run multiple times - subsequent runs are fast no-ops. @@ -157,8 +161,23 @@ if (isBackground) { process.exit(0); } +// Load redaction rules before anything is exported, copied, or indexed. In +// strict mode (the default) a bad rules file stops the sync here: fail closed +// rather than archive unredacted text. +let redactor: Redactor | null; +try { + redactor = loadRedactor(); +} catch (error) { + console.error(`episodic-memory: ${error instanceof Error ? error.message : String(error)}`); + console.error( + 'episodic-memory: refusing to sync without redaction (strict mode). Fix the rules file, ' + + 'or set EPISODIC_MEMORY_REDACTION_STRICT=0 to sync unredacted, or EPISODIC_MEMORY_REDACTION=off.' + ); + process.exit(1); +} + if (!onlyHarnesses || onlyHarnesses.includes('opencode')) { - const opencodeExport = exportOpencodeSessions(); + const opencodeExport = exportOpencodeSessions({ redactor }); if (opencodeExport.exported > 0 || opencodeExport.skipped > 0) { console.log(`opencode export: ${opencodeExport.exported} exported, ${opencodeExport.skipped} skipped`); } @@ -215,8 +234,11 @@ console.log(`Destination: ${destDir}\n`); async function syncAll() { const totals = { copied: 0, skipped: 0, indexed: 0, summarized: 0, errors: [] as Array<{file: string; error: string}>, sourcesWithSummaryWork: 0, totalNeedingSummaries: 0 }; + const redactions = new FindingsTally(); + for (const sourceDir of sourceDirs) { - const result = await syncConversations(sourceDir, destDir, { ...syncOptions, summaryLimit }); + const result = await syncConversations(sourceDir, destDir, { ...syncOptions, summaryLimit, redactor }); + redactions.add(result.redactions); totals.copied += result.copied; totals.skipped += result.skipped; totals.indexed += result.indexed; @@ -233,6 +255,14 @@ async function syncAll() { } else { console.log(` Summarized: ${totals.summarized}`); } + // Rule IDs and counts only — never matched values. + if (redactor) { + console.log(` Redaction: ${formatFindings(redactions.toArray())}`); + } else if (getRedactionSettings().enabled) { + console.log(' Redaction: NOT APPLIED (rules failed to load; EPISODIC_MEMORY_REDACTION_STRICT=0)'); + } else { + console.log(' Redaction: off (EPISODIC_MEMORY_REDACTION=off)'); + } if (totals.errors.length > 0) { console.log(`\n⚠️ Errors: ${totals.errors.length}`); diff --git a/src/sync.ts b/src/sync.ts index d9ee6810..b2de456c 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -5,6 +5,7 @@ import { SUMMARIZER_CONTEXT_MARKER } from './constants.js'; import { getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { formatErrorSentinel, shouldQueueForSummary } from './summary-sentinel.js'; import { getMaxMessageBytes, isOversizeExchange } from './message-size.js'; +import { copyFileRedacted, FindingsTally, loadRedactor, type RedactionFinding, type Redactor } from './redaction.js'; const EXCLUSION_MARKERS = [ 'DO NOT INDEX THIS CHAT', @@ -105,12 +106,19 @@ export interface SyncResult { indexed: number; summarized: number; errors: Array<{ file: string; error: string }>; + /** Rule IDs and counts only — never matched values. */ + redactions: RedactionFinding[]; } export interface SyncOptions { skipIndex?: boolean; skipSummaries?: boolean; summaryLimit?: number; // Max summaries to generate per run (default: 10) + /** + * Redactor applied at the archive write. `undefined` loads it from the + * environment (loadRedactor); `null` means redaction is off. + */ + redactor?: Redactor | null; } /** @@ -132,7 +140,18 @@ export function buildSyncOptionsFromEnv(env: NodeJS.ProcessEnv): SyncOptions { return { skipSummaries: env.EPISODIC_MEMORY_SKIP_SUMMARIES === '1' }; } -function copyIfNewer(src: string, dest: string): boolean { +/** + * Copy `src` into the archive at `dest` when the archive copy is missing or + * older. This is the redaction choke point: with a redactor, the copy is + * redacted line by line (see redaction.ts), and every downstream stage + * (index, embeddings, summaries, show/read) reads the archive. + */ +export function copyIfNewer( + src: string, + dest: string, + redactor: Redactor | null = null, + tally?: FindingsTally +): boolean { // Ensure destination directory exists const destDir = path.dirname(dest); if (!fs.existsSync(destDir)) { @@ -150,8 +169,17 @@ function copyIfNewer(src: string, dest: string): boolean { // Atomic copy: temp file + rename const tempDest = dest + '.tmp.' + process.pid; - fs.copyFileSync(src, tempDest); - fs.renameSync(tempDest, dest); // Atomic on same filesystem + try { + if (redactor) { + copyFileRedacted(src, tempDest, redactor, { source: 'archive', path: src }, tally); + } else { + fs.copyFileSync(src, tempDest); + } + fs.renameSync(tempDest, dest); // Atomic on same filesystem + } catch (error) { + try { fs.unlinkSync(tempDest); } catch {} + throw error; + } // Preserve source mtime: harnesses without per-message timestamps (Cursor // agent transcripts) fall back to file mtime. Round up to the next whole @@ -184,9 +212,16 @@ export async function syncConversations( skipped: 0, indexed: 0, summarized: 0, - errors: [] + errors: [], + redactions: [] }; + // Load the redactor before touching the archive. In strict mode (the + // default) a rules-load failure throws here, so nothing unredacted is + // archived, indexed, or summarized (fail closed). + const redactor = options.redactor === undefined ? loadRedactor() : options.redactor; + const tally = new FindingsTally(); + // Ensure source directory exists if (!fs.existsSync(sourceDir)) { return result; @@ -226,7 +261,7 @@ export async function syncConversations( continue; } - const wasCopied = copyIfNewer(srcFile, destFile); + const wasCopied = copyIfNewer(srcFile, destFile, redactor, tally); if (wasCopied) { result.copied++; filesToIndex.push(destFile); @@ -257,6 +292,8 @@ export async function syncConversations( } } + result.redactions = tally.toArray(); + // Index copied files (unless skipIndex is set) if (!options.skipIndex && filesToIndex.length > 0) { const { parseConversation } = await import('./parser.js'); @@ -395,7 +432,10 @@ export async function syncConversations( } console.log(` Summarizing ${path.basename(filePath)} (${exchanges.length} exchanges)...`); - const summary = await summarizeConversation(exchanges, sessionId); + // With redaction on, never resume/fork the session: those paths hand + // the model the unredacted source transcript instead of these + // (redacted) exchanges. + const summary = await summarizeConversation(exchanges, sessionId, { allowResume: redactor === null }); const summaryPath = filePath.replace('.jsonl', '-summary.txt'); fs.writeFileSync(summaryPath, summary, 'utf-8'); diff --git a/src/verify.ts b/src/verify.ts index 0dd2c5db..f0b86110 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -4,6 +4,7 @@ import { parseConversation } from './parser.js'; import { initDatabase, getAllExchanges, getFileLastIndexed } from './db.js'; import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { isErroredSentinel } from './summary-sentinel.js'; +import { getRedactionSettings } from './redaction.js'; export interface VerificationResult { missing: Array<{ path: string; reason: string }>; @@ -160,7 +161,8 @@ export async function repairIndex(issues: VerificationResult): Promise { // Generate/update summary const summaryPath = conversationPath.replace('.jsonl', '-summary.txt'); - const summary = await summarizeConversation(exchanges); + // Under redaction, don't let the Codex fork fallback read the source rollout. + const summary = await summarizeConversation(exchanges, undefined, { allowResume: !getRedactionSettings().enabled }); fs.writeFileSync(summaryPath, summary, 'utf-8'); console.log(` Created summary: ${summary.split(/\s+/).length} words`); diff --git a/test/fake-secrets.ts b/test/fake-secrets.ts new file mode 100644 index 00000000..15deb68c --- /dev/null +++ b/test/fake-secrets.ts @@ -0,0 +1,146 @@ +/** + * Fake-secret builders for redaction tests. + * + * Nothing in this file is a real credential, and no string literal here matches + * a redaction rule on its own: every secret is assembled at runtime from a + * seeded PRNG plus split prefixes. That keeps GitHub push protection and other + * scanners quiet while still producing values in the exact real-world shape. + */ + +const UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; +const LOWER = 'abcdefghijklmnopqrstuvwxyz'; +const DIGITS = '0123456789'; +const ALNUM = UPPER + LOWER + DIGITS; +const B64 = ALNUM + '+/'; +const B64URL = ALNUM + '-_'; +const BASE32 = UPPER + '234567'; + +/** Deterministic PRNG (mulberry32) so failures reproduce. */ +export function makeRng(seed: number): () => number { + let a = seed >>> 0; + return () => { + a = (a + 0x6d2b79f5) >>> 0; + let t = a; + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; +} + +export class FakeSecrets { + private rng: () => number; + + constructor(seed = 1337) { + this.rng = makeRng(seed); + } + + chars(charset: string, n: number): string { + let out = ''; + for (let i = 0; i < n; i++) out += charset[Math.floor(this.rng() * charset.length)]; + return out; + } + + /** Always contains at least one digit and one letter. */ + private mixed(charset: string, n: number): string { + return this.chars(charset, n - 2) + this.chars(DIGITS, 1) + this.chars(LOWER, 1); + } + + azureClientSecret(): string { + // <3 chars>Q~<34 chars> — Entra ID client secret shape. + return this.chars(ALNUM, 3) + this.chars(DIGITS, 1) + 'Q' + '~' + this.chars(ALNUM + '_~.-', 33) + 'x'; + } + + azureStorageKey(): string { + // 64 random bytes, base64: 86 chars + '=='. + return this.chars(ALNUM, 1) + this.chars(B64, 84) + this.chars(ALNUM, 1) + '=' + '='; + } + + sasSignature(): string { + return this.chars(ALNUM, 40) + '%2B' + this.chars(ALNUM, 3) + '%3D'; + } + + privateKeyBlock(kind = 'RSA'): string { + const body: string[] = []; + for (let i = 0; i < 6; i++) body.push(this.chars(B64, 64)); + const dashes = '-'.repeat(5); + return `${dashes}BEGIN ${kind} PRIVATE` + ` KEY${dashes}\n${body.join('\n')}\n${dashes}END ${kind} PRIVATE` + ` KEY${dashes}`; + } + + jwt(): string { + const head = 'ey' + 'J' + this.chars(B64URL, 30); + const payload = 'ey' + 'J' + this.chars(B64URL, 60); + return `${head}.${payload}.${this.chars(B64URL, 43)}`; + } + + anthropicKey(): string { + return 'sk-' + 'ant-' + 'api03-' + this.chars(B64URL, 93) + 'AA'; + } + + openAiKey(): string { + return 'sk-' + 'proj-' + this.chars(ALNUM, 20) + 'T3Blbk' + 'FJ' + this.chars(ALNUM, 20); + } + + githubToken(): string { + return 'gh' + 'p_' + this.chars(ALNUM, 36); + } + + githubFineGrainedPat(): string { + return 'github' + '_pat_' + this.chars(ALNUM, 22) + '_' + this.chars(ALNUM, 59); + } + + awsAccessKeyId(): string { + return 'AK' + 'IA' + this.chars(BASE32, 16); + } + + awsSecretAccessKey(): string { + return this.mixed(ALNUM + '/+', 40); + } + + slackToken(): string { + return 'xo' + 'xb-' + this.chars(DIGITS, 12) + '-' + this.chars(DIGITS, 12) + '-' + this.chars(ALNUM, 24); + } + + googleApiKey(): string { + return 'AI' + 'za' + this.chars(ALNUM + '_-', 35); + } + + npmToken(): string { + return 'np' + 'm_' + this.chars(ALNUM, 36); + } + + /** Starts with a letter so it never looks like a `$VAR`/`%VAR%` placeholder. */ + password(): string { + return this.chars(LOWER, 1) + this.mixed(ALNUM + '!#%^*', 15); + } + + bearerOpaque(): string { + return this.mixed(ALNUM, 40); + } + + basicAuth(): string { + return this.chars(ALNUM, 30) + '=' + '='; + } + + /** High-entropy blob with no recognizable prefix. */ + opaqueHighEntropy(n = 48): string { + return this.mixed(ALNUM + '+/', n); + } + + gitSha(): string { + return this.chars('0123456789abcdef', 40); + } + + guid(): string { + const h = (n: number) => this.chars('0123456789abcdef', n); + return `${h(8)}-${h(4)}-${h(4)}-${h(4)}-${h(12)}`; + } + + base64Blob(n: number): string { + return this.chars(B64, n); + } +} + +/** Every `[REDACTED:...]` token in a string. */ +export function redactionTokens(text: string): string[] { + return text.match(/\[REDACTED:[a-z0-9-]+\]/g) ?? []; +} diff --git a/test/redact-rewrite.test.ts b/test/redact-rewrite.test.ts new file mode 100644 index 00000000..10c63f9a --- /dev/null +++ b/test/redact-rewrite.test.ts @@ -0,0 +1,172 @@ +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync, existsSync, statSync, utimesSync } from 'fs'; +import { join } from 'path'; +import { tmpdir } from 'os'; +import Database from 'better-sqlite3'; +import * as sqliteVec from 'sqlite-vec'; + +import { initDatabase, insertExchange } from '../src/db.js'; +import { parseConversation } from '../src/parser.js'; +import { rewriteArchive } from '../src/redact-rewrite.js'; +import { createRedactor, DEFAULT_REDACTION_CONFIG } from '../src/redaction.js'; +import { EMBEDDING_VERSION } from '../src/embedding-migration.js'; +import { FakeSecrets } from './fake-secrets.js'; + +const SESSION = '9a8b7c6d-1111-4222-8333-944455556666'; + +function transcript(secret: string, password: string, clean: string): string { + const base = { sessionId: SESSION, isSidechain: false, cwd: '/work/legacy' }; + return [ + { ...base, type: 'user', uuid: 'u1', parentUuid: null, timestamp: '2025-06-01T00:00:00.000Z', message: { role: 'user', content: `use AccountKey=${secret} please` } }, + { + ...base, type: 'assistant', uuid: 'a1', parentUuid: 'u1', timestamp: '2025-06-01T00:00:01.000Z', + message: { role: 'assistant', content: [ + { type: 'text', text: 'Running it.' }, + { type: 'tool_use', id: 'toolu_1', name: 'Bash', input: { command: `mysql --password=${password}` } }, + ] }, + }, + { ...base, type: 'user', uuid: 'u2', parentUuid: 'a1', timestamp: '2025-06-01T00:00:02.000Z', message: { role: 'user', content: [{ type: 'tool_result', tool_use_id: 'toolu_1', content: `ok password: ${password}` }] } }, + { ...base, type: 'assistant', uuid: 'a2', parentUuid: 'u2', timestamp: '2025-06-01T00:00:03.000Z', message: { role: 'assistant', content: [{ type: 'text', text: clean }] } }, + ].map(l => JSON.stringify(l)).join('\n') + '\n'; +} + +describe('redact --rewrite backfill', () => { + let root: string; + let archiveDir: string; + let dbPath: string; + const savedEnv = { ...process.env }; + const embed = vi.fn(async (..._args: unknown[]) => new Array(384).fill(0.5)); + + beforeEach(() => { + root = mkdtempSync(join(tmpdir(), 'episodic-memory-redact-rewrite-')); + archiveDir = join(root, 'archive'); + dbPath = join(root, 'db.sqlite'); + process.env.TEST_DB_PATH = dbPath; + embed.mockClear(); + }); + + afterEach(() => { + process.env = { ...savedEnv }; + rmSync(root, { recursive: true, force: true }); + }); + + /** Simulate a pre-redaction install: unredacted archive, rows, and summary. */ + async function seedLegacy(fake: FakeSecrets) { + const secret = fake.azureStorageKey(); + const password = fake.password(); + const projectDir = join(archiveDir, '-work-legacy'); + mkdirSync(join(projectDir, SESSION, 'subagents'), { recursive: true }); + const dirty = join(projectDir, `${SESSION}.jsonl`); + const clean = join(projectDir, 'clean-session.jsonl'); + const nested = join(projectDir, SESSION, 'subagents', 'agent-abc.jsonl'); + writeFileSync(dirty, transcript(secret, password, 'All done.')); + writeFileSync(nested, transcript(secret, password, 'Sub-agent done.')); + writeFileSync(clean, transcript('[REDACTED:connection-string-secret]', '[REDACTED:secret-assignment]', 'Nothing here.')); + writeFileSync(dirty.replace('.jsonl', '-summary.txt'), 'Configured storage access.'); + writeFileSync(clean.replace('.jsonl', '-summary.txt'), 'A clean summary.'); + const old = new Date('2025-06-02T00:00:00Z'); + for (const f of [dirty, clean, nested]) utimesSync(f, old, old); + + const db = initDatabase(); + for (const file of [dirty, clean, nested]) { + for (const ex of await parseConversation(file, '-work-legacy', file)) { + insertExchange(db, ex, new Array(384).fill(0), ex.toolCalls?.map(t => t.toolName)); + } + } + // Pretend these rows predate the current encoder bookkeeping. + db.prepare('UPDATE exchanges SET embedding_version = 0').run(); + db.close(); + return { secret, password, dirty, clean, nested }; + } + + function dbDump(): string { + const db = new Database(dbPath, { readonly: true }); + sqliteVec.load(db); + try { + return JSON.stringify([ + db.prepare('SELECT user_message, assistant_message FROM exchanges').all(), + db.prepare('SELECT tool_input, tool_result FROM tool_calls').all(), + ]); + } finally { + db.close(); + } + } + + it('rewrites the archive and index in place, then is a no-op on a second run', async () => { + const fake = new FakeSecrets(808); + const { secret, password, dirty, clean, nested } = await seedLegacy(fake); + const lineCount = readFileSync(dirty, 'utf-8').split('\n').length; + const mtimeBefore = statSync(dirty).mtimeMs; + const cleanBytes = readFileSync(clean, 'utf-8'); + expect(dbDump()).toContain(secret); + + const redactor = createRedactor(DEFAULT_REDACTION_CONFIG); + const result = await rewriteArchive({ archiveDir, redactor, embed }); + + // Archive: secrets gone, structure and mtime preserved, nested files covered. + for (const f of [dirty, nested]) { + const text = readFileSync(f, 'utf-8'); + expect(text).not.toContain(secret); + expect(text).not.toContain(password); + text.split('\n').filter(Boolean).forEach(l => expect(() => JSON.parse(l)).not.toThrow()); + } + expect(readFileSync(dirty, 'utf-8').split('\n').length).toBe(lineCount); + expect(Math.abs(statSync(dirty).mtimeMs - mtimeBefore)).toBeLessThan(2); + expect(readFileSync(clean, 'utf-8')).toBe(cleanBytes); + + // Summaries generated from unredacted text are removed; clean ones stay. + expect(existsSync(dirty.replace('.jsonl', '-summary.txt'))).toBe(false); + expect(existsSync(clean.replace('.jsonl', '-summary.txt'))).toBe(true); + + // Index: text columns clean, affected rows re-embedded with the current version. + const dump = dbDump(); + expect(dump).not.toContain(secret); + expect(dump).not.toContain(password); + expect(dump).toContain('[REDACTED:'); + expect(embed).toHaveBeenCalled(); + expectNoSecretInCalls(embed.mock.calls, [secret, password]); + + const db = new Database(dbPath, { readonly: true }); + // Only rows that had secrets are touched; the clean file's rows keep their old version. + const versions = db.prepare( + `SELECT embedding_version v, COUNT(*) n FROM exchanges WHERE archive_path IN (?, ?) AND (user_message LIKE '%REDACTED%' OR assistant_message LIKE '%REDACTED%') GROUP BY v` + ).all(dirty, nested) as Array<{ v: number }>; + const untouched = db.prepare('SELECT DISTINCT embedding_version v FROM exchanges WHERE archive_path = ?').all(clean) as Array<{ v: number }>; + db.close(); + expect(versions.map(r => r.v)).toEqual([EMBEDDING_VERSION]); + expect(untouched.map(r => r.v)).toEqual([0]); + + expect(result.filesRewritten).toBe(2); + expect(result.summariesRemoved).toBe(1); + expect(result.rowsUpdated).toBeGreaterThan(0); + expect(JSON.stringify(result)).not.toContain(secret); + + // Second run: nothing left to do. + embed.mockClear(); + const second = await rewriteArchive({ archiveDir, redactor, embed }); + expect(second.filesRewritten).toBe(0); + expect(second.rowsUpdated).toBe(0); + expect(second.summariesRemoved).toBe(0); + expect(embed).not.toHaveBeenCalled(); + }); + + it('--dry-run reports counts without touching anything', async () => { + const fake = new FakeSecrets(909); + const { secret, dirty } = await seedLegacy(fake); + const before = readFileSync(dirty, 'utf-8'); + + const result = await rewriteArchive({ archiveDir, redactor: createRedactor(DEFAULT_REDACTION_CONFIG), embed, dryRun: true }); + + expect(result.filesRewritten).toBe(2); + expect(result.rowsUpdated).toBeGreaterThan(0); + expect(readFileSync(dirty, 'utf-8')).toBe(before); + expect(existsSync(dirty.replace('.jsonl', '-summary.txt'))).toBe(true); + expect(dbDump()).toContain(secret); + expect(embed).not.toHaveBeenCalled(); + }); +}); + +function expectNoSecretInCalls(calls: unknown[][], secrets: string[]) { + const text = JSON.stringify(calls); + for (const s of secrets) expect(text.includes(s)).toBe(false); +} diff --git a/test/redaction-pipeline.test.ts b/test/redaction-pipeline.test.ts new file mode 100644 index 00000000..edd4d1cb --- /dev/null +++ b/test/redaction-pipeline.test.ts @@ -0,0 +1,353 @@ +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { + mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync, existsSync, readdirSync, statSync, +} from 'fs'; +import { join } from 'path'; +import { tmpdir } from 'os'; +import Database from 'better-sqlite3'; +import * as sqliteVec from 'sqlite-vec'; + +// Capture every embedding input and every summarizer call. sync.ts loads both +// via dynamic import and indexer.ts statically; vi.mock intercepts both. +const { embedSpy, summarizeSpy } = vi.hoisted(() => ({ + embedSpy: vi.fn(async (..._args: unknown[]) => new Array(384).fill(0)), + summarizeSpy: vi.fn(async (..._args: unknown[]) => 'A summary.'), +})); +vi.mock('../src/embeddings.js', () => ({ + initEmbeddings: vi.fn(async () => {}), + generateExchangeEmbedding: embedSpy, + generateQueryEmbedding: vi.fn(async () => new Array(384).fill(0)), + generateEmbedding: vi.fn(), + initEmbeddingsFailed: false, +})); +vi.mock('../src/summarizer.js', async () => { + const actual = await vi.importActual('../src/summarizer.js'); + return { ...actual, summarizeConversation: summarizeSpy }; +}); + +import { syncConversations } from '../src/sync.js'; +import { indexUnprocessed } from '../src/indexer.js'; +import { searchConversations } from '../src/search.js'; +import { formatConversationAsMarkdown } from '../src/show.js'; +import { exportOpencodeSessions } from '../src/opencode-sync.js'; +import { createRedactor, DEFAULT_REDACTION_CONFIG } from '../src/redaction.js'; +import { FakeSecrets } from './fake-secrets.js'; + +const SESSION = '4f1c2b3a-1111-4222-8333-944455556666'; + +interface Seed { + secrets: string[]; + sha: string; + guid: string; +} + +function seedSecrets(seed: number): Seed { + const fake = new FakeSecrets(seed); + return { + secrets: [ + fake.azureClientSecret(), + fake.azureStorageKey(), + fake.sasSignature(), + fake.githubToken(), + fake.anthropicKey(), + fake.password(), + fake.jwt(), + fake.privateKeyBlock().split('\n')[2], + ], + sha: fake.gitSha(), + guid: fake.guid(), + }; +} + +function claudeTranscript(s: Seed): string { + const [clientSecret, storageKey, sasSig, ghToken, antKey, password, jwt] = s.secrets; + const keyBlock = (() => { + // Rebuild the block whose body line is s.secrets[7]. + const dashes = '-'.repeat(5); + return `${dashes}BEGIN RSA PRIVATE` + ` KEY${dashes}\n${s.secrets[7]}\n${dashes}END RSA PRIVATE` + ` KEY${dashes}`; + })(); + const ts = (n: number) => new Date(Date.UTC(2026, 0, 1, 0, n)).toISOString(); + const base = { sessionId: SESSION, isSidechain: false, cwd: '/work/contoso', gitBranch: 'main', version: '2.0.0' }; + const lines = [ + { + ...base, type: 'user', uuid: 'u1', parentUuid: null, timestamp: ts(1), + message: { + role: 'user', + content: `Deploy with client secret ${clientSecret} for tenant ${s.guid}; last good commit ${s.sha}`, + }, + }, + { + ...base, type: 'assistant', uuid: 'a1', parentUuid: 'u1', timestamp: ts(2), + message: { + role: 'assistant', + content: [ + { type: 'text', text: 'Checking the storage account keys.' }, + { + type: 'tool_use', id: 'toolu_1', name: 'Bash', + input: { command: `az storage blob upload --connection-string "AccountName=contosodata;AccountKey=${storageKey}" --sas-token "sv=2022-11-02&sig=${sasSig}"` }, + }, + ], + }, + }, + { + ...base, type: 'user', uuid: 'u2', parentUuid: 'a1', timestamp: ts(3), + message: { + role: 'user', + content: [{ + type: 'tool_result', tool_use_id: 'toolu_1', + content: `GITHUB_TOKEN=${ghToken}\nANTHROPIC_API_KEY=${antKey}\npassword: ${password}\n${keyBlock}`, + }], + }, + }, + { + ...base, type: 'assistant', uuid: 'a2', parentUuid: 'u2', timestamp: ts(4), + message: { role: 'assistant', content: [{ type: 'text', text: `Uploaded. The bearer was Bearer ${jwt}.` }] }, + }, + ]; + return lines.map(l => JSON.stringify(l)).join('\n') + '\n'; +} + +function codexRollout(s: Seed): string { + const [clientSecret, storageKey] = s.secrets; + const lines = [ + { timestamp: '2026-05-12T18:00:00.000Z', type: 'session_meta', payload: { id: '019e4c75-d5bf-7c71-9df7-77f5fb86b711', cwd: '/work/contoso', cli_version: '0.130.0', model_provider: 'openai' } }, + { timestamp: '2026-05-12T18:00:02.000Z', type: 'response_item', payload: { type: 'message', role: 'user', content: [{ type: 'input_text', text: `Rotate ${clientSecret} please` }] } }, + { timestamp: '2026-05-12T18:00:04.000Z', type: 'response_item', payload: { type: 'function_call', name: 'exec_command', arguments: JSON.stringify({ cmd: `echo AccountKey=${storageKey}` }), call_id: 'c1' } }, + { timestamp: '2026-05-12T18:00:05.000Z', type: 'response_item', payload: { type: 'function_call_output', call_id: 'c1', output: `AccountKey=${storageKey}` } }, + { timestamp: '2026-05-12T18:00:06.000Z', type: 'response_item', payload: { type: 'message', role: 'assistant', content: [{ type: 'output_text', text: 'Rotated.' }] } }, + ]; + return lines.map(l => JSON.stringify(l)).join('\n') + '\n'; +} + +function walkFiles(dir: string): string[] { + if (!existsSync(dir)) return []; + const out: string[] = []; + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const p = join(dir, entry.name); + if (entry.isDirectory()) out.push(...walkFiles(p)); + else out.push(p); + } + return out; +} + +function dbText(dbPath: string): string { + if (!existsSync(dbPath)) return ''; + const db = new Database(dbPath, { readonly: true }); + sqliteVec.load(db); + try { + const ex = db.prepare('SELECT user_message, assistant_message FROM exchanges').all(); + const tc = db.prepare('SELECT tool_input, tool_result FROM tool_calls').all(); + return JSON.stringify([ex, tc]); + } finally { + db.close(); + } +} + +function expectNoSecrets(haystack: string, s: Seed, where: string) { + for (const secret of s.secrets) { + expect(haystack.includes(secret), `${where} leaked a seeded secret`).toBe(false); + } +} + +describe('redaction pipeline', () => { + let root: string; + let sourceDir: string; + let archiveDir: string; + let dbPath: string; + let logged: string[]; + const savedEnv = { ...process.env }; + + beforeEach(() => { + root = mkdtempSync(join(tmpdir(), 'episodic-memory-redaction-pipeline-')); + sourceDir = join(root, 'source'); + archiveDir = join(root, 'archive'); + dbPath = join(root, 'db.sqlite'); + mkdirSync(join(sourceDir, '-work-contoso'), { recursive: true }); + process.env.TEST_DB_PATH = dbPath; + process.env.TEST_PROJECTS_DIR = sourceDir; + process.env.TEST_ARCHIVE_DIR = archiveDir; + process.env.EPISODIC_MEMORY_CONFIG_DIR = join(root, 'config'); + delete process.env.EPISODIC_MEMORY_REDACTION; + delete process.env.EPISODIC_MEMORY_REDACTION_RULES; + delete process.env.EPISODIC_MEMORY_REDACTION_STRICT; + delete process.env.EPISODIC_MEMORY_SKIP_SUMMARIES; + + embedSpy.mockClear(); + summarizeSpy.mockClear(); + logged = []; + for (const method of ['log', 'error', 'warn', 'info'] as const) { + vi.spyOn(console, method).mockImplementation((...args: unknown[]) => { + logged.push(args.map(a => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ')); + }); + } + }); + + afterEach(() => { + vi.restoreAllMocks(); + process.env = { ...savedEnv }; + rmSync(root, { recursive: true, force: true }); + }); + + it('a seeded secret appears in zero of: archive, SQLite, embedding input, summarizer input, logs', async () => { + const s = seedSecrets(2024); + const claudeSrc = join(sourceDir, '-work-contoso', `${SESSION}.jsonl`); + writeFileSync(claudeSrc, claudeTranscript(s)); + writeFileSync(join(sourceDir, '-work-contoso', 'rollout-2026-05-12T18-00-00-019e4c75-d5bf-7c71-9df7-77f5fb86b711.jsonl'), codexRollout(s)); + + const result = await syncConversations(sourceDir, archiveDir); + expect(result.errors).toEqual([]); + expect(result.copied).toBe(2); + expect(result.indexed).toBe(2); + expect(result.summarized).toBe(2); + expect(result.redactions?.length).toBeGreaterThan(0); + expect(JSON.stringify(result.redactions)).not.toMatch(/[A-Za-z0-9+/]{30,}/); + + // (1) archive + const archived = walkFiles(archiveDir).filter(f => f.endsWith('.jsonl')); + expect(archived.length).toBe(2); + for (const file of archived) { + const text = readFileSync(file, 'utf-8'); + expectNoSecrets(text, s, `archive ${file}`); + expect(text).toContain('[REDACTED:'); + } + + // (2) SQLite text columns (exchanges + tool_calls) + const stored = dbText(dbPath); + expect(stored.length).toBeGreaterThan(0); + expectNoSecrets(stored, s, 'SQLite'); + expect(stored).toContain('[REDACTED:'); + + // (3) embedding input + expect(embedSpy).toHaveBeenCalled(); + expectNoSecrets(JSON.stringify(embedSpy.mock.calls), s, 'embedding input'); + + // (4) summarizer input — and resume/fork must be off, since those paths + // would hand the model the unredacted source transcript. + expect(summarizeSpy).toHaveBeenCalledTimes(2); + expectNoSecrets(JSON.stringify(summarizeSpy.mock.calls), s, 'summarizer input'); + for (const call of summarizeSpy.mock.calls) { + expect(call[2]).toMatchObject({ allowResume: false }); + } + + // (5) logs + expectNoSecrets(logged.join('\n'), s, 'console output'); + }); + + it('archive stays valid JSONL with the same line count, and show/read still render it', async () => { + const s = seedSecrets(7); + const src = join(sourceDir, '-work-contoso', `${SESSION}.jsonl`); + writeFileSync(src, claudeTranscript(s)); + await syncConversations(sourceDir, archiveDir, { skipSummaries: true }); + + const archived = join(archiveDir, '-work-contoso', `${SESSION}.jsonl`); + const srcLines = readFileSync(src, 'utf-8').split('\n'); + const outLines = readFileSync(archived, 'utf-8').split('\n'); + expect(outLines.length).toBe(srcLines.length); + outLines.filter(Boolean).forEach(l => expect(() => JSON.parse(l)).not.toThrow()); + + // The archive keeps the source mtime so the next sync treats it as current. + expect(Math.abs(statSync(archived).mtimeMs - statSync(src).mtimeMs)).toBeLessThan(2); + const again = await syncConversations(sourceDir, archiveDir, { skipSummaries: true }); + expect(again.copied).toBe(0); + + const md = formatConversationAsMarkdown(readFileSync(archived, 'utf-8')); + expect(md).toContain('[REDACTED:azure-client-secret]'); + expectNoSecrets(md, s, 'show output'); + }); + + it('git SHAs and GUIDs remain findable via text search', async () => { + const s = seedSecrets(31); + writeFileSync(join(sourceDir, '-work-contoso', `${SESSION}.jsonl`), claudeTranscript(s)); + await syncConversations(sourceDir, archiveDir, { skipSummaries: true }); + + const bySha = await searchConversations(s.sha, { mode: 'text' }); + expect(bySha.length).toBe(1); + const byGuid = await searchConversations(s.guid, { mode: 'text' }); + expect(byGuid.length).toBe(1); + const byToken = await searchConversations('[REDACTED:azure-client-secret]', { mode: 'text' }); + expect(byToken.length).toBe(1); + }); + + it('fails closed in strict mode: a corrupt rules file leaves no new archive or index content', async () => { + const s = seedSecrets(5); + writeFileSync(join(sourceDir, '-work-contoso', `${SESSION}.jsonl`), claudeTranscript(s)); + const rules = join(root, 'rules.json'); + writeFileSync(rules, '{ "rules": [ { "id": "x", "pattern": "(" } ] }'); + process.env.EPISODIC_MEMORY_REDACTION_RULES = rules; + + await expect(syncConversations(sourceDir, archiveDir)).rejects.toThrow(/redaction/i); + expect(walkFiles(archiveDir)).toEqual([]); + expect(dbText(dbPath)).toBe(''); + expect(embedSpy).not.toHaveBeenCalled(); + expect(summarizeSpy).not.toHaveBeenCalled(); + }); + + it('EPISODIC_MEMORY_REDACTION=off restores the byte-for-byte copy and resume-capable summaries', async () => { + process.env.EPISODIC_MEMORY_REDACTION = 'off'; + const s = seedSecrets(8); + const src = join(sourceDir, '-work-contoso', `${SESSION}.jsonl`); + writeFileSync(src, claudeTranscript(s)); + await syncConversations(sourceDir, archiveDir); + expect(readFileSync(join(archiveDir, '-work-contoso', `${SESSION}.jsonl`), 'utf-8')).toBe(readFileSync(src, 'utf-8')); + expect(summarizeSpy.mock.calls[0][2]).toMatchObject({ allowResume: true }); + }); + + it('the `index` path (indexUnprocessed) parses the redacted archive, not the source', async () => { + const s = seedSecrets(77); + writeFileSync(join(sourceDir, '-work-contoso', `${SESSION}.jsonl`), claudeTranscript(s)); + + await indexUnprocessed(1, false); + + const archived = walkFiles(archiveDir).filter(f => f.endsWith('.jsonl')); + expect(archived.length).toBe(1); + expectNoSecrets(readFileSync(archived[0], 'utf-8'), s, 'archive (index path)'); + expectNoSecrets(dbText(dbPath), s, 'SQLite (index path)'); + expectNoSecrets(JSON.stringify(embedSpy.mock.calls), s, 'embedding input (index path)'); + expect(summarizeSpy).toHaveBeenCalledTimes(1); + expectNoSecrets(JSON.stringify(summarizeSpy.mock.calls), s, 'summarizer input (index path)'); + expect(summarizeSpy.mock.calls[0][2]).toMatchObject({ allowResume: false }); + }); +}); + +describe('redaction: opencode staging export', () => { + let root: string; + const savedEnv = { ...process.env }; + + beforeEach(() => { + root = mkdtempSync(join(tmpdir(), 'episodic-memory-redaction-opencode-')); + process.env.EPISODIC_MEMORY_OPENCODE_DB_PATH = join(root, 'opencode.db'); + process.env.EPISODIC_MEMORY_OPENCODE_TRANSCRIPT_DIR = join(root, 'transcripts'); + }); + + afterEach(() => { + process.env = { ...savedEnv }; + rmSync(root, { recursive: true, force: true }); + }); + + it('redacts secrets before the staging JSONL is written', () => { + const fake = new FakeSecrets(55); + const secret = fake.azureStorageKey(); + const db = new Database(join(root, 'opencode.db')); + db.exec(` + CREATE TABLE project (id TEXT PRIMARY KEY, worktree TEXT NOT NULL, name TEXT, time_created INTEGER NOT NULL, time_updated INTEGER NOT NULL, sandboxes TEXT NOT NULL); + CREATE TABLE session (id TEXT PRIMARY KEY, project_id TEXT NOT NULL, slug TEXT NOT NULL, directory TEXT NOT NULL, title TEXT NOT NULL, version TEXT NOT NULL, time_created INTEGER NOT NULL, time_updated INTEGER NOT NULL, agent TEXT, model TEXT); + CREATE TABLE message (id TEXT PRIMARY KEY, session_id TEXT NOT NULL, time_created INTEGER NOT NULL, time_updated INTEGER NOT NULL, data TEXT NOT NULL); + CREATE TABLE part (id TEXT PRIMARY KEY, message_id TEXT NOT NULL, session_id TEXT NOT NULL, time_created INTEGER NOT NULL, time_updated INTEGER NOT NULL, data TEXT NOT NULL); + `); + db.prepare(`INSERT INTO project VALUES ('p1', '/work/x', 'X', 1700000000000, 1700000000000, '[]')`).run(); + db.prepare(`INSERT INTO session VALUES ('ses_1', 'p1', 's', '/work/x', 'T', '1.0.0', 1700000000000, 1700000004000, 'build', NULL)`).run(); + db.prepare(`INSERT INTO message VALUES ('m1', 'ses_1', 1700000001000, 1700000001000, ?)`).run(JSON.stringify({ role: 'user' })); + db.prepare(`INSERT INTO part VALUES ('pt1', 'm1', 'ses_1', 1700000001000, 1700000001000, ?)`).run( + JSON.stringify({ type: 'text', text: `AccountKey=${secret}` }) + ); + db.close(); + + const result = exportOpencodeSessions({ redactor: createRedactor(DEFAULT_REDACTION_CONFIG) }); + expect(result.exported).toBe(1); + const files = walkFiles(join(root, 'transcripts')); + expect(files.length).toBe(1); + const text = readFileSync(files[0], 'utf-8'); + expect(text).not.toContain(secret); + expect(text).toContain('[REDACTED:connection-string-secret]'); + }); +}); diff --git a/test/redaction.test.ts b/test/redaction.test.ts new file mode 100644 index 00000000..95466d4e --- /dev/null +++ b/test/redaction.test.ts @@ -0,0 +1,526 @@ +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { mkdtempSync, writeFileSync, readFileSync, rmSync, mkdirSync } from 'fs'; +import { join } from 'path'; +import { tmpdir } from 'os'; + +import { + createRedactor, + loadRedactor, + loadRedactionConfig, + getRedactionSettings, + redactJsonlLine, + copyFileRedacted, + FindingsTally, + RedactionConfigError, + DEFAULT_REDACTION_CONFIG, + type Redactor, +} from '../src/redaction.js'; +import { FakeSecrets, redactionTokens } from './fake-secrets.js'; + +const ctx = { source: 'test', path: '/tmp/x.jsonl' }; + +function defaults(): Redactor { + return createRedactor(DEFAULT_REDACTION_CONFIG); +} + +/** Assert `secret` is gone, the expected token is present, and findings name the rule. */ +function expectRedacted(redactor: Redactor, text: string, secret: string, ruleId: string) { + const result = redactor.redact(text, ctx); + expect(result.text).not.toContain(secret); + expect(result.text).toContain(`[REDACTED:${ruleId}]`); + expect(result.findings.find(f => f.ruleId === ruleId)?.count ?? 0).toBeGreaterThan(0); + // Findings carry rule IDs and counts, never the matched value. + expect(JSON.stringify(result.findings)).not.toContain(secret); + return result; +} + +describe('redaction: default rules (positive)', () => { + let fake: FakeSecrets; + let redactor: Redactor; + + beforeEach(() => { + fake = new FakeSecrets(42); + redactor = defaults(); + }); + + it('azure-client-secret in pasted `az ad sp credential reset` output', () => { + const secret = fake.azureClientSecret(); + const text = `{\n "appId": "${fake.guid()}",\n "password": "${secret}",\n "tenant": "${fake.guid()}"\n}`; + expectRedacted(redactor, text, secret, 'azure-client-secret'); + }); + + it('azure-client-secret bare in prose', () => { + const secret = fake.azureClientSecret(); + expectRedacted(redactor, `use ${secret} as the client secret`, secret, 'azure-client-secret'); + }); + + it('azure-storage-key in `az storage account keys list` output', () => { + const secret = fake.azureStorageKey(); + const text = `[\n {\n "keyName": "key1",\n "permissions": "FULL",\n "value": "${secret}"\n }\n]`; + expectRedacted(redactor, text, secret, 'azure-storage-key'); + }); + + it('connection-string-secret redacts only the value, keeping account and endpoint searchable', () => { + const key = fake.azureStorageKey(); + const text = `DefaultEndpointsProtocol=https;AccountName=contosodata;AccountKey=${key};EndpointSuffix=core.windows.net`; + const result = expectRedacted(redactor, text, key, 'connection-string-secret'); + expect(result.text).toContain('AccountName=contosodata'); + expect(result.text).toContain('EndpointSuffix=core.windows.net'); + }); + + it('connection-string-secret in an appsettings.json blob (SQL Server password field)', () => { + const pw = fake.password(); + const text = JSON.stringify({ + ConnectionStrings: { + Default: `Server=tcp:contoso-sql.database.windows.net,1433;Database=orders;User ID=app;Password=${pw};Encrypt=True;`, + }, + }, null, 2); + const result = expectRedacted(redactor, text, pw, 'connection-string-secret'); + expect(result.text).toContain('contoso-sql.database.windows.net'); + expect(result.text).toContain('Database=orders'); + }); + + it('connection-string-secret for Service Bus SharedAccessKey', () => { + const key = fake.chars('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', 43) + '='; + const text = `Endpoint=sb://contoso.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=${key}`; + const result = expectRedacted(redactor, text, key, 'connection-string-secret'); + expect(result.text).toContain('SharedAccessKeyName=RootManageSharedAccessKey'); + }); + + it('azure-sas-token redacts the sig while keeping the blob URL', () => { + const sig = fake.sasSignature(); + const text = `https://contoso.blob.core.windows.net/backups/db.bak?sv=2022-11-02&ss=b&srt=co&sp=rl&se=2026-12-31T00:00:00Z&sig=${sig}`; + const result = expectRedacted(redactor, text, sig, 'azure-sas-token'); + expect(result.text).toContain('https://contoso.blob.core.windows.net/backups/db.bak?sv=2022-11-02'); + }); + + it('private-key-block (multi-line, PEM)', () => { + const block = fake.privateKeyBlock('RSA'); + const body = block.split('\n')[2]; + const result = expectRedacted(redactor, `cat key.pem\n${block}\n$ `, body, 'private-key-block'); + expect(result.text).not.toContain('PRIVATE KEY'); + }); + + it('private-key-block (OPENSSH, escaped newlines as in nested JSON)', () => { + const block = fake.privateKeyBlock('OPENSSH').replace(/\n/g, '\\n'); + const body = block.split('\\n')[3]; + expectRedacted(redactor, `{"content":"${block}"}`, body, 'private-key-block'); + }); + + it('private-key-block truncated (no END marker) is still redacted to end of text', () => { + const block = fake.privateKeyBlock('EC'); + const truncated = block.split('\n').slice(0, 4).join('\n'); + const body = truncated.split('\n')[2]; + expectRedacted(redactor, truncated, body, 'private-key-block'); + }); + + it('jwt (Azure access token from `az account get-access-token`)', () => { + const token = fake.jwt(); + const text = `{\n "accessToken": "${token}",\n "expiresOn": "2026-10-04 12:00:00.000000",\n "tokenType": "Bearer"\n}`; + const result = redactor.redact(text, ctx); + expect(result.text).not.toContain(token); + expect(redactionTokens(result.text).length).toBeGreaterThan(0); + }); + + it('bearer-token in an Authorization header', () => { + const token = fake.bearerOpaque(); + expectRedacted(redactor, `curl -H "Authorization: Bearer ${token}" https://api.example.com`, token, 'bearer-token'); + }); + + it('basic-auth in an Authorization header', () => { + const token = fake.basicAuth(); + expectRedacted(redactor, `Authorization: Basic ${token}`, token, 'basic-auth'); + }); + + it('anthropic-api-key', () => { + const key = fake.anthropicKey(); + expectRedacted(redactor, `export ANTHROPIC_API_KEY=${key}`, key, 'anthropic-api-key'); + }); + + it('openai-api-key', () => { + const key = fake.openAiKey(); + expectRedacted(redactor, `OPENAI_API_KEY="${key}"`, key, 'openai-api-key'); + }); + + it('github-token (classic) and fine-grained PAT', () => { + const classic = fake.githubToken(); + expectRedacted(redactor, `git remote set-url origin https://${classic}@github.com/o/r.git`, classic, 'github-token'); + const fine = fake.githubFineGrainedPat(); + expectRedacted(redactor, `GH_TOKEN=${fine}`, fine, 'github-token'); + }); + + it('aws-access-key-id and aws-secret-access-key in ~/.aws/credentials', () => { + const id = fake.awsAccessKeyId(); + const secret = fake.awsSecretAccessKey(); + const text = `[default]\naws_access_key_id = ${id}\naws_secret_access_key = ${secret}\n`; + expectRedacted(redactor, text, id, 'aws-access-key-id'); + expectRedacted(redactor, text, secret, 'aws-secret-access-key'); + }); + + it('slack-token, google-api-key, npm-token', () => { + const slack = fake.slackToken(); + expectRedacted(redactor, `SLACK_BOT_TOKEN=${slack}`, slack, 'slack-token'); + const google = fake.googleApiKey(); + expectRedacted(redactor, `key=${google}&q=coffee`, google, 'google-api-key'); + const npm = fake.npmToken(); + expectRedacted(redactor, `//registry.npmjs.org/:_authToken=${npm}`, npm, 'npm-token'); + }); + + it('url-credentials redacts only the password', () => { + const pw = fake.password().replace(/[#%^*!]/g, 'x'); + const text = `DATABASE_URL=postgres://app_user:${pw}@db.internal:5432/orders`; + const result = expectRedacted(redactor, text, pw, 'url-credentials'); + expect(result.text).toContain('app_user'); + expect(result.text).toContain('@db.internal:5432/orders'); + }); + + it('secret-assignment covers env, YAML, and JSON shapes (decrypted SOPS output)', () => { + const a = fake.password(); + const b = fake.password(); + const c = fake.password(); + const yaml = `database:\n host: db.internal\n password: ${a}\nazure:\n client_secret: "${b}"\n`; + const env = `AZURE_CLIENT_SECRET=${c}`; + for (const [text, secret] of [[yaml, a], [yaml, b], [env, c]] as const) { + const result = redactor.redact(text, ctx); + expect(result.text).not.toContain(secret); + } + expect(redactor.redact(yaml, ctx).text).toContain('host: db.internal'); + }); + + it('secret-assignment redacts a JSON "clientSecret" field', () => { + const secret = fake.password(); + expectRedacted(redactor, JSON.stringify({ clientId: fake.guid(), clientSecret: secret }), secret, 'secret-assignment'); + }); +}); + +describe('redaction: allowlist and false-positive resistance (negative)', () => { + let fake: FakeSecrets; + let redactor: Redactor; + + beforeEach(() => { + fake = new FakeSecrets(7); + redactor = defaults(); + }); + + function expectUntouched(text: string) { + const result = redactor.redact(text, ctx); + expect(result.text).toBe(text); + expect(result.findings).toEqual([]); + } + + it('git SHAs (full and short) survive', () => { + const sha = fake.gitSha(); + expectUntouched(`commit ${sha}\nAuthor: someone\n\n fix: thing (${sha.slice(0, 7)})`); + }); + + it('a git SHA assigned to a token-like key is still allowlisted', () => { + const sha = fake.gitSha(); + expectUntouched(`token: ${sha}`); + }); + + it('GUIDs (tenant, client, object IDs) survive', () => { + expectUntouched(JSON.stringify({ tenantId: fake.guid(), clientId: fake.guid(), objectId: fake.guid() })); + }); + + it('ARM resource IDs survive', () => { + expectUntouched( + `/subscriptions/${fake.guid()}/resourceGroups/rg-prod-eastus/providers/Microsoft.Storage/storageAccounts/contosodata` + ); + }); + + it('error codes and HTTP statuses survive', () => { + expectUntouched('AADSTS7000215: Invalid client secret provided. Status: 401 Unauthorized. AuthorizationFailed (403)'); + }); + + it('base64 image data survives', () => { + expectUntouched(JSON.stringify({ type: 'image', source: { type: 'base64', media_type: 'image/png', data: 'iVBORw0KGgo' + fake.base64Blob(20000) + '==' } })); + }); + + it('npm integrity hashes (sha512, 88 chars) survive', () => { + expectUntouched(`"integrity": "sha512-${fake.base64Blob(86)}=="`); + }); + + it('minified JS survives', () => { + expectUntouched( + 'function a(e,t){var n=e.password,r=t.token;return n&&r?{password:n,token:r,expires_in:3600}:null}' + + 'const s=new URLSearchParams({grant_type:"client_credentials"});' + ); + }); + + it('code that reads secrets (not literals) survives', () => { + expectUntouched('const password = getPassword();\nconst token = process.env.GITHUB_TOKEN;\npassword = os.environ["DB_PASSWORD"]'); + }); + + it('member-access references to secrets survive, even with digits (env.AUTH0_CLIENT_SECRET)', () => { + expectUntouched('client_id: env.AUTH0_CLIENT_ID,\n client_secret: env.AUTH0_CLIENT_SECRET,\n token: this.config.apiToken2;'); + }); + + it('placeholders and SOPS-encrypted values survive', () => { + expectUntouched('password: ${DB_PASSWORD}\nclient_secret: \napi_key: ENC[AES256_GCM,data:abc,iv:def,tag:ghi,type:str]'); + }); + + it('PWD and other env noise survive', () => { + expectUntouched('PWD=/home/user1/src/project2\nOLDPWD=/home/user1\nmax_tokens: 4096\ntokenizer: bert-base-uncased'); + }); + + it('prose about tokens and passwords survives', () => { + expectUntouched('Rotate the bearer token every 90 days. Basic authentication is disabled. The password policy requires 14 characters.'); + }); +}); + +describe('redaction: idempotency', () => { + it('redacting already-redacted text is a no-op and tokens match no rule', () => { + const fake = new FakeSecrets(99); + const redactor = defaults(); + const text = [ + `AccountKey=${fake.azureStorageKey()}`, + `password: ${fake.password()}`, + `Authorization: Bearer ${fake.jwt()}`, + fake.privateKeyBlock(), + `client secret ${fake.azureClientSecret()}`, + `https://u:${fake.password().replace(/[#%^*!]/g, 'y')}@host/x`, + ].join('\n'); + const once = redactor.redact(text, ctx); + expect(once.findings.length).toBeGreaterThan(0); + const twice = redactor.redact(once.text, ctx); + expect(twice.text).toBe(once.text); + expect(twice.findings).toEqual([]); + }); + + it('every token for every default rule id is inert', () => { + const redactor = defaults(); + for (const id of redactor.ruleIds) { + for (const shape of [`[REDACTED:${id}]`, `password: [REDACTED:${id}]`, `Bearer [REDACTED:${id}]`, `AccountKey=[REDACTED:${id}];`]) { + const result = redactor.redact(shape, ctx); + expect(result.findings, `${id} in ${shape}`).toEqual([]); + } + } + }); +}); + +describe('redaction: entropy fallback', () => { + it('is off by default', () => { + const fake = new FakeSecrets(3); + const blob = fake.opaqueHighEntropy(); + const result = defaults().redact(`the signing value is ${blob}`, ctx); + expect(result.text).toContain(blob); + }); + + it('when enabled, fires near a keyword but not elsewhere or on allowlisted shapes', () => { + const fake = new FakeSecrets(4); + const redactor = createRedactor({ + ...DEFAULT_REDACTION_CONFIG, + entropy: { ...DEFAULT_REDACTION_CONFIG.entropy, enabled: true }, + }); + const blob = fake.opaqueHighEntropy(48); + const near = redactor.redact(`signing key is ${blob}`, ctx); + expect(near.text).not.toContain(blob); + expect(near.text).toContain('[REDACTED:high-entropy]'); + + const far = redactor.redact(`the build artifact digest ${fake.opaqueHighEntropy(48)}`, ctx); + expect(far.findings).toEqual([]); + + const sha = fake.gitSha(); + expect(redactor.redact(`key ${sha}`, ctx).text).toContain(sha); + }); +}); + +describe('redaction: JSONL line handling', () => { + const redactor = defaults(); + const fake = new FakeSecrets(11); + + it('redacts string values inside JSON and keeps the line valid JSON', () => { + const key = fake.azureStorageKey(); + const line = JSON.stringify({ + type: 'user', + message: { role: 'user', content: [{ type: 'tool_result', tool_use_id: 't1', content: `AccountKey=${key}` }] }, + uuid: 'u1', + }); + const out = redactJsonlLine(line, redactor, ctx); + expect(out).not.toContain(key); + const parsed = JSON.parse(out); + expect(parsed.uuid).toBe('u1'); + expect(parsed.message.content[0].content).toBe('AccountKey=[REDACTED:connection-string-secret]'); + }); + + it('redacts tool inputs (nested objects) too', () => { + const pw = fake.password(); + const line = JSON.stringify({ + type: 'assistant', + message: { role: 'assistant', content: [{ type: 'tool_use', id: 't1', name: 'Bash', input: { command: `mysql -u root --password=${pw}` } }] }, + }); + const out = redactJsonlLine(line, redactor, ctx); + expect(out).not.toContain(pw); + expect(() => JSON.parse(out)).not.toThrow(); + }); + + it('returns unchanged lines byte-for-byte (formatting preserved)', () => { + const line = '{"type":"user", "message":{"role":"user","content":"caf\\u00e9 hello"}}'; + expect(redactJsonlLine(line, redactor, ctx)).toBe(line); + }); + + it('redacts non-JSON lines (e.g. a torn last line) as raw text', () => { + const key = fake.azureStorageKey(); + const torn = `{"type":"user","message":{"content":"AccountKey=${key}`; + const out = redactJsonlLine(torn, redactor, ctx); + expect(out).not.toContain(key); + }); + + it('preserves CRLF line endings', () => { + const pw = fake.password(); + const line = JSON.stringify({ content: `password: ${pw}` }) + '\r'; + const out = redactJsonlLine(line, redactor, ctx); + expect(out.endsWith('\r')).toBe(true); + expect(out).not.toContain(pw); + }); + + it('tallies findings by rule id', () => { + const tally = new FindingsTally(); + redactJsonlLine(JSON.stringify({ a: `password: ${fake.password()}`, b: `password: ${fake.password()}` }), redactor, ctx, tally); + expect(tally.toArray()).toEqual([{ ruleId: 'secret-assignment', count: 2 }]); + expect(tally.total).toBe(2); + }); +}); + +describe('redaction: copyFileRedacted', () => { + let dir: string; + beforeEach(() => { dir = mkdtempSync(join(tmpdir(), 'episodic-memory-redact-copy-')); }); + afterEach(() => { rmSync(dir, { recursive: true, force: true }); }); + + it('streams a file, keeps one output line per input line, and keeps the trailing-newline shape', () => { + const fake = new FakeSecrets(5); + const redactor = defaults(); + const secrets: string[] = []; + const lines: string[] = []; + for (let i = 0; i < 3000; i++) { + if (i % 500 === 0) { + const s = fake.azureClientSecret(); + secrets.push(s); + lines.push(JSON.stringify({ type: 'user', i, message: { content: `secret is ${s}` } })); + } else { + lines.push(JSON.stringify({ type: 'assistant', i, message: { content: 'x'.repeat(i % 700) } })); + } + } + const src = join(dir, 'src.jsonl'); + const dest = join(dir, 'dest.jsonl'); + writeFileSync(src, lines.join('\n')); // no trailing newline + const tally = new FindingsTally(); + copyFileRedacted(src, dest, redactor, ctx, tally); + const out = readFileSync(dest, 'utf-8'); + for (const s of secrets) expect(out).not.toContain(s); + expect(out.split('\n').length).toBe(lines.length); + expect(out.endsWith('\n')).toBe(false); + expect(tally.total).toBe(secrets.length); + out.split('\n').forEach(l => expect(() => JSON.parse(l)).not.toThrow()); + }); + + it('handles multi-byte UTF-8 across chunk boundaries', () => { + const redactor = defaults(); + const src = join(dir, 'utf8.jsonl'); + const dest = join(dir, 'utf8-out.jsonl'); + const line = JSON.stringify({ content: '日本語テキスト🙂'.repeat(200_000) }); + writeFileSync(src, line + '\n' + line + '\n'); + copyFileRedacted(src, dest, redactor, ctx); + expect(readFileSync(dest, 'utf-8')).toBe(readFileSync(src, 'utf-8')); + }); +}); + +describe('redaction: settings and rules loading', () => { + let dir: string; + const saved = { ...process.env }; + + beforeEach(() => { + dir = mkdtempSync(join(tmpdir(), 'episodic-memory-redact-cfg-')); + process.env.EPISODIC_MEMORY_CONFIG_DIR = join(dir, 'config'); + mkdirSync(process.env.EPISODIC_MEMORY_CONFIG_DIR, { recursive: true }); + delete process.env.EPISODIC_MEMORY_REDACTION; + delete process.env.EPISODIC_MEMORY_REDACTION_RULES; + delete process.env.EPISODIC_MEMORY_REDACTION_STRICT; + }); + + afterEach(() => { + process.env = { ...saved }; + rmSync(dir, { recursive: true, force: true }); + }); + + it('is on and strict by default', () => { + expect(getRedactionSettings(process.env)).toMatchObject({ enabled: true, strict: true }); + }); + + it('EPISODIC_MEMORY_REDACTION=off disables it', () => { + process.env.EPISODIC_MEMORY_REDACTION = 'off'; + expect(getRedactionSettings(process.env).enabled).toBe(false); + expect(loadRedactor(process.env)).toBeNull(); + }); + + it('loads the bundled defaults when no rules file exists', () => { + const redactor = loadRedactor(process.env)!; + expect(redactor.ruleIds).toEqual(DEFAULT_REDACTION_CONFIG.rules.map(r => r.id)); + }); + + it('picks up redaction-rules.json from the config dir and merges it with defaults', () => { + writeFileSync(join(process.env.EPISODIC_MEMORY_CONFIG_DIR!, 'redaction-rules.json'), JSON.stringify({ + rules: [{ id: 'internal-ticket-secret', pattern: 'TKT-SECRET-[0-9]{6}' }], + disableRules: ['basic-auth'], + })); + const redactor = loadRedactor(process.env)!; + expect(redactor.ruleIds).toContain('internal-ticket-secret'); + expect(redactor.ruleIds).toContain('azure-storage-key'); + expect(redactor.ruleIds).not.toContain('basic-auth'); + expect(redactor.redact('ref TKT-SECRET-123456', ctx).text).toBe('ref [REDACTED:internal-ticket-secret]'); + }); + + it('EPISODIC_MEMORY_REDACTION_RULES points at a custom file; includeDefaults:false replaces the defaults', () => { + const file = join(dir, 'custom.json'); + writeFileSync(file, JSON.stringify({ includeDefaults: false, rules: [{ id: 'only-this', pattern: 'zzz[0-9]+' }] })); + process.env.EPISODIC_MEMORY_REDACTION_RULES = file; + const redactor = loadRedactor(process.env)!; + expect(redactor.ruleIds).toEqual(['only-this']); + }); + + it('strict mode throws RedactionConfigError on a corrupt rules file', () => { + const file = join(dir, 'bad.json'); + writeFileSync(file, '{ "rules": [ this is not json'); + process.env.EPISODIC_MEMORY_REDACTION_RULES = file; + expect(() => loadRedactor(process.env)).toThrow(RedactionConfigError); + }); + + it('strict mode throws when the custom rules path does not exist', () => { + process.env.EPISODIC_MEMORY_REDACTION_RULES = join(dir, 'missing.json'); + expect(() => loadRedactor(process.env)).toThrow(RedactionConfigError); + }); + + it('non-strict mode warns and returns null (pass-through) on a corrupt rules file', () => { + const file = join(dir, 'bad.json'); + writeFileSync(file, 'nope'); + process.env.EPISODIC_MEMORY_REDACTION_RULES = file; + process.env.EPISODIC_MEMORY_REDACTION_STRICT = '0'; + const warn = vi.fn(); + expect(loadRedactor(process.env, warn)).toBeNull(); + expect(warn).toHaveBeenCalled(); + }); + + it('rejects invalid rules: bad regex, bad id, empty-matching pattern, bad secretGroup', () => { + const bad = [ + { id: 'bad-regex', pattern: '(unclosed' }, + { id: 'Bad Id!', pattern: 'abc' }, + { id: 'empty-match', pattern: 'a*' }, + { id: 'bad-group', pattern: 'abc', secretGroup: 2 }, + ]; + for (const rule of bad) { + expect(() => loadRedactionConfig({ includeDefaults: false, rules: [rule] } as any), rule.id).toThrow(RedactionConfigError); + } + }); + + it('rule-load errors never echo text being redacted (only config details)', () => { + const file = join(dir, 'bad.json'); + writeFileSync(file, JSON.stringify({ rules: [{ id: 'x', pattern: '(' }] })); + process.env.EPISODIC_MEMORY_REDACTION_RULES = file; + try { + loadRedactor(process.env); + expect.unreachable(); + } catch (e) { + expect((e as Error).message).toContain('x'); + } + }); +}); From 0c5789063d752ce36fc8c7d0e96bdf1ae5a993d7 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 23:02:53 +0000 Subject: [PATCH 13/33] fix(redaction): use key context so .NET/Azure secrets without a shape are caught The first cut only redacted values whose own shape matched a rule, plus an unquoted key=value rule that required a digit. Common .NET/Azure leaks all slipped through: appsettings.json fields, web.config , publish-profile userPWD, `az webapp config appsettings list` and `az keyvault secret show` output, C# `ClientSecret = "..."`, and structured MCP results (parsed JSON lost field names; keys were never checked). Text rules (key context, no digit requirement, placeholder-aware): - azure-keyvault-secret, name-value-secret (either order), xml-appsettings-secret (either order), xml-secret-element, xml-secret-attribute, quoted-secret-assignment. - These opt out of the SHA/GUID allowlist: a GUID in a password slot (legacy create-for-rbac) is a secret. Structured JSON (secretFields, on by default, configurable keyPattern): - a string whose field name ends in a secret keyword is redacted whole; - {name, value} pairs with a secret-looking name and Key Vault bundles have their value redacted; - keys that are themselves secrets are renamed to their token. Harness fields (thinking signature, usage, token_count, apiKeySource) are untouched. Engine: secretGroup may list several groups (first that matched); per-rule useAllowlist. connection-string-secret no longer allows spaces around '=', fixing a C# false positive (options.Password = configuration[...]). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0141gGbp343kbYP6imaJaji2 --- CHANGELOG.md | 2 +- dist/redaction-rules.d.ts | 25 ----- dist/redaction-rules.js | 91 ++++++++++++++++- dist/redaction.d.ts | 28 +++++- dist/redaction.js | 132 ++++++++++++++++++++++--- docs/REDACTION.md | 67 ++++++++++--- src/redaction-rules.ts | 105 +++++++++++++++++++- src/redaction.ts | 167 ++++++++++++++++++++++++++++---- test/fake-secrets.ts | 7 +- test/redaction-pipeline.test.ts | 37 +++++++ test/redaction.test.ts | 165 ++++++++++++++++++++++++++++++- 11 files changed, 747 insertions(+), 79 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d74d39d..a467864f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Security -- Secrets no longer leak into your conversation memory. Azure client secrets, storage keys, SAS signatures, connection-string passwords, private keys, JWTs, GitHub, Anthropic, OpenAI, and AWS keys, and `password: …` style assignments are now replaced with tokens like `[REDACTED:azure-storage-key]` before a conversation is archived, indexed, embedded, or summarized. Before this, every pasted secret was copied into three new places on disk and could be sent to the summarization model. The rest of the conversation stays searchable, and so do git SHAs and Azure tenant, client, and object IDs. Redaction is on by default and fails closed: if the rules can't load, sync won't run rather than store secrets. +- Secrets no longer leak into your conversation memory. Azure client secrets, storage keys, SAS signatures, connection-string passwords, private keys, JWTs, GitHub, Anthropic, OpenAI, and AWS keys, and `password: …` style assignments are now replaced with tokens like `[REDACTED:azure-storage-key]` before a conversation is archived, indexed, embedded, or summarized. Before this, every pasted secret was copied into three new places on disk and could be sent to the summarization model. The rest of the conversation stays searchable, and so do git SHAs and Azure tenant, client, and object IDs. Redaction is on by default and fails closed: if the rules can't load, sync won't run rather than store secrets. .NET and Azure shapes where only the setting's name gives the secret away are covered too, even when the value has no recognizable format: `appsettings.json` fields, `web.config` ``, publish-profile passwords, `az webapp config appsettings list` and `az keyvault secret show` output, C# `ClientSecret = "…"` assignments, and structured MCP results. - With redaction on, summaries no longer resume Claude Code sessions or fork Codex threads. Both of those let the model read the original, unredacted transcript. Summaries now come from the redacted text. Codex-only users without Claude configured can set `EPISODIC_MEMORY_SKIP_SUMMARIES=1`. ### Added diff --git a/dist/redaction-rules.d.ts b/dist/redaction-rules.d.ts index a9fa089b..d9c5ad24 100644 --- a/dist/redaction-rules.d.ts +++ b/dist/redaction-rules.d.ts @@ -1,27 +1,2 @@ import type { RedactionConfig } from './redaction.js'; -/** - * Bundled default redaction rules. - * - * Patterns are ported from gitleaks' rule set (https://github.com/gitleaks/gitleaks, - * MIT), trimmed to the credentials that realistically show up in Claude Code / - * Codex transcripts for an Azure-heavy stack, and rewritten for JavaScript - * regex (lookbehind instead of gitleaks' consuming boundary groups, so - * adjacent matches aren't swallowed). - * - * Order matters: rules run top to bottom, and a later rule never re-matches - * inside an earlier rule's `[REDACTED:...]` token. Specific shapes go first so - * the token names the most precise rule; the generic `secret-assignment` - * keyword rule goes last. - * - * `secretGroup` replaces only that capture group, so surrounding context - * (connection-string server names, SAS URL paths, usernames) stays searchable. - * - * `keywords` is a case-insensitive prefilter: a rule only runs on text that - * contains at least one keyword. It keeps the per-string cost low on large - * transcripts and bounds the generic rules' work. - * - * Users extend or override these with `redaction-rules.json`; see - * docs/REDACTION.md. `episodic-memory redact --print-default-rules` dumps - * this object as JSON. - */ export declare const DEFAULT_REDACTION_CONFIG: RedactionConfig; diff --git a/dist/redaction-rules.js b/dist/redaction-rules.js index 5adc1c46..153da735 100644 --- a/dist/redaction-rules.js +++ b/dist/redaction-rules.js @@ -23,6 +23,23 @@ * docs/REDACTION.md. `episodic-memory redact --print-default-rules` dumps * this object as JSON. */ +// Names that mark the value next to them as a secret, for the key-context +// rules below. A name must END in one of these (optionally plus digits), so +// tokenType, secretName, passwordPolicy, TokenEndpoint and maxTokens don't +// count. `pwd` is deliberately absent (the PWD env var); `userPWD` is handled +// by xml-secret-attribute. +const SECRET_NAME = String.raw `(?:secret|password|passwd|passphrase|api[_-]?key|access[_-]?key|account[_-]?key|private[_-]?key|` + + String.raw `shared[_-]?(?:access[_-]?)?key|primary[_-]?key|secondary[_-]?key|master[_-]?key|signing[_-]?key|` + + String.raw `subscription[_-]?key|client[_-]?key|encryption[_-]?key|token|credentials?)\d*`; +// Value is not a template/placeholder: ${X} $(X) $X #{X}# {{x}} %X% __X__, +// an existing token, a type name (Swagger "string"), or a mask (*****). +const NOT_PLACEHOLDER = String.raw `(?!\[REDACTED:|\$\{|\$\(|\$[A-Za-z_]\w*["'<\s]|#\{|\{\{|<[^>]*>|%[A-Za-z_]\w*%|__[A-Za-z0-9_]+__|` + + String.raw `(?:string|null|true|false|none|undefined|\*+)["'<])`; +// A JSON string value (escapes allowed), captured. +const JSON_STRING_VALUE = String.raw `"${NOT_PLACEHOLDER}([^"\\]+(?:\\.[^"\\]*)*)"`; +// Sibling members inside the same object: strings, or anything but braces/quotes. +const SAME_OBJECT = String.raw `(?:[^{}"]|"(?:[^"\\]|\\.)*"){0,400}?`; +const KEY_VAULT_ID = String.raw `"id"[ \t]*:[ \t]*"https://[^"\s]+\.vault\.(?:azure\.net|azure\.cn|usgovcloudapi\.net|microsoftazure\.de)/secrets/[^"\s]*"`; export const DEFAULT_REDACTION_CONFIG = { rules: [ { @@ -34,7 +51,7 @@ export const DEFAULT_REDACTION_CONFIG = { { id: 'connection-string-secret', description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept', - pattern: String.raw `\b(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password|Pwd)[ \t]*=[ \t]*(?![\[$<{%])([^;"'\s]+)`, + pattern: String.raw `\b(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password|Pwd)=(?![\[$<{%])([^;"'\s]+)`, secretGroup: 1, keywords: ['accountkey', 'sharedaccess', 'sharedsecret', 'clientsecret', 'password', 'pwd'], }, @@ -126,6 +143,70 @@ export const DEFAULT_REDACTION_CONFIG = { secretGroup: 1, keywords: ['basic'], }, + { + id: 'azure-keyvault-secret', + description: 'The "value" of a Key Vault secret bundle (az keyvault secret show/set, SDK JSON), whatever the secret is named', + pattern: KEY_VAULT_ID + String.raw `(?:[^{}]|\{[^{}]*\}){0,800}?"value"[ \t]*:[ \t]*` + JSON_STRING_VALUE + + String.raw `|"value"[ \t]*:[ \t]*` + JSON_STRING_VALUE + String.raw `(?=(?:[^{}]|\{[^{}]*\}){0,800}?` + KEY_VAULT_ID + ')', + secretGroup: [1, 2], + useAllowlist: false, + keywords: ['.vault.'], + }, + { + id: 'name-value-secret', + description: 'The "value" of a {"name"/"key": , "value": ...} object, in either order: ' + + 'az webapp/functionapp config appsettings list, Kubernetes env, ARM/Bicep parameters', + pattern: String.raw `"(?:name|key)"[ \t]*:[ \t]*"[^"\\]{0,80}?` + SECRET_NAME + '"' + SAME_OBJECT + + String.raw `"value"[ \t]*:[ \t]*` + JSON_STRING_VALUE + + String.raw `|"value"[ \t]*:[ \t]*` + JSON_STRING_VALUE + '(?=' + SAME_OBJECT + + String.raw `"(?:name|key)"[ \t]*:[ \t]*"[^"\\]{0,80}?` + SECRET_NAME + '")', + flags: 'i', + secretGroup: [1, 2], + useAllowlist: false, + keywords: ['"value"'], + }, + { + id: 'xml-appsettings-secret', + description: 'web.config / app.config , either attribute order', + pattern: String.raw `]*?\bkey[ \t]*=[ \t]*"[^"]{0,80}?` + SECRET_NAME + String.raw `"[^>]*?\bvalue[ \t]*=[ \t]*"` + + NOT_PLACEHOLDER + String.raw `([^"]+)"` + + String.raw `|]*?\bvalue[ \t]*=[ \t]*"` + NOT_PLACEHOLDER + String.raw `([^"]+)"(?=[^>]*?\bkey[ \t]*=[ \t]*"[^"]{0,80}?` + + SECRET_NAME + '")', + flags: 'i', + secretGroup: [1, 2], + useAllowlist: false, + keywords: [']*)?>` + NOT_PLACEHOLDER + String.raw `([^<]{1,4096})`, + flags: 'i', + secretGroup: 2, + useAllowlist: false, + keywords: ['; + secretFields?: Partial; } export interface RedactionContext { source: string; @@ -81,6 +103,8 @@ export interface RedactionResult { export interface Redactor { redact(text: string, ctx?: RedactionContext): RedactionResult; readonly ruleIds: string[]; + /** True when a JSON key / setting name marks its value as a secret (secretFields). */ + isSecretField(name: string): boolean; } export interface RedactionSettings { enabled: boolean; diff --git a/dist/redaction.js b/dist/redaction.js index c4190658..83f76944 100644 --- a/dist/redaction.js +++ b/dist/redaction.js @@ -29,6 +29,11 @@ const TOKEN_PATTERN = /\[REDACTED:[a-z0-9][a-z0-9-]*\]/g; const TOKEN_PREFIX = '[REDACTED:'; const ALLOWED_FLAGS = /^[imsu]*$/; const ENTROPY_RULE_ID = 'high-entropy'; +const FIELD_RULE_ID = 'secret-field'; +const RESERVED_IDS = new Set([ENTROPY_RULE_ID, FIELD_RULE_ID]); +/** Values that are templates or type names, not secrets. Never redacted by field context. */ +const PLACEHOLDER_VALUE = /^(?:\$\{.*\}|\$\(.*\)|\$[A-Za-z_]\w*|#\{.*\}#?|\{\{.*\}\}|<[^>]*>|%[A-Za-z_]\w*%|__[A-Za-z0-9_]+__|string|null|true|false|none|undefined|\*+)$/i; +const KEY_VAULT_SECRET_ID = /^https:\/\/[^/\s]+\.vault\.(?:azure\.net|azure\.cn|usgovcloudapi\.net|microsoftazure\.de)\/secrets\//i; /** Rules could not be loaded or are invalid. Messages describe config only. */ export class RedactionConfigError extends Error { constructor(message) { @@ -110,8 +115,10 @@ export function loadRedactionConfig(file) { throw new RedactionConfigError(`Redaction rules file: "${key}" must be an array`); } } - if (file.entropy !== undefined && (typeof file.entropy !== 'object' || file.entropy === null)) { - throw new RedactionConfigError('Redaction rules file: "entropy" must be an object'); + for (const key of ['entropy', 'secretFields']) { + if (file[key] !== undefined && (typeof file[key] !== 'object' || file[key] === null || Array.isArray(file[key]))) { + throw new RedactionConfigError(`Redaction rules file: "${key}" must be an object`); + } } const includeDefaults = file.includeDefaults !== false; const disabled = new Set(file.disableRules ?? []); @@ -121,6 +128,7 @@ export function loadRedactionConfig(file) { rules: replaceById(baseRules, file.rules ?? []).filter(rule => !disabled.has(rule.id)), allowlist: replaceById(baseAllowlist, file.allowlist ?? []), entropy: { ...DEFAULT_REDACTION_CONFIG.entropy, ...(file.entropy ?? {}) }, + secretFields: { ...DEFAULT_REDACTION_CONFIG.secretFields, ...(file.secretFields ?? {}) }, }; compileConfig(config); // validate return config; @@ -164,8 +172,8 @@ function compileRule(spec) { if (typeof spec.id !== 'string' || !RULE_ID_PATTERN.test(spec.id)) { throw new RedactionConfigError(`Redaction rule id ${JSON.stringify(spec.id)} is invalid: use lowercase letters, digits and dashes`); } - if (spec.id === ENTROPY_RULE_ID) { - throw new RedactionConfigError(`Redaction rule id "${ENTROPY_RULE_ID}" is reserved`); + if (RESERVED_IDS.has(spec.id)) { + throw new RedactionConfigError(`Redaction rule id "${spec.id}" is reserved`); } const what = `Redaction rule "${spec.id}"`; if (typeof spec.pattern !== 'string' || spec.pattern.length === 0) { @@ -184,9 +192,17 @@ function compileRule(spec) { if (new RegExp(spec.pattern, flags).test('')) { throw new RedactionConfigError(`${what}: pattern matches the empty string`); } - const secretGroup = spec.secretGroup ?? 0; - if (!Number.isInteger(secretGroup) || secretGroup < 0 || secretGroup > groupCount) { - throw new RedactionConfigError(`${what}: secretGroup ${secretGroup} does not exist in the pattern (${groupCount} group(s))`); + const secretGroups = Array.isArray(spec.secretGroup) ? spec.secretGroup : [spec.secretGroup ?? 0]; + if (secretGroups.length === 0) { + throw new RedactionConfigError(`${what}: secretGroup must not be an empty array`); + } + for (const group of secretGroups) { + if (!Number.isInteger(group) || group < 0 || group > groupCount) { + throw new RedactionConfigError(`${what}: secretGroup ${group} does not exist in the pattern (${groupCount} group(s))`); + } + } + if (spec.useAllowlist !== undefined && typeof spec.useAllowlist !== 'boolean') { + throw new RedactionConfigError(`${what}: useAllowlist must be a boolean`); } let keywords; if (spec.keywords !== undefined) { @@ -195,7 +211,7 @@ function compileRule(spec) { } keywords = spec.keywords.length > 0 ? spec.keywords.map(k => k.toLowerCase()) : undefined; } - return { id: spec.id, regex, keywords, secretGroup }; + return { id: spec.id, regex, keywords, secretGroups, useAllowlist: spec.useAllowlist !== false }; } function compileAllowlist(spec) { const what = `Redaction allowlist entry ${JSON.stringify(spec?.id)}`; @@ -228,7 +244,22 @@ function compileConfig(config) { !Array.isArray(e.keywords) || e.keywords.some(k => typeof k !== 'string' || !k)) { throw new RedactionConfigError('Redaction entropy settings are invalid (need enabled, requireKeyword: boolean; minLength >= 8; threshold > 0; window >= 0; keywords: string[])'); } - return { rules, allowlist, entropy: { ...e, keywords: e.keywords.map(k => k.toLowerCase()) } }; + const f = config.secretFields; + if (!f || typeof f.enabled !== 'boolean' || typeof f.keyPattern !== 'string' || f.keyPattern.length === 0) { + throw new RedactionConfigError('Redaction secretFields settings are invalid (need enabled: boolean; keyPattern: non-empty string)'); + } + let secretField = null; + if (f.enabled) { + try { + secretField = new RegExp(`(?:${f.keyPattern})$`); + } + catch (error) { + throw new RedactionConfigError(`Redaction secretFields.keyPattern: invalid regular expression (${error instanceof Error ? error.message : String(error)})`); + } + if (secretField.test('')) + throw new RedactionConfigError('Redaction secretFields.keyPattern matches the empty string'); + } + return { rules, allowlist, entropy: { ...e, keywords: e.keywords.map(k => k.toLowerCase()) }, secretField }; } // --------------------------------------------------------------------------- // Redaction engine @@ -271,7 +302,12 @@ function applyRule(text, rule, isAllowed) { let last = 0; let count = 0; for (const m of text.matchAll(rule.regex)) { - const range = m.indices?.[rule.secretGroup]; + let range; + for (const group of rule.secretGroups) { + range = m.indices?.[group]; + if (range) + break; + } if (!range) continue; const [start, end] = range; @@ -279,7 +315,7 @@ function applyRule(text, rule, isAllowed) { continue; if (spans && overlapsAny(spans, start, end)) continue; - if (isAllowed(text.slice(start, end))) + if (rule.useAllowlist && isAllowed(text.slice(start, end))) continue; out += text.slice(last, start) + token; last = end; @@ -320,6 +356,12 @@ export function createRedactor(config) { const isAllowed = (secret) => compiled.allowlist.some(re => re.test(secret)); return { ruleIds: compiled.rules.map(r => r.id), + isSecretField(name) { + if (!compiled.secretField || typeof name !== 'string') + return false; + const normalized = name.toLowerCase().replace(/[^a-z0-9]/g, '').replace(/\d+$/, ''); + return normalized.length > 0 && compiled.secretField.test(normalized); + }, redact(text, _ctx) { if (typeof text !== 'string' || text.length === 0) return { text, findings: [] }; @@ -384,7 +426,10 @@ export function formatFindings(findings) { // --------------------------------------------------------------------------- // JSON / JSONL / files // --------------------------------------------------------------------------- -/** Redact every string value in a parsed JSON tree, in place. Keys are left alone. */ +/** + * Redact a parsed JSON tree in place: string values by the text rules, values + * by their field name (secretFields), and keys that are themselves secrets. + */ function redactTree(node, redactor, ctx, tally) { if (typeof node === 'string') { const r = redactor.redact(node, ctx); @@ -407,15 +452,74 @@ function redactTree(node, redactor, ctx, tally) { return { value: node, changed }; } const obj = node; - for (const key of Object.keys(obj)) { + const keys = Object.keys(obj); + for (const key of keys) { const r = redactTree(obj[key], redactor, ctx, tally); if (r.changed) { - Object.defineProperty(obj, key, { value: r.value, writable: true, enumerable: true, configurable: true }); + setOwn(obj, key, r.value); changed = true; } } + // Field-name context: the key (or a {name, value} pair's name, or a Key + // Vault secret id) says the value is a secret even when its shape matches + // no rule — e.g. a letters-only clientSecret field in a structured + // MCP result. Runs after the text rules, so a value they already redacted + // in part (a connection string) keeps its searchable remainder. + const redactWhole = (key) => { + if (!isRedactableWhole(obj[key])) + return; + setOwn(obj, key, tokenFor(FIELD_RULE_ID)); + tally?.add([{ ruleId: FIELD_RULE_ID, count: 1 }]); + changed = true; + }; + for (const key of keys) { + if (redactor.isSecretField(key)) + redactWhole(key); + } + const lower = new Map(keys.map(k => [k.toLowerCase(), k])); + const valueKey = lower.get('value'); + if (valueKey !== undefined) { + const nameKey = lower.get('name') ?? lower.get('key'); + const nameValue = nameKey !== undefined ? obj[nameKey] : undefined; + const id = lower.has('id') ? obj[lower.get('id')] : undefined; + if ((typeof nameValue === 'string' && redactor.isSecretField(nameValue)) || + (typeof id === 'string' && KEY_VAULT_SECRET_ID.test(id))) { + redactWhole(valueKey); + } + } + // Keys themselves: a secret used as a key (a token-keyed cache) is renamed + // to its token. Harness keys never match a rule, so structure is unchanged. + let renamed = null; + for (let i = 0; i < keys.length; i++) { + const r = redactor.redact(keys[i], ctx); + if (r.findings.length === 0) + continue; + tally?.add(r.findings); + renamed ??= keys.map(k => [k, obj[k]]); + renamed[i][0] = r.text; + } + if (renamed) { + const rebuilt = {}; + for (const [key, value] of renamed) { + let unique = key; + for (let n = 2; Object.prototype.hasOwnProperty.call(rebuilt, unique); n++) + unique = `${key}#${n}`; + setOwn(rebuilt, unique, value); + } + return { value: rebuilt, changed: true }; + } return { value: obj, changed }; } +function setOwn(obj, key, value) { + // defineProperty so a "__proto__" key from JSON.parse stays an own property. + Object.defineProperty(obj, key, { value, writable: true, enumerable: true, configurable: true }); +} +function isRedactableWhole(value) { + return typeof value === 'string' && + value.trim().length > 0 && + !value.includes(TOKEN_PREFIX) && + !PLACEHOLDER_VALUE.test(value.trim()); +} /** * Redact one JSONL line. Valid JSON stays valid (string values are redacted * and the line is re-serialized only if something changed); a line that isn't diff --git a/docs/REDACTION.md b/docs/REDACTION.md index 85d967c9..f3bafbe1 100644 --- a/docs/REDACTION.md +++ b/docs/REDACTION.md @@ -4,9 +4,10 @@ episodic-memory replaces secrets in your conversations with typed tokens **before** it archives, indexes, embeds, or summarizes them: ``` -AccountKey=Zm9v...== → AccountKey=[REDACTED:connection-string-secret] -"password": "abc1Q~..." → "password": "[REDACTED:azure-client-secret]" -Authorization: Bearer eyJ → Authorization: Bearer [REDACTED:jwt] +AccountKey=<88-char key> → AccountKey=[REDACTED:connection-string-secret] +"ClientSecret": "" → "ClientSecret": "[REDACTED:quoted-secret-assignment]" + → +Authorization: Bearer → Authorization: Bearer [REDACTED:jwt] ``` Values are redacted, not dropped. The rest of the conversation stays @@ -56,11 +57,32 @@ summary: | `azure-storage-key` | Standalone 88-character base64 keys (Storage, Cosmos DB, Function keys) | | `url-credentials` | The password in `scheme://user:password@host` | | `bearer-token`, `basic-auth` | `Authorization` header values | -| `secret-assignment` | A value assigned to a secret-looking key: `password: …`, `CLIENT_SECRET=…`, `"apiKey": "…"`. Covers decrypted SOPS, YAML, dotenv, and JSON. Needs 8+ characters including a digit, and skips placeholders (`${X}`, ``, `%X%`) and code (`env.X`, `getPassword()`). | - -**Allowlisted** (never redacted, even when a rule matches): git SHAs and -GUIDs. Tenant, client, object, and subscription IDs stay searchable, and so do -commit hashes. +| `azure-keyvault-secret` | The `value` of a Key Vault secret bundle (`az keyvault secret show`, SDK JSON), whatever the secret is named | +| `name-value-secret` | The `value` of a `{"name": , "value": …}` object, in either order: `az webapp`/`functionapp config appsettings list`, Kubernetes `env`, ARM/Bicep parameters | +| `xml-appsettings-secret` | `web.config` / `app.config` ``, either attribute order | +| `xml-secret-element` | `…`, `…` and the like | +| `xml-secret-attribute` | Secret-named XML attributes, e.g. `userPWD="…"` in Azure publish profiles | +| `quoted-secret-assignment` | A **quoted** value assigned to a secret-looking name: `"ClientSecret": "…"` (appsettings.json and any JSON in tool output), `ClientSecret = "…"` (C#), `apiKey: '…'` (JS/YAML/Python). No digit or minimum entropy is required; the value must have no spaces. | +| `secret-assignment` | An **unquoted** value assigned to a secret-looking key: `password: …`, `CLIENT_SECRET=…`. Covers decrypted SOPS, YAML, and dotenv. Needs 8+ characters including a digit, and skips code (`env.X`, `getPassword()`). | +| `secret-field` | Not a text rule: in parsed JSON (transcript lines, structured MCP/tool results, tool inputs), a string whose **field name** is secret-looking, or the `value` of a `{name, value}` pair or Key Vault bundle, is redacted whole. See `secretFields` below. | + +A **secret-looking name** ends in `secret`, `password`, `passwd`, +`passphrase`, `apikey`, `accesskey`, `accountkey`, `privatekey`, `sharedkey`, +`primarykey`, `secondarykey`, `masterkey`, `signingkey`, `subscriptionkey`, +`clientkey`, `encryptionkey`, `token`, or `credential(s)`, in any case and +with any separators (`AzureAd:ClientSecret`, `Stripe__ApiKey`, `DB_PASSWORD2`). +Because it has to *end* in one of these, `TokenEndpoint`, `secretName`, +`passwordPolicy`, `tokenType`, and `maxTokens` don't count. + +Key-context rules leave **placeholders** alone: `${X}`, `$(X)`, `#{X}#` +(Azure DevOps token replacement), `{{x}}`, ``, `%X%`, `__X__`, and type +names or masks like `"string"` and `"*****"`. All other rules skip the same +`${X}`, ``, and `%X%` forms. + +**Allowlisted:** git SHAs and GUIDs are not redacted by shape-based rules, +so tenant, client, object, and subscription IDs and commit hashes stay +searchable. Key-context rules ignore the allowlist on purpose: a GUID in a +`password` slot (older `az ad sp create-for-rbac` output) *is* a secret. **Entropy fallback:** off by default. When it's on, a long, high-entropy string is redacted only if a keyword (`secret`, `key`, `token`, …) appears just before @@ -95,7 +117,8 @@ bundled rules: "pattern": "\\bctso_[A-Za-z0-9]{32}\\b", // JavaScript regex "flags": "i", // optional, any of "imsu" "keywords": ["ctso_"], // optional prefilter (case-insensitive) - "secretGroup": 0 // optional: redact only this capture group + "secretGroup": 0, // optional: redact only this group ([1, 2] = first that matched) + "useAllowlist": true // optional: false = redact even SHA/GUID-shaped values } ], "disableRules": ["basic-auth"], // turn off defaults by id @@ -103,6 +126,12 @@ bundled rules: { "id": "build-ids", "pattern": "build-[0-9]{8}" } ], "entropy": { "enabled": true }, // partial override of the entropy settings + "secretFields": { // field-name context in parsed JSON + "enabled": true, + // matched against the END of the key lowercased with separators removed; + // this example adds "connectionstring" to redact whole connection strings + "keyPattern": "secret|password|passwd|userpwd|passphrase|apikey|accesskey|accountkey|privatekey|sharedkey|primarykey|secondarykey|masterkey|signingkey|subscriptionkey|clientkey|encryptionkey|token|credentials?|connectionstring" + }, "includeDefaults": true // false = use only this file's rules } ``` @@ -148,8 +177,10 @@ Codex, Cursor, opencode, OMP) passes through that copy, and every later stage reads the archive rather than the source. The design and the research behind it are in [redaction/PHASE0-FINDINGS.md](redaction/PHASE0-FINDINGS.md). -Each archive line is parsed as JSON, every string value is redacted, and only -lines that changed are re-serialized. Lines with no secrets stay byte-for-byte +Each archive line is parsed as JSON. Every string value goes through the text +rules, values are redacted whole when their field name marks them as secrets +(`secretFields`), and a key that is itself a secret is renamed to its token. +Only lines that changed are re-serialized. Lines with no secrets stay byte-for-byte identical. The archive keeps exactly one line per source line, so index line ranges and MCP `read` ranges still line up. A line that isn't valid JSON (for example, a half-written last line) is redacted as plain text. @@ -159,9 +190,15 @@ example, a half-written last line) is redacted as plain text. - Pattern rules miss secrets that have no recognizable shape and no `key: value` context. The entropy fallback helps when it's on, but recall isn't perfect. -- Each JSON string value is checked on its own. Context split across fields - (`{"name": "DB_PASSWORD", "value": "…"}`) isn't linked, so the `value` is - caught only if its own shape matches a rule. -- JSON object *keys* aren't redacted. Only values are. +- A secret-looking name is required for the key-context rules. A setting + named `Stripe` or `ConnectionStrings__Default` with a shapeless value is + only caught if a shape rule matches the value. Connection strings are + handled by `connection-string-secret`, which keeps server names searchable. + Add your own names via `secretFields.keyPattern` or a custom rule. +- Quoted values containing spaces (multi-word passphrases) aren't caught by + `quoted-secret-assignment`. The rule excludes them so that UI labels like + `ErrorMessage = "Invalid password"` aren't redacted. +- Positional secrets in code (`new ClientSecretCredential(t, c, "…")`) are + caught only by shape, e.g. `azure-client-secret`. - On lines that get redacted, re-serializing can change number formatting for integers above 2^53. No supported harness writes such numbers. diff --git a/src/redaction-rules.ts b/src/redaction-rules.ts index d73a043f..02c41467 100644 --- a/src/redaction-rules.ts +++ b/src/redaction-rules.ts @@ -25,6 +25,29 @@ import type { RedactionConfig } from './redaction.js'; * docs/REDACTION.md. `episodic-memory redact --print-default-rules` dumps * this object as JSON. */ +// Names that mark the value next to them as a secret, for the key-context +// rules below. A name must END in one of these (optionally plus digits), so +// tokenType, secretName, passwordPolicy, TokenEndpoint and maxTokens don't +// count. `pwd` is deliberately absent (the PWD env var); `userPWD` is handled +// by xml-secret-attribute. +const SECRET_NAME = + String.raw`(?:secret|password|passwd|passphrase|api[_-]?key|access[_-]?key|account[_-]?key|private[_-]?key|` + + String.raw`shared[_-]?(?:access[_-]?)?key|primary[_-]?key|secondary[_-]?key|master[_-]?key|signing[_-]?key|` + + String.raw`subscription[_-]?key|client[_-]?key|encryption[_-]?key|token|credentials?)\d*`; + +// Value is not a template/placeholder: ${X} $(X) $X #{X}# {{x}} %X% __X__, +// an existing token, a type name (Swagger "string"), or a mask (*****). +const NOT_PLACEHOLDER = + String.raw`(?!\[REDACTED:|\$\{|\$\(|\$[A-Za-z_]\w*["'<\s]|#\{|\{\{|<[^>]*>|%[A-Za-z_]\w*%|__[A-Za-z0-9_]+__|` + + String.raw`(?:string|null|true|false|none|undefined|\*+)["'<])`; + +// A JSON string value (escapes allowed), captured. +const JSON_STRING_VALUE = String.raw`"${NOT_PLACEHOLDER}([^"\\]+(?:\\.[^"\\]*)*)"`; +// Sibling members inside the same object: strings, or anything but braces/quotes. +const SAME_OBJECT = String.raw`(?:[^{}"]|"(?:[^"\\]|\\.)*"){0,400}?`; +const KEY_VAULT_ID = + String.raw`"id"[ \t]*:[ \t]*"https://[^"\s]+\.vault\.(?:azure\.net|azure\.cn|usgovcloudapi\.net|microsoftazure\.de)/secrets/[^"\s]*"`; + export const DEFAULT_REDACTION_CONFIG: RedactionConfig = { rules: [ { @@ -36,7 +59,7 @@ export const DEFAULT_REDACTION_CONFIG: RedactionConfig = { { id: 'connection-string-secret', description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept', - pattern: String.raw`\b(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password|Pwd)[ \t]*=[ \t]*(?![\[$<{%])([^;"'\s]+)`, + pattern: String.raw`\b(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password|Pwd)=(?![\[$<{%])([^;"'\s]+)`, secretGroup: 1, keywords: ['accountkey', 'sharedaccess', 'sharedsecret', 'clientsecret', 'password', 'pwd'], }, @@ -128,6 +151,77 @@ export const DEFAULT_REDACTION_CONFIG: RedactionConfig = { secretGroup: 1, keywords: ['basic'], }, + { + id: 'azure-keyvault-secret', + description: 'The "value" of a Key Vault secret bundle (az keyvault secret show/set, SDK JSON), whatever the secret is named', + pattern: + KEY_VAULT_ID + String.raw`(?:[^{}]|\{[^{}]*\}){0,800}?"value"[ \t]*:[ \t]*` + JSON_STRING_VALUE + + String.raw`|"value"[ \t]*:[ \t]*` + JSON_STRING_VALUE + String.raw`(?=(?:[^{}]|\{[^{}]*\}){0,800}?` + KEY_VAULT_ID + ')', + secretGroup: [1, 2], + useAllowlist: false, + keywords: ['.vault.'], + }, + { + id: 'name-value-secret', + description: + 'The "value" of a {"name"/"key": , "value": ...} object, in either order: ' + + 'az webapp/functionapp config appsettings list, Kubernetes env, ARM/Bicep parameters', + pattern: + String.raw`"(?:name|key)"[ \t]*:[ \t]*"[^"\\]{0,80}?` + SECRET_NAME + '"' + SAME_OBJECT + + String.raw`"value"[ \t]*:[ \t]*` + JSON_STRING_VALUE + + String.raw`|"value"[ \t]*:[ \t]*` + JSON_STRING_VALUE + '(?=' + SAME_OBJECT + + String.raw`"(?:name|key)"[ \t]*:[ \t]*"[^"\\]{0,80}?` + SECRET_NAME + '")', + flags: 'i', + secretGroup: [1, 2], + useAllowlist: false, + keywords: ['"value"'], + }, + { + id: 'xml-appsettings-secret', + description: 'web.config / app.config , either attribute order', + pattern: + String.raw`]*?\bkey[ \t]*=[ \t]*"[^"]{0,80}?` + SECRET_NAME + String.raw`"[^>]*?\bvalue[ \t]*=[ \t]*"` + + NOT_PLACEHOLDER + String.raw`([^"]+)"` + + String.raw`|]*?\bvalue[ \t]*=[ \t]*"` + NOT_PLACEHOLDER + String.raw`([^"]+)"(?=[^>]*?\bkey[ \t]*=[ \t]*"[^"]{0,80}?` + + SECRET_NAME + '")', + flags: 'i', + secretGroup: [1, 2], + useAllowlist: false, + keywords: [']*)?>` + NOT_PLACEHOLDER + String.raw`([^<]{1,4096})`, + flags: 'i', + secretGroup: 2, + useAllowlist: false, + keywords: [']*>|%[A-Za-z_]\w*%|__[A-Za-z0-9_]+__|string|null|true|false|none|undefined|\*+)$/i; +const KEY_VAULT_SECRET_ID = /^https:\/\/[^/\s]+\.vault\.(?:azure\.net|azure\.cn|usgovcloudapi\.net|microsoftazure\.de)\/secrets\//i; export interface RedactionRuleSpec { id: string; @@ -42,8 +49,13 @@ export interface RedactionRuleSpec { flags?: string; /** Case-insensitive prefilter: skip the rule unless the text contains one. */ keywords?: string[]; - /** Replace only this capture group instead of the whole match. */ - secretGroup?: number; + /** + * Replace only this capture group instead of the whole match. An array means + * "the first of these groups that participated" (for either-order patterns). + */ + secretGroup?: number | number[]; + /** Apply the allowlist to this rule's matches (default true). Key-context rules turn it off: a GUID in a password slot is a secret. */ + useAllowlist?: boolean; description?: string; } @@ -67,10 +79,27 @@ export interface EntropySpec { window: number; } +/** + * Field-name context for parsed JSON (transcript lines, structured tool/MCP + * results, tool inputs). A string value is redacted whole when its own key, or + * the `name`/`key` of a `{name, value}` pair, matches `keyPattern`. + */ +export interface SecretFieldsSpec { + enabled: boolean; + /** + * Matched (anchored at the end) against the key lowercased with everything + * but letters and digits removed and trailing digits dropped, so + * `AzureAd:ClientSecret`, `client_secret` and `DB_PASSWORD2` all normalize to + * something ending in a keyword. + */ + keyPattern: string; +} + export interface RedactionConfig { rules: RedactionRuleSpec[]; allowlist: AllowlistSpec[]; entropy: EntropySpec; + secretFields: SecretFieldsSpec; } /** Shape of a user `redaction-rules.json`. Every field is optional. */ @@ -84,6 +113,7 @@ export interface RedactionRulesFile { /** Added to the default allowlist (same id replaces). */ allowlist?: AllowlistSpec[]; entropy?: Partial; + secretFields?: Partial; } export interface RedactionContext { @@ -104,6 +134,8 @@ export interface RedactionResult { export interface Redactor { redact(text: string, ctx?: RedactionContext): RedactionResult; readonly ruleIds: string[]; + /** True when a JSON key / setting name marks its value as a secret (secretFields). */ + isSecretField(name: string): boolean; } export interface RedactionSettings { @@ -197,8 +229,10 @@ export function loadRedactionConfig(file: RedactionRulesFile): RedactionConfig { throw new RedactionConfigError(`Redaction rules file: "${key}" must be an array`); } } - if (file.entropy !== undefined && (typeof file.entropy !== 'object' || file.entropy === null)) { - throw new RedactionConfigError('Redaction rules file: "entropy" must be an object'); + for (const key of ['entropy', 'secretFields'] as const) { + if (file[key] !== undefined && (typeof file[key] !== 'object' || file[key] === null || Array.isArray(file[key]))) { + throw new RedactionConfigError(`Redaction rules file: "${key}" must be an object`); + } } const includeDefaults = file.includeDefaults !== false; @@ -210,6 +244,7 @@ export function loadRedactionConfig(file: RedactionRulesFile): RedactionConfig { rules: replaceById(baseRules, file.rules ?? []).filter(rule => !disabled.has(rule.id)), allowlist: replaceById(baseAllowlist, file.allowlist ?? []), entropy: { ...DEFAULT_REDACTION_CONFIG.entropy, ...(file.entropy ?? {}) }, + secretFields: { ...DEFAULT_REDACTION_CONFIG.secretFields, ...(file.secretFields ?? {}) }, }; compileConfig(config); // validate return config; @@ -251,13 +286,16 @@ interface CompiledRule { id: string; regex: RegExp; keywords?: string[]; - secretGroup: number; + secretGroups: number[]; + useAllowlist: boolean; } interface CompiledConfig { rules: CompiledRule[]; allowlist: RegExp[]; entropy: EntropySpec; + /** null when secretFields is disabled. */ + secretField: RegExp | null; } function checkFlags(flags: string | undefined, what: string): string { @@ -277,8 +315,8 @@ function compileRule(spec: RedactionRuleSpec): CompiledRule { `Redaction rule id ${JSON.stringify(spec.id)} is invalid: use lowercase letters, digits and dashes` ); } - if (spec.id === ENTROPY_RULE_ID) { - throw new RedactionConfigError(`Redaction rule id "${ENTROPY_RULE_ID}" is reserved`); + if (RESERVED_IDS.has(spec.id)) { + throw new RedactionConfigError(`Redaction rule id "${spec.id}" is reserved`); } const what = `Redaction rule "${spec.id}"`; if (typeof spec.pattern !== 'string' || spec.pattern.length === 0) { @@ -298,9 +336,17 @@ function compileRule(spec: RedactionRuleSpec): CompiledRule { throw new RedactionConfigError(`${what}: pattern matches the empty string`); } - const secretGroup = spec.secretGroup ?? 0; - if (!Number.isInteger(secretGroup) || secretGroup < 0 || secretGroup > groupCount) { - throw new RedactionConfigError(`${what}: secretGroup ${secretGroup} does not exist in the pattern (${groupCount} group(s))`); + const secretGroups = Array.isArray(spec.secretGroup) ? spec.secretGroup : [spec.secretGroup ?? 0]; + if (secretGroups.length === 0) { + throw new RedactionConfigError(`${what}: secretGroup must not be an empty array`); + } + for (const group of secretGroups) { + if (!Number.isInteger(group) || group < 0 || group > groupCount) { + throw new RedactionConfigError(`${what}: secretGroup ${group} does not exist in the pattern (${groupCount} group(s))`); + } + } + if (spec.useAllowlist !== undefined && typeof spec.useAllowlist !== 'boolean') { + throw new RedactionConfigError(`${what}: useAllowlist must be a boolean`); } let keywords: string[] | undefined; @@ -311,7 +357,7 @@ function compileRule(spec: RedactionRuleSpec): CompiledRule { keywords = spec.keywords.length > 0 ? spec.keywords.map(k => k.toLowerCase()) : undefined; } - return { id: spec.id, regex, keywords, secretGroup }; + return { id: spec.id, regex, keywords, secretGroups, useAllowlist: spec.useAllowlist !== false }; } function compileAllowlist(spec: AllowlistSpec): RegExp { @@ -349,7 +395,21 @@ function compileConfig(config: RedactionConfig): CompiledConfig { 'Redaction entropy settings are invalid (need enabled, requireKeyword: boolean; minLength >= 8; threshold > 0; window >= 0; keywords: string[])' ); } - return { rules, allowlist, entropy: { ...e, keywords: e.keywords.map(k => k.toLowerCase()) } }; + const f = config.secretFields; + if (!f || typeof f.enabled !== 'boolean' || typeof f.keyPattern !== 'string' || f.keyPattern.length === 0) { + throw new RedactionConfigError('Redaction secretFields settings are invalid (need enabled: boolean; keyPattern: non-empty string)'); + } + let secretField: RegExp | null = null; + if (f.enabled) { + try { + secretField = new RegExp(`(?:${f.keyPattern})$`); + } catch (error) { + throw new RedactionConfigError(`Redaction secretFields.keyPattern: invalid regular expression (${error instanceof Error ? error.message : String(error)})`); + } + if (secretField.test('')) throw new RedactionConfigError('Redaction secretFields.keyPattern matches the empty string'); + } + + return { rules, allowlist, entropy: { ...e, keywords: e.keywords.map(k => k.toLowerCase()) }, secretField }; } // --------------------------------------------------------------------------- @@ -394,12 +454,16 @@ function applyRule(text: string, rule: CompiledRule, isAllowed: (s: string) => b let last = 0; let count = 0; for (const m of text.matchAll(rule.regex)) { - const range = m.indices?.[rule.secretGroup]; + let range: [number, number] | undefined; + for (const group of rule.secretGroups) { + range = m.indices?.[group]; + if (range) break; + } if (!range) continue; const [start, end] = range; if (end <= start || start < last) continue; if (spans && overlapsAny(spans, start, end)) continue; - if (isAllowed(text.slice(start, end))) continue; + if (rule.useAllowlist && isAllowed(text.slice(start, end))) continue; out += text.slice(last, start) + token; last = end; count++; @@ -438,6 +502,11 @@ export function createRedactor(config: RedactionConfig): Redactor { return { ruleIds: compiled.rules.map(r => r.id), + isSecretField(name: string): boolean { + if (!compiled.secretField || typeof name !== 'string') return false; + const normalized = name.toLowerCase().replace(/[^a-z0-9]/g, '').replace(/\d+$/, ''); + return normalized.length > 0 && compiled.secretField.test(normalized); + }, redact(text: string, _ctx?: RedactionContext): RedactionResult { if (typeof text !== 'string' || text.length === 0) return { text, findings: [] }; let current = text; @@ -508,7 +577,10 @@ export function formatFindings(findings: RedactionFinding[]): string { // JSON / JSONL / files // --------------------------------------------------------------------------- -/** Redact every string value in a parsed JSON tree, in place. Keys are left alone. */ +/** + * Redact a parsed JSON tree in place: string values by the text rules, values + * by their field name (secretFields), and keys that are themselves secrets. + */ function redactTree( node: unknown, redactor: Redactor, @@ -532,16 +604,77 @@ function redactTree( return { value: node, changed }; } const obj = node as Record; - for (const key of Object.keys(obj)) { + const keys = Object.keys(obj); + for (const key of keys) { const r = redactTree(obj[key], redactor, ctx, tally); if (r.changed) { - Object.defineProperty(obj, key, { value: r.value, writable: true, enumerable: true, configurable: true }); + setOwn(obj, key, r.value); changed = true; } } + + // Field-name context: the key (or a {name, value} pair's name, or a Key + // Vault secret id) says the value is a secret even when its shape matches + // no rule — e.g. a letters-only clientSecret field in a structured + // MCP result. Runs after the text rules, so a value they already redacted + // in part (a connection string) keeps its searchable remainder. + const redactWhole = (key: string) => { + if (!isRedactableWhole(obj[key])) return; + setOwn(obj, key, tokenFor(FIELD_RULE_ID)); + tally?.add([{ ruleId: FIELD_RULE_ID, count: 1 }]); + changed = true; + }; + for (const key of keys) { + if (redactor.isSecretField(key)) redactWhole(key); + } + const lower = new Map(keys.map(k => [k.toLowerCase(), k])); + const valueKey = lower.get('value'); + if (valueKey !== undefined) { + const nameKey = lower.get('name') ?? lower.get('key'); + const nameValue = nameKey !== undefined ? obj[nameKey] : undefined; + const id = lower.has('id') ? obj[lower.get('id')!] : undefined; + if ( + (typeof nameValue === 'string' && redactor.isSecretField(nameValue)) || + (typeof id === 'string' && KEY_VAULT_SECRET_ID.test(id)) + ) { + redactWhole(valueKey); + } + } + + // Keys themselves: a secret used as a key (a token-keyed cache) is renamed + // to its token. Harness keys never match a rule, so structure is unchanged. + let renamed: Array<[string, unknown]> | null = null; + for (let i = 0; i < keys.length; i++) { + const r = redactor.redact(keys[i], ctx); + if (r.findings.length === 0) continue; + tally?.add(r.findings); + renamed ??= keys.map(k => [k, obj[k]]); + renamed[i][0] = r.text; + } + if (renamed) { + const rebuilt: Record = {}; + for (const [key, value] of renamed) { + let unique = key; + for (let n = 2; Object.prototype.hasOwnProperty.call(rebuilt, unique); n++) unique = `${key}#${n}`; + setOwn(rebuilt, unique, value); + } + return { value: rebuilt, changed: true }; + } return { value: obj, changed }; } +function setOwn(obj: Record, key: string, value: unknown): void { + // defineProperty so a "__proto__" key from JSON.parse stays an own property. + Object.defineProperty(obj, key, { value, writable: true, enumerable: true, configurable: true }); +} + +function isRedactableWhole(value: unknown): value is string { + return typeof value === 'string' && + value.trim().length > 0 && + !value.includes(TOKEN_PREFIX) && + !PLACEHOLDER_VALUE.test(value.trim()); +} + /** * Redact one JSONL line. Valid JSON stays valid (string values are redacted * and the line is re-serialized only if something changed); a line that isn't diff --git a/test/fake-secrets.ts b/test/fake-secrets.ts index 15deb68c..0eebca9e 100644 --- a/test/fake-secrets.ts +++ b/test/fake-secrets.ts @@ -113,7 +113,12 @@ export class FakeSecrets { return this.chars(LOWER, 1) + this.mixed(ALNUM + '!#%^*', 15); } - bearerOpaque(): string { + /** Letters only: a real password with no digit, which digit-gated rules miss. */ + passphrase(): string { + return this.chars(UPPER, 1) + this.chars(LOWER, 7) + this.chars(UPPER, 1) + this.chars(LOWER, 9); + } + + bearerOpaque(): string { return this.mixed(ALNUM, 40); } diff --git a/test/redaction-pipeline.test.ts b/test/redaction-pipeline.test.ts index edd4d1cb..89f60ea4 100644 --- a/test/redaction-pipeline.test.ts +++ b/test/redaction-pipeline.test.ts @@ -292,6 +292,43 @@ describe('redaction pipeline', () => { expect(summarizeSpy.mock.calls[0][2]).toMatchObject({ allowResume: true }); }); + it('.NET/Azure key-context secrets (no recognizable shape) never reach archive or SQLite', async () => { + const fake = new FakeSecrets(1999); + const appsettingsSecret = fake.passphrase(); + const appSettingValue = fake.passphrase(); + const vaultValue = fake.passphrase(); + const mcpSecret = fake.passphrase(); + const seed: Seed = { secrets: [appsettingsSecret, appSettingValue, vaultValue, mcpSecret], sha: fake.gitSha(), guid: fake.guid() }; + const base = { sessionId: SESSION, isSidechain: false, cwd: '/work/contoso' }; + const lines = [ + { ...base, type: 'user', uuid: 'u1', parentUuid: null, timestamp: '2026-01-01T00:00:00Z', message: { role: 'user', content: 'Why does the API fail to get a token?' } }, + { ...base, type: 'assistant', uuid: 'a1', parentUuid: 'u1', timestamp: '2026-01-01T00:00:01Z', message: { role: 'assistant', content: [ + { type: 'tool_use', id: 't1', name: 'Read', input: { file_path: '/work/contoso/appsettings.Development.json' } }, + ] } }, + { ...base, type: 'user', uuid: 'u2', parentUuid: 'a1', timestamp: '2026-01-01T00:00:02Z', + message: { role: 'user', content: [{ type: 'tool_result', tool_use_id: 't1', content: JSON.stringify({ AzureAd: { TenantId: seed.guid, ClientSecret: appsettingsSecret } }, null, 2) }] } }, + { ...base, type: 'assistant', uuid: 'a2', parentUuid: 'u2', timestamp: '2026-01-01T00:00:03Z', message: { role: 'assistant', content: [ + { type: 'tool_use', id: 't2', name: 'Bash', input: { command: 'az webapp config appsettings list -g rg -n app && az keyvault secret show --vault-name kv -n Db' } }, + ] } }, + { ...base, type: 'user', uuid: 'u3', parentUuid: 'a2', timestamp: '2026-01-01T00:00:04Z', + message: { role: 'user', content: [{ type: 'tool_result', tool_use_id: 't2', content: + JSON.stringify([{ name: 'Stripe__ApiKey', slotSetting: false, value: appSettingValue }], null, 2) + '\n' + + JSON.stringify({ id: 'https://kv.vault.azure.net/secrets/Db/0123', value: vaultValue }, null, 2) }] }, + toolUseResult: { structuredContent: { name: 'GraphClientSecret', value: mcpSecret } } }, + { ...base, type: 'assistant', uuid: 'a3', parentUuid: 'u3', timestamp: '2026-01-01T00:00:05Z', message: { role: 'assistant', content: [{ type: 'text', text: 'The client secret has expired.' }] } }, + ]; + writeFileSync(join(sourceDir, '-work-contoso', `${SESSION}.jsonl`), lines.map(l => JSON.stringify(l)).join('\n') + '\n'); + + const result = await syncConversations(sourceDir, archiveDir, { skipSummaries: true }); + expect(result.errors).toEqual([]); + const archived = readFileSync(join(archiveDir, '-work-contoso', `${SESSION}.jsonl`), 'utf-8'); + expectNoSecrets(archived, seed, 'archive'); + expectNoSecrets(dbText(dbPath), seed, 'SQLite'); + expectNoSecrets(JSON.stringify(embedSpy.mock.calls), seed, 'embedding input'); + expect(archived).toContain(seed.guid); + archived.split('\n').filter(Boolean).forEach(l => expect(() => JSON.parse(l)).not.toThrow()); + }); + it('the `index` path (indexUnprocessed) parses the redacted archive, not the source', async () => { const s = seedSecrets(77); writeFileSync(join(sourceDir, '-work-contoso', `${SESSION}.jsonl`), claudeTranscript(s)); diff --git a/test/redaction.test.ts b/test/redaction.test.ts index 95466d4e..8e824c3d 100644 --- a/test/redaction.test.ts +++ b/test/redaction.test.ts @@ -187,9 +187,9 @@ describe('redaction: default rules (positive)', () => { expect(redactor.redact(yaml, ctx).text).toContain('host: db.internal'); }); - it('secret-assignment redacts a JSON "clientSecret" field', () => { + it('quoted-secret-assignment redacts a JSON "clientSecret" field', () => { const secret = fake.password(); - expectRedacted(redactor, JSON.stringify({ clientId: fake.guid(), clientSecret: secret }), secret, 'secret-assignment'); + expectRedacted(redactor, JSON.stringify({ clientId: fake.guid(), clientSecret: secret }), secret, 'quoted-secret-assignment'); }); }); @@ -524,3 +524,164 @@ describe('redaction: settings and rules loading', () => { } }); }); + +describe('redaction: key context (.NET / Azure shapes)', () => { + let fake: FakeSecrets; + let redactor: Redactor; + beforeEach(() => { + fake = new FakeSecrets(2112); + redactor = defaults(); + }); + + function expectGone(text: string, secret: string, ruleId?: string) { + const result = redactor.redact(text, ctx); + expect(result.text, text).not.toContain(secret); + if (ruleId) expect(result.text).toContain(`[REDACTED:${ruleId}]`); + return result; + } + + it('appsettings.json fields, no digit required when the key is quoted JSON', () => { + const pw = fake.passphrase(); + const text = JSON.stringify({ AzureAd: { TenantId: fake.guid(), ClientId: fake.guid(), ClientSecret: pw } }, null, 2); + const r = expectGone(text, pw, 'quoted-secret-assignment'); + expect(r.text).toContain('"TenantId"'); + }); + + it('C# object initializers and locals', () => { + const a = fake.passphrase(); + const b = fake.passphrase(); + expectGone(`var cred = new ClientSecretCredential(tenant, client) { ClientSecret = "${a}", };`, a, 'quoted-secret-assignment'); + expectGone(`string apiKey = "${b}";`, b, 'quoted-secret-assignment'); + }); + + it('`az webapp config appsettings list` name/value pairs (name first and value first)', () => { + const a = fake.passphrase(); + const b = fake.passphrase(); + const text = JSON.stringify([ + { name: 'WEBSITE_RUN_FROM_PACKAGE', slotSetting: false, value: '1' }, + { name: 'Stripe__ApiKey', slotSetting: false, value: a }, + { value: b, slotSetting: true, name: 'DB_PASSWORD' }, + ], null, 2); + const r = expectGone(text, a, 'name-value-secret'); + expect(r.text).not.toContain(b); + expect(r.text).toContain('WEBSITE_RUN_FROM_PACKAGE'); + expect(r.text).toContain('"value": "1"'); + }); + + it('Kubernetes env entries', () => { + const a = fake.passphrase(); + expectGone(`env:\n - {"name": "ConnectionStrings__Redis", "value": "redis:6380"}\n - {"name": "JWT_SIGNING_KEY", "value": "${a}"}`, a); + }); + + it('`az keyvault secret show` value (any secret name, nested attributes)', () => { + const a = fake.passphrase(); + const text = JSON.stringify({ + attributes: { created: '2026-01-01T00:00:00+00:00', enabled: true, recoveryLevel: 'Recoverable' }, + contentType: null, + id: 'https://contoso-kv.vault.azure.net/secrets/StorageThing/0123456789abcdef0123456789abcdef', + name: 'StorageThing', + tags: {}, + value: a, + }, null, 2); + const r = expectGone(text, a, 'azure-keyvault-secret'); + expect(r.text).toContain('contoso-kv.vault.azure.net/secrets/StorageThing'); + }); + + it('web.config appSettings in either attribute order', () => { + const a = fake.passphrase(); + const b = fake.passphrase(); + expectGone(`\n \n \n \n`, a, 'xml-appsettings-secret'); + const r = redactor.redact(``, ctx); + expect(r.text).not.toContain(b); + expect(redactor.redact('', ctx).findings).toEqual([]); + }); + + it('publish profiles and XML secret attributes/elements', () => { + const a = fake.passphrase(); + const b = fake.passphrase(); + const r = expectGone(``, a, 'xml-secret-attribute'); + expect(r.text).toContain('userName="$contoso-app"'); + expect(r.text).toContain('https://contoso-app.azurewebsites.net'); + expectGone(`${b}`, b, 'xml-secret-element'); + }); + + it('a GUID in a password slot is redacted (legacy create-for-rbac), but GUID IDs elsewhere are kept', () => { + const pw = fake.guid(); + const tenant = fake.guid(); + const r = expectGone(JSON.stringify({ appId: fake.guid(), password: pw, tenant }), pw); + expect(r.text).toContain(tenant); + }); + + it('leaves placeholders, labels and non-secret neighbours alone', () => { + const untouched = [ + '{"ClientSecret": "#{ClientSecret}#", "ApiKey": "__API_KEY__", "Password": "$(DbPassword)", "Token": "${TOKEN}", "Secret": ""}', + 'ErrorMessage = "Invalid password or username";', + '{"tokenType": "Bearer", "secretName": "db-password", "maxTokens": "4096", "passwordPolicy": "strict"}', + 'options.Password = configuration["Db:Password"];', + '', + '{"name": "TokenEndpoint", "value": "https://login.microsoftonline.com/common/oauth2/v2.0/token"}', + '' + 'a1b2c3d4-0000-1111-2222-333344445555' + '', + 'PWD="/home/user1/src"', + ]; + for (const text of untouched) { + const r = redactor.redact(text, ctx); + expect(r.findings, text).toEqual([]); + } + }); +}); + +describe('redaction: structured JSON (field names as context, keys redacted)', () => { + const redactor = createRedactor(DEFAULT_REDACTION_CONFIG); + const fake = new FakeSecrets(4242); + + it('redacts a value whose own field name is secret-looking, with no shape match', () => { + const pw = fake.passphrase(); + const line = JSON.stringify({ type: 'user', toolUseResult: { structuredContent: { clientId: 'app', clientSecret: pw } } }); + const out = redactJsonlLine(line, redactor, ctx); + expect(out).not.toContain(pw); + expect(JSON.parse(out).toolUseResult.structuredContent).toEqual({ clientId: 'app', clientSecret: '[REDACTED:secret-field]' }); + }); + + it('redacts the value of a {name, value} object whose name is secret-looking', () => { + const pw = fake.passphrase(); + const line = JSON.stringify({ result: [{ name: 'Db__Password', value: pw }, { name: 'Region', value: 'eastus' }] }); + const out = JSON.parse(redactJsonlLine(line, redactor, ctx)); + expect(out.result).toEqual([{ name: 'Db__Password', value: '[REDACTED:secret-field]' }, { name: 'Region', value: 'eastus' }]); + }); + + it('redacts a structured Key Vault secret bundle value', () => { + const pw = fake.passphrase(); + const line = JSON.stringify({ result: { id: 'https://kv.vault.azure.net/secrets/Anything/1', value: pw, attributes: { enabled: true } } }); + expect(redactJsonlLine(line, redactor, ctx)).not.toContain(pw); + }); + + it('redacts secrets used as object keys', () => { + const token = fake.githubToken(); + const line = JSON.stringify({ cache: { [token]: { user: 'octocat' } } }); + const out = redactJsonlLine(line, redactor, ctx); + expect(out).not.toContain(token); + expect(JSON.parse(out).cache['[REDACTED:github-token]']).toEqual({ user: 'octocat' }); + }); + + it('leaves harness structure alone (thinking signatures, usage, token_count, apiKeySource)', () => { + const lines = [ + JSON.stringify({ type: 'assistant', message: { content: [{ type: 'thinking', thinking: 'hmm', signature: fake.base64Blob(200) }], usage: { input_tokens: 12, output_tokens: 3 } } }), + JSON.stringify({ type: 'event_msg', payload: { type: 'token_count', info: { total_token_usage: { input_tokens: 1 } } } }), + JSON.stringify({ type: 'system', subtype: 'init', apiKeySource: 'none', tokenizer: 'cl100k' }), + JSON.stringify({ secretName: 'db-password', passwordPolicy: 'strict', password: '${DB_PASSWORD}', token: '' }), + ]; + for (const line of lines) expect(redactJsonlLine(line, redactor, ctx), line).toBe(line); + }); + + it('is idempotent on structured redactions', () => { + const line = JSON.stringify({ a: { clientSecret: fake.passphrase() }, b: [{ name: 'API_KEY', value: fake.passphrase() }] }); + const once = redactJsonlLine(line, redactor, ctx); + expect(redactJsonlLine(once, redactor, ctx)).toBe(once); + }); + + it('can be turned off via secretFields.enabled=false', () => { + const r = createRedactor({ ...DEFAULT_REDACTION_CONFIG, secretFields: { ...DEFAULT_REDACTION_CONFIG.secretFields, enabled: false } }); + const pw = fake.passphrase(); + expect(redactJsonlLine(JSON.stringify({ x: { clientSecret: pw } }), r, ctx)).toContain(pw); + }); +}); From a6a47970af65801a47e70037d5b0c12001ff741c Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 08:00:54 -0500 Subject: [PATCH 14/33] docs(verify): explain why repair keys resume off the redaction setting repairIndex disables summarizer resume when redaction is enabled, while the indexer disables it only when a redactor loaded. They differ only when non-strict rules fail to load, and there verify is the stricter one. Co-Authored-By: Claude Opus 5.5 --- dist/verify.js | 3 +++ src/verify.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/dist/verify.js b/dist/verify.js index d2fba59f..dbf2d60f 100644 --- a/dist/verify.js +++ b/dist/verify.js @@ -127,6 +127,9 @@ export async function repairIndex(issues) { // Generate/update summary const summaryPath = conversationPath.replace('.jsonl', '-summary.txt'); // Under redaction, don't let the Codex fork fallback read the source rollout. + // This keys off the setting, not the loaded redactor as indexer.ts does, which + // is stricter: they differ only when non-strict rules fail to load, and then + // this disables a resume the indexer would allow. It never enables one. const summary = await summarizeConversation(exchanges, undefined, { allowResume: !getRedactionSettings().enabled }); fs.writeFileSync(summaryPath, summary, 'utf-8'); console.log(` Created summary: ${summary.split(/\s+/).length} words`); diff --git a/src/verify.ts b/src/verify.ts index f0b86110..836eec0c 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -162,6 +162,9 @@ export async function repairIndex(issues: VerificationResult): Promise { // Generate/update summary const summaryPath = conversationPath.replace('.jsonl', '-summary.txt'); // Under redaction, don't let the Codex fork fallback read the source rollout. + // This keys off the setting, not the loaded redactor as indexer.ts does, which + // is stricter: they differ only when non-strict rules fail to load, and then + // this disables a resume the indexer would allow. It never enables one. const summary = await summarizeConversation(exchanges, undefined, { allowResume: !getRedactionSettings().enabled }); fs.writeFileSync(summaryPath, summary, 'utf-8'); console.log(` Created summary: ${summary.split(/\s+/).length} words`); From 6a49ea12b2b942e4c5435c30e32a1c6b57609b4f Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 08:17:21 -0500 Subject: [PATCH 15/33] fix(redaction): create redacted copies with the source file's mode copyFileRedacted opened its output with the 0666 & umask default, so a 0600 transcript became world-readable in the archive, and redact --rewrite widened existing archive files the same way. copyFileSync, used before redaction, kept the source mode. Co-Authored-By: Claude Opus 5.5 --- dist/redaction.js | 4 +++- src/redaction.ts | 4 +++- test/redaction.test.ts | 12 +++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/dist/redaction.js b/dist/redaction.js index 83f76944..d2679fbc 100644 --- a/dist/redaction.js +++ b/dist/redaction.js @@ -556,7 +556,9 @@ export function copyFileRedacted(src, dest, redactor, ctx, tally) { const fdIn = fs.openSync(src, 'r'); let fdOut; try { - fdOut = fs.openSync(dest, 'w'); + // Create with the source's mode, as copyFileSync would, so a 0600 + // transcript doesn't become world-readable in the archive. + fdOut = fs.openSync(dest, 'w', fs.fstatSync(fdIn).mode & 0o777); const buf = Buffer.allocUnsafe(COPY_CHUNK_BYTES); const decoder = new StringDecoder('utf8'); let pending = ''; diff --git a/src/redaction.ts b/src/redaction.ts index afdeaea5..df284b56 100644 --- a/src/redaction.ts +++ b/src/redaction.ts @@ -723,7 +723,9 @@ export function copyFileRedacted( const fdIn = fs.openSync(src, 'r'); let fdOut: number | undefined; try { - fdOut = fs.openSync(dest, 'w'); + // Create with the source's mode, as copyFileSync would, so a 0600 + // transcript doesn't become world-readable in the archive. + fdOut = fs.openSync(dest, 'w', fs.fstatSync(fdIn).mode & 0o777); const buf = Buffer.allocUnsafe(COPY_CHUNK_BYTES); const decoder = new StringDecoder('utf8'); let pending = ''; diff --git a/test/redaction.test.ts b/test/redaction.test.ts index 8e824c3d..65e7b5d9 100644 --- a/test/redaction.test.ts +++ b/test/redaction.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; -import { mkdtempSync, writeFileSync, readFileSync, rmSync, mkdirSync } from 'fs'; +import { mkdtempSync, writeFileSync, readFileSync, rmSync, mkdirSync, chmodSync, statSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; @@ -423,6 +423,16 @@ describe('redaction: copyFileRedacted', () => { copyFileRedacted(src, dest, redactor, ctx); expect(readFileSync(dest, 'utf-8')).toBe(readFileSync(src, 'utf-8')); }); + + // Windows ignores POSIX mode bits. + it.skipIf(process.platform === 'win32')('creates dest with the source mode, not the 0666 default', () => { + const src = join(dir, 'private.jsonl'); + const dest = join(dir, 'private-out.jsonl'); + writeFileSync(src, '{"type":"user"}\n'); + chmodSync(src, 0o600); + copyFileRedacted(src, dest, defaults(), ctx); + expect(statSync(dest).mode & 0o777).toBe(0o600); + }); }); describe('redaction: settings and rules loading', () => { From fff43262b24b55583bdc11a96700f2552e77b98e Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 08:17:21 -0500 Subject: [PATCH 16/33] fix(indexer): force the archive refresh for already-indexed transcripts indexUnprocessed used to re-copy every indexed transcript and parse the source. Parsing the redacted archive instead made it depend on copyIfNewer's mtime check, which skips an append that lands within the mtime granularity, so those exchanges were never indexed. copyIfNewer takes a force flag, and indexUnprocessed sets it once a file is indexed. Co-Authored-By: Claude Opus 5.5 --- dist/indexer.js | 7 ++++--- dist/sync.d.ts | 6 +++++- dist/sync.js | 8 ++++++-- src/indexer.ts | 7 ++++--- src/sync.ts | 9 +++++++-- test/redaction-pipeline.test.ts | 31 +++++++++++++++++++++++++++++++ 6 files changed, 57 insertions(+), 11 deletions(-) diff --git a/dist/indexer.js b/dist/indexer.js index 5b4c803d..0fb4e2fc 100644 --- a/dist/indexer.js +++ b/dist/indexer.js @@ -297,9 +297,10 @@ export async function indexUnprocessed(concurrency = 1, noSummaries = false) { const hw = db.prepare('SELECT COALESCE(MAX(line_end), 0) as maxLine FROM exchanges WHERE archive_path = ?').get(archivePath); const maxIndexedLine = hw.maxLine; try { - // Refresh the (redacted) archive when the source has grown, then parse - // the archive so the index only sees redacted text. - copyIfNewer(sourcePath, archivePath, redactor, tally); + // Refresh the (redacted) archive, then parse the archive so the index + // only sees redacted text. Force the refresh once the file is indexed: + // an append inside the mtime granularity would otherwise be skipped. + copyIfNewer(sourcePath, archivePath, redactor, tally, maxIndexedLine > 0); // Parse and filter to exchanges past the high-water mark const exchanges = await parseConversation(archivePath, project, archivePath); const newExchanges = maxIndexedLine > 0 diff --git a/dist/sync.d.ts b/dist/sync.d.ts index 065e5386..36b5afb5 100644 --- a/dist/sync.d.ts +++ b/dist/sync.d.ts @@ -52,7 +52,11 @@ export declare function buildSyncOptionsFromEnv(env: NodeJS.ProcessEnv): SyncOpt * older. This is the redaction choke point: with a redactor, the copy is * redacted line by line (see redaction.ts), and every downstream stage * (index, embeddings, summaries, show/read) reads the archive. + * + * `force` copies even when the mtimes say the archive is current: an append + * within the mtime granularity (or the millisecond the rounding below adds) + * leaves the source no newer than the archive. */ -export declare function copyIfNewer(src: string, dest: string, redactor?: Redactor | null, tally?: FindingsTally): boolean; +export declare function copyIfNewer(src: string, dest: string, redactor?: Redactor | null, tally?: FindingsTally, force?: boolean): boolean; export declare function extractSessionIdFromPath(filePath: string): string | null; export declare function syncConversations(sourceDir: string, destDir: string, options?: SyncOptions): Promise; diff --git a/dist/sync.js b/dist/sync.js index 380037e1..6bb83b75 100644 --- a/dist/sync.js +++ b/dist/sync.js @@ -128,15 +128,19 @@ export function buildSyncOptionsFromEnv(env) { * older. This is the redaction choke point: with a redactor, the copy is * redacted line by line (see redaction.ts), and every downstream stage * (index, embeddings, summaries, show/read) reads the archive. + * + * `force` copies even when the mtimes say the archive is current: an append + * within the mtime granularity (or the millisecond the rounding below adds) + * leaves the source no newer than the archive. */ -export function copyIfNewer(src, dest, redactor = null, tally) { +export function copyIfNewer(src, dest, redactor = null, tally, force = false) { // Ensure destination directory exists const destDir = path.dirname(dest); if (!fs.existsSync(destDir)) { fs.mkdirSync(destDir, { recursive: true }); } // Check if destination exists and is up-to-date - if (fs.existsSync(dest)) { + if (!force && fs.existsSync(dest)) { const srcStat = fs.statSync(src); const destStat = fs.statSync(dest); if (destStat.mtimeMs >= srcStat.mtimeMs) { diff --git a/src/indexer.ts b/src/indexer.ts index 5ba56ae2..df9a5986 100644 --- a/src/indexer.ts +++ b/src/indexer.ts @@ -381,9 +381,10 @@ export async function indexUnprocessed(concurrency: number = 1, noSummaries: boo const maxIndexedLine = hw.maxLine; try { - // Refresh the (redacted) archive when the source has grown, then parse - // the archive so the index only sees redacted text. - copyIfNewer(sourcePath, archivePath, redactor, tally); + // Refresh the (redacted) archive, then parse the archive so the index + // only sees redacted text. Force the refresh once the file is indexed: + // an append inside the mtime granularity would otherwise be skipped. + copyIfNewer(sourcePath, archivePath, redactor, tally, maxIndexedLine > 0); // Parse and filter to exchanges past the high-water mark const exchanges = await parseConversation(archivePath, project, archivePath); diff --git a/src/sync.ts b/src/sync.ts index b2de456c..62fa00ec 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -145,12 +145,17 @@ export function buildSyncOptionsFromEnv(env: NodeJS.ProcessEnv): SyncOptions { * older. This is the redaction choke point: with a redactor, the copy is * redacted line by line (see redaction.ts), and every downstream stage * (index, embeddings, summaries, show/read) reads the archive. + * + * `force` copies even when the mtimes say the archive is current: an append + * within the mtime granularity (or the millisecond the rounding below adds) + * leaves the source no newer than the archive. */ export function copyIfNewer( src: string, dest: string, redactor: Redactor | null = null, - tally?: FindingsTally + tally?: FindingsTally, + force = false ): boolean { // Ensure destination directory exists const destDir = path.dirname(dest); @@ -159,7 +164,7 @@ export function copyIfNewer( } // Check if destination exists and is up-to-date - if (fs.existsSync(dest)) { + if (!force && fs.existsSync(dest)) { const srcStat = fs.statSync(src); const destStat = fs.statSync(dest); if (destStat.mtimeMs >= srcStat.mtimeMs) { diff --git a/test/redaction-pipeline.test.ts b/test/redaction-pipeline.test.ts index 89f60ea4..770a9cd0 100644 --- a/test/redaction-pipeline.test.ts +++ b/test/redaction-pipeline.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync, existsSync, readdirSync, statSync, + appendFileSync, utimesSync, } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; @@ -344,6 +345,36 @@ describe('redaction pipeline', () => { expectNoSecrets(JSON.stringify(summarizeSpy.mock.calls), s, 'summarizer input (index path)'); expect(summarizeSpy.mock.calls[0][2]).toMatchObject({ allowResume: false }); }); + + it('the `index` path refreshes an indexed archive even when the append left the source mtime no newer', async () => { + const fake = new FakeSecrets(78); + const secret = fake.azureClientSecret(); + const base = { sessionId: SESSION, isSidechain: false, cwd: '/work/contoso', gitBranch: 'main', version: '2.0.0' }; + const exchange = (n: number, text: string) => [ + { ...base, type: 'user', uuid: `u${n}`, parentUuid: n > 1 ? `a${n - 1}` : null, + timestamp: new Date(Date.UTC(2026, 0, 1, 0, n)).toISOString(), + message: { role: 'user', content: text } }, + { ...base, type: 'assistant', uuid: `a${n}`, parentUuid: `u${n}`, + timestamp: new Date(Date.UTC(2026, 0, 1, 0, n, 30)).toISOString(), + message: { role: 'assistant', content: [{ type: 'text', text: `Reply ${n}.` }] } }, + ].map(l => JSON.stringify(l) + '\n').join(''); + const src = join(sourceDir, '-work-contoso', `${SESSION}.jsonl`); + + writeFileSync(src, exchange(1, 'First question.')); + await indexUnprocessed(1, true); + const archived = walkFiles(archiveDir).filter(f => f.endsWith('.jsonl'))[0]; + const archivedMtime = statSync(archived).mtime; + + // Append, then pin the source mtime to the archive's: copyIfNewer's mtime + // check alone would treat the archive as current. + appendFileSync(src, exchange(2, `Second question with ${secret} as the secret`)); + utimesSync(src, archivedMtime, archivedMtime); + await indexUnprocessed(1, true); + + const text = dbText(dbPath); + expect(text).toContain('Second question with [REDACTED:'); + expect(text).not.toContain(secret); + }); }); describe('redaction: opencode staging export', () => { From c931a142ab6279cf72309a98b0b482db9f2c7910 Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 08:17:21 -0500 Subject: [PATCH 17/33] fix(redaction): match an Entra client secret that ends a sentence The rule's trailing lookahead excluded '.', which is also in the secret alphabet, so a 40-char secret followed by a period could match neither with nor without it and was left in clear text. Co-Authored-By: Claude Opus 5.5 --- dist/redaction-rules.js | 4 ++-- src/redaction-rules.ts | 4 ++-- test/redaction.test.ts | 6 ++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/dist/redaction-rules.js b/dist/redaction-rules.js index 153da735..27eecdcb 100644 --- a/dist/redaction-rules.js +++ b/dist/redaction-rules.js @@ -113,8 +113,8 @@ export const DEFAULT_REDACTION_CONFIG = { }, { id: 'azure-client-secret', - description: 'Entra ID (Azure AD) application client secret: 3 chars, a digit, "Q~", 31-34 chars', - pattern: String.raw `(? { expectRedacted(redactor, `use ${secret} as the client secret`, secret, 'azure-client-secret'); }); + it('azure-client-secret at the end of a sentence', () => { + const secret = fake.azureClientSecret(); + const out = expectRedacted(redactor, `The client secret is ${secret}.`, secret, 'azure-client-secret'); + expect(out.text).toBe('The client secret is [REDACTED:azure-client-secret].'); + }); + it('azure-storage-key in `az storage account keys list` output', () => { const secret = fake.azureStorageKey(); const text = `[\n {\n "keyName": "key1",\n "permissions": "FULL",\n "value": "${secret}"\n }\n]`; From 3b7edc25ecf222b44ee3457db785fc73ec6ddd8e Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 08:36:40 -0500 Subject: [PATCH 18/33] fix(redaction): match connection-string keywords in any case ADO.NET keywords are case-insensitive, but the rule only matched the listed capitalization, so `password=` and `PASSWORD=` values were kept. A letters-only value isn't caught by secret-assignment either, which needs a digit. A path after `Pwd=` is still left alone: that's the shell PWD variable. Co-Authored-By: Claude Opus 5.5 --- dist/redaction-rules.js | 5 +++-- docs/REDACTION.md | 2 +- src/redaction-rules.ts | 5 +++-- test/redaction.test.ts | 9 +++++++++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/dist/redaction-rules.js b/dist/redaction-rules.js index 27eecdcb..46b62b8c 100644 --- a/dist/redaction-rules.js +++ b/dist/redaction-rules.js @@ -50,8 +50,9 @@ export const DEFAULT_REDACTION_CONFIG = { }, { id: 'connection-string-secret', - description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept', - pattern: String.raw `\b(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password|Pwd)=(?![\[$<{%])([^;"'\s]+)`, + description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept. Keywords are case-insensitive, as in ADO.NET; a path after Pwd= is the shell PWD variable and is kept', + pattern: String.raw `\b(?:(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password)=|Pwd=(?![/~]))(?![\[$<{%])([^;"'\s]+)`, + flags: 'i', secretGroup: 1, keywords: ['accountkey', 'sharedaccess', 'sharedsecret', 'clientsecret', 'password', 'pwd'], }, diff --git a/docs/REDACTION.md b/docs/REDACTION.md index f3bafbe1..3e8a796b 100644 --- a/docs/REDACTION.md +++ b/docs/REDACTION.md @@ -49,7 +49,7 @@ summary: | Rule ID | Catches | |---|---| | `private-key-block` | PEM and OpenSSH private keys, including truncated ones | -| `connection-string-secret` | `AccountKey=`, `SharedAccessKey=`, `SharedAccessSignature=`, `Password=`, `Pwd=` in connection strings. Only the value is redacted; server, account, and database names stay. | +| `connection-string-secret` | `AccountKey=`, `SharedAccessKey=`, `SharedAccessSignature=`, `Password=`, `Pwd=` in connection strings, in any case. Only the value is redacted; server, account, and database names stay. | | `azure-sas-token` | The `sig=` of a SAS URL. The URL and other parameters stay. | | `jwt` | JWTs, including Entra ID / Azure access tokens | | `anthropic-api-key`, `openai-api-key`, `github-token`, `aws-access-key-id`, `aws-secret-access-key`, `slack-token`, `google-api-key`, `npm-token` | Provider keys with a recognizable prefix | diff --git a/src/redaction-rules.ts b/src/redaction-rules.ts index 1814e214..b0d6d99a 100644 --- a/src/redaction-rules.ts +++ b/src/redaction-rules.ts @@ -58,8 +58,9 @@ export const DEFAULT_REDACTION_CONFIG: RedactionConfig = { }, { id: 'connection-string-secret', - description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept', - pattern: String.raw`\b(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password|Pwd)=(?![\[$<{%])([^;"'\s]+)`, + description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept. Keywords are case-insensitive, as in ADO.NET; a path after Pwd= is the shell PWD variable and is kept', + pattern: String.raw`\b(?:(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password)=|Pwd=(?![/~]))(?![\[$<{%])([^;"'\s]+)`, + flags: 'i', secretGroup: 1, keywords: ['accountkey', 'sharedaccess', 'sharedsecret', 'clientsecret', 'password', 'pwd'], }, diff --git a/test/redaction.test.ts b/test/redaction.test.ts index 1bde7140..bf6ed5e2 100644 --- a/test/redaction.test.ts +++ b/test/redaction.test.ts @@ -93,6 +93,15 @@ describe('redaction: default rules (positive)', () => { expect(result.text).toContain('SharedAccessKeyName=RootManageSharedAccessKey'); }); + it('connection-string-secret keywords are case-insensitive, as in ADO.NET', () => { + // Letters only: secret-assignment needs a digit, so this rule is the only catch. + const pw = fake.chars('abcdefghijklmnopqrstuvwxyz', 19); + for (const keyword of ['password', 'PASSWORD', 'pwd', 'accountkey']) { + const result = expectRedacted(redactor, `Server=db;Database=app;${keyword}=${pw};`, pw, 'connection-string-secret'); + expect(result.text).toContain(`${keyword}=[REDACTED:connection-string-secret];`); + } + }); + it('azure-sas-token redacts the sig while keeping the blob URL', () => { const sig = fake.sasSignature(); const text = `https://contoso.blob.core.windows.net/backups/db.bak?sv=2022-11-02&ss=b&srt=co&sp=rl&se=2026-12-31T00:00:00Z&sig=${sig}`; From 70592f547fa9f9aa0d93329ca6c9b6ec1d73e0e7 Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 08:37:25 -0500 Subject: [PATCH 19/33] fix(redaction): redact the part of a match outside an existing token applyRule skipped any match that overlapped a token, so in partly redacted text (an older rule set, before redact --rewrite) `Password=[REDACTED:jwt]` kept the secret. The existing tokens are now kept and each stretch between them with a letter or digit is replaced. A stretch already fully covered yields no change, so a second pass is still a no-op. Co-Authored-By: Claude Opus 5.5 --- dist/redaction.js | 49 ++++++++++++++++++++++++++++++++++++----- src/redaction.ts | 50 ++++++++++++++++++++++++++++++++++++++---- test/redaction.test.ts | 12 ++++++++++ 3 files changed, 102 insertions(+), 9 deletions(-) diff --git a/dist/redaction.js b/dist/redaction.js index d2679fbc..222d5eb7 100644 --- a/dist/redaction.js +++ b/dist/redaction.js @@ -279,6 +279,37 @@ function overlapsAny(spans, start, end) { return true; return false; } +/** + * Rewrite text[start, end) keeping the existing tokens in it and replacing each + * stretch between them that has a letter or digit with `token`. Returns null + * when nothing outside the tokens needs redacting, which keeps this idempotent. + */ +function redactAroundTokens(text, spans, start, end, token) { + let out = ''; + let pos = start; + let replaced = false; + const flush = (to) => { + const piece = text.slice(pos, to); + if (/[A-Za-z0-9]/.test(piece)) { + out += token; + replaced = true; + } + else { + out += piece; + } + }; + for (const [s, e] of spans) { + if (e <= start || s >= end) + continue; + if (s > pos) + flush(s); + out += text.slice(Math.max(s, pos), Math.min(e, end)); + pos = Math.min(e, end); + } + if (pos < end) + flush(end); + return replaced ? out : null; +} function shannonEntropy(text) { const counts = new Map(); for (const ch of text) @@ -291,9 +322,10 @@ function shannonEntropy(text) { return entropy; } /** - * Replace each accepted match (or its secretGroup) with a token. A candidate is - * skipped when it overlaps an existing token (idempotency) or fully matches an - * allowlist pattern. + * Replace each accepted match (or its secretGroup) with a token. A candidate + * that overlaps existing tokens keeps them, and only the text around them is + * redacted (so re-running is a no-op). A candidate is skipped when it fully + * matches an allowlist pattern. */ function applyRule(text, rule, isAllowed) { const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; @@ -313,10 +345,17 @@ function applyRule(text, rule, isAllowed) { const [start, end] = range; if (end <= start || start < last) continue; - if (spans && overlapsAny(spans, start, end)) - continue; if (rule.useAllowlist && isAllowed(text.slice(start, end))) continue; + if (spans && overlapsAny(spans, start, end)) { + const rewritten = redactAroundTokens(text, spans, start, end, token); + if (rewritten === null) + continue; + out += text.slice(last, start) + rewritten; + last = end; + count++; + continue; + } out += text.slice(last, start) + token; last = end; count++; diff --git a/src/redaction.ts b/src/redaction.ts index df284b56..b60afc4f 100644 --- a/src/redaction.ts +++ b/src/redaction.ts @@ -431,6 +431,40 @@ function overlapsAny(spans: Array<[number, number]>, start: number, end: number) return false; } +/** + * Rewrite text[start, end) keeping the existing tokens in it and replacing each + * stretch between them that has a letter or digit with `token`. Returns null + * when nothing outside the tokens needs redacting, which keeps this idempotent. + */ +function redactAroundTokens( + text: string, + spans: Array<[number, number]>, + start: number, + end: number, + token: string +): string | null { + let out = ''; + let pos = start; + let replaced = false; + const flush = (to: number) => { + const piece = text.slice(pos, to); + if (/[A-Za-z0-9]/.test(piece)) { + out += token; + replaced = true; + } else { + out += piece; + } + }; + for (const [s, e] of spans) { + if (e <= start || s >= end) continue; + if (s > pos) flush(s); + out += text.slice(Math.max(s, pos), Math.min(e, end)); + pos = Math.min(e, end); + } + if (pos < end) flush(end); + return replaced ? out : null; +} + function shannonEntropy(text: string): number { const counts = new Map(); for (const ch of text) counts.set(ch, (counts.get(ch) ?? 0) + 1); @@ -443,9 +477,10 @@ function shannonEntropy(text: string): number { } /** - * Replace each accepted match (or its secretGroup) with a token. A candidate is - * skipped when it overlaps an existing token (idempotency) or fully matches an - * allowlist pattern. + * Replace each accepted match (or its secretGroup) with a token. A candidate + * that overlaps existing tokens keeps them, and only the text around them is + * redacted (so re-running is a no-op). A candidate is skipped when it fully + * matches an allowlist pattern. */ function applyRule(text: string, rule: CompiledRule, isAllowed: (s: string) => boolean): { text: string; count: number } { const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; @@ -462,8 +497,15 @@ function applyRule(text: string, rule: CompiledRule, isAllowed: (s: string) => b if (!range) continue; const [start, end] = range; if (end <= start || start < last) continue; - if (spans && overlapsAny(spans, start, end)) continue; if (rule.useAllowlist && isAllowed(text.slice(start, end))) continue; + if (spans && overlapsAny(spans, start, end)) { + const rewritten = redactAroundTokens(text, spans, start, end, token); + if (rewritten === null) continue; + out += text.slice(last, start) + rewritten; + last = end; + count++; + continue; + } out += text.slice(last, start) + token; last = end; count++; diff --git a/test/redaction.test.ts b/test/redaction.test.ts index bf6ed5e2..b75bbfde 100644 --- a/test/redaction.test.ts +++ b/test/redaction.test.ts @@ -311,6 +311,18 @@ describe('redaction: idempotency', () => { } } }); + + it('a match that runs into an existing token redacts the part outside it, keeping the token', () => { + // Text already partly redacted, e.g. by an older rule set before `redact --rewrite`. + const redactor = defaults(); + const fake = new FakeSecrets(12); + const prefix = fake.chars('abcdefghijklmnopqrstuvwxyz0123456789', 10); + const once = redactor.redact(`Server=db;Password=${prefix}[REDACTED:jwt];`, ctx); + expect(once.text).toBe('Server=db;Password=[REDACTED:connection-string-secret][REDACTED:jwt];'); + const twice = redactor.redact(once.text, ctx); + expect(twice.text).toBe(once.text); + expect(twice.findings).toEqual([]); + }); }); describe('redaction: entropy fallback', () => { From 64e005904137afa8d39a157707b5241a2770e968 Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 08:38:02 -0500 Subject: [PATCH 20/33] fix(redaction): redact a secret field whole even if it holds a token The field-name rule skipped any value containing a token, so in {"password": " "} the JWT rule's token kept the field from being replaced and the word stayed. Only values made up entirely of tokens are skipped now. Co-Authored-By: Claude Opus 5.5 --- dist/redaction.js | 9 ++++++--- src/redaction.ts | 10 +++++++--- test/redaction.test.ts | 8 ++++++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/dist/redaction.js b/dist/redaction.js index 222d5eb7..4f728424 100644 --- a/dist/redaction.js +++ b/dist/redaction.js @@ -502,8 +502,8 @@ function redactTree(node, redactor, ctx, tally) { // Field-name context: the key (or a {name, value} pair's name, or a Key // Vault secret id) says the value is a secret even when its shape matches // no rule — e.g. a letters-only clientSecret field in a structured - // MCP result. Runs after the text rules, so a value they already redacted - // in part (a connection string) keeps its searchable remainder. + // MCP result. Runs after the text rules; a value they redacted only in part + // is still replaced whole, since the field name says all of it is secret. const redactWhole = (key) => { if (!isRedactableWhole(obj[key])) return; @@ -553,10 +553,13 @@ function setOwn(obj, key, value) { // defineProperty so a "__proto__" key from JSON.parse stays an own property. Object.defineProperty(obj, key, { value, writable: true, enumerable: true, configurable: true }); } +// A value that is only tokens is already redacted; anything else in a secret +// field, even alongside a token, is replaced whole. +const ONLY_TOKENS = /^\s*(?:\[REDACTED:[a-z0-9][a-z0-9-]*\]\s*)+$/; function isRedactableWhole(value) { return typeof value === 'string' && value.trim().length > 0 && - !value.includes(TOKEN_PREFIX) && + !ONLY_TOKENS.test(value) && !PLACEHOLDER_VALUE.test(value.trim()); } /** diff --git a/src/redaction.ts b/src/redaction.ts index b60afc4f..0a6563bb 100644 --- a/src/redaction.ts +++ b/src/redaction.ts @@ -658,8 +658,8 @@ function redactTree( // Field-name context: the key (or a {name, value} pair's name, or a Key // Vault secret id) says the value is a secret even when its shape matches // no rule — e.g. a letters-only clientSecret field in a structured - // MCP result. Runs after the text rules, so a value they already redacted - // in part (a connection string) keeps its searchable remainder. + // MCP result. Runs after the text rules; a value they redacted only in part + // is still replaced whole, since the field name says all of it is secret. const redactWhole = (key: string) => { if (!isRedactableWhole(obj[key])) return; setOwn(obj, key, tokenFor(FIELD_RULE_ID)); @@ -710,10 +710,14 @@ function setOwn(obj: Record, key: string, value: unknown): void Object.defineProperty(obj, key, { value, writable: true, enumerable: true, configurable: true }); } +// A value that is only tokens is already redacted; anything else in a secret +// field, even alongside a token, is replaced whole. +const ONLY_TOKENS = /^\s*(?:\[REDACTED:[a-z0-9][a-z0-9-]*\]\s*)+$/; + function isRedactableWhole(value: unknown): value is string { return typeof value === 'string' && value.trim().length > 0 && - !value.includes(TOKEN_PREFIX) && + !ONLY_TOKENS.test(value) && !PLACEHOLDER_VALUE.test(value.trim()); } diff --git a/test/redaction.test.ts b/test/redaction.test.ts index b75bbfde..745e1c17 100644 --- a/test/redaction.test.ts +++ b/test/redaction.test.ts @@ -710,6 +710,14 @@ describe('redaction: structured JSON (field names as context, keys redacted)', ( for (const line of lines) expect(redactJsonlLine(line, redactor, ctx), line).toBe(line); }); + it('redacts a secret field whole when a text rule already redacted only part of it', () => { + const word = fake.chars('abcdefghijklmnopqrstuvwxyz', 12); + const line = JSON.stringify({ password: `${word} ${fake.jwt()}` }); + const out = redactJsonlLine(line, redactor, ctx); + expect(out).not.toContain(word); + expect(JSON.parse(out).password).toBe('[REDACTED:secret-field]'); + }); + it('is idempotent on structured redactions', () => { const line = JSON.stringify({ a: { clientSecret: fake.passphrase() }, b: [{ name: 'API_KEY', value: fake.passphrase() }] }); const once = redactJsonlLine(line, redactor, ctx); From 1cb16af9c42acba1164bb70db9f3fb3ed2730224 Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 08:38:38 -0500 Subject: [PATCH 21/33] fix(verify): load the redaction rules before index repair repairIndex checked only whether redaction was enabled, so with a corrupt rules file in strict mode it still deleted, re-indexed and summarized, while sync and index abort. It now loads the redactor first, which throws in strict mode, and derives allowResume from the result as the indexer does. Co-Authored-By: Claude Opus 5.5 --- dist/verify.js | 10 +++++----- src/verify.ts | 11 ++++++----- test/verify.test.ts | 31 +++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/dist/verify.js b/dist/verify.js index dbf2d60f..54df6a85 100644 --- a/dist/verify.js +++ b/dist/verify.js @@ -4,7 +4,7 @@ import { parseConversation } from './parser.js'; import { initDatabase, getAllExchanges, getFileLastIndexed } from './db.js'; import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { isErroredSentinel } from './summary-sentinel.js'; -import { getRedactionSettings } from './redaction.js'; +import { loadRedactor } from './redaction.js'; export async function verifyIndex() { const result = { missing: [], @@ -94,6 +94,9 @@ export async function verifyIndex() { } export async function repairIndex(issues) { console.log('Repairing index...'); + // Load before touching the index: strict mode fails closed here, as in sync + // and index. + const redactor = loadRedactor(); // To avoid circular dependencies, we import the indexer functions dynamically const { initDatabase, insertExchange, deleteExchange } = await import('./db.js'); const { parseConversation } = await import('./parser.js'); @@ -127,10 +130,7 @@ export async function repairIndex(issues) { // Generate/update summary const summaryPath = conversationPath.replace('.jsonl', '-summary.txt'); // Under redaction, don't let the Codex fork fallback read the source rollout. - // This keys off the setting, not the loaded redactor as indexer.ts does, which - // is stricter: they differ only when non-strict rules fail to load, and then - // this disables a resume the indexer would allow. It never enables one. - const summary = await summarizeConversation(exchanges, undefined, { allowResume: !getRedactionSettings().enabled }); + const summary = await summarizeConversation(exchanges, undefined, { allowResume: redactor === null }); fs.writeFileSync(summaryPath, summary, 'utf-8'); console.log(` Created summary: ${summary.split(/\s+/).length} words`); // Index exchanges diff --git a/src/verify.ts b/src/verify.ts index 836eec0c..bc9b6dd1 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -4,7 +4,7 @@ import { parseConversation } from './parser.js'; import { initDatabase, getAllExchanges, getFileLastIndexed } from './db.js'; import { getArchiveDir, getExcludedProjects, findJsonlFiles, statIfExists } from './paths.js'; import { isErroredSentinel } from './summary-sentinel.js'; -import { getRedactionSettings } from './redaction.js'; +import { loadRedactor } from './redaction.js'; export interface VerificationResult { missing: Array<{ path: string; reason: string }>; @@ -122,6 +122,10 @@ export async function verifyIndex(): Promise { export async function repairIndex(issues: VerificationResult): Promise { console.log('Repairing index...'); + // Load before touching the index: strict mode fails closed here, as in sync + // and index. + const redactor = loadRedactor(); + // To avoid circular dependencies, we import the indexer functions dynamically const { initDatabase, insertExchange, deleteExchange } = await import('./db.js'); const { parseConversation } = await import('./parser.js'); @@ -162,10 +166,7 @@ export async function repairIndex(issues: VerificationResult): Promise { // Generate/update summary const summaryPath = conversationPath.replace('.jsonl', '-summary.txt'); // Under redaction, don't let the Codex fork fallback read the source rollout. - // This keys off the setting, not the loaded redactor as indexer.ts does, which - // is stricter: they differ only when non-strict rules fail to load, and then - // this disables a resume the indexer would allow. It never enables one. - const summary = await summarizeConversation(exchanges, undefined, { allowResume: !getRedactionSettings().enabled }); + const summary = await summarizeConversation(exchanges, undefined, { allowResume: redactor === null }); fs.writeFileSync(summaryPath, summary, 'utf-8'); console.log(` Created summary: ${summary.split(/\s+/).length} words`); diff --git a/test/verify.test.ts b/test/verify.test.ts index ae70da81..dac46ea1 100644 --- a/test/verify.test.ts +++ b/test/verify.test.ts @@ -281,6 +281,37 @@ describe('repairIndex', () => { dbAfter.close(); }); + it('fails closed on a corrupt rules file in strict mode, before changing the index', async () => { + const db = initDatabase(); + insertExchange(db, { + id: 'orphan-strict-1', + project: 'deleted-project', + timestamp: '2024-01-01T00:00:00Z', + userMessage: 'Deleted', + assistantMessage: 'Still indexed', + archivePath: path.join(archiveDir, 'deleted-project', 'deleted.jsonl'), + lineStart: 1, + lineEnd: 2 + }, new Array(384).fill(0.1)); + db.close(); + + const rulesPath = path.join(testDir, 'redaction-rules.json'); + fs.writeFileSync(rulesPath, '{ not json'); + process.env.EPISODIC_MEMORY_REDACTION_RULES = rulesPath; + try { + const issues = await verifyIndex(); + expect(issues.orphaned.length).toBe(1); + await expect(repairIndex(issues)).rejects.toThrow(/redaction/i); + } finally { + delete process.env.EPISODIC_MEMORY_REDACTION_RULES; + } + + const dbAfter = initDatabase(); + const row = dbAfter.prepare(`SELECT COUNT(*) as count FROM exchanges WHERE id = ?`).get('orphan-strict-1') as { count: number }; + expect(row.count).toBe(1); + dbAfter.close(); + }); + it('re-indexes outdated files during repair', { timeout: 30000 }, async () => { // Create conversation file with summary const projectArchive = path.join(archiveDir, 'test-project'); From 505996feba0ceb443a4efd2ffa1dc7f685eeb3ed Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 09:03:19 -0500 Subject: [PATCH 22/33] feat(redact): read-only dry run and --report to review hits `redact --rewrite --dry-run` opened the index with initDatabase(), which runs schema migrations and switches to WAL, so a dry run changed the database it promised not to touch (and created one if missing). A dry run now opens the existing index read-only, or skips the index if there is none. `--report` (with --dry-run) lists each value the rewrite would redact: file and line or index row, the rule, the value's shape (length, character classes, Shannon entropy) and the redacted text around it. The value itself is never printed. It uses an optional onMatch callback on RedactionContext, so it runs the real redaction path. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 2 +- README.md | 1 + dist/db.d.ts | 6 ++ dist/db.js | 11 +++ dist/redact-cli.js | 19 +++- dist/redact-rewrite.d.ts | 18 +++- dist/redact-rewrite.js | 171 +++++++++++++++++++++++++----------- dist/redaction.d.ts | 17 ++++ dist/redaction.js | 38 ++++++-- docs/REDACTION.md | 24 ++++- src/db.ts | 11 +++ src/redact-cli.ts | 18 +++- src/redact-rewrite.ts | 127 ++++++++++++++++++++++---- src/redaction.ts | 56 ++++++++++-- test/redact-rewrite.test.ts | 47 +++++++++- 15 files changed, 472 insertions(+), 94 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a467864f..223da791 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- `episodic-memory redact --rewrite` cleans data you indexed before upgrading. It redacts the archive and the search index in place, re-embeds only the messages that changed, and deletes summaries built from unredacted text so they regenerate. Use `--dry-run` to preview. +- `episodic-memory redact --rewrite` cleans data you indexed before upgrading. It redacts the archive and the search index in place, re-embeds only the messages that changed, and deletes summaries built from unredacted text so they regenerate. Use `--dry-run` to preview (it writes nothing, not even a schema migration), and add `--report` to list each value it would redact, by location, rule and shape, without printing the value. - Custom redaction rules via `~/.config/superpowers/redaction-rules.json`, which extends the bundled defaults. Try rules with `episodic-memory redact --stdin`. See `docs/REDACTION.md`. - New settings: `EPISODIC_MEMORY_REDACTION` (`on`/`off`), `EPISODIC_MEMORY_REDACTION_RULES`, and `EPISODIC_MEMORY_REDACTION_STRICT`. diff --git a/README.md b/README.md index c8105431..f59264ee 100644 --- a/README.md +++ b/README.md @@ -331,6 +331,7 @@ episodic-memory sync ```bash episodic-memory redact --rewrite --dry-run # what would change +episodic-memory redact --rewrite --dry-run --report # each hit: location, rule, value shape episodic-memory redact --rewrite # redact the existing archive + index in place episodic-memory redact --stdin < file.jsonl # try the rules on some text episodic-memory redact --print-default-rules diff --git a/dist/db.d.ts b/dist/db.d.ts index 3f590fff..9d8ed98a 100644 --- a/dist/db.d.ts +++ b/dist/db.d.ts @@ -13,6 +13,12 @@ export declare function migrateSchema(db: Database.Database): void; * 3. Recreates the table with ON DELETE CASCADE and copies surviving rows. */ export declare function migrateToolCallsCascade(db: Database.Database): void; +/** + * Open the existing index read-only, without creating it, migrating it, or + * changing its journal mode. For dry runs that must not write. Returns null + * when there is no index yet. + */ +export declare function openDatabaseReadOnly(): Database.Database | null; export declare function initDatabase(): Database.Database; export declare function insertExchange(db: Database.Database, exchange: ConversationExchange, embedding: number[], toolNames?: string[]): void; export declare function getAllExchanges(db: Database.Database): Array<{ diff --git a/dist/db.js b/dist/db.js index 83f546ad..38fbcde0 100644 --- a/dist/db.js +++ b/dist/db.js @@ -90,6 +90,17 @@ export function migrateToolCallsCascade(db) { db.pragma('foreign_keys = ON'); console.log(' tool_calls migration complete.'); } +/** + * Open the existing index read-only, without creating it, migrating it, or + * changing its journal mode. For dry runs that must not write. Returns null + * when there is no index yet. + */ +export function openDatabaseReadOnly() { + const dbPath = getDbPath(); + if (!fs.existsSync(dbPath)) + return null; + return new Database(dbPath, { readonly: true, fileMustExist: true }); +} export function initDatabase() { const dbPath = getDbPath(); // Ensure directory exists diff --git a/dist/redact-cli.js b/dist/redact-cli.js index 97044bb2..ee142efa 100644 --- a/dist/redact-cli.js +++ b/dist/redact-cli.js @@ -5,7 +5,7 @@ import { getSyncLockPath } from './logging.js'; import { DEFAULT_REDACTION_CONFIG, FindingsTally, formatFindings, getRedactionSettings, loadRedactor, redactJsonlLine, } from './redaction.js'; const args = process.argv.slice(2); const HELP = ` -Usage: episodic-memory redact [--rewrite [--dry-run]] [--stdin] [--print-default-rules] +Usage: episodic-memory redact [--rewrite [--dry-run [--report]]] [--stdin] [--print-default-rules] Secret redaction for the conversation archive and index. @@ -16,6 +16,11 @@ OPTIONS: sync regenerates them). Run once after upgrading, and again after adding rules. --dry-run With --rewrite: report what would change, write nothing. + The index is opened read-only and is not migrated. + --report With --rewrite --dry-run: list every value that would be + redacted: where it is, the rule, its shape (length, + character classes, entropy) and the redacted text around + it. Use it to spot false positives before applying. --stdin Redact stdin to stdout, one JSONL/text line at a time, and print rule counts to stderr. Handy for testing rules. --print-default-rules Print the bundled rules as JSON (a starting point for @@ -27,7 +32,7 @@ ENVIRONMENT: EPISODIC_MEMORY_REDACTION_RULES custom rules file (default: /redaction-rules.json) EPISODIC_MEMORY_REDACTION_STRICT 1 (default) fails closed on a bad rules file | 0 passes through -Output names rule IDs and counts only; matched values are never printed. +Output names rule IDs, counts and value shapes only; matched values are never printed. `; function fail(message) { console.error(`episodic-memory: ${message}`); @@ -47,7 +52,9 @@ function requireRedactor() { } return redactor; } -async function runRewrite(dryRun) { +async function runRewrite(dryRun, report) { + if (report && !dryRun) + fail('--report needs --dry-run: review the hits, then apply without it.'); const redactor = requireRedactor(); // Share sync's single-instance lock so a background sync can't write // between our reads and renames. @@ -80,6 +87,10 @@ async function runRewrite(dryRun) { redactor, embed, dryRun, + report: report + ? hit => console.log(` ${hit.location} ${hit.ruleId} ${hit.shape} + ${hit.context}`) + : undefined, log: message => console.log(` ${message}`), }); console.log(`\n${dryRun ? 'Would redact' : 'Redacted'} across archive, staging, and index: ${formatFindings(result.findings)}`); @@ -112,7 +123,7 @@ async function main() { return; } if (args.includes('--rewrite')) { - await runRewrite(args.includes('--dry-run')); + await runRewrite(args.includes('--dry-run'), args.includes('--report')); return; } fail(`unknown option(s): ${args.join(' ')}. Try: episodic-memory redact --help`); diff --git a/dist/redact-rewrite.d.ts b/dist/redact-rewrite.d.ts index 0900d8e4..c067931d 100644 --- a/dist/redact-rewrite.d.ts +++ b/dist/redact-rewrite.d.ts @@ -15,7 +15,8 @@ import { type RedactionFinding, type Redactor } from './redaction.js'; * It was generated from unredacted text, and the next sync regenerates it * from the redacted archive. * - * Idempotent: a second run finds nothing to change. + * Idempotent: a second run finds nothing to change. A dry run opens the index + * read-only, so it doesn't create, migrate or otherwise touch it. */ export type EmbedFn = (user: string, assistant: string, toolNames?: string[]) => Promise; export interface RewriteOptions { @@ -24,6 +25,11 @@ export interface RewriteOptions { embed: EmbedFn; /** Count what would change without writing anything. */ dryRun?: boolean; + /** + * Called once per value that would be redacted, for reviewing hits before + * applying them. Never receives the value itself. + */ + report?: (hit: RedactionHit) => void; /** Plugin-owned staging dirs to redact in place (not indexed). */ stagingDirs?: string[]; log?: (message: string) => void; @@ -37,4 +43,14 @@ export interface RewriteResult { /** Rule IDs and counts only — never matched values. */ findings: RedactionFinding[]; } +/** One redacted value, described without revealing it. */ +export interface RedactionHit { + /** Archive-relative file and 1-based line, or `index:# `. */ + location: string; + ruleId: string; + /** Length, character classes and entropy (see describeShape). */ + shape: string; + /** Redacted text around the token, on one line. */ + context: string; +} export declare function rewriteArchive(options: RewriteOptions): Promise; diff --git a/dist/redact-rewrite.js b/dist/redact-rewrite.js index 7c0317f6..0c6f4678 100644 --- a/dist/redact-rewrite.js +++ b/dist/redact-rewrite.js @@ -1,9 +1,11 @@ import fs from 'fs'; import path from 'path'; -import { initDatabase } from './db.js'; +import { initDatabase, openDatabaseReadOnly } from './db.js'; import { recordReembedded } from './embedding-migration.js'; -import { copyFileRedacted, FindingsTally, redactJsonlLine, } from './redaction.js'; +import { copyFileRedacted, describeShape, findRedactionTokens, FindingsTally, redactJsonlLine, } from './redaction.js'; const SUMMARY_SUFFIX = '-summary.txt'; +const CONTEXT_BEFORE = 60; +const CONTEXT_AFTER = 20; const PAGE_SIZE = 500; function walk(dir) { const out = []; @@ -26,6 +28,62 @@ function walk(dir) { function summaryPathFor(jsonlPath) { return jsonlPath.replace(/\.jsonl$/, SUMMARY_SUFFIX); } +/** + * Pair each value a rule redacted with its token in the redacted text and + * report it. Tokens already in the original are skipped. Pairing is by rule and + * order, so the context is right per rule but approximate when one rule hits + * a line more than once around existing tokens. + */ +function reportHits(original, redacted, matches, location, report) { + const queues = new Map(); + for (const m of matches) { + const q = queues.get(m.ruleId); + if (q) + q.push(m.value); + else + queues.set(m.ruleId, [m.value]); + } + const preexisting = new Map(); + for (const t of findRedactionTokens(original)) + preexisting.set(t.ruleId, (preexisting.get(t.ruleId) ?? 0) + 1); + const oneLine = (text) => text.replace(/\s+/g, ' '); + for (const t of findRedactionTokens(redacted)) { + const skip = preexisting.get(t.ruleId) ?? 0; + if (skip > 0) { + preexisting.set(t.ruleId, skip - 1); + continue; + } + const value = queues.get(t.ruleId)?.shift(); + if (value === undefined) + continue; + const before = redacted.slice(Math.max(0, t.start - CONTEXT_BEFORE), t.start); + const after = redacted.slice(t.end, t.end + CONTEXT_AFTER); + report({ + location, + ruleId: t.ruleId, + shape: describeShape(value), + context: oneLine(`${t.start > CONTEXT_BEFORE ? '…' : ''}${before}${redacted.slice(t.start, t.end)}${after}`), + }); + } +} +/** Redact `text` with `run`, reporting each hit when `report` is set. */ +function redactReporting(text, ctx, location, report, run) { + if (!report) + return run(ctx); + const matches = []; + const out = run({ ...ctx, onMatch: (ruleId, value) => matches.push({ ruleId, value }) }); + if (matches.length > 0) + reportHits(text, out, matches, location, report); + return out; +} +/** Report every hit in a JSONL file, line by line. Writes nothing. */ +function reportFile(file, label, redactor, report) { + const lines = fs.readFileSync(file, 'utf-8').split('\n'); + const ctx = { source: 'rewrite', path: file }; + lines.forEach((line, i) => { + redactReporting(line, ctx, `${label}:${i + 1}`, report, c => redactJsonlLine(line, redactor, c)); + }); +} /** Redact one JSONL file in place. Returns the number of values redacted. */ function rewriteFileInPlace(file, redactor, dryRun, tally) { const fileTally = new FindingsTally(); @@ -70,75 +128,82 @@ export async function rewriteArchive(options) { if (rewriteFileInPlace(file, redactor, dryRun, tally) > 0) { result.filesRewritten++; staleSummaries.add(summaryPathFor(file)); + if (options.report) + reportFile(file, path.relative(archiveDir, file), redactor, options.report); } } log(`Archive: ${result.filesRewritten} of ${result.filesScanned} file(s) ${dryRun ? 'would be ' : ''}rewritten`); // 2. Staging dirs. for (const dir of options.stagingDirs ?? []) { for (const file of walk(dir).filter(f => f.endsWith('.jsonl'))) { - if (rewriteFileInPlace(file, redactor, dryRun, tally) > 0) + if (rewriteFileInPlace(file, redactor, dryRun, tally) > 0) { result.stagingFilesRewritten++; + if (options.report) + reportFile(file, `staging:${path.relative(dir, file)}`, redactor, options.report); + } } } if (options.stagingDirs?.length) { log(`Staging exports: ${result.stagingFilesRewritten} file(s) ${dryRun ? 'would be ' : ''}rewritten`); } // 3. Index rows. Page by rowid so writes between pages don't disturb the scan. - const db = initDatabase(); - try { - const page = db.prepare('SELECT rowid AS rid, id, user_message, assistant_message, archive_path FROM exchanges WHERE rowid > ? ORDER BY rowid LIMIT ?'); - const toolsFor = db.prepare('SELECT id, tool_name, tool_input, tool_result FROM tool_calls WHERE exchange_id = ? ORDER BY rowid'); - const updateExchange = db.prepare('UPDATE exchanges SET user_message = ?, assistant_message = ? WHERE id = ?'); - const updateTool = db.prepare('UPDATE tool_calls SET tool_input = ?, tool_result = ? WHERE id = ?'); - let lastRowid = 0; - for (;;) { - const rows = page.all(lastRowid, PAGE_SIZE); - if (rows.length === 0) - break; - lastRowid = rows[rows.length - 1].rid; - for (const row of rows) { - const rowTally = new FindingsTally(); - const ctx = { source: 'index', path: row.archive_path }; - const user = redactor.redact(row.user_message, ctx); - const assistant = redactor.redact(row.assistant_message, ctx); - rowTally.add(user.findings); - rowTally.add(assistant.findings); - const tools = toolsFor.all(row.id); - const toolUpdates = []; - for (const tool of tools) { - // tool_input is JSON text; redactJsonlLine keeps it valid JSON. - const input = tool.tool_input === null ? null : redactJsonlLine(tool.tool_input, redactor, ctx, rowTally); - let output = tool.tool_result; - if (output !== null) { - const r = redactor.redact(output, ctx); + // A dry run reads the index as it is; opening it normally would migrate it. + const db = dryRun ? openDatabaseReadOnly() : initDatabase(); + if (db) + try { + const page = db.prepare('SELECT rowid AS rid, id, user_message, assistant_message, archive_path FROM exchanges WHERE rowid > ? ORDER BY rowid LIMIT ?'); + const toolsFor = db.prepare('SELECT id, tool_name, tool_input, tool_result FROM tool_calls WHERE exchange_id = ? ORDER BY rowid'); + const updateExchange = db.prepare('UPDATE exchanges SET user_message = ?, assistant_message = ? WHERE id = ?'); + const updateTool = db.prepare('UPDATE tool_calls SET tool_input = ?, tool_result = ? WHERE id = ?'); + let lastRowid = 0; + for (;;) { + const rows = page.all(lastRowid, PAGE_SIZE); + if (rows.length === 0) + break; + lastRowid = rows[rows.length - 1].rid; + for (const row of rows) { + const rowTally = new FindingsTally(); + const ctx = { source: 'index', path: row.archive_path }; + const where = `index:${path.relative(archiveDir, row.archive_path)}#${row.id}`; + const redactText = (text, field) => redactReporting(text, ctx, `${where} ${field}`, options.report, c => { + const r = redactor.redact(text, c); rowTally.add(r.findings); - output = r.text; - } - if (input !== tool.tool_input || output !== tool.tool_result) { - toolUpdates.push({ id: tool.id, input, result: output }); + return r.text; + }); + const user = { text: redactText(row.user_message, 'user') }; + const assistant = { text: redactText(row.assistant_message, 'assistant') }; + const tools = toolsFor.all(row.id); + const toolUpdates = []; + for (const tool of tools) { + // tool_input is JSON text; redactJsonlLine keeps it valid JSON. + const toolInput = tool.tool_input; + const input = toolInput === null ? null : redactReporting(toolInput, ctx, `${where} ${tool.tool_name} input`, options.report, c => redactJsonlLine(toolInput, redactor, c, rowTally)); + const output = tool.tool_result === null ? null : redactText(tool.tool_result, `${tool.tool_name} result`); + if (input !== tool.tool_input || output !== tool.tool_result) { + toolUpdates.push({ id: tool.id, input, result: output }); + } } + if (rowTally.total === 0) + continue; + tally.add(rowTally.toArray()); + result.rowsUpdated++; + staleSummaries.add(summaryPathFor(row.archive_path)); + if (dryRun) + continue; + const toolNames = tools.length > 0 ? tools.map(t => t.tool_name) : undefined; + const embedding = await embed(user.text, assistant.text, toolNames); + db.transaction(() => { + updateExchange.run(user.text, assistant.text, row.id); + for (const t of toolUpdates) + updateTool.run(t.input, t.result, t.id); + recordReembedded(db, row.id, embedding); + })(); } - if (rowTally.total === 0) - continue; - tally.add(rowTally.toArray()); - result.rowsUpdated++; - staleSummaries.add(summaryPathFor(row.archive_path)); - if (dryRun) - continue; - const toolNames = tools.length > 0 ? tools.map(t => t.tool_name) : undefined; - const embedding = await embed(user.text, assistant.text, toolNames); - db.transaction(() => { - updateExchange.run(user.text, assistant.text, row.id); - for (const t of toolUpdates) - updateTool.run(t.input, t.result, t.id); - recordReembedded(db, row.id, embedding); - })(); } } - } - finally { - db.close(); - } + finally { + db.close(); + } log(`Index: ${result.rowsUpdated} exchange(s) ${dryRun ? 'would be ' : ''}redacted and re-embedded`); // 4. Summaries: stale ones, plus any summary that itself matches a rule. for (const file of archiveFiles.filter(f => f.endsWith(SUMMARY_SUFFIX))) { diff --git a/dist/redaction.d.ts b/dist/redaction.d.ts index 6e96ecd9..e6906172 100644 --- a/dist/redaction.d.ts +++ b/dist/redaction.d.ts @@ -91,6 +91,11 @@ export interface RedactionRulesFile { export interface RedactionContext { source: string; path: string; + /** + * Called with each value as it is redacted. For local review tooling + * (`redact --report`) only: the value is the secret itself, so never log it. + */ + onMatch?: (ruleId: string, value: string) => void; } export interface RedactionFinding { ruleId: string; @@ -135,6 +140,18 @@ export declare function loadRedactionConfig(file: RedactionRulesFile): Redaction * non-strict mode warns and returns null, so text passes through unredacted. */ export declare function loadRedactor(env?: NodeJS.ProcessEnv, warn?: (message: string) => void): Redactor | null; +/** + * Describe a value without revealing it: length, character classes and + * Shannon entropy (bits per char), e.g. "len=40 aA9- H=4.9". Lets someone + * reviewing hits tell a random key from a word or a placeholder. + */ +export declare function describeShape(value: string): string; +/** Each `[REDACTED:]` token in `text`, left to right. */ +export declare function findRedactionTokens(text: string): Array<{ + ruleId: string; + start: number; + end: number; +}>; export declare function createRedactor(config: RedactionConfig): Redactor; /** Aggregates findings by rule id. Never holds matched values. */ export declare class FindingsTally { diff --git a/dist/redaction.js b/dist/redaction.js index 4f728424..f3fd20bb 100644 --- a/dist/redaction.js +++ b/dist/redaction.js @@ -310,6 +310,27 @@ function redactAroundTokens(text, spans, start, end, token) { flush(end); return replaced ? out : null; } +/** + * Describe a value without revealing it: length, character classes and + * Shannon entropy (bits per char), e.g. "len=40 aA9- H=4.9". Lets someone + * reviewing hits tell a random key from a word or a placeholder. + */ +export function describeShape(value) { + const classes = (/[a-z]/.test(value) ? 'a' : '') + + (/[A-Z]/.test(value) ? 'A' : '') + + (/[0-9]/.test(value) ? '9' : '') + + (/[^A-Za-z0-9\s]/.test(value) ? '-' : '') + + (/\s/.test(value) ? '_' : ''); + return `len=${value.length} ${classes || '?'} H=${shannonEntropy(value).toFixed(1)}`; +} +/** Each `[REDACTED:]` token in `text`, left to right. */ +export function findRedactionTokens(text) { + const out = []; + for (const m of text.matchAll(TOKEN_PATTERN)) { + out.push({ ruleId: m[0].slice(TOKEN_PREFIX.length, -1), start: m.index, end: m.index + m[0].length }); + } + return out; +} function shannonEntropy(text) { const counts = new Map(); for (const ch of text) @@ -327,7 +348,7 @@ function shannonEntropy(text) { * redacted (so re-running is a no-op). A candidate is skipped when it fully * matches an allowlist pattern. */ -function applyRule(text, rule, isAllowed) { +function applyRule(text, rule, isAllowed, onMatch) { const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; const token = tokenFor(rule.id); let out = ''; @@ -351,18 +372,20 @@ function applyRule(text, rule, isAllowed) { const rewritten = redactAroundTokens(text, spans, start, end, token); if (rewritten === null) continue; + onMatch?.(rule.id, text.slice(start, end).replace(TOKEN_PATTERN, '')); out += text.slice(last, start) + rewritten; last = end; count++; continue; } + onMatch?.(rule.id, text.slice(start, end)); out += text.slice(last, start) + token; last = end; count++; } return count === 0 ? { text, count } : { text: out + text.slice(last), count }; } -function applyEntropy(text, spec, isAllowed) { +function applyEntropy(text, spec, isAllowed, onMatch) { const candidates = new RegExp(`[A-Za-z0-9+/=_.~-]{${spec.minLength},}`, 'g'); const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; const token = tokenFor(ENTROPY_RULE_ID); @@ -384,6 +407,7 @@ function applyEntropy(text, spec, isAllowed) { if (!spec.keywords.some(k => before.includes(k))) continue; } + onMatch?.(ENTROPY_RULE_ID, m[0]); out += text.slice(last, start) + token; last = end; count++; @@ -401,7 +425,7 @@ export function createRedactor(config) { const normalized = name.toLowerCase().replace(/[^a-z0-9]/g, '').replace(/\d+$/, ''); return normalized.length > 0 && compiled.secretField.test(normalized); }, - redact(text, _ctx) { + redact(text, ctx) { if (typeof text !== 'string' || text.length === 0) return { text, findings: [] }; let current = text; @@ -413,7 +437,7 @@ export function createRedactor(config) { if (!rule.keywords.some(k => lower.includes(k))) continue; } - const r = applyRule(current, rule, isAllowed); + const r = applyRule(current, rule, isAllowed, ctx?.onMatch); if (r.count > 0) { current = r.text; lower = null; @@ -421,7 +445,7 @@ export function createRedactor(config) { } } if (compiled.entropy.enabled) { - const r = applyEntropy(current, compiled.entropy, isAllowed); + const r = applyEntropy(current, compiled.entropy, isAllowed, ctx?.onMatch); if (r.count > 0) { current = r.text; counts.set(ENTROPY_RULE_ID, r.count); @@ -505,8 +529,10 @@ function redactTree(node, redactor, ctx, tally) { // MCP result. Runs after the text rules; a value they redacted only in part // is still replaced whole, since the field name says all of it is secret. const redactWhole = (key) => { - if (!isRedactableWhole(obj[key])) + const value = obj[key]; + if (!isRedactableWhole(value)) return; + ctx?.onMatch?.(FIELD_RULE_ID, value); setOwn(obj, key, tokenFor(FIELD_RULE_ID)); tally?.add([{ ruleId: FIELD_RULE_ID, count: 1 }]); changed = true; diff --git a/docs/REDACTION.md b/docs/REDACTION.md index 3e8a796b..67bb15e7 100644 --- a/docs/REDACTION.md +++ b/docs/REDACTION.md @@ -152,10 +152,30 @@ New syncs only redact new or changed files. To redact everything indexed before you upgraded, or after you add a rule: ```bash -episodic-memory redact --rewrite --dry-run # report what would change -episodic-memory redact --rewrite # apply +episodic-memory redact --rewrite --dry-run # report what would change +episodic-memory redact --rewrite --dry-run --report # list each hit to review +episodic-memory redact --rewrite # apply ``` +A dry run writes nothing, not even a schema migration: it opens the index +read-only. + +`--report` lists every value the rewrite would redact, so you can check for +false positives before applying. Each hit shows where it is, the rule, the +value's shape, and the redacted text around it. The value itself is never +printed: + +``` + -work-contoso/4f1c….jsonl:212 quoted-secret-assignment len=40 aA9- H=4.9 + …"AzureAd": { "ClientId": "…", "ClientSecret": "[REDACTED:quoted-secret-assignment]", "TenantId… +``` + +The shape is the length, the character classes (`a` lowercase, `A` uppercase, +`9` digits, `-` symbols, `_` whitespace) and the Shannon entropy in bits per +character. A random key is long with high entropy (about 4.5 or more); a word or +a placeholder is short or low. If a rule fires on something that isn't a secret, +turn it off or narrow it in `redaction-rules.json`. + `--rewrite`: - redacts every archive file in place, keeping line numbers and timestamps diff --git a/src/db.ts b/src/db.ts index 8c7a73ad..a3811e2c 100644 --- a/src/db.ts +++ b/src/db.ts @@ -104,6 +104,17 @@ export function migrateToolCallsCascade(db: Database.Database): void { console.log(' tool_calls migration complete.'); } +/** + * Open the existing index read-only, without creating it, migrating it, or + * changing its journal mode. For dry runs that must not write. Returns null + * when there is no index yet. + */ +export function openDatabaseReadOnly(): Database.Database | null { + const dbPath = getDbPath(); + if (!fs.existsSync(dbPath)) return null; + return new Database(dbPath, { readonly: true, fileMustExist: true }); +} + export function initDatabase(): Database.Database { const dbPath = getDbPath(); diff --git a/src/redact-cli.ts b/src/redact-cli.ts index 6e75b0a6..01c33ea4 100644 --- a/src/redact-cli.ts +++ b/src/redact-cli.ts @@ -15,7 +15,7 @@ import { const args = process.argv.slice(2); const HELP = ` -Usage: episodic-memory redact [--rewrite [--dry-run]] [--stdin] [--print-default-rules] +Usage: episodic-memory redact [--rewrite [--dry-run [--report]]] [--stdin] [--print-default-rules] Secret redaction for the conversation archive and index. @@ -26,6 +26,11 @@ OPTIONS: sync regenerates them). Run once after upgrading, and again after adding rules. --dry-run With --rewrite: report what would change, write nothing. + The index is opened read-only and is not migrated. + --report With --rewrite --dry-run: list every value that would be + redacted: where it is, the rule, its shape (length, + character classes, entropy) and the redacted text around + it. Use it to spot false positives before applying. --stdin Redact stdin to stdout, one JSONL/text line at a time, and print rule counts to stderr. Handy for testing rules. --print-default-rules Print the bundled rules as JSON (a starting point for @@ -37,7 +42,7 @@ ENVIRONMENT: EPISODIC_MEMORY_REDACTION_RULES custom rules file (default: /redaction-rules.json) EPISODIC_MEMORY_REDACTION_STRICT 1 (default) fails closed on a bad rules file | 0 passes through -Output names rule IDs and counts only; matched values are never printed. +Output names rule IDs, counts and value shapes only; matched values are never printed. `; function fail(message: string): never { @@ -59,7 +64,8 @@ function requireRedactor(): Redactor { return redactor!; } -async function runRewrite(dryRun: boolean): Promise { +async function runRewrite(dryRun: boolean, report: boolean): Promise { + if (report && !dryRun) fail('--report needs --dry-run: review the hits, then apply without it.'); const redactor = requireRedactor(); // Share sync's single-instance lock so a background sync can't write @@ -95,6 +101,10 @@ async function runRewrite(dryRun: boolean): Promise { redactor, embed, dryRun, + report: report + ? hit => console.log(` ${hit.location} ${hit.ruleId} ${hit.shape} + ${hit.context}`) + : undefined, log: message => console.log(` ${message}`), }); @@ -129,7 +139,7 @@ async function main(): Promise { return; } if (args.includes('--rewrite')) { - await runRewrite(args.includes('--dry-run')); + await runRewrite(args.includes('--dry-run'), args.includes('--report')); return; } fail(`unknown option(s): ${args.join(' ')}. Try: episodic-memory redact --help`); diff --git a/src/redact-rewrite.ts b/src/redact-rewrite.ts index 390f74b0..4ef696b7 100644 --- a/src/redact-rewrite.ts +++ b/src/redact-rewrite.ts @@ -1,11 +1,14 @@ import fs from 'fs'; import path from 'path'; -import { initDatabase } from './db.js'; +import { initDatabase, openDatabaseReadOnly } from './db.js'; import { recordReembedded } from './embedding-migration.js'; import { copyFileRedacted, + describeShape, + findRedactionTokens, FindingsTally, redactJsonlLine, + type RedactionContext, type RedactionFinding, type Redactor, } from './redaction.js'; @@ -26,7 +29,8 @@ import { * It was generated from unredacted text, and the next sync regenerates it * from the redacted archive. * - * Idempotent: a second run finds nothing to change. + * Idempotent: a second run finds nothing to change. A dry run opens the index + * read-only, so it doesn't create, migrate or otherwise touch it. */ export type EmbedFn = (user: string, assistant: string, toolNames?: string[]) => Promise; @@ -37,6 +41,11 @@ export interface RewriteOptions { embed: EmbedFn; /** Count what would change without writing anything. */ dryRun?: boolean; + /** + * Called once per value that would be redacted, for reviewing hits before + * applying them. Never receives the value itself. + */ + report?: (hit: RedactionHit) => void; /** Plugin-owned staging dirs to redact in place (not indexed). */ stagingDirs?: string[]; log?: (message: string) => void; @@ -52,7 +61,20 @@ export interface RewriteResult { findings: RedactionFinding[]; } +/** One redacted value, described without revealing it. */ +export interface RedactionHit { + /** Archive-relative file and 1-based line, or `index:# `. */ + location: string; + ruleId: string; + /** Length, character classes and entropy (see describeShape). */ + shape: string; + /** Redacted text around the token, on one line. */ + context: string; +} + const SUMMARY_SUFFIX = '-summary.txt'; +const CONTEXT_BEFORE = 60; +const CONTEXT_AFTER = 20; const PAGE_SIZE = 500; function walk(dir: string): string[] { @@ -75,6 +97,70 @@ function summaryPathFor(jsonlPath: string): string { return jsonlPath.replace(/\.jsonl$/, SUMMARY_SUFFIX); } +type Match = { ruleId: string; value: string }; + +/** + * Pair each value a rule redacted with its token in the redacted text and + * report it. Tokens already in the original are skipped. Pairing is by rule and + * order, so the context is right per rule but approximate when one rule hits + * a line more than once around existing tokens. + */ +function reportHits( + original: string, + redacted: string, + matches: Match[], + location: string, + report: (hit: RedactionHit) => void +): void { + const queues = new Map(); + for (const m of matches) { + const q = queues.get(m.ruleId); + if (q) q.push(m.value); else queues.set(m.ruleId, [m.value]); + } + const preexisting = new Map(); + for (const t of findRedactionTokens(original)) preexisting.set(t.ruleId, (preexisting.get(t.ruleId) ?? 0) + 1); + + const oneLine = (text: string) => text.replace(/\s+/g, ' '); + for (const t of findRedactionTokens(redacted)) { + const skip = preexisting.get(t.ruleId) ?? 0; + if (skip > 0) { preexisting.set(t.ruleId, skip - 1); continue; } + const value = queues.get(t.ruleId)?.shift(); + if (value === undefined) continue; + const before = redacted.slice(Math.max(0, t.start - CONTEXT_BEFORE), t.start); + const after = redacted.slice(t.end, t.end + CONTEXT_AFTER); + report({ + location, + ruleId: t.ruleId, + shape: describeShape(value), + context: oneLine(`${t.start > CONTEXT_BEFORE ? '…' : ''}${before}${redacted.slice(t.start, t.end)}${after}`), + }); + } +} + +/** Redact `text` with `run`, reporting each hit when `report` is set. */ +function redactReporting( + text: string, + ctx: RedactionContext, + location: string, + report: ((hit: RedactionHit) => void) | undefined, + run: (ctx: RedactionContext) => string +): string { + if (!report) return run(ctx); + const matches: Match[] = []; + const out = run({ ...ctx, onMatch: (ruleId, value) => matches.push({ ruleId, value }) }); + if (matches.length > 0) reportHits(text, out, matches, location, report); + return out; +} + +/** Report every hit in a JSONL file, line by line. Writes nothing. */ +function reportFile(file: string, label: string, redactor: Redactor, report: (hit: RedactionHit) => void): void { + const lines = fs.readFileSync(file, 'utf-8').split('\n'); + const ctx = { source: 'rewrite', path: file }; + lines.forEach((line, i) => { + redactReporting(line, ctx, `${label}:${i + 1}`, report, c => redactJsonlLine(line, redactor, c)); + }); +} + /** Redact one JSONL file in place. Returns the number of values redacted. */ function rewriteFileInPlace(file: string, redactor: Redactor, dryRun: boolean, tally: FindingsTally): number { const fileTally = new FindingsTally(); @@ -117,6 +203,7 @@ export async function rewriteArchive(options: RewriteOptions): Promise 0) { result.filesRewritten++; staleSummaries.add(summaryPathFor(file)); + if (options.report) reportFile(file, path.relative(archiveDir, file), redactor, options.report); } } log(`Archive: ${result.filesRewritten} of ${result.filesScanned} file(s) ${dryRun ? 'would be ' : ''}rewritten`); @@ -124,7 +211,10 @@ export async function rewriteArchive(options: RewriteOptions): Promise f.endsWith('.jsonl'))) { - if (rewriteFileInPlace(file, redactor, dryRun, tally) > 0) result.stagingFilesRewritten++; + if (rewriteFileInPlace(file, redactor, dryRun, tally) > 0) { + result.stagingFilesRewritten++; + if (options.report) reportFile(file, `staging:${path.relative(dir, file)}`, redactor, options.report); + } } } if (options.stagingDirs?.length) { @@ -132,8 +222,9 @@ export async function rewriteArchive(options: RewriteOptions): Promise ? ORDER BY rowid LIMIT ?' ); @@ -152,22 +243,26 @@ export async function rewriteArchive(options: RewriteOptions): Promise + redactReporting(text, ctx, `${where} ${field}`, options.report, c => { + const r = redactor.redact(text, c); + rowTally.add(r.findings); + return r.text; + }); + const user = { text: redactText(row.user_message, 'user') }; + const assistant = { text: redactText(row.assistant_message, 'assistant') }; const tools = toolsFor.all(row.id) as Array<{ id: string; tool_name: string; tool_input: string | null; tool_result: string | null }>; const toolUpdates: Array<{ id: string; input: string | null; result: string | null }> = []; for (const tool of tools) { // tool_input is JSON text; redactJsonlLine keeps it valid JSON. - const input = tool.tool_input === null ? null : redactJsonlLine(tool.tool_input, redactor, ctx, rowTally); - let output = tool.tool_result; - if (output !== null) { - const r = redactor.redact(output, ctx); - rowTally.add(r.findings); - output = r.text; - } + const toolInput = tool.tool_input; + const input = toolInput === null ? null : redactReporting( + toolInput, ctx, `${where} ${tool.tool_name} input`, options.report, + c => redactJsonlLine(toolInput, redactor, c, rowTally) + ); + const output = tool.tool_result === null ? null : redactText(tool.tool_result, `${tool.tool_name} result`); if (input !== tool.tool_input || output !== tool.tool_result) { toolUpdates.push({ id: tool.id, input, result: output }); } diff --git a/src/redaction.ts b/src/redaction.ts index 0a6563bb..52b815d8 100644 --- a/src/redaction.ts +++ b/src/redaction.ts @@ -119,6 +119,11 @@ export interface RedactionRulesFile { export interface RedactionContext { source: string; path: string; + /** + * Called with each value as it is redacted. For local review tooling + * (`redact --report`) only: the value is the secret itself, so never log it. + */ + onMatch?: (ruleId: string, value: string) => void; } export interface RedactionFinding { @@ -465,6 +470,30 @@ function redactAroundTokens( return replaced ? out : null; } +/** + * Describe a value without revealing it: length, character classes and + * Shannon entropy (bits per char), e.g. "len=40 aA9- H=4.9". Lets someone + * reviewing hits tell a random key from a word or a placeholder. + */ +export function describeShape(value: string): string { + const classes = + (/[a-z]/.test(value) ? 'a' : '') + + (/[A-Z]/.test(value) ? 'A' : '') + + (/[0-9]/.test(value) ? '9' : '') + + (/[^A-Za-z0-9\s]/.test(value) ? '-' : '') + + (/\s/.test(value) ? '_' : ''); + return `len=${value.length} ${classes || '?'} H=${shannonEntropy(value).toFixed(1)}`; +} + +/** Each `[REDACTED:]` token in `text`, left to right. */ +export function findRedactionTokens(text: string): Array<{ ruleId: string; start: number; end: number }> { + const out: Array<{ ruleId: string; start: number; end: number }> = []; + for (const m of text.matchAll(TOKEN_PATTERN)) { + out.push({ ruleId: m[0].slice(TOKEN_PREFIX.length, -1), start: m.index!, end: m.index! + m[0].length }); + } + return out; +} + function shannonEntropy(text: string): number { const counts = new Map(); for (const ch of text) counts.set(ch, (counts.get(ch) ?? 0) + 1); @@ -482,7 +511,12 @@ function shannonEntropy(text: string): number { * redacted (so re-running is a no-op). A candidate is skipped when it fully * matches an allowlist pattern. */ -function applyRule(text: string, rule: CompiledRule, isAllowed: (s: string) => boolean): { text: string; count: number } { +function applyRule( + text: string, + rule: CompiledRule, + isAllowed: (s: string) => boolean, + onMatch?: RedactionContext['onMatch'] +): { text: string; count: number } { const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; const token = tokenFor(rule.id); let out = ''; @@ -501,11 +535,13 @@ function applyRule(text: string, rule: CompiledRule, isAllowed: (s: string) => b if (spans && overlapsAny(spans, start, end)) { const rewritten = redactAroundTokens(text, spans, start, end, token); if (rewritten === null) continue; + onMatch?.(rule.id, text.slice(start, end).replace(TOKEN_PATTERN, '')); out += text.slice(last, start) + rewritten; last = end; count++; continue; } + onMatch?.(rule.id, text.slice(start, end)); out += text.slice(last, start) + token; last = end; count++; @@ -513,7 +549,12 @@ function applyRule(text: string, rule: CompiledRule, isAllowed: (s: string) => b return count === 0 ? { text, count } : { text: out + text.slice(last), count }; } -function applyEntropy(text: string, spec: EntropySpec, isAllowed: (s: string) => boolean): { text: string; count: number } { +function applyEntropy( + text: string, + spec: EntropySpec, + isAllowed: (s: string) => boolean, + onMatch?: RedactionContext['onMatch'] +): { text: string; count: number } { const candidates = new RegExp(`[A-Za-z0-9+/=_.~-]{${spec.minLength},}`, 'g'); const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; const token = tokenFor(ENTROPY_RULE_ID); @@ -531,6 +572,7 @@ function applyEntropy(text: string, spec: EntropySpec, isAllowed: (s: string) => before = before.slice(before.lastIndexOf('\n') + 1).toLowerCase(); if (!spec.keywords.some(k => before.includes(k))) continue; } + onMatch?.(ENTROPY_RULE_ID, m[0]); out += text.slice(last, start) + token; last = end; count++; @@ -549,7 +591,7 @@ export function createRedactor(config: RedactionConfig): Redactor { const normalized = name.toLowerCase().replace(/[^a-z0-9]/g, '').replace(/\d+$/, ''); return normalized.length > 0 && compiled.secretField.test(normalized); }, - redact(text: string, _ctx?: RedactionContext): RedactionResult { + redact(text: string, ctx?: RedactionContext): RedactionResult { if (typeof text !== 'string' || text.length === 0) return { text, findings: [] }; let current = text; let lower: string | null = null; @@ -560,7 +602,7 @@ export function createRedactor(config: RedactionConfig): Redactor { lower ??= current.toLowerCase(); if (!rule.keywords.some(k => lower!.includes(k))) continue; } - const r = applyRule(current, rule, isAllowed); + const r = applyRule(current, rule, isAllowed, ctx?.onMatch); if (r.count > 0) { current = r.text; lower = null; @@ -569,7 +611,7 @@ export function createRedactor(config: RedactionConfig): Redactor { } if (compiled.entropy.enabled) { - const r = applyEntropy(current, compiled.entropy, isAllowed); + const r = applyEntropy(current, compiled.entropy, isAllowed, ctx?.onMatch); if (r.count > 0) { current = r.text; counts.set(ENTROPY_RULE_ID, r.count); @@ -661,7 +703,9 @@ function redactTree( // MCP result. Runs after the text rules; a value they redacted only in part // is still replaced whole, since the field name says all of it is secret. const redactWhole = (key: string) => { - if (!isRedactableWhole(obj[key])) return; + const value = obj[key]; + if (!isRedactableWhole(value)) return; + ctx?.onMatch?.(FIELD_RULE_ID, value); setOwn(obj, key, tokenFor(FIELD_RULE_ID)); tally?.add([{ ruleId: FIELD_RULE_ID, count: 1 }]); changed = true; diff --git a/test/redact-rewrite.test.ts b/test/redact-rewrite.test.ts index 10c63f9a..12a05bc8 100644 --- a/test/redact-rewrite.test.ts +++ b/test/redact-rewrite.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync, existsSync, statSync, utimesSync } from 'fs'; -import { join } from 'path'; +import { join, sep } from 'path'; import { tmpdir } from 'os'; import Database from 'better-sqlite3'; import * as sqliteVec from 'sqlite-vec'; @@ -164,6 +164,51 @@ describe('redact --rewrite backfill', () => { expect(dbDump()).toContain(secret); expect(embed).not.toHaveBeenCalled(); }); + + it('--dry-run leaves an older-schema index byte-identical instead of migrating it', async () => { + await seedLegacy(new FakeSecrets(910)); + const legacy = new Database(dbPath); + legacy.exec('ALTER TABLE exchanges DROP COLUMN embedding_version'); + legacy.close(); + const before = readFileSync(dbPath); + + const result = await rewriteArchive({ archiveDir, redactor: createRedactor(DEFAULT_REDACTION_CONFIG), embed, dryRun: true }); + + expect(result.rowsUpdated).toBeGreaterThan(0); + expect(readFileSync(dbPath).equals(before)).toBe(true); + const db = new Database(dbPath, { readonly: true }); + const columns = (db.prepare('PRAGMA table_info(exchanges)').all() as Array<{ name: string }>).map(c => c.name); + db.close(); + expect(columns).not.toContain('embedding_version'); + }); + + it('--dry-run does not create an index that does not exist', async () => { + mkdirSync(join(archiveDir, '-work-legacy'), { recursive: true }); + const result = await rewriteArchive({ archiveDir, redactor: createRedactor(DEFAULT_REDACTION_CONFIG), embed, dryRun: true }); + expect(result.rowsUpdated).toBe(0); + expect(existsSync(dbPath)).toBe(false); + }); + + it('report lists one hit per redacted value, with location, rule and shape but never the value', async () => { + const { secret, password } = await seedLegacy(new FakeSecrets(911)); + const hits: Array<{ location: string; ruleId: string; shape: string; context: string }> = []; + + const result = await rewriteArchive({ + archiveDir, redactor: createRedactor(DEFAULT_REDACTION_CONFIG), embed, dryRun: true, report: hit => hits.push(hit), + }); + + const total = result.findings.reduce((n, f) => n + f.count, 0); + expect(hits.length).toBe(total); + const text = JSON.stringify(hits); + expect(text).not.toContain(secret); + expect(text).not.toContain(password); + + const archiveHit = hits.find(h => h.location === `-work-legacy${sep}${SESSION}.jsonl:1`); + expect(archiveHit?.ruleId).toBe('connection-string-secret'); + expect(archiveHit!.shape).toMatch(new RegExp(`^len=${secret.length} \\S+ H=\\d+\\.\\d$`)); + expect(archiveHit!.context).toContain('AccountKey=[REDACTED:connection-string-secret]'); + expect(hits.some(h => h.location.startsWith('index:') && h.location.includes(' user'))).toBe(true); + }); }); function expectNoSecretInCalls(calls: unknown[][], secrets: string[]) { From c46a8edcb0392b01f8fbe83f58d921c2a6f81310 Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 09:12:37 -0500 Subject: [PATCH 23/33] fix(redact): pair report hits with their tokens exactly The report matched values to tokens by rule and order, skipping as many tokens as the original line already had. A new hit before an existing token of the same rule took that token's context. A secret field redacted whole after a text rule hit part of it lost the text rule's hit, and its shape described the partly redacted value. onMatch may now return the token to write. In report mode each hit gets a numbered one ([REDACTED:--hit]), so it is found exactly; unnumbered tokens were already there. A field value is restored from the numbered tokens inside it, and hits it swallowed are reported at its token. rewriteArchive also refuses report without dryRun: after a real rewrite the files would have nothing left to report. Co-Authored-By: Claude Opus 5.5 --- dist/redact-rewrite.js | 104 +++++++++++++++++++++++------------- dist/redaction.d.ts | 4 +- dist/redaction.js | 23 ++++---- src/redact-rewrite.ts | 96 ++++++++++++++++++++++----------- src/redaction.ts | 32 ++++++----- test/redact-rewrite.test.ts | 43 +++++++++++++++ 6 files changed, 208 insertions(+), 94 deletions(-) diff --git a/dist/redact-rewrite.js b/dist/redact-rewrite.js index 0c6f4678..ae62e1d9 100644 --- a/dist/redact-rewrite.js +++ b/dist/redact-rewrite.js @@ -28,60 +28,85 @@ function walk(dir) { function summaryPathFor(jsonlPath) { return jsonlPath.replace(/\.jsonl$/, SUMMARY_SUFFIX); } +// In report mode each hit is written as its own numbered token, e.g. +// `[REDACTED:jwt--hit3]`, so it can be found in the output exactly; tokens that +// were already in the text have no number. Numbers are stripped for display. +const HIT_TOKEN = /\[REDACTED:([a-z0-9][a-z0-9-]*?)--hit(\d+)\]/g; +/** `value` with any numbered tokens in it replaced by the values they stand for. */ +function restoreHits(value, matches) { + return value.replace(HIT_TOKEN, (_token, _ruleId, n) => matches[Number(n)].value); +} /** - * Pair each value a rule redacted with its token in the redacted text and - * report it. Tokens already in the original are skipped. Pairing is by rule and - * order, so the context is right per rule but approximate when one rule hits - * a line more than once around existing tokens. + * Report each hit with the redacted text around its token. A hit whose token + * was swallowed by a later one (a secret field redacted whole after a text rule + * hit part of it) is reported at the token that swallowed it. */ -function reportHits(original, redacted, matches, location, report) { - const queues = new Map(); - for (const m of matches) { - const q = queues.get(m.ruleId); - if (q) - q.push(m.value); - else - queues.set(m.ruleId, [m.value]); - } - const preexisting = new Map(); - for (const t of findRedactionTokens(original)) - preexisting.set(t.ruleId, (preexisting.get(t.ruleId) ?? 0) + 1); - const oneLine = (text) => text.replace(/\s+/g, ' '); +function reportHits(redacted, matches, location, report) { + let display = ''; + let pos = 0; + const spans = new Map(); for (const t of findRedactionTokens(redacted)) { - const skip = preexisting.get(t.ruleId) ?? 0; - if (skip > 0) { - preexisting.set(t.ruleId, skip - 1); - continue; + const numbered = /^(.*)--hit(\d+)$/.exec(t.ruleId); + display += redacted.slice(pos, t.start); + const shown = numbered ? `[REDACTED:${numbered[1]}]` : redacted.slice(t.start, t.end); + if (numbered && !spans.has(Number(numbered[2]))) { + spans.set(Number(numbered[2]), [display.length, display.length + shown.length]); } - const value = queues.get(t.ruleId)?.shift(); - if (value === undefined) - continue; - const before = redacted.slice(Math.max(0, t.start - CONTEXT_BEFORE), t.start); - const after = redacted.slice(t.end, t.end + CONTEXT_AFTER); + display += shown; + pos = t.end; + } + display += redacted.slice(pos); + const spanOf = (n) => { + for (let i = n; i !== undefined; i = matches[i].absorbedBy) { + const span = spans.get(i); + if (span) + return span; + } + return undefined; + }; + const oneLine = (text) => text.replace(/\s+/g, ' '); + const hits = matches.map((m, n) => ({ m, span: spanOf(n) })); + hits.sort((a, b) => (a.span?.[0] ?? Infinity) - (b.span?.[0] ?? Infinity)); + for (const { m, span } of hits) { + const [start, end] = span ?? [0, 0]; + const before = display.slice(Math.max(0, start - CONTEXT_BEFORE), start); report({ location, - ruleId: t.ruleId, - shape: describeShape(value), - context: oneLine(`${t.start > CONTEXT_BEFORE ? '…' : ''}${before}${redacted.slice(t.start, t.end)}${after}`), + ruleId: m.ruleId, + shape: describeShape(m.value), + context: span + ? oneLine(`${start > CONTEXT_BEFORE ? '…' : ''}${before}${display.slice(start, end + CONTEXT_AFTER)}`) + : '', }); } + return display; } -/** Redact `text` with `run`, reporting each hit when `report` is set. */ -function redactReporting(text, ctx, location, report, run) { +/** + * Redact with `run`, reporting each hit when `report` is set. Returns + * the redacted text with ordinary tokens either way. + */ +function redactReporting(ctx, location, report, run) { if (!report) return run(ctx); const matches = []; - const out = run({ ...ctx, onMatch: (ruleId, value) => matches.push({ ruleId, value }) }); - if (matches.length > 0) - reportHits(text, out, matches, location, report); - return out; + const out = run({ + ...ctx, + onMatch: (ruleId, value) => { + const n = matches.length; + for (const [, , k] of value.matchAll(HIT_TOKEN)) + matches[Number(k)].absorbedBy = n; + matches.push({ ruleId, value: restoreHits(value, matches) }); + return `[REDACTED:${ruleId}--hit${n}]`; + }, + }); + return matches.length > 0 ? reportHits(out, matches, location, report) : out; } /** Report every hit in a JSONL file, line by line. Writes nothing. */ function reportFile(file, label, redactor, report) { const lines = fs.readFileSync(file, 'utf-8').split('\n'); const ctx = { source: 'rewrite', path: file }; lines.forEach((line, i) => { - redactReporting(line, ctx, `${label}:${i + 1}`, report, c => redactJsonlLine(line, redactor, c)); + redactReporting(ctx, `${label}:${i + 1}`, report, c => redactJsonlLine(line, redactor, c)); }); } /** Redact one JSONL file in place. Returns the number of values redacted. */ @@ -109,6 +134,9 @@ function rewriteFileInPlace(file, redactor, dryRun, tally) { export async function rewriteArchive(options) { const { archiveDir, redactor, embed } = options; const dryRun = options.dryRun === true; + // Reporting reads files before redaction; after a real rewrite there'd be nothing to find. + if (options.report && !dryRun) + throw new Error('rewriteArchive: report requires dryRun'); const log = options.log ?? (() => { }); const tally = new FindingsTally(); const result = { @@ -165,7 +193,7 @@ export async function rewriteArchive(options) { const rowTally = new FindingsTally(); const ctx = { source: 'index', path: row.archive_path }; const where = `index:${path.relative(archiveDir, row.archive_path)}#${row.id}`; - const redactText = (text, field) => redactReporting(text, ctx, `${where} ${field}`, options.report, c => { + const redactText = (text, field) => redactReporting(ctx, `${where} ${field}`, options.report, c => { const r = redactor.redact(text, c); rowTally.add(r.findings); return r.text; @@ -177,7 +205,7 @@ export async function rewriteArchive(options) { for (const tool of tools) { // tool_input is JSON text; redactJsonlLine keeps it valid JSON. const toolInput = tool.tool_input; - const input = toolInput === null ? null : redactReporting(toolInput, ctx, `${where} ${tool.tool_name} input`, options.report, c => redactJsonlLine(toolInput, redactor, c, rowTally)); + const input = toolInput === null ? null : redactReporting(ctx, `${where} ${tool.tool_name} input`, options.report, c => redactJsonlLine(toolInput, redactor, c, rowTally)); const output = tool.tool_result === null ? null : redactText(tool.tool_result, `${tool.tool_name} result`); if (input !== tool.tool_input || output !== tool.tool_result) { toolUpdates.push({ id: tool.id, input, result: output }); diff --git a/dist/redaction.d.ts b/dist/redaction.d.ts index e6906172..b19ee59b 100644 --- a/dist/redaction.d.ts +++ b/dist/redaction.d.ts @@ -94,8 +94,10 @@ export interface RedactionContext { /** * Called with each value as it is redacted. For local review tooling * (`redact --report`) only: the value is the secret itself, so never log it. + * May return the token to write instead of `[REDACTED:]`, e.g. one + * numbered per hit; it must still have the token's shape. */ - onMatch?: (ruleId: string, value: string) => void; + onMatch?: (ruleId: string, value: string) => string | void; } export interface RedactionFinding { ruleId: string; diff --git a/dist/redaction.js b/dist/redaction.js index f3fd20bb..f654ae08 100644 --- a/dist/redaction.js +++ b/dist/redaction.js @@ -267,6 +267,12 @@ function compileConfig(config) { function tokenFor(ruleId) { return `${TOKEN_PREFIX}${ruleId}]`; } +const WHOLE_TOKEN = /^\[REDACTED:[a-z0-9][a-z0-9-]*\]$/; +/** The token for one redacted value: onMatch's, if it returns a valid one. */ +function tokenForMatch(ruleId, value, onMatch) { + const custom = onMatch?.(ruleId, value); + return typeof custom === 'string' && WHOLE_TOKEN.test(custom) ? custom : tokenFor(ruleId); +} function tokenSpans(text) { const spans = []; for (const m of text.matchAll(TOKEN_PATTERN)) @@ -291,7 +297,7 @@ function redactAroundTokens(text, spans, start, end, token) { const flush = (to) => { const piece = text.slice(pos, to); if (/[A-Za-z0-9]/.test(piece)) { - out += token; + out += token(); replaced = true; } else { @@ -350,7 +356,6 @@ function shannonEntropy(text) { */ function applyRule(text, rule, isAllowed, onMatch) { const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; - const token = tokenFor(rule.id); let out = ''; let last = 0; let count = 0; @@ -369,17 +374,16 @@ function applyRule(text, rule, isAllowed, onMatch) { if (rule.useAllowlist && isAllowed(text.slice(start, end))) continue; if (spans && overlapsAny(spans, start, end)) { - const rewritten = redactAroundTokens(text, spans, start, end, token); + let token; + const rewritten = redactAroundTokens(text, spans, start, end, () => (token ??= tokenForMatch(rule.id, text.slice(start, end).replace(TOKEN_PATTERN, ''), onMatch))); if (rewritten === null) continue; - onMatch?.(rule.id, text.slice(start, end).replace(TOKEN_PATTERN, '')); out += text.slice(last, start) + rewritten; last = end; count++; continue; } - onMatch?.(rule.id, text.slice(start, end)); - out += text.slice(last, start) + token; + out += text.slice(last, start) + tokenForMatch(rule.id, text.slice(start, end), onMatch); last = end; count++; } @@ -388,7 +392,6 @@ function applyRule(text, rule, isAllowed, onMatch) { function applyEntropy(text, spec, isAllowed, onMatch) { const candidates = new RegExp(`[A-Za-z0-9+/=_.~-]{${spec.minLength},}`, 'g'); const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; - const token = tokenFor(ENTROPY_RULE_ID); let out = ''; let last = 0; let count = 0; @@ -407,8 +410,7 @@ function applyEntropy(text, spec, isAllowed, onMatch) { if (!spec.keywords.some(k => before.includes(k))) continue; } - onMatch?.(ENTROPY_RULE_ID, m[0]); - out += text.slice(last, start) + token; + out += text.slice(last, start) + tokenForMatch(ENTROPY_RULE_ID, m[0], onMatch); last = end; count++; } @@ -532,8 +534,7 @@ function redactTree(node, redactor, ctx, tally) { const value = obj[key]; if (!isRedactableWhole(value)) return; - ctx?.onMatch?.(FIELD_RULE_ID, value); - setOwn(obj, key, tokenFor(FIELD_RULE_ID)); + setOwn(obj, key, tokenForMatch(FIELD_RULE_ID, value, ctx?.onMatch)); tally?.add([{ ruleId: FIELD_RULE_ID, count: 1 }]); changed = true; }; diff --git a/src/redact-rewrite.ts b/src/redact-rewrite.ts index 4ef696b7..03cede53 100644 --- a/src/redact-rewrite.ts +++ b/src/redact-rewrite.ts @@ -97,49 +97,74 @@ function summaryPathFor(jsonlPath: string): string { return jsonlPath.replace(/\.jsonl$/, SUMMARY_SUFFIX); } -type Match = { ruleId: string; value: string }; +type Match = { ruleId: string; value: string; absorbedBy?: number }; + +// In report mode each hit is written as its own numbered token, e.g. +// `[REDACTED:jwt--hit3]`, so it can be found in the output exactly; tokens that +// were already in the text have no number. Numbers are stripped for display. +const HIT_TOKEN = /\[REDACTED:([a-z0-9][a-z0-9-]*?)--hit(\d+)\]/g; + +/** `value` with any numbered tokens in it replaced by the values they stand for. */ +function restoreHits(value: string, matches: Match[]): string { + return value.replace(HIT_TOKEN, (_token, _ruleId, n: string) => matches[Number(n)].value); +} /** - * Pair each value a rule redacted with its token in the redacted text and - * report it. Tokens already in the original are skipped. Pairing is by rule and - * order, so the context is right per rule but approximate when one rule hits - * a line more than once around existing tokens. + * Report each hit with the redacted text around its token. A hit whose token + * was swallowed by a later one (a secret field redacted whole after a text rule + * hit part of it) is reported at the token that swallowed it. */ function reportHits( - original: string, redacted: string, matches: Match[], location: string, report: (hit: RedactionHit) => void -): void { - const queues = new Map(); - for (const m of matches) { - const q = queues.get(m.ruleId); - if (q) q.push(m.value); else queues.set(m.ruleId, [m.value]); +): string { + let display = ''; + let pos = 0; + const spans = new Map(); + for (const t of findRedactionTokens(redacted)) { + const numbered = /^(.*)--hit(\d+)$/.exec(t.ruleId); + display += redacted.slice(pos, t.start); + const shown = numbered ? `[REDACTED:${numbered[1]}]` : redacted.slice(t.start, t.end); + if (numbered && !spans.has(Number(numbered[2]))) { + spans.set(Number(numbered[2]), [display.length, display.length + shown.length]); + } + display += shown; + pos = t.end; } - const preexisting = new Map(); - for (const t of findRedactionTokens(original)) preexisting.set(t.ruleId, (preexisting.get(t.ruleId) ?? 0) + 1); + display += redacted.slice(pos); + const spanOf = (n: number): [number, number] | undefined => { + for (let i: number | undefined = n; i !== undefined; i = matches[i].absorbedBy) { + const span = spans.get(i); + if (span) return span; + } + return undefined; + }; const oneLine = (text: string) => text.replace(/\s+/g, ' '); - for (const t of findRedactionTokens(redacted)) { - const skip = preexisting.get(t.ruleId) ?? 0; - if (skip > 0) { preexisting.set(t.ruleId, skip - 1); continue; } - const value = queues.get(t.ruleId)?.shift(); - if (value === undefined) continue; - const before = redacted.slice(Math.max(0, t.start - CONTEXT_BEFORE), t.start); - const after = redacted.slice(t.end, t.end + CONTEXT_AFTER); + const hits = matches.map((m, n) => ({ m, span: spanOf(n) })); + hits.sort((a, b) => (a.span?.[0] ?? Infinity) - (b.span?.[0] ?? Infinity)); + for (const { m, span } of hits) { + const [start, end] = span ?? [0, 0]; + const before = display.slice(Math.max(0, start - CONTEXT_BEFORE), start); report({ location, - ruleId: t.ruleId, - shape: describeShape(value), - context: oneLine(`${t.start > CONTEXT_BEFORE ? '…' : ''}${before}${redacted.slice(t.start, t.end)}${after}`), + ruleId: m.ruleId, + shape: describeShape(m.value), + context: span + ? oneLine(`${start > CONTEXT_BEFORE ? '…' : ''}${before}${display.slice(start, end + CONTEXT_AFTER)}`) + : '', }); } + return display; } -/** Redact `text` with `run`, reporting each hit when `report` is set. */ +/** + * Redact with `run`, reporting each hit when `report` is set. Returns + * the redacted text with ordinary tokens either way. + */ function redactReporting( - text: string, ctx: RedactionContext, location: string, report: ((hit: RedactionHit) => void) | undefined, @@ -147,9 +172,16 @@ function redactReporting( ): string { if (!report) return run(ctx); const matches: Match[] = []; - const out = run({ ...ctx, onMatch: (ruleId, value) => matches.push({ ruleId, value }) }); - if (matches.length > 0) reportHits(text, out, matches, location, report); - return out; + const out = run({ + ...ctx, + onMatch: (ruleId, value) => { + const n = matches.length; + for (const [, , k] of value.matchAll(HIT_TOKEN)) matches[Number(k)].absorbedBy = n; + matches.push({ ruleId, value: restoreHits(value, matches) }); + return `[REDACTED:${ruleId}--hit${n}]`; + }, + }); + return matches.length > 0 ? reportHits(out, matches, location, report) : out; } /** Report every hit in a JSONL file, line by line. Writes nothing. */ @@ -157,7 +189,7 @@ function reportFile(file: string, label: string, redactor: Redactor, report: (hi const lines = fs.readFileSync(file, 'utf-8').split('\n'); const ctx = { source: 'rewrite', path: file }; lines.forEach((line, i) => { - redactReporting(line, ctx, `${label}:${i + 1}`, report, c => redactJsonlLine(line, redactor, c)); + redactReporting(ctx, `${label}:${i + 1}`, report, c => redactJsonlLine(line, redactor, c)); }); } @@ -183,6 +215,8 @@ function rewriteFileInPlace(file: string, redactor: Redactor, dryRun: boolean, t export async function rewriteArchive(options: RewriteOptions): Promise { const { archiveDir, redactor, embed } = options; const dryRun = options.dryRun === true; + // Reporting reads files before redaction; after a real rewrite there'd be nothing to find. + if (options.report && !dryRun) throw new Error('rewriteArchive: report requires dryRun'); const log = options.log ?? (() => {}); const tally = new FindingsTally(); const result: RewriteResult = { @@ -245,7 +279,7 @@ export async function rewriteArchive(options: RewriteOptions): Promise - redactReporting(text, ctx, `${where} ${field}`, options.report, c => { + redactReporting(ctx, `${where} ${field}`, options.report, c => { const r = redactor.redact(text, c); rowTally.add(r.findings); return r.text; @@ -259,7 +293,7 @@ export async function rewriteArchive(options: RewriteOptions): Promise redactJsonlLine(toolInput, redactor, c, rowTally) ); const output = tool.tool_result === null ? null : redactText(tool.tool_result, `${tool.tool_name} result`); diff --git a/src/redaction.ts b/src/redaction.ts index 52b815d8..1411650d 100644 --- a/src/redaction.ts +++ b/src/redaction.ts @@ -122,8 +122,10 @@ export interface RedactionContext { /** * Called with each value as it is redacted. For local review tooling * (`redact --report`) only: the value is the secret itself, so never log it. + * May return the token to write instead of `[REDACTED:]`, e.g. one + * numbered per hit; it must still have the token's shape. */ - onMatch?: (ruleId: string, value: string) => void; + onMatch?: (ruleId: string, value: string) => string | void; } export interface RedactionFinding { @@ -425,6 +427,14 @@ function tokenFor(ruleId: string): string { return `${TOKEN_PREFIX}${ruleId}]`; } +const WHOLE_TOKEN = /^\[REDACTED:[a-z0-9][a-z0-9-]*\]$/; + +/** The token for one redacted value: onMatch's, if it returns a valid one. */ +function tokenForMatch(ruleId: string, value: string, onMatch: RedactionContext['onMatch']): string { + const custom = onMatch?.(ruleId, value); + return typeof custom === 'string' && WHOLE_TOKEN.test(custom) ? custom : tokenFor(ruleId); +} + function tokenSpans(text: string): Array<[number, number]> { const spans: Array<[number, number]> = []; for (const m of text.matchAll(TOKEN_PATTERN)) spans.push([m.index!, m.index! + m[0].length]); @@ -446,7 +456,7 @@ function redactAroundTokens( spans: Array<[number, number]>, start: number, end: number, - token: string + token: () => string ): string | null { let out = ''; let pos = start; @@ -454,7 +464,7 @@ function redactAroundTokens( const flush = (to: number) => { const piece = text.slice(pos, to); if (/[A-Za-z0-9]/.test(piece)) { - out += token; + out += token(); replaced = true; } else { out += piece; @@ -518,7 +528,6 @@ function applyRule( onMatch?: RedactionContext['onMatch'] ): { text: string; count: number } { const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; - const token = tokenFor(rule.id); let out = ''; let last = 0; let count = 0; @@ -533,16 +542,16 @@ function applyRule( if (end <= start || start < last) continue; if (rule.useAllowlist && isAllowed(text.slice(start, end))) continue; if (spans && overlapsAny(spans, start, end)) { - const rewritten = redactAroundTokens(text, spans, start, end, token); + let token: string | undefined; + const rewritten = redactAroundTokens(text, spans, start, end, () => + (token ??= tokenForMatch(rule.id, text.slice(start, end).replace(TOKEN_PATTERN, ''), onMatch))); if (rewritten === null) continue; - onMatch?.(rule.id, text.slice(start, end).replace(TOKEN_PATTERN, '')); out += text.slice(last, start) + rewritten; last = end; count++; continue; } - onMatch?.(rule.id, text.slice(start, end)); - out += text.slice(last, start) + token; + out += text.slice(last, start) + tokenForMatch(rule.id, text.slice(start, end), onMatch); last = end; count++; } @@ -557,7 +566,6 @@ function applyEntropy( ): { text: string; count: number } { const candidates = new RegExp(`[A-Za-z0-9+/=_.~-]{${spec.minLength},}`, 'g'); const spans = text.includes(TOKEN_PREFIX) ? tokenSpans(text) : null; - const token = tokenFor(ENTROPY_RULE_ID); let out = ''; let last = 0; let count = 0; @@ -572,8 +580,7 @@ function applyEntropy( before = before.slice(before.lastIndexOf('\n') + 1).toLowerCase(); if (!spec.keywords.some(k => before.includes(k))) continue; } - onMatch?.(ENTROPY_RULE_ID, m[0]); - out += text.slice(last, start) + token; + out += text.slice(last, start) + tokenForMatch(ENTROPY_RULE_ID, m[0], onMatch); last = end; count++; } @@ -705,8 +712,7 @@ function redactTree( const redactWhole = (key: string) => { const value = obj[key]; if (!isRedactableWhole(value)) return; - ctx?.onMatch?.(FIELD_RULE_ID, value); - setOwn(obj, key, tokenFor(FIELD_RULE_ID)); + setOwn(obj, key, tokenForMatch(FIELD_RULE_ID, value, ctx?.onMatch)); tally?.add([{ ruleId: FIELD_RULE_ID, count: 1 }]); changed = true; }; diff --git a/test/redact-rewrite.test.ts b/test/redact-rewrite.test.ts index 12a05bc8..b794a2fb 100644 --- a/test/redact-rewrite.test.ts +++ b/test/redact-rewrite.test.ts @@ -209,6 +209,49 @@ describe('redact --rewrite backfill', () => { expect(archiveHit!.context).toContain('AccountKey=[REDACTED:connection-string-secret]'); expect(hits.some(h => h.location.startsWith('index:') && h.location.includes(' user'))).toBe(true); }); + + it('report refuses to run without dryRun, since files would already be rewritten', async () => { + mkdirSync(archiveDir, { recursive: true }); + await expect(rewriteArchive({ + archiveDir, redactor: createRedactor(DEFAULT_REDACTION_CONFIG), embed, report: () => {}, + })).rejects.toThrow(/dryRun/); + }); + + /** Dry-run report over one archive file holding `line`. */ + async function reportLine(line: string) { + mkdirSync(join(archiveDir, '-work-x'), { recursive: true }); + writeFileSync(join(archiveDir, '-work-x', 's.jsonl'), line + '\n'); + const hits: Array<{ location: string; ruleId: string; shape: string; context: string }> = []; + await rewriteArchive({ archiveDir, redactor: createRedactor(DEFAULT_REDACTION_CONFIG), embed, dryRun: true, report: h => hits.push(h) }); + return hits; + } + + it('report pairs a new hit with its own token, not an earlier token of the same rule', async () => { + const pw = new FakeSecrets(912).chars('abcdefghijklmnopqrstuvwxyz', 14); + const hits = await reportLine( + JSON.stringify({ content: `first: Server=a;password=${pw}; later: Server=b;Password=[REDACTED:connection-string-secret];` }) + ); + expect(hits).toHaveLength(1); + expect(hits[0].shape).toMatch(/^len=14 a /); + expect(hits[0].context).toContain('first: Server=a;password=[REDACTED:connection-string-secret]'); + expect(hits[0].context).not.toContain('--hit'); + }); + + it('report keeps a hit swallowed by a whole secret field, and shapes the field from its original value', async () => { + const fake = new FakeSecrets(913); + const word = fake.chars('abcdefghijklmnopqrstuvwxyz', 9); + const jwt = fake.jwt(); + const hits = await reportLine(JSON.stringify({ password: `${word} ${jwt}` })); + + expect(hits.map(h => h.ruleId).sort()).toEqual(['jwt', 'secret-field']); + const field = hits.find(h => h.ruleId === 'secret-field')!; + expect(field.shape).toMatch(new RegExp(`^len=${word.length + 1 + jwt.length} `)); + const swallowed = hits.find(h => h.ruleId === 'jwt')!; + expect(swallowed.shape).toMatch(new RegExp(`^len=${jwt.length} `)); + expect(swallowed.context).toBe(field.context); + expect(field.context).toContain('"password":"[REDACTED:secret-field]"'); + expect(JSON.stringify(hits)).not.toContain(word); + }); }); function expectNoSecretInCalls(calls: unknown[][], secrets: string[]) { From 87e806aa65377762f69c0d02cfb4167c950900a5 Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 09:31:33 -0500 Subject: [PATCH 24/33] fix(redaction): require a letter or digit in a connection-string value Markdown like `Password=`, `Pwd=` matched with "`," as the value, so docs and chat about connection strings were mangled and inflated the counts (found dogfooding on a real archive). A real value always has a letter or digit. Co-Authored-By: Claude Opus 5.5 --- dist/redaction-rules.js | 4 ++-- src/redaction-rules.ts | 4 ++-- test/redaction.test.ts | 4 ++++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/dist/redaction-rules.js b/dist/redaction-rules.js index 46b62b8c..6295381c 100644 --- a/dist/redaction-rules.js +++ b/dist/redaction-rules.js @@ -50,8 +50,8 @@ export const DEFAULT_REDACTION_CONFIG = { }, { id: 'connection-string-secret', - description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept. Keywords are case-insensitive, as in ADO.NET; a path after Pwd= is the shell PWD variable and is kept', - pattern: String.raw `\b(?:(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password)=|Pwd=(?![/~]))(?![\[$<{%])([^;"'\s]+)`, + description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept. Keywords are case-insensitive, as in ADO.NET; a path after Pwd= is the shell PWD variable and is kept; the value needs a letter or digit, so Markdown like `Password=` is kept', + pattern: String.raw `\b(?:(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password)=|Pwd=(?![/~]))(?![\[$<{%])(?=[^;"'\s]*[A-Za-z0-9])([^;"'\s]+)`, flags: 'i', secretGroup: 1, keywords: ['accountkey', 'sharedaccess', 'sharedsecret', 'clientsecret', 'password', 'pwd'], diff --git a/src/redaction-rules.ts b/src/redaction-rules.ts index b0d6d99a..7f5490b0 100644 --- a/src/redaction-rules.ts +++ b/src/redaction-rules.ts @@ -58,8 +58,8 @@ export const DEFAULT_REDACTION_CONFIG: RedactionConfig = { }, { id: 'connection-string-secret', - description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept. Keywords are case-insensitive, as in ADO.NET; a path after Pwd= is the shell PWD variable and is kept', - pattern: String.raw`\b(?:(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password)=|Pwd=(?![/~]))(?![\[$<{%])([^;"'\s]+)`, + description: 'Secret value inside an Azure/ADO.NET connection string; account, server and database names are kept. Keywords are case-insensitive, as in ADO.NET; a path after Pwd= is the shell PWD variable and is kept; the value needs a letter or digit, so Markdown like `Password=` is kept', + pattern: String.raw`\b(?:(?:AccountKey|SharedAccessKey|SharedAccessSignature|SharedSecret|ClientSecret|Password)=|Pwd=(?![/~]))(?![\[$<{%])(?=[^;"'\s]*[A-Za-z0-9])([^;"'\s]+)`, flags: 'i', secretGroup: 1, keywords: ['accountkey', 'sharedaccess', 'sharedsecret', 'clientsecret', 'password', 'pwd'], diff --git a/test/redaction.test.ts b/test/redaction.test.ts index 745e1c17..3ac42229 100644 --- a/test/redaction.test.ts +++ b/test/redaction.test.ts @@ -278,6 +278,10 @@ describe('redaction: allowlist and false-positive resistance (negative)', () => expectUntouched('PWD=/home/user1/src/project2\nOLDPWD=/home/user1\nmax_tokens: 4096\ntokenizer: bert-base-uncased'); }); + it('Markdown about connection-string keywords survives', () => { + expectUntouched('Set `AccountKey=`, `SharedAccessKey=`, `Password=` or `Pwd=` in the connection string.'); + }); + it('prose about tokens and passwords survives', () => { expectUntouched('Rotate the bearer token every 90 days. Basic authentication is disabled. The password policy requires 14 characters.'); }); From 46c6a8a94943ac6c45b3ca09aba19f3d8158f33b Mon Sep 17 00:00:00 2001 From: Steven Molen <533340+darthmolen@users.noreply.github.com> Date: Mon, 5 Oct 2026 09:46:33 -0500 Subject: [PATCH 25/33] docs(redaction): fold the design note into one summary-level guide docs/REDACTION.md now covers where redaction happens (with links to the choke points), the three detection layers, the guarantees, the backfill, configuration and limits, including how this differs from NER. It picks up behavior added since the first draft: index repair failing closed, partial tokens, whole-field replacement, kept file modes, and the connection-string exclusions. PHASE0-FINDINGS.md described the build process rather than the result, so its one lasting point (why the archive write is the choke point) moved into the guide and source comments now point there. Co-Authored-By: Claude Opus 5.5 --- dist/cursor-legacy.js | 2 +- dist/opencode-sync.js | 2 +- dist/redaction.d.ts | 2 +- dist/redaction.js | 2 +- dist/summarizer.d.ts | 2 +- docs/REDACTION.md | 337 +++++++++++++----------------- docs/redaction/PHASE0-FINDINGS.md | 184 ---------------- src/cursor-legacy.ts | 2 +- src/opencode-sync.ts | 2 +- src/redaction.ts | 2 +- src/summarizer.ts | 2 +- 11 files changed, 153 insertions(+), 386 deletions(-) delete mode 100644 docs/redaction/PHASE0-FINDINGS.md diff --git a/dist/cursor-legacy.js b/dist/cursor-legacy.js index 7b140e0c..e6ea46d6 100644 --- a/dist/cursor-legacy.js +++ b/dist/cursor-legacy.js @@ -206,7 +206,7 @@ export function importCursorLegacy(options) { ? lines.map(line => JSON.stringify({ ...JSON.parse(line), cwd })) : lines; // The export dir is a plugin-owned plaintext copy, so redact it at - // write time like the archive (docs/redaction/PHASE0-FINDINGS.md). + // write time like the archive (docs/REDACTION.md). const finalLines = redactor ? withCwd.map(line => redactJsonlLine(line, redactor, { source: 'cursor-legacy', path: outFile })) : withCwd; diff --git a/dist/opencode-sync.js b/dist/opencode-sync.js index c4bd4a8b..33916055 100644 --- a/dist/opencode-sync.js +++ b/dist/opencode-sync.js @@ -117,7 +117,7 @@ function writeSessionTranscript(db, session, filePath, redactor) { })); } // The staging transcript is a plugin-owned plaintext copy, so redact it at - // write time like the archive (docs/redaction/PHASE0-FINDINGS.md). + // write time like the archive (docs/REDACTION.md). const output = redactor ? lines.map(line => redactJsonlLine(line, redactor, { source: 'opencode', path: filePath })) : lines; diff --git a/dist/redaction.d.ts b/dist/redaction.d.ts index b19ee59b..d4af59bd 100644 --- a/dist/redaction.d.ts +++ b/dist/redaction.d.ts @@ -4,7 +4,7 @@ import { DEFAULT_REDACTION_CONFIG } from './redaction-rules.js'; * * Secrets are replaced with typed tokens (`[REDACTED:]`) at the archive * write, the one point every harness's transcripts pass through (see - * docs/redaction/PHASE0-FINDINGS.md). Everything downstream (SQLite text, + * docs/REDACTION.md). Everything downstream (SQLite text, * tool_calls, embeddings, summaries, show/read) reads the archive, so it only * ever sees redacted text. * diff --git a/dist/redaction.js b/dist/redaction.js index f654ae08..e4f206d5 100644 --- a/dist/redaction.js +++ b/dist/redaction.js @@ -8,7 +8,7 @@ import { DEFAULT_REDACTION_CONFIG } from './redaction-rules.js'; * * Secrets are replaced with typed tokens (`[REDACTED:]`) at the archive * write, the one point every harness's transcripts pass through (see - * docs/redaction/PHASE0-FINDINGS.md). Everything downstream (SQLite text, + * docs/REDACTION.md). Everything downstream (SQLite text, * tool_calls, embeddings, summaries, show/read) reads the archive, so it only * ever sees redacted text. * diff --git a/dist/summarizer.d.ts b/dist/summarizer.d.ts index c4b5595d..32272d9e 100644 --- a/dist/summarizer.d.ts +++ b/dist/summarizer.d.ts @@ -177,7 +177,7 @@ export interface SummarizeOptions { * Allow Claude session resume and Codex thread/fork (default true). Both * paths make the model read the *source* transcript rather than `exchanges`, * so callers pass false when the exchanges were redacted (see - * docs/redaction/PHASE0-FINDINGS.md) to force the transcript-text path. + * docs/REDACTION.md) to force the transcript-text path. */ allowResume?: boolean; } diff --git a/docs/REDACTION.md b/docs/REDACTION.md index 67bb15e7..6fe53eac 100644 --- a/docs/REDACTION.md +++ b/docs/REDACTION.md @@ -1,224 +1,175 @@ # Secret redaction episodic-memory replaces secrets in your conversations with typed tokens -**before** it archives, indexes, embeds, or summarizes them: +before it archives, indexes, embeds, or summarizes them: -``` +```text AccountKey=<88-char key> → AccountKey=[REDACTED:connection-string-secret] "ClientSecret": "" → "ClientSecret": "[REDACTED:quoted-secret-assignment]" → Authorization: Bearer → Authorization: Bearer [REDACTED:jwt] ``` -Values are redacted, not dropped. The rest of the conversation stays -searchable, and the token tells you what kind of value was there. You can -search for the tokens too: `episodic-memory search --text "[REDACTED:azure-storage-key]"` -finds every conversation where a storage key was pasted. +Only the value is replaced, so the rest of the conversation stays searchable, +and the token says what kind of value was there. +`episodic-memory search --text "[REDACTED:azure-storage-key]"` finds every +conversation where a storage key was pasted. + +Redaction is on by default and fails closed: if the rules can't load, sync +doesn't run. -Redaction is **on by default**, and it **fails closed**. If the rules can't be -loaded, sync refuses to run. It won't archive unredacted text. +## Where it happens -## What's covered +Every harness's transcripts (Claude Code, Codex, Cursor, opencode, OMP) are +copied into the conversation archive before anything else reads them. That +copy is the one point they all pass through, so it is where redaction happens +([`copyIfNewer`](../src/sync.ts) → [`copyFileRedacted`](../src/redaction.ts)). +Everything downstream reads the archive: | Where | Redacted? | |---|---| -| Conversation archive (`~/.config/superpowers/conversation-archive`) | Yes. This is the hook point. | -| SQLite index: message text and tool inputs/outputs | Yes. Built from the archive. | -| Embeddings | Yes. Built from redacted text. | -| Summaries (sent to a model) | Yes. Built from redacted text. Session resume and Codex fork are turned off (see below). | -| opencode and legacy Cursor staging exports | Yes. Redacted when written. | -| `show`, MCP `read` | Yes. They read the archive. | -| Sync logs | Rule IDs and counts only. Matched values are never logged. | -| Claude Code's own `~/.claude/projects`, Codex's `~/.codex/sessions`, etc. | **No.** Those files belong to the harness. Use its retention settings. | - -### Summaries - -Without redaction, the summarizer can *resume* a Claude Code session or *fork* -a Codex thread. Both make the model read the original, unredacted transcript. -With redaction on, summaries always come from the redacted conversation text. -This has one side effect for Codex-only setups: summarization then goes -through the Claude Agent SDK. If you don't have Claude set up, summaries fail -and retry on later syncs. Set `EPISODIC_MEMORY_SKIP_SUMMARIES=1` to turn them -off. Summaries are display-only, so search quality is unaffected. - -## Default rules - -Run `episodic-memory redact --print-default-rules` for the full set. In -summary: - -| Rule ID | Catches | +| Conversation archive (`~/.config/superpowers/conversation-archive`) | Yes, line by line as it's copied | +| SQLite index: message text and tool inputs/outputs | Yes, parsed from the archive ([indexer.ts](../src/indexer.ts) included) | +| Embeddings | Yes, built from redacted text | +| Summaries (sent to a model) | Yes. Summarizer resume and Codex fork are turned off, because both read the original transcript ([summarizer.ts](../src/summarizer.ts)) | +| opencode and legacy Cursor staging exports | Yes, when written ([opencode-sync.ts](../src/opencode-sync.ts), [cursor-legacy.ts](../src/cursor-legacy.ts)) | +| `show`, MCP `read` | Yes, they read the archive | +| Logs | Rule IDs and counts only | +| The harness's own files (`~/.claude/projects`, `~/.codex/sessions`, …) | **No.** They belong to the harness; use its retention settings | + +With summarizer resume off, Codex-only setups summarize through the Claude +Agent SDK. Without Claude configured, set `EPISODIC_MEMORY_SKIP_SUMMARIES=1`. +Summaries are display-only, so search is unaffected. + +## How a secret is recognized + +The engine is [src/redaction.ts](../src/redaction.ts) and the default rules are +[src/redaction-rules.ts](../src/redaction-rules.ts). Each archive line is parsed +as JSON and passes through three layers: + +1. **Shape.** Values whose format gives them away: private keys, JWTs, + provider-prefixed keys, Entra client secrets (`…Q~…`), 88-character Azure + storage keys, SAS `sig=` values. +2. **Key context.** Values with no recognizable format, caught by the name + they're assigned to: `Password=` in a connection string, `"ClientSecret": "…"`, + ``, `{"name": "DB_PASSWORD", "value": "…"}`, + `password: …`. +3. **Field name.** In parsed JSON, any string whose field name is + secret-looking is replaced whole, including tool inputs and MCP results. + +A **secret-looking name** *ends* in `secret`, `password`, `passwd`, +`passphrase`, `apikey`, `accesskey`, `accountkey`, `privatekey`, `token`, +`credential(s)` or a similar key word, in any case and with any separators +(`AzureAd:ClientSecret`, `DB_PASSWORD2`). `TokenEndpoint` and `passwordPolicy` +don't count. Placeholders (`${X}`, `$(X)`, `#{X}#`, `{{x}}`, ``, `%X%`, +`"string"`, `"*****"`) are left alone. + +Git SHAs and GUIDs are allowlisted for the shape rules, so commit hashes and +tenant, client and object IDs stay searchable. Key-context rules ignore the +allowlist: a GUID in a `password` slot is a secret. An entropy fallback exists +but is off by default. + +| Rules | Catch | |---|---| -| `private-key-block` | PEM and OpenSSH private keys, including truncated ones | -| `connection-string-secret` | `AccountKey=`, `SharedAccessKey=`, `SharedAccessSignature=`, `Password=`, `Pwd=` in connection strings, in any case. Only the value is redacted; server, account, and database names stay. | -| `azure-sas-token` | The `sig=` of a SAS URL. The URL and other parameters stay. | -| `jwt` | JWTs, including Entra ID / Azure access tokens | -| `anthropic-api-key`, `openai-api-key`, `github-token`, `aws-access-key-id`, `aws-secret-access-key`, `slack-token`, `google-api-key`, `npm-token` | Provider keys with a recognizable prefix | -| `azure-client-secret` | Entra ID app client secrets (the `…Q~…` format) | -| `azure-storage-key` | Standalone 88-character base64 keys (Storage, Cosmos DB, Function keys) | -| `url-credentials` | The password in `scheme://user:password@host` | -| `bearer-token`, `basic-auth` | `Authorization` header values | -| `azure-keyvault-secret` | The `value` of a Key Vault secret bundle (`az keyvault secret show`, SDK JSON), whatever the secret is named | -| `name-value-secret` | The `value` of a `{"name": , "value": …}` object, in either order: `az webapp`/`functionapp config appsettings list`, Kubernetes `env`, ARM/Bicep parameters | -| `xml-appsettings-secret` | `web.config` / `app.config` ``, either attribute order | -| `xml-secret-element` | `…`, `…` and the like | -| `xml-secret-attribute` | Secret-named XML attributes, e.g. `userPWD="…"` in Azure publish profiles | -| `quoted-secret-assignment` | A **quoted** value assigned to a secret-looking name: `"ClientSecret": "…"` (appsettings.json and any JSON in tool output), `ClientSecret = "…"` (C#), `apiKey: '…'` (JS/YAML/Python). No digit or minimum entropy is required; the value must have no spaces. | -| `secret-assignment` | An **unquoted** value assigned to a secret-looking key: `password: …`, `CLIENT_SECRET=…`. Covers decrypted SOPS, YAML, and dotenv. Needs 8+ characters including a digit, and skips code (`env.X`, `getPassword()`). | -| `secret-field` | Not a text rule: in parsed JSON (transcript lines, structured MCP/tool results, tool inputs), a string whose **field name** is secret-looking, or the `value` of a `{name, value}` pair or Key Vault bundle, is redacted whole. See `secretFields` below. | - -A **secret-looking name** ends in `secret`, `password`, `passwd`, -`passphrase`, `apikey`, `accesskey`, `accountkey`, `privatekey`, `sharedkey`, -`primarykey`, `secondarykey`, `masterkey`, `signingkey`, `subscriptionkey`, -`clientkey`, `encryptionkey`, `token`, or `credential(s)`, in any case and -with any separators (`AzureAd:ClientSecret`, `Stripe__ApiKey`, `DB_PASSWORD2`). -Because it has to *end* in one of these, `TokenEndpoint`, `secretName`, -`passwordPolicy`, `tokenType`, and `maxTokens` don't count. - -Key-context rules leave **placeholders** alone: `${X}`, `$(X)`, `#{X}#` -(Azure DevOps token replacement), `{{x}}`, ``, `%X%`, `__X__`, and type -names or masks like `"string"` and `"*****"`. All other rules skip the same -`${X}`, ``, and `%X%` forms. - -**Allowlisted:** git SHAs and GUIDs are not redacted by shape-based rules, -so tenant, client, object, and subscription IDs and commit hashes stay -searchable. Key-context rules ignore the allowlist on purpose: a GUID in a -`password` slot (older `az ad sp create-for-rbac` output) *is* a secret. - -**Entropy fallback:** off by default. When it's on, a long, high-entropy string -is redacted only if a keyword (`secret`, `key`, `token`, …) appears just before -it in the same text value. - -**SOPS:** decrypted SOPS output drops its `sops:` metadata block, so it has no -reliable shape. It's covered by the value rules plus `secret-assignment`. -Encrypted values (`ENC[AES256_GCM,…]`) are left alone. - -## Configuration - -| Variable | Default | Meaning | -|---|---|---| -| `EPISODIC_MEMORY_REDACTION` | `on` | `off` disables redaction entirely: archive copies become byte-for-byte again, and summaries may resume sessions again. | -| `EPISODIC_MEMORY_REDACTION_RULES` | `/redaction-rules.json` if it exists | Path to a custom rules file. If you set this and the file is missing, that's an error. | -| `EPISODIC_MEMORY_REDACTION_STRICT` | `1` | When the rules fail to load, `1` stops sync, index, and import (exit 1, nothing written). `0` logs a loud warning and continues **unredacted**. | - -`` is `~/.config/superpowers` unless `EPISODIC_MEMORY_CONFIG_DIR`, -`PERSONAL_SUPERPOWERS_DIR`, or `XDG_CONFIG_HOME` say otherwise. - -### Custom rules - -Create `~/.config/superpowers/redaction-rules.json`. By default it extends the -bundled rules: - -```jsonc -{ - // Add rules (a rule with a default's id replaces that default) - "rules": [ - { - "id": "contoso-api-key", // lowercase, digits, dashes - "pattern": "\\bctso_[A-Za-z0-9]{32}\\b", // JavaScript regex - "flags": "i", // optional, any of "imsu" - "keywords": ["ctso_"], // optional prefilter (case-insensitive) - "secretGroup": 0, // optional: redact only this group ([1, 2] = first that matched) - "useAllowlist": true // optional: false = redact even SHA/GUID-shaped values - } - ], - "disableRules": ["basic-auth"], // turn off defaults by id - "allowlist": [ // full-match patterns that are never redacted - { "id": "build-ids", "pattern": "build-[0-9]{8}" } - ], - "entropy": { "enabled": true }, // partial override of the entropy settings - "secretFields": { // field-name context in parsed JSON - "enabled": true, - // matched against the END of the key lowercased with separators removed; - // this example adds "connectionstring" to redact whole connection strings - "keyPattern": "secret|password|passwd|userpwd|passphrase|apikey|accesskey|accountkey|privatekey|sharedkey|primarykey|secondarykey|masterkey|signingkey|subscriptionkey|clientkey|encryptionkey|token|credentials?|connectionstring" - }, - "includeDefaults": true // false = use only this file's rules -} -``` - -Every rule is validated when it loads. An invalid regex, a bad id, a pattern -that matches the empty string, or a `secretGroup` that doesn't exist is a -rules-load failure, which strict mode treats as fatal. To try rules out: - -```bash -echo 'password: hunter2hunter2' | episodic-memory redact --stdin -# password: [REDACTED:secret-assignment] -# 1 value(s) redacted (secret-assignment: 1) (stderr) -``` +| `private-key-block`, `jwt`, `anthropic-api-key`, `openai-api-key`, `github-token`, `aws-access-key-id`, `aws-secret-access-key`, `slack-token`, `google-api-key`, `npm-token`, `azure-client-secret`, `azure-storage-key`, `azure-sas-token` | Shape | +| `connection-string-secret` | `AccountKey=`, `SharedAccessKey=`, `Password=`, `Pwd=` and similar in connection strings, any case | +| `url-credentials`, `bearer-token`, `basic-auth` | `scheme://user:password@host`, `Authorization` headers | +| `azure-keyvault-secret`, `name-value-secret` | Key Vault bundles; `{name, value}` pairs (`az … appsettings list`, Kubernetes `env`, ARM parameters) | +| `xml-appsettings-secret`, `xml-secret-element`, `xml-secret-attribute` | `web.config`, `…`, publish-profile `userPWD="…"` | +| `quoted-secret-assignment` | `"ClientSecret": "…"`, `ClientSecret = "…"`, `apiKey: '…'`; no spaces in the value | +| `secret-assignment` | `password: …`, `CLIENT_SECRET=…` (YAML, dotenv, decrypted SOPS); 8+ characters with a digit, code like `env.X` skipped | +| `secret-field` | Layer 3: a secret-named JSON field, replaced whole | + +`episodic-memory redact --print-default-rules` prints the full definitions. + +## Guarantees + +- **Fails closed.** In strict mode (the default), sync, index, `index repair` + and import stop if the rules can't load. +- **Idempotent.** Tokens never match again. When a match runs into an existing + token, only the text outside it is redacted, so re-running after adding a + rule is safe. +- **Structure-preserving.** One output line per input line, valid JSON stays + valid, and lines with no secrets stay byte-for-byte identical. Index line + ranges and MCP `read` ranges stay correct. Archive copies keep the source + file's permissions. +- **Values are never printed.** Logs and reports name rules and counts; the + review report adds the value's shape, never the value. ## Cleaning up existing data -New syncs only redact new or changed files. To redact everything indexed -before you upgraded, or after you add a rule: +New syncs redact what they copy. To redact what was archived and indexed +before, or after you add a rule: ```bash -episodic-memory redact --rewrite --dry-run # report what would change -episodic-memory redact --rewrite --dry-run --report # list each hit to review +episodic-memory redact --rewrite --dry-run # what would change; writes nothing +episodic-memory redact --rewrite --dry-run --report # each hit, to check for false positives episodic-memory redact --rewrite # apply ``` -A dry run writes nothing, not even a schema migration: it opens the index +`--rewrite` ([src/redact-rewrite.ts](../src/redact-rewrite.ts)) redacts the +archive, the staging exports and the index in place, re-embeds only the rows +that changed, and deletes summaries built from unredacted text so the next +sync regenerates them. It takes the sync lock. A dry run opens the index read-only. -`--report` lists every value the rewrite would redact, so you can check for -false positives before applying. Each hit shows where it is, the rule, the -value's shape, and the redacted text around it. The value itself is never -printed: +`--report` prints one hit per value: -``` +```text -work-contoso/4f1c….jsonl:212 quoted-secret-assignment len=40 aA9- H=4.9 …"AzureAd": { "ClientId": "…", "ClientSecret": "[REDACTED:quoted-secret-assignment]", "TenantId… ``` -The shape is the length, the character classes (`a` lowercase, `A` uppercase, -`9` digits, `-` symbols, `_` whitespace) and the Shannon entropy in bits per -character. A random key is long with high entropy (about 4.5 or more); a word or -a placeholder is short or low. If a rule fires on something that isn't a secret, -turn it off or narrow it in `redaction-rules.json`. - -`--rewrite`: - -- redacts every archive file in place, keeping line numbers and timestamps -- redacts the opencode and Cursor staging exports in place -- redacts every index row in place and re-embeds only the rows that changed -- deletes summaries that were generated from unredacted text, so the next - sync regenerates them from the redacted archive - -It takes the same lock as `sync`, so it won't run while a sync is in progress. -Running it twice is safe: the second run finds nothing to change. - -Before your first sync with this version, consider a one-time scan of your -existing `~/.claude/projects` history. Those source files are never modified. - -## How it works - -The hook point is the copy into the archive. Every harness (Claude Code, -Codex, Cursor, opencode, OMP) passes through that copy, and every later stage -reads the archive rather than the source. The design and the research behind -it are in [redaction/PHASE0-FINDINGS.md](redaction/PHASE0-FINDINGS.md). - -Each archive line is parsed as JSON. Every string value goes through the text -rules, values are redacted whole when their field name marks them as secrets -(`secretFields`), and a key that is itself a secret is renamed to its token. -Only lines that changed are re-serialized. Lines with no secrets stay byte-for-byte -identical. The archive keeps exactly one line per source line, so index line -ranges and MCP `read` ranges still line up. A line that isn't valid JSON (for -example, a half-written last line) is redacted as plain text. - -## Limitations - -- Pattern rules miss secrets that have no recognizable shape and no - `key: value` context. The entropy fallback helps when it's on, but recall - isn't perfect. -- A secret-looking name is required for the key-context rules. A setting - named `Stripe` or `ConnectionStrings__Default` with a shapeless value is - only caught if a shape rule matches the value. Connection strings are - handled by `connection-string-secret`, which keeps server names searchable. - Add your own names via `secretFields.keyPattern` or a custom rule. -- Quoted values containing spaces (multi-word passphrases) aren't caught by - `quoted-secret-assignment`. The rule excludes them so that UI labels like - `ErrorMessage = "Invalid password"` aren't redacted. -- Positional secrets in code (`new ClientSecretCredential(t, c, "…")`) are - caught only by shape, e.g. `azure-client-secret`. -- On lines that get redacted, re-serializing can change number formatting for - integers above 2^53. No supported harness writes such numbers. +The shape is the length, the character classes (`a` lower, `A` upper, `9` +digits, `-` symbols, `_` spaces) and the entropy in bits per character. A +random key is long with entropy around 4.5 or more; a word or placeholder is +short or low. + +## Configuration + +| Variable | Default | Meaning | +|---|---|---| +| `EPISODIC_MEMORY_REDACTION` | `on` | `off` turns redaction off: byte-for-byte archive copies, summarizer resume allowed | +| `EPISODIC_MEMORY_REDACTION_RULES` | `/redaction-rules.json` if present | Custom rules file; a missing file you named is an error | +| `EPISODIC_MEMORY_REDACTION_STRICT` | `1` | `0` continues **unredacted**, with a warning, when the rules fail to load | + +Custom rules extend the defaults: + +```jsonc +{ + "rules": [ // a rule with a default's id replaces it + { "id": "contoso-api-key", "pattern": "\\bctso_[A-Za-z0-9]{32}\\b", "keywords": ["ctso_"] } + ], + "disableRules": ["basic-auth"], + "allowlist": [{ "id": "build-ids", "pattern": "build-[0-9]{8}" }], + "entropy": { "enabled": true }, + "secretFields": { "keyPattern": "secret|password|token|credentials?|connectionstring" }, + "includeDefaults": true +} +``` + +A rule can also set `flags` (`imsu`), `secretGroup` (redact only that capture +group) and `useAllowlist: false`. Every rule is validated on load; an invalid +one is a load failure, which strict mode treats as fatal. Try rules with +`echo 'password: hunter2hunter2' | episodic-memory redact --stdin`. + +## Limits + +This is pattern and context matching, not named-entity recognition: a value +is caught by its format, by the name it's assigned to, or by the field it's +in. That covers how secrets reach transcripts in practice (pasted config, CLI +output, connection strings, tool results), and it is deterministic, cheap +enough for every line of every sync, and each token names the rule that fired. +What it misses: + +- A secret in prose with no name or shape: "the password is hunter2". +- An unquoted letters-only value (`password: hunter`): `secret-assignment` + needs a digit so ordinary English doesn't trigger it. +- Code-like values (`config.password`, `getPassword()`), skipped on purpose. +- Quoted values with spaces, so UI strings like `"Invalid password"` survive. +- Settings with a shapeless value and a name that isn't secret-looking + (`Stripe`, `ConnectionStrings__Default`). Add the name to + `secretFields.keyPattern` or write a rule. + +The entropy fallback narrows some of these gaps, at the cost of false +positives. diff --git a/docs/redaction/PHASE0-FINDINGS.md b/docs/redaction/PHASE0-FINDINGS.md deleted file mode 100644 index d73e34eb..00000000 --- a/docs/redaction/PHASE0-FINDINGS.md +++ /dev/null @@ -1,184 +0,0 @@ -# Redaction — Phase 0 findings - -Research note for the inline secret redaction fork. Read-only survey of -`src/`, `cli/`, and `hooks/` at upstream `7e06519` (v1.6.0 + fixes). This -note answers the six Phase 0 questions and records the choke-point decision. - -## Pipeline as it exists today - -``` -SessionStart hook (hooks/hooks.json) - └─ cli/episodic-memory.js sync --background - └─ dist/sync-cli.js - ├─ exportOpencodeSessions() opencode.db → /opencode-transcripts/*.jsonl - └─ syncConversations(src, archive) for each source dir - ├─ copyIfNewer(src → archive) byte-for-byte copy - ├─ parseConversation(archive) → exchanges - │ ├─ generateExchangeEmbedding(user, assistant, toolNames) - │ └─ insertExchange() → SQLite exchanges + tool_calls + vec_exchanges - └─ summarizeConversation(exchanges, sessionId) → -summary.txt - -episodic-memory index (cli/index-conversations.js → dist/index-cli.js → indexer.ts) - └─ copyFileSync(src → archive), parseConversation(**src**), embed, insert, summarize - -episodic-memory import-cursor-history (cursor-legacy.ts) - └─ state.vscdb → /cursor-legacy-export/*.jsonl (a sync source dir) - -episodic-memory index --repair (verify.ts) parses archive files, re-embeds, re-summarizes -``` - -## Answers - -### 1. Where does sync copy into the archive? Byte-for-byte or parsed first? - -Byte-for-byte. `copyIfNewer()` in `src/sync.ts` does `fs.copyFileSync` to -`.tmp.` then `renameSync`, then stamps the source mtime on the -destination (the mtime is the "is the archive current?" check on the next -run). Parsing happens **after** the copy, and in `sync.ts` it parses the -archive file, not the source. - -There are three more copy sites, all in `src/indexer.ts` -(`indexConversations`, `indexSession`, `indexUnprocessed`). They also use -`fs.copyFileSync`, but they **parse the source path**, not the archive. That -matters: redacting the archive copy alone would not reach the index on the -`episodic-memory index` path. - -### 2. One shared parse path or one per source? - -One entry point, `parseConversation()` in `src/parser.ts`. It sniffs the file -and dispatches to one of five per-harness parsers (Claude, Codex, Cursor, -opencode, OMP). More important for redaction: every harness reaches the -archive through the same copy step. opencode and legacy Cursor are first -exported from their SQLite stores into staging JSONL directories under the -plugin's config dir (`opencode-transcripts/`, `cursor-legacy-export/`), and -those staging directories are then ordinary sync sources. - -The staging exports are plugin-owned plaintext copies outside any harness's -own retention, so they count as a fourth sink even though the spec's table -doesn't list them. - -### 3. Where is exchange text written to SQLite, and where is the embedding input built? - -- `insertExchange()` in `src/db.ts` writes `exchanges.user_message`, - `exchanges.assistant_message`, `tool_calls.tool_input` (JSON-stringified - tool input), and `tool_calls.tool_result`. Text search (`search.ts`) runs - `LIKE` over `user_message`/`assistant_message`. -- Embedding input is `generateExchangeEmbedding(userMessage, assistantMessage, - toolNames)` in `src/embeddings.ts`, called from `sync.ts`, `indexer.ts`, - `verify.ts`, and `embedding-migration.ts`. The migration re-embeds from the - **SQLite rows**, so it inherits whatever text is already stored. - -All of these are built from the parsed `ConversationExchange` objects, so a -clean parse input gives clean SQLite text and clean embedding input. - -### 4. Where does the summarizer get its input? - -Usually from the parsed exchanges (`formatConversationText(exchanges)`), and -`sync.ts` parses those from the archive. **But two paths bypass the archive -entirely:** - -- **Claude session resume.** For Claude conversations with at most 15 - exchanges, `summarizeConversation()` calls the Agent SDK with - `resume: sessionId`. The SDK loads the **source** transcript from - `~/.claude/projects/...` and sends it to the model. The prompt carries no - transcript text on this path. -- **Codex fork.** For Codex conversations, `callCodex()` runs - `thread/fork` on the **source** rollout via `codex app-server`. Note that - `getCodexSessionId()` derives the id from the exchanges when no - `sessionId` is passed, so passing `undefined` is not enough to stop it. - -Both paths send unredacted source content to a model endpoint no matter what -the archive holds. Redaction therefore has to turn resume and fork off and -force the transcript-text path, which is built from redacted exchanges. - -### 5. How does the `DO NOT INDEX THIS CHAT` marker work? - -`shouldSkipConversation()` in `src/sync.ts` streams a file in 1 MiB chunks -and looks for any of three markers. If the read fails, it fails closed -(skips the file). Sync calls it on the **archive** path, after the copy, to -gate both indexing and summary queueing. So an excluded conversation is -still copied to the archive; only the index and the summarizer skip it. - -The hint holds: the archive file is the reference that every downstream -stage of `sync` reads. The marker check sits right after the archive write, -and that is where the redaction hook belongs. - -### 6. Must the archive stay valid harness JSONL? - -Yes, on two counts: - -- **Structure.** `show.ts` (CLI `show`, MCP `read`) runs `JSON.parse` on every - line, and one invalid line throws. Harness detection in both `parser.ts` - and `show.ts` keys off line shapes (`type`, `payload`, `role`, ...). -- **Line numbers.** `exchanges.line_start`/`line_end` index into archive lines. - MCP `read` takes `startLine`/`endLine`, and incremental indexing resumes - from `MAX(line_end)` (#152). Redaction must keep **exactly one output line - per input line**. - -So redaction parses each line as JSON, redacts string values, and -re-serializes only the lines that changed. Unchanged lines stay -byte-identical. A line that isn't valid JSON (for example, a partially -written last line) is redacted as raw text, because it was already invalid. - -## Decision: choke point (b), the archive write - -Option (a) doesn't exist. No single function sees every source *before* the -archive write. The only place every harness converges is the copy into the -archive itself. - -So the hook goes at the **archive write**, which becomes a redacting copy -(`copyFileRedacted()` in `src/redaction.ts`), and every downstream stage -reads from the archive. Three supporting changes are needed to make -"downstream reads the archive" actually true: - -1. **`indexer.ts` parses the archive, not the source.** All three copy sites - switch to the redacting copy. They now refresh the archive when the source - is newer, as `sync` already does, so parsing the archive loses no data. -2. **Summarizer resume and fork are disabled while redaction is active.** - `summarizeConversation()` gains an `allowResume` option. `sync.ts`, - `indexer.ts`, and `verify.ts` pass `allowResume: false` when a redactor is - active, which forces the transcript-text path built from redacted - exchanges. Trade-off: Codex-only users then summarize through the Claude - transcript path. If no Claude auth is available, that writes a retryable - error sentinel. `EPISODIC_MEMORY_SKIP_SUMMARIES=1` turns summaries off - entirely. -3. **Staging exports are redacted at write time.** The opencode export - (`opencode-sync.ts`) and the Cursor legacy export (`cursor-legacy.ts`) run - each JSONL line through the same `redactJsonlLine()` before writing. They - are plugin-owned copies, and the archive hook alone would leave a - plaintext copy beside it. - -Everything else (SQLite text, `tool_calls`, embeddings, summaries, `show`, -MCP `read`, embedding migration) reads the archive or the rows built from -it, so it inherits clean text with no further hooks. - -## SOPS - -Decrypted SOPS output (`sops -d`, `sops exec-env`) **drops** the `sops:` -metadata block and comes out as plain YAML, JSON, or dotenv. Its shape is -not reliable. There is no dedicated SOPS rule. Coverage comes from the -value-level rules (storage keys, client secrets, connection strings, private -keys) plus the keyword-assignment rule (`password: ...`, `client_secret=...`). -Encrypted values (`ENC[AES256_GCM,data:...]`) are left alone because they -are safe to keep. - -## Windows - -The redaction code is pure Node `fs` plus regex, and it adds no native -dependencies. The temp-file-and-rename pattern already runs on Windows in -upstream `copyIfNewer`. I could **not** verify sqlite-vec or Transformers.js -on Windows from this Linux container. That is unchanged upstream surface, -and it still needs a manual check on a Windows host before rollout. - -## Other observations - -- `embedding-migration.ts` re-embeds from SQLite text. After a - `redact --rewrite` cleans the rows, the migration can't reintroduce - secrets. -- The summarizer's `SummarizerSdkError` keeps up to 300 characters of the - SDK's `result` text in logs and error sentinels. If a model ever echoed a - secret, it would land there. Feeding the summarizer redacted input removes - that source. -- `verify.ts --repair` re-summarizes without a `sessionId`, but the Codex fork - still fires through `getCodexSessionId()`'s fallback. It needs - `allowResume: false` too. diff --git a/src/cursor-legacy.ts b/src/cursor-legacy.ts index 8c91897f..e37366b1 100644 --- a/src/cursor-legacy.ts +++ b/src/cursor-legacy.ts @@ -272,7 +272,7 @@ export function importCursorLegacy(options: CursorLegacyImportOptions): CursorLe ? lines.map(line => JSON.stringify({ ...JSON.parse(line), cwd })) : lines; // The export dir is a plugin-owned plaintext copy, so redact it at - // write time like the archive (docs/redaction/PHASE0-FINDINGS.md). + // write time like the archive (docs/REDACTION.md). const finalLines = redactor ? withCwd.map(line => redactJsonlLine(line, redactor, { source: 'cursor-legacy', path: outFile })) : withCwd; diff --git a/src/opencode-sync.ts b/src/opencode-sync.ts index 60dae458..eca6876c 100644 --- a/src/opencode-sync.ts +++ b/src/opencode-sync.ts @@ -176,7 +176,7 @@ function writeSessionTranscript( } // The staging transcript is a plugin-owned plaintext copy, so redact it at - // write time like the archive (docs/redaction/PHASE0-FINDINGS.md). + // write time like the archive (docs/REDACTION.md). const output = redactor ? lines.map(line => redactJsonlLine(line, redactor, { source: 'opencode', path: filePath })) : lines; diff --git a/src/redaction.ts b/src/redaction.ts index 1411650d..999f0136 100644 --- a/src/redaction.ts +++ b/src/redaction.ts @@ -9,7 +9,7 @@ import { DEFAULT_REDACTION_CONFIG } from './redaction-rules.js'; * * Secrets are replaced with typed tokens (`[REDACTED:]`) at the archive * write, the one point every harness's transcripts pass through (see - * docs/redaction/PHASE0-FINDINGS.md). Everything downstream (SQLite text, + * docs/REDACTION.md). Everything downstream (SQLite text, * tool_calls, embeddings, summaries, show/read) reads the archive, so it only * ever sees redacted text. * diff --git a/src/summarizer.ts b/src/summarizer.ts index 23b0f31d..801f3743 100644 --- a/src/summarizer.ts +++ b/src/summarizer.ts @@ -707,7 +707,7 @@ export interface SummarizeOptions { * Allow Claude session resume and Codex thread/fork (default true). Both * paths make the model read the *source* transcript rather than `exchanges`, * so callers pass false when the exchanges were redacted (see - * docs/redaction/PHASE0-FINDINGS.md) to force the transcript-text path. + * docs/REDACTION.md) to force the transcript-text path. */ allowResume?: boolean; } From a8eadb5e35a0524201a75c709ee25c1a3282a029 Mon Sep 17 00:00:00 2001 From: HengYang Date: Sun, 11 Oct 2026 07:53:54 +0800 Subject: [PATCH 26/33] fix(codex): bound isolated summary process shutdown --- dist/summarizer.js | 11 +++++ src/summarizer.ts | 10 +++++ test/codex-summary-routing.test.ts | 65 +++++++++++++++++++++++++++++- 3 files changed, 84 insertions(+), 2 deletions(-) diff --git a/dist/summarizer.js b/dist/summarizer.js index 2ffac728..9a73c134 100644 --- a/dist/summarizer.js +++ b/dist/summarizer.js @@ -405,6 +405,7 @@ async function callClaude(prompt, sessionId, useFallback = false, cwd) { } return result; } +const CODEX_SUMMARY_TERMINATION_GRACE_MS = 1024; function appServerTimeoutMs() { const configured = Number(process.env.EPISODIC_MEMORY_CODEX_SUMMARY_TIMEOUT_MS); return Number.isFinite(configured) && configured > 0 ? configured : 120000; @@ -480,6 +481,7 @@ export async function runCodexCommand(command) { let finished = false; let terminalOutcome; let timeout; + let terminationTimeout; const pending = new Map(); const lines = createInterface({ input: child.stdout }); child.stderr.on('data', chunk => { @@ -493,6 +495,13 @@ export async function runCodexCommand(command) { if (!child.killed) { child.kill('SIGTERM'); } + if (command.isolated && child.exitCode === null && child.signalCode === null) { + // Bound shutdown without removing the owned directory before close. + terminationTimeout = setTimeout(() => { + if (child.exitCode === null && child.signalCode === null) + child.kill('SIGKILL'); + }, CODEX_SUMMARY_TERMINATION_GRACE_MS); + } }; const finish = (error, result = '') => { if (finished) @@ -579,6 +588,8 @@ export async function runCodexCommand(command) { } }); child.on('close', () => { + if (terminationTimeout) + clearTimeout(terminationTimeout); if (!command.isolated) return; try { diff --git a/src/summarizer.ts b/src/summarizer.ts index a0d308c9..8ef8c59c 100644 --- a/src/summarizer.ts +++ b/src/summarizer.ts @@ -466,6 +466,8 @@ interface PendingAppServerRequest { reject: (error: Error) => void; } +const CODEX_SUMMARY_TERMINATION_GRACE_MS = 1024; + function appServerTimeoutMs(): number { const configured = Number(process.env.EPISODIC_MEMORY_CODEX_SUMMARY_TIMEOUT_MS); return Number.isFinite(configured) && configured > 0 ? configured : 120000; @@ -548,6 +550,7 @@ export async function runCodexCommand(command: CodexSummarizerCommand): Promise< let finished = false; let terminalOutcome: { error?: Error; result: string } | undefined; let timeout: NodeJS.Timeout | undefined; + let terminationTimeout: NodeJS.Timeout | undefined; const pending = new Map(); const lines = createInterface({ input: child.stdout }); @@ -563,6 +566,12 @@ export async function runCodexCommand(command: CodexSummarizerCommand): Promise< if (!child.killed) { child.kill('SIGTERM'); } + if (command.isolated && child.exitCode === null && child.signalCode === null) { + // Bound shutdown without removing the owned directory before close. + terminationTimeout = setTimeout(() => { + if (child.exitCode === null && child.signalCode === null) child.kill('SIGKILL'); + }, CODEX_SUMMARY_TERMINATION_GRACE_MS); + } }; const finish = (error: Error | undefined, result = '') => { @@ -657,6 +666,7 @@ export async function runCodexCommand(command: CodexSummarizerCommand): Promise< } }); child.on('close', () => { + if (terminationTimeout) clearTimeout(terminationTimeout); if (!command.isolated) return; try { if (summaryCwd) fs.rmSync(summaryCwd, { recursive: true, force: true }); diff --git a/test/codex-summary-routing.test.ts b/test/codex-summary-routing.test.ts index 8daea696..52f9bd70 100644 --- a/test/codex-summary-routing.test.ts +++ b/test/codex-summary-routing.test.ts @@ -27,7 +27,10 @@ function exchange(sessionId?: string): ConversationExchange { }; } -function installFakeCodex(failMethod?: 'thread/start' | 'thread/fork'): void { +function installFakeCodex( + failMethod?: 'thread/start' | 'thread/fork', + options: { ignoreSigterm?: boolean; stalledTurn?: boolean } = {}, +): void { const executable = path.join(testDir, 'fake-codex'); fs.writeFileSync(executable, `#!/usr/bin/env node const readline = require('node:readline'); @@ -36,6 +39,13 @@ if (process.argv.includes('--version')) { process.exit(0); } if (!process.argv.includes('app-server')) process.exit(2); +if (${options.ignoreSigterm === true}) { + const fs = require('node:fs'); + fs.writeFileSync(${JSON.stringify(path.join(testDir, 'summary-process.json'))}, JSON.stringify({ pid: process.pid, cwd: process.cwd() })); + process.on('SIGTERM', () => { + fs.writeFileSync(${JSON.stringify(path.join(testDir, 'termination-requested'))}, 'SIGTERM'); + }); +} const emit = value => process.stdout.write(JSON.stringify(value) + '\\n'); readline.createInterface({ input: process.stdin }).on('line', line => { const message = JSON.parse(line); @@ -43,7 +53,13 @@ readline.createInterface({ input: process.stdin }).on('line', line => { if (message.method === 'config/read') emit({ id: message.id, result: { config: { mcp_servers: {} } } }); if (message.method === 'skills/list') emit({ id: message.id, result: { data: [{ skills: [], errors: [] }] } }); if (message.method === 'thread/start') { - if (${failMethod === 'thread/start'}) process.exit(7); + if (${failMethod === 'thread/start'}) { + if (${options.ignoreSigterm === true}) { + emit({ id: message.id, error: { message: 'EXCLUDED_PUBLIC_FIXTURE' } }); + return; + } + process.exit(7); + } const params = message.params; if (!params.ephemeral || params.threadId || params.sandbox !== 'read-only' || params.allowProviderModelFallback !== false || !params.cwd) process.exit(8); @@ -55,6 +71,7 @@ readline.createInterface({ input: process.stdin }).on('line', line => { emit({ id: message.id, result: { thread: { id: 'forked-summary' } } }); } if (message.method === 'turn/start') { + if (${options.stalledTurn === true}) return; const prompt = message.params.input[0].text; if (message.params.threadId === 'ephemeral-summary' && (!prompt.includes('synthetic Codex conversation') || !prompt.includes('isolated local app-server fixture'))) process.exit(10); @@ -86,6 +103,50 @@ afterEach(() => { }); describe('Codex summary provider ownership', () => { + it.skipIf(process.platform === 'win32').each(['completed', 'failed', 'timed out'] as const)( + 'terminates a SIGTERM-resistant isolated summary after the turn %s', + async status => { + installFakeCodex(status === 'failed' ? 'thread/start' : undefined, { + ignoreSigterm: true, + stalledTurn: status === 'timed out', + }); + if (status === 'timed out') process.env.EPISODIC_MEMORY_CODEX_SUMMARY_TIMEOUT_MS = '256'; + let settled = false; + const outcome = summarizeConversation([exchange()]).then( + result => { settled = true; return { status: 'resolved' as const, result }; }, + error => { settled = true; return { status: 'rejected' as const, error }; }, + ); + let deadline: NodeJS.Timeout | undefined; + const expired = new Promise<{ status: 'expired' }>(resolve => { + deadline = setTimeout(() => resolve({ status: 'expired' }), 5000); + }); + + try { + const result = await Promise.race([outcome, expired]); + expect(result.status).toBe(status === 'completed' ? 'resolved' : 'rejected'); + if (result.status === 'resolved') { + expect(result.result).toBe('Codex kept provider ownership.'); + } else if (result.status === 'rejected') { + expect(result.error.message).toBe('Isolated Codex summary failed; provider details suppressed'); + } + const child = JSON.parse(fs.readFileSync(path.join(testDir, 'summary-process.json'), 'utf8')); + expect(fs.existsSync(path.join(testDir, 'termination-requested'))).toBe(true); + expect(fs.existsSync(child.cwd)).toBe(false); + expect(() => process.kill(child.pid, 0)).toThrow(); + expect(query).not.toHaveBeenCalled(); + } finally { + if (deadline) clearTimeout(deadline); + const marker = path.join(testDir, 'summary-process.json'); + if (!settled && fs.existsSync(marker)) { + const child = JSON.parse(fs.readFileSync(marker, 'utf8')); + try { process.kill(child.pid, 'SIGKILL'); } catch {} + await outcome; + fs.rmSync(child.cwd, { recursive: true, force: true }); + } + } + }, + ); + it('summarizes a sessionless Codex transcript in an isolated ephemeral Codex thread', async () => { installFakeCodex(); From ab29746447333ab3755a961713b75e454386556e Mon Sep 17 00:00:00 2001 From: HengYang Date: Sun, 11 Oct 2026 10:46:28 +0800 Subject: [PATCH 27/33] chore: keep unchanged MCP bundle in verifier fix --- dist/mcp-server.js | 6856 ++++---------------------------------------- 1 file changed, 620 insertions(+), 6236 deletions(-) diff --git a/dist/mcp-server.js b/dist/mcp-server.js index 5ea6dcfa..e3a9adac 100644 --- a/dist/mcp-server.js +++ b/dist/mcp-server.js @@ -6,11 +6,7 @@ var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { - try { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - } catch (e) { - throw mod = 0, e; - } + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) @@ -33,9 +29,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge mod )); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js +// node_modules/ajv/dist/compile/codegen/code.js var require_code = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "node_modules/ajv/dist/compile/codegen/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; @@ -187,9 +183,9 @@ var require_code = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js +// node_modules/ajv/dist/compile/codegen/scope.js var require_scope = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "node_modules/ajv/dist/compile/codegen/scope.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; @@ -332,9 +328,9 @@ var require_scope = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js +// node_modules/ajv/dist/compile/codegen/index.js var require_codegen = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "node_modules/ajv/dist/compile/codegen/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; @@ -1052,9 +1048,9 @@ var require_codegen = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js +// node_modules/ajv/dist/compile/util.js var require_util = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js"(exports) { + "node_modules/ajv/dist/compile/util.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; @@ -1219,9 +1215,9 @@ var require_util = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js +// node_modules/ajv/dist/compile/names.js var require_names = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js"(exports) { + "node_modules/ajv/dist/compile/names.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -1258,9 +1254,9 @@ var require_names = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js +// node_modules/ajv/dist/compile/errors.js var require_errors = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js"(exports) { + "node_modules/ajv/dist/compile/errors.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; @@ -1380,9 +1376,9 @@ var require_errors = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js +// node_modules/ajv/dist/compile/validate/boolSchema.js var require_boolSchema = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; @@ -1431,9 +1427,9 @@ var require_boolSchema = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js +// node_modules/ajv/dist/compile/rules.js var require_rules = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js"(exports) { + "node_modules/ajv/dist/compile/rules.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getRules = exports.isJSONType = void 0; @@ -1462,9 +1458,9 @@ var require_rules = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js +// node_modules/ajv/dist/compile/validate/applicability.js var require_applicability = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "node_modules/ajv/dist/compile/validate/applicability.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; @@ -1485,9 +1481,9 @@ var require_applicability = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js +// node_modules/ajv/dist/compile/validate/dataType.js var require_dataType = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "node_modules/ajv/dist/compile/validate/dataType.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; @@ -1669,9 +1665,9 @@ var require_dataType = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js +// node_modules/ajv/dist/compile/validate/defaults.js var require_defaults = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "node_modules/ajv/dist/compile/validate/defaults.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.assignDefaults = void 0; @@ -1706,9 +1702,9 @@ var require_defaults = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js +// node_modules/ajv/dist/vocabularies/code.js var require_code2 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js"(exports) { + "node_modules/ajv/dist/vocabularies/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; @@ -1779,13 +1775,13 @@ var require_code2 = __commonJS({ exports.callValidateCode = callValidateCode; var newRegExp = (0, codegen_1._)`new RegExp`; function usePattern({ gen, it: { opts } }, pattern) { - const u = opts.unicodeRegExp ? "u" : ""; + const u3 = opts.unicodeRegExp ? "u" : ""; const { regExp } = opts.code; - const rx = regExp(pattern, u); + const rx = regExp(pattern, u3); return gen.scopeValue("pattern", { key: rx.toString(), ref: rx, - code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u3})` }); } exports.usePattern = usePattern; @@ -1839,9 +1835,9 @@ var require_code2 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js +// node_modules/ajv/dist/compile/validate/keyword.js var require_keyword = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "node_modules/ajv/dist/compile/validate/keyword.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; @@ -1957,9 +1953,9 @@ var require_keyword = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js +// node_modules/ajv/dist/compile/validate/subschema.js var require_subschema = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "node_modules/ajv/dist/compile/validate/subschema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; @@ -2163,9 +2159,9 @@ var require_json_schema_traverse = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js +// node_modules/ajv/dist/compile/resolve.js var require_resolve = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js"(exports) { + "node_modules/ajv/dist/compile/resolve.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; @@ -2319,9 +2315,9 @@ var require_resolve = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js +// node_modules/ajv/dist/compile/validate/index.js var require_validate = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js"(exports) { + "node_modules/ajv/dist/compile/validate/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; @@ -2827,9 +2823,9 @@ var require_validate = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js +// node_modules/ajv/dist/runtime/validation_error.js var require_validation_error = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "node_modules/ajv/dist/runtime/validation_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ValidationError = class extends Error { @@ -2843,9 +2839,9 @@ var require_validation_error = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js +// node_modules/ajv/dist/compile/ref_error.js var require_ref_error = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js"(exports) { + "node_modules/ajv/dist/compile/ref_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var resolve_1 = require_resolve(); @@ -2860,9 +2856,9 @@ var require_ref_error = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js +// node_modules/ajv/dist/compile/index.js var require_compile = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js"(exports) { + "node_modules/ajv/dist/compile/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; @@ -3084,9 +3080,9 @@ var require_compile = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json +// node_modules/ajv/dist/refs/data.json var require_data = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json"(exports, module) { + "node_modules/ajv/dist/refs/data.json"(exports, module) { module.exports = { $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", @@ -4221,9 +4217,9 @@ var require_fast_uri = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js +// node_modules/ajv/dist/runtime/uri.js var require_uri = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js"(exports) { + "node_modules/ajv/dist/runtime/uri.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var uri = require_fast_uri(); @@ -4232,9 +4228,9 @@ var require_uri = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js +// node_modules/ajv/dist/core.js var require_core = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js"(exports) { + "node_modules/ajv/dist/core.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; @@ -4843,9 +4839,9 @@ var require_core = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js +// node_modules/ajv/dist/vocabularies/core/id.js var require_id = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "node_modules/ajv/dist/vocabularies/core/id.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var def = { @@ -4858,9 +4854,9 @@ var require_id = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js +// node_modules/ajv/dist/vocabularies/core/ref.js var require_ref = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.callRef = exports.getValidate = void 0; @@ -4980,9 +4976,9 @@ var require_ref = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js +// node_modules/ajv/dist/vocabularies/core/index.js var require_core2 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/core/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var id_1 = require_id(); @@ -5001,9 +4997,9 @@ var require_core2 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +// node_modules/ajv/dist/vocabularies/validation/limitNumber.js var require_limitNumber = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5033,9 +5029,9 @@ var require_limitNumber = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +// node_modules/ajv/dist/vocabularies/validation/multipleOf.js var require_multipleOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5061,9 +5057,9 @@ var require_multipleOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js +// node_modules/ajv/dist/runtime/ucs2length.js var require_ucs2length = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "node_modules/ajv/dist/runtime/ucs2length.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function ucs2length(str) { @@ -5087,9 +5083,9 @@ var require_ucs2length = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js +// node_modules/ajv/dist/vocabularies/validation/limitLength.js var require_limitLength = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5119,9 +5115,9 @@ var require_limitLength = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js +// node_modules/ajv/dist/vocabularies/validation/pattern.js var require_pattern = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5139,12 +5135,12 @@ var require_pattern = __commonJS({ error: error61, code(cxt) { const { gen, data, $data, schema, schemaCode, it } = cxt; - const u = it.opts.unicodeRegExp ? "u" : ""; + const u3 = it.opts.unicodeRegExp ? "u" : ""; if ($data) { const { regExp } = it.opts.code; const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); const valid = gen.let("valid"); - gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u3}).test(${data})`), () => gen.assign(valid, false)); cxt.fail$data((0, codegen_1._)`!${valid}`); } else { const regExp = (0, code_1.usePattern)(cxt, schema); @@ -5156,9 +5152,9 @@ var require_pattern = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +// node_modules/ajv/dist/vocabularies/validation/limitProperties.js var require_limitProperties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5185,9 +5181,9 @@ var require_limitProperties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js +// node_modules/ajv/dist/vocabularies/validation/required.js var require_required = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5267,9 +5263,9 @@ var require_required = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js +// node_modules/ajv/dist/vocabularies/validation/limitItems.js var require_limitItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5296,9 +5292,9 @@ var require_limitItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js +// node_modules/ajv/dist/runtime/equal.js var require_equal = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js"(exports) { + "node_modules/ajv/dist/runtime/equal.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var equal = require_fast_deep_equal(); @@ -5307,9 +5303,9 @@ var require_equal = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +// node_modules/ajv/dist/vocabularies/validation/uniqueItems.js var require_uniqueItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var dataType_1 = require_dataType(); @@ -5374,9 +5370,9 @@ var require_uniqueItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js +// node_modules/ajv/dist/vocabularies/validation/const.js var require_const = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5403,9 +5399,9 @@ var require_const = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js +// node_modules/ajv/dist/vocabularies/validation/enum.js var require_enum = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5452,9 +5448,9 @@ var require_enum = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js +// node_modules/ajv/dist/vocabularies/validation/index.js var require_validation = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var limitNumber_1 = require_limitNumber(); @@ -5490,9 +5486,9 @@ var require_validation = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +// node_modules/ajv/dist/vocabularies/applicator/additionalItems.js var require_additionalItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateAdditionalItems = void 0; @@ -5543,9 +5539,9 @@ var require_additionalItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js +// node_modules/ajv/dist/vocabularies/applicator/items.js var require_items = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateTuple = void 0; @@ -5587,10 +5583,10 @@ var require_items = __commonJS({ }); function checkStrictTuple(sch) { const { opts, errSchemaPath } = it; - const l3 = schArr.length; - const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); + const l = schArr.length; + const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false); if (opts.strictTuples && !fullTuple) { - const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + const msg = `"${keyword}" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); } } @@ -5600,9 +5596,9 @@ var require_items = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +// node_modules/ajv/dist/vocabularies/applicator/prefixItems.js var require_prefixItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var items_1 = require_items(); @@ -5617,9 +5613,9 @@ var require_prefixItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js +// node_modules/ajv/dist/vocabularies/applicator/items2020.js var require_items2020 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5652,9 +5648,9 @@ var require_items2020 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js +// node_modules/ajv/dist/vocabularies/applicator/contains.js var require_contains = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5746,9 +5742,9 @@ var require_contains = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +// node_modules/ajv/dist/vocabularies/applicator/dependencies.js var require_dependencies = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; @@ -5840,9 +5836,9 @@ var require_dependencies = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +// node_modules/ajv/dist/vocabularies/applicator/propertyNames.js var require_propertyNames = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5883,9 +5879,9 @@ var require_propertyNames = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +// node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js var require_additionalProperties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5989,9 +5985,9 @@ var require_additionalProperties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js +// node_modules/ajv/dist/vocabularies/applicator/properties.js var require_properties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var validate_1 = require_validate(); @@ -6047,9 +6043,9 @@ var require_properties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +// node_modules/ajv/dist/vocabularies/applicator/patternProperties.js var require_patternProperties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6121,9 +6117,9 @@ var require_patternProperties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js +// node_modules/ajv/dist/vocabularies/applicator/not.js var require_not = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6152,9 +6148,9 @@ var require_not = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +// node_modules/ajv/dist/vocabularies/applicator/anyOf.js var require_anyOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6169,9 +6165,9 @@ var require_anyOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +// node_modules/ajv/dist/vocabularies/applicator/oneOf.js var require_oneOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6227,9 +6223,9 @@ var require_oneOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js +// node_modules/ajv/dist/vocabularies/applicator/allOf.js var require_allOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6254,5823 +6250,13 @@ var require_allOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js +// node_modules/ajv/dist/vocabularies/applicator/if.js var require_if = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen(); - var util_1 = require_util(); - var error61 = { - message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`, - params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}` - }; - var def = { - keyword: "if", - schemaType: ["object", "boolean"], - trackErrors: true, - error: error61, - code(cxt) { - const { gen, parentSchema, it } = cxt; - if (parentSchema.then === void 0 && parentSchema.else === void 0) { - (0, util_1.checkStrictMode)(it, '"if" without "then" and "else" is ignored'); - } - const hasThen = hasSchema(it, "then"); - const hasElse = hasSchema(it, "else"); - if (!hasThen && !hasElse) - return; - const valid = gen.let("valid", true); - const schValid = gen.name("_valid"); - validateIf(); - cxt.reset(); - if (hasThen && hasElse) { - const ifClause = gen.let("ifClause"); - cxt.setParams({ ifClause }); - gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause)); - } else if (hasThen) { - gen.if(schValid, validateClause("then")); - } else { - gen.if((0, codegen_1.not)(schValid), validateClause("else")); - } - cxt.pass(valid, () => cxt.error(true)); - function validateIf() { - const schCxt = cxt.subschema({ - keyword: "if", - compositeRule: true, - createErrors: false, - allErrors: false - }, schValid); - cxt.mergeEvaluated(schCxt); - } - function validateClause(keyword, ifClause) { - return () => { - const schCxt = cxt.subschema({ keyword }, schValid); - gen.assign(valid, schValid); - cxt.mergeValidEvaluated(schCxt, valid); - if (ifClause) - gen.assign(ifClause, (0, codegen_1._)`${keyword}`); - else - cxt.setParams({ ifClause: keyword }); - }; - } - } - }; - function hasSchema(it, keyword) { - const schema = it.schema[keyword]; - return schema !== void 0 && !(0, util_1.alwaysValidSchema)(it, schema); - } - exports.default = def; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js -var require_thenElse = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util(); - var def = { - keyword: ["then", "else"], - schemaType: ["object", "boolean"], - code({ keyword, parentSchema, it }) { - if (parentSchema.if === void 0) - (0, util_1.checkStrictMode)(it, `"${keyword}" without "if" is ignored`); - } - }; - exports.default = def; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js -var require_applicator = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var additionalItems_1 = require_additionalItems(); - var prefixItems_1 = require_prefixItems(); - var items_1 = require_items(); - var items2020_1 = require_items2020(); - var contains_1 = require_contains(); - var dependencies_1 = require_dependencies(); - var propertyNames_1 = require_propertyNames(); - var additionalProperties_1 = require_additionalProperties(); - var properties_1 = require_properties(); - var patternProperties_1 = require_patternProperties(); - var not_1 = require_not(); - var anyOf_1 = require_anyOf(); - var oneOf_1 = require_oneOf(); - var allOf_1 = require_allOf(); - var if_1 = require_if(); - var thenElse_1 = require_thenElse(); - function getApplicator(draft2020 = false) { - const applicator = [ - // any - not_1.default, - anyOf_1.default, - oneOf_1.default, - allOf_1.default, - if_1.default, - thenElse_1.default, - // object - propertyNames_1.default, - additionalProperties_1.default, - dependencies_1.default, - properties_1.default, - patternProperties_1.default - ]; - if (draft2020) - applicator.push(prefixItems_1.default, items2020_1.default); - else - applicator.push(additionalItems_1.default, items_1.default); - applicator.push(contains_1.default); - return applicator; - } - exports.default = getApplicator; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js -var require_format = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen(); - var error61 = { - message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`, - params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}` - }; - var def = { - keyword: "format", - type: ["number", "string"], - schemaType: "string", - $data: true, - error: error61, - code(cxt, ruleType) { - const { gen, data, $data, schema, schemaCode, it } = cxt; - const { opts, errSchemaPath, schemaEnv, self } = it; - if (!opts.validateFormats) - return; - if ($data) - validate$DataFormat(); - else - validateFormat(); - function validate$DataFormat() { - const fmts = gen.scopeValue("formats", { - ref: self.formats, - code: opts.code.formats - }); - const fDef = gen.const("fDef", (0, codegen_1._)`${fmts}[${schemaCode}]`); - const fType = gen.let("fType"); - const format = gen.let("format"); - gen.if((0, codegen_1._)`typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._)`${fDef}.type || "string"`).assign(format, (0, codegen_1._)`${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._)`"string"`).assign(format, fDef)); - cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt())); - function unknownFmt() { - if (opts.strictSchema === false) - return codegen_1.nil; - return (0, codegen_1._)`${schemaCode} && !${format}`; - } - function invalidFmt() { - const callFormat = schemaEnv.$async ? (0, codegen_1._)`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))` : (0, codegen_1._)`${format}(${data})`; - const validData = (0, codegen_1._)`(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`; - return (0, codegen_1._)`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`; - } - } - function validateFormat() { - const formatDef = self.formats[schema]; - if (!formatDef) { - unknownFormat(); - return; - } - if (formatDef === true) - return; - const [fmtType, format, fmtRef] = getFormat(formatDef); - if (fmtType === ruleType) - cxt.pass(validCondition()); - function unknownFormat() { - if (opts.strictSchema === false) { - self.logger.warn(unknownMsg()); - return; - } - throw new Error(unknownMsg()); - function unknownMsg() { - return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`; - } - } - function getFormat(fmtDef) { - const code = fmtDef instanceof RegExp ? (0, codegen_1.regexpCode)(fmtDef) : opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(schema)}` : void 0; - const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code }); - if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) { - return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._)`${fmt}.validate`]; - } - return ["string", fmtDef, fmt]; - } - function validCondition() { - if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) { - if (!schemaEnv.$async) - throw new Error("async format in sync schema"); - return (0, codegen_1._)`await ${fmtRef}(${data})`; - } - return typeof format == "function" ? (0, codegen_1._)`${fmtRef}(${data})` : (0, codegen_1._)`${fmtRef}.test(${data})`; - } - } - } - }; - exports.default = def; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js -var require_format2 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var format_1 = require_format(); - var format = [format_1.default]; - exports.default = format; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js -var require_metadata = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.contentVocabulary = exports.metadataVocabulary = void 0; - exports.metadataVocabulary = [ - "title", - "description", - "default", - "deprecated", - "readOnly", - "writeOnly", - "examples" - ]; - exports.contentVocabulary = [ - "contentMediaType", - "contentEncoding", - "contentSchema" - ]; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js -var require_draft7 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var core_1 = require_core2(); - var validation_1 = require_validation(); - var applicator_1 = require_applicator(); - var format_1 = require_format2(); - var metadata_1 = require_metadata(); - var draft7Vocabularies = [ - core_1.default, - validation_1.default, - (0, applicator_1.default)(), - format_1.default, - metadata_1.metadataVocabulary, - metadata_1.contentVocabulary - ]; - exports.default = draft7Vocabularies; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js -var require_types = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.DiscrError = void 0; - var DiscrError; - (function(DiscrError2) { - DiscrError2["Tag"] = "tag"; - DiscrError2["Mapping"] = "mapping"; - })(DiscrError || (exports.DiscrError = DiscrError = {})); - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js -var require_discriminator = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); - var types_1 = require_types(); - var compile_1 = require_compile(); - var ref_error_1 = require_ref_error(); var util_1 = require_util(); - var error61 = { - message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`, - params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}` - }; - var def = { - keyword: "discriminator", - type: "object", - schemaType: "object", - error: error61, - code(cxt) { - const { gen, data, schema, parentSchema, it } = cxt; - const { oneOf } = parentSchema; - if (!it.opts.discriminator) { - throw new Error("discriminator: requires discriminator option"); - } - const tagName = schema.propertyName; - if (typeof tagName != "string") - throw new Error("discriminator: requires propertyName"); - if (schema.mapping) - throw new Error("discriminator: mapping is not supported"); - if (!oneOf) - throw new Error("discriminator: requires oneOf keyword"); - const valid = gen.let("valid", false); - const tag = gen.const("tag", (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(tagName)}`); - gen.if((0, codegen_1._)`typeof ${tag} == "string"`, () => validateMapping(), () => cxt.error(false, { discrError: types_1.DiscrError.Tag, tag, tagName })); - cxt.ok(valid); - function validateMapping() { - const mapping = getMapping(); - gen.if(false); - for (const tagValue in mapping) { - gen.elseIf((0, codegen_1._)`${tag} === ${tagValue}`); - gen.assign(valid, applyTagSchema(mapping[tagValue])); - } - gen.else(); - cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag, tagName }); - gen.endIf(); - } - function applyTagSchema(schemaProp) { - const _valid = gen.name("valid"); - const schCxt = cxt.subschema({ keyword: "oneOf", schemaProp }, _valid); - cxt.mergeEvaluated(schCxt, codegen_1.Name); - return _valid; - } - function getMapping() { - var _a3; - const oneOfMapping = {}; - const topRequired = hasRequired(parentSchema); - let tagRequired = true; - for (let i = 0; i < oneOf.length; i++) { - let sch = oneOf[i]; - if ((sch === null || sch === void 0 ? void 0 : sch.$ref) && !(0, util_1.schemaHasRulesButRef)(sch, it.self.RULES)) { - const ref = sch.$ref; - sch = compile_1.resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref); - if (sch instanceof compile_1.SchemaEnv) - sch = sch.schema; - if (sch === void 0) - throw new ref_error_1.default(it.opts.uriResolver, it.baseId, ref); - } - const propSch = (_a3 = sch === null || sch === void 0 ? void 0 : sch.properties) === null || _a3 === void 0 ? void 0 : _a3[tagName]; - if (typeof propSch != "object") { - throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`); - } - tagRequired = tagRequired && (topRequired || hasRequired(sch)); - addMappings(propSch, i); - } - if (!tagRequired) - throw new Error(`discriminator: "${tagName}" must be required`); - return oneOfMapping; - function hasRequired({ required: required2 }) { - return Array.isArray(required2) && required2.includes(tagName); - } - function addMappings(sch, i) { - if (sch.const) { - addMapping(sch.const, i); - } else if (sch.enum) { - for (const tagValue of sch.enum) { - addMapping(tagValue, i); - } - } else { - throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`); - } - } - function addMapping(tagValue, i) { - if (typeof tagValue != "string" || tagValue in oneOfMapping) { - throw new Error(`discriminator: "${tagName}" values must be unique strings`); - } - oneOfMapping[tagValue] = i; - } - } - } - }; - exports.default = def; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json -var require_json_schema_draft_07 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { - module.exports = { - $schema: "http://json-schema.org/draft-07/schema#", - $id: "http://json-schema.org/draft-07/schema#", - title: "Core schema meta-schema", - definitions: { - schemaArray: { - type: "array", - minItems: 1, - items: { $ref: "#" } - }, - nonNegativeInteger: { - type: "integer", - minimum: 0 - }, - nonNegativeIntegerDefault0: { - allOf: [{ $ref: "#/definitions/nonNegativeInteger" }, { default: 0 }] - }, - simpleTypes: { - enum: ["array", "boolean", "integer", "null", "number", "object", "string"] - }, - stringArray: { - type: "array", - items: { type: "string" }, - uniqueItems: true, - default: [] - } - }, - type: ["object", "boolean"], - properties: { - $id: { - type: "string", - format: "uri-reference" - }, - $schema: { - type: "string", - format: "uri" - }, - $ref: { - type: "string", - format: "uri-reference" - }, - $comment: { - type: "string" - }, - title: { - type: "string" - }, - description: { - type: "string" - }, - default: true, - readOnly: { - type: "boolean", - default: false - }, - examples: { - type: "array", - items: true - }, - multipleOf: { - type: "number", - exclusiveMinimum: 0 - }, - maximum: { - type: "number" - }, - exclusiveMaximum: { - type: "number" - }, - minimum: { - type: "number" - }, - exclusiveMinimum: { - type: "number" - }, - maxLength: { $ref: "#/definitions/nonNegativeInteger" }, - minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, - pattern: { - type: "string", - format: "regex" - }, - additionalItems: { $ref: "#" }, - items: { - anyOf: [{ $ref: "#" }, { $ref: "#/definitions/schemaArray" }], - default: true - }, - maxItems: { $ref: "#/definitions/nonNegativeInteger" }, - minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, - uniqueItems: { - type: "boolean", - default: false - }, - contains: { $ref: "#" }, - maxProperties: { $ref: "#/definitions/nonNegativeInteger" }, - minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, - required: { $ref: "#/definitions/stringArray" }, - additionalProperties: { $ref: "#" }, - definitions: { - type: "object", - additionalProperties: { $ref: "#" }, - default: {} - }, - properties: { - type: "object", - additionalProperties: { $ref: "#" }, - default: {} - }, - patternProperties: { - type: "object", - additionalProperties: { $ref: "#" }, - propertyNames: { format: "regex" }, - default: {} - }, - dependencies: { - type: "object", - additionalProperties: { - anyOf: [{ $ref: "#" }, { $ref: "#/definitions/stringArray" }] - } - }, - propertyNames: { $ref: "#" }, - const: true, - enum: { - type: "array", - items: true, - minItems: 1, - uniqueItems: true - }, - type: { - anyOf: [ - { $ref: "#/definitions/simpleTypes" }, - { - type: "array", - items: { $ref: "#/definitions/simpleTypes" }, - minItems: 1, - uniqueItems: true - } - ] - }, - format: { type: "string" }, - contentMediaType: { type: "string" }, - contentEncoding: { type: "string" }, - if: { $ref: "#" }, - then: { $ref: "#" }, - else: { $ref: "#" }, - allOf: { $ref: "#/definitions/schemaArray" }, - anyOf: { $ref: "#/definitions/schemaArray" }, - oneOf: { $ref: "#/definitions/schemaArray" }, - not: { $ref: "#" } - }, - default: true - }; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js -var require_ajv = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js"(exports, module) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; - var core_1 = require_core(); - var draft7_1 = require_draft7(); - var discriminator_1 = require_discriminator(); - var draft7MetaSchema = require_json_schema_draft_07(); - var META_SUPPORT_DATA = ["/properties"]; - var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema"; - var Ajv2 = class extends core_1.default { - _addVocabularies() { - super._addVocabularies(); - draft7_1.default.forEach((v2) => this.addVocabulary(v2)); - if (this.opts.discriminator) - this.addKeyword(discriminator_1.default); - } - _addDefaultMetaSchema() { - super._addDefaultMetaSchema(); - if (!this.opts.meta) - return; - const metaSchema = this.opts.$data ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA) : draft7MetaSchema; - this.addMetaSchema(metaSchema, META_SCHEMA_ID, false); - this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID; - } - defaultMeta() { - return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0); - } - }; - exports.Ajv = Ajv2; - module.exports = exports = Ajv2; - module.exports.Ajv = Ajv2; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.default = Ajv2; - var validate_1 = require_validate(); - Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { - return validate_1.KeywordCxt; - } }); - var codegen_1 = require_codegen(); - Object.defineProperty(exports, "_", { enumerable: true, get: function() { - return codegen_1._; - } }); - Object.defineProperty(exports, "str", { enumerable: true, get: function() { - return codegen_1.str; - } }); - Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { - return codegen_1.stringify; - } }); - Object.defineProperty(exports, "nil", { enumerable: true, get: function() { - return codegen_1.nil; - } }); - Object.defineProperty(exports, "Name", { enumerable: true, get: function() { - return codegen_1.Name; - } }); - Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { - return codegen_1.CodeGen; - } }); - var validation_error_1 = require_validation_error(); - Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { - return validation_error_1.default; - } }); - var ref_error_1 = require_ref_error(); - Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { - return ref_error_1.default; - } }); - } -}); - -// node_modules/ajv-formats/dist/formats.js -var require_formats = __commonJS({ - "node_modules/ajv-formats/dist/formats.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.formatNames = exports.fastFormats = exports.fullFormats = void 0; - function fmtDef(validate2, compare) { - return { validate: validate2, compare }; - } - exports.fullFormats = { - // date: http://tools.ietf.org/html/rfc3339#section-5.6 - date: fmtDef(date5, compareDate), - // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 - time: fmtDef(getTime(true), compareTime), - "date-time": fmtDef(getDateTime(true), compareDateTime), - "iso-time": fmtDef(getTime(), compareIsoTime), - "iso-date-time": fmtDef(getDateTime(), compareIsoDateTime), - // duration: https://tools.ietf.org/html/rfc3339#appendix-A - duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, - uri, - "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i, - // uri-template: https://tools.ietf.org/html/rfc6570 - "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i, - // For the source: https://gist.github.com/dperini/729294 - // For test cases: https://mathiasbynens.be/demo/url-regex - url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu, - email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, - hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i, - // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/, - ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, - regex, - // uuid: http://tools.ietf.org/html/rfc4122 - uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, - // JSON-pointer: https://tools.ietf.org/html/rfc6901 - // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A - "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/, - "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i, - // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 - "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/, - // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types - // byte: https://github.com/miguelmota/is-base64 - byte, - // signed 32 bit integer - int32: { type: "number", validate: validateInt32 }, - // signed 64 bit integer - int64: { type: "number", validate: validateInt64 }, - // C-type float - float: { type: "number", validate: validateNumber }, - // C-type double - double: { type: "number", validate: validateNumber }, - // hint to the UI to hide input strings - password: true, - // unchecked string payload - binary: true - }; - exports.fastFormats = { - ...exports.fullFormats, - date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate), - time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime), - "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), - "iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime), - "iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime), - // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js - uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, - "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, - // email (sources from jsen validator): - // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 - // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation') - email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i - }; - exports.formatNames = Object.keys(exports.fullFormats); - function isLeapYear(year) { - return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - } - var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; - var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - function date5(str) { - const matches = DATE.exec(str); - if (!matches) - return false; - const year = +matches[1]; - const month = +matches[2]; - const day = +matches[3]; - return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]); - } - function compareDate(d1, d2) { - if (!(d1 && d2)) - return void 0; - if (d1 > d2) - return 1; - if (d1 < d2) - return -1; - return 0; - } - var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i; - function getTime(strictTimeZone) { - return function time3(str) { - const matches = TIME.exec(str); - if (!matches) - return false; - const hr = +matches[1]; - const min = +matches[2]; - const sec = +matches[3]; - const tz = matches[4]; - const tzSign = matches[5] === "-" ? -1 : 1; - const tzH = +(matches[6] || 0); - const tzM = +(matches[7] || 0); - if (tzH > 23 || tzM > 59 || strictTimeZone && !tz) - return false; - if (hr <= 23 && min <= 59 && sec < 60) - return true; - const utcMin = min - tzM * tzSign; - const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0); - return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61; - }; - } - function compareTime(s1, s2) { - if (!(s1 && s2)) - return void 0; - const t1 = (/* @__PURE__ */ new Date("2020-01-01T" + s1)).valueOf(); - const t2 = (/* @__PURE__ */ new Date("2020-01-01T" + s2)).valueOf(); - if (!(t1 && t2)) - return void 0; - return t1 - t2; - } - function compareIsoTime(t1, t2) { - if (!(t1 && t2)) - return void 0; - const a1 = TIME.exec(t1); - const a2 = TIME.exec(t2); - if (!(a1 && a2)) - return void 0; - t1 = a1[1] + a1[2] + a1[3]; - t2 = a2[1] + a2[2] + a2[3]; - if (t1 > t2) - return 1; - if (t1 < t2) - return -1; - return 0; - } - var DATE_TIME_SEPARATOR = /t|\s/i; - function getDateTime(strictTimeZone) { - const time3 = getTime(strictTimeZone); - return function date_time(str) { - const dateTime = str.split(DATE_TIME_SEPARATOR); - return dateTime.length === 2 && date5(dateTime[0]) && time3(dateTime[1]); - }; - } - function compareDateTime(dt1, dt2) { - if (!(dt1 && dt2)) - return void 0; - const d1 = new Date(dt1).valueOf(); - const d2 = new Date(dt2).valueOf(); - if (!(d1 && d2)) - return void 0; - return d1 - d2; - } - function compareIsoDateTime(dt1, dt2) { - if (!(dt1 && dt2)) - return void 0; - const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR); - const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR); - const res = compareDate(d1, d2); - if (res === void 0) - return void 0; - return res || compareTime(t1, t2); - } - var NOT_URI_FRAGMENT = /\/|:/; - var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; - function uri(str) { - return NOT_URI_FRAGMENT.test(str) && URI.test(str); - } - var BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm; - function byte(str) { - BYTE.lastIndex = 0; - return BYTE.test(str); - } - var MIN_INT32 = -(2 ** 31); - var MAX_INT32 = 2 ** 31 - 1; - function validateInt32(value) { - return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32; - } - function validateInt64(value) { - return Number.isInteger(value); - } - function validateNumber() { - return true; - } - var Z_ANCHOR = /[^\\]\\Z/; - function regex(str) { - if (Z_ANCHOR.test(str)) - return false; - try { - new RegExp(str); - return true; - } catch (e) { - return false; - } - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js -var require_code3 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; - var _CodeOrName = class { - }; - exports._CodeOrName = _CodeOrName; - exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; - var Name = class extends _CodeOrName { - constructor(s) { - super(); - if (!exports.IDENTIFIER.test(s)) - throw new Error("CodeGen: name must be a valid identifier"); - this.str = s; - } - toString() { - return this.str; - } - emptyStr() { - return false; - } - get names() { - return { [this.str]: 1 }; - } - }; - exports.Name = Name; - var _Code = class extends _CodeOrName { - constructor(code) { - super(); - this._items = typeof code === "string" ? [code] : code; - } - toString() { - return this.str; - } - emptyStr() { - if (this._items.length > 1) - return false; - const item = this._items[0]; - return item === "" || item === '""'; - } - get str() { - var _a3; - return (_a3 = this._str) !== null && _a3 !== void 0 ? _a3 : this._str = this._items.reduce((s, c) => `${s}${c}`, ""); - } - get names() { - var _a3; - return (_a3 = this._names) !== null && _a3 !== void 0 ? _a3 : this._names = this._items.reduce((names, c) => { - if (c instanceof Name) - names[c.str] = (names[c.str] || 0) + 1; - return names; - }, {}); - } - }; - exports._Code = _Code; - exports.nil = new _Code(""); - function _2(strs, ...args) { - const code = [strs[0]]; - let i = 0; - while (i < args.length) { - addCodeArg(code, args[i]); - code.push(strs[++i]); - } - return new _Code(code); - } - exports._ = _2; - var plus = new _Code("+"); - function str(strs, ...args) { - const expr = [safeStringify(strs[0])]; - let i = 0; - while (i < args.length) { - expr.push(plus); - addCodeArg(expr, args[i]); - expr.push(plus, safeStringify(strs[++i])); - } - optimize(expr); - return new _Code(expr); - } - exports.str = str; - function addCodeArg(code, arg) { - if (arg instanceof _Code) - code.push(...arg._items); - else if (arg instanceof Name) - code.push(arg); - else - code.push(interpolate(arg)); - } - exports.addCodeArg = addCodeArg; - function optimize(expr) { - let i = 1; - while (i < expr.length - 1) { - if (expr[i] === plus) { - const res = mergeExprItems(expr[i - 1], expr[i + 1]); - if (res !== void 0) { - expr.splice(i - 1, 3, res); - continue; - } - expr[i++] = "+"; - } - i++; - } - } - function mergeExprItems(a, b2) { - if (b2 === '""') - return a; - if (a === '""') - return b2; - if (typeof a == "string") { - if (b2 instanceof Name || a[a.length - 1] !== '"') - return; - if (typeof b2 != "string") - return `${a.slice(0, -1)}${b2}"`; - if (b2[0] === '"') - return a.slice(0, -1) + b2.slice(1); - return; - } - if (typeof b2 == "string" && b2[0] === '"' && !(a instanceof Name)) - return `"${a}${b2.slice(1)}`; - return; - } - function strConcat(c1, c2) { - return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str`${c1}${c2}`; - } - exports.strConcat = strConcat; - function interpolate(x2) { - return typeof x2 == "number" || typeof x2 == "boolean" || x2 === null ? x2 : safeStringify(Array.isArray(x2) ? x2.join(",") : x2); - } - function stringify(x2) { - return new _Code(safeStringify(x2)); - } - exports.stringify = stringify; - function safeStringify(x2) { - return JSON.stringify(x2).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); - } - exports.safeStringify = safeStringify; - function getProperty(key) { - return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _2`[${key}]`; - } - exports.getProperty = getProperty; - function getEsmExportName(key) { - if (typeof key == "string" && exports.IDENTIFIER.test(key)) { - return new _Code(`${key}`); - } - throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`); - } - exports.getEsmExportName = getEsmExportName; - function regexpCode(rx) { - return new _Code(rx.toString()); - } - exports.regexpCode = regexpCode; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js -var require_scope2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; - var code_1 = require_code3(); - var ValueError = class extends Error { - constructor(name) { - super(`CodeGen: "code" for ${name} not defined`); - this.value = name.value; - } - }; - var UsedValueState; - (function(UsedValueState2) { - UsedValueState2[UsedValueState2["Started"] = 0] = "Started"; - UsedValueState2[UsedValueState2["Completed"] = 1] = "Completed"; - })(UsedValueState || (exports.UsedValueState = UsedValueState = {})); - exports.varKinds = { - const: new code_1.Name("const"), - let: new code_1.Name("let"), - var: new code_1.Name("var") - }; - var Scope = class { - constructor({ prefixes, parent } = {}) { - this._names = {}; - this._prefixes = prefixes; - this._parent = parent; - } - toName(nameOrPrefix) { - return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix); - } - name(prefix) { - return new code_1.Name(this._newName(prefix)); - } - _newName(prefix) { - const ng = this._names[prefix] || this._nameGroup(prefix); - return `${prefix}${ng.index++}`; - } - _nameGroup(prefix) { - var _a3, _b; - if (((_b = (_a3 = this._parent) === null || _a3 === void 0 ? void 0 : _a3._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || this._prefixes && !this._prefixes.has(prefix)) { - throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`); - } - return this._names[prefix] = { prefix, index: 0 }; - } - }; - exports.Scope = Scope; - var ValueScopeName = class extends code_1.Name { - constructor(prefix, nameStr) { - super(nameStr); - this.prefix = prefix; - } - setValue(value, { property, itemIndex }) { - this.value = value; - this.scopePath = (0, code_1._)`.${new code_1.Name(property)}[${itemIndex}]`; - } - }; - exports.ValueScopeName = ValueScopeName; - var line = (0, code_1._)`\n`; - var ValueScope = class extends Scope { - constructor(opts) { - super(opts); - this._values = {}; - this._scope = opts.scope; - this.opts = { ...opts, _n: opts.lines ? line : code_1.nil }; - } - get() { - return this._scope; - } - name(prefix) { - return new ValueScopeName(prefix, this._newName(prefix)); - } - value(nameOrPrefix, value) { - var _a3; - if (value.ref === void 0) - throw new Error("CodeGen: ref must be passed in value"); - const name = this.toName(nameOrPrefix); - const { prefix } = name; - const valueKey = (_a3 = value.key) !== null && _a3 !== void 0 ? _a3 : value.ref; - let vs = this._values[prefix]; - if (vs) { - const _name = vs.get(valueKey); - if (_name) - return _name; - } else { - vs = this._values[prefix] = /* @__PURE__ */ new Map(); - } - vs.set(valueKey, name); - const s = this._scope[prefix] || (this._scope[prefix] = []); - const itemIndex = s.length; - s[itemIndex] = value.ref; - name.setValue(value, { property: prefix, itemIndex }); - return name; - } - getValue(prefix, keyOrRef) { - const vs = this._values[prefix]; - if (!vs) - return; - return vs.get(keyOrRef); - } - scopeRefs(scopeName, values = this._values) { - return this._reduceValues(values, (name) => { - if (name.scopePath === void 0) - throw new Error(`CodeGen: name "${name}" has no value`); - return (0, code_1._)`${scopeName}${name.scopePath}`; - }); - } - scopeCode(values = this._values, usedValues, getCode) { - return this._reduceValues(values, (name) => { - if (name.value === void 0) - throw new Error(`CodeGen: name "${name}" has no value`); - return name.value.code; - }, usedValues, getCode); - } - _reduceValues(values, valueCode, usedValues = {}, getCode) { - let code = code_1.nil; - for (const prefix in values) { - const vs = values[prefix]; - if (!vs) - continue; - const nameSet = usedValues[prefix] = usedValues[prefix] || /* @__PURE__ */ new Map(); - vs.forEach((name) => { - if (nameSet.has(name)) - return; - nameSet.set(name, UsedValueState.Started); - let c = valueCode(name); - if (c) { - const def = this.opts.es5 ? exports.varKinds.var : exports.varKinds.const; - code = (0, code_1._)`${code}${def} ${name} = ${c};${this.opts._n}`; - } else if (c = getCode === null || getCode === void 0 ? void 0 : getCode(name)) { - code = (0, code_1._)`${code}${c}${this.opts._n}`; - } else { - throw new ValueError(name); - } - nameSet.set(name, UsedValueState.Completed); - }); - } - return code; - } - }; - exports.ValueScope = ValueScope; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js -var require_codegen2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; - var code_1 = require_code3(); - var scope_1 = require_scope2(); - var code_2 = require_code3(); - Object.defineProperty(exports, "_", { enumerable: true, get: function() { - return code_2._; - } }); - Object.defineProperty(exports, "str", { enumerable: true, get: function() { - return code_2.str; - } }); - Object.defineProperty(exports, "strConcat", { enumerable: true, get: function() { - return code_2.strConcat; - } }); - Object.defineProperty(exports, "nil", { enumerable: true, get: function() { - return code_2.nil; - } }); - Object.defineProperty(exports, "getProperty", { enumerable: true, get: function() { - return code_2.getProperty; - } }); - Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { - return code_2.stringify; - } }); - Object.defineProperty(exports, "regexpCode", { enumerable: true, get: function() { - return code_2.regexpCode; - } }); - Object.defineProperty(exports, "Name", { enumerable: true, get: function() { - return code_2.Name; - } }); - var scope_2 = require_scope2(); - Object.defineProperty(exports, "Scope", { enumerable: true, get: function() { - return scope_2.Scope; - } }); - Object.defineProperty(exports, "ValueScope", { enumerable: true, get: function() { - return scope_2.ValueScope; - } }); - Object.defineProperty(exports, "ValueScopeName", { enumerable: true, get: function() { - return scope_2.ValueScopeName; - } }); - Object.defineProperty(exports, "varKinds", { enumerable: true, get: function() { - return scope_2.varKinds; - } }); - exports.operators = { - GT: new code_1._Code(">"), - GTE: new code_1._Code(">="), - LT: new code_1._Code("<"), - LTE: new code_1._Code("<="), - EQ: new code_1._Code("==="), - NEQ: new code_1._Code("!=="), - NOT: new code_1._Code("!"), - OR: new code_1._Code("||"), - AND: new code_1._Code("&&"), - ADD: new code_1._Code("+") - }; - var Node = class { - optimizeNodes() { - return this; - } - optimizeNames(_names, _constants) { - return this; - } - }; - var Def = class extends Node { - constructor(varKind, name, rhs) { - super(); - this.varKind = varKind; - this.name = name; - this.rhs = rhs; - } - render({ es5, _n }) { - const varKind = es5 ? scope_1.varKinds.var : this.varKind; - const rhs = this.rhs === void 0 ? "" : ` = ${this.rhs}`; - return `${varKind} ${this.name}${rhs};` + _n; - } - optimizeNames(names, constants) { - if (!names[this.name.str]) - return; - if (this.rhs) - this.rhs = optimizeExpr(this.rhs, names, constants); - return this; - } - get names() { - return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {}; - } - }; - var Assign = class extends Node { - constructor(lhs, rhs, sideEffects) { - super(); - this.lhs = lhs; - this.rhs = rhs; - this.sideEffects = sideEffects; - } - render({ _n }) { - return `${this.lhs} = ${this.rhs};` + _n; - } - optimizeNames(names, constants) { - if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects) - return; - this.rhs = optimizeExpr(this.rhs, names, constants); - return this; - } - get names() { - const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names }; - return addExprNames(names, this.rhs); - } - }; - var AssignOp = class extends Assign { - constructor(lhs, op, rhs, sideEffects) { - super(lhs, rhs, sideEffects); - this.op = op; - } - render({ _n }) { - return `${this.lhs} ${this.op}= ${this.rhs};` + _n; - } - }; - var Label = class extends Node { - constructor(label) { - super(); - this.label = label; - this.names = {}; - } - render({ _n }) { - return `${this.label}:` + _n; - } - }; - var Break = class extends Node { - constructor(label) { - super(); - this.label = label; - this.names = {}; - } - render({ _n }) { - const label = this.label ? ` ${this.label}` : ""; - return `break${label};` + _n; - } - }; - var Throw = class extends Node { - constructor(error61) { - super(); - this.error = error61; - } - render({ _n }) { - return `throw ${this.error};` + _n; - } - get names() { - return this.error.names; - } - }; - var AnyCode = class extends Node { - constructor(code) { - super(); - this.code = code; - } - render({ _n }) { - return `${this.code};` + _n; - } - optimizeNodes() { - return `${this.code}` ? this : void 0; - } - optimizeNames(names, constants) { - this.code = optimizeExpr(this.code, names, constants); - return this; - } - get names() { - return this.code instanceof code_1._CodeOrName ? this.code.names : {}; - } - }; - var ParentNode = class extends Node { - constructor(nodes = []) { - super(); - this.nodes = nodes; - } - render(opts) { - return this.nodes.reduce((code, n) => code + n.render(opts), ""); - } - optimizeNodes() { - const { nodes } = this; - let i = nodes.length; - while (i--) { - const n = nodes[i].optimizeNodes(); - if (Array.isArray(n)) - nodes.splice(i, 1, ...n); - else if (n) - nodes[i] = n; - else - nodes.splice(i, 1); - } - return nodes.length > 0 ? this : void 0; - } - optimizeNames(names, constants) { - const { nodes } = this; - let i = nodes.length; - while (i--) { - const n = nodes[i]; - if (n.optimizeNames(names, constants)) - continue; - subtractNames(names, n.names); - nodes.splice(i, 1); - } - return nodes.length > 0 ? this : void 0; - } - get names() { - return this.nodes.reduce((names, n) => addNames(names, n.names), {}); - } - }; - var BlockNode = class extends ParentNode { - render(opts) { - return "{" + opts._n + super.render(opts) + "}" + opts._n; - } - }; - var Root = class extends ParentNode { - }; - var Else = class extends BlockNode { - }; - Else.kind = "else"; - var If = class _If extends BlockNode { - constructor(condition, nodes) { - super(nodes); - this.condition = condition; - } - render(opts) { - let code = `if(${this.condition})` + super.render(opts); - if (this.else) - code += "else " + this.else.render(opts); - return code; - } - optimizeNodes() { - super.optimizeNodes(); - const cond = this.condition; - if (cond === true) - return this.nodes; - let e = this.else; - if (e) { - const ns = e.optimizeNodes(); - e = this.else = Array.isArray(ns) ? new Else(ns) : ns; - } - if (e) { - if (cond === false) - return e instanceof _If ? e : e.nodes; - if (this.nodes.length) - return this; - return new _If(not(cond), e instanceof _If ? [e] : e.nodes); - } - if (cond === false || !this.nodes.length) - return void 0; - return this; - } - optimizeNames(names, constants) { - var _a3; - this.else = (_a3 = this.else) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); - if (!(super.optimizeNames(names, constants) || this.else)) - return; - this.condition = optimizeExpr(this.condition, names, constants); - return this; - } - get names() { - const names = super.names; - addExprNames(names, this.condition); - if (this.else) - addNames(names, this.else.names); - return names; - } - }; - If.kind = "if"; - var For = class extends BlockNode { - }; - For.kind = "for"; - var ForLoop = class extends For { - constructor(iteration) { - super(); - this.iteration = iteration; - } - render(opts) { - return `for(${this.iteration})` + super.render(opts); - } - optimizeNames(names, constants) { - if (!super.optimizeNames(names, constants)) - return; - this.iteration = optimizeExpr(this.iteration, names, constants); - return this; - } - get names() { - return addNames(super.names, this.iteration.names); - } - }; - var ForRange = class extends For { - constructor(varKind, name, from, to) { - super(); - this.varKind = varKind; - this.name = name; - this.from = from; - this.to = to; - } - render(opts) { - const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind; - const { name, from, to } = this; - return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts); - } - get names() { - const names = addExprNames(super.names, this.from); - return addExprNames(names, this.to); - } - }; - var ForIter = class extends For { - constructor(loop, varKind, name, iterable) { - super(); - this.loop = loop; - this.varKind = varKind; - this.name = name; - this.iterable = iterable; - } - render(opts) { - return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts); - } - optimizeNames(names, constants) { - if (!super.optimizeNames(names, constants)) - return; - this.iterable = optimizeExpr(this.iterable, names, constants); - return this; - } - get names() { - return addNames(super.names, this.iterable.names); - } - }; - var Func = class extends BlockNode { - constructor(name, args, async) { - super(); - this.name = name; - this.args = args; - this.async = async; - } - render(opts) { - const _async = this.async ? "async " : ""; - return `${_async}function ${this.name}(${this.args})` + super.render(opts); - } - }; - Func.kind = "func"; - var Return = class extends ParentNode { - render(opts) { - return "return " + super.render(opts); - } - }; - Return.kind = "return"; - var Try = class extends BlockNode { - render(opts) { - let code = "try" + super.render(opts); - if (this.catch) - code += this.catch.render(opts); - if (this.finally) - code += this.finally.render(opts); - return code; - } - optimizeNodes() { - var _a3, _b; - super.optimizeNodes(); - (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNodes(); - (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes(); - return this; - } - optimizeNames(names, constants) { - var _a3, _b; - super.optimizeNames(names, constants); - (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); - (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants); - return this; - } - get names() { - const names = super.names; - if (this.catch) - addNames(names, this.catch.names); - if (this.finally) - addNames(names, this.finally.names); - return names; - } - }; - var Catch = class extends BlockNode { - constructor(error61) { - super(); - this.error = error61; - } - render(opts) { - return `catch(${this.error})` + super.render(opts); - } - }; - Catch.kind = "catch"; - var Finally = class extends BlockNode { - render(opts) { - return "finally" + super.render(opts); - } - }; - Finally.kind = "finally"; - var CodeGen = class { - constructor(extScope, opts = {}) { - this._values = {}; - this._blockStarts = []; - this._constants = {}; - this.opts = { ...opts, _n: opts.lines ? "\n" : "" }; - this._extScope = extScope; - this._scope = new scope_1.Scope({ parent: extScope }); - this._nodes = [new Root()]; - } - toString() { - return this._root.render(this.opts); - } - // returns unique name in the internal scope - name(prefix) { - return this._scope.name(prefix); - } - // reserves unique name in the external scope - scopeName(prefix) { - return this._extScope.name(prefix); - } - // reserves unique name in the external scope and assigns value to it - scopeValue(prefixOrName, value) { - const name = this._extScope.value(prefixOrName, value); - const vs = this._values[name.prefix] || (this._values[name.prefix] = /* @__PURE__ */ new Set()); - vs.add(name); - return name; - } - getScopeValue(prefix, keyOrRef) { - return this._extScope.getValue(prefix, keyOrRef); - } - // return code that assigns values in the external scope to the names that are used internally - // (same names that were returned by gen.scopeName or gen.scopeValue) - scopeRefs(scopeName) { - return this._extScope.scopeRefs(scopeName, this._values); - } - scopeCode() { - return this._extScope.scopeCode(this._values); - } - _def(varKind, nameOrPrefix, rhs, constant) { - const name = this._scope.toName(nameOrPrefix); - if (rhs !== void 0 && constant) - this._constants[name.str] = rhs; - this._leafNode(new Def(varKind, name, rhs)); - return name; - } - // `const` declaration (`var` in es5 mode) - const(nameOrPrefix, rhs, _constant) { - return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant); - } - // `let` declaration with optional assignment (`var` in es5 mode) - let(nameOrPrefix, rhs, _constant) { - return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant); - } - // `var` declaration with optional assignment - var(nameOrPrefix, rhs, _constant) { - return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant); - } - // assignment code - assign(lhs, rhs, sideEffects) { - return this._leafNode(new Assign(lhs, rhs, sideEffects)); - } - // `+=` code - add(lhs, rhs) { - return this._leafNode(new AssignOp(lhs, exports.operators.ADD, rhs)); - } - // appends passed SafeExpr to code or executes Block - code(c) { - if (typeof c == "function") - c(); - else if (c !== code_1.nil) - this._leafNode(new AnyCode(c)); - return this; - } - // returns code for object literal for the passed argument list of key-value pairs - object(...keyValues) { - const code = ["{"]; - for (const [key, value] of keyValues) { - if (code.length > 1) - code.push(","); - code.push(key); - if (key !== value || this.opts.es5) { - code.push(":"); - (0, code_1.addCodeArg)(code, value); - } - } - code.push("}"); - return new code_1._Code(code); - } - // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed) - if(condition, thenBody, elseBody) { - this._blockNode(new If(condition)); - if (thenBody && elseBody) { - this.code(thenBody).else().code(elseBody).endIf(); - } else if (thenBody) { - this.code(thenBody).endIf(); - } else if (elseBody) { - throw new Error('CodeGen: "else" body without "then" body'); - } - return this; - } - // `else if` clause - invalid without `if` or after `else` clauses - elseIf(condition) { - return this._elseNode(new If(condition)); - } - // `else` clause - only valid after `if` or `else if` clauses - else() { - return this._elseNode(new Else()); - } - // end `if` statement (needed if gen.if was used only with condition) - endIf() { - return this._endBlockNode(If, Else); - } - _for(node2, forBody) { - this._blockNode(node2); - if (forBody) - this.code(forBody).endFor(); - return this; - } - // a generic `for` clause (or statement if `forBody` is passed) - for(iteration, forBody) { - return this._for(new ForLoop(iteration), forBody); - } - // `for` statement for a range of values - forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) { - const name = this._scope.toName(nameOrPrefix); - return this._for(new ForRange(varKind, name, from, to), () => forBody(name)); - } - // `for-of` statement (in es5 mode replace with a normal for loop) - forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) { - const name = this._scope.toName(nameOrPrefix); - if (this.opts.es5) { - const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable); - return this.forRange("_i", 0, (0, code_1._)`${arr}.length`, (i) => { - this.var(name, (0, code_1._)`${arr}[${i}]`); - forBody(name); - }); - } - return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name)); - } - // `for-in` statement. - // With option `ownProperties` replaced with a `for-of` loop for object keys - forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) { - if (this.opts.ownProperties) { - return this.forOf(nameOrPrefix, (0, code_1._)`Object.keys(${obj})`, forBody); - } - const name = this._scope.toName(nameOrPrefix); - return this._for(new ForIter("in", varKind, name, obj), () => forBody(name)); - } - // end `for` loop - endFor() { - return this._endBlockNode(For); - } - // `label` statement - label(label) { - return this._leafNode(new Label(label)); - } - // `break` statement - break(label) { - return this._leafNode(new Break(label)); - } - // `return` statement - return(value) { - const node2 = new Return(); - this._blockNode(node2); - this.code(value); - if (node2.nodes.length !== 1) - throw new Error('CodeGen: "return" should have one node'); - return this._endBlockNode(Return); - } - // `try` statement - try(tryBody, catchCode, finallyCode) { - if (!catchCode && !finallyCode) - throw new Error('CodeGen: "try" without "catch" and "finally"'); - const node2 = new Try(); - this._blockNode(node2); - this.code(tryBody); - if (catchCode) { - const error61 = this.name("e"); - this._currNode = node2.catch = new Catch(error61); - catchCode(error61); - } - if (finallyCode) { - this._currNode = node2.finally = new Finally(); - this.code(finallyCode); - } - return this._endBlockNode(Catch, Finally); - } - // `throw` statement - throw(error61) { - return this._leafNode(new Throw(error61)); - } - // start self-balancing block - block(body, nodeCount) { - this._blockStarts.push(this._nodes.length); - if (body) - this.code(body).endBlock(nodeCount); - return this; - } - // end the current self-balancing block - endBlock(nodeCount) { - const len = this._blockStarts.pop(); - if (len === void 0) - throw new Error("CodeGen: not in self-balancing block"); - const toClose = this._nodes.length - len; - if (toClose < 0 || nodeCount !== void 0 && toClose !== nodeCount) { - throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`); - } - this._nodes.length = len; - return this; - } - // `function` heading (or definition if funcBody is passed) - func(name, args = code_1.nil, async, funcBody) { - this._blockNode(new Func(name, args, async)); - if (funcBody) - this.code(funcBody).endFunc(); - return this; - } - // end function definition - endFunc() { - return this._endBlockNode(Func); - } - optimize(n = 1) { - while (n-- > 0) { - this._root.optimizeNodes(); - this._root.optimizeNames(this._root.names, this._constants); - } - } - _leafNode(node2) { - this._currNode.nodes.push(node2); - return this; - } - _blockNode(node2) { - this._currNode.nodes.push(node2); - this._nodes.push(node2); - } - _endBlockNode(N1, N2) { - const n = this._currNode; - if (n instanceof N1 || N2 && n instanceof N2) { - this._nodes.pop(); - return this; - } - throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`); - } - _elseNode(node2) { - const n = this._currNode; - if (!(n instanceof If)) { - throw new Error('CodeGen: "else" without "if"'); - } - this._currNode = n.else = node2; - return this; - } - get _root() { - return this._nodes[0]; - } - get _currNode() { - const ns = this._nodes; - return ns[ns.length - 1]; - } - set _currNode(node2) { - const ns = this._nodes; - ns[ns.length - 1] = node2; - } - }; - exports.CodeGen = CodeGen; - function addNames(names, from) { - for (const n in from) - names[n] = (names[n] || 0) + (from[n] || 0); - return names; - } - function addExprNames(names, from) { - return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names; - } - function optimizeExpr(expr, names, constants) { - if (expr instanceof code_1.Name) - return replaceName(expr); - if (!canOptimize(expr)) - return expr; - return new code_1._Code(expr._items.reduce((items, c) => { - if (c instanceof code_1.Name) - c = replaceName(c); - if (c instanceof code_1._Code) - items.push(...c._items); - else - items.push(c); - return items; - }, [])); - function replaceName(n) { - const c = constants[n.str]; - if (c === void 0 || names[n.str] !== 1) - return n; - delete names[n.str]; - return c; - } - function canOptimize(e) { - return e instanceof code_1._Code && e._items.some((c) => c instanceof code_1.Name && names[c.str] === 1 && constants[c.str] !== void 0); - } - } - function subtractNames(names, from) { - for (const n in from) - names[n] = (names[n] || 0) - (from[n] || 0); - } - function not(x2) { - return typeof x2 == "boolean" || typeof x2 == "number" || x2 === null ? !x2 : (0, code_1._)`!${par(x2)}`; - } - exports.not = not; - var andCode = mappend(exports.operators.AND); - function and(...args) { - return args.reduce(andCode); - } - exports.and = and; - var orCode = mappend(exports.operators.OR); - function or(...args) { - return args.reduce(orCode); - } - exports.or = or; - function mappend(op) { - return (x2, y2) => x2 === code_1.nil ? y2 : y2 === code_1.nil ? x2 : (0, code_1._)`${par(x2)} ${op} ${par(y2)}`; - } - function par(x2) { - return x2 instanceof code_1.Name ? x2 : (0, code_1._)`(${x2})`; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js -var require_util2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; - var codegen_1 = require_codegen2(); - var code_1 = require_code3(); - function toHash(arr) { - const hash2 = {}; - for (const item of arr) - hash2[item] = true; - return hash2; - } - exports.toHash = toHash; - function alwaysValidSchema(it, schema) { - if (typeof schema == "boolean") - return schema; - if (Object.keys(schema).length === 0) - return true; - checkUnknownRules(it, schema); - return !schemaHasRules(schema, it.self.RULES.all); - } - exports.alwaysValidSchema = alwaysValidSchema; - function checkUnknownRules(it, schema = it.schema) { - const { opts, self } = it; - if (!opts.strictSchema) - return; - if (typeof schema === "boolean") - return; - const rules = self.RULES.keywords; - for (const key in schema) { - if (!rules[key]) - checkStrictMode(it, `unknown keyword: "${key}"`); - } - } - exports.checkUnknownRules = checkUnknownRules; - function schemaHasRules(schema, rules) { - if (typeof schema == "boolean") - return !schema; - for (const key in schema) - if (rules[key]) - return true; - return false; - } - exports.schemaHasRules = schemaHasRules; - function schemaHasRulesButRef(schema, RULES) { - if (typeof schema == "boolean") - return !schema; - for (const key in schema) - if (key !== "$ref" && RULES.all[key]) - return true; - return false; - } - exports.schemaHasRulesButRef = schemaHasRulesButRef; - function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) { - if (!$data) { - if (typeof schema == "number" || typeof schema == "boolean") - return schema; - if (typeof schema == "string") - return (0, codegen_1._)`${schema}`; - } - return (0, codegen_1._)`${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`; - } - exports.schemaRefOrVal = schemaRefOrVal; - function unescapeFragment(str) { - return unescapeJsonPointer(decodeURIComponent(str)); - } - exports.unescapeFragment = unescapeFragment; - function escapeFragment(str) { - return encodeURIComponent(escapeJsonPointer(str)); - } - exports.escapeFragment = escapeFragment; - function escapeJsonPointer(str) { - if (typeof str == "number") - return `${str}`; - return str.replace(/~/g, "~0").replace(/\//g, "~1"); - } - exports.escapeJsonPointer = escapeJsonPointer; - function unescapeJsonPointer(str) { - return str.replace(/~1/g, "/").replace(/~0/g, "~"); - } - exports.unescapeJsonPointer = unescapeJsonPointer; - function eachItem(xs, f) { - if (Array.isArray(xs)) { - for (const x2 of xs) - f(x2); - } else { - f(xs); - } - } - exports.eachItem = eachItem; - function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues: mergeValues2, resultToName }) { - return (gen, from, to, toName) => { - const res = to === void 0 ? from : to instanceof codegen_1.Name ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to) : from instanceof codegen_1.Name ? (mergeToName(gen, to, from), from) : mergeValues2(from, to); - return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res; - }; - } - exports.mergeEvaluated = { - props: makeMergeEvaluated({ - mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => { - gen.if((0, codegen_1._)`${from} === true`, () => gen.assign(to, true), () => gen.assign(to, (0, codegen_1._)`${to} || {}`).code((0, codegen_1._)`Object.assign(${to}, ${from})`)); - }), - mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => { - if (from === true) { - gen.assign(to, true); - } else { - gen.assign(to, (0, codegen_1._)`${to} || {}`); - setEvaluated(gen, to, from); - } - }), - mergeValues: (from, to) => from === true ? true : { ...from, ...to }, - resultToName: evaluatedPropsToName - }), - items: makeMergeEvaluated({ - mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => gen.assign(to, (0, codegen_1._)`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)), - mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => gen.assign(to, from === true ? true : (0, codegen_1._)`${to} > ${from} ? ${to} : ${from}`)), - mergeValues: (from, to) => from === true ? true : Math.max(from, to), - resultToName: (gen, items) => gen.var("items", items) - }) - }; - function evaluatedPropsToName(gen, ps) { - if (ps === true) - return gen.var("props", true); - const props = gen.var("props", (0, codegen_1._)`{}`); - if (ps !== void 0) - setEvaluated(gen, props, ps); - return props; - } - exports.evaluatedPropsToName = evaluatedPropsToName; - function setEvaluated(gen, props, ps) { - Object.keys(ps).forEach((p) => gen.assign((0, codegen_1._)`${props}${(0, codegen_1.getProperty)(p)}`, true)); - } - exports.setEvaluated = setEvaluated; - var snippets = {}; - function useFunc(gen, f) { - return gen.scopeValue("func", { - ref: f, - code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code)) - }); - } - exports.useFunc = useFunc; - var Type; - (function(Type2) { - Type2[Type2["Num"] = 0] = "Num"; - Type2[Type2["Str"] = 1] = "Str"; - })(Type || (exports.Type = Type = {})); - function getErrorPath(dataProp, dataPropType, jsPropertySyntax) { - if (dataProp instanceof codegen_1.Name) { - const isNumber = dataPropType === Type.Num; - return jsPropertySyntax ? isNumber ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`; - } - return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp); - } - exports.getErrorPath = getErrorPath; - function checkStrictMode(it, msg, mode = it.opts.strictSchema) { - if (!mode) - return; - msg = `strict mode: ${msg}`; - if (mode === true) - throw new Error(msg); - it.self.logger.warn(msg); - } - exports.checkStrictMode = checkStrictMode; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js -var require_names2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var names = { - // validation function arguments - data: new codegen_1.Name("data"), - // data passed to validation function - // args passed from referencing schema - valCxt: new codegen_1.Name("valCxt"), - // validation/data context - should not be used directly, it is destructured to the names below - instancePath: new codegen_1.Name("instancePath"), - parentData: new codegen_1.Name("parentData"), - parentDataProperty: new codegen_1.Name("parentDataProperty"), - rootData: new codegen_1.Name("rootData"), - // root data - same as the data passed to the first/top validation function - dynamicAnchors: new codegen_1.Name("dynamicAnchors"), - // used to support recursiveRef and dynamicRef - // function scoped variables - vErrors: new codegen_1.Name("vErrors"), - // null or array of validation errors - errors: new codegen_1.Name("errors"), - // counter of validation errors - this: new codegen_1.Name("this"), - // "globals" - self: new codegen_1.Name("self"), - scope: new codegen_1.Name("scope"), - // JTD serialize/parse name for JSON string and position - json: new codegen_1.Name("json"), - jsonPos: new codegen_1.Name("jsonPos"), - jsonLen: new codegen_1.Name("jsonLen"), - jsonPart: new codegen_1.Name("jsonPart") - }; - exports.default = names; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js -var require_errors2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var names_1 = require_names2(); - exports.keywordError = { - message: ({ keyword }) => (0, codegen_1.str)`must pass "${keyword}" keyword validation` - }; - exports.keyword$DataError = { - message: ({ keyword, schemaType }) => schemaType ? (0, codegen_1.str)`"${keyword}" keyword must be ${schemaType} ($data)` : (0, codegen_1.str)`"${keyword}" keyword is invalid ($data)` - }; - function reportError(cxt, error61 = exports.keywordError, errorPaths, overrideAllErrors) { - const { it } = cxt; - const { gen, compositeRule, allErrors } = it; - const errObj = errorObjectCode(cxt, error61, errorPaths); - if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : compositeRule || allErrors) { - addError(gen, errObj); - } else { - returnErrors(it, (0, codegen_1._)`[${errObj}]`); - } - } - exports.reportError = reportError; - function reportExtraError(cxt, error61 = exports.keywordError, errorPaths) { - const { it } = cxt; - const { gen, compositeRule, allErrors } = it; - const errObj = errorObjectCode(cxt, error61, errorPaths); - addError(gen, errObj); - if (!(compositeRule || allErrors)) { - returnErrors(it, names_1.default.vErrors); - } - } - exports.reportExtraError = reportExtraError; - function resetErrorsCount(gen, errsCount) { - gen.assign(names_1.default.errors, errsCount); - gen.if((0, codegen_1._)`${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign((0, codegen_1._)`${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null))); - } - exports.resetErrorsCount = resetErrorsCount; - function extendErrors({ gen, keyword, schemaValue, data, errsCount, it }) { - if (errsCount === void 0) - throw new Error("ajv implementation error"); - const err = gen.name("err"); - gen.forRange("i", errsCount, names_1.default.errors, (i) => { - gen.const(err, (0, codegen_1._)`${names_1.default.vErrors}[${i}]`); - gen.if((0, codegen_1._)`${err}.instancePath === undefined`, () => gen.assign((0, codegen_1._)`${err}.instancePath`, (0, codegen_1.strConcat)(names_1.default.instancePath, it.errorPath))); - gen.assign((0, codegen_1._)`${err}.schemaPath`, (0, codegen_1.str)`${it.errSchemaPath}/${keyword}`); - if (it.opts.verbose) { - gen.assign((0, codegen_1._)`${err}.schema`, schemaValue); - gen.assign((0, codegen_1._)`${err}.data`, data); - } - }); - } - exports.extendErrors = extendErrors; - function addError(gen, errObj) { - const err = gen.const("err", errObj); - gen.if((0, codegen_1._)`${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, (0, codegen_1._)`[${err}]`), (0, codegen_1._)`${names_1.default.vErrors}.push(${err})`); - gen.code((0, codegen_1._)`${names_1.default.errors}++`); - } - function returnErrors(it, errs) { - const { gen, validateName, schemaEnv } = it; - if (schemaEnv.$async) { - gen.throw((0, codegen_1._)`new ${it.ValidationError}(${errs})`); - } else { - gen.assign((0, codegen_1._)`${validateName}.errors`, errs); - gen.return(false); - } - } - var E2 = { - keyword: new codegen_1.Name("keyword"), - schemaPath: new codegen_1.Name("schemaPath"), - // also used in JTD errors - params: new codegen_1.Name("params"), - propertyName: new codegen_1.Name("propertyName"), - message: new codegen_1.Name("message"), - schema: new codegen_1.Name("schema"), - parentSchema: new codegen_1.Name("parentSchema") - }; - function errorObjectCode(cxt, error61, errorPaths) { - const { createErrors } = cxt.it; - if (createErrors === false) - return (0, codegen_1._)`{}`; - return errorObject(cxt, error61, errorPaths); - } - function errorObject(cxt, error61, errorPaths = {}) { - const { gen, it } = cxt; - const keyValues = [ - errorInstancePath(it, errorPaths), - errorSchemaPath(cxt, errorPaths) - ]; - extraErrorProps(cxt, error61, keyValues); - return gen.object(...keyValues); - } - function errorInstancePath({ errorPath }, { instancePath }) { - const instPath = instancePath ? (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(instancePath, util_1.Type.Str)}` : errorPath; - return [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, instPath)]; - } - function errorSchemaPath({ keyword, it: { errSchemaPath } }, { schemaPath, parentSchema }) { - let schPath = parentSchema ? errSchemaPath : (0, codegen_1.str)`${errSchemaPath}/${keyword}`; - if (schemaPath) { - schPath = (0, codegen_1.str)`${schPath}${(0, util_1.getErrorPath)(schemaPath, util_1.Type.Str)}`; - } - return [E2.schemaPath, schPath]; - } - function extraErrorProps(cxt, { params, message }, keyValues) { - const { keyword, data, schemaValue, it } = cxt; - const { opts, propertyName, topSchemaRef, schemaPath } = it; - keyValues.push([E2.keyword, keyword], [E2.params, typeof params == "function" ? params(cxt) : params || (0, codegen_1._)`{}`]); - if (opts.messages) { - keyValues.push([E2.message, typeof message == "function" ? message(cxt) : message]); - } - if (opts.verbose) { - keyValues.push([E2.schema, schemaValue], [E2.parentSchema, (0, codegen_1._)`${topSchemaRef}${schemaPath}`], [names_1.default.data, data]); - } - if (propertyName) - keyValues.push([E2.propertyName, propertyName]); - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js -var require_boolSchema2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; - var errors_1 = require_errors2(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var boolError = { - message: "boolean schema is false" - }; - function topBoolOrEmptySchema(it) { - const { gen, schema, validateName } = it; - if (schema === false) { - falseSchemaError(it, false); - } else if (typeof schema == "object" && schema.$async === true) { - gen.return(names_1.default.data); - } else { - gen.assign((0, codegen_1._)`${validateName}.errors`, null); - gen.return(true); - } - } - exports.topBoolOrEmptySchema = topBoolOrEmptySchema; - function boolOrEmptySchema(it, valid) { - const { gen, schema } = it; - if (schema === false) { - gen.var(valid, false); - falseSchemaError(it); - } else { - gen.var(valid, true); - } - } - exports.boolOrEmptySchema = boolOrEmptySchema; - function falseSchemaError(it, overrideAllErrors) { - const { gen, data } = it; - const cxt = { - gen, - keyword: "false schema", - data, - schema: false, - schemaCode: false, - schemaValue: false, - params: {}, - it - }; - (0, errors_1.reportError)(cxt, boolError, void 0, overrideAllErrors); - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js -var require_rules2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getRules = exports.isJSONType = void 0; - var _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"]; - var jsonTypes = new Set(_jsonTypes); - function isJSONType(x2) { - return typeof x2 == "string" && jsonTypes.has(x2); - } - exports.isJSONType = isJSONType; - function getRules() { - const groups = { - number: { type: "number", rules: [] }, - string: { type: "string", rules: [] }, - array: { type: "array", rules: [] }, - object: { type: "object", rules: [] } - }; - return { - types: { ...groups, integer: true, boolean: true, null: true }, - rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object], - post: { rules: [] }, - all: {}, - keywords: {} - }; - } - exports.getRules = getRules; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js -var require_applicability2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; - function schemaHasRulesForType({ schema, self }, type) { - const group = self.RULES.types[type]; - return group && group !== true && shouldUseGroup(schema, group); - } - exports.schemaHasRulesForType = schemaHasRulesForType; - function shouldUseGroup(schema, group) { - return group.rules.some((rule) => shouldUseRule(schema, rule)); - } - exports.shouldUseGroup = shouldUseGroup; - function shouldUseRule(schema, rule) { - var _a3; - return schema[rule.keyword] !== void 0 || ((_a3 = rule.definition.implements) === null || _a3 === void 0 ? void 0 : _a3.some((kwd) => schema[kwd] !== void 0)); - } - exports.shouldUseRule = shouldUseRule; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js -var require_dataType2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; - var rules_1 = require_rules2(); - var applicability_1 = require_applicability2(); - var errors_1 = require_errors2(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var DataType; - (function(DataType2) { - DataType2[DataType2["Correct"] = 0] = "Correct"; - DataType2[DataType2["Wrong"] = 1] = "Wrong"; - })(DataType || (exports.DataType = DataType = {})); - function getSchemaTypes(schema) { - const types = getJSONTypes(schema.type); - const hasNull = types.includes("null"); - if (hasNull) { - if (schema.nullable === false) - throw new Error("type: null contradicts nullable: false"); - } else { - if (!types.length && schema.nullable !== void 0) { - throw new Error('"nullable" cannot be used without "type"'); - } - if (schema.nullable === true) - types.push("null"); - } - return types; - } - exports.getSchemaTypes = getSchemaTypes; - function getJSONTypes(ts) { - const types = Array.isArray(ts) ? ts : ts ? [ts] : []; - if (types.every(rules_1.isJSONType)) - return types; - throw new Error("type must be JSONType or JSONType[]: " + types.join(",")); - } - exports.getJSONTypes = getJSONTypes; - function coerceAndCheckDataType(it, types) { - const { gen, data, opts } = it; - const coerceTo = coerceToTypes(types, opts.coerceTypes); - const checkTypes = types.length > 0 && !(coerceTo.length === 0 && types.length === 1 && (0, applicability_1.schemaHasRulesForType)(it, types[0])); - if (checkTypes) { - const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong); - gen.if(wrongType, () => { - if (coerceTo.length) - coerceData(it, types, coerceTo); - else - reportTypeError(it); - }); - } - return checkTypes; - } - exports.coerceAndCheckDataType = coerceAndCheckDataType; - var COERCIBLE = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean", "null"]); - function coerceToTypes(types, coerceTypes) { - return coerceTypes ? types.filter((t) => COERCIBLE.has(t) || coerceTypes === "array" && t === "array") : []; - } - function coerceData(it, types, coerceTo) { - const { gen, data, opts } = it; - const dataType = gen.let("dataType", (0, codegen_1._)`typeof ${data}`); - const coerced = gen.let("coerced", (0, codegen_1._)`undefined`); - if (opts.coerceTypes === "array") { - gen.if((0, codegen_1._)`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen.assign(data, (0, codegen_1._)`${data}[0]`).assign(dataType, (0, codegen_1._)`typeof ${data}`).if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))); - } - gen.if((0, codegen_1._)`${coerced} !== undefined`); - for (const t of coerceTo) { - if (COERCIBLE.has(t) || t === "array" && opts.coerceTypes === "array") { - coerceSpecificType(t); - } - } - gen.else(); - reportTypeError(it); - gen.endIf(); - gen.if((0, codegen_1._)`${coerced} !== undefined`, () => { - gen.assign(data, coerced); - assignParentData(it, coerced); - }); - function coerceSpecificType(t) { - switch (t) { - case "string": - gen.elseIf((0, codegen_1._)`${dataType} == "number" || ${dataType} == "boolean"`).assign(coerced, (0, codegen_1._)`"" + ${data}`).elseIf((0, codegen_1._)`${data} === null`).assign(coerced, (0, codegen_1._)`""`); - return; - case "number": - gen.elseIf((0, codegen_1._)`${dataType} == "boolean" || ${data} === null - || (${dataType} == "string" && ${data} && ${data} == +${data})`).assign(coerced, (0, codegen_1._)`+${data}`); - return; - case "integer": - gen.elseIf((0, codegen_1._)`${dataType} === "boolean" || ${data} === null - || (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`).assign(coerced, (0, codegen_1._)`+${data}`); - return; - case "boolean": - gen.elseIf((0, codegen_1._)`${data} === "false" || ${data} === 0 || ${data} === null`).assign(coerced, false).elseIf((0, codegen_1._)`${data} === "true" || ${data} === 1`).assign(coerced, true); - return; - case "null": - gen.elseIf((0, codegen_1._)`${data} === "" || ${data} === 0 || ${data} === false`); - gen.assign(coerced, null); - return; - case "array": - gen.elseIf((0, codegen_1._)`${dataType} === "string" || ${dataType} === "number" - || ${dataType} === "boolean" || ${data} === null`).assign(coerced, (0, codegen_1._)`[${data}]`); - } - } - } - function assignParentData({ gen, parentData, parentDataProperty }, expr) { - gen.if((0, codegen_1._)`${parentData} !== undefined`, () => gen.assign((0, codegen_1._)`${parentData}[${parentDataProperty}]`, expr)); - } - function checkDataType(dataType, data, strictNums, correct = DataType.Correct) { - const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ; - let cond; - switch (dataType) { - case "null": - return (0, codegen_1._)`${data} ${EQ} null`; - case "array": - cond = (0, codegen_1._)`Array.isArray(${data})`; - break; - case "object": - cond = (0, codegen_1._)`${data} && typeof ${data} == "object" && !Array.isArray(${data})`; - break; - case "integer": - cond = numCond((0, codegen_1._)`!(${data} % 1) && !isNaN(${data})`); - break; - case "number": - cond = numCond(); - break; - default: - return (0, codegen_1._)`typeof ${data} ${EQ} ${dataType}`; - } - return correct === DataType.Correct ? cond : (0, codegen_1.not)(cond); - function numCond(_cond = codegen_1.nil) { - return (0, codegen_1.and)((0, codegen_1._)`typeof ${data} == "number"`, _cond, strictNums ? (0, codegen_1._)`isFinite(${data})` : codegen_1.nil); - } - } - exports.checkDataType = checkDataType; - function checkDataTypes(dataTypes, data, strictNums, correct) { - if (dataTypes.length === 1) { - return checkDataType(dataTypes[0], data, strictNums, correct); - } - let cond; - const types = (0, util_1.toHash)(dataTypes); - if (types.array && types.object) { - const notObj = (0, codegen_1._)`typeof ${data} != "object"`; - cond = types.null ? notObj : (0, codegen_1._)`!${data} || ${notObj}`; - delete types.null; - delete types.array; - delete types.object; - } else { - cond = codegen_1.nil; - } - if (types.number) - delete types.integer; - for (const t in types) - cond = (0, codegen_1.and)(cond, checkDataType(t, data, strictNums, correct)); - return cond; - } - exports.checkDataTypes = checkDataTypes; - var typeError = { - message: ({ schema }) => `must be ${schema}`, - params: ({ schema, schemaValue }) => typeof schema == "string" ? (0, codegen_1._)`{type: ${schema}}` : (0, codegen_1._)`{type: ${schemaValue}}` - }; - function reportTypeError(it) { - const cxt = getTypeErrorContext(it); - (0, errors_1.reportError)(cxt, typeError); - } - exports.reportTypeError = reportTypeError; - function getTypeErrorContext(it) { - const { gen, data, schema } = it; - const schemaCode = (0, util_1.schemaRefOrVal)(it, schema, "type"); - return { - gen, - keyword: "type", - data, - schema: schema.type, - schemaCode, - schemaValue: schemaCode, - parentSchema: schema, - params: {}, - it - }; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js -var require_defaults2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.assignDefaults = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - function assignDefaults(it, ty) { - const { properties, items } = it.schema; - if (ty === "object" && properties) { - for (const key in properties) { - assignDefault(it, key, properties[key].default); - } - } else if (ty === "array" && Array.isArray(items)) { - items.forEach((sch, i) => assignDefault(it, i, sch.default)); - } - } - exports.assignDefaults = assignDefaults; - function assignDefault(it, prop, defaultValue) { - const { gen, compositeRule, data, opts } = it; - if (defaultValue === void 0) - return; - const childData = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(prop)}`; - if (compositeRule) { - (0, util_1.checkStrictMode)(it, `default is ignored for: ${childData}`); - return; - } - let condition = (0, codegen_1._)`${childData} === undefined`; - if (opts.useDefaults === "empty") { - condition = (0, codegen_1._)`${condition} || ${childData} === null || ${childData} === ""`; - } - gen.if(condition, (0, codegen_1._)`${childData} = ${(0, codegen_1.stringify)(defaultValue)}`); - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js -var require_code4 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var names_1 = require_names2(); - var util_2 = require_util2(); - function checkReportMissingProp(cxt, prop) { - const { gen, data, it } = cxt; - gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => { - cxt.setParams({ missingProperty: (0, codegen_1._)`${prop}` }, true); - cxt.error(); - }); - } - exports.checkReportMissingProp = checkReportMissingProp; - function checkMissingProp({ gen, data, it: { opts } }, properties, missing) { - return (0, codegen_1.or)(...properties.map((prop) => (0, codegen_1.and)(noPropertyInData(gen, data, prop, opts.ownProperties), (0, codegen_1._)`${missing} = ${prop}`))); - } - exports.checkMissingProp = checkMissingProp; - function reportMissingProp(cxt, missing) { - cxt.setParams({ missingProperty: missing }, true); - cxt.error(); - } - exports.reportMissingProp = reportMissingProp; - function hasPropFunc(gen) { - return gen.scopeValue("func", { - // eslint-disable-next-line @typescript-eslint/unbound-method - ref: Object.prototype.hasOwnProperty, - code: (0, codegen_1._)`Object.prototype.hasOwnProperty` - }); - } - exports.hasPropFunc = hasPropFunc; - function isOwnProperty(gen, data, property) { - return (0, codegen_1._)`${hasPropFunc(gen)}.call(${data}, ${property})`; - } - exports.isOwnProperty = isOwnProperty; - function propertyInData(gen, data, property, ownProperties) { - const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} !== undefined`; - return ownProperties ? (0, codegen_1._)`${cond} && ${isOwnProperty(gen, data, property)}` : cond; - } - exports.propertyInData = propertyInData; - function noPropertyInData(gen, data, property, ownProperties) { - const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} === undefined`; - return ownProperties ? (0, codegen_1.or)(cond, (0, codegen_1.not)(isOwnProperty(gen, data, property))) : cond; - } - exports.noPropertyInData = noPropertyInData; - function allSchemaProperties(schemaMap) { - return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : []; - } - exports.allSchemaProperties = allSchemaProperties; - function schemaProperties(it, schemaMap) { - return allSchemaProperties(schemaMap).filter((p) => !(0, util_1.alwaysValidSchema)(it, schemaMap[p])); - } - exports.schemaProperties = schemaProperties; - function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) { - const dataAndSchema = passSchema ? (0, codegen_1._)`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data; - const valCxt = [ - [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, errorPath)], - [names_1.default.parentData, it.parentData], - [names_1.default.parentDataProperty, it.parentDataProperty], - [names_1.default.rootData, names_1.default.rootData] - ]; - if (it.opts.dynamicRef) - valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]); - const args = (0, codegen_1._)`${dataAndSchema}, ${gen.object(...valCxt)}`; - return context !== codegen_1.nil ? (0, codegen_1._)`${func}.call(${context}, ${args})` : (0, codegen_1._)`${func}(${args})`; - } - exports.callValidateCode = callValidateCode; - var newRegExp = (0, codegen_1._)`new RegExp`; - function usePattern({ gen, it: { opts } }, pattern) { - const u = opts.unicodeRegExp ? "u" : ""; - const { regExp } = opts.code; - const rx = regExp(pattern, u); - return gen.scopeValue("pattern", { - key: rx.toString(), - ref: rx, - code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` - }); - } - exports.usePattern = usePattern; - function validateArray(cxt) { - const { gen, data, keyword, it } = cxt; - const valid = gen.name("valid"); - if (it.allErrors) { - const validArr = gen.let("valid", true); - validateItems(() => gen.assign(validArr, false)); - return validArr; - } - gen.var(valid, true); - validateItems(() => gen.break()); - return valid; - function validateItems(notValid) { - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - gen.forRange("i", 0, len, (i) => { - cxt.subschema({ - keyword, - dataProp: i, - dataPropType: util_1.Type.Num - }, valid); - gen.if((0, codegen_1.not)(valid), notValid); - }); - } - } - exports.validateArray = validateArray; - function validateUnion(cxt) { - const { gen, schema, keyword, it } = cxt; - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - const alwaysValid = schema.some((sch) => (0, util_1.alwaysValidSchema)(it, sch)); - if (alwaysValid && !it.opts.unevaluated) - return; - const valid = gen.let("valid", false); - const schValid = gen.name("_valid"); - gen.block(() => schema.forEach((_sch, i) => { - const schCxt = cxt.subschema({ - keyword, - schemaProp: i, - compositeRule: true - }, schValid); - gen.assign(valid, (0, codegen_1._)`${valid} || ${schValid}`); - const merged = cxt.mergeValidEvaluated(schCxt, schValid); - if (!merged) - gen.if((0, codegen_1.not)(valid)); - })); - cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); - } - exports.validateUnion = validateUnion; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js -var require_keyword2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var code_1 = require_code4(); - var errors_1 = require_errors2(); - function macroKeywordCode(cxt, def) { - const { gen, keyword, schema, parentSchema, it } = cxt; - const macroSchema = def.macro.call(it.self, schema, parentSchema, it); - const schemaRef = useKeyword(gen, keyword, macroSchema); - if (it.opts.validateSchema !== false) - it.self.validateSchema(macroSchema, true); - const valid = gen.name("valid"); - cxt.subschema({ - schema: macroSchema, - schemaPath: codegen_1.nil, - errSchemaPath: `${it.errSchemaPath}/${keyword}`, - topSchemaRef: schemaRef, - compositeRule: true - }, valid); - cxt.pass(valid, () => cxt.error(true)); - } - exports.macroKeywordCode = macroKeywordCode; - function funcKeywordCode(cxt, def) { - var _a3; - const { gen, keyword, schema, parentSchema, $data, it } = cxt; - checkAsyncKeyword(it, def); - const validate2 = !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate; - const validateRef = useKeyword(gen, keyword, validate2); - const valid = gen.let("valid"); - cxt.block$data(valid, validateKeyword); - cxt.ok((_a3 = def.valid) !== null && _a3 !== void 0 ? _a3 : valid); - function validateKeyword() { - if (def.errors === false) { - assignValid(); - if (def.modifying) - modifyData(cxt); - reportErrs(() => cxt.error()); - } else { - const ruleErrs = def.async ? validateAsync2() : validateSync(); - if (def.modifying) - modifyData(cxt); - reportErrs(() => addErrs(cxt, ruleErrs)); - } - } - function validateAsync2() { - const ruleErrs = gen.let("ruleErrs", null); - gen.try(() => assignValid((0, codegen_1._)`await `), (e) => gen.assign(valid, false).if((0, codegen_1._)`${e} instanceof ${it.ValidationError}`, () => gen.assign(ruleErrs, (0, codegen_1._)`${e}.errors`), () => gen.throw(e))); - return ruleErrs; - } - function validateSync() { - const validateErrs = (0, codegen_1._)`${validateRef}.errors`; - gen.assign(validateErrs, null); - assignValid(codegen_1.nil); - return validateErrs; - } - function assignValid(_await = def.async ? (0, codegen_1._)`await ` : codegen_1.nil) { - const passCxt = it.opts.passContext ? names_1.default.this : names_1.default.self; - const passSchema = !("compile" in def && !$data || def.schema === false); - gen.assign(valid, (0, codegen_1._)`${_await}${(0, code_1.callValidateCode)(cxt, validateRef, passCxt, passSchema)}`, def.modifying); - } - function reportErrs(errors) { - var _a4; - gen.if((0, codegen_1.not)((_a4 = def.valid) !== null && _a4 !== void 0 ? _a4 : valid), errors); - } - } - exports.funcKeywordCode = funcKeywordCode; - function modifyData(cxt) { - const { gen, data, it } = cxt; - gen.if(it.parentData, () => gen.assign(data, (0, codegen_1._)`${it.parentData}[${it.parentDataProperty}]`)); - } - function addErrs(cxt, errs) { - const { gen } = cxt; - gen.if((0, codegen_1._)`Array.isArray(${errs})`, () => { - gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`).assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); - (0, errors_1.extendErrors)(cxt); - }, () => cxt.error()); - } - function checkAsyncKeyword({ schemaEnv }, def) { - if (def.async && !schemaEnv.$async) - throw new Error("async keyword in sync schema"); - } - function useKeyword(gen, keyword, result) { - if (result === void 0) - throw new Error(`keyword "${keyword}" failed to compile`); - return gen.scopeValue("keyword", typeof result == "function" ? { ref: result } : { ref: result, code: (0, codegen_1.stringify)(result) }); - } - function validSchemaType(schema, schemaType, allowUndefined = false) { - return !schemaType.length || schemaType.some((st) => st === "array" ? Array.isArray(schema) : st === "object" ? schema && typeof schema == "object" && !Array.isArray(schema) : typeof schema == st || allowUndefined && typeof schema == "undefined"); - } - exports.validSchemaType = validSchemaType; - function validateKeywordUsage({ schema, opts, self, errSchemaPath }, def, keyword) { - if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) { - throw new Error("ajv implementation error"); - } - const deps = def.dependencies; - if (deps === null || deps === void 0 ? void 0 : deps.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) { - throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(",")}`); - } - if (def.validateSchema) { - const valid = def.validateSchema(schema[keyword]); - if (!valid) { - const msg = `keyword "${keyword}" value is invalid at path "${errSchemaPath}": ` + self.errorsText(def.validateSchema.errors); - if (opts.validateSchema === "log") - self.logger.error(msg); - else - throw new Error(msg); - } - } - } - exports.validateKeywordUsage = validateKeywordUsage; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js -var require_subschema2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - function getSubschema(it, { keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef }) { - if (keyword !== void 0 && schema !== void 0) { - throw new Error('both "keyword" and "schema" passed, only one allowed'); - } - if (keyword !== void 0) { - const sch = it.schema[keyword]; - return schemaProp === void 0 ? { - schema: sch, - schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}`, - errSchemaPath: `${it.errSchemaPath}/${keyword}` - } : { - schema: sch[schemaProp], - schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}${(0, codegen_1.getProperty)(schemaProp)}`, - errSchemaPath: `${it.errSchemaPath}/${keyword}/${(0, util_1.escapeFragment)(schemaProp)}` - }; - } - if (schema !== void 0) { - if (schemaPath === void 0 || errSchemaPath === void 0 || topSchemaRef === void 0) { - throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"'); - } - return { - schema, - schemaPath, - topSchemaRef, - errSchemaPath - }; - } - throw new Error('either "keyword" or "schema" must be passed'); - } - exports.getSubschema = getSubschema; - function extendSubschemaData(subschema, it, { dataProp, dataPropType: dpType, data, dataTypes, propertyName }) { - if (data !== void 0 && dataProp !== void 0) { - throw new Error('both "data" and "dataProp" passed, only one allowed'); - } - const { gen } = it; - if (dataProp !== void 0) { - const { errorPath, dataPathArr, opts } = it; - const nextData = gen.let("data", (0, codegen_1._)`${it.data}${(0, codegen_1.getProperty)(dataProp)}`, true); - dataContextProps(nextData); - subschema.errorPath = (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(dataProp, dpType, opts.jsPropertySyntax)}`; - subschema.parentDataProperty = (0, codegen_1._)`${dataProp}`; - subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty]; - } - if (data !== void 0) { - const nextData = data instanceof codegen_1.Name ? data : gen.let("data", data, true); - dataContextProps(nextData); - if (propertyName !== void 0) - subschema.propertyName = propertyName; - } - if (dataTypes) - subschema.dataTypes = dataTypes; - function dataContextProps(_nextData) { - subschema.data = _nextData; - subschema.dataLevel = it.dataLevel + 1; - subschema.dataTypes = []; - it.definedProperties = /* @__PURE__ */ new Set(); - subschema.parentData = it.data; - subschema.dataNames = [...it.dataNames, _nextData]; - } - } - exports.extendSubschemaData = extendSubschemaData; - function extendSubschemaMode(subschema, { jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors }) { - if (compositeRule !== void 0) - subschema.compositeRule = compositeRule; - if (createErrors !== void 0) - subschema.createErrors = createErrors; - if (allErrors !== void 0) - subschema.allErrors = allErrors; - subschema.jtdDiscriminator = jtdDiscriminator; - subschema.jtdMetadata = jtdMetadata; - } - exports.extendSubschemaMode = extendSubschemaMode; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js -var require_resolve2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; - var util_1 = require_util2(); - var equal = require_fast_deep_equal(); - var traverse = require_json_schema_traverse(); - var SIMPLE_INLINED = /* @__PURE__ */ new Set([ - "type", - "format", - "pattern", - "maxLength", - "minLength", - "maxProperties", - "minProperties", - "maxItems", - "minItems", - "maximum", - "minimum", - "uniqueItems", - "multipleOf", - "required", - "enum", - "const" - ]); - function inlineRef(schema, limit = true) { - if (typeof schema == "boolean") - return true; - if (limit === true) - return !hasRef(schema); - if (!limit) - return false; - return countKeys(schema) <= limit; - } - exports.inlineRef = inlineRef; - var REF_KEYWORDS = /* @__PURE__ */ new Set([ - "$ref", - "$recursiveRef", - "$recursiveAnchor", - "$dynamicRef", - "$dynamicAnchor" - ]); - function hasRef(schema) { - for (const key in schema) { - if (REF_KEYWORDS.has(key)) - return true; - const sch = schema[key]; - if (Array.isArray(sch) && sch.some(hasRef)) - return true; - if (typeof sch == "object" && hasRef(sch)) - return true; - } - return false; - } - function countKeys(schema) { - let count = 0; - for (const key in schema) { - if (key === "$ref") - return Infinity; - count++; - if (SIMPLE_INLINED.has(key)) - continue; - if (typeof schema[key] == "object") { - (0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch)); - } - if (count === Infinity) - return Infinity; - } - return count; - } - function getFullPath(resolver, id = "", normalize) { - if (normalize !== false) - id = normalizeId(id); - const p = resolver.parse(id); - return _getFullPath(resolver, p); - } - exports.getFullPath = getFullPath; - function _getFullPath(resolver, p) { - const serialized = resolver.serialize(p); - return serialized.split("#")[0] + "#"; - } - exports._getFullPath = _getFullPath; - var TRAILING_SLASH_HASH = /#\/?$/; - function normalizeId(id) { - return id ? id.replace(TRAILING_SLASH_HASH, "") : ""; - } - exports.normalizeId = normalizeId; - function resolveUrl(resolver, baseId, id) { - id = normalizeId(id); - return resolver.resolve(baseId, id); - } - exports.resolveUrl = resolveUrl; - var ANCHOR = /^[a-z_][-a-z0-9._]*$/i; - function getSchemaRefs(schema, baseId) { - if (typeof schema == "boolean") - return {}; - const { schemaId, uriResolver } = this.opts; - const schId = normalizeId(schema[schemaId] || baseId); - const baseIds = { "": schId }; - const pathPrefix = getFullPath(uriResolver, schId, false); - const localRefs = {}; - const schemaRefs = /* @__PURE__ */ new Set(); - traverse(schema, { allKeys: true }, (sch, jsonPtr, _2, parentJsonPtr) => { - if (parentJsonPtr === void 0) - return; - const fullPath = pathPrefix + jsonPtr; - let innerBaseId = baseIds[parentJsonPtr]; - if (typeof sch[schemaId] == "string") - innerBaseId = addRef.call(this, sch[schemaId]); - addAnchor.call(this, sch.$anchor); - addAnchor.call(this, sch.$dynamicAnchor); - baseIds[jsonPtr] = innerBaseId; - function addRef(ref) { - const _resolve = this.opts.uriResolver.resolve; - ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref); - if (schemaRefs.has(ref)) - throw ambiguos(ref); - schemaRefs.add(ref); - let schOrRef = this.refs[ref]; - if (typeof schOrRef == "string") - schOrRef = this.refs[schOrRef]; - if (typeof schOrRef == "object") { - checkAmbiguosRef(sch, schOrRef.schema, ref); - } else if (ref !== normalizeId(fullPath)) { - if (ref[0] === "#") { - checkAmbiguosRef(sch, localRefs[ref], ref); - localRefs[ref] = sch; - } else { - this.refs[ref] = fullPath; - } - } - return ref; - } - function addAnchor(anchor2) { - if (typeof anchor2 == "string") { - if (!ANCHOR.test(anchor2)) - throw new Error(`invalid anchor "${anchor2}"`); - addRef.call(this, `#${anchor2}`); - } - } - }); - return localRefs; - function checkAmbiguosRef(sch1, sch2, ref) { - if (sch2 !== void 0 && !equal(sch1, sch2)) - throw ambiguos(ref); - } - function ambiguos(ref) { - return new Error(`reference "${ref}" resolves to more than one schema`); - } - } - exports.getSchemaRefs = getSchemaRefs; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js -var require_validate2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; - var boolSchema_1 = require_boolSchema2(); - var dataType_1 = require_dataType2(); - var applicability_1 = require_applicability2(); - var dataType_2 = require_dataType2(); - var defaults_1 = require_defaults2(); - var keyword_1 = require_keyword2(); - var subschema_1 = require_subschema2(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var resolve_1 = require_resolve2(); - var util_1 = require_util2(); - var errors_1 = require_errors2(); - function validateFunctionCode(it) { - if (isSchemaObj(it)) { - checkKeywords(it); - if (schemaCxtHasRules(it)) { - topSchemaObjCode(it); - return; - } - } - validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it)); - } - exports.validateFunctionCode = validateFunctionCode; - function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) { - if (opts.code.es5) { - gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => { - gen.code((0, codegen_1._)`"use strict"; ${funcSourceUrl(schema, opts)}`); - destructureValCxtES5(gen, opts); - gen.code(body); - }); - } else { - gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body)); - } - } - function destructureValCxt(opts) { - return (0, codegen_1._)`{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._)`, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`; - } - function destructureValCxtES5(gen, opts) { - gen.if(names_1.default.valCxt, () => { - gen.var(names_1.default.instancePath, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.instancePath}`); - gen.var(names_1.default.parentData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentData}`); - gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentDataProperty}`); - gen.var(names_1.default.rootData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.rootData}`); - if (opts.dynamicRef) - gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`); - }, () => { - gen.var(names_1.default.instancePath, (0, codegen_1._)`""`); - gen.var(names_1.default.parentData, (0, codegen_1._)`undefined`); - gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`undefined`); - gen.var(names_1.default.rootData, names_1.default.data); - if (opts.dynamicRef) - gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`{}`); - }); - } - function topSchemaObjCode(it) { - const { schema, opts, gen } = it; - validateFunction(it, () => { - if (opts.$comment && schema.$comment) - commentKeyword(it); - checkNoDefault(it); - gen.let(names_1.default.vErrors, null); - gen.let(names_1.default.errors, 0); - if (opts.unevaluated) - resetEvaluated(it); - typeAndKeywords(it); - returnResults(it); - }); - return; - } - function resetEvaluated(it) { - const { gen, validateName } = it; - it.evaluated = gen.const("evaluated", (0, codegen_1._)`${validateName}.evaluated`); - gen.if((0, codegen_1._)`${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._)`${it.evaluated}.props`, (0, codegen_1._)`undefined`)); - gen.if((0, codegen_1._)`${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._)`${it.evaluated}.items`, (0, codegen_1._)`undefined`)); - } - function funcSourceUrl(schema, opts) { - const schId = typeof schema == "object" && schema[opts.schemaId]; - return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._)`/*# sourceURL=${schId} */` : codegen_1.nil; - } - function subschemaCode(it, valid) { - if (isSchemaObj(it)) { - checkKeywords(it); - if (schemaCxtHasRules(it)) { - subSchemaObjCode(it, valid); - return; - } - } - (0, boolSchema_1.boolOrEmptySchema)(it, valid); - } - function schemaCxtHasRules({ schema, self }) { - if (typeof schema == "boolean") - return !schema; - for (const key in schema) - if (self.RULES.all[key]) - return true; - return false; - } - function isSchemaObj(it) { - return typeof it.schema != "boolean"; - } - function subSchemaObjCode(it, valid) { - const { schema, gen, opts } = it; - if (opts.$comment && schema.$comment) - commentKeyword(it); - updateContext(it); - checkAsyncSchema(it); - const errsCount = gen.const("_errs", names_1.default.errors); - typeAndKeywords(it, errsCount); - gen.var(valid, (0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); - } - function checkKeywords(it) { - (0, util_1.checkUnknownRules)(it); - checkRefsAndKeywords(it); - } - function typeAndKeywords(it, errsCount) { - if (it.opts.jtd) - return schemaKeywords(it, [], false, errsCount); - const types = (0, dataType_1.getSchemaTypes)(it.schema); - const checkedTypes = (0, dataType_1.coerceAndCheckDataType)(it, types); - schemaKeywords(it, types, !checkedTypes, errsCount); - } - function checkRefsAndKeywords(it) { - const { schema, errSchemaPath, opts, self } = it; - if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) { - self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`); - } - } - function checkNoDefault(it) { - const { schema, opts } = it; - if (schema.default !== void 0 && opts.useDefaults && opts.strictSchema) { - (0, util_1.checkStrictMode)(it, "default is ignored in the schema root"); - } - } - function updateContext(it) { - const schId = it.schema[it.opts.schemaId]; - if (schId) - it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId); - } - function checkAsyncSchema(it) { - if (it.schema.$async && !it.schemaEnv.$async) - throw new Error("async schema in sync schema"); - } - function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) { - const msg = schema.$comment; - if (opts.$comment === true) { - gen.code((0, codegen_1._)`${names_1.default.self}.logger.log(${msg})`); - } else if (typeof opts.$comment == "function") { - const schemaPath = (0, codegen_1.str)`${errSchemaPath}/$comment`; - const rootName = gen.scopeValue("root", { ref: schemaEnv.root }); - gen.code((0, codegen_1._)`${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`); - } - } - function returnResults(it) { - const { gen, schemaEnv, validateName, ValidationError, opts } = it; - if (schemaEnv.$async) { - gen.if((0, codegen_1._)`${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._)`new ${ValidationError}(${names_1.default.vErrors})`)); - } else { - gen.assign((0, codegen_1._)`${validateName}.errors`, names_1.default.vErrors); - if (opts.unevaluated) - assignEvaluated(it); - gen.return((0, codegen_1._)`${names_1.default.errors} === 0`); - } - } - function assignEvaluated({ gen, evaluated, props, items }) { - if (props instanceof codegen_1.Name) - gen.assign((0, codegen_1._)`${evaluated}.props`, props); - if (items instanceof codegen_1.Name) - gen.assign((0, codegen_1._)`${evaluated}.items`, items); - } - function schemaKeywords(it, types, typeErrors, errsCount) { - const { gen, schema, data, allErrors, opts, self } = it; - const { RULES } = self; - if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) { - gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition)); - return; - } - if (!opts.jtd) - checkStrictTypes(it, types); - gen.block(() => { - for (const group of RULES.rules) - groupKeywords(group); - groupKeywords(RULES.post); - }); - function groupKeywords(group) { - if (!(0, applicability_1.shouldUseGroup)(schema, group)) - return; - if (group.type) { - gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers)); - iterateKeywords(it, group); - if (types.length === 1 && types[0] === group.type && typeErrors) { - gen.else(); - (0, dataType_2.reportTypeError)(it); - } - gen.endIf(); - } else { - iterateKeywords(it, group); - } - if (!allErrors) - gen.if((0, codegen_1._)`${names_1.default.errors} === ${errsCount || 0}`); - } - } - function iterateKeywords(it, group) { - const { gen, schema, opts: { useDefaults } } = it; - if (useDefaults) - (0, defaults_1.assignDefaults)(it, group.type); - gen.block(() => { - for (const rule of group.rules) { - if ((0, applicability_1.shouldUseRule)(schema, rule)) { - keywordCode(it, rule.keyword, rule.definition, group.type); - } - } - }); - } - function checkStrictTypes(it, types) { - if (it.schemaEnv.meta || !it.opts.strictTypes) - return; - checkContextTypes(it, types); - if (!it.opts.allowUnionTypes) - checkMultipleTypes(it, types); - checkKeywordTypes(it, it.dataTypes); - } - function checkContextTypes(it, types) { - if (!types.length) - return; - if (!it.dataTypes.length) { - it.dataTypes = types; - return; - } - types.forEach((t) => { - if (!includesType(it.dataTypes, t)) { - strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`); - } - }); - narrowSchemaTypes(it, types); - } - function checkMultipleTypes(it, ts) { - if (ts.length > 1 && !(ts.length === 2 && ts.includes("null"))) { - strictTypesError(it, "use allowUnionTypes to allow union type keyword"); - } - } - function checkKeywordTypes(it, ts) { - const rules = it.self.RULES.all; - for (const keyword in rules) { - const rule = rules[keyword]; - if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) { - const { type } = rule.definition; - if (type.length && !type.some((t) => hasApplicableType(ts, t))) { - strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`); - } - } - } - } - function hasApplicableType(schTs, kwdT) { - return schTs.includes(kwdT) || kwdT === "number" && schTs.includes("integer"); - } - function includesType(ts, t) { - return ts.includes(t) || t === "integer" && ts.includes("number"); - } - function narrowSchemaTypes(it, withTypes) { - const ts = []; - for (const t of it.dataTypes) { - if (includesType(withTypes, t)) - ts.push(t); - else if (withTypes.includes("integer") && t === "number") - ts.push("integer"); - } - it.dataTypes = ts; - } - function strictTypesError(it, msg) { - const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; - msg += ` at "${schemaPath}" (strictTypes)`; - (0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes); - } - var KeywordCxt = class { - constructor(it, def, keyword) { - (0, keyword_1.validateKeywordUsage)(it, def, keyword); - this.gen = it.gen; - this.allErrors = it.allErrors; - this.keyword = keyword; - this.data = it.data; - this.schema = it.schema[keyword]; - this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data; - this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data); - this.schemaType = def.schemaType; - this.parentSchema = it.schema; - this.params = {}; - this.it = it; - this.def = def; - if (this.$data) { - this.schemaCode = it.gen.const("vSchema", getData(this.$data, it)); - } else { - this.schemaCode = this.schemaValue; - if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) { - throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`); - } - } - if ("code" in def ? def.trackErrors : def.errors !== false) { - this.errsCount = it.gen.const("_errs", names_1.default.errors); - } - } - result(condition, successAction, failAction) { - this.failResult((0, codegen_1.not)(condition), successAction, failAction); - } - failResult(condition, successAction, failAction) { - this.gen.if(condition); - if (failAction) - failAction(); - else - this.error(); - if (successAction) { - this.gen.else(); - successAction(); - if (this.allErrors) - this.gen.endIf(); - } else { - if (this.allErrors) - this.gen.endIf(); - else - this.gen.else(); - } - } - pass(condition, failAction) { - this.failResult((0, codegen_1.not)(condition), void 0, failAction); - } - fail(condition) { - if (condition === void 0) { - this.error(); - if (!this.allErrors) - this.gen.if(false); - return; - } - this.gen.if(condition); - this.error(); - if (this.allErrors) - this.gen.endIf(); - else - this.gen.else(); - } - fail$data(condition) { - if (!this.$data) - return this.fail(condition); - const { schemaCode } = this; - this.fail((0, codegen_1._)`${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`); - } - error(append, errorParams, errorPaths) { - if (errorParams) { - this.setParams(errorParams); - this._error(append, errorPaths); - this.setParams({}); - return; - } - this._error(append, errorPaths); - } - _error(append, errorPaths) { - ; - (append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths); - } - $dataError() { - (0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError); - } - reset() { - if (this.errsCount === void 0) - throw new Error('add "trackErrors" to keyword definition'); - (0, errors_1.resetErrorsCount)(this.gen, this.errsCount); - } - ok(cond) { - if (!this.allErrors) - this.gen.if(cond); - } - setParams(obj, assign) { - if (assign) - Object.assign(this.params, obj); - else - this.params = obj; - } - block$data(valid, codeBlock, $dataValid = codegen_1.nil) { - this.gen.block(() => { - this.check$data(valid, $dataValid); - codeBlock(); - }); - } - check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) { - if (!this.$data) - return; - const { gen, schemaCode, schemaType, def } = this; - gen.if((0, codegen_1.or)((0, codegen_1._)`${schemaCode} === undefined`, $dataValid)); - if (valid !== codegen_1.nil) - gen.assign(valid, true); - if (schemaType.length || def.validateSchema) { - gen.elseIf(this.invalid$data()); - this.$dataError(); - if (valid !== codegen_1.nil) - gen.assign(valid, false); - } - gen.else(); - } - invalid$data() { - const { gen, schemaCode, schemaType, def, it } = this; - return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema()); - function wrong$DataType() { - if (schemaType.length) { - if (!(schemaCode instanceof codegen_1.Name)) - throw new Error("ajv implementation error"); - const st = Array.isArray(schemaType) ? schemaType : [schemaType]; - return (0, codegen_1._)`${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`; - } - return codegen_1.nil; - } - function invalid$DataSchema() { - if (def.validateSchema) { - const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema }); - return (0, codegen_1._)`!${validateSchemaRef}(${schemaCode})`; - } - return codegen_1.nil; - } - } - subschema(appl, valid) { - const subschema = (0, subschema_1.getSubschema)(this.it, appl); - (0, subschema_1.extendSubschemaData)(subschema, this.it, appl); - (0, subschema_1.extendSubschemaMode)(subschema, appl); - const nextContext = { ...this.it, ...subschema, items: void 0, props: void 0 }; - subschemaCode(nextContext, valid); - return nextContext; - } - mergeEvaluated(schemaCxt, toName) { - const { it, gen } = this; - if (!it.opts.unevaluated) - return; - if (it.props !== true && schemaCxt.props !== void 0) { - it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName); - } - if (it.items !== true && schemaCxt.items !== void 0) { - it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName); - } - } - mergeValidEvaluated(schemaCxt, valid) { - const { it, gen } = this; - if (it.opts.unevaluated && (it.props !== true || it.items !== true)) { - gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name)); - return true; - } - } - }; - exports.KeywordCxt = KeywordCxt; - function keywordCode(it, keyword, def, ruleType) { - const cxt = new KeywordCxt(it, def, keyword); - if ("code" in def) { - def.code(cxt, ruleType); - } else if (cxt.$data && def.validate) { - (0, keyword_1.funcKeywordCode)(cxt, def); - } else if ("macro" in def) { - (0, keyword_1.macroKeywordCode)(cxt, def); - } else if (def.compile || def.validate) { - (0, keyword_1.funcKeywordCode)(cxt, def); - } - } - var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/; - var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/; - function getData($data, { dataLevel, dataNames, dataPathArr }) { - let jsonPointer; - let data; - if ($data === "") - return names_1.default.rootData; - if ($data[0] === "/") { - if (!JSON_POINTER.test($data)) - throw new Error(`Invalid JSON-pointer: ${$data}`); - jsonPointer = $data; - data = names_1.default.rootData; - } else { - const matches = RELATIVE_JSON_POINTER.exec($data); - if (!matches) - throw new Error(`Invalid JSON-pointer: ${$data}`); - const up = +matches[1]; - jsonPointer = matches[2]; - if (jsonPointer === "#") { - if (up >= dataLevel) - throw new Error(errorMsg("property/index", up)); - return dataPathArr[dataLevel - up]; - } - if (up > dataLevel) - throw new Error(errorMsg("data", up)); - data = dataNames[dataLevel - up]; - if (!jsonPointer) - return data; - } - let expr = data; - const segments = jsonPointer.split("/"); - for (const segment of segments) { - if (segment) { - data = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`; - expr = (0, codegen_1._)`${expr} && ${data}`; - } - } - return expr; - function errorMsg(pointerType, up) { - return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`; - } - } - exports.getData = getData; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js -var require_validation_error2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ValidationError = class extends Error { - constructor(errors) { - super("validation failed"); - this.errors = errors; - this.ajv = this.validation = true; - } - }; - exports.default = ValidationError; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js -var require_ref_error2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var resolve_1 = require_resolve2(); - var MissingRefError = class extends Error { - constructor(resolver, baseId, ref, msg) { - super(msg || `can't resolve reference ${ref} from id ${baseId}`); - this.missingRef = (0, resolve_1.resolveUrl)(resolver, baseId, ref); - this.missingSchema = (0, resolve_1.normalizeId)((0, resolve_1.getFullPath)(resolver, this.missingRef)); - } - }; - exports.default = MissingRefError; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js -var require_compile2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; - var codegen_1 = require_codegen2(); - var validation_error_1 = require_validation_error2(); - var names_1 = require_names2(); - var resolve_1 = require_resolve2(); - var util_1 = require_util2(); - var validate_1 = require_validate2(); - var SchemaEnv = class { - constructor(env) { - var _a3; - this.refs = {}; - this.dynamicAnchors = {}; - let schema; - if (typeof env.schema == "object") - schema = env.schema; - this.schema = env.schema; - this.schemaId = env.schemaId; - this.root = env.root || this; - this.baseId = (_a3 = env.baseId) !== null && _a3 !== void 0 ? _a3 : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]); - this.schemaPath = env.schemaPath; - this.localRefs = env.localRefs; - this.meta = env.meta; - this.$async = schema === null || schema === void 0 ? void 0 : schema.$async; - this.refs = {}; - } - }; - exports.SchemaEnv = SchemaEnv; - function compileSchema(sch) { - const _sch = getCompilingSchema.call(this, sch); - if (_sch) - return _sch; - const rootId = (0, resolve_1.getFullPath)(this.opts.uriResolver, sch.root.baseId); - const { es5, lines } = this.opts.code; - const { ownProperties } = this.opts; - const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties }); - let _ValidationError; - if (sch.$async) { - _ValidationError = gen.scopeValue("Error", { - ref: validation_error_1.default, - code: (0, codegen_1._)`require("ajv/dist/runtime/validation_error").default` - }); - } - const validateName = gen.scopeName("validate"); - sch.validateName = validateName; - const schemaCxt = { - gen, - allErrors: this.opts.allErrors, - data: names_1.default.data, - parentData: names_1.default.parentData, - parentDataProperty: names_1.default.parentDataProperty, - dataNames: [names_1.default.data], - dataPathArr: [codegen_1.nil], - // TODO can its length be used as dataLevel if nil is removed? - dataLevel: 0, - dataTypes: [], - definedProperties: /* @__PURE__ */ new Set(), - topSchemaRef: gen.scopeValue("schema", this.opts.code.source === true ? { ref: sch.schema, code: (0, codegen_1.stringify)(sch.schema) } : { ref: sch.schema }), - validateName, - ValidationError: _ValidationError, - schema: sch.schema, - schemaEnv: sch, - rootId, - baseId: sch.baseId || rootId, - schemaPath: codegen_1.nil, - errSchemaPath: sch.schemaPath || (this.opts.jtd ? "" : "#"), - errorPath: (0, codegen_1._)`""`, - opts: this.opts, - self: this - }; - let sourceCode; - try { - this._compilations.add(sch); - (0, validate_1.validateFunctionCode)(schemaCxt); - gen.optimize(this.opts.code.optimize); - const validateCode = gen.toString(); - sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${validateCode}`; - if (this.opts.code.process) - sourceCode = this.opts.code.process(sourceCode, sch); - const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); - const validate2 = makeValidate(this, this.scope.get()); - this.scope.value(validateName, { ref: validate2 }); - validate2.errors = null; - validate2.schema = sch.schema; - validate2.schemaEnv = sch; - if (sch.$async) - validate2.$async = true; - if (this.opts.code.source === true) { - validate2.source = { validateName, validateCode, scopeValues: gen._values }; - } - if (this.opts.unevaluated) { - const { props, items } = schemaCxt; - validate2.evaluated = { - props: props instanceof codegen_1.Name ? void 0 : props, - items: items instanceof codegen_1.Name ? void 0 : items, - dynamicProps: props instanceof codegen_1.Name, - dynamicItems: items instanceof codegen_1.Name - }; - if (validate2.source) - validate2.source.evaluated = (0, codegen_1.stringify)(validate2.evaluated); - } - sch.validate = validate2; - return sch; - } catch (e) { - delete sch.validate; - delete sch.validateName; - if (sourceCode) - this.logger.error("Error compiling schema, function code:", sourceCode); - throw e; - } finally { - this._compilations.delete(sch); - } - } - exports.compileSchema = compileSchema; - function resolveRef2(root, baseId, ref) { - var _a3; - ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref); - const schOrFunc = root.refs[ref]; - if (schOrFunc) - return schOrFunc; - let _sch = resolve.call(this, root, ref); - if (_sch === void 0) { - const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref]; - const { schemaId } = this.opts; - if (schema) - _sch = new SchemaEnv({ schema, schemaId, root, baseId }); - } - if (_sch === void 0) - return; - return root.refs[ref] = inlineOrCompile.call(this, _sch); - } - exports.resolveRef = resolveRef2; - function inlineOrCompile(sch) { - if ((0, resolve_1.inlineRef)(sch.schema, this.opts.inlineRefs)) - return sch.schema; - return sch.validate ? sch : compileSchema.call(this, sch); - } - function getCompilingSchema(schEnv) { - for (const sch of this._compilations) { - if (sameSchemaEnv(sch, schEnv)) - return sch; - } - } - exports.getCompilingSchema = getCompilingSchema; - function sameSchemaEnv(s1, s2) { - return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId; - } - function resolve(root, ref) { - let sch; - while (typeof (sch = this.refs[ref]) == "string") - ref = sch; - return sch || this.schemas[ref] || resolveSchema.call(this, root, ref); - } - function resolveSchema(root, ref) { - const p = this.opts.uriResolver.parse(ref); - const refPath = (0, resolve_1._getFullPath)(this.opts.uriResolver, p); - let baseId = (0, resolve_1.getFullPath)(this.opts.uriResolver, root.baseId, void 0); - if (Object.keys(root.schema).length > 0 && refPath === baseId) { - return getJsonPointer.call(this, p, root); - } - const id = (0, resolve_1.normalizeId)(refPath); - const schOrRef = this.refs[id] || this.schemas[id]; - if (typeof schOrRef == "string") { - const sch = resolveSchema.call(this, root, schOrRef); - if (typeof (sch === null || sch === void 0 ? void 0 : sch.schema) !== "object") - return; - return getJsonPointer.call(this, p, sch); - } - if (typeof (schOrRef === null || schOrRef === void 0 ? void 0 : schOrRef.schema) !== "object") - return; - if (!schOrRef.validate) - compileSchema.call(this, schOrRef); - if (id === (0, resolve_1.normalizeId)(ref)) { - const { schema } = schOrRef; - const { schemaId } = this.opts; - const schId = schema[schemaId]; - if (schId) - baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); - return new SchemaEnv({ schema, schemaId, root, baseId }); - } - return getJsonPointer.call(this, p, schOrRef); - } - exports.resolveSchema = resolveSchema; - var PREVENT_SCOPE_CHANGE = /* @__PURE__ */ new Set([ - "properties", - "patternProperties", - "enum", - "dependencies", - "definitions" - ]); - function getJsonPointer(parsedRef, { baseId, schema, root }) { - var _a3; - if (((_a3 = parsedRef.fragment) === null || _a3 === void 0 ? void 0 : _a3[0]) !== "/") - return; - for (const part of parsedRef.fragment.slice(1).split("/")) { - if (typeof schema === "boolean") - return; - const partSchema = schema[(0, util_1.unescapeFragment)(part)]; - if (partSchema === void 0) - return; - schema = partSchema; - const schId = typeof schema === "object" && schema[this.opts.schemaId]; - if (!PREVENT_SCOPE_CHANGE.has(part) && schId) { - baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); - } - } - let env; - if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) { - const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref); - env = resolveSchema.call(this, root, $ref); - } - const { schemaId } = this.opts; - env = env || new SchemaEnv({ schema, schemaId, root, baseId }); - if (env.schema !== env.root.schema) - return env; - return void 0; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json -var require_data2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json"(exports, module) { - module.exports = { - $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", - description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", - type: "object", - required: ["$data"], - properties: { - $data: { - type: "string", - anyOf: [{ format: "relative-json-pointer" }, { format: "json-pointer" }] - } - }, - additionalProperties: false - }; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js -var require_uri2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var uri = require_fast_uri(); - uri.code = 'require("ajv/dist/runtime/uri").default'; - exports.default = uri; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/core.js -var require_core3 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/core.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; - var validate_1 = require_validate2(); - Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { - return validate_1.KeywordCxt; - } }); - var codegen_1 = require_codegen2(); - Object.defineProperty(exports, "_", { enumerable: true, get: function() { - return codegen_1._; - } }); - Object.defineProperty(exports, "str", { enumerable: true, get: function() { - return codegen_1.str; - } }); - Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { - return codegen_1.stringify; - } }); - Object.defineProperty(exports, "nil", { enumerable: true, get: function() { - return codegen_1.nil; - } }); - Object.defineProperty(exports, "Name", { enumerable: true, get: function() { - return codegen_1.Name; - } }); - Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { - return codegen_1.CodeGen; - } }); - var validation_error_1 = require_validation_error2(); - var ref_error_1 = require_ref_error2(); - var rules_1 = require_rules2(); - var compile_1 = require_compile2(); - var codegen_2 = require_codegen2(); - var resolve_1 = require_resolve2(); - var dataType_1 = require_dataType2(); - var util_1 = require_util2(); - var $dataRefSchema = require_data2(); - var uri_1 = require_uri2(); - var defaultRegExp = (str, flags) => new RegExp(str, flags); - defaultRegExp.code = "new RegExp"; - var META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes"]; - var EXT_SCOPE_NAMES = /* @__PURE__ */ new Set([ - "validate", - "serialize", - "parse", - "wrapper", - "root", - "schema", - "keyword", - "pattern", - "formats", - "validate$data", - "func", - "obj", - "Error" - ]); - var removedOptions = { - errorDataPath: "", - format: "`validateFormats: false` can be used instead.", - nullable: '"nullable" keyword is supported by default.', - jsonPointers: "Deprecated jsPropertySyntax can be used instead.", - extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.", - missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.", - processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`", - sourceCode: "Use option `code: {source: true}`", - strictDefaults: "It is default now, see option `strict`.", - strictKeywords: "It is default now, see option `strict`.", - uniqueItems: '"uniqueItems" keyword is always validated.', - unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).", - cache: "Map is used as cache, schema object as key.", - serialize: "Map is used as cache, schema object as key.", - ajvErrors: "It is default now." - }; - var deprecatedOptions = { - ignoreKeywordsWithRef: "", - jsPropertySyntax: "", - unicode: '"minLength"/"maxLength" account for unicode characters by default.' - }; - var MAX_EXPRESSION = 200; - function requiredOptions(o) { - var _a3, _b, _c, _d, _e2, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; - const s = o.strict; - const _optz = (_a3 = o.code) === null || _a3 === void 0 ? void 0 : _a3.optimize; - const optimize = _optz === true || _optz === void 0 ? 1 : _optz || 0; - const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp; - const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default; - return { - strictSchema: (_f = (_e2 = o.strictSchema) !== null && _e2 !== void 0 ? _e2 : s) !== null && _f !== void 0 ? _f : true, - strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true, - strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log", - strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log", - strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false, - code: o.code ? { ...o.code, optimize, regExp } : { optimize, regExp }, - loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION, - loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION, - meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true, - messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true, - inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true, - schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id", - addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true, - validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true, - validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true, - unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true, - int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true, - uriResolver - }; - } - var Ajv2 = class { - constructor(opts = {}) { - this.schemas = {}; - this.refs = {}; - this.formats = /* @__PURE__ */ Object.create(null); - this._compilations = /* @__PURE__ */ new Set(); - this._loading = {}; - this._cache = /* @__PURE__ */ new Map(); - opts = this.opts = { ...opts, ...requiredOptions(opts) }; - const { es5, lines } = this.opts.code; - this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines }); - this.logger = getLogger(opts.logger); - const formatOpt = opts.validateFormats; - opts.validateFormats = false; - this.RULES = (0, rules_1.getRules)(); - checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED"); - checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn"); - this._metaOpts = getMetaSchemaOptions.call(this); - if (opts.formats) - addInitialFormats.call(this); - this._addVocabularies(); - this._addDefaultMetaSchema(); - if (opts.keywords) - addInitialKeywords.call(this, opts.keywords); - if (typeof opts.meta == "object") - this.addMetaSchema(opts.meta); - addInitialSchemas.call(this); - opts.validateFormats = formatOpt; - } - _addVocabularies() { - this.addKeyword("$async"); - } - _addDefaultMetaSchema() { - const { $data, meta: meta3, schemaId } = this.opts; - let _dataRefSchema = $dataRefSchema; - if (schemaId === "id") { - _dataRefSchema = { ...$dataRefSchema }; - _dataRefSchema.id = _dataRefSchema.$id; - delete _dataRefSchema.$id; - } - if (meta3 && $data) - this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false); - } - defaultMeta() { - const { meta: meta3, schemaId } = this.opts; - return this.opts.defaultMeta = typeof meta3 == "object" ? meta3[schemaId] || meta3 : void 0; - } - validate(schemaKeyRef, data) { - let v2; - if (typeof schemaKeyRef == "string") { - v2 = this.getSchema(schemaKeyRef); - if (!v2) - throw new Error(`no schema with key or ref "${schemaKeyRef}"`); - } else { - v2 = this.compile(schemaKeyRef); - } - const valid = v2(data); - if (!("$async" in v2)) - this.errors = v2.errors; - return valid; - } - compile(schema, _meta) { - const sch = this._addSchema(schema, _meta); - return sch.validate || this._compileSchemaEnv(sch); - } - compileAsync(schema, meta3) { - if (typeof this.opts.loadSchema != "function") { - throw new Error("options.loadSchema should be a function"); - } - const { loadSchema } = this.opts; - return runCompileAsync.call(this, schema, meta3); - async function runCompileAsync(_schema, _meta) { - await loadMetaSchema.call(this, _schema.$schema); - const sch = this._addSchema(_schema, _meta); - return sch.validate || _compileAsync.call(this, sch); - } - async function loadMetaSchema($ref) { - if ($ref && !this.getSchema($ref)) { - await runCompileAsync.call(this, { $ref }, true); - } - } - async function _compileAsync(sch) { - try { - return this._compileSchemaEnv(sch); - } catch (e) { - if (!(e instanceof ref_error_1.default)) - throw e; - checkLoaded.call(this, e); - await loadMissingSchema.call(this, e.missingSchema); - return _compileAsync.call(this, sch); - } - } - function checkLoaded({ missingSchema: ref, missingRef }) { - if (this.refs[ref]) { - throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`); - } - } - async function loadMissingSchema(ref) { - const _schema = await _loadSchema.call(this, ref); - if (!this.refs[ref]) - await loadMetaSchema.call(this, _schema.$schema); - if (!this.refs[ref]) - this.addSchema(_schema, ref, meta3); - } - async function _loadSchema(ref) { - const p = this._loading[ref]; - if (p) - return p; - try { - return await (this._loading[ref] = loadSchema(ref)); - } finally { - delete this._loading[ref]; - } - } - } - // Adds schema to the instance - addSchema(schema, key, _meta, _validateSchema = this.opts.validateSchema) { - if (Array.isArray(schema)) { - for (const sch of schema) - this.addSchema(sch, void 0, _meta, _validateSchema); - return this; - } - let id; - if (typeof schema === "object") { - const { schemaId } = this.opts; - id = schema[schemaId]; - if (id !== void 0 && typeof id != "string") { - throw new Error(`schema ${schemaId} must be string`); - } - } - key = (0, resolve_1.normalizeId)(key || id); - this._checkUnique(key); - this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true); - return this; - } - // Add schema that will be used to validate other schemas - // options in META_IGNORE_OPTIONS are alway set to false - addMetaSchema(schema, key, _validateSchema = this.opts.validateSchema) { - this.addSchema(schema, key, true, _validateSchema); - return this; - } - // Validate schema against its meta-schema - validateSchema(schema, throwOrLogError) { - if (typeof schema == "boolean") - return true; - let $schema; - $schema = schema.$schema; - if ($schema !== void 0 && typeof $schema != "string") { - throw new Error("$schema must be a string"); - } - $schema = $schema || this.opts.defaultMeta || this.defaultMeta(); - if (!$schema) { - this.logger.warn("meta-schema not available"); - this.errors = null; - return true; - } - const valid = this.validate($schema, schema); - if (!valid && throwOrLogError) { - const message = "schema is invalid: " + this.errorsText(); - if (this.opts.validateSchema === "log") - this.logger.error(message); - else - throw new Error(message); - } - return valid; - } - // Get compiled schema by `key` or `ref`. - // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id) - getSchema(keyRef) { - let sch; - while (typeof (sch = getSchEnv.call(this, keyRef)) == "string") - keyRef = sch; - if (sch === void 0) { - const { schemaId } = this.opts; - const root = new compile_1.SchemaEnv({ schema: {}, schemaId }); - sch = compile_1.resolveSchema.call(this, root, keyRef); - if (!sch) - return; - this.refs[keyRef] = sch; - } - return sch.validate || this._compileSchemaEnv(sch); - } - // Remove cached schema(s). - // If no parameter is passed all schemas but meta-schemas are removed. - // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. - // Even if schema is referenced by other schemas it still can be removed as other schemas have local references. - removeSchema(schemaKeyRef) { - if (schemaKeyRef instanceof RegExp) { - this._removeAllSchemas(this.schemas, schemaKeyRef); - this._removeAllSchemas(this.refs, schemaKeyRef); - return this; - } - switch (typeof schemaKeyRef) { - case "undefined": - this._removeAllSchemas(this.schemas); - this._removeAllSchemas(this.refs); - this._cache.clear(); - return this; - case "string": { - const sch = getSchEnv.call(this, schemaKeyRef); - if (typeof sch == "object") - this._cache.delete(sch.schema); - delete this.schemas[schemaKeyRef]; - delete this.refs[schemaKeyRef]; - return this; - } - case "object": { - const cacheKey = schemaKeyRef; - this._cache.delete(cacheKey); - let id = schemaKeyRef[this.opts.schemaId]; - if (id) { - id = (0, resolve_1.normalizeId)(id); - delete this.schemas[id]; - delete this.refs[id]; - } - return this; - } - default: - throw new Error("ajv.removeSchema: invalid parameter"); - } - } - // add "vocabulary" - a collection of keywords - addVocabulary(definitions) { - for (const def of definitions) - this.addKeyword(def); - return this; - } - addKeyword(kwdOrDef, def) { - let keyword; - if (typeof kwdOrDef == "string") { - keyword = kwdOrDef; - if (typeof def == "object") { - this.logger.warn("these parameters are deprecated, see docs for addKeyword"); - def.keyword = keyword; - } - } else if (typeof kwdOrDef == "object" && def === void 0) { - def = kwdOrDef; - keyword = def.keyword; - if (Array.isArray(keyword) && !keyword.length) { - throw new Error("addKeywords: keyword must be string or non-empty array"); - } - } else { - throw new Error("invalid addKeywords parameters"); - } - checkKeyword.call(this, keyword, def); - if (!def) { - (0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd)); - return this; - } - keywordMetaschema.call(this, def); - const definition = { - ...def, - type: (0, dataType_1.getJSONTypes)(def.type), - schemaType: (0, dataType_1.getJSONTypes)(def.schemaType) - }; - (0, util_1.eachItem)(keyword, definition.type.length === 0 ? (k2) => addRule.call(this, k2, definition) : (k2) => definition.type.forEach((t) => addRule.call(this, k2, definition, t))); - return this; - } - getKeyword(keyword) { - const rule = this.RULES.all[keyword]; - return typeof rule == "object" ? rule.definition : !!rule; - } - // Remove keyword - removeKeyword(keyword) { - const { RULES } = this; - delete RULES.keywords[keyword]; - delete RULES.all[keyword]; - for (const group of RULES.rules) { - const i = group.rules.findIndex((rule) => rule.keyword === keyword); - if (i >= 0) - group.rules.splice(i, 1); - } - return this; - } - // Add format - addFormat(name, format) { - if (typeof format == "string") - format = new RegExp(format); - this.formats[name] = format; - return this; - } - errorsText(errors = this.errors, { separator = ", ", dataVar = "data" } = {}) { - if (!errors || errors.length === 0) - return "No errors"; - return errors.map((e) => `${dataVar}${e.instancePath} ${e.message}`).reduce((text, msg) => text + separator + msg); - } - $dataMetaSchema(metaSchema, keywordsJsonPointers) { - const rules = this.RULES.all; - metaSchema = JSON.parse(JSON.stringify(metaSchema)); - for (const jsonPointer of keywordsJsonPointers) { - const segments = jsonPointer.split("/").slice(1); - let keywords = metaSchema; - for (const seg of segments) - keywords = keywords[seg]; - for (const key in rules) { - const rule = rules[key]; - if (typeof rule != "object") - continue; - const { $data } = rule.definition; - const schema = keywords[key]; - if ($data && schema) - keywords[key] = schemaOrData(schema); - } - } - return metaSchema; - } - _removeAllSchemas(schemas, regex) { - for (const keyRef in schemas) { - const sch = schemas[keyRef]; - if (!regex || regex.test(keyRef)) { - if (typeof sch == "string") { - delete schemas[keyRef]; - } else if (sch && !sch.meta) { - this._cache.delete(sch.schema); - delete schemas[keyRef]; - } - } - } - } - _addSchema(schema, meta3, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) { - let id; - const { schemaId } = this.opts; - if (typeof schema == "object") { - id = schema[schemaId]; - } else { - if (this.opts.jtd) - throw new Error("schema must be object"); - else if (typeof schema != "boolean") - throw new Error("schema must be object or boolean"); - } - let sch = this._cache.get(schema); - if (sch !== void 0) - return sch; - baseId = (0, resolve_1.normalizeId)(id || baseId); - const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId); - sch = new compile_1.SchemaEnv({ schema, schemaId, meta: meta3, baseId, localRefs }); - this._cache.set(sch.schema, sch); - if (addSchema && !baseId.startsWith("#")) { - if (baseId) - this._checkUnique(baseId); - this.refs[baseId] = sch; - } - if (validateSchema) - this.validateSchema(schema, true); - return sch; - } - _checkUnique(id) { - if (this.schemas[id] || this.refs[id]) { - throw new Error(`schema with key or id "${id}" already exists`); - } - } - _compileSchemaEnv(sch) { - if (sch.meta) - this._compileMetaSchema(sch); - else - compile_1.compileSchema.call(this, sch); - if (!sch.validate) - throw new Error("ajv implementation error"); - return sch.validate; - } - _compileMetaSchema(sch) { - const currentOpts = this.opts; - this.opts = this._metaOpts; - try { - compile_1.compileSchema.call(this, sch); - } finally { - this.opts = currentOpts; - } - } - }; - Ajv2.ValidationError = validation_error_1.default; - Ajv2.MissingRefError = ref_error_1.default; - exports.default = Ajv2; - function checkOptions(checkOpts, options, msg, log = "error") { - for (const key in checkOpts) { - const opt = key; - if (opt in options) - this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`); - } - } - function getSchEnv(keyRef) { - keyRef = (0, resolve_1.normalizeId)(keyRef); - return this.schemas[keyRef] || this.refs[keyRef]; - } - function addInitialSchemas() { - const optsSchemas = this.opts.schemas; - if (!optsSchemas) - return; - if (Array.isArray(optsSchemas)) - this.addSchema(optsSchemas); - else - for (const key in optsSchemas) - this.addSchema(optsSchemas[key], key); - } - function addInitialFormats() { - for (const name in this.opts.formats) { - const format = this.opts.formats[name]; - if (format) - this.addFormat(name, format); - } - } - function addInitialKeywords(defs) { - if (Array.isArray(defs)) { - this.addVocabulary(defs); - return; - } - this.logger.warn("keywords option as map is deprecated, pass array"); - for (const keyword in defs) { - const def = defs[keyword]; - if (!def.keyword) - def.keyword = keyword; - this.addKeyword(def); - } - } - function getMetaSchemaOptions() { - const metaOpts = { ...this.opts }; - for (const opt of META_IGNORE_OPTIONS) - delete metaOpts[opt]; - return metaOpts; - } - var noLogs = { log() { - }, warn() { - }, error() { - } }; - function getLogger(logger) { - if (logger === false) - return noLogs; - if (logger === void 0) - return console; - if (logger.log && logger.warn && logger.error) - return logger; - throw new Error("logger must implement log, warn and error methods"); - } - var KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i; - function checkKeyword(keyword, def) { - const { RULES } = this; - (0, util_1.eachItem)(keyword, (kwd) => { - if (RULES.keywords[kwd]) - throw new Error(`Keyword ${kwd} is already defined`); - if (!KEYWORD_NAME.test(kwd)) - throw new Error(`Keyword ${kwd} has invalid name`); - }); - if (!def) - return; - if (def.$data && !("code" in def || "validate" in def)) { - throw new Error('$data keyword must have "code" or "validate" function'); - } - } - function addRule(keyword, definition, dataType) { - var _a3; - const post = definition === null || definition === void 0 ? void 0 : definition.post; - if (dataType && post) - throw new Error('keyword with "post" flag cannot have "type"'); - const { RULES } = this; - let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType); - if (!ruleGroup) { - ruleGroup = { type: dataType, rules: [] }; - RULES.rules.push(ruleGroup); - } - RULES.keywords[keyword] = true; - if (!definition) - return; - const rule = { - keyword, - definition: { - ...definition, - type: (0, dataType_1.getJSONTypes)(definition.type), - schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType) - } - }; - if (definition.before) - addBeforeRule.call(this, ruleGroup, rule, definition.before); - else - ruleGroup.rules.push(rule); - RULES.all[keyword] = rule; - (_a3 = definition.implements) === null || _a3 === void 0 ? void 0 : _a3.forEach((kwd) => this.addKeyword(kwd)); - } - function addBeforeRule(ruleGroup, rule, before) { - const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before); - if (i >= 0) { - ruleGroup.rules.splice(i, 0, rule); - } else { - ruleGroup.rules.push(rule); - this.logger.warn(`rule ${before} is not defined`); - } - } - function keywordMetaschema(def) { - let { metaSchema } = def; - if (metaSchema === void 0) - return; - if (def.$data && this.opts.$data) - metaSchema = schemaOrData(metaSchema); - def.validateSchema = this.compile(metaSchema, true); - } - var $dataRef = { - $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" - }; - function schemaOrData(schema) { - return { anyOf: [schema, $dataRef] }; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js -var require_id2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var def = { - keyword: "id", - code() { - throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID'); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js -var require_ref2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.callRef = exports.getValidate = void 0; - var ref_error_1 = require_ref_error2(); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var compile_1 = require_compile2(); - var util_1 = require_util2(); - var def = { - keyword: "$ref", - schemaType: "string", - code(cxt) { - const { gen, schema: $ref, it } = cxt; - const { baseId, schemaEnv: env, validateName, opts, self } = it; - const { root } = env; - if (($ref === "#" || $ref === "#/") && baseId === root.baseId) - return callRootRef(); - const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref); - if (schOrEnv === void 0) - throw new ref_error_1.default(it.opts.uriResolver, baseId, $ref); - if (schOrEnv instanceof compile_1.SchemaEnv) - return callValidate(schOrEnv); - return inlineRefSchema(schOrEnv); - function callRootRef() { - if (env === root) - return callRef(cxt, validateName, env, env.$async); - const rootName = gen.scopeValue("root", { ref: root }); - return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async); - } - function callValidate(sch) { - const v2 = getValidate(cxt, sch); - callRef(cxt, v2, sch, sch.$async); - } - function inlineRefSchema(sch) { - const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: (0, codegen_1.stringify)(sch) } : { ref: sch }); - const valid = gen.name("valid"); - const schCxt = cxt.subschema({ - schema: sch, - dataTypes: [], - schemaPath: codegen_1.nil, - topSchemaRef: schName, - errSchemaPath: $ref - }, valid); - cxt.mergeEvaluated(schCxt); - cxt.ok(valid); - } - } - }; - function getValidate(cxt, sch) { - const { gen } = cxt; - return sch.validate ? gen.scopeValue("validate", { ref: sch.validate }) : (0, codegen_1._)`${gen.scopeValue("wrapper", { ref: sch })}.validate`; - } - exports.getValidate = getValidate; - function callRef(cxt, v2, sch, $async) { - const { gen, it } = cxt; - const { allErrors, schemaEnv: env, opts } = it; - const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil; - if ($async) - callAsyncRef(); - else - callSyncRef(); - function callAsyncRef() { - if (!env.$async) - throw new Error("async schema referenced by sync schema"); - const valid = gen.let("valid"); - gen.try(() => { - gen.code((0, codegen_1._)`await ${(0, code_1.callValidateCode)(cxt, v2, passCxt)}`); - addEvaluatedFrom(v2); - if (!allErrors) - gen.assign(valid, true); - }, (e) => { - gen.if((0, codegen_1._)`!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e)); - addErrorsFrom(e); - if (!allErrors) - gen.assign(valid, false); - }); - cxt.ok(valid); - } - function callSyncRef() { - cxt.result((0, code_1.callValidateCode)(cxt, v2, passCxt), () => addEvaluatedFrom(v2), () => addErrorsFrom(v2)); - } - function addErrorsFrom(source) { - const errs = (0, codegen_1._)`${source}.errors`; - gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`); - gen.assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); - } - function addEvaluatedFrom(source) { - var _a3; - if (!it.opts.unevaluated) - return; - const schEvaluated = (_a3 = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a3 === void 0 ? void 0 : _a3.evaluated; - if (it.props !== true) { - if (schEvaluated && !schEvaluated.dynamicProps) { - if (schEvaluated.props !== void 0) { - it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props); - } - } else { - const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`); - it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name); - } - } - if (it.items !== true) { - if (schEvaluated && !schEvaluated.dynamicItems) { - if (schEvaluated.items !== void 0) { - it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items); - } - } else { - const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`); - it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name); - } - } - } - } - exports.callRef = callRef; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js -var require_core4 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var id_1 = require_id2(); - var ref_1 = require_ref2(); - var core = [ - "$schema", - "$id", - "$defs", - "$vocabulary", - { keyword: "$comment" }, - "definitions", - id_1.default, - ref_1.default - ]; - exports.default = core; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js -var require_limitNumber2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var ops = codegen_1.operators; - var KWDs = { - maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, - minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, - exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, - exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE } - }; - var error61 = { - message: ({ keyword, schemaCode }) => (0, codegen_1.str)`must be ${KWDs[keyword].okStr} ${schemaCode}`, - params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}` - }; - var def = { - keyword: Object.keys(KWDs), - type: "number", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode } = cxt; - cxt.fail$data((0, codegen_1._)`${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js -var require_multipleOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var error61 = { - message: ({ schemaCode }) => (0, codegen_1.str)`must be multiple of ${schemaCode}`, - params: ({ schemaCode }) => (0, codegen_1._)`{multipleOf: ${schemaCode}}` - }; - var def = { - keyword: "multipleOf", - type: "number", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { gen, data, schemaCode, it } = cxt; - const prec = it.opts.multipleOfPrecision; - const res = gen.let("res"); - const invalid = prec ? (0, codegen_1._)`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}` : (0, codegen_1._)`${res} !== parseInt(${res})`; - cxt.fail$data((0, codegen_1._)`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js -var require_ucs2length2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - function ucs2length(str) { - const len = str.length; - let length = 0; - let pos = 0; - let value; - while (pos < len) { - length++; - value = str.charCodeAt(pos++); - if (value >= 55296 && value <= 56319 && pos < len) { - value = str.charCodeAt(pos); - if ((value & 64512) === 56320) - pos++; - } - } - return length; - } - exports.default = ucs2length; - ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default'; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js -var require_limitLength2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var ucs2length_1 = require_ucs2length2(); - var error61 = { - message({ keyword, schemaCode }) { - const comp = keyword === "maxLength" ? "more" : "fewer"; - return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} characters`; - }, - params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` - }; - var def = { - keyword: ["maxLength", "minLength"], - type: "string", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode, it } = cxt; - const op = keyword === "maxLength" ? codegen_1.operators.GT : codegen_1.operators.LT; - const len = it.opts.unicode === false ? (0, codegen_1._)`${data}.length` : (0, codegen_1._)`${(0, util_1.useFunc)(cxt.gen, ucs2length_1.default)}(${data})`; - cxt.fail$data((0, codegen_1._)`${len} ${op} ${schemaCode}`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js -var require_pattern2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var util_1 = require_util2(); - var codegen_1 = require_codegen2(); - var error61 = { - message: ({ schemaCode }) => (0, codegen_1.str)`must match pattern "${schemaCode}"`, - params: ({ schemaCode }) => (0, codegen_1._)`{pattern: ${schemaCode}}` - }; - var def = { - keyword: "pattern", - type: "string", - schemaType: "string", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schema, schemaCode, it } = cxt; - const u = it.opts.unicodeRegExp ? "u" : ""; - if ($data) { - const { regExp } = it.opts.code; - const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); - const valid = gen.let("valid"); - gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); - cxt.fail$data((0, codegen_1._)`!${valid}`); - } else { - const regExp = (0, code_1.usePattern)(cxt, schema); - cxt.fail$data((0, codegen_1._)`!${regExp}.test(${data})`); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js -var require_limitProperties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var error61 = { - message({ keyword, schemaCode }) { - const comp = keyword === "maxProperties" ? "more" : "fewer"; - return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} properties`; - }, - params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` - }; - var def = { - keyword: ["maxProperties", "minProperties"], - type: "object", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode } = cxt; - const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT; - cxt.fail$data((0, codegen_1._)`Object.keys(${data}).length ${op} ${schemaCode}`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js -var require_required2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params: { missingProperty } }) => (0, codegen_1.str)`must have required property '${missingProperty}'`, - params: ({ params: { missingProperty } }) => (0, codegen_1._)`{missingProperty: ${missingProperty}}` - }; - var def = { - keyword: "required", - type: "object", - schemaType: "array", - $data: true, - error: error61, - code(cxt) { - const { gen, schema, schemaCode, data, $data, it } = cxt; - const { opts } = it; - if (!$data && schema.length === 0) - return; - const useLoop = schema.length >= opts.loopRequired; - if (it.allErrors) - allErrorsMode(); - else - exitOnErrorMode(); - if (opts.strictRequired) { - const props = cxt.parentSchema.properties; - const { definedProperties } = cxt.it; - for (const requiredKey of schema) { - if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === void 0 && !definedProperties.has(requiredKey)) { - const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; - const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`; - (0, util_1.checkStrictMode)(it, msg, it.opts.strictRequired); - } - } - } - function allErrorsMode() { - if (useLoop || $data) { - cxt.block$data(codegen_1.nil, loopAllRequired); - } else { - for (const prop of schema) { - (0, code_1.checkReportMissingProp)(cxt, prop); - } - } - } - function exitOnErrorMode() { - const missing = gen.let("missing"); - if (useLoop || $data) { - const valid = gen.let("valid", true); - cxt.block$data(valid, () => loopUntilMissing(missing, valid)); - cxt.ok(valid); - } else { - gen.if((0, code_1.checkMissingProp)(cxt, schema, missing)); - (0, code_1.reportMissingProp)(cxt, missing); - gen.else(); - } - } - function loopAllRequired() { - gen.forOf("prop", schemaCode, (prop) => { - cxt.setParams({ missingProperty: prop }); - gen.if((0, code_1.noPropertyInData)(gen, data, prop, opts.ownProperties), () => cxt.error()); - }); - } - function loopUntilMissing(missing, valid) { - cxt.setParams({ missingProperty: missing }); - gen.forOf(missing, schemaCode, () => { - gen.assign(valid, (0, code_1.propertyInData)(gen, data, missing, opts.ownProperties)); - gen.if((0, codegen_1.not)(valid), () => { - cxt.error(); - gen.break(); - }); - }, codegen_1.nil); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js -var require_limitItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var error61 = { - message({ keyword, schemaCode }) { - const comp = keyword === "maxItems" ? "more" : "fewer"; - return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} items`; - }, - params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` - }; - var def = { - keyword: ["maxItems", "minItems"], - type: "array", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode } = cxt; - const op = keyword === "maxItems" ? codegen_1.operators.GT : codegen_1.operators.LT; - cxt.fail$data((0, codegen_1._)`${data}.length ${op} ${schemaCode}`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js -var require_equal2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var equal = require_fast_deep_equal(); - equal.code = 'require("ajv/dist/runtime/equal").default'; - exports.default = equal; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js -var require_uniqueItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var dataType_1 = require_dataType2(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var equal_1 = require_equal2(); - var error61 = { - message: ({ params: { i, j: j2 } }) => (0, codegen_1.str)`must NOT have duplicate items (items ## ${j2} and ${i} are identical)`, - params: ({ params: { i, j: j2 } }) => (0, codegen_1._)`{i: ${i}, j: ${j2}}` - }; - var def = { - keyword: "uniqueItems", - type: "array", - schemaType: "boolean", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt; - if (!$data && !schema) - return; - const valid = gen.let("valid"); - const itemTypes = parentSchema.items ? (0, dataType_1.getSchemaTypes)(parentSchema.items) : []; - cxt.block$data(valid, validateUniqueItems, (0, codegen_1._)`${schemaCode} === false`); - cxt.ok(valid); - function validateUniqueItems() { - const i = gen.let("i", (0, codegen_1._)`${data}.length`); - const j2 = gen.let("j"); - cxt.setParams({ i, j: j2 }); - gen.assign(valid, true); - gen.if((0, codegen_1._)`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j2)); - } - function canOptimize() { - return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array"); - } - function loopN(i, j2) { - const item = gen.name("item"); - const wrongType = (0, dataType_1.checkDataTypes)(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong); - const indices = gen.const("indices", (0, codegen_1._)`{}`); - gen.for((0, codegen_1._)`;${i}--;`, () => { - gen.let(item, (0, codegen_1._)`${data}[${i}]`); - gen.if(wrongType, (0, codegen_1._)`continue`); - if (itemTypes.length > 1) - gen.if((0, codegen_1._)`typeof ${item} == "string"`, (0, codegen_1._)`${item} += "_"`); - gen.if((0, codegen_1._)`typeof ${indices}[${item}] == "number"`, () => { - gen.assign(j2, (0, codegen_1._)`${indices}[${item}]`); - cxt.error(); - gen.assign(valid, false).break(); - }).code((0, codegen_1._)`${indices}[${item}] = ${i}`); - }); - } - function loopN2(i, j2) { - const eql = (0, util_1.useFunc)(gen, equal_1.default); - const outer = gen.name("outer"); - gen.label(outer).for((0, codegen_1._)`;${i}--;`, () => gen.for((0, codegen_1._)`${j2} = ${i}; ${j2}--;`, () => gen.if((0, codegen_1._)`${eql}(${data}[${i}], ${data}[${j2}])`, () => { - cxt.error(); - gen.assign(valid, false).break(outer); - }))); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js -var require_const2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var equal_1 = require_equal2(); - var error61 = { - message: "must be equal to constant", - params: ({ schemaCode }) => (0, codegen_1._)`{allowedValue: ${schemaCode}}` - }; - var def = { - keyword: "const", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schemaCode, schema } = cxt; - if ($data || schema && typeof schema == "object") { - cxt.fail$data((0, codegen_1._)`!${(0, util_1.useFunc)(gen, equal_1.default)}(${data}, ${schemaCode})`); - } else { - cxt.fail((0, codegen_1._)`${schema} !== ${data}`); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js -var require_enum2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var equal_1 = require_equal2(); - var error61 = { - message: "must be equal to one of the allowed values", - params: ({ schemaCode }) => (0, codegen_1._)`{allowedValues: ${schemaCode}}` - }; - var def = { - keyword: "enum", - schemaType: "array", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schema, schemaCode, it } = cxt; - if (!$data && schema.length === 0) - throw new Error("enum must have non-empty array"); - const useLoop = schema.length >= it.opts.loopEnum; - let eql; - const getEql = () => eql !== null && eql !== void 0 ? eql : eql = (0, util_1.useFunc)(gen, equal_1.default); - let valid; - if (useLoop || $data) { - valid = gen.let("valid"); - cxt.block$data(valid, loopEnum); - } else { - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - const vSchema = gen.const("vSchema", schemaCode); - valid = (0, codegen_1.or)(...schema.map((_x, i) => equalCode(vSchema, i))); - } - cxt.pass(valid); - function loopEnum() { - gen.assign(valid, false); - gen.forOf("v", schemaCode, (v2) => gen.if((0, codegen_1._)`${getEql()}(${data}, ${v2})`, () => gen.assign(valid, true).break())); - } - function equalCode(vSchema, i) { - const sch = schema[i]; - return typeof sch === "object" && sch !== null ? (0, codegen_1._)`${getEql()}(${data}, ${vSchema}[${i}])` : (0, codegen_1._)`${data} === ${sch}`; - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js -var require_validation2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var limitNumber_1 = require_limitNumber2(); - var multipleOf_1 = require_multipleOf2(); - var limitLength_1 = require_limitLength2(); - var pattern_1 = require_pattern2(); - var limitProperties_1 = require_limitProperties2(); - var required_1 = require_required2(); - var limitItems_1 = require_limitItems2(); - var uniqueItems_1 = require_uniqueItems2(); - var const_1 = require_const2(); - var enum_1 = require_enum2(); - var validation = [ - // number - limitNumber_1.default, - multipleOf_1.default, - // string - limitLength_1.default, - pattern_1.default, - // object - limitProperties_1.default, - required_1.default, - // array - limitItems_1.default, - uniqueItems_1.default, - // any - { keyword: "type", schemaType: ["string", "array"] }, - { keyword: "nullable", schemaType: "boolean" }, - const_1.default, - enum_1.default - ]; - exports.default = validation; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js -var require_additionalItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateAdditionalItems = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, - params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` - }; - var def = { - keyword: "additionalItems", - type: "array", - schemaType: ["boolean", "object"], - before: "uniqueItems", - error: error61, - code(cxt) { - const { parentSchema, it } = cxt; - const { items } = parentSchema; - if (!Array.isArray(items)) { - (0, util_1.checkStrictMode)(it, '"additionalItems" is ignored when "items" is not an array of schemas'); - return; - } - validateAdditionalItems(cxt, items); - } - }; - function validateAdditionalItems(cxt, items) { - const { gen, schema, data, keyword, it } = cxt; - it.items = true; - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - if (schema === false) { - cxt.setParams({ len: items.length }); - cxt.pass((0, codegen_1._)`${len} <= ${items.length}`); - } else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { - const valid = gen.var("valid", (0, codegen_1._)`${len} <= ${items.length}`); - gen.if((0, codegen_1.not)(valid), () => validateItems(valid)); - cxt.ok(valid); - } - function validateItems(valid) { - gen.forRange("i", items.length, len, (i) => { - cxt.subschema({ keyword, dataProp: i, dataPropType: util_1.Type.Num }, valid); - if (!it.allErrors) - gen.if((0, codegen_1.not)(valid), () => gen.break()); - }); - } - } - exports.validateAdditionalItems = validateAdditionalItems; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js -var require_items2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateTuple = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var code_1 = require_code4(); - var def = { - keyword: "items", - type: "array", - schemaType: ["object", "array", "boolean"], - before: "uniqueItems", - code(cxt) { - const { schema, it } = cxt; - if (Array.isArray(schema)) - return validateTuple(cxt, "additionalItems", schema); - it.items = true; - if ((0, util_1.alwaysValidSchema)(it, schema)) - return; - cxt.ok((0, code_1.validateArray)(cxt)); - } - }; - function validateTuple(cxt, extraItems, schArr = cxt.schema) { - const { gen, parentSchema, data, keyword, it } = cxt; - checkStrictTuple(parentSchema); - if (it.opts.unevaluated && schArr.length && it.items !== true) { - it.items = util_1.mergeEvaluated.items(gen, schArr.length, it.items); - } - const valid = gen.name("valid"); - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - schArr.forEach((sch, i) => { - if ((0, util_1.alwaysValidSchema)(it, sch)) - return; - gen.if((0, codegen_1._)`${len} > ${i}`, () => cxt.subschema({ - keyword, - schemaProp: i, - dataProp: i - }, valid)); - cxt.ok(valid); - }); - function checkStrictTuple(sch) { - const { opts, errSchemaPath } = it; - const l3 = schArr.length; - const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); - if (opts.strictTuples && !fullTuple) { - const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; - (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); - } - } - } - exports.validateTuple = validateTuple; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js -var require_prefixItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var items_1 = require_items2(); - var def = { - keyword: "prefixItems", - type: "array", - schemaType: ["array"], - before: "uniqueItems", - code: (cxt) => (0, items_1.validateTuple)(cxt, "items") - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js -var require_items20202 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var code_1 = require_code4(); - var additionalItems_1 = require_additionalItems2(); - var error61 = { - message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, - params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` - }; - var def = { - keyword: "items", - type: "array", - schemaType: ["object", "boolean"], - before: "uniqueItems", - error: error61, - code(cxt) { - const { schema, parentSchema, it } = cxt; - const { prefixItems } = parentSchema; - it.items = true; - if ((0, util_1.alwaysValidSchema)(it, schema)) - return; - if (prefixItems) - (0, additionalItems_1.validateAdditionalItems)(cxt, prefixItems); - else - cxt.ok((0, code_1.validateArray)(cxt)); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js -var require_contains2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1.str)`must contain at least ${min} valid item(s)` : (0, codegen_1.str)`must contain at least ${min} and no more than ${max} valid item(s)`, - params: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1._)`{minContains: ${min}}` : (0, codegen_1._)`{minContains: ${min}, maxContains: ${max}}` - }; - var def = { - keyword: "contains", - type: "array", - schemaType: ["object", "boolean"], - before: "uniqueItems", - trackErrors: true, - error: error61, - code(cxt) { - const { gen, schema, parentSchema, data, it } = cxt; - let min; - let max; - const { minContains, maxContains } = parentSchema; - if (it.opts.next) { - min = minContains === void 0 ? 1 : minContains; - max = maxContains; - } else { - min = 1; - } - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - cxt.setParams({ min, max }); - if (max === void 0 && min === 0) { - (0, util_1.checkStrictMode)(it, `"minContains" == 0 without "maxContains": "contains" keyword ignored`); - return; - } - if (max !== void 0 && min > max) { - (0, util_1.checkStrictMode)(it, `"minContains" > "maxContains" is always invalid`); - cxt.fail(); - return; - } - if ((0, util_1.alwaysValidSchema)(it, schema)) { - let cond = (0, codegen_1._)`${len} >= ${min}`; - if (max !== void 0) - cond = (0, codegen_1._)`${cond} && ${len} <= ${max}`; - cxt.pass(cond); - return; - } - it.items = true; - const valid = gen.name("valid"); - if (max === void 0 && min === 1) { - validateItems(valid, () => gen.if(valid, () => gen.break())); - } else if (min === 0) { - gen.let(valid, true); - if (max !== void 0) - gen.if((0, codegen_1._)`${data}.length > 0`, validateItemsWithCount); - } else { - gen.let(valid, false); - validateItemsWithCount(); - } - cxt.result(valid, () => cxt.reset()); - function validateItemsWithCount() { - const schValid = gen.name("_valid"); - const count = gen.let("count", 0); - validateItems(schValid, () => gen.if(schValid, () => checkLimits(count))); - } - function validateItems(_valid, block) { - gen.forRange("i", 0, len, (i) => { - cxt.subschema({ - keyword: "contains", - dataProp: i, - dataPropType: util_1.Type.Num, - compositeRule: true - }, _valid); - block(); - }); - } - function checkLimits(count) { - gen.code((0, codegen_1._)`${count}++`); - if (max === void 0) { - gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break()); - } else { - gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break()); - if (min === 1) - gen.assign(valid, true); - else - gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true)); - } - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js -var require_dependencies2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var code_1 = require_code4(); - exports.error = { - message: ({ params: { property, depsCount, deps } }) => { - const property_ies = depsCount === 1 ? "property" : "properties"; - return (0, codegen_1.str)`must have ${property_ies} ${deps} when property ${property} is present`; - }, - params: ({ params: { property, depsCount, deps, missingProperty } }) => (0, codegen_1._)`{property: ${property}, - missingProperty: ${missingProperty}, - depsCount: ${depsCount}, - deps: ${deps}}` - // TODO change to reference - }; - var def = { - keyword: "dependencies", - type: "object", - schemaType: "object", - error: exports.error, - code(cxt) { - const [propDeps, schDeps] = splitDependencies(cxt); - validatePropertyDeps(cxt, propDeps); - validateSchemaDeps(cxt, schDeps); - } - }; - function splitDependencies({ schema }) { - const propertyDeps = {}; - const schemaDeps = {}; - for (const key in schema) { - if (key === "__proto__") - continue; - const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps; - deps[key] = schema[key]; - } - return [propertyDeps, schemaDeps]; - } - function validatePropertyDeps(cxt, propertyDeps = cxt.schema) { - const { gen, data, it } = cxt; - if (Object.keys(propertyDeps).length === 0) - return; - const missing = gen.let("missing"); - for (const prop in propertyDeps) { - const deps = propertyDeps[prop]; - if (deps.length === 0) - continue; - const hasProperty = (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties); - cxt.setParams({ - property: prop, - depsCount: deps.length, - deps: deps.join(", ") - }); - if (it.allErrors) { - gen.if(hasProperty, () => { - for (const depProp of deps) { - (0, code_1.checkReportMissingProp)(cxt, depProp); - } - }); - } else { - gen.if((0, codegen_1._)`${hasProperty} && (${(0, code_1.checkMissingProp)(cxt, deps, missing)})`); - (0, code_1.reportMissingProp)(cxt, missing); - gen.else(); - } - } - } - exports.validatePropertyDeps = validatePropertyDeps; - function validateSchemaDeps(cxt, schemaDeps = cxt.schema) { - const { gen, data, keyword, it } = cxt; - const valid = gen.name("valid"); - for (const prop in schemaDeps) { - if ((0, util_1.alwaysValidSchema)(it, schemaDeps[prop])) - continue; - gen.if( - (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties), - () => { - const schCxt = cxt.subschema({ keyword, schemaProp: prop }, valid); - cxt.mergeValidEvaluated(schCxt, valid); - }, - () => gen.var(valid, true) - // TODO var - ); - cxt.ok(valid); - } - } - exports.validateSchemaDeps = validateSchemaDeps; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js -var require_propertyNames2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: "property name must be valid", - params: ({ params }) => (0, codegen_1._)`{propertyName: ${params.propertyName}}` - }; - var def = { - keyword: "propertyNames", - type: "object", - schemaType: ["object", "boolean"], - error: error61, - code(cxt) { - const { gen, schema, data, it } = cxt; - if ((0, util_1.alwaysValidSchema)(it, schema)) - return; - const valid = gen.name("valid"); - gen.forIn("key", data, (key) => { - cxt.setParams({ propertyName: key }); - cxt.subschema({ - keyword: "propertyNames", - data: key, - dataTypes: ["string"], - propertyName: key, - compositeRule: true - }, valid); - gen.if((0, codegen_1.not)(valid), () => { - cxt.error(true); - if (!it.allErrors) - gen.break(); - }); - }); - cxt.ok(valid); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js -var require_additionalProperties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var util_1 = require_util2(); - var error61 = { - message: "must NOT have additional properties", - params: ({ params }) => (0, codegen_1._)`{additionalProperty: ${params.additionalProperty}}` - }; - var def = { - keyword: "additionalProperties", - type: ["object"], - schemaType: ["boolean", "object"], - allowUndefined: true, - trackErrors: true, - error: error61, - code(cxt) { - const { gen, schema, parentSchema, data, errsCount, it } = cxt; - if (!errsCount) - throw new Error("ajv implementation error"); - const { allErrors, opts } = it; - it.props = true; - if (opts.removeAdditional !== "all" && (0, util_1.alwaysValidSchema)(it, schema)) - return; - const props = (0, code_1.allSchemaProperties)(parentSchema.properties); - const patProps = (0, code_1.allSchemaProperties)(parentSchema.patternProperties); - checkAdditionalProperties(); - cxt.ok((0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); - function checkAdditionalProperties() { - gen.forIn("key", data, (key) => { - if (!props.length && !patProps.length) - additionalPropertyCode(key); - else - gen.if(isAdditional(key), () => additionalPropertyCode(key)); - }); - } - function isAdditional(key) { - let definedProp; - if (props.length > 8) { - const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema.properties, "properties"); - definedProp = (0, code_1.isOwnProperty)(gen, propsSchema, key); - } else if (props.length) { - definedProp = (0, codegen_1.or)(...props.map((p) => (0, codegen_1._)`${key} === ${p}`)); - } else { - definedProp = codegen_1.nil; - } - if (patProps.length) { - definedProp = (0, codegen_1.or)(definedProp, ...patProps.map((p) => (0, codegen_1._)`${(0, code_1.usePattern)(cxt, p)}.test(${key})`)); - } - return (0, codegen_1.not)(definedProp); - } - function deleteAdditional(key) { - gen.code((0, codegen_1._)`delete ${data}[${key}]`); - } - function additionalPropertyCode(key) { - if (opts.removeAdditional === "all" || opts.removeAdditional && schema === false) { - deleteAdditional(key); - return; - } - if (schema === false) { - cxt.setParams({ additionalProperty: key }); - cxt.error(); - if (!allErrors) - gen.break(); - return; - } - if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { - const valid = gen.name("valid"); - if (opts.removeAdditional === "failing") { - applyAdditionalSchema(key, valid, false); - gen.if((0, codegen_1.not)(valid), () => { - cxt.reset(); - deleteAdditional(key); - }); - } else { - applyAdditionalSchema(key, valid); - if (!allErrors) - gen.if((0, codegen_1.not)(valid), () => gen.break()); - } - } - } - function applyAdditionalSchema(key, valid, errors) { - const subschema = { - keyword: "additionalProperties", - dataProp: key, - dataPropType: util_1.Type.Str - }; - if (errors === false) { - Object.assign(subschema, { - compositeRule: true, - createErrors: false, - allErrors: false - }); - } - cxt.subschema(subschema, valid); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js -var require_properties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var validate_1 = require_validate2(); - var code_1 = require_code4(); - var util_1 = require_util2(); - var additionalProperties_1 = require_additionalProperties2(); - var def = { - keyword: "properties", - type: "object", - schemaType: "object", - code(cxt) { - const { gen, schema, parentSchema, data, it } = cxt; - if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === void 0) { - additionalProperties_1.default.code(new validate_1.KeywordCxt(it, additionalProperties_1.default, "additionalProperties")); - } - const allProps = (0, code_1.allSchemaProperties)(schema); - for (const prop of allProps) { - it.definedProperties.add(prop); - } - if (it.opts.unevaluated && allProps.length && it.props !== true) { - it.props = util_1.mergeEvaluated.props(gen, (0, util_1.toHash)(allProps), it.props); - } - const properties = allProps.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p])); - if (properties.length === 0) - return; - const valid = gen.name("valid"); - for (const prop of properties) { - if (hasDefault(prop)) { - applyPropertySchema(prop); - } else { - gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties)); - applyPropertySchema(prop); - if (!it.allErrors) - gen.else().var(valid, true); - gen.endIf(); - } - cxt.it.definedProperties.add(prop); - cxt.ok(valid); - } - function hasDefault(prop) { - return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== void 0; - } - function applyPropertySchema(prop) { - cxt.subschema({ - keyword: "properties", - schemaProp: prop, - dataProp: prop - }, valid); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js -var require_patternProperties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var util_2 = require_util2(); - var def = { - keyword: "patternProperties", - type: "object", - schemaType: "object", - code(cxt) { - const { gen, schema, data, parentSchema, it } = cxt; - const { opts } = it; - const patterns = (0, code_1.allSchemaProperties)(schema); - const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p])); - if (patterns.length === 0 || alwaysValidPatterns.length === patterns.length && (!it.opts.unevaluated || it.props === true)) { - return; - } - const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties; - const valid = gen.name("valid"); - if (it.props !== true && !(it.props instanceof codegen_1.Name)) { - it.props = (0, util_2.evaluatedPropsToName)(gen, it.props); - } - const { props } = it; - validatePatternProperties(); - function validatePatternProperties() { - for (const pat of patterns) { - if (checkProperties) - checkMatchingProperties(pat); - if (it.allErrors) { - validateProperties(pat); - } else { - gen.var(valid, true); - validateProperties(pat); - gen.if(valid); - } - } - } - function checkMatchingProperties(pat) { - for (const prop in checkProperties) { - if (new RegExp(pat).test(prop)) { - (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`); - } - } - } - function validateProperties(pat) { - gen.forIn("key", data, (key) => { - gen.if((0, codegen_1._)`${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => { - const alwaysValid = alwaysValidPatterns.includes(pat); - if (!alwaysValid) { - cxt.subschema({ - keyword: "patternProperties", - schemaProp: pat, - dataProp: key, - dataPropType: util_2.Type.Str - }, valid); - } - if (it.opts.unevaluated && props !== true) { - gen.assign((0, codegen_1._)`${props}[${key}]`, true); - } else if (!alwaysValid && !it.allErrors) { - gen.if((0, codegen_1.not)(valid), () => gen.break()); - } - }); - }); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js -var require_not2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util2(); - var def = { - keyword: "not", - schemaType: ["object", "boolean"], - trackErrors: true, - code(cxt) { - const { gen, schema, it } = cxt; - if ((0, util_1.alwaysValidSchema)(it, schema)) { - cxt.fail(); - return; - } - const valid = gen.name("valid"); - cxt.subschema({ - keyword: "not", - compositeRule: true, - createErrors: false, - allErrors: false - }, valid); - cxt.failResult(valid, () => cxt.reset(), () => cxt.error()); - }, - error: { message: "must NOT be valid" } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js -var require_anyOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var def = { - keyword: "anyOf", - schemaType: "array", - trackErrors: true, - code: code_1.validateUnion, - error: { message: "must match a schema in anyOf" } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js -var require_oneOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: "must match exactly one schema in oneOf", - params: ({ params }) => (0, codegen_1._)`{passingSchemas: ${params.passing}}` - }; - var def = { - keyword: "oneOf", - schemaType: "array", - trackErrors: true, - error: error61, - code(cxt) { - const { gen, schema, parentSchema, it } = cxt; - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - if (it.opts.discriminator && parentSchema.discriminator) - return; - const schArr = schema; - const valid = gen.let("valid", false); - const passing = gen.let("passing", null); - const schValid = gen.name("_valid"); - cxt.setParams({ passing }); - gen.block(validateOneOf); - cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); - function validateOneOf() { - schArr.forEach((sch, i) => { - let schCxt; - if ((0, util_1.alwaysValidSchema)(it, sch)) { - gen.var(schValid, true); - } else { - schCxt = cxt.subschema({ - keyword: "oneOf", - schemaProp: i, - compositeRule: true - }, schValid); - } - if (i > 0) { - gen.if((0, codegen_1._)`${schValid} && ${valid}`).assign(valid, false).assign(passing, (0, codegen_1._)`[${passing}, ${i}]`).else(); - } - gen.if(schValid, () => { - gen.assign(valid, true); - gen.assign(passing, i); - if (schCxt) - cxt.mergeEvaluated(schCxt, codegen_1.Name); - }); - }); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js -var require_allOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util2(); - var def = { - keyword: "allOf", - schemaType: "array", - code(cxt) { - const { gen, schema, it } = cxt; - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - const valid = gen.name("valid"); - schema.forEach((sch, i) => { - if ((0, util_1.alwaysValidSchema)(it, sch)) - return; - const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid); - cxt.ok(valid); - cxt.mergeEvaluated(schCxt); - }); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js -var require_if2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); var error61 = { message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`, params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}` @@ -12133,12 +6319,12 @@ var require_if2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js -var require_thenElse2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { +// node_modules/ajv/dist/vocabularies/applicator/thenElse.js +var require_thenElse = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util2(); + var util_1 = require_util(); var def = { keyword: ["then", "else"], schemaType: ["object", "boolean"], @@ -12151,27 +6337,27 @@ var require_thenElse2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js -var require_applicator2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { +// node_modules/ajv/dist/vocabularies/applicator/index.js +var require_applicator = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var additionalItems_1 = require_additionalItems2(); - var prefixItems_1 = require_prefixItems2(); - var items_1 = require_items2(); - var items2020_1 = require_items20202(); - var contains_1 = require_contains2(); - var dependencies_1 = require_dependencies2(); - var propertyNames_1 = require_propertyNames2(); - var additionalProperties_1 = require_additionalProperties2(); - var properties_1 = require_properties2(); - var patternProperties_1 = require_patternProperties2(); - var not_1 = require_not2(); - var anyOf_1 = require_anyOf2(); - var oneOf_1 = require_oneOf2(); - var allOf_1 = require_allOf2(); - var if_1 = require_if2(); - var thenElse_1 = require_thenElse2(); + var additionalItems_1 = require_additionalItems(); + var prefixItems_1 = require_prefixItems(); + var items_1 = require_items(); + var items2020_1 = require_items2020(); + var contains_1 = require_contains(); + var dependencies_1 = require_dependencies(); + var propertyNames_1 = require_propertyNames(); + var additionalProperties_1 = require_additionalProperties(); + var properties_1 = require_properties(); + var patternProperties_1 = require_patternProperties(); + var not_1 = require_not(); + var anyOf_1 = require_anyOf(); + var oneOf_1 = require_oneOf(); + var allOf_1 = require_allOf(); + var if_1 = require_if(); + var thenElse_1 = require_thenElse(); function getApplicator(draft2020 = false) { const applicator = [ // any @@ -12199,12 +6385,12 @@ var require_applicator2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js -var require_format3 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { +// node_modules/ajv/dist/vocabularies/format/format.js +var require_format = __commonJS({ + "node_modules/ajv/dist/vocabularies/format/format.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); + var codegen_1 = require_codegen(); var error61 = { message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`, params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}` @@ -12289,20 +6475,20 @@ var require_format3 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js -var require_format4 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { +// node_modules/ajv/dist/vocabularies/format/index.js +var require_format2 = __commonJS({ + "node_modules/ajv/dist/vocabularies/format/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var format_1 = require_format3(); + var format_1 = require_format(); var format = [format_1.default]; exports.default = format; } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js -var require_metadata2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { +// node_modules/ajv/dist/vocabularies/metadata.js +var require_metadata = __commonJS({ + "node_modules/ajv/dist/vocabularies/metadata.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.contentVocabulary = exports.metadataVocabulary = void 0; @@ -12323,16 +6509,16 @@ var require_metadata2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js -var require_draft72 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { +// node_modules/ajv/dist/vocabularies/draft7.js +var require_draft7 = __commonJS({ + "node_modules/ajv/dist/vocabularies/draft7.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var core_1 = require_core4(); - var validation_1 = require_validation2(); - var applicator_1 = require_applicator2(); - var format_1 = require_format4(); - var metadata_1 = require_metadata2(); + var core_1 = require_core2(); + var validation_1 = require_validation(); + var applicator_1 = require_applicator(); + var format_1 = require_format2(); + var metadata_1 = require_metadata(); var draft7Vocabularies = [ core_1.default, validation_1.default, @@ -12345,9 +6531,9 @@ var require_draft72 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js -var require_types2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { +// node_modules/ajv/dist/vocabularies/discriminator/types.js +var require_types = __commonJS({ + "node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DiscrError = void 0; @@ -12359,16 +6545,16 @@ var require_types2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js -var require_discriminator2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { +// node_modules/ajv/dist/vocabularies/discriminator/index.js +var require_discriminator = __commonJS({ + "node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var types_1 = require_types2(); - var compile_1 = require_compile2(); - var ref_error_1 = require_ref_error2(); - var util_1 = require_util2(); + var codegen_1 = require_codegen(); + var types_1 = require_types(); + var compile_1 = require_compile(); + var ref_error_1 = require_ref_error(); + var util_1 = require_util(); var error61 = { message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`, params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}` @@ -12464,9 +6650,9 @@ var require_discriminator2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json -var require_json_schema_draft_072 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { +// node_modules/ajv/dist/refs/json-schema-draft-07.json +var require_json_schema_draft_07 = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { module.exports = { $schema: "http://json-schema.org/draft-07/schema#", $id: "http://json-schema.org/draft-07/schema#", @@ -12621,16 +6807,16 @@ var require_json_schema_draft_072 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/ajv.js -var require_ajv2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/ajv.js"(exports, module) { +// node_modules/ajv/dist/ajv.js +var require_ajv = __commonJS({ + "node_modules/ajv/dist/ajv.js"(exports, module) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; - var core_1 = require_core3(); - var draft7_1 = require_draft72(); - var discriminator_1 = require_discriminator2(); - var draft7MetaSchema = require_json_schema_draft_072(); + var core_1 = require_core(); + var draft7_1 = require_draft7(); + var discriminator_1 = require_discriminator(); + var draft7MetaSchema = require_json_schema_draft_07(); var META_SUPPORT_DATA = ["/properties"]; var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema"; var Ajv2 = class extends core_1.default { @@ -12657,11 +6843,11 @@ var require_ajv2 = __commonJS({ module.exports.Ajv = Ajv2; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Ajv2; - var validate_1 = require_validate2(); + var validate_1 = require_validate(); Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { return validate_1.KeywordCxt; } }); - var codegen_1 = require_codegen2(); + var codegen_1 = require_codegen(); Object.defineProperty(exports, "_", { enumerable: true, get: function() { return codegen_1._; } }); @@ -12680,25 +6866,228 @@ var require_ajv2 = __commonJS({ Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { return codegen_1.CodeGen; } }); - var validation_error_1 = require_validation_error2(); + var validation_error_1 = require_validation_error(); Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { return validation_error_1.default; } }); - var ref_error_1 = require_ref_error2(); + var ref_error_1 = require_ref_error(); Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { return ref_error_1.default; } }); } }); +// node_modules/ajv-formats/dist/formats.js +var require_formats = __commonJS({ + "node_modules/ajv-formats/dist/formats.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.formatNames = exports.fastFormats = exports.fullFormats = void 0; + function fmtDef(validate2, compare) { + return { validate: validate2, compare }; + } + exports.fullFormats = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: fmtDef(date5, compareDate), + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: fmtDef(getTime(true), compareTime), + "date-time": fmtDef(getDateTime(true), compareDateTime), + "iso-time": fmtDef(getTime(), compareIsoTime), + "iso-date-time": fmtDef(getDateTime(), compareIsoDateTime), + // duration: https://tools.ietf.org/html/rfc3339#appendix-A + duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, + uri, + "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i, + // uri-template: https://tools.ietf.org/html/rfc6570 + "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i, + // For the source: https://gist.github.com/dperini/729294 + // For test cases: https://mathiasbynens.be/demo/url-regex + url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/, + ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, + regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/, + "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/, + // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types + // byte: https://github.com/miguelmota/is-base64 + byte, + // signed 32 bit integer + int32: { type: "number", validate: validateInt32 }, + // signed 64 bit integer + int64: { type: "number", validate: validateInt64 }, + // C-type float + float: { type: "number", validate: validateNumber }, + // C-type double + double: { type: "number", validate: validateNumber }, + // hint to the UI to hide input strings + password: true, + // unchecked string payload + binary: true + }; + exports.fastFormats = { + ...exports.fullFormats, + date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate), + time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime), + "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), + "iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime), + "iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime), + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, + "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i + }; + exports.formatNames = Object.keys(exports.fullFormats); + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; + var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function date5(str) { + const matches = DATE.exec(str); + if (!matches) + return false; + const year = +matches[1]; + const month = +matches[2]; + const day = +matches[3]; + return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]); + } + function compareDate(d1, d2) { + if (!(d1 && d2)) + return void 0; + if (d1 > d2) + return 1; + if (d1 < d2) + return -1; + return 0; + } + var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i; + function getTime(strictTimeZone) { + return function time3(str) { + const matches = TIME.exec(str); + if (!matches) + return false; + const hr = +matches[1]; + const min = +matches[2]; + const sec = +matches[3]; + const tz = matches[4]; + const tzSign = matches[5] === "-" ? -1 : 1; + const tzH = +(matches[6] || 0); + const tzM = +(matches[7] || 0); + if (tzH > 23 || tzM > 59 || strictTimeZone && !tz) + return false; + if (hr <= 23 && min <= 59 && sec < 60) + return true; + const utcMin = min - tzM * tzSign; + const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0); + return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61; + }; + } + function compareTime(s1, s2) { + if (!(s1 && s2)) + return void 0; + const t1 = (/* @__PURE__ */ new Date("2020-01-01T" + s1)).valueOf(); + const t2 = (/* @__PURE__ */ new Date("2020-01-01T" + s2)).valueOf(); + if (!(t1 && t2)) + return void 0; + return t1 - t2; + } + function compareIsoTime(t1, t2) { + if (!(t1 && t2)) + return void 0; + const a1 = TIME.exec(t1); + const a2 = TIME.exec(t2); + if (!(a1 && a2)) + return void 0; + t1 = a1[1] + a1[2] + a1[3]; + t2 = a2[1] + a2[2] + a2[3]; + if (t1 > t2) + return 1; + if (t1 < t2) + return -1; + return 0; + } + var DATE_TIME_SEPARATOR = /t|\s/i; + function getDateTime(strictTimeZone) { + const time3 = getTime(strictTimeZone); + return function date_time(str) { + const dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length === 2 && date5(dateTime[0]) && time3(dateTime[1]); + }; + } + function compareDateTime(dt1, dt2) { + if (!(dt1 && dt2)) + return void 0; + const d1 = new Date(dt1).valueOf(); + const d2 = new Date(dt2).valueOf(); + if (!(d1 && d2)) + return void 0; + return d1 - d2; + } + function compareIsoDateTime(dt1, dt2) { + if (!(dt1 && dt2)) + return void 0; + const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR); + const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR); + const res = compareDate(d1, d2); + if (res === void 0) + return void 0; + return res || compareTime(t1, t2); + } + var NOT_URI_FRAGMENT = /\/|:/; + var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; + function uri(str) { + return NOT_URI_FRAGMENT.test(str) && URI.test(str); + } + var BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm; + function byte(str) { + BYTE.lastIndex = 0; + return BYTE.test(str); + } + var MIN_INT32 = -(2 ** 31); + var MAX_INT32 = 2 ** 31 - 1; + function validateInt32(value) { + return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32; + } + function validateInt64(value) { + return Number.isInteger(value); + } + function validateNumber() { + return true; + } + var Z_ANCHOR = /[^\\]\\Z/; + function regex(str) { + if (Z_ANCHOR.test(str)) + return false; + try { + new RegExp(str); + return true; + } catch (e) { + return false; + } + } + } +}); + // node_modules/ajv-formats/dist/limit.js var require_limit = __commonJS({ "node_modules/ajv-formats/dist/limit.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatLimitDefinition = void 0; - var ajv_1 = require_ajv2(); - var codegen_1 = require_codegen2(); + var ajv_1 = require_ajv(); + var codegen_1 = require_codegen(); var ops = codegen_1.operators; var KWDs = { formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, @@ -12770,7 +7159,7 @@ var require_dist = __commonJS({ Object.defineProperty(exports, "__esModule", { value: true }); var formats_1 = require_formats(); var limit_1 = require_limit(); - var codegen_1 = require_codegen2(); + var codegen_1 = require_codegen(); var fullName = new codegen_1.Name("fullFormats"); var fastName = new codegen_1.Name("fastFormats"); var formatsPlugin = (ajv, opts = { keywords: true }) => { @@ -25050,8 +19439,8 @@ function registry() { var globalRegistry = globalThis.__zod_globalRegistry; // node_modules/zod/v4/core/compile.js -var INVALID = /* @__PURE__ */ Symbol.for("zod.compile.invalid"); -var FALLBACK_FLAG = /* @__PURE__ */ Symbol.for("zod.compile.fallback"); +var INVALID = Symbol.for("zod.compile.invalid"); +var FALLBACK_FLAG = Symbol.for("zod.compile.fallback"); var ZodCompileAsyncError = class extends Error { constructor(message = "z.compile does not support async refinements, transforms, or checks") { super(message); @@ -28680,7 +23069,7 @@ var nonoptionalProcessor = (schema, ctx, _json, params) => { const seen = ctx.seen.get(schema); seen.ref = def.innerType; }; -var UNREPRESENTABLE_DEFAULT = /* @__PURE__ */ Symbol(); +var UNREPRESENTABLE_DEFAULT = Symbol(); function serializeDefaultValue(value, schema, ctx, json2, params) { let unrepresentable = false; const serialized = JSON.stringify(value, (_2, val) => { @@ -28919,7 +23308,7 @@ var JSONSchemaGenerator = class { var json_schema_exports = {}; // node_modules/zod/v4/core/visit.js -var RESOLVING = /* @__PURE__ */ Symbol("z.visit/resolving"); +var RESOLVING = Symbol("z.visit/resolving"); function visit(schema, fnOrHandlers) { const fn = typeof fnOrHandlers === "function" ? fnOrHandlers : (node2, rewritten) => { const h = fnOrHandlers[node2._zod.def.type]; @@ -33258,7 +27647,10 @@ function isTerminal(status) { return status === "completed" || status === "failed" || status === "cancelled"; } -// node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/parsers/string.js +// node_modules/zod-to-json-schema/dist/esm/Options.js +var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use"); + +// node_modules/zod-to-json-schema/dist/esm/parsers/string.js var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789"); // node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js @@ -35654,147 +30046,140 @@ function L() { return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null }; } var T = L(); -function G(l3) { - T = l3; +function G(u3) { + T = u3; } -var E = { exec: () => null }; -function d(l3, e = "") { - let t = typeof l3 == "string" ? l3 : l3.source, n = { replace: (r, i) => { +var I = { exec: () => null }; +function d(u3, e = "") { + let t = typeof u3 == "string" ? u3 : u3.source, n = { replace: (r, i) => { let s = typeof i == "string" ? i : i.source; return s = s.replace(m.caret, "$1"), t = t.replace(r, s), n; }, getRegex: () => new RegExp(t, e) }; return n; } -var be = (() => { - try { - return !!new RegExp("(?<=1)(?/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (l3) => new RegExp(`^( {0,3}${l3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}#`), htmlBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; -var Re = /^(?:[ \t]*(?:\n|$))+/; -var Te = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; -var Oe = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; -var I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; -var we = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; +var m = { codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, outputLinkReplace: /\\([\[\]])/g, indentCodeCompensation: /^(\s+)(?:```)/, beginningSpace: /^\s+/, endingHash: /#$/, startingSpaceChar: /^ /, endingSpaceChar: / $/, nonSpaceChar: /[^ ]/, newLineCharGlobal: /\n/g, tabCharGlobal: /\t/g, multipleSpaceGlobal: /\s+/g, blankLine: /^[ \t]*$/, doubleBlankLine: /\n[ \t]*\n[ \t]*$/, blockquoteStart: /^ {0,3}>/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (u3) => new RegExp(`^( {0,3}${u3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}#`), htmlBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; +var be = /^(?:[ \t]*(?:\n|$))+/; +var Re = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; +var Te = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; +var E = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; +var Oe = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; var F = /(?:[*+-]|\d{1,9}[.)])/; var ie = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/; var oe = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(); -var ye = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); +var we = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); var j = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; -var Pe = /^[^\n]+/; +var ye = /^[^\n]+/; var Q = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/; -var Se = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); -var $e = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); +var Pe = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); +var Se = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); var v = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; var U = /|$))/; -var _e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); -var ae = d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var Le = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); -var K = { blockquote: Le, code: Te, def: Se, fences: Oe, heading: we, hr: I, html: _e, lheading: oe, list: $e, newline: Re, paragraph: ae, table: E, text: Pe }; -var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var Me = { ...K, lheading: ye, table: re, paragraph: d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; -var ze = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: E, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", I).replace("heading", ` *#{1,6} *[^ +var $e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); +var ae = d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var _e = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); +var K = { blockquote: _e, code: Re, def: Pe, fences: Te, heading: Oe, hr: E, html: $e, lheading: oe, list: Se, newline: be, paragraph: ae, table: I, text: ye }; +var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var Le = { ...K, lheading: we, table: re, paragraph: d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; +var Me = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: I, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", E).replace("heading", ` *#{1,6} *[^ ]`).replace("lheading", oe).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }; -var Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; -var Ee = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; +var ze = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; +var Ae = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; var le = /^( {2,}|\\)\n(?!\s*$)/; var Ie = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", be ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(); +var Ce = /(?!~)[\s\p{P}\p{S}]/u; +var Be = /(?:[^\s\p{P}\p{S}]|~)/u; +var qe = /\[(?:[^\[\]`]|`[^`]*?`)*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)|`[^`]*?`|<(?! )[^<>]*?>/g; var ce = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/; -var De = d(ce, "u").replace(/punct/g, D).getRegex(); -var He = d(ce, "u").replace(/punct/g, pe).getRegex(); +var ve = d(ce, "u").replace(/punct/g, D).getRegex(); +var De = d(ce, "u").replace(/punct/g, pe).getRegex(); var he = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)"; -var Ze = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Ge = d(he, "gu").replace(/notPunctSpace/g, qe).replace(/punctSpace/g, Be).replace(/punct/g, pe).getRegex(); -var Ne = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Fe = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); -var je = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); -var Qe = d(U).replace("(?:-->|$)", "-->").getRegex(); -var Ue = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", Qe).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); +var He = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Ze = d(he, "gu").replace(/notPunctSpace/g, Be).replace(/punctSpace/g, Ce).replace(/punct/g, pe).getRegex(); +var Ge = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Ne = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); +var Fe = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); +var je = d(U).replace("(?:-->|$)", "-->").getRegex(); +var Qe = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", je).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); var q = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/; -var Ke = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); +var Ue = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); var de = d(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", Q).getRegex(); var ke = d(/^!?\[(ref)\](?:\[\])?/).replace("ref", Q).getRegex(); -var We = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); +var Ke = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); var se = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/; -var X = { _backpedal: E, anyPunctuation: Fe, autolink: je, blockSkip: ve, br: le, code: Ee, del: E, emStrongLDelim: De, emStrongRDelimAst: Ze, emStrongRDelimUnd: Ne, escape: Ae, link: Ke, nolink: ke, punctuation: Ce, reflink: de, reflinkSearch: We, tag: Ue, text: Ie, url: E }; -var Xe = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; -var N = { ...X, emStrongRDelimAst: Ge, emStrongLDelim: He, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; -var ge = (l3) => Ve[l3]; -function w(l3, e) { +var X = { _backpedal: I, anyPunctuation: Ne, autolink: Fe, blockSkip: qe, br: le, code: Ae, del: I, emStrongLDelim: ve, emStrongRDelimAst: He, emStrongRDelimUnd: Ge, escape: ze, link: Ue, nolink: ke, punctuation: Ee, reflink: de, reflinkSearch: Ke, tag: Qe, text: Ie, url: I }; +var We = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; +var N = { ...X, emStrongRDelimAst: Ze, emStrongLDelim: De, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; +var ge = (u3) => Je[u3]; +function w(u3, e) { if (e) { - if (m.escapeTest.test(l3)) return l3.replace(m.escapeReplace, ge); - } else if (m.escapeTestNoEncode.test(l3)) return l3.replace(m.escapeReplaceNoEncode, ge); - return l3; + if (m.escapeTest.test(u3)) return u3.replace(m.escapeReplace, ge); + } else if (m.escapeTestNoEncode.test(u3)) return u3.replace(m.escapeReplaceNoEncode, ge); + return u3; } -function J(l3) { +function J(u3) { try { - l3 = encodeURI(l3).replace(m.percentDecode, "%"); + u3 = encodeURI(u3).replace(m.percentDecode, "%"); } catch { return null; } - return l3; + return u3; } -function V(l3, e) { - let t = l3.replace(m.findPipe, (i, s, a) => { - let o = false, p = s; - for (; --p >= 0 && a[p] === "\\"; ) o = !o; - return o ? "|" : " |"; +function V(u3, e) { + let t = u3.replace(m.findPipe, (i, s, o) => { + let a = false, l = s; + for (; --l >= 0 && o[l] === "\\"; ) a = !a; + return a ? "|" : " |"; }), n = t.split(m.splitPipe), r = 0; if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e) if (n.length > e) n.splice(e); else for (; n.length < e; ) n.push(""); for (; r < n.length; r++) n[r] = n[r].trim().replace(m.slashPipe, "|"); return n; } -function z2(l3, e, t) { - let n = l3.length; +function z2(u3, e, t) { + let n = u3.length; if (n === 0) return ""; let r = 0; for (; r < n; ) { - let i = l3.charAt(n - r - 1); + let i = u3.charAt(n - r - 1); if (i === e && !t) r++; else if (i !== e && t) r++; else break; } - return l3.slice(0, n - r); + return u3.slice(0, n - r); } -function fe(l3, e) { - if (l3.indexOf(e[1]) === -1) return -1; +function fe(u3, e) { + if (u3.indexOf(e[1]) === -1) return -1; let t = 0; - for (let n = 0; n < l3.length; n++) if (l3[n] === "\\") n++; - else if (l3[n] === e[0]) t++; - else if (l3[n] === e[1] && (t--, t < 0)) return n; + for (let n = 0; n < u3.length; n++) if (u3[n] === "\\") n++; + else if (u3[n] === e[0]) t++; + else if (u3[n] === e[1] && (t--, t < 0)) return n; return t > 0 ? -2 : -1; } -function me(l3, e, t, n, r) { - let i = e.href, s = e.title || null, a = l3[1].replace(r.other.outputLinkReplace, "$1"); +function me(u3, e, t, n, r) { + let i = e.href, s = e.title || null, o = u3[1].replace(r.other.outputLinkReplace, "$1"); n.state.inLink = true; - let o = { type: l3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: a, tokens: n.inlineTokens(a) }; - return n.state.inLink = false, o; + let a = { type: u3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: o, tokens: n.inlineTokens(o) }; + return n.state.inLink = false, a; } -function Ye(l3, e, t) { - let n = l3.match(t.other.indentCodeCompensation); +function Ve(u3, e, t) { + let n = u3.match(t.other.indentCodeCompensation); if (n === null) return e; let r = n[1]; return e.split(` `).map((i) => { let s = i.match(t.other.beginningSpace); if (s === null) return i; - let [a] = s; - return a.length >= r.length ? i.slice(r.length) : i; + let [o] = s; + return o.length >= r.length ? i.slice(r.length) : i; }).join(` `); } @@ -35820,7 +30205,7 @@ var y = class { fences(e) { let t = this.rules.block.fences.exec(e); if (t) { - let n = t[0], r = Ye(n, t[3] || "", this.rules); + let n = t[0], r = Ve(n, t[3] || "", this.rules); return { type: "code", raw: n, lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2], text: r }; } } @@ -35847,19 +30232,19 @@ var y = class { `).split(` `), r = "", i = "", s = []; for (; n.length > 0; ) { - let a = false, o = [], p; - for (p = 0; p < n.length; p++) if (this.rules.other.blockquoteStart.test(n[p])) o.push(n[p]), a = true; - else if (!a) o.push(n[p]); + let o = false, a = [], l; + for (l = 0; l < n.length; l++) if (this.rules.other.blockquoteStart.test(n[l])) a.push(n[l]), o = true; + else if (!o) a.push(n[l]); else break; - n = n.slice(p); - let u = o.join(` -`), c = u.replace(this.rules.other.blockquoteSetextReplace, ` + n = n.slice(l); + let c = a.join(` +`), p = c.replace(this.rules.other.blockquoteSetextReplace, ` $1`).replace(this.rules.other.blockquoteSetextReplace2, ""); r = r ? `${r} -${u}` : u, i = i ? `${i} -${c}` : c; +${c}` : c, i = i ? `${i} +${p}` : p; let g = this.lexer.state.top; - if (this.lexer.state.top = true, this.lexer.blockTokens(c, s, true), this.lexer.state.top = g, n.length === 0) break; + if (this.lexer.state.top = true, this.lexer.blockTokens(p, s, true), this.lexer.state.top = g, n.length === 0) break; let h = s.at(-1); if (h?.type === "code") break; if (h?.type === "blockquote") { @@ -35885,45 +30270,45 @@ ${c}` : c; if (t) { let n = t[1].trim(), r = n.length > 1, i = { type: "list", raw: "", ordered: r, start: r ? +n.slice(0, -1) : "", loose: false, items: [] }; n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); - let s = this.rules.other.listItemRegex(n), a = false; + let s = this.rules.other.listItemRegex(n), o = false; for (; e; ) { - let p = false, u = "", c = ""; + let l = false, c = "", p = ""; if (!(t = s.exec(e)) || this.rules.block.hr.test(e)) break; - u = t[0], e = e.substring(u.length); + c = t[0], e = e.substring(c.length); let g = t[2].split(` `, 1)[0].replace(this.rules.other.listReplaceTabs, (H) => " ".repeat(3 * H.length)), h = e.split(` `, 1)[0], R = !g.trim(), f = 0; - if (this.options.pedantic ? (f = 2, c = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, c = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (u += h + ` -`, e = e.substring(h.length + 1), p = true), !p) { + if (this.options.pedantic ? (f = 2, p = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, p = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (c += h + ` +`, e = e.substring(h.length + 1), l = true), !l) { let H = this.rules.other.nextBulletRegex(f), ee = this.rules.other.hrRegex(f), te = this.rules.other.fencesBeginRegex(f), ne = this.rules.other.headingBeginRegex(f), xe = this.rules.other.htmlBeginRegex(f); for (; e; ) { let Z = e.split(` `, 1)[0], A; if (h = Z, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, " "), A = h) : A = h.replace(this.rules.other.tabCharGlobal, " "), te.test(h) || ne.test(h) || xe.test(h) || H.test(h) || ee.test(h)) break; - if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) c += ` + if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) p += ` ` + A.slice(f); else { if (R || g.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || te.test(g) || ne.test(g) || ee.test(g)) break; - c += ` + p += ` ` + h; } - !R && !h.trim() && (R = true), u += Z + ` + !R && !h.trim() && (R = true), c += Z + ` `, e = e.substring(Z.length + 1), g = A.slice(f); } } - i.loose || (a ? i.loose = true : this.rules.other.doubleBlankLine.test(u) && (a = true)); + i.loose || (o ? i.loose = true : this.rules.other.doubleBlankLine.test(c) && (o = true)); let O = null, Y; - this.options.gfm && (O = this.rules.other.listIsTask.exec(c), O && (Y = O[0] !== "[ ] ", c = c.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: u, task: !!O, checked: Y, loose: false, text: c, tokens: [] }), i.raw += u; + this.options.gfm && (O = this.rules.other.listIsTask.exec(p), O && (Y = O[0] !== "[ ] ", p = p.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: c, task: !!O, checked: Y, loose: false, text: p, tokens: [] }), i.raw += c; } - let o = i.items.at(-1); - if (o) o.raw = o.raw.trimEnd(), o.text = o.text.trimEnd(); + let a = i.items.at(-1); + if (a) a.raw = a.raw.trimEnd(), a.text = a.text.trimEnd(); else return; i.raw = i.raw.trimEnd(); - for (let p = 0; p < i.items.length; p++) if (this.lexer.state.top = false, i.items[p].tokens = this.lexer.blockTokens(i.items[p].text, []), !i.loose) { - let u = i.items[p].tokens.filter((g) => g.type === "space"), c = u.length > 0 && u.some((g) => this.rules.other.anyLine.test(g.raw)); - i.loose = c; + for (let l = 0; l < i.items.length; l++) if (this.lexer.state.top = false, i.items[l].tokens = this.lexer.blockTokens(i.items[l].text, []), !i.loose) { + let c = i.items[l].tokens.filter((g) => g.type === "space"), p = c.length > 0 && c.some((g) => this.rules.other.anyLine.test(g.raw)); + i.loose = p; } - if (i.loose) for (let p = 0; p < i.items.length; p++) i.items[p].loose = true; + if (i.loose) for (let l = 0; l < i.items.length; l++) i.items[l].loose = true; return i; } } @@ -35944,9 +30329,9 @@ ${c}` : c; let n = V(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(` `) : [], s = { type: "table", raw: t[0], header: [], align: [], rows: [] }; if (n.length === r.length) { - for (let a of r) this.rules.other.tableAlignRight.test(a) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(a) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(a) ? s.align.push("left") : s.align.push(null); - for (let a = 0; a < n.length; a++) s.header.push({ text: n[a], tokens: this.lexer.inline(n[a]), header: true, align: s.align[a] }); - for (let a of i) s.rows.push(V(a, s.header.length).map((o, p) => ({ text: o, tokens: this.lexer.inline(o), header: false, align: s.align[p] }))); + for (let o of r) this.rules.other.tableAlignRight.test(o) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(o) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(o) ? s.align.push("left") : s.align.push(null); + for (let o = 0; o < n.length; o++) s.header.push({ text: n[o], tokens: this.lexer.inline(n[o]), header: true, align: s.align[o] }); + for (let o of i) s.rows.push(V(o, s.header.length).map((a, l) => ({ text: a, tokens: this.lexer.inline(a), header: false, align: s.align[l] }))); return s; } } @@ -35986,8 +30371,8 @@ ${c}` : c; let s = fe(t[2], "()"); if (s === -2) return; if (s > -1) { - let o = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; - t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, o).trim(), t[3] = ""; + let a = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; + t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, a).trim(), t[3] = ""; } } let r = t[2], i = ""; @@ -36013,20 +30398,20 @@ ${c}` : c; let r = this.rules.inline.emStrongLDelim.exec(e); if (!r || r[3] && n.match(this.rules.other.unicodeAlphaNumeric)) return; if (!(r[1] || r[2] || "") || !n || this.rules.inline.punctuation.exec(n)) { - let s = [...r[0]].length - 1, a, o, p = s, u = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; - for (c.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = c.exec(t)) != null; ) { - if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a) continue; - if (o = [...a].length, r[3] || r[4]) { - p += o; + let s = [...r[0]].length - 1, o, a, l = s, c = 0, p = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + for (p.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = p.exec(t)) != null; ) { + if (o = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !o) continue; + if (a = [...o].length, r[3] || r[4]) { + l += a; continue; - } else if ((r[5] || r[6]) && s % 3 && !((s + o) % 3)) { - u += o; + } else if ((r[5] || r[6]) && s % 3 && !((s + a) % 3)) { + c += a; continue; } - if (p -= o, p > 0) continue; - o = Math.min(o, o + p + u); - let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + o); - if (Math.min(s, o) % 2) { + if (l -= a, l > 0) continue; + a = Math.min(a, a + l + c); + let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + a); + if (Math.min(s, a) % 2) { let f = h.slice(1, -1); return { type: "em", raw: h, text: f, tokens: this.lexer.inlineTokens(f) }; } @@ -36080,7 +30465,7 @@ ${c}` : c; } } }; -var x = class l { +var x = class u { tokens; options; state; @@ -36095,10 +30480,10 @@ var x = class l { return { block: C, inline: M }; } static lex(e, t) { - return new l(t).lex(e); + return new u(t).lex(e); } static lexInline(e, t) { - return new l(t).inlineTokens(e); + return new u(t).inlineTokens(e); } lex(e) { e = e.replace(m.carriageReturn, ` @@ -36172,9 +30557,9 @@ var x = class l { } let i = e; if (this.options.extensions?.startBlock) { - let s = 1 / 0, a = e.slice(1), o; - this.options.extensions.startBlock.forEach((p) => { - o = p.call({ lexer: this }, a), typeof o == "number" && o >= 0 && (s = Math.min(s, o)); + let s = 1 / 0, o = e.slice(1), a; + this.options.extensions.startBlock.forEach((l) => { + a = l.call({ lexer: this }, o), typeof a == "number" && a >= 0 && (s = Math.min(s, a)); }), s < 1 / 0 && s >= 0 && (i = e.substring(0, s + 1)); } if (this.state.top && (r = this.tokenizer.paragraph(i))) { @@ -36214,14 +30599,13 @@ var x = class l { if (o.length > 0) for (; (r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) != null; ) o.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); } for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null; ) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); - let i; - for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) i = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i) + "[" + "a".repeat(r[0].length - i - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n; - let s = false, a = ""; + let i = false, s = ""; for (; e; ) { - s || (a = ""), s = false; + i || (s = ""), i = false; let o; - if (this.options.extensions?.inline?.some((u) => (o = u.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; + if (this.options.extensions?.inline?.some((l) => (o = l.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; if (o = this.tokenizer.escape(e)) { e = e.substring(o.raw.length), t.push(o); continue; @@ -36236,11 +30620,11 @@ var x = class l { } if (o = this.tokenizer.reflink(e, this.tokens.links)) { e = e.substring(o.raw.length); - let u = t.at(-1); - o.type === "text" && u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); + let l = t.at(-1); + o.type === "text" && l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); continue; } - if (o = this.tokenizer.emStrong(e, n, a)) { + if (o = this.tokenizer.emStrong(e, n, s)) { e = e.substring(o.raw.length), t.push(o); continue; } @@ -36264,25 +30648,25 @@ var x = class l { e = e.substring(o.raw.length), t.push(o); continue; } - let p = e; + let a = e; if (this.options.extensions?.startInline) { - let u = 1 / 0, c = e.slice(1), g; - this.options.extensions.startInline.forEach((h) => { - g = h.call({ lexer: this }, c), typeof g == "number" && g >= 0 && (u = Math.min(u, g)); - }), u < 1 / 0 && u >= 0 && (p = e.substring(0, u + 1)); - } - if (o = this.tokenizer.inlineText(p)) { - e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (a = o.raw.slice(-1)), s = true; - let u = t.at(-1); - u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); + let l = 1 / 0, c = e.slice(1), p; + this.options.extensions.startInline.forEach((g) => { + p = g.call({ lexer: this }, c), typeof p == "number" && p >= 0 && (l = Math.min(l, p)); + }), l < 1 / 0 && l >= 0 && (a = e.substring(0, l + 1)); + } + if (o = this.tokenizer.inlineText(a)) { + e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (s = o.raw.slice(-1)), i = true; + let l = t.at(-1); + l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); continue; } if (e) { - let u = "Infinite loop on byte: " + e.charCodeAt(0); + let l = "Infinite loop on byte: " + e.charCodeAt(0); if (this.options.silent) { - console.error(u); + console.error(l); break; - } else throw new Error(u); + } else throw new Error(l); } } return t; @@ -36325,9 +30709,9 @@ ${this.parser.parse(e)} } list(e) { let t = e.ordered, n = e.start, r = ""; - for (let a = 0; a < e.items.length; a++) { - let o = e.items[a]; - r += this.listitem(o); + for (let o = 0; o < e.items.length; o++) { + let a = e.items[o]; + r += this.listitem(a); } let i = t ? "ol" : "ul", s = t && n !== 1 ? ' start="' + n + '"' : ""; return "<" + i + s + `> @@ -36358,7 +30742,7 @@ ${this.parser.parse(e)} for (let i = 0; i < e.rows.length; i++) { let s = e.rows[i]; n = ""; - for (let a = 0; a < s.length; a++) n += this.tablecell(s[a]); + for (let o = 0; o < s.length; o++) n += this.tablecell(s[o]); r += this.tablerow({ text: n }); } return r && (r = `${r}`), `
@@ -36440,7 +30824,7 @@ var $ = class { return ""; } }; -var b = class l2 { +var b = class u2 { options; renderer; textRenderer; @@ -36448,19 +30832,19 @@ var b = class l2 { this.options = e || T, this.options.renderer = this.options.renderer || new P(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new $(); } static parse(e, t) { - return new l2(t).parse(e); + return new u2(t).parse(e); } static parseInline(e, t) { - return new l2(t).parseInline(e); + return new u2(t).parseInline(e); } parse(e, t = true) { let n = ""; for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let a = i, o = this.options.extensions.renderers[a.type].call({ parser: this }, a); - if (o !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(a.type)) { - n += o || ""; + let o = i, a = this.options.extensions.renderers[o.type].call({ parser: this }, o); + if (a !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(o.type)) { + n += a || ""; continue; } } @@ -36507,16 +30891,16 @@ var b = class l2 { continue; } case "text": { - let a = s, o = this.renderer.text(a); - for (; r + 1 < e.length && e[r + 1].type === "text"; ) a = e[++r], o += ` -` + this.renderer.text(a); - t ? n += this.renderer.paragraph({ type: "paragraph", raw: o, text: o, tokens: [{ type: "text", raw: o, text: o, escaped: true }] }) : n += o; + let o = s, a = this.renderer.text(o); + for (; r + 1 < e.length && e[r + 1].type === "text"; ) o = e[++r], a += ` +` + this.renderer.text(o); + t ? n += this.renderer.paragraph({ type: "paragraph", raw: a, text: a, tokens: [{ type: "text", raw: a, text: a, escaped: true }] }) : n += a; continue; } default: { - let a = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(a), ""; - throw new Error(a); + let o = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(o), ""; + throw new Error(o); } } } @@ -36527,9 +30911,9 @@ var b = class l2 { for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let a = this.options.extensions.renderers[i.type].call({ parser: this }, i); - if (a !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { - n += a || ""; + let o = this.options.extensions.renderers[i.type].call({ parser: this }, i); + if (o !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { + n += o || ""; continue; } } @@ -36576,9 +30960,9 @@ var b = class l2 { break; } default: { - let a = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(a), ""; - throw new Error(a); + let o = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(o), ""; + throw new Error(o); } } } @@ -36632,7 +31016,7 @@ var B = class { case "table": { let i = r; for (let s of i.header) n = n.concat(this.walkTokens(s.tokens, t)); - for (let s of i.rows) for (let a of s) n = n.concat(this.walkTokens(a.tokens, t)); + for (let s of i.rows) for (let o of s) n = n.concat(this.walkTokens(o.tokens, t)); break; } case "list": { @@ -36643,8 +31027,8 @@ var B = class { default: { let i = r; this.defaults.extensions?.childTokens?.[i.type] ? this.defaults.extensions.childTokens[i.type].forEach((s) => { - let a = i[s].flat(1 / 0); - n = n.concat(this.walkTokens(a, t)); + let o = i[s].flat(1 / 0); + n = n.concat(this.walkTokens(o, t)); }) : i.tokens && (n = n.concat(this.walkTokens(i.tokens, t))); } } @@ -36658,9 +31042,9 @@ var B = class { if (!i.name) throw new Error("extension name required"); if ("renderer" in i) { let s = t.renderers[i.name]; - s ? t.renderers[i.name] = function(...a) { - let o = i.renderer.apply(this, a); - return o === false && (o = s.apply(this, a)), o; + s ? t.renderers[i.name] = function(...o) { + let a = i.renderer.apply(this, o); + return a === false && (a = s.apply(this, o)), a; } : t.renderers[i.name] = i.renderer; } if ("tokenizer" in i) { @@ -36674,10 +31058,10 @@ var B = class { for (let s in n.renderer) { if (!(s in i)) throw new Error(`renderer '${s}' does not exist`); if (["options", "parser"].includes(s)) continue; - let a = s, o = n.renderer[a], p = i[a]; - i[a] = (...u) => { - let c = o.apply(i, u); - return c === false && (c = p.apply(i, u)), c || ""; + let o = s, a = n.renderer[o], l = i[o]; + i[o] = (...c) => { + let p = a.apply(i, c); + return p === false && (p = l.apply(i, c)), p || ""; }; } r.renderer = i; @@ -36687,10 +31071,10 @@ var B = class { for (let s in n.tokenizer) { if (!(s in i)) throw new Error(`tokenizer '${s}' does not exist`); if (["options", "rules", "lexer"].includes(s)) continue; - let a = s, o = n.tokenizer[a], p = i[a]; - i[a] = (...u) => { - let c = o.apply(i, u); - return c === false && (c = p.apply(i, u)), c; + let o = s, a = n.tokenizer[o], l = i[o]; + i[o] = (...c) => { + let p = a.apply(i, c); + return p === false && (p = l.apply(i, c)), p; }; } r.tokenizer = i; @@ -36700,30 +31084,30 @@ var B = class { for (let s in n.hooks) { if (!(s in i)) throw new Error(`hook '${s}' does not exist`); if (["options", "block"].includes(s)) continue; - let a = s, o = n.hooks[a], p = i[a]; - S.passThroughHooks.has(s) ? i[a] = (u) => { + let o = s, a = n.hooks[o], l = i[o]; + S.passThroughHooks.has(s) ? i[o] = (c) => { if (this.defaults.async && S.passThroughHooksRespectAsync.has(s)) return (async () => { - let g = await o.call(i, u); - return p.call(i, g); + let g = await a.call(i, c); + return l.call(i, g); })(); - let c = o.call(i, u); - return p.call(i, c); - } : i[a] = (...u) => { + let p = a.call(i, c); + return l.call(i, p); + } : i[o] = (...c) => { if (this.defaults.async) return (async () => { - let g = await o.apply(i, u); - return g === false && (g = await p.apply(i, u)), g; + let g = await a.apply(i, c); + return g === false && (g = await l.apply(i, c)), g; })(); - let c = o.apply(i, u); - return c === false && (c = p.apply(i, u)), c; + let p = a.apply(i, c); + return p === false && (p = l.apply(i, c)), p; }; } r.hooks = i; } if (n.walkTokens) { let i = this.defaults.walkTokens, s = n.walkTokens; - r.walkTokens = function(a) { - let o = []; - return o.push(s.call(this, a)), i && (o = o.concat(i.call(this, a))), o; + r.walkTokens = function(o) { + let a = []; + return a.push(s.call(this, o)), i && (a = a.concat(i.call(this, o))), a; }; } this.defaults = { ...this.defaults, ...r }; @@ -36740,24 +31124,24 @@ var B = class { } parseMarkdown(e) { return (n, r) => { - let i = { ...r }, s = { ...this.defaults, ...i }, a = this.onError(!!s.silent, !!s.async); - if (this.defaults.async === true && i.async === false) return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); - if (typeof n > "u" || n === null) return a(new Error("marked(): input parameter is undefined or null")); - if (typeof n != "string") return a(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); + let i = { ...r }, s = { ...this.defaults, ...i }, o = this.onError(!!s.silent, !!s.async); + if (this.defaults.async === true && i.async === false) return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + if (typeof n > "u" || n === null) return o(new Error("marked(): input parameter is undefined or null")); + if (typeof n != "string") return o(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); if (s.hooks && (s.hooks.options = s, s.hooks.block = e), s.async) return (async () => { - let o = s.hooks ? await s.hooks.preprocess(n) : n, u = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(o, s), c = s.hooks ? await s.hooks.processAllTokens(u) : u; - s.walkTokens && await Promise.all(this.walkTokens(c, s.walkTokens)); - let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(c, s); + let a = s.hooks ? await s.hooks.preprocess(n) : n, c = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(a, s), p = s.hooks ? await s.hooks.processAllTokens(c) : c; + s.walkTokens && await Promise.all(this.walkTokens(p, s.walkTokens)); + let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); return s.hooks ? await s.hooks.postprocess(h) : h; - })().catch(a); + })().catch(o); try { s.hooks && (n = s.hooks.preprocess(n)); - let p = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); - s.hooks && (p = s.hooks.processAllTokens(p)), s.walkTokens && this.walkTokens(p, s.walkTokens); - let c = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); - return s.hooks && (c = s.hooks.postprocess(c)), c; - } catch (o) { - return a(o); + let l = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); + s.hooks && (l = s.hooks.processAllTokens(l)), s.walkTokens && this.walkTokens(l, s.walkTokens); + let p = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(l, s); + return s.hooks && (p = s.hooks.postprocess(p)), p; + } catch (a) { + return o(a); } }; } @@ -36774,19 +31158,19 @@ Please report this to https://github.com/markedjs/marked.`, e) { } }; var _ = new B(); -function k(l3, e) { - return _.parse(l3, e); +function k(u3, e) { + return _.parse(u3, e); } -k.options = k.setOptions = function(l3) { - return _.setOptions(l3), k.defaults = _.defaults, G(k.defaults), k; +k.options = k.setOptions = function(u3) { + return _.setOptions(u3), k.defaults = _.defaults, G(k.defaults), k; }; k.getDefaults = L; k.defaults = T; -k.use = function(...l3) { - return _.use(...l3), k.defaults = _.defaults, G(k.defaults), k; +k.use = function(...u3) { + return _.use(...u3), k.defaults = _.defaults, G(k.defaults), k; }; -k.walkTokens = function(l3, e) { - return _.walkTokens(l3, e); +k.walkTokens = function(u3, e) { + return _.walkTokens(u3, e); }; k.parseInline = _.parseInline; k.Parser = b; @@ -36798,13 +31182,13 @@ k.lexer = x.lex; k.Tokenizer = y; k.Hooks = S; k.parse = k; -var Zt = k.options; -var Gt = k.setOptions; -var Nt = k.use; -var Ft = k.walkTokens; -var jt = k.parseInline; -var Ut = b.parse; -var Kt = x.lex; +var Ht = k.options; +var Zt = k.setOptions; +var Gt = k.use; +var Nt = k.walkTokens; +var Ft = k.parseInline; +var Qt = b.parse; +var Ut = x.lex; // src/show.ts function formatConversationAsMarkdown(jsonl, startLine, endLine) { From 8e6d75bbd694727f7430e8017df46e44e0b3580a Mon Sep 17 00:00:00 2001 From: HengYang Date: Sun, 11 Oct 2026 10:48:34 +0800 Subject: [PATCH 28/33] chore: keep unchanged MCP bundle in Codex routing fix --- dist/mcp-server.js | 6341 +++----------------------------------------- 1 file changed, 363 insertions(+), 5978 deletions(-) diff --git a/dist/mcp-server.js b/dist/mcp-server.js index ca13e73b..e3a9adac 100644 --- a/dist/mcp-server.js +++ b/dist/mcp-server.js @@ -29,9 +29,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge mod )); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js +// node_modules/ajv/dist/compile/codegen/code.js var require_code = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "node_modules/ajv/dist/compile/codegen/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; @@ -183,9 +183,9 @@ var require_code = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js +// node_modules/ajv/dist/compile/codegen/scope.js var require_scope = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "node_modules/ajv/dist/compile/codegen/scope.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; @@ -328,9 +328,9 @@ var require_scope = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js +// node_modules/ajv/dist/compile/codegen/index.js var require_codegen = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "node_modules/ajv/dist/compile/codegen/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; @@ -1048,9 +1048,9 @@ var require_codegen = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js +// node_modules/ajv/dist/compile/util.js var require_util = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js"(exports) { + "node_modules/ajv/dist/compile/util.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; @@ -1215,9 +1215,9 @@ var require_util = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js +// node_modules/ajv/dist/compile/names.js var require_names = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js"(exports) { + "node_modules/ajv/dist/compile/names.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -1254,9 +1254,9 @@ var require_names = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js +// node_modules/ajv/dist/compile/errors.js var require_errors = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js"(exports) { + "node_modules/ajv/dist/compile/errors.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; @@ -1376,9 +1376,9 @@ var require_errors = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js +// node_modules/ajv/dist/compile/validate/boolSchema.js var require_boolSchema = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; @@ -1427,9 +1427,9 @@ var require_boolSchema = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js +// node_modules/ajv/dist/compile/rules.js var require_rules = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js"(exports) { + "node_modules/ajv/dist/compile/rules.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getRules = exports.isJSONType = void 0; @@ -1458,9 +1458,9 @@ var require_rules = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js +// node_modules/ajv/dist/compile/validate/applicability.js var require_applicability = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "node_modules/ajv/dist/compile/validate/applicability.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; @@ -1481,9 +1481,9 @@ var require_applicability = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js +// node_modules/ajv/dist/compile/validate/dataType.js var require_dataType = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "node_modules/ajv/dist/compile/validate/dataType.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; @@ -1665,9 +1665,9 @@ var require_dataType = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js +// node_modules/ajv/dist/compile/validate/defaults.js var require_defaults = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "node_modules/ajv/dist/compile/validate/defaults.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.assignDefaults = void 0; @@ -1702,9 +1702,9 @@ var require_defaults = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js +// node_modules/ajv/dist/vocabularies/code.js var require_code2 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js"(exports) { + "node_modules/ajv/dist/vocabularies/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; @@ -1775,13 +1775,13 @@ var require_code2 = __commonJS({ exports.callValidateCode = callValidateCode; var newRegExp = (0, codegen_1._)`new RegExp`; function usePattern({ gen, it: { opts } }, pattern) { - const u = opts.unicodeRegExp ? "u" : ""; + const u3 = opts.unicodeRegExp ? "u" : ""; const { regExp } = opts.code; - const rx = regExp(pattern, u); + const rx = regExp(pattern, u3); return gen.scopeValue("pattern", { key: rx.toString(), ref: rx, - code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u3})` }); } exports.usePattern = usePattern; @@ -1835,9 +1835,9 @@ var require_code2 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js +// node_modules/ajv/dist/compile/validate/keyword.js var require_keyword = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "node_modules/ajv/dist/compile/validate/keyword.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; @@ -1953,9 +1953,9 @@ var require_keyword = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js +// node_modules/ajv/dist/compile/validate/subschema.js var require_subschema = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "node_modules/ajv/dist/compile/validate/subschema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; @@ -2159,9 +2159,9 @@ var require_json_schema_traverse = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js +// node_modules/ajv/dist/compile/resolve.js var require_resolve = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js"(exports) { + "node_modules/ajv/dist/compile/resolve.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; @@ -2315,9 +2315,9 @@ var require_resolve = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js +// node_modules/ajv/dist/compile/validate/index.js var require_validate = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js"(exports) { + "node_modules/ajv/dist/compile/validate/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; @@ -2823,9 +2823,9 @@ var require_validate = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js +// node_modules/ajv/dist/runtime/validation_error.js var require_validation_error = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "node_modules/ajv/dist/runtime/validation_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ValidationError = class extends Error { @@ -2839,9 +2839,9 @@ var require_validation_error = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js +// node_modules/ajv/dist/compile/ref_error.js var require_ref_error = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js"(exports) { + "node_modules/ajv/dist/compile/ref_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var resolve_1 = require_resolve(); @@ -2856,9 +2856,9 @@ var require_ref_error = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js +// node_modules/ajv/dist/compile/index.js var require_compile = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js"(exports) { + "node_modules/ajv/dist/compile/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; @@ -3080,9 +3080,9 @@ var require_compile = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json +// node_modules/ajv/dist/refs/data.json var require_data = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json"(exports, module) { + "node_modules/ajv/dist/refs/data.json"(exports, module) { module.exports = { $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", @@ -4217,9 +4217,9 @@ var require_fast_uri = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js +// node_modules/ajv/dist/runtime/uri.js var require_uri = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js"(exports) { + "node_modules/ajv/dist/runtime/uri.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var uri = require_fast_uri(); @@ -4228,9 +4228,9 @@ var require_uri = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js +// node_modules/ajv/dist/core.js var require_core = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js"(exports) { + "node_modules/ajv/dist/core.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; @@ -4839,9 +4839,9 @@ var require_core = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js +// node_modules/ajv/dist/vocabularies/core/id.js var require_id = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "node_modules/ajv/dist/vocabularies/core/id.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var def = { @@ -4854,9 +4854,9 @@ var require_id = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js +// node_modules/ajv/dist/vocabularies/core/ref.js var require_ref = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.callRef = exports.getValidate = void 0; @@ -4976,9 +4976,9 @@ var require_ref = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js +// node_modules/ajv/dist/vocabularies/core/index.js var require_core2 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/core/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var id_1 = require_id(); @@ -4997,9 +4997,9 @@ var require_core2 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +// node_modules/ajv/dist/vocabularies/validation/limitNumber.js var require_limitNumber = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5029,9 +5029,9 @@ var require_limitNumber = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +// node_modules/ajv/dist/vocabularies/validation/multipleOf.js var require_multipleOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5057,9 +5057,9 @@ var require_multipleOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js +// node_modules/ajv/dist/runtime/ucs2length.js var require_ucs2length = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "node_modules/ajv/dist/runtime/ucs2length.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function ucs2length(str) { @@ -5083,9 +5083,9 @@ var require_ucs2length = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js +// node_modules/ajv/dist/vocabularies/validation/limitLength.js var require_limitLength = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5115,9 +5115,9 @@ var require_limitLength = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js +// node_modules/ajv/dist/vocabularies/validation/pattern.js var require_pattern = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5135,12 +5135,12 @@ var require_pattern = __commonJS({ error: error61, code(cxt) { const { gen, data, $data, schema, schemaCode, it } = cxt; - const u = it.opts.unicodeRegExp ? "u" : ""; + const u3 = it.opts.unicodeRegExp ? "u" : ""; if ($data) { const { regExp } = it.opts.code; const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); const valid = gen.let("valid"); - gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u3}).test(${data})`), () => gen.assign(valid, false)); cxt.fail$data((0, codegen_1._)`!${valid}`); } else { const regExp = (0, code_1.usePattern)(cxt, schema); @@ -5152,9 +5152,9 @@ var require_pattern = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +// node_modules/ajv/dist/vocabularies/validation/limitProperties.js var require_limitProperties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5181,9 +5181,9 @@ var require_limitProperties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js +// node_modules/ajv/dist/vocabularies/validation/required.js var require_required = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5263,9 +5263,9 @@ var require_required = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js +// node_modules/ajv/dist/vocabularies/validation/limitItems.js var require_limitItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5292,9 +5292,9 @@ var require_limitItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js +// node_modules/ajv/dist/runtime/equal.js var require_equal = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js"(exports) { + "node_modules/ajv/dist/runtime/equal.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var equal = require_fast_deep_equal(); @@ -5303,9 +5303,9 @@ var require_equal = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +// node_modules/ajv/dist/vocabularies/validation/uniqueItems.js var require_uniqueItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var dataType_1 = require_dataType(); @@ -5370,9 +5370,9 @@ var require_uniqueItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js +// node_modules/ajv/dist/vocabularies/validation/const.js var require_const = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5399,9 +5399,9 @@ var require_const = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js +// node_modules/ajv/dist/vocabularies/validation/enum.js var require_enum = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5448,9 +5448,9 @@ var require_enum = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js +// node_modules/ajv/dist/vocabularies/validation/index.js var require_validation = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var limitNumber_1 = require_limitNumber(); @@ -5486,9 +5486,9 @@ var require_validation = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +// node_modules/ajv/dist/vocabularies/applicator/additionalItems.js var require_additionalItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateAdditionalItems = void 0; @@ -5539,9 +5539,9 @@ var require_additionalItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js +// node_modules/ajv/dist/vocabularies/applicator/items.js var require_items = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateTuple = void 0; @@ -5583,10 +5583,10 @@ var require_items = __commonJS({ }); function checkStrictTuple(sch) { const { opts, errSchemaPath } = it; - const l3 = schArr.length; - const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); + const l = schArr.length; + const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false); if (opts.strictTuples && !fullTuple) { - const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + const msg = `"${keyword}" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); } } @@ -5596,9 +5596,9 @@ var require_items = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +// node_modules/ajv/dist/vocabularies/applicator/prefixItems.js var require_prefixItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var items_1 = require_items(); @@ -5613,9 +5613,9 @@ var require_prefixItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js +// node_modules/ajv/dist/vocabularies/applicator/items2020.js var require_items2020 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5648,9 +5648,9 @@ var require_items2020 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js +// node_modules/ajv/dist/vocabularies/applicator/contains.js var require_contains = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5742,9 +5742,9 @@ var require_contains = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +// node_modules/ajv/dist/vocabularies/applicator/dependencies.js var require_dependencies = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; @@ -5836,9 +5836,9 @@ var require_dependencies = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +// node_modules/ajv/dist/vocabularies/applicator/propertyNames.js var require_propertyNames = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5879,9 +5879,9 @@ var require_propertyNames = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +// node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js var require_additionalProperties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5985,9 +5985,9 @@ var require_additionalProperties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js +// node_modules/ajv/dist/vocabularies/applicator/properties.js var require_properties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var validate_1 = require_validate(); @@ -6043,9 +6043,9 @@ var require_properties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +// node_modules/ajv/dist/vocabularies/applicator/patternProperties.js var require_patternProperties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6117,9 +6117,9 @@ var require_patternProperties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js +// node_modules/ajv/dist/vocabularies/applicator/not.js var require_not = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6148,9 +6148,9 @@ var require_not = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +// node_modules/ajv/dist/vocabularies/applicator/anyOf.js var require_anyOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6165,9 +6165,9 @@ var require_anyOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +// node_modules/ajv/dist/vocabularies/applicator/oneOf.js var require_oneOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6223,9 +6223,9 @@ var require_oneOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js +// node_modules/ajv/dist/vocabularies/applicator/allOf.js var require_allOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6250,9 +6250,9 @@ var require_allOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js +// node_modules/ajv/dist/vocabularies/applicator/if.js var require_if = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6319,9 +6319,9 @@ var require_if = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +// node_modules/ajv/dist/vocabularies/applicator/thenElse.js var require_thenElse = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6337,9 +6337,9 @@ var require_thenElse = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js +// node_modules/ajv/dist/vocabularies/applicator/index.js var require_applicator = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var additionalItems_1 = require_additionalItems(); @@ -6385,9 +6385,9 @@ var require_applicator = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js +// node_modules/ajv/dist/vocabularies/format/format.js var require_format = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { + "node_modules/ajv/dist/vocabularies/format/format.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6475,9 +6475,9 @@ var require_format = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js +// node_modules/ajv/dist/vocabularies/format/index.js var require_format2 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/format/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var format_1 = require_format(); @@ -6486,9 +6486,9 @@ var require_format2 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js +// node_modules/ajv/dist/vocabularies/metadata.js var require_metadata = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { + "node_modules/ajv/dist/vocabularies/metadata.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.contentVocabulary = exports.metadataVocabulary = void 0; @@ -6509,9 +6509,9 @@ var require_metadata = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js +// node_modules/ajv/dist/vocabularies/draft7.js var require_draft7 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { + "node_modules/ajv/dist/vocabularies/draft7.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var core_1 = require_core2(); @@ -6531,9 +6531,9 @@ var require_draft7 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js +// node_modules/ajv/dist/vocabularies/discriminator/types.js var require_types = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { + "node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DiscrError = void 0; @@ -6545,9 +6545,9 @@ var require_types = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js +// node_modules/ajv/dist/vocabularies/discriminator/index.js var require_discriminator = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6650,9 +6650,9 @@ var require_discriminator = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json +// node_modules/ajv/dist/refs/json-schema-draft-07.json var require_json_schema_draft_07 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { + "node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { module.exports = { $schema: "http://json-schema.org/draft-07/schema#", $id: "http://json-schema.org/draft-07/schema#", @@ -6807,9 +6807,9 @@ var require_json_schema_draft_07 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js +// node_modules/ajv/dist/ajv.js var require_ajv = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js"(exports, module) { + "node_modules/ajv/dist/ajv.js"(exports, module) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; @@ -7080,5621 +7080,14 @@ var require_formats = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js -var require_code3 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; - var _CodeOrName = class { - }; - exports._CodeOrName = _CodeOrName; - exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; - var Name = class extends _CodeOrName { - constructor(s) { - super(); - if (!exports.IDENTIFIER.test(s)) - throw new Error("CodeGen: name must be a valid identifier"); - this.str = s; - } - toString() { - return this.str; - } - emptyStr() { - return false; - } - get names() { - return { [this.str]: 1 }; - } - }; - exports.Name = Name; - var _Code = class extends _CodeOrName { - constructor(code) { - super(); - this._items = typeof code === "string" ? [code] : code; - } - toString() { - return this.str; - } - emptyStr() { - if (this._items.length > 1) - return false; - const item = this._items[0]; - return item === "" || item === '""'; - } - get str() { - var _a3; - return (_a3 = this._str) !== null && _a3 !== void 0 ? _a3 : this._str = this._items.reduce((s, c) => `${s}${c}`, ""); - } - get names() { - var _a3; - return (_a3 = this._names) !== null && _a3 !== void 0 ? _a3 : this._names = this._items.reduce((names, c) => { - if (c instanceof Name) - names[c.str] = (names[c.str] || 0) + 1; - return names; - }, {}); - } - }; - exports._Code = _Code; - exports.nil = new _Code(""); - function _2(strs, ...args) { - const code = [strs[0]]; - let i = 0; - while (i < args.length) { - addCodeArg(code, args[i]); - code.push(strs[++i]); - } - return new _Code(code); - } - exports._ = _2; - var plus = new _Code("+"); - function str(strs, ...args) { - const expr = [safeStringify(strs[0])]; - let i = 0; - while (i < args.length) { - expr.push(plus); - addCodeArg(expr, args[i]); - expr.push(plus, safeStringify(strs[++i])); - } - optimize(expr); - return new _Code(expr); - } - exports.str = str; - function addCodeArg(code, arg) { - if (arg instanceof _Code) - code.push(...arg._items); - else if (arg instanceof Name) - code.push(arg); - else - code.push(interpolate(arg)); - } - exports.addCodeArg = addCodeArg; - function optimize(expr) { - let i = 1; - while (i < expr.length - 1) { - if (expr[i] === plus) { - const res = mergeExprItems(expr[i - 1], expr[i + 1]); - if (res !== void 0) { - expr.splice(i - 1, 3, res); - continue; - } - expr[i++] = "+"; - } - i++; - } - } - function mergeExprItems(a, b2) { - if (b2 === '""') - return a; - if (a === '""') - return b2; - if (typeof a == "string") { - if (b2 instanceof Name || a[a.length - 1] !== '"') - return; - if (typeof b2 != "string") - return `${a.slice(0, -1)}${b2}"`; - if (b2[0] === '"') - return a.slice(0, -1) + b2.slice(1); - return; - } - if (typeof b2 == "string" && b2[0] === '"' && !(a instanceof Name)) - return `"${a}${b2.slice(1)}`; - return; - } - function strConcat(c1, c2) { - return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str`${c1}${c2}`; - } - exports.strConcat = strConcat; - function interpolate(x2) { - return typeof x2 == "number" || typeof x2 == "boolean" || x2 === null ? x2 : safeStringify(Array.isArray(x2) ? x2.join(",") : x2); - } - function stringify(x2) { - return new _Code(safeStringify(x2)); - } - exports.stringify = stringify; - function safeStringify(x2) { - return JSON.stringify(x2).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); - } - exports.safeStringify = safeStringify; - function getProperty(key) { - return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _2`[${key}]`; - } - exports.getProperty = getProperty; - function getEsmExportName(key) { - if (typeof key == "string" && exports.IDENTIFIER.test(key)) { - return new _Code(`${key}`); - } - throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`); - } - exports.getEsmExportName = getEsmExportName; - function regexpCode(rx) { - return new _Code(rx.toString()); - } - exports.regexpCode = regexpCode; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js -var require_scope2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; - var code_1 = require_code3(); - var ValueError = class extends Error { - constructor(name) { - super(`CodeGen: "code" for ${name} not defined`); - this.value = name.value; - } - }; - var UsedValueState; - (function(UsedValueState2) { - UsedValueState2[UsedValueState2["Started"] = 0] = "Started"; - UsedValueState2[UsedValueState2["Completed"] = 1] = "Completed"; - })(UsedValueState || (exports.UsedValueState = UsedValueState = {})); - exports.varKinds = { - const: new code_1.Name("const"), - let: new code_1.Name("let"), - var: new code_1.Name("var") - }; - var Scope = class { - constructor({ prefixes, parent } = {}) { - this._names = {}; - this._prefixes = prefixes; - this._parent = parent; - } - toName(nameOrPrefix) { - return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix); - } - name(prefix) { - return new code_1.Name(this._newName(prefix)); - } - _newName(prefix) { - const ng = this._names[prefix] || this._nameGroup(prefix); - return `${prefix}${ng.index++}`; - } - _nameGroup(prefix) { - var _a3, _b; - if (((_b = (_a3 = this._parent) === null || _a3 === void 0 ? void 0 : _a3._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || this._prefixes && !this._prefixes.has(prefix)) { - throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`); - } - return this._names[prefix] = { prefix, index: 0 }; - } - }; - exports.Scope = Scope; - var ValueScopeName = class extends code_1.Name { - constructor(prefix, nameStr) { - super(nameStr); - this.prefix = prefix; - } - setValue(value, { property, itemIndex }) { - this.value = value; - this.scopePath = (0, code_1._)`.${new code_1.Name(property)}[${itemIndex}]`; - } - }; - exports.ValueScopeName = ValueScopeName; - var line = (0, code_1._)`\n`; - var ValueScope = class extends Scope { - constructor(opts) { - super(opts); - this._values = {}; - this._scope = opts.scope; - this.opts = { ...opts, _n: opts.lines ? line : code_1.nil }; - } - get() { - return this._scope; - } - name(prefix) { - return new ValueScopeName(prefix, this._newName(prefix)); - } - value(nameOrPrefix, value) { - var _a3; - if (value.ref === void 0) - throw new Error("CodeGen: ref must be passed in value"); - const name = this.toName(nameOrPrefix); - const { prefix } = name; - const valueKey = (_a3 = value.key) !== null && _a3 !== void 0 ? _a3 : value.ref; - let vs = this._values[prefix]; - if (vs) { - const _name = vs.get(valueKey); - if (_name) - return _name; - } else { - vs = this._values[prefix] = /* @__PURE__ */ new Map(); - } - vs.set(valueKey, name); - const s = this._scope[prefix] || (this._scope[prefix] = []); - const itemIndex = s.length; - s[itemIndex] = value.ref; - name.setValue(value, { property: prefix, itemIndex }); - return name; - } - getValue(prefix, keyOrRef) { - const vs = this._values[prefix]; - if (!vs) - return; - return vs.get(keyOrRef); - } - scopeRefs(scopeName, values = this._values) { - return this._reduceValues(values, (name) => { - if (name.scopePath === void 0) - throw new Error(`CodeGen: name "${name}" has no value`); - return (0, code_1._)`${scopeName}${name.scopePath}`; - }); - } - scopeCode(values = this._values, usedValues, getCode) { - return this._reduceValues(values, (name) => { - if (name.value === void 0) - throw new Error(`CodeGen: name "${name}" has no value`); - return name.value.code; - }, usedValues, getCode); - } - _reduceValues(values, valueCode, usedValues = {}, getCode) { - let code = code_1.nil; - for (const prefix in values) { - const vs = values[prefix]; - if (!vs) - continue; - const nameSet = usedValues[prefix] = usedValues[prefix] || /* @__PURE__ */ new Map(); - vs.forEach((name) => { - if (nameSet.has(name)) - return; - nameSet.set(name, UsedValueState.Started); - let c = valueCode(name); - if (c) { - const def = this.opts.es5 ? exports.varKinds.var : exports.varKinds.const; - code = (0, code_1._)`${code}${def} ${name} = ${c};${this.opts._n}`; - } else if (c = getCode === null || getCode === void 0 ? void 0 : getCode(name)) { - code = (0, code_1._)`${code}${c}${this.opts._n}`; - } else { - throw new ValueError(name); - } - nameSet.set(name, UsedValueState.Completed); - }); - } - return code; - } - }; - exports.ValueScope = ValueScope; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js -var require_codegen2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; - var code_1 = require_code3(); - var scope_1 = require_scope2(); - var code_2 = require_code3(); - Object.defineProperty(exports, "_", { enumerable: true, get: function() { - return code_2._; - } }); - Object.defineProperty(exports, "str", { enumerable: true, get: function() { - return code_2.str; - } }); - Object.defineProperty(exports, "strConcat", { enumerable: true, get: function() { - return code_2.strConcat; - } }); - Object.defineProperty(exports, "nil", { enumerable: true, get: function() { - return code_2.nil; - } }); - Object.defineProperty(exports, "getProperty", { enumerable: true, get: function() { - return code_2.getProperty; - } }); - Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { - return code_2.stringify; - } }); - Object.defineProperty(exports, "regexpCode", { enumerable: true, get: function() { - return code_2.regexpCode; - } }); - Object.defineProperty(exports, "Name", { enumerable: true, get: function() { - return code_2.Name; - } }); - var scope_2 = require_scope2(); - Object.defineProperty(exports, "Scope", { enumerable: true, get: function() { - return scope_2.Scope; - } }); - Object.defineProperty(exports, "ValueScope", { enumerable: true, get: function() { - return scope_2.ValueScope; - } }); - Object.defineProperty(exports, "ValueScopeName", { enumerable: true, get: function() { - return scope_2.ValueScopeName; - } }); - Object.defineProperty(exports, "varKinds", { enumerable: true, get: function() { - return scope_2.varKinds; - } }); - exports.operators = { - GT: new code_1._Code(">"), - GTE: new code_1._Code(">="), - LT: new code_1._Code("<"), - LTE: new code_1._Code("<="), - EQ: new code_1._Code("==="), - NEQ: new code_1._Code("!=="), - NOT: new code_1._Code("!"), - OR: new code_1._Code("||"), - AND: new code_1._Code("&&"), - ADD: new code_1._Code("+") - }; - var Node = class { - optimizeNodes() { - return this; - } - optimizeNames(_names, _constants) { - return this; - } - }; - var Def = class extends Node { - constructor(varKind, name, rhs) { - super(); - this.varKind = varKind; - this.name = name; - this.rhs = rhs; - } - render({ es5, _n }) { - const varKind = es5 ? scope_1.varKinds.var : this.varKind; - const rhs = this.rhs === void 0 ? "" : ` = ${this.rhs}`; - return `${varKind} ${this.name}${rhs};` + _n; - } - optimizeNames(names, constants) { - if (!names[this.name.str]) - return; - if (this.rhs) - this.rhs = optimizeExpr(this.rhs, names, constants); - return this; - } - get names() { - return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {}; - } - }; - var Assign = class extends Node { - constructor(lhs, rhs, sideEffects) { - super(); - this.lhs = lhs; - this.rhs = rhs; - this.sideEffects = sideEffects; - } - render({ _n }) { - return `${this.lhs} = ${this.rhs};` + _n; - } - optimizeNames(names, constants) { - if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects) - return; - this.rhs = optimizeExpr(this.rhs, names, constants); - return this; - } - get names() { - const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names }; - return addExprNames(names, this.rhs); - } - }; - var AssignOp = class extends Assign { - constructor(lhs, op, rhs, sideEffects) { - super(lhs, rhs, sideEffects); - this.op = op; - } - render({ _n }) { - return `${this.lhs} ${this.op}= ${this.rhs};` + _n; - } - }; - var Label = class extends Node { - constructor(label) { - super(); - this.label = label; - this.names = {}; - } - render({ _n }) { - return `${this.label}:` + _n; - } - }; - var Break = class extends Node { - constructor(label) { - super(); - this.label = label; - this.names = {}; - } - render({ _n }) { - const label = this.label ? ` ${this.label}` : ""; - return `break${label};` + _n; - } - }; - var Throw = class extends Node { - constructor(error61) { - super(); - this.error = error61; - } - render({ _n }) { - return `throw ${this.error};` + _n; - } - get names() { - return this.error.names; - } - }; - var AnyCode = class extends Node { - constructor(code) { - super(); - this.code = code; - } - render({ _n }) { - return `${this.code};` + _n; - } - optimizeNodes() { - return `${this.code}` ? this : void 0; - } - optimizeNames(names, constants) { - this.code = optimizeExpr(this.code, names, constants); - return this; - } - get names() { - return this.code instanceof code_1._CodeOrName ? this.code.names : {}; - } - }; - var ParentNode = class extends Node { - constructor(nodes = []) { - super(); - this.nodes = nodes; - } - render(opts) { - return this.nodes.reduce((code, n) => code + n.render(opts), ""); - } - optimizeNodes() { - const { nodes } = this; - let i = nodes.length; - while (i--) { - const n = nodes[i].optimizeNodes(); - if (Array.isArray(n)) - nodes.splice(i, 1, ...n); - else if (n) - nodes[i] = n; - else - nodes.splice(i, 1); - } - return nodes.length > 0 ? this : void 0; - } - optimizeNames(names, constants) { - const { nodes } = this; - let i = nodes.length; - while (i--) { - const n = nodes[i]; - if (n.optimizeNames(names, constants)) - continue; - subtractNames(names, n.names); - nodes.splice(i, 1); - } - return nodes.length > 0 ? this : void 0; - } - get names() { - return this.nodes.reduce((names, n) => addNames(names, n.names), {}); - } - }; - var BlockNode = class extends ParentNode { - render(opts) { - return "{" + opts._n + super.render(opts) + "}" + opts._n; - } - }; - var Root = class extends ParentNode { - }; - var Else = class extends BlockNode { - }; - Else.kind = "else"; - var If = class _If extends BlockNode { - constructor(condition, nodes) { - super(nodes); - this.condition = condition; - } - render(opts) { - let code = `if(${this.condition})` + super.render(opts); - if (this.else) - code += "else " + this.else.render(opts); - return code; - } - optimizeNodes() { - super.optimizeNodes(); - const cond = this.condition; - if (cond === true) - return this.nodes; - let e = this.else; - if (e) { - const ns = e.optimizeNodes(); - e = this.else = Array.isArray(ns) ? new Else(ns) : ns; - } - if (e) { - if (cond === false) - return e instanceof _If ? e : e.nodes; - if (this.nodes.length) - return this; - return new _If(not(cond), e instanceof _If ? [e] : e.nodes); - } - if (cond === false || !this.nodes.length) - return void 0; - return this; - } - optimizeNames(names, constants) { - var _a3; - this.else = (_a3 = this.else) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); - if (!(super.optimizeNames(names, constants) || this.else)) - return; - this.condition = optimizeExpr(this.condition, names, constants); - return this; - } - get names() { - const names = super.names; - addExprNames(names, this.condition); - if (this.else) - addNames(names, this.else.names); - return names; - } - }; - If.kind = "if"; - var For = class extends BlockNode { - }; - For.kind = "for"; - var ForLoop = class extends For { - constructor(iteration) { - super(); - this.iteration = iteration; - } - render(opts) { - return `for(${this.iteration})` + super.render(opts); - } - optimizeNames(names, constants) { - if (!super.optimizeNames(names, constants)) - return; - this.iteration = optimizeExpr(this.iteration, names, constants); - return this; - } - get names() { - return addNames(super.names, this.iteration.names); - } - }; - var ForRange = class extends For { - constructor(varKind, name, from, to) { - super(); - this.varKind = varKind; - this.name = name; - this.from = from; - this.to = to; - } - render(opts) { - const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind; - const { name, from, to } = this; - return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts); - } - get names() { - const names = addExprNames(super.names, this.from); - return addExprNames(names, this.to); - } - }; - var ForIter = class extends For { - constructor(loop, varKind, name, iterable) { - super(); - this.loop = loop; - this.varKind = varKind; - this.name = name; - this.iterable = iterable; - } - render(opts) { - return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts); - } - optimizeNames(names, constants) { - if (!super.optimizeNames(names, constants)) - return; - this.iterable = optimizeExpr(this.iterable, names, constants); - return this; - } - get names() { - return addNames(super.names, this.iterable.names); - } - }; - var Func = class extends BlockNode { - constructor(name, args, async) { - super(); - this.name = name; - this.args = args; - this.async = async; - } - render(opts) { - const _async = this.async ? "async " : ""; - return `${_async}function ${this.name}(${this.args})` + super.render(opts); - } - }; - Func.kind = "func"; - var Return = class extends ParentNode { - render(opts) { - return "return " + super.render(opts); - } - }; - Return.kind = "return"; - var Try = class extends BlockNode { - render(opts) { - let code = "try" + super.render(opts); - if (this.catch) - code += this.catch.render(opts); - if (this.finally) - code += this.finally.render(opts); - return code; - } - optimizeNodes() { - var _a3, _b; - super.optimizeNodes(); - (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNodes(); - (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes(); - return this; - } - optimizeNames(names, constants) { - var _a3, _b; - super.optimizeNames(names, constants); - (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); - (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants); - return this; - } - get names() { - const names = super.names; - if (this.catch) - addNames(names, this.catch.names); - if (this.finally) - addNames(names, this.finally.names); - return names; - } - }; - var Catch = class extends BlockNode { - constructor(error61) { - super(); - this.error = error61; - } - render(opts) { - return `catch(${this.error})` + super.render(opts); - } - }; - Catch.kind = "catch"; - var Finally = class extends BlockNode { - render(opts) { - return "finally" + super.render(opts); - } - }; - Finally.kind = "finally"; - var CodeGen = class { - constructor(extScope, opts = {}) { - this._values = {}; - this._blockStarts = []; - this._constants = {}; - this.opts = { ...opts, _n: opts.lines ? "\n" : "" }; - this._extScope = extScope; - this._scope = new scope_1.Scope({ parent: extScope }); - this._nodes = [new Root()]; - } - toString() { - return this._root.render(this.opts); - } - // returns unique name in the internal scope - name(prefix) { - return this._scope.name(prefix); - } - // reserves unique name in the external scope - scopeName(prefix) { - return this._extScope.name(prefix); - } - // reserves unique name in the external scope and assigns value to it - scopeValue(prefixOrName, value) { - const name = this._extScope.value(prefixOrName, value); - const vs = this._values[name.prefix] || (this._values[name.prefix] = /* @__PURE__ */ new Set()); - vs.add(name); - return name; - } - getScopeValue(prefix, keyOrRef) { - return this._extScope.getValue(prefix, keyOrRef); - } - // return code that assigns values in the external scope to the names that are used internally - // (same names that were returned by gen.scopeName or gen.scopeValue) - scopeRefs(scopeName) { - return this._extScope.scopeRefs(scopeName, this._values); - } - scopeCode() { - return this._extScope.scopeCode(this._values); - } - _def(varKind, nameOrPrefix, rhs, constant) { - const name = this._scope.toName(nameOrPrefix); - if (rhs !== void 0 && constant) - this._constants[name.str] = rhs; - this._leafNode(new Def(varKind, name, rhs)); - return name; - } - // `const` declaration (`var` in es5 mode) - const(nameOrPrefix, rhs, _constant) { - return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant); - } - // `let` declaration with optional assignment (`var` in es5 mode) - let(nameOrPrefix, rhs, _constant) { - return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant); - } - // `var` declaration with optional assignment - var(nameOrPrefix, rhs, _constant) { - return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant); - } - // assignment code - assign(lhs, rhs, sideEffects) { - return this._leafNode(new Assign(lhs, rhs, sideEffects)); - } - // `+=` code - add(lhs, rhs) { - return this._leafNode(new AssignOp(lhs, exports.operators.ADD, rhs)); - } - // appends passed SafeExpr to code or executes Block - code(c) { - if (typeof c == "function") - c(); - else if (c !== code_1.nil) - this._leafNode(new AnyCode(c)); - return this; - } - // returns code for object literal for the passed argument list of key-value pairs - object(...keyValues) { - const code = ["{"]; - for (const [key, value] of keyValues) { - if (code.length > 1) - code.push(","); - code.push(key); - if (key !== value || this.opts.es5) { - code.push(":"); - (0, code_1.addCodeArg)(code, value); - } - } - code.push("}"); - return new code_1._Code(code); - } - // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed) - if(condition, thenBody, elseBody) { - this._blockNode(new If(condition)); - if (thenBody && elseBody) { - this.code(thenBody).else().code(elseBody).endIf(); - } else if (thenBody) { - this.code(thenBody).endIf(); - } else if (elseBody) { - throw new Error('CodeGen: "else" body without "then" body'); - } - return this; - } - // `else if` clause - invalid without `if` or after `else` clauses - elseIf(condition) { - return this._elseNode(new If(condition)); - } - // `else` clause - only valid after `if` or `else if` clauses - else() { - return this._elseNode(new Else()); - } - // end `if` statement (needed if gen.if was used only with condition) - endIf() { - return this._endBlockNode(If, Else); - } - _for(node2, forBody) { - this._blockNode(node2); - if (forBody) - this.code(forBody).endFor(); - return this; - } - // a generic `for` clause (or statement if `forBody` is passed) - for(iteration, forBody) { - return this._for(new ForLoop(iteration), forBody); - } - // `for` statement for a range of values - forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) { - const name = this._scope.toName(nameOrPrefix); - return this._for(new ForRange(varKind, name, from, to), () => forBody(name)); - } - // `for-of` statement (in es5 mode replace with a normal for loop) - forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) { - const name = this._scope.toName(nameOrPrefix); - if (this.opts.es5) { - const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable); - return this.forRange("_i", 0, (0, code_1._)`${arr}.length`, (i) => { - this.var(name, (0, code_1._)`${arr}[${i}]`); - forBody(name); - }); - } - return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name)); - } - // `for-in` statement. - // With option `ownProperties` replaced with a `for-of` loop for object keys - forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) { - if (this.opts.ownProperties) { - return this.forOf(nameOrPrefix, (0, code_1._)`Object.keys(${obj})`, forBody); - } - const name = this._scope.toName(nameOrPrefix); - return this._for(new ForIter("in", varKind, name, obj), () => forBody(name)); - } - // end `for` loop - endFor() { - return this._endBlockNode(For); - } - // `label` statement - label(label) { - return this._leafNode(new Label(label)); - } - // `break` statement - break(label) { - return this._leafNode(new Break(label)); - } - // `return` statement - return(value) { - const node2 = new Return(); - this._blockNode(node2); - this.code(value); - if (node2.nodes.length !== 1) - throw new Error('CodeGen: "return" should have one node'); - return this._endBlockNode(Return); - } - // `try` statement - try(tryBody, catchCode, finallyCode) { - if (!catchCode && !finallyCode) - throw new Error('CodeGen: "try" without "catch" and "finally"'); - const node2 = new Try(); - this._blockNode(node2); - this.code(tryBody); - if (catchCode) { - const error61 = this.name("e"); - this._currNode = node2.catch = new Catch(error61); - catchCode(error61); - } - if (finallyCode) { - this._currNode = node2.finally = new Finally(); - this.code(finallyCode); - } - return this._endBlockNode(Catch, Finally); - } - // `throw` statement - throw(error61) { - return this._leafNode(new Throw(error61)); - } - // start self-balancing block - block(body, nodeCount) { - this._blockStarts.push(this._nodes.length); - if (body) - this.code(body).endBlock(nodeCount); - return this; - } - // end the current self-balancing block - endBlock(nodeCount) { - const len = this._blockStarts.pop(); - if (len === void 0) - throw new Error("CodeGen: not in self-balancing block"); - const toClose = this._nodes.length - len; - if (toClose < 0 || nodeCount !== void 0 && toClose !== nodeCount) { - throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`); - } - this._nodes.length = len; - return this; - } - // `function` heading (or definition if funcBody is passed) - func(name, args = code_1.nil, async, funcBody) { - this._blockNode(new Func(name, args, async)); - if (funcBody) - this.code(funcBody).endFunc(); - return this; - } - // end function definition - endFunc() { - return this._endBlockNode(Func); - } - optimize(n = 1) { - while (n-- > 0) { - this._root.optimizeNodes(); - this._root.optimizeNames(this._root.names, this._constants); - } - } - _leafNode(node2) { - this._currNode.nodes.push(node2); - return this; - } - _blockNode(node2) { - this._currNode.nodes.push(node2); - this._nodes.push(node2); - } - _endBlockNode(N1, N2) { - const n = this._currNode; - if (n instanceof N1 || N2 && n instanceof N2) { - this._nodes.pop(); - return this; - } - throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`); - } - _elseNode(node2) { - const n = this._currNode; - if (!(n instanceof If)) { - throw new Error('CodeGen: "else" without "if"'); - } - this._currNode = n.else = node2; - return this; - } - get _root() { - return this._nodes[0]; - } - get _currNode() { - const ns = this._nodes; - return ns[ns.length - 1]; - } - set _currNode(node2) { - const ns = this._nodes; - ns[ns.length - 1] = node2; - } - }; - exports.CodeGen = CodeGen; - function addNames(names, from) { - for (const n in from) - names[n] = (names[n] || 0) + (from[n] || 0); - return names; - } - function addExprNames(names, from) { - return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names; - } - function optimizeExpr(expr, names, constants) { - if (expr instanceof code_1.Name) - return replaceName(expr); - if (!canOptimize(expr)) - return expr; - return new code_1._Code(expr._items.reduce((items, c) => { - if (c instanceof code_1.Name) - c = replaceName(c); - if (c instanceof code_1._Code) - items.push(...c._items); - else - items.push(c); - return items; - }, [])); - function replaceName(n) { - const c = constants[n.str]; - if (c === void 0 || names[n.str] !== 1) - return n; - delete names[n.str]; - return c; - } - function canOptimize(e) { - return e instanceof code_1._Code && e._items.some((c) => c instanceof code_1.Name && names[c.str] === 1 && constants[c.str] !== void 0); - } - } - function subtractNames(names, from) { - for (const n in from) - names[n] = (names[n] || 0) - (from[n] || 0); - } - function not(x2) { - return typeof x2 == "boolean" || typeof x2 == "number" || x2 === null ? !x2 : (0, code_1._)`!${par(x2)}`; - } - exports.not = not; - var andCode = mappend(exports.operators.AND); - function and(...args) { - return args.reduce(andCode); - } - exports.and = and; - var orCode = mappend(exports.operators.OR); - function or(...args) { - return args.reduce(orCode); - } - exports.or = or; - function mappend(op) { - return (x2, y2) => x2 === code_1.nil ? y2 : y2 === code_1.nil ? x2 : (0, code_1._)`${par(x2)} ${op} ${par(y2)}`; - } - function par(x2) { - return x2 instanceof code_1.Name ? x2 : (0, code_1._)`(${x2})`; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js -var require_util2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; - var codegen_1 = require_codegen2(); - var code_1 = require_code3(); - function toHash(arr) { - const hash2 = {}; - for (const item of arr) - hash2[item] = true; - return hash2; - } - exports.toHash = toHash; - function alwaysValidSchema(it, schema) { - if (typeof schema == "boolean") - return schema; - if (Object.keys(schema).length === 0) - return true; - checkUnknownRules(it, schema); - return !schemaHasRules(schema, it.self.RULES.all); - } - exports.alwaysValidSchema = alwaysValidSchema; - function checkUnknownRules(it, schema = it.schema) { - const { opts, self } = it; - if (!opts.strictSchema) - return; - if (typeof schema === "boolean") - return; - const rules = self.RULES.keywords; - for (const key in schema) { - if (!rules[key]) - checkStrictMode(it, `unknown keyword: "${key}"`); - } - } - exports.checkUnknownRules = checkUnknownRules; - function schemaHasRules(schema, rules) { - if (typeof schema == "boolean") - return !schema; - for (const key in schema) - if (rules[key]) - return true; - return false; - } - exports.schemaHasRules = schemaHasRules; - function schemaHasRulesButRef(schema, RULES) { - if (typeof schema == "boolean") - return !schema; - for (const key in schema) - if (key !== "$ref" && RULES.all[key]) - return true; - return false; - } - exports.schemaHasRulesButRef = schemaHasRulesButRef; - function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) { - if (!$data) { - if (typeof schema == "number" || typeof schema == "boolean") - return schema; - if (typeof schema == "string") - return (0, codegen_1._)`${schema}`; - } - return (0, codegen_1._)`${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`; - } - exports.schemaRefOrVal = schemaRefOrVal; - function unescapeFragment(str) { - return unescapeJsonPointer(decodeURIComponent(str)); - } - exports.unescapeFragment = unescapeFragment; - function escapeFragment(str) { - return encodeURIComponent(escapeJsonPointer(str)); - } - exports.escapeFragment = escapeFragment; - function escapeJsonPointer(str) { - if (typeof str == "number") - return `${str}`; - return str.replace(/~/g, "~0").replace(/\//g, "~1"); - } - exports.escapeJsonPointer = escapeJsonPointer; - function unescapeJsonPointer(str) { - return str.replace(/~1/g, "/").replace(/~0/g, "~"); - } - exports.unescapeJsonPointer = unescapeJsonPointer; - function eachItem(xs, f) { - if (Array.isArray(xs)) { - for (const x2 of xs) - f(x2); - } else { - f(xs); - } - } - exports.eachItem = eachItem; - function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues: mergeValues2, resultToName }) { - return (gen, from, to, toName) => { - const res = to === void 0 ? from : to instanceof codegen_1.Name ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to) : from instanceof codegen_1.Name ? (mergeToName(gen, to, from), from) : mergeValues2(from, to); - return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res; - }; - } - exports.mergeEvaluated = { - props: makeMergeEvaluated({ - mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => { - gen.if((0, codegen_1._)`${from} === true`, () => gen.assign(to, true), () => gen.assign(to, (0, codegen_1._)`${to} || {}`).code((0, codegen_1._)`Object.assign(${to}, ${from})`)); - }), - mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => { - if (from === true) { - gen.assign(to, true); - } else { - gen.assign(to, (0, codegen_1._)`${to} || {}`); - setEvaluated(gen, to, from); - } - }), - mergeValues: (from, to) => from === true ? true : { ...from, ...to }, - resultToName: evaluatedPropsToName - }), - items: makeMergeEvaluated({ - mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => gen.assign(to, (0, codegen_1._)`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)), - mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => gen.assign(to, from === true ? true : (0, codegen_1._)`${to} > ${from} ? ${to} : ${from}`)), - mergeValues: (from, to) => from === true ? true : Math.max(from, to), - resultToName: (gen, items) => gen.var("items", items) - }) - }; - function evaluatedPropsToName(gen, ps) { - if (ps === true) - return gen.var("props", true); - const props = gen.var("props", (0, codegen_1._)`{}`); - if (ps !== void 0) - setEvaluated(gen, props, ps); - return props; - } - exports.evaluatedPropsToName = evaluatedPropsToName; - function setEvaluated(gen, props, ps) { - Object.keys(ps).forEach((p) => gen.assign((0, codegen_1._)`${props}${(0, codegen_1.getProperty)(p)}`, true)); - } - exports.setEvaluated = setEvaluated; - var snippets = {}; - function useFunc(gen, f) { - return gen.scopeValue("func", { - ref: f, - code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code)) - }); - } - exports.useFunc = useFunc; - var Type; - (function(Type2) { - Type2[Type2["Num"] = 0] = "Num"; - Type2[Type2["Str"] = 1] = "Str"; - })(Type || (exports.Type = Type = {})); - function getErrorPath(dataProp, dataPropType, jsPropertySyntax) { - if (dataProp instanceof codegen_1.Name) { - const isNumber = dataPropType === Type.Num; - return jsPropertySyntax ? isNumber ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`; - } - return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp); - } - exports.getErrorPath = getErrorPath; - function checkStrictMode(it, msg, mode = it.opts.strictSchema) { - if (!mode) - return; - msg = `strict mode: ${msg}`; - if (mode === true) - throw new Error(msg); - it.self.logger.warn(msg); - } - exports.checkStrictMode = checkStrictMode; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js -var require_names2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var names = { - // validation function arguments - data: new codegen_1.Name("data"), - // data passed to validation function - // args passed from referencing schema - valCxt: new codegen_1.Name("valCxt"), - // validation/data context - should not be used directly, it is destructured to the names below - instancePath: new codegen_1.Name("instancePath"), - parentData: new codegen_1.Name("parentData"), - parentDataProperty: new codegen_1.Name("parentDataProperty"), - rootData: new codegen_1.Name("rootData"), - // root data - same as the data passed to the first/top validation function - dynamicAnchors: new codegen_1.Name("dynamicAnchors"), - // used to support recursiveRef and dynamicRef - // function scoped variables - vErrors: new codegen_1.Name("vErrors"), - // null or array of validation errors - errors: new codegen_1.Name("errors"), - // counter of validation errors - this: new codegen_1.Name("this"), - // "globals" - self: new codegen_1.Name("self"), - scope: new codegen_1.Name("scope"), - // JTD serialize/parse name for JSON string and position - json: new codegen_1.Name("json"), - jsonPos: new codegen_1.Name("jsonPos"), - jsonLen: new codegen_1.Name("jsonLen"), - jsonPart: new codegen_1.Name("jsonPart") - }; - exports.default = names; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js -var require_errors2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var names_1 = require_names2(); - exports.keywordError = { - message: ({ keyword }) => (0, codegen_1.str)`must pass "${keyword}" keyword validation` - }; - exports.keyword$DataError = { - message: ({ keyword, schemaType }) => schemaType ? (0, codegen_1.str)`"${keyword}" keyword must be ${schemaType} ($data)` : (0, codegen_1.str)`"${keyword}" keyword is invalid ($data)` - }; - function reportError(cxt, error61 = exports.keywordError, errorPaths, overrideAllErrors) { - const { it } = cxt; - const { gen, compositeRule, allErrors } = it; - const errObj = errorObjectCode(cxt, error61, errorPaths); - if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : compositeRule || allErrors) { - addError(gen, errObj); - } else { - returnErrors(it, (0, codegen_1._)`[${errObj}]`); - } - } - exports.reportError = reportError; - function reportExtraError(cxt, error61 = exports.keywordError, errorPaths) { - const { it } = cxt; - const { gen, compositeRule, allErrors } = it; - const errObj = errorObjectCode(cxt, error61, errorPaths); - addError(gen, errObj); - if (!(compositeRule || allErrors)) { - returnErrors(it, names_1.default.vErrors); - } - } - exports.reportExtraError = reportExtraError; - function resetErrorsCount(gen, errsCount) { - gen.assign(names_1.default.errors, errsCount); - gen.if((0, codegen_1._)`${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign((0, codegen_1._)`${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null))); - } - exports.resetErrorsCount = resetErrorsCount; - function extendErrors({ gen, keyword, schemaValue, data, errsCount, it }) { - if (errsCount === void 0) - throw new Error("ajv implementation error"); - const err = gen.name("err"); - gen.forRange("i", errsCount, names_1.default.errors, (i) => { - gen.const(err, (0, codegen_1._)`${names_1.default.vErrors}[${i}]`); - gen.if((0, codegen_1._)`${err}.instancePath === undefined`, () => gen.assign((0, codegen_1._)`${err}.instancePath`, (0, codegen_1.strConcat)(names_1.default.instancePath, it.errorPath))); - gen.assign((0, codegen_1._)`${err}.schemaPath`, (0, codegen_1.str)`${it.errSchemaPath}/${keyword}`); - if (it.opts.verbose) { - gen.assign((0, codegen_1._)`${err}.schema`, schemaValue); - gen.assign((0, codegen_1._)`${err}.data`, data); - } - }); - } - exports.extendErrors = extendErrors; - function addError(gen, errObj) { - const err = gen.const("err", errObj); - gen.if((0, codegen_1._)`${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, (0, codegen_1._)`[${err}]`), (0, codegen_1._)`${names_1.default.vErrors}.push(${err})`); - gen.code((0, codegen_1._)`${names_1.default.errors}++`); - } - function returnErrors(it, errs) { - const { gen, validateName, schemaEnv } = it; - if (schemaEnv.$async) { - gen.throw((0, codegen_1._)`new ${it.ValidationError}(${errs})`); - } else { - gen.assign((0, codegen_1._)`${validateName}.errors`, errs); - gen.return(false); - } - } - var E2 = { - keyword: new codegen_1.Name("keyword"), - schemaPath: new codegen_1.Name("schemaPath"), - // also used in JTD errors - params: new codegen_1.Name("params"), - propertyName: new codegen_1.Name("propertyName"), - message: new codegen_1.Name("message"), - schema: new codegen_1.Name("schema"), - parentSchema: new codegen_1.Name("parentSchema") - }; - function errorObjectCode(cxt, error61, errorPaths) { - const { createErrors } = cxt.it; - if (createErrors === false) - return (0, codegen_1._)`{}`; - return errorObject(cxt, error61, errorPaths); - } - function errorObject(cxt, error61, errorPaths = {}) { - const { gen, it } = cxt; - const keyValues = [ - errorInstancePath(it, errorPaths), - errorSchemaPath(cxt, errorPaths) - ]; - extraErrorProps(cxt, error61, keyValues); - return gen.object(...keyValues); - } - function errorInstancePath({ errorPath }, { instancePath }) { - const instPath = instancePath ? (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(instancePath, util_1.Type.Str)}` : errorPath; - return [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, instPath)]; - } - function errorSchemaPath({ keyword, it: { errSchemaPath } }, { schemaPath, parentSchema }) { - let schPath = parentSchema ? errSchemaPath : (0, codegen_1.str)`${errSchemaPath}/${keyword}`; - if (schemaPath) { - schPath = (0, codegen_1.str)`${schPath}${(0, util_1.getErrorPath)(schemaPath, util_1.Type.Str)}`; - } - return [E2.schemaPath, schPath]; - } - function extraErrorProps(cxt, { params, message }, keyValues) { - const { keyword, data, schemaValue, it } = cxt; - const { opts, propertyName, topSchemaRef, schemaPath } = it; - keyValues.push([E2.keyword, keyword], [E2.params, typeof params == "function" ? params(cxt) : params || (0, codegen_1._)`{}`]); - if (opts.messages) { - keyValues.push([E2.message, typeof message == "function" ? message(cxt) : message]); - } - if (opts.verbose) { - keyValues.push([E2.schema, schemaValue], [E2.parentSchema, (0, codegen_1._)`${topSchemaRef}${schemaPath}`], [names_1.default.data, data]); - } - if (propertyName) - keyValues.push([E2.propertyName, propertyName]); - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js -var require_boolSchema2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; - var errors_1 = require_errors2(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var boolError = { - message: "boolean schema is false" - }; - function topBoolOrEmptySchema(it) { - const { gen, schema, validateName } = it; - if (schema === false) { - falseSchemaError(it, false); - } else if (typeof schema == "object" && schema.$async === true) { - gen.return(names_1.default.data); - } else { - gen.assign((0, codegen_1._)`${validateName}.errors`, null); - gen.return(true); - } - } - exports.topBoolOrEmptySchema = topBoolOrEmptySchema; - function boolOrEmptySchema(it, valid) { - const { gen, schema } = it; - if (schema === false) { - gen.var(valid, false); - falseSchemaError(it); - } else { - gen.var(valid, true); - } - } - exports.boolOrEmptySchema = boolOrEmptySchema; - function falseSchemaError(it, overrideAllErrors) { - const { gen, data } = it; - const cxt = { - gen, - keyword: "false schema", - data, - schema: false, - schemaCode: false, - schemaValue: false, - params: {}, - it - }; - (0, errors_1.reportError)(cxt, boolError, void 0, overrideAllErrors); - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js -var require_rules2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getRules = exports.isJSONType = void 0; - var _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"]; - var jsonTypes = new Set(_jsonTypes); - function isJSONType(x2) { - return typeof x2 == "string" && jsonTypes.has(x2); - } - exports.isJSONType = isJSONType; - function getRules() { - const groups = { - number: { type: "number", rules: [] }, - string: { type: "string", rules: [] }, - array: { type: "array", rules: [] }, - object: { type: "object", rules: [] } - }; - return { - types: { ...groups, integer: true, boolean: true, null: true }, - rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object], - post: { rules: [] }, - all: {}, - keywords: {} - }; - } - exports.getRules = getRules; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js -var require_applicability2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; - function schemaHasRulesForType({ schema, self }, type) { - const group = self.RULES.types[type]; - return group && group !== true && shouldUseGroup(schema, group); - } - exports.schemaHasRulesForType = schemaHasRulesForType; - function shouldUseGroup(schema, group) { - return group.rules.some((rule) => shouldUseRule(schema, rule)); - } - exports.shouldUseGroup = shouldUseGroup; - function shouldUseRule(schema, rule) { - var _a3; - return schema[rule.keyword] !== void 0 || ((_a3 = rule.definition.implements) === null || _a3 === void 0 ? void 0 : _a3.some((kwd) => schema[kwd] !== void 0)); - } - exports.shouldUseRule = shouldUseRule; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js -var require_dataType2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; - var rules_1 = require_rules2(); - var applicability_1 = require_applicability2(); - var errors_1 = require_errors2(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var DataType; - (function(DataType2) { - DataType2[DataType2["Correct"] = 0] = "Correct"; - DataType2[DataType2["Wrong"] = 1] = "Wrong"; - })(DataType || (exports.DataType = DataType = {})); - function getSchemaTypes(schema) { - const types = getJSONTypes(schema.type); - const hasNull = types.includes("null"); - if (hasNull) { - if (schema.nullable === false) - throw new Error("type: null contradicts nullable: false"); - } else { - if (!types.length && schema.nullable !== void 0) { - throw new Error('"nullable" cannot be used without "type"'); - } - if (schema.nullable === true) - types.push("null"); - } - return types; - } - exports.getSchemaTypes = getSchemaTypes; - function getJSONTypes(ts) { - const types = Array.isArray(ts) ? ts : ts ? [ts] : []; - if (types.every(rules_1.isJSONType)) - return types; - throw new Error("type must be JSONType or JSONType[]: " + types.join(",")); - } - exports.getJSONTypes = getJSONTypes; - function coerceAndCheckDataType(it, types) { - const { gen, data, opts } = it; - const coerceTo = coerceToTypes(types, opts.coerceTypes); - const checkTypes = types.length > 0 && !(coerceTo.length === 0 && types.length === 1 && (0, applicability_1.schemaHasRulesForType)(it, types[0])); - if (checkTypes) { - const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong); - gen.if(wrongType, () => { - if (coerceTo.length) - coerceData(it, types, coerceTo); - else - reportTypeError(it); - }); - } - return checkTypes; - } - exports.coerceAndCheckDataType = coerceAndCheckDataType; - var COERCIBLE = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean", "null"]); - function coerceToTypes(types, coerceTypes) { - return coerceTypes ? types.filter((t) => COERCIBLE.has(t) || coerceTypes === "array" && t === "array") : []; - } - function coerceData(it, types, coerceTo) { - const { gen, data, opts } = it; - const dataType = gen.let("dataType", (0, codegen_1._)`typeof ${data}`); - const coerced = gen.let("coerced", (0, codegen_1._)`undefined`); - if (opts.coerceTypes === "array") { - gen.if((0, codegen_1._)`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen.assign(data, (0, codegen_1._)`${data}[0]`).assign(dataType, (0, codegen_1._)`typeof ${data}`).if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))); - } - gen.if((0, codegen_1._)`${coerced} !== undefined`); - for (const t of coerceTo) { - if (COERCIBLE.has(t) || t === "array" && opts.coerceTypes === "array") { - coerceSpecificType(t); - } - } - gen.else(); - reportTypeError(it); - gen.endIf(); - gen.if((0, codegen_1._)`${coerced} !== undefined`, () => { - gen.assign(data, coerced); - assignParentData(it, coerced); - }); - function coerceSpecificType(t) { - switch (t) { - case "string": - gen.elseIf((0, codegen_1._)`${dataType} == "number" || ${dataType} == "boolean"`).assign(coerced, (0, codegen_1._)`"" + ${data}`).elseIf((0, codegen_1._)`${data} === null`).assign(coerced, (0, codegen_1._)`""`); - return; - case "number": - gen.elseIf((0, codegen_1._)`${dataType} == "boolean" || ${data} === null - || (${dataType} == "string" && ${data} && ${data} == +${data})`).assign(coerced, (0, codegen_1._)`+${data}`); - return; - case "integer": - gen.elseIf((0, codegen_1._)`${dataType} === "boolean" || ${data} === null - || (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`).assign(coerced, (0, codegen_1._)`+${data}`); - return; - case "boolean": - gen.elseIf((0, codegen_1._)`${data} === "false" || ${data} === 0 || ${data} === null`).assign(coerced, false).elseIf((0, codegen_1._)`${data} === "true" || ${data} === 1`).assign(coerced, true); - return; - case "null": - gen.elseIf((0, codegen_1._)`${data} === "" || ${data} === 0 || ${data} === false`); - gen.assign(coerced, null); - return; - case "array": - gen.elseIf((0, codegen_1._)`${dataType} === "string" || ${dataType} === "number" - || ${dataType} === "boolean" || ${data} === null`).assign(coerced, (0, codegen_1._)`[${data}]`); - } - } - } - function assignParentData({ gen, parentData, parentDataProperty }, expr) { - gen.if((0, codegen_1._)`${parentData} !== undefined`, () => gen.assign((0, codegen_1._)`${parentData}[${parentDataProperty}]`, expr)); - } - function checkDataType(dataType, data, strictNums, correct = DataType.Correct) { - const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ; - let cond; - switch (dataType) { - case "null": - return (0, codegen_1._)`${data} ${EQ} null`; - case "array": - cond = (0, codegen_1._)`Array.isArray(${data})`; - break; - case "object": - cond = (0, codegen_1._)`${data} && typeof ${data} == "object" && !Array.isArray(${data})`; - break; - case "integer": - cond = numCond((0, codegen_1._)`!(${data} % 1) && !isNaN(${data})`); - break; - case "number": - cond = numCond(); - break; - default: - return (0, codegen_1._)`typeof ${data} ${EQ} ${dataType}`; - } - return correct === DataType.Correct ? cond : (0, codegen_1.not)(cond); - function numCond(_cond = codegen_1.nil) { - return (0, codegen_1.and)((0, codegen_1._)`typeof ${data} == "number"`, _cond, strictNums ? (0, codegen_1._)`isFinite(${data})` : codegen_1.nil); - } - } - exports.checkDataType = checkDataType; - function checkDataTypes(dataTypes, data, strictNums, correct) { - if (dataTypes.length === 1) { - return checkDataType(dataTypes[0], data, strictNums, correct); - } - let cond; - const types = (0, util_1.toHash)(dataTypes); - if (types.array && types.object) { - const notObj = (0, codegen_1._)`typeof ${data} != "object"`; - cond = types.null ? notObj : (0, codegen_1._)`!${data} || ${notObj}`; - delete types.null; - delete types.array; - delete types.object; - } else { - cond = codegen_1.nil; - } - if (types.number) - delete types.integer; - for (const t in types) - cond = (0, codegen_1.and)(cond, checkDataType(t, data, strictNums, correct)); - return cond; - } - exports.checkDataTypes = checkDataTypes; - var typeError = { - message: ({ schema }) => `must be ${schema}`, - params: ({ schema, schemaValue }) => typeof schema == "string" ? (0, codegen_1._)`{type: ${schema}}` : (0, codegen_1._)`{type: ${schemaValue}}` - }; - function reportTypeError(it) { - const cxt = getTypeErrorContext(it); - (0, errors_1.reportError)(cxt, typeError); - } - exports.reportTypeError = reportTypeError; - function getTypeErrorContext(it) { - const { gen, data, schema } = it; - const schemaCode = (0, util_1.schemaRefOrVal)(it, schema, "type"); - return { - gen, - keyword: "type", - data, - schema: schema.type, - schemaCode, - schemaValue: schemaCode, - parentSchema: schema, - params: {}, - it - }; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js -var require_defaults2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.assignDefaults = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - function assignDefaults(it, ty) { - const { properties, items } = it.schema; - if (ty === "object" && properties) { - for (const key in properties) { - assignDefault(it, key, properties[key].default); - } - } else if (ty === "array" && Array.isArray(items)) { - items.forEach((sch, i) => assignDefault(it, i, sch.default)); - } - } - exports.assignDefaults = assignDefaults; - function assignDefault(it, prop, defaultValue) { - const { gen, compositeRule, data, opts } = it; - if (defaultValue === void 0) - return; - const childData = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(prop)}`; - if (compositeRule) { - (0, util_1.checkStrictMode)(it, `default is ignored for: ${childData}`); - return; - } - let condition = (0, codegen_1._)`${childData} === undefined`; - if (opts.useDefaults === "empty") { - condition = (0, codegen_1._)`${condition} || ${childData} === null || ${childData} === ""`; - } - gen.if(condition, (0, codegen_1._)`${childData} = ${(0, codegen_1.stringify)(defaultValue)}`); - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js -var require_code4 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var names_1 = require_names2(); - var util_2 = require_util2(); - function checkReportMissingProp(cxt, prop) { - const { gen, data, it } = cxt; - gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => { - cxt.setParams({ missingProperty: (0, codegen_1._)`${prop}` }, true); - cxt.error(); - }); - } - exports.checkReportMissingProp = checkReportMissingProp; - function checkMissingProp({ gen, data, it: { opts } }, properties, missing) { - return (0, codegen_1.or)(...properties.map((prop) => (0, codegen_1.and)(noPropertyInData(gen, data, prop, opts.ownProperties), (0, codegen_1._)`${missing} = ${prop}`))); - } - exports.checkMissingProp = checkMissingProp; - function reportMissingProp(cxt, missing) { - cxt.setParams({ missingProperty: missing }, true); - cxt.error(); - } - exports.reportMissingProp = reportMissingProp; - function hasPropFunc(gen) { - return gen.scopeValue("func", { - // eslint-disable-next-line @typescript-eslint/unbound-method - ref: Object.prototype.hasOwnProperty, - code: (0, codegen_1._)`Object.prototype.hasOwnProperty` - }); - } - exports.hasPropFunc = hasPropFunc; - function isOwnProperty(gen, data, property) { - return (0, codegen_1._)`${hasPropFunc(gen)}.call(${data}, ${property})`; - } - exports.isOwnProperty = isOwnProperty; - function propertyInData(gen, data, property, ownProperties) { - const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} !== undefined`; - return ownProperties ? (0, codegen_1._)`${cond} && ${isOwnProperty(gen, data, property)}` : cond; - } - exports.propertyInData = propertyInData; - function noPropertyInData(gen, data, property, ownProperties) { - const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} === undefined`; - return ownProperties ? (0, codegen_1.or)(cond, (0, codegen_1.not)(isOwnProperty(gen, data, property))) : cond; - } - exports.noPropertyInData = noPropertyInData; - function allSchemaProperties(schemaMap) { - return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : []; - } - exports.allSchemaProperties = allSchemaProperties; - function schemaProperties(it, schemaMap) { - return allSchemaProperties(schemaMap).filter((p) => !(0, util_1.alwaysValidSchema)(it, schemaMap[p])); - } - exports.schemaProperties = schemaProperties; - function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) { - const dataAndSchema = passSchema ? (0, codegen_1._)`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data; - const valCxt = [ - [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, errorPath)], - [names_1.default.parentData, it.parentData], - [names_1.default.parentDataProperty, it.parentDataProperty], - [names_1.default.rootData, names_1.default.rootData] - ]; - if (it.opts.dynamicRef) - valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]); - const args = (0, codegen_1._)`${dataAndSchema}, ${gen.object(...valCxt)}`; - return context !== codegen_1.nil ? (0, codegen_1._)`${func}.call(${context}, ${args})` : (0, codegen_1._)`${func}(${args})`; - } - exports.callValidateCode = callValidateCode; - var newRegExp = (0, codegen_1._)`new RegExp`; - function usePattern({ gen, it: { opts } }, pattern) { - const u = opts.unicodeRegExp ? "u" : ""; - const { regExp } = opts.code; - const rx = regExp(pattern, u); - return gen.scopeValue("pattern", { - key: rx.toString(), - ref: rx, - code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` - }); - } - exports.usePattern = usePattern; - function validateArray(cxt) { - const { gen, data, keyword, it } = cxt; - const valid = gen.name("valid"); - if (it.allErrors) { - const validArr = gen.let("valid", true); - validateItems(() => gen.assign(validArr, false)); - return validArr; - } - gen.var(valid, true); - validateItems(() => gen.break()); - return valid; - function validateItems(notValid) { - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - gen.forRange("i", 0, len, (i) => { - cxt.subschema({ - keyword, - dataProp: i, - dataPropType: util_1.Type.Num - }, valid); - gen.if((0, codegen_1.not)(valid), notValid); - }); - } - } - exports.validateArray = validateArray; - function validateUnion(cxt) { - const { gen, schema, keyword, it } = cxt; - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - const alwaysValid = schema.some((sch) => (0, util_1.alwaysValidSchema)(it, sch)); - if (alwaysValid && !it.opts.unevaluated) - return; - const valid = gen.let("valid", false); - const schValid = gen.name("_valid"); - gen.block(() => schema.forEach((_sch, i) => { - const schCxt = cxt.subschema({ - keyword, - schemaProp: i, - compositeRule: true - }, schValid); - gen.assign(valid, (0, codegen_1._)`${valid} || ${schValid}`); - const merged = cxt.mergeValidEvaluated(schCxt, schValid); - if (!merged) - gen.if((0, codegen_1.not)(valid)); - })); - cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); - } - exports.validateUnion = validateUnion; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js -var require_keyword2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var code_1 = require_code4(); - var errors_1 = require_errors2(); - function macroKeywordCode(cxt, def) { - const { gen, keyword, schema, parentSchema, it } = cxt; - const macroSchema = def.macro.call(it.self, schema, parentSchema, it); - const schemaRef = useKeyword(gen, keyword, macroSchema); - if (it.opts.validateSchema !== false) - it.self.validateSchema(macroSchema, true); - const valid = gen.name("valid"); - cxt.subschema({ - schema: macroSchema, - schemaPath: codegen_1.nil, - errSchemaPath: `${it.errSchemaPath}/${keyword}`, - topSchemaRef: schemaRef, - compositeRule: true - }, valid); - cxt.pass(valid, () => cxt.error(true)); - } - exports.macroKeywordCode = macroKeywordCode; - function funcKeywordCode(cxt, def) { - var _a3; - const { gen, keyword, schema, parentSchema, $data, it } = cxt; - checkAsyncKeyword(it, def); - const validate2 = !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate; - const validateRef = useKeyword(gen, keyword, validate2); - const valid = gen.let("valid"); - cxt.block$data(valid, validateKeyword); - cxt.ok((_a3 = def.valid) !== null && _a3 !== void 0 ? _a3 : valid); - function validateKeyword() { - if (def.errors === false) { - assignValid(); - if (def.modifying) - modifyData(cxt); - reportErrs(() => cxt.error()); - } else { - const ruleErrs = def.async ? validateAsync2() : validateSync(); - if (def.modifying) - modifyData(cxt); - reportErrs(() => addErrs(cxt, ruleErrs)); - } - } - function validateAsync2() { - const ruleErrs = gen.let("ruleErrs", null); - gen.try(() => assignValid((0, codegen_1._)`await `), (e) => gen.assign(valid, false).if((0, codegen_1._)`${e} instanceof ${it.ValidationError}`, () => gen.assign(ruleErrs, (0, codegen_1._)`${e}.errors`), () => gen.throw(e))); - return ruleErrs; - } - function validateSync() { - const validateErrs = (0, codegen_1._)`${validateRef}.errors`; - gen.assign(validateErrs, null); - assignValid(codegen_1.nil); - return validateErrs; - } - function assignValid(_await = def.async ? (0, codegen_1._)`await ` : codegen_1.nil) { - const passCxt = it.opts.passContext ? names_1.default.this : names_1.default.self; - const passSchema = !("compile" in def && !$data || def.schema === false); - gen.assign(valid, (0, codegen_1._)`${_await}${(0, code_1.callValidateCode)(cxt, validateRef, passCxt, passSchema)}`, def.modifying); - } - function reportErrs(errors) { - var _a4; - gen.if((0, codegen_1.not)((_a4 = def.valid) !== null && _a4 !== void 0 ? _a4 : valid), errors); - } - } - exports.funcKeywordCode = funcKeywordCode; - function modifyData(cxt) { - const { gen, data, it } = cxt; - gen.if(it.parentData, () => gen.assign(data, (0, codegen_1._)`${it.parentData}[${it.parentDataProperty}]`)); - } - function addErrs(cxt, errs) { - const { gen } = cxt; - gen.if((0, codegen_1._)`Array.isArray(${errs})`, () => { - gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`).assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); - (0, errors_1.extendErrors)(cxt); - }, () => cxt.error()); - } - function checkAsyncKeyword({ schemaEnv }, def) { - if (def.async && !schemaEnv.$async) - throw new Error("async keyword in sync schema"); - } - function useKeyword(gen, keyword, result) { - if (result === void 0) - throw new Error(`keyword "${keyword}" failed to compile`); - return gen.scopeValue("keyword", typeof result == "function" ? { ref: result } : { ref: result, code: (0, codegen_1.stringify)(result) }); - } - function validSchemaType(schema, schemaType, allowUndefined = false) { - return !schemaType.length || schemaType.some((st) => st === "array" ? Array.isArray(schema) : st === "object" ? schema && typeof schema == "object" && !Array.isArray(schema) : typeof schema == st || allowUndefined && typeof schema == "undefined"); - } - exports.validSchemaType = validSchemaType; - function validateKeywordUsage({ schema, opts, self, errSchemaPath }, def, keyword) { - if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) { - throw new Error("ajv implementation error"); - } - const deps = def.dependencies; - if (deps === null || deps === void 0 ? void 0 : deps.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) { - throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(",")}`); - } - if (def.validateSchema) { - const valid = def.validateSchema(schema[keyword]); - if (!valid) { - const msg = `keyword "${keyword}" value is invalid at path "${errSchemaPath}": ` + self.errorsText(def.validateSchema.errors); - if (opts.validateSchema === "log") - self.logger.error(msg); - else - throw new Error(msg); - } - } - } - exports.validateKeywordUsage = validateKeywordUsage; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js -var require_subschema2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - function getSubschema(it, { keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef }) { - if (keyword !== void 0 && schema !== void 0) { - throw new Error('both "keyword" and "schema" passed, only one allowed'); - } - if (keyword !== void 0) { - const sch = it.schema[keyword]; - return schemaProp === void 0 ? { - schema: sch, - schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}`, - errSchemaPath: `${it.errSchemaPath}/${keyword}` - } : { - schema: sch[schemaProp], - schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}${(0, codegen_1.getProperty)(schemaProp)}`, - errSchemaPath: `${it.errSchemaPath}/${keyword}/${(0, util_1.escapeFragment)(schemaProp)}` - }; - } - if (schema !== void 0) { - if (schemaPath === void 0 || errSchemaPath === void 0 || topSchemaRef === void 0) { - throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"'); - } - return { - schema, - schemaPath, - topSchemaRef, - errSchemaPath - }; - } - throw new Error('either "keyword" or "schema" must be passed'); - } - exports.getSubschema = getSubschema; - function extendSubschemaData(subschema, it, { dataProp, dataPropType: dpType, data, dataTypes, propertyName }) { - if (data !== void 0 && dataProp !== void 0) { - throw new Error('both "data" and "dataProp" passed, only one allowed'); - } - const { gen } = it; - if (dataProp !== void 0) { - const { errorPath, dataPathArr, opts } = it; - const nextData = gen.let("data", (0, codegen_1._)`${it.data}${(0, codegen_1.getProperty)(dataProp)}`, true); - dataContextProps(nextData); - subschema.errorPath = (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(dataProp, dpType, opts.jsPropertySyntax)}`; - subschema.parentDataProperty = (0, codegen_1._)`${dataProp}`; - subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty]; - } - if (data !== void 0) { - const nextData = data instanceof codegen_1.Name ? data : gen.let("data", data, true); - dataContextProps(nextData); - if (propertyName !== void 0) - subschema.propertyName = propertyName; - } - if (dataTypes) - subschema.dataTypes = dataTypes; - function dataContextProps(_nextData) { - subschema.data = _nextData; - subschema.dataLevel = it.dataLevel + 1; - subschema.dataTypes = []; - it.definedProperties = /* @__PURE__ */ new Set(); - subschema.parentData = it.data; - subschema.dataNames = [...it.dataNames, _nextData]; - } - } - exports.extendSubschemaData = extendSubschemaData; - function extendSubschemaMode(subschema, { jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors }) { - if (compositeRule !== void 0) - subschema.compositeRule = compositeRule; - if (createErrors !== void 0) - subschema.createErrors = createErrors; - if (allErrors !== void 0) - subschema.allErrors = allErrors; - subschema.jtdDiscriminator = jtdDiscriminator; - subschema.jtdMetadata = jtdMetadata; - } - exports.extendSubschemaMode = extendSubschemaMode; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js -var require_resolve2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; - var util_1 = require_util2(); - var equal = require_fast_deep_equal(); - var traverse = require_json_schema_traverse(); - var SIMPLE_INLINED = /* @__PURE__ */ new Set([ - "type", - "format", - "pattern", - "maxLength", - "minLength", - "maxProperties", - "minProperties", - "maxItems", - "minItems", - "maximum", - "minimum", - "uniqueItems", - "multipleOf", - "required", - "enum", - "const" - ]); - function inlineRef(schema, limit = true) { - if (typeof schema == "boolean") - return true; - if (limit === true) - return !hasRef(schema); - if (!limit) - return false; - return countKeys(schema) <= limit; - } - exports.inlineRef = inlineRef; - var REF_KEYWORDS = /* @__PURE__ */ new Set([ - "$ref", - "$recursiveRef", - "$recursiveAnchor", - "$dynamicRef", - "$dynamicAnchor" - ]); - function hasRef(schema) { - for (const key in schema) { - if (REF_KEYWORDS.has(key)) - return true; - const sch = schema[key]; - if (Array.isArray(sch) && sch.some(hasRef)) - return true; - if (typeof sch == "object" && hasRef(sch)) - return true; - } - return false; - } - function countKeys(schema) { - let count = 0; - for (const key in schema) { - if (key === "$ref") - return Infinity; - count++; - if (SIMPLE_INLINED.has(key)) - continue; - if (typeof schema[key] == "object") { - (0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch)); - } - if (count === Infinity) - return Infinity; - } - return count; - } - function getFullPath(resolver, id = "", normalize) { - if (normalize !== false) - id = normalizeId(id); - const p = resolver.parse(id); - return _getFullPath(resolver, p); - } - exports.getFullPath = getFullPath; - function _getFullPath(resolver, p) { - const serialized = resolver.serialize(p); - return serialized.split("#")[0] + "#"; - } - exports._getFullPath = _getFullPath; - var TRAILING_SLASH_HASH = /#\/?$/; - function normalizeId(id) { - return id ? id.replace(TRAILING_SLASH_HASH, "") : ""; - } - exports.normalizeId = normalizeId; - function resolveUrl(resolver, baseId, id) { - id = normalizeId(id); - return resolver.resolve(baseId, id); - } - exports.resolveUrl = resolveUrl; - var ANCHOR = /^[a-z_][-a-z0-9._]*$/i; - function getSchemaRefs(schema, baseId) { - if (typeof schema == "boolean") - return {}; - const { schemaId, uriResolver } = this.opts; - const schId = normalizeId(schema[schemaId] || baseId); - const baseIds = { "": schId }; - const pathPrefix = getFullPath(uriResolver, schId, false); - const localRefs = {}; - const schemaRefs = /* @__PURE__ */ new Set(); - traverse(schema, { allKeys: true }, (sch, jsonPtr, _2, parentJsonPtr) => { - if (parentJsonPtr === void 0) - return; - const fullPath = pathPrefix + jsonPtr; - let innerBaseId = baseIds[parentJsonPtr]; - if (typeof sch[schemaId] == "string") - innerBaseId = addRef.call(this, sch[schemaId]); - addAnchor.call(this, sch.$anchor); - addAnchor.call(this, sch.$dynamicAnchor); - baseIds[jsonPtr] = innerBaseId; - function addRef(ref) { - const _resolve = this.opts.uriResolver.resolve; - ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref); - if (schemaRefs.has(ref)) - throw ambiguos(ref); - schemaRefs.add(ref); - let schOrRef = this.refs[ref]; - if (typeof schOrRef == "string") - schOrRef = this.refs[schOrRef]; - if (typeof schOrRef == "object") { - checkAmbiguosRef(sch, schOrRef.schema, ref); - } else if (ref !== normalizeId(fullPath)) { - if (ref[0] === "#") { - checkAmbiguosRef(sch, localRefs[ref], ref); - localRefs[ref] = sch; - } else { - this.refs[ref] = fullPath; - } - } - return ref; - } - function addAnchor(anchor2) { - if (typeof anchor2 == "string") { - if (!ANCHOR.test(anchor2)) - throw new Error(`invalid anchor "${anchor2}"`); - addRef.call(this, `#${anchor2}`); - } - } - }); - return localRefs; - function checkAmbiguosRef(sch1, sch2, ref) { - if (sch2 !== void 0 && !equal(sch1, sch2)) - throw ambiguos(ref); - } - function ambiguos(ref) { - return new Error(`reference "${ref}" resolves to more than one schema`); - } - } - exports.getSchemaRefs = getSchemaRefs; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js -var require_validate2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; - var boolSchema_1 = require_boolSchema2(); - var dataType_1 = require_dataType2(); - var applicability_1 = require_applicability2(); - var dataType_2 = require_dataType2(); - var defaults_1 = require_defaults2(); - var keyword_1 = require_keyword2(); - var subschema_1 = require_subschema2(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var resolve_1 = require_resolve2(); - var util_1 = require_util2(); - var errors_1 = require_errors2(); - function validateFunctionCode(it) { - if (isSchemaObj(it)) { - checkKeywords(it); - if (schemaCxtHasRules(it)) { - topSchemaObjCode(it); - return; - } - } - validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it)); - } - exports.validateFunctionCode = validateFunctionCode; - function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) { - if (opts.code.es5) { - gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => { - gen.code((0, codegen_1._)`"use strict"; ${funcSourceUrl(schema, opts)}`); - destructureValCxtES5(gen, opts); - gen.code(body); - }); - } else { - gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body)); - } - } - function destructureValCxt(opts) { - return (0, codegen_1._)`{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._)`, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`; - } - function destructureValCxtES5(gen, opts) { - gen.if(names_1.default.valCxt, () => { - gen.var(names_1.default.instancePath, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.instancePath}`); - gen.var(names_1.default.parentData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentData}`); - gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentDataProperty}`); - gen.var(names_1.default.rootData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.rootData}`); - if (opts.dynamicRef) - gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`); - }, () => { - gen.var(names_1.default.instancePath, (0, codegen_1._)`""`); - gen.var(names_1.default.parentData, (0, codegen_1._)`undefined`); - gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`undefined`); - gen.var(names_1.default.rootData, names_1.default.data); - if (opts.dynamicRef) - gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`{}`); - }); - } - function topSchemaObjCode(it) { - const { schema, opts, gen } = it; - validateFunction(it, () => { - if (opts.$comment && schema.$comment) - commentKeyword(it); - checkNoDefault(it); - gen.let(names_1.default.vErrors, null); - gen.let(names_1.default.errors, 0); - if (opts.unevaluated) - resetEvaluated(it); - typeAndKeywords(it); - returnResults(it); - }); - return; - } - function resetEvaluated(it) { - const { gen, validateName } = it; - it.evaluated = gen.const("evaluated", (0, codegen_1._)`${validateName}.evaluated`); - gen.if((0, codegen_1._)`${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._)`${it.evaluated}.props`, (0, codegen_1._)`undefined`)); - gen.if((0, codegen_1._)`${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._)`${it.evaluated}.items`, (0, codegen_1._)`undefined`)); - } - function funcSourceUrl(schema, opts) { - const schId = typeof schema == "object" && schema[opts.schemaId]; - return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._)`/*# sourceURL=${schId} */` : codegen_1.nil; - } - function subschemaCode(it, valid) { - if (isSchemaObj(it)) { - checkKeywords(it); - if (schemaCxtHasRules(it)) { - subSchemaObjCode(it, valid); - return; - } - } - (0, boolSchema_1.boolOrEmptySchema)(it, valid); - } - function schemaCxtHasRules({ schema, self }) { - if (typeof schema == "boolean") - return !schema; - for (const key in schema) - if (self.RULES.all[key]) - return true; - return false; - } - function isSchemaObj(it) { - return typeof it.schema != "boolean"; - } - function subSchemaObjCode(it, valid) { - const { schema, gen, opts } = it; - if (opts.$comment && schema.$comment) - commentKeyword(it); - updateContext(it); - checkAsyncSchema(it); - const errsCount = gen.const("_errs", names_1.default.errors); - typeAndKeywords(it, errsCount); - gen.var(valid, (0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); - } - function checkKeywords(it) { - (0, util_1.checkUnknownRules)(it); - checkRefsAndKeywords(it); - } - function typeAndKeywords(it, errsCount) { - if (it.opts.jtd) - return schemaKeywords(it, [], false, errsCount); - const types = (0, dataType_1.getSchemaTypes)(it.schema); - const checkedTypes = (0, dataType_1.coerceAndCheckDataType)(it, types); - schemaKeywords(it, types, !checkedTypes, errsCount); - } - function checkRefsAndKeywords(it) { - const { schema, errSchemaPath, opts, self } = it; - if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) { - self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`); - } - } - function checkNoDefault(it) { - const { schema, opts } = it; - if (schema.default !== void 0 && opts.useDefaults && opts.strictSchema) { - (0, util_1.checkStrictMode)(it, "default is ignored in the schema root"); - } - } - function updateContext(it) { - const schId = it.schema[it.opts.schemaId]; - if (schId) - it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId); - } - function checkAsyncSchema(it) { - if (it.schema.$async && !it.schemaEnv.$async) - throw new Error("async schema in sync schema"); - } - function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) { - const msg = schema.$comment; - if (opts.$comment === true) { - gen.code((0, codegen_1._)`${names_1.default.self}.logger.log(${msg})`); - } else if (typeof opts.$comment == "function") { - const schemaPath = (0, codegen_1.str)`${errSchemaPath}/$comment`; - const rootName = gen.scopeValue("root", { ref: schemaEnv.root }); - gen.code((0, codegen_1._)`${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`); - } - } - function returnResults(it) { - const { gen, schemaEnv, validateName, ValidationError, opts } = it; - if (schemaEnv.$async) { - gen.if((0, codegen_1._)`${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._)`new ${ValidationError}(${names_1.default.vErrors})`)); - } else { - gen.assign((0, codegen_1._)`${validateName}.errors`, names_1.default.vErrors); - if (opts.unevaluated) - assignEvaluated(it); - gen.return((0, codegen_1._)`${names_1.default.errors} === 0`); - } - } - function assignEvaluated({ gen, evaluated, props, items }) { - if (props instanceof codegen_1.Name) - gen.assign((0, codegen_1._)`${evaluated}.props`, props); - if (items instanceof codegen_1.Name) - gen.assign((0, codegen_1._)`${evaluated}.items`, items); - } - function schemaKeywords(it, types, typeErrors, errsCount) { - const { gen, schema, data, allErrors, opts, self } = it; - const { RULES } = self; - if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) { - gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition)); - return; - } - if (!opts.jtd) - checkStrictTypes(it, types); - gen.block(() => { - for (const group of RULES.rules) - groupKeywords(group); - groupKeywords(RULES.post); - }); - function groupKeywords(group) { - if (!(0, applicability_1.shouldUseGroup)(schema, group)) - return; - if (group.type) { - gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers)); - iterateKeywords(it, group); - if (types.length === 1 && types[0] === group.type && typeErrors) { - gen.else(); - (0, dataType_2.reportTypeError)(it); - } - gen.endIf(); - } else { - iterateKeywords(it, group); - } - if (!allErrors) - gen.if((0, codegen_1._)`${names_1.default.errors} === ${errsCount || 0}`); - } - } - function iterateKeywords(it, group) { - const { gen, schema, opts: { useDefaults } } = it; - if (useDefaults) - (0, defaults_1.assignDefaults)(it, group.type); - gen.block(() => { - for (const rule of group.rules) { - if ((0, applicability_1.shouldUseRule)(schema, rule)) { - keywordCode(it, rule.keyword, rule.definition, group.type); - } - } - }); - } - function checkStrictTypes(it, types) { - if (it.schemaEnv.meta || !it.opts.strictTypes) - return; - checkContextTypes(it, types); - if (!it.opts.allowUnionTypes) - checkMultipleTypes(it, types); - checkKeywordTypes(it, it.dataTypes); - } - function checkContextTypes(it, types) { - if (!types.length) - return; - if (!it.dataTypes.length) { - it.dataTypes = types; - return; - } - types.forEach((t) => { - if (!includesType(it.dataTypes, t)) { - strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`); - } - }); - narrowSchemaTypes(it, types); - } - function checkMultipleTypes(it, ts) { - if (ts.length > 1 && !(ts.length === 2 && ts.includes("null"))) { - strictTypesError(it, "use allowUnionTypes to allow union type keyword"); - } - } - function checkKeywordTypes(it, ts) { - const rules = it.self.RULES.all; - for (const keyword in rules) { - const rule = rules[keyword]; - if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) { - const { type } = rule.definition; - if (type.length && !type.some((t) => hasApplicableType(ts, t))) { - strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`); - } - } - } - } - function hasApplicableType(schTs, kwdT) { - return schTs.includes(kwdT) || kwdT === "number" && schTs.includes("integer"); - } - function includesType(ts, t) { - return ts.includes(t) || t === "integer" && ts.includes("number"); - } - function narrowSchemaTypes(it, withTypes) { - const ts = []; - for (const t of it.dataTypes) { - if (includesType(withTypes, t)) - ts.push(t); - else if (withTypes.includes("integer") && t === "number") - ts.push("integer"); - } - it.dataTypes = ts; - } - function strictTypesError(it, msg) { - const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; - msg += ` at "${schemaPath}" (strictTypes)`; - (0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes); - } - var KeywordCxt = class { - constructor(it, def, keyword) { - (0, keyword_1.validateKeywordUsage)(it, def, keyword); - this.gen = it.gen; - this.allErrors = it.allErrors; - this.keyword = keyword; - this.data = it.data; - this.schema = it.schema[keyword]; - this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data; - this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data); - this.schemaType = def.schemaType; - this.parentSchema = it.schema; - this.params = {}; - this.it = it; - this.def = def; - if (this.$data) { - this.schemaCode = it.gen.const("vSchema", getData(this.$data, it)); - } else { - this.schemaCode = this.schemaValue; - if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) { - throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`); - } - } - if ("code" in def ? def.trackErrors : def.errors !== false) { - this.errsCount = it.gen.const("_errs", names_1.default.errors); - } - } - result(condition, successAction, failAction) { - this.failResult((0, codegen_1.not)(condition), successAction, failAction); - } - failResult(condition, successAction, failAction) { - this.gen.if(condition); - if (failAction) - failAction(); - else - this.error(); - if (successAction) { - this.gen.else(); - successAction(); - if (this.allErrors) - this.gen.endIf(); - } else { - if (this.allErrors) - this.gen.endIf(); - else - this.gen.else(); - } - } - pass(condition, failAction) { - this.failResult((0, codegen_1.not)(condition), void 0, failAction); - } - fail(condition) { - if (condition === void 0) { - this.error(); - if (!this.allErrors) - this.gen.if(false); - return; - } - this.gen.if(condition); - this.error(); - if (this.allErrors) - this.gen.endIf(); - else - this.gen.else(); - } - fail$data(condition) { - if (!this.$data) - return this.fail(condition); - const { schemaCode } = this; - this.fail((0, codegen_1._)`${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`); - } - error(append, errorParams, errorPaths) { - if (errorParams) { - this.setParams(errorParams); - this._error(append, errorPaths); - this.setParams({}); - return; - } - this._error(append, errorPaths); - } - _error(append, errorPaths) { - ; - (append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths); - } - $dataError() { - (0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError); - } - reset() { - if (this.errsCount === void 0) - throw new Error('add "trackErrors" to keyword definition'); - (0, errors_1.resetErrorsCount)(this.gen, this.errsCount); - } - ok(cond) { - if (!this.allErrors) - this.gen.if(cond); - } - setParams(obj, assign) { - if (assign) - Object.assign(this.params, obj); - else - this.params = obj; - } - block$data(valid, codeBlock, $dataValid = codegen_1.nil) { - this.gen.block(() => { - this.check$data(valid, $dataValid); - codeBlock(); - }); - } - check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) { - if (!this.$data) - return; - const { gen, schemaCode, schemaType, def } = this; - gen.if((0, codegen_1.or)((0, codegen_1._)`${schemaCode} === undefined`, $dataValid)); - if (valid !== codegen_1.nil) - gen.assign(valid, true); - if (schemaType.length || def.validateSchema) { - gen.elseIf(this.invalid$data()); - this.$dataError(); - if (valid !== codegen_1.nil) - gen.assign(valid, false); - } - gen.else(); - } - invalid$data() { - const { gen, schemaCode, schemaType, def, it } = this; - return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema()); - function wrong$DataType() { - if (schemaType.length) { - if (!(schemaCode instanceof codegen_1.Name)) - throw new Error("ajv implementation error"); - const st = Array.isArray(schemaType) ? schemaType : [schemaType]; - return (0, codegen_1._)`${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`; - } - return codegen_1.nil; - } - function invalid$DataSchema() { - if (def.validateSchema) { - const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema }); - return (0, codegen_1._)`!${validateSchemaRef}(${schemaCode})`; - } - return codegen_1.nil; - } - } - subschema(appl, valid) { - const subschema = (0, subschema_1.getSubschema)(this.it, appl); - (0, subschema_1.extendSubschemaData)(subschema, this.it, appl); - (0, subschema_1.extendSubschemaMode)(subschema, appl); - const nextContext = { ...this.it, ...subschema, items: void 0, props: void 0 }; - subschemaCode(nextContext, valid); - return nextContext; - } - mergeEvaluated(schemaCxt, toName) { - const { it, gen } = this; - if (!it.opts.unevaluated) - return; - if (it.props !== true && schemaCxt.props !== void 0) { - it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName); - } - if (it.items !== true && schemaCxt.items !== void 0) { - it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName); - } - } - mergeValidEvaluated(schemaCxt, valid) { - const { it, gen } = this; - if (it.opts.unevaluated && (it.props !== true || it.items !== true)) { - gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name)); - return true; - } - } - }; - exports.KeywordCxt = KeywordCxt; - function keywordCode(it, keyword, def, ruleType) { - const cxt = new KeywordCxt(it, def, keyword); - if ("code" in def) { - def.code(cxt, ruleType); - } else if (cxt.$data && def.validate) { - (0, keyword_1.funcKeywordCode)(cxt, def); - } else if ("macro" in def) { - (0, keyword_1.macroKeywordCode)(cxt, def); - } else if (def.compile || def.validate) { - (0, keyword_1.funcKeywordCode)(cxt, def); - } - } - var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/; - var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/; - function getData($data, { dataLevel, dataNames, dataPathArr }) { - let jsonPointer; - let data; - if ($data === "") - return names_1.default.rootData; - if ($data[0] === "/") { - if (!JSON_POINTER.test($data)) - throw new Error(`Invalid JSON-pointer: ${$data}`); - jsonPointer = $data; - data = names_1.default.rootData; - } else { - const matches = RELATIVE_JSON_POINTER.exec($data); - if (!matches) - throw new Error(`Invalid JSON-pointer: ${$data}`); - const up = +matches[1]; - jsonPointer = matches[2]; - if (jsonPointer === "#") { - if (up >= dataLevel) - throw new Error(errorMsg("property/index", up)); - return dataPathArr[dataLevel - up]; - } - if (up > dataLevel) - throw new Error(errorMsg("data", up)); - data = dataNames[dataLevel - up]; - if (!jsonPointer) - return data; - } - let expr = data; - const segments = jsonPointer.split("/"); - for (const segment of segments) { - if (segment) { - data = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`; - expr = (0, codegen_1._)`${expr} && ${data}`; - } - } - return expr; - function errorMsg(pointerType, up) { - return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`; - } - } - exports.getData = getData; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js -var require_validation_error2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ValidationError = class extends Error { - constructor(errors) { - super("validation failed"); - this.errors = errors; - this.ajv = this.validation = true; - } - }; - exports.default = ValidationError; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js -var require_ref_error2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var resolve_1 = require_resolve2(); - var MissingRefError = class extends Error { - constructor(resolver, baseId, ref, msg) { - super(msg || `can't resolve reference ${ref} from id ${baseId}`); - this.missingRef = (0, resolve_1.resolveUrl)(resolver, baseId, ref); - this.missingSchema = (0, resolve_1.normalizeId)((0, resolve_1.getFullPath)(resolver, this.missingRef)); - } - }; - exports.default = MissingRefError; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js -var require_compile2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; - var codegen_1 = require_codegen2(); - var validation_error_1 = require_validation_error2(); - var names_1 = require_names2(); - var resolve_1 = require_resolve2(); - var util_1 = require_util2(); - var validate_1 = require_validate2(); - var SchemaEnv = class { - constructor(env) { - var _a3; - this.refs = {}; - this.dynamicAnchors = {}; - let schema; - if (typeof env.schema == "object") - schema = env.schema; - this.schema = env.schema; - this.schemaId = env.schemaId; - this.root = env.root || this; - this.baseId = (_a3 = env.baseId) !== null && _a3 !== void 0 ? _a3 : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]); - this.schemaPath = env.schemaPath; - this.localRefs = env.localRefs; - this.meta = env.meta; - this.$async = schema === null || schema === void 0 ? void 0 : schema.$async; - this.refs = {}; - } - }; - exports.SchemaEnv = SchemaEnv; - function compileSchema(sch) { - const _sch = getCompilingSchema.call(this, sch); - if (_sch) - return _sch; - const rootId = (0, resolve_1.getFullPath)(this.opts.uriResolver, sch.root.baseId); - const { es5, lines } = this.opts.code; - const { ownProperties } = this.opts; - const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties }); - let _ValidationError; - if (sch.$async) { - _ValidationError = gen.scopeValue("Error", { - ref: validation_error_1.default, - code: (0, codegen_1._)`require("ajv/dist/runtime/validation_error").default` - }); - } - const validateName = gen.scopeName("validate"); - sch.validateName = validateName; - const schemaCxt = { - gen, - allErrors: this.opts.allErrors, - data: names_1.default.data, - parentData: names_1.default.parentData, - parentDataProperty: names_1.default.parentDataProperty, - dataNames: [names_1.default.data], - dataPathArr: [codegen_1.nil], - // TODO can its length be used as dataLevel if nil is removed? - dataLevel: 0, - dataTypes: [], - definedProperties: /* @__PURE__ */ new Set(), - topSchemaRef: gen.scopeValue("schema", this.opts.code.source === true ? { ref: sch.schema, code: (0, codegen_1.stringify)(sch.schema) } : { ref: sch.schema }), - validateName, - ValidationError: _ValidationError, - schema: sch.schema, - schemaEnv: sch, - rootId, - baseId: sch.baseId || rootId, - schemaPath: codegen_1.nil, - errSchemaPath: sch.schemaPath || (this.opts.jtd ? "" : "#"), - errorPath: (0, codegen_1._)`""`, - opts: this.opts, - self: this - }; - let sourceCode; - try { - this._compilations.add(sch); - (0, validate_1.validateFunctionCode)(schemaCxt); - gen.optimize(this.opts.code.optimize); - const validateCode = gen.toString(); - sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${validateCode}`; - if (this.opts.code.process) - sourceCode = this.opts.code.process(sourceCode, sch); - const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); - const validate2 = makeValidate(this, this.scope.get()); - this.scope.value(validateName, { ref: validate2 }); - validate2.errors = null; - validate2.schema = sch.schema; - validate2.schemaEnv = sch; - if (sch.$async) - validate2.$async = true; - if (this.opts.code.source === true) { - validate2.source = { validateName, validateCode, scopeValues: gen._values }; - } - if (this.opts.unevaluated) { - const { props, items } = schemaCxt; - validate2.evaluated = { - props: props instanceof codegen_1.Name ? void 0 : props, - items: items instanceof codegen_1.Name ? void 0 : items, - dynamicProps: props instanceof codegen_1.Name, - dynamicItems: items instanceof codegen_1.Name - }; - if (validate2.source) - validate2.source.evaluated = (0, codegen_1.stringify)(validate2.evaluated); - } - sch.validate = validate2; - return sch; - } catch (e) { - delete sch.validate; - delete sch.validateName; - if (sourceCode) - this.logger.error("Error compiling schema, function code:", sourceCode); - throw e; - } finally { - this._compilations.delete(sch); - } - } - exports.compileSchema = compileSchema; - function resolveRef2(root, baseId, ref) { - var _a3; - ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref); - const schOrFunc = root.refs[ref]; - if (schOrFunc) - return schOrFunc; - let _sch = resolve.call(this, root, ref); - if (_sch === void 0) { - const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref]; - const { schemaId } = this.opts; - if (schema) - _sch = new SchemaEnv({ schema, schemaId, root, baseId }); - } - if (_sch === void 0) - return; - return root.refs[ref] = inlineOrCompile.call(this, _sch); - } - exports.resolveRef = resolveRef2; - function inlineOrCompile(sch) { - if ((0, resolve_1.inlineRef)(sch.schema, this.opts.inlineRefs)) - return sch.schema; - return sch.validate ? sch : compileSchema.call(this, sch); - } - function getCompilingSchema(schEnv) { - for (const sch of this._compilations) { - if (sameSchemaEnv(sch, schEnv)) - return sch; - } - } - exports.getCompilingSchema = getCompilingSchema; - function sameSchemaEnv(s1, s2) { - return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId; - } - function resolve(root, ref) { - let sch; - while (typeof (sch = this.refs[ref]) == "string") - ref = sch; - return sch || this.schemas[ref] || resolveSchema.call(this, root, ref); - } - function resolveSchema(root, ref) { - const p = this.opts.uriResolver.parse(ref); - const refPath = (0, resolve_1._getFullPath)(this.opts.uriResolver, p); - let baseId = (0, resolve_1.getFullPath)(this.opts.uriResolver, root.baseId, void 0); - if (Object.keys(root.schema).length > 0 && refPath === baseId) { - return getJsonPointer.call(this, p, root); - } - const id = (0, resolve_1.normalizeId)(refPath); - const schOrRef = this.refs[id] || this.schemas[id]; - if (typeof schOrRef == "string") { - const sch = resolveSchema.call(this, root, schOrRef); - if (typeof (sch === null || sch === void 0 ? void 0 : sch.schema) !== "object") - return; - return getJsonPointer.call(this, p, sch); - } - if (typeof (schOrRef === null || schOrRef === void 0 ? void 0 : schOrRef.schema) !== "object") - return; - if (!schOrRef.validate) - compileSchema.call(this, schOrRef); - if (id === (0, resolve_1.normalizeId)(ref)) { - const { schema } = schOrRef; - const { schemaId } = this.opts; - const schId = schema[schemaId]; - if (schId) - baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); - return new SchemaEnv({ schema, schemaId, root, baseId }); - } - return getJsonPointer.call(this, p, schOrRef); - } - exports.resolveSchema = resolveSchema; - var PREVENT_SCOPE_CHANGE = /* @__PURE__ */ new Set([ - "properties", - "patternProperties", - "enum", - "dependencies", - "definitions" - ]); - function getJsonPointer(parsedRef, { baseId, schema, root }) { - var _a3; - if (((_a3 = parsedRef.fragment) === null || _a3 === void 0 ? void 0 : _a3[0]) !== "/") - return; - for (const part of parsedRef.fragment.slice(1).split("/")) { - if (typeof schema === "boolean") - return; - const partSchema = schema[(0, util_1.unescapeFragment)(part)]; - if (partSchema === void 0) - return; - schema = partSchema; - const schId = typeof schema === "object" && schema[this.opts.schemaId]; - if (!PREVENT_SCOPE_CHANGE.has(part) && schId) { - baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); - } - } - let env; - if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) { - const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref); - env = resolveSchema.call(this, root, $ref); - } - const { schemaId } = this.opts; - env = env || new SchemaEnv({ schema, schemaId, root, baseId }); - if (env.schema !== env.root.schema) - return env; - return void 0; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json -var require_data2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json"(exports, module) { - module.exports = { - $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", - description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", - type: "object", - required: ["$data"], - properties: { - $data: { - type: "string", - anyOf: [{ format: "relative-json-pointer" }, { format: "json-pointer" }] - } - }, - additionalProperties: false - }; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js -var require_uri2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var uri = require_fast_uri(); - uri.code = 'require("ajv/dist/runtime/uri").default'; - exports.default = uri; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/core.js -var require_core3 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/core.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; - var validate_1 = require_validate2(); - Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { - return validate_1.KeywordCxt; - } }); - var codegen_1 = require_codegen2(); - Object.defineProperty(exports, "_", { enumerable: true, get: function() { - return codegen_1._; - } }); - Object.defineProperty(exports, "str", { enumerable: true, get: function() { - return codegen_1.str; - } }); - Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { - return codegen_1.stringify; - } }); - Object.defineProperty(exports, "nil", { enumerable: true, get: function() { - return codegen_1.nil; - } }); - Object.defineProperty(exports, "Name", { enumerable: true, get: function() { - return codegen_1.Name; - } }); - Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { - return codegen_1.CodeGen; - } }); - var validation_error_1 = require_validation_error2(); - var ref_error_1 = require_ref_error2(); - var rules_1 = require_rules2(); - var compile_1 = require_compile2(); - var codegen_2 = require_codegen2(); - var resolve_1 = require_resolve2(); - var dataType_1 = require_dataType2(); - var util_1 = require_util2(); - var $dataRefSchema = require_data2(); - var uri_1 = require_uri2(); - var defaultRegExp = (str, flags) => new RegExp(str, flags); - defaultRegExp.code = "new RegExp"; - var META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes"]; - var EXT_SCOPE_NAMES = /* @__PURE__ */ new Set([ - "validate", - "serialize", - "parse", - "wrapper", - "root", - "schema", - "keyword", - "pattern", - "formats", - "validate$data", - "func", - "obj", - "Error" - ]); - var removedOptions = { - errorDataPath: "", - format: "`validateFormats: false` can be used instead.", - nullable: '"nullable" keyword is supported by default.', - jsonPointers: "Deprecated jsPropertySyntax can be used instead.", - extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.", - missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.", - processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`", - sourceCode: "Use option `code: {source: true}`", - strictDefaults: "It is default now, see option `strict`.", - strictKeywords: "It is default now, see option `strict`.", - uniqueItems: '"uniqueItems" keyword is always validated.', - unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).", - cache: "Map is used as cache, schema object as key.", - serialize: "Map is used as cache, schema object as key.", - ajvErrors: "It is default now." - }; - var deprecatedOptions = { - ignoreKeywordsWithRef: "", - jsPropertySyntax: "", - unicode: '"minLength"/"maxLength" account for unicode characters by default.' - }; - var MAX_EXPRESSION = 200; - function requiredOptions(o) { - var _a3, _b, _c, _d, _e2, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; - const s = o.strict; - const _optz = (_a3 = o.code) === null || _a3 === void 0 ? void 0 : _a3.optimize; - const optimize = _optz === true || _optz === void 0 ? 1 : _optz || 0; - const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp; - const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default; - return { - strictSchema: (_f = (_e2 = o.strictSchema) !== null && _e2 !== void 0 ? _e2 : s) !== null && _f !== void 0 ? _f : true, - strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true, - strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log", - strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log", - strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false, - code: o.code ? { ...o.code, optimize, regExp } : { optimize, regExp }, - loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION, - loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION, - meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true, - messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true, - inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true, - schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id", - addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true, - validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true, - validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true, - unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true, - int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true, - uriResolver - }; - } - var Ajv2 = class { - constructor(opts = {}) { - this.schemas = {}; - this.refs = {}; - this.formats = /* @__PURE__ */ Object.create(null); - this._compilations = /* @__PURE__ */ new Set(); - this._loading = {}; - this._cache = /* @__PURE__ */ new Map(); - opts = this.opts = { ...opts, ...requiredOptions(opts) }; - const { es5, lines } = this.opts.code; - this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines }); - this.logger = getLogger(opts.logger); - const formatOpt = opts.validateFormats; - opts.validateFormats = false; - this.RULES = (0, rules_1.getRules)(); - checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED"); - checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn"); - this._metaOpts = getMetaSchemaOptions.call(this); - if (opts.formats) - addInitialFormats.call(this); - this._addVocabularies(); - this._addDefaultMetaSchema(); - if (opts.keywords) - addInitialKeywords.call(this, opts.keywords); - if (typeof opts.meta == "object") - this.addMetaSchema(opts.meta); - addInitialSchemas.call(this); - opts.validateFormats = formatOpt; - } - _addVocabularies() { - this.addKeyword("$async"); - } - _addDefaultMetaSchema() { - const { $data, meta: meta3, schemaId } = this.opts; - let _dataRefSchema = $dataRefSchema; - if (schemaId === "id") { - _dataRefSchema = { ...$dataRefSchema }; - _dataRefSchema.id = _dataRefSchema.$id; - delete _dataRefSchema.$id; - } - if (meta3 && $data) - this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false); - } - defaultMeta() { - const { meta: meta3, schemaId } = this.opts; - return this.opts.defaultMeta = typeof meta3 == "object" ? meta3[schemaId] || meta3 : void 0; - } - validate(schemaKeyRef, data) { - let v2; - if (typeof schemaKeyRef == "string") { - v2 = this.getSchema(schemaKeyRef); - if (!v2) - throw new Error(`no schema with key or ref "${schemaKeyRef}"`); - } else { - v2 = this.compile(schemaKeyRef); - } - const valid = v2(data); - if (!("$async" in v2)) - this.errors = v2.errors; - return valid; - } - compile(schema, _meta) { - const sch = this._addSchema(schema, _meta); - return sch.validate || this._compileSchemaEnv(sch); - } - compileAsync(schema, meta3) { - if (typeof this.opts.loadSchema != "function") { - throw new Error("options.loadSchema should be a function"); - } - const { loadSchema } = this.opts; - return runCompileAsync.call(this, schema, meta3); - async function runCompileAsync(_schema, _meta) { - await loadMetaSchema.call(this, _schema.$schema); - const sch = this._addSchema(_schema, _meta); - return sch.validate || _compileAsync.call(this, sch); - } - async function loadMetaSchema($ref) { - if ($ref && !this.getSchema($ref)) { - await runCompileAsync.call(this, { $ref }, true); - } - } - async function _compileAsync(sch) { - try { - return this._compileSchemaEnv(sch); - } catch (e) { - if (!(e instanceof ref_error_1.default)) - throw e; - checkLoaded.call(this, e); - await loadMissingSchema.call(this, e.missingSchema); - return _compileAsync.call(this, sch); - } - } - function checkLoaded({ missingSchema: ref, missingRef }) { - if (this.refs[ref]) { - throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`); - } - } - async function loadMissingSchema(ref) { - const _schema = await _loadSchema.call(this, ref); - if (!this.refs[ref]) - await loadMetaSchema.call(this, _schema.$schema); - if (!this.refs[ref]) - this.addSchema(_schema, ref, meta3); - } - async function _loadSchema(ref) { - const p = this._loading[ref]; - if (p) - return p; - try { - return await (this._loading[ref] = loadSchema(ref)); - } finally { - delete this._loading[ref]; - } - } - } - // Adds schema to the instance - addSchema(schema, key, _meta, _validateSchema = this.opts.validateSchema) { - if (Array.isArray(schema)) { - for (const sch of schema) - this.addSchema(sch, void 0, _meta, _validateSchema); - return this; - } - let id; - if (typeof schema === "object") { - const { schemaId } = this.opts; - id = schema[schemaId]; - if (id !== void 0 && typeof id != "string") { - throw new Error(`schema ${schemaId} must be string`); - } - } - key = (0, resolve_1.normalizeId)(key || id); - this._checkUnique(key); - this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true); - return this; - } - // Add schema that will be used to validate other schemas - // options in META_IGNORE_OPTIONS are alway set to false - addMetaSchema(schema, key, _validateSchema = this.opts.validateSchema) { - this.addSchema(schema, key, true, _validateSchema); - return this; - } - // Validate schema against its meta-schema - validateSchema(schema, throwOrLogError) { - if (typeof schema == "boolean") - return true; - let $schema; - $schema = schema.$schema; - if ($schema !== void 0 && typeof $schema != "string") { - throw new Error("$schema must be a string"); - } - $schema = $schema || this.opts.defaultMeta || this.defaultMeta(); - if (!$schema) { - this.logger.warn("meta-schema not available"); - this.errors = null; - return true; - } - const valid = this.validate($schema, schema); - if (!valid && throwOrLogError) { - const message = "schema is invalid: " + this.errorsText(); - if (this.opts.validateSchema === "log") - this.logger.error(message); - else - throw new Error(message); - } - return valid; - } - // Get compiled schema by `key` or `ref`. - // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id) - getSchema(keyRef) { - let sch; - while (typeof (sch = getSchEnv.call(this, keyRef)) == "string") - keyRef = sch; - if (sch === void 0) { - const { schemaId } = this.opts; - const root = new compile_1.SchemaEnv({ schema: {}, schemaId }); - sch = compile_1.resolveSchema.call(this, root, keyRef); - if (!sch) - return; - this.refs[keyRef] = sch; - } - return sch.validate || this._compileSchemaEnv(sch); - } - // Remove cached schema(s). - // If no parameter is passed all schemas but meta-schemas are removed. - // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. - // Even if schema is referenced by other schemas it still can be removed as other schemas have local references. - removeSchema(schemaKeyRef) { - if (schemaKeyRef instanceof RegExp) { - this._removeAllSchemas(this.schemas, schemaKeyRef); - this._removeAllSchemas(this.refs, schemaKeyRef); - return this; - } - switch (typeof schemaKeyRef) { - case "undefined": - this._removeAllSchemas(this.schemas); - this._removeAllSchemas(this.refs); - this._cache.clear(); - return this; - case "string": { - const sch = getSchEnv.call(this, schemaKeyRef); - if (typeof sch == "object") - this._cache.delete(sch.schema); - delete this.schemas[schemaKeyRef]; - delete this.refs[schemaKeyRef]; - return this; - } - case "object": { - const cacheKey = schemaKeyRef; - this._cache.delete(cacheKey); - let id = schemaKeyRef[this.opts.schemaId]; - if (id) { - id = (0, resolve_1.normalizeId)(id); - delete this.schemas[id]; - delete this.refs[id]; - } - return this; - } - default: - throw new Error("ajv.removeSchema: invalid parameter"); - } - } - // add "vocabulary" - a collection of keywords - addVocabulary(definitions) { - for (const def of definitions) - this.addKeyword(def); - return this; - } - addKeyword(kwdOrDef, def) { - let keyword; - if (typeof kwdOrDef == "string") { - keyword = kwdOrDef; - if (typeof def == "object") { - this.logger.warn("these parameters are deprecated, see docs for addKeyword"); - def.keyword = keyword; - } - } else if (typeof kwdOrDef == "object" && def === void 0) { - def = kwdOrDef; - keyword = def.keyword; - if (Array.isArray(keyword) && !keyword.length) { - throw new Error("addKeywords: keyword must be string or non-empty array"); - } - } else { - throw new Error("invalid addKeywords parameters"); - } - checkKeyword.call(this, keyword, def); - if (!def) { - (0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd)); - return this; - } - keywordMetaschema.call(this, def); - const definition = { - ...def, - type: (0, dataType_1.getJSONTypes)(def.type), - schemaType: (0, dataType_1.getJSONTypes)(def.schemaType) - }; - (0, util_1.eachItem)(keyword, definition.type.length === 0 ? (k2) => addRule.call(this, k2, definition) : (k2) => definition.type.forEach((t) => addRule.call(this, k2, definition, t))); - return this; - } - getKeyword(keyword) { - const rule = this.RULES.all[keyword]; - return typeof rule == "object" ? rule.definition : !!rule; - } - // Remove keyword - removeKeyword(keyword) { - const { RULES } = this; - delete RULES.keywords[keyword]; - delete RULES.all[keyword]; - for (const group of RULES.rules) { - const i = group.rules.findIndex((rule) => rule.keyword === keyword); - if (i >= 0) - group.rules.splice(i, 1); - } - return this; - } - // Add format - addFormat(name, format) { - if (typeof format == "string") - format = new RegExp(format); - this.formats[name] = format; - return this; - } - errorsText(errors = this.errors, { separator = ", ", dataVar = "data" } = {}) { - if (!errors || errors.length === 0) - return "No errors"; - return errors.map((e) => `${dataVar}${e.instancePath} ${e.message}`).reduce((text, msg) => text + separator + msg); - } - $dataMetaSchema(metaSchema, keywordsJsonPointers) { - const rules = this.RULES.all; - metaSchema = JSON.parse(JSON.stringify(metaSchema)); - for (const jsonPointer of keywordsJsonPointers) { - const segments = jsonPointer.split("/").slice(1); - let keywords = metaSchema; - for (const seg of segments) - keywords = keywords[seg]; - for (const key in rules) { - const rule = rules[key]; - if (typeof rule != "object") - continue; - const { $data } = rule.definition; - const schema = keywords[key]; - if ($data && schema) - keywords[key] = schemaOrData(schema); - } - } - return metaSchema; - } - _removeAllSchemas(schemas, regex) { - for (const keyRef in schemas) { - const sch = schemas[keyRef]; - if (!regex || regex.test(keyRef)) { - if (typeof sch == "string") { - delete schemas[keyRef]; - } else if (sch && !sch.meta) { - this._cache.delete(sch.schema); - delete schemas[keyRef]; - } - } - } - } - _addSchema(schema, meta3, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) { - let id; - const { schemaId } = this.opts; - if (typeof schema == "object") { - id = schema[schemaId]; - } else { - if (this.opts.jtd) - throw new Error("schema must be object"); - else if (typeof schema != "boolean") - throw new Error("schema must be object or boolean"); - } - let sch = this._cache.get(schema); - if (sch !== void 0) - return sch; - baseId = (0, resolve_1.normalizeId)(id || baseId); - const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId); - sch = new compile_1.SchemaEnv({ schema, schemaId, meta: meta3, baseId, localRefs }); - this._cache.set(sch.schema, sch); - if (addSchema && !baseId.startsWith("#")) { - if (baseId) - this._checkUnique(baseId); - this.refs[baseId] = sch; - } - if (validateSchema) - this.validateSchema(schema, true); - return sch; - } - _checkUnique(id) { - if (this.schemas[id] || this.refs[id]) { - throw new Error(`schema with key or id "${id}" already exists`); - } - } - _compileSchemaEnv(sch) { - if (sch.meta) - this._compileMetaSchema(sch); - else - compile_1.compileSchema.call(this, sch); - if (!sch.validate) - throw new Error("ajv implementation error"); - return sch.validate; - } - _compileMetaSchema(sch) { - const currentOpts = this.opts; - this.opts = this._metaOpts; - try { - compile_1.compileSchema.call(this, sch); - } finally { - this.opts = currentOpts; - } - } - }; - Ajv2.ValidationError = validation_error_1.default; - Ajv2.MissingRefError = ref_error_1.default; - exports.default = Ajv2; - function checkOptions(checkOpts, options, msg, log = "error") { - for (const key in checkOpts) { - const opt = key; - if (opt in options) - this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`); - } - } - function getSchEnv(keyRef) { - keyRef = (0, resolve_1.normalizeId)(keyRef); - return this.schemas[keyRef] || this.refs[keyRef]; - } - function addInitialSchemas() { - const optsSchemas = this.opts.schemas; - if (!optsSchemas) - return; - if (Array.isArray(optsSchemas)) - this.addSchema(optsSchemas); - else - for (const key in optsSchemas) - this.addSchema(optsSchemas[key], key); - } - function addInitialFormats() { - for (const name in this.opts.formats) { - const format = this.opts.formats[name]; - if (format) - this.addFormat(name, format); - } - } - function addInitialKeywords(defs) { - if (Array.isArray(defs)) { - this.addVocabulary(defs); - return; - } - this.logger.warn("keywords option as map is deprecated, pass array"); - for (const keyword in defs) { - const def = defs[keyword]; - if (!def.keyword) - def.keyword = keyword; - this.addKeyword(def); - } - } - function getMetaSchemaOptions() { - const metaOpts = { ...this.opts }; - for (const opt of META_IGNORE_OPTIONS) - delete metaOpts[opt]; - return metaOpts; - } - var noLogs = { log() { - }, warn() { - }, error() { - } }; - function getLogger(logger) { - if (logger === false) - return noLogs; - if (logger === void 0) - return console; - if (logger.log && logger.warn && logger.error) - return logger; - throw new Error("logger must implement log, warn and error methods"); - } - var KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i; - function checkKeyword(keyword, def) { - const { RULES } = this; - (0, util_1.eachItem)(keyword, (kwd) => { - if (RULES.keywords[kwd]) - throw new Error(`Keyword ${kwd} is already defined`); - if (!KEYWORD_NAME.test(kwd)) - throw new Error(`Keyword ${kwd} has invalid name`); - }); - if (!def) - return; - if (def.$data && !("code" in def || "validate" in def)) { - throw new Error('$data keyword must have "code" or "validate" function'); - } - } - function addRule(keyword, definition, dataType) { - var _a3; - const post = definition === null || definition === void 0 ? void 0 : definition.post; - if (dataType && post) - throw new Error('keyword with "post" flag cannot have "type"'); - const { RULES } = this; - let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType); - if (!ruleGroup) { - ruleGroup = { type: dataType, rules: [] }; - RULES.rules.push(ruleGroup); - } - RULES.keywords[keyword] = true; - if (!definition) - return; - const rule = { - keyword, - definition: { - ...definition, - type: (0, dataType_1.getJSONTypes)(definition.type), - schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType) - } - }; - if (definition.before) - addBeforeRule.call(this, ruleGroup, rule, definition.before); - else - ruleGroup.rules.push(rule); - RULES.all[keyword] = rule; - (_a3 = definition.implements) === null || _a3 === void 0 ? void 0 : _a3.forEach((kwd) => this.addKeyword(kwd)); - } - function addBeforeRule(ruleGroup, rule, before) { - const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before); - if (i >= 0) { - ruleGroup.rules.splice(i, 0, rule); - } else { - ruleGroup.rules.push(rule); - this.logger.warn(`rule ${before} is not defined`); - } - } - function keywordMetaschema(def) { - let { metaSchema } = def; - if (metaSchema === void 0) - return; - if (def.$data && this.opts.$data) - metaSchema = schemaOrData(metaSchema); - def.validateSchema = this.compile(metaSchema, true); - } - var $dataRef = { - $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" - }; - function schemaOrData(schema) { - return { anyOf: [schema, $dataRef] }; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js -var require_id2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var def = { - keyword: "id", - code() { - throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID'); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js -var require_ref2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.callRef = exports.getValidate = void 0; - var ref_error_1 = require_ref_error2(); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var compile_1 = require_compile2(); - var util_1 = require_util2(); - var def = { - keyword: "$ref", - schemaType: "string", - code(cxt) { - const { gen, schema: $ref, it } = cxt; - const { baseId, schemaEnv: env, validateName, opts, self } = it; - const { root } = env; - if (($ref === "#" || $ref === "#/") && baseId === root.baseId) - return callRootRef(); - const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref); - if (schOrEnv === void 0) - throw new ref_error_1.default(it.opts.uriResolver, baseId, $ref); - if (schOrEnv instanceof compile_1.SchemaEnv) - return callValidate(schOrEnv); - return inlineRefSchema(schOrEnv); - function callRootRef() { - if (env === root) - return callRef(cxt, validateName, env, env.$async); - const rootName = gen.scopeValue("root", { ref: root }); - return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async); - } - function callValidate(sch) { - const v2 = getValidate(cxt, sch); - callRef(cxt, v2, sch, sch.$async); - } - function inlineRefSchema(sch) { - const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: (0, codegen_1.stringify)(sch) } : { ref: sch }); - const valid = gen.name("valid"); - const schCxt = cxt.subschema({ - schema: sch, - dataTypes: [], - schemaPath: codegen_1.nil, - topSchemaRef: schName, - errSchemaPath: $ref - }, valid); - cxt.mergeEvaluated(schCxt); - cxt.ok(valid); - } - } - }; - function getValidate(cxt, sch) { - const { gen } = cxt; - return sch.validate ? gen.scopeValue("validate", { ref: sch.validate }) : (0, codegen_1._)`${gen.scopeValue("wrapper", { ref: sch })}.validate`; - } - exports.getValidate = getValidate; - function callRef(cxt, v2, sch, $async) { - const { gen, it } = cxt; - const { allErrors, schemaEnv: env, opts } = it; - const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil; - if ($async) - callAsyncRef(); - else - callSyncRef(); - function callAsyncRef() { - if (!env.$async) - throw new Error("async schema referenced by sync schema"); - const valid = gen.let("valid"); - gen.try(() => { - gen.code((0, codegen_1._)`await ${(0, code_1.callValidateCode)(cxt, v2, passCxt)}`); - addEvaluatedFrom(v2); - if (!allErrors) - gen.assign(valid, true); - }, (e) => { - gen.if((0, codegen_1._)`!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e)); - addErrorsFrom(e); - if (!allErrors) - gen.assign(valid, false); - }); - cxt.ok(valid); - } - function callSyncRef() { - cxt.result((0, code_1.callValidateCode)(cxt, v2, passCxt), () => addEvaluatedFrom(v2), () => addErrorsFrom(v2)); - } - function addErrorsFrom(source) { - const errs = (0, codegen_1._)`${source}.errors`; - gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`); - gen.assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); - } - function addEvaluatedFrom(source) { - var _a3; - if (!it.opts.unevaluated) - return; - const schEvaluated = (_a3 = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a3 === void 0 ? void 0 : _a3.evaluated; - if (it.props !== true) { - if (schEvaluated && !schEvaluated.dynamicProps) { - if (schEvaluated.props !== void 0) { - it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props); - } - } else { - const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`); - it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name); - } - } - if (it.items !== true) { - if (schEvaluated && !schEvaluated.dynamicItems) { - if (schEvaluated.items !== void 0) { - it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items); - } - } else { - const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`); - it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name); - } - } - } - } - exports.callRef = callRef; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js -var require_core4 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var id_1 = require_id2(); - var ref_1 = require_ref2(); - var core = [ - "$schema", - "$id", - "$defs", - "$vocabulary", - { keyword: "$comment" }, - "definitions", - id_1.default, - ref_1.default - ]; - exports.default = core; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js -var require_limitNumber2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var ops = codegen_1.operators; - var KWDs = { - maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, - minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, - exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, - exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE } - }; - var error61 = { - message: ({ keyword, schemaCode }) => (0, codegen_1.str)`must be ${KWDs[keyword].okStr} ${schemaCode}`, - params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}` - }; - var def = { - keyword: Object.keys(KWDs), - type: "number", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode } = cxt; - cxt.fail$data((0, codegen_1._)`${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js -var require_multipleOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var error61 = { - message: ({ schemaCode }) => (0, codegen_1.str)`must be multiple of ${schemaCode}`, - params: ({ schemaCode }) => (0, codegen_1._)`{multipleOf: ${schemaCode}}` - }; - var def = { - keyword: "multipleOf", - type: "number", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { gen, data, schemaCode, it } = cxt; - const prec = it.opts.multipleOfPrecision; - const res = gen.let("res"); - const invalid = prec ? (0, codegen_1._)`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}` : (0, codegen_1._)`${res} !== parseInt(${res})`; - cxt.fail$data((0, codegen_1._)`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js -var require_ucs2length2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - function ucs2length(str) { - const len = str.length; - let length = 0; - let pos = 0; - let value; - while (pos < len) { - length++; - value = str.charCodeAt(pos++); - if (value >= 55296 && value <= 56319 && pos < len) { - value = str.charCodeAt(pos); - if ((value & 64512) === 56320) - pos++; - } - } - return length; - } - exports.default = ucs2length; - ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default'; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js -var require_limitLength2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var ucs2length_1 = require_ucs2length2(); - var error61 = { - message({ keyword, schemaCode }) { - const comp = keyword === "maxLength" ? "more" : "fewer"; - return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} characters`; - }, - params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` - }; - var def = { - keyword: ["maxLength", "minLength"], - type: "string", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode, it } = cxt; - const op = keyword === "maxLength" ? codegen_1.operators.GT : codegen_1.operators.LT; - const len = it.opts.unicode === false ? (0, codegen_1._)`${data}.length` : (0, codegen_1._)`${(0, util_1.useFunc)(cxt.gen, ucs2length_1.default)}(${data})`; - cxt.fail$data((0, codegen_1._)`${len} ${op} ${schemaCode}`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js -var require_pattern2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var util_1 = require_util2(); - var codegen_1 = require_codegen2(); - var error61 = { - message: ({ schemaCode }) => (0, codegen_1.str)`must match pattern "${schemaCode}"`, - params: ({ schemaCode }) => (0, codegen_1._)`{pattern: ${schemaCode}}` - }; - var def = { - keyword: "pattern", - type: "string", - schemaType: "string", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schema, schemaCode, it } = cxt; - const u = it.opts.unicodeRegExp ? "u" : ""; - if ($data) { - const { regExp } = it.opts.code; - const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); - const valid = gen.let("valid"); - gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); - cxt.fail$data((0, codegen_1._)`!${valid}`); - } else { - const regExp = (0, code_1.usePattern)(cxt, schema); - cxt.fail$data((0, codegen_1._)`!${regExp}.test(${data})`); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js -var require_limitProperties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var error61 = { - message({ keyword, schemaCode }) { - const comp = keyword === "maxProperties" ? "more" : "fewer"; - return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} properties`; - }, - params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` - }; - var def = { - keyword: ["maxProperties", "minProperties"], - type: "object", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode } = cxt; - const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT; - cxt.fail$data((0, codegen_1._)`Object.keys(${data}).length ${op} ${schemaCode}`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js -var require_required2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params: { missingProperty } }) => (0, codegen_1.str)`must have required property '${missingProperty}'`, - params: ({ params: { missingProperty } }) => (0, codegen_1._)`{missingProperty: ${missingProperty}}` - }; - var def = { - keyword: "required", - type: "object", - schemaType: "array", - $data: true, - error: error61, - code(cxt) { - const { gen, schema, schemaCode, data, $data, it } = cxt; - const { opts } = it; - if (!$data && schema.length === 0) - return; - const useLoop = schema.length >= opts.loopRequired; - if (it.allErrors) - allErrorsMode(); - else - exitOnErrorMode(); - if (opts.strictRequired) { - const props = cxt.parentSchema.properties; - const { definedProperties } = cxt.it; - for (const requiredKey of schema) { - if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === void 0 && !definedProperties.has(requiredKey)) { - const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; - const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`; - (0, util_1.checkStrictMode)(it, msg, it.opts.strictRequired); - } - } - } - function allErrorsMode() { - if (useLoop || $data) { - cxt.block$data(codegen_1.nil, loopAllRequired); - } else { - for (const prop of schema) { - (0, code_1.checkReportMissingProp)(cxt, prop); - } - } - } - function exitOnErrorMode() { - const missing = gen.let("missing"); - if (useLoop || $data) { - const valid = gen.let("valid", true); - cxt.block$data(valid, () => loopUntilMissing(missing, valid)); - cxt.ok(valid); - } else { - gen.if((0, code_1.checkMissingProp)(cxt, schema, missing)); - (0, code_1.reportMissingProp)(cxt, missing); - gen.else(); - } - } - function loopAllRequired() { - gen.forOf("prop", schemaCode, (prop) => { - cxt.setParams({ missingProperty: prop }); - gen.if((0, code_1.noPropertyInData)(gen, data, prop, opts.ownProperties), () => cxt.error()); - }); - } - function loopUntilMissing(missing, valid) { - cxt.setParams({ missingProperty: missing }); - gen.forOf(missing, schemaCode, () => { - gen.assign(valid, (0, code_1.propertyInData)(gen, data, missing, opts.ownProperties)); - gen.if((0, codegen_1.not)(valid), () => { - cxt.error(); - gen.break(); - }); - }, codegen_1.nil); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js -var require_limitItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var error61 = { - message({ keyword, schemaCode }) { - const comp = keyword === "maxItems" ? "more" : "fewer"; - return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} items`; - }, - params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` - }; - var def = { - keyword: ["maxItems", "minItems"], - type: "array", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode } = cxt; - const op = keyword === "maxItems" ? codegen_1.operators.GT : codegen_1.operators.LT; - cxt.fail$data((0, codegen_1._)`${data}.length ${op} ${schemaCode}`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js -var require_equal2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var equal = require_fast_deep_equal(); - equal.code = 'require("ajv/dist/runtime/equal").default'; - exports.default = equal; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js -var require_uniqueItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var dataType_1 = require_dataType2(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var equal_1 = require_equal2(); - var error61 = { - message: ({ params: { i, j: j2 } }) => (0, codegen_1.str)`must NOT have duplicate items (items ## ${j2} and ${i} are identical)`, - params: ({ params: { i, j: j2 } }) => (0, codegen_1._)`{i: ${i}, j: ${j2}}` - }; - var def = { - keyword: "uniqueItems", - type: "array", - schemaType: "boolean", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt; - if (!$data && !schema) - return; - const valid = gen.let("valid"); - const itemTypes = parentSchema.items ? (0, dataType_1.getSchemaTypes)(parentSchema.items) : []; - cxt.block$data(valid, validateUniqueItems, (0, codegen_1._)`${schemaCode} === false`); - cxt.ok(valid); - function validateUniqueItems() { - const i = gen.let("i", (0, codegen_1._)`${data}.length`); - const j2 = gen.let("j"); - cxt.setParams({ i, j: j2 }); - gen.assign(valid, true); - gen.if((0, codegen_1._)`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j2)); - } - function canOptimize() { - return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array"); - } - function loopN(i, j2) { - const item = gen.name("item"); - const wrongType = (0, dataType_1.checkDataTypes)(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong); - const indices = gen.const("indices", (0, codegen_1._)`{}`); - gen.for((0, codegen_1._)`;${i}--;`, () => { - gen.let(item, (0, codegen_1._)`${data}[${i}]`); - gen.if(wrongType, (0, codegen_1._)`continue`); - if (itemTypes.length > 1) - gen.if((0, codegen_1._)`typeof ${item} == "string"`, (0, codegen_1._)`${item} += "_"`); - gen.if((0, codegen_1._)`typeof ${indices}[${item}] == "number"`, () => { - gen.assign(j2, (0, codegen_1._)`${indices}[${item}]`); - cxt.error(); - gen.assign(valid, false).break(); - }).code((0, codegen_1._)`${indices}[${item}] = ${i}`); - }); - } - function loopN2(i, j2) { - const eql = (0, util_1.useFunc)(gen, equal_1.default); - const outer = gen.name("outer"); - gen.label(outer).for((0, codegen_1._)`;${i}--;`, () => gen.for((0, codegen_1._)`${j2} = ${i}; ${j2}--;`, () => gen.if((0, codegen_1._)`${eql}(${data}[${i}], ${data}[${j2}])`, () => { - cxt.error(); - gen.assign(valid, false).break(outer); - }))); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js -var require_const2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var equal_1 = require_equal2(); - var error61 = { - message: "must be equal to constant", - params: ({ schemaCode }) => (0, codegen_1._)`{allowedValue: ${schemaCode}}` - }; - var def = { - keyword: "const", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schemaCode, schema } = cxt; - if ($data || schema && typeof schema == "object") { - cxt.fail$data((0, codegen_1._)`!${(0, util_1.useFunc)(gen, equal_1.default)}(${data}, ${schemaCode})`); - } else { - cxt.fail((0, codegen_1._)`${schema} !== ${data}`); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js -var require_enum2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var equal_1 = require_equal2(); - var error61 = { - message: "must be equal to one of the allowed values", - params: ({ schemaCode }) => (0, codegen_1._)`{allowedValues: ${schemaCode}}` - }; - var def = { - keyword: "enum", - schemaType: "array", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schema, schemaCode, it } = cxt; - if (!$data && schema.length === 0) - throw new Error("enum must have non-empty array"); - const useLoop = schema.length >= it.opts.loopEnum; - let eql; - const getEql = () => eql !== null && eql !== void 0 ? eql : eql = (0, util_1.useFunc)(gen, equal_1.default); - let valid; - if (useLoop || $data) { - valid = gen.let("valid"); - cxt.block$data(valid, loopEnum); - } else { - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - const vSchema = gen.const("vSchema", schemaCode); - valid = (0, codegen_1.or)(...schema.map((_x, i) => equalCode(vSchema, i))); - } - cxt.pass(valid); - function loopEnum() { - gen.assign(valid, false); - gen.forOf("v", schemaCode, (v2) => gen.if((0, codegen_1._)`${getEql()}(${data}, ${v2})`, () => gen.assign(valid, true).break())); - } - function equalCode(vSchema, i) { - const sch = schema[i]; - return typeof sch === "object" && sch !== null ? (0, codegen_1._)`${getEql()}(${data}, ${vSchema}[${i}])` : (0, codegen_1._)`${data} === ${sch}`; - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js -var require_validation2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var limitNumber_1 = require_limitNumber2(); - var multipleOf_1 = require_multipleOf2(); - var limitLength_1 = require_limitLength2(); - var pattern_1 = require_pattern2(); - var limitProperties_1 = require_limitProperties2(); - var required_1 = require_required2(); - var limitItems_1 = require_limitItems2(); - var uniqueItems_1 = require_uniqueItems2(); - var const_1 = require_const2(); - var enum_1 = require_enum2(); - var validation = [ - // number - limitNumber_1.default, - multipleOf_1.default, - // string - limitLength_1.default, - pattern_1.default, - // object - limitProperties_1.default, - required_1.default, - // array - limitItems_1.default, - uniqueItems_1.default, - // any - { keyword: "type", schemaType: ["string", "array"] }, - { keyword: "nullable", schemaType: "boolean" }, - const_1.default, - enum_1.default - ]; - exports.default = validation; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js -var require_additionalItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateAdditionalItems = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, - params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` - }; - var def = { - keyword: "additionalItems", - type: "array", - schemaType: ["boolean", "object"], - before: "uniqueItems", - error: error61, - code(cxt) { - const { parentSchema, it } = cxt; - const { items } = parentSchema; - if (!Array.isArray(items)) { - (0, util_1.checkStrictMode)(it, '"additionalItems" is ignored when "items" is not an array of schemas'); - return; - } - validateAdditionalItems(cxt, items); - } - }; - function validateAdditionalItems(cxt, items) { - const { gen, schema, data, keyword, it } = cxt; - it.items = true; - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - if (schema === false) { - cxt.setParams({ len: items.length }); - cxt.pass((0, codegen_1._)`${len} <= ${items.length}`); - } else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { - const valid = gen.var("valid", (0, codegen_1._)`${len} <= ${items.length}`); - gen.if((0, codegen_1.not)(valid), () => validateItems(valid)); - cxt.ok(valid); - } - function validateItems(valid) { - gen.forRange("i", items.length, len, (i) => { - cxt.subschema({ keyword, dataProp: i, dataPropType: util_1.Type.Num }, valid); - if (!it.allErrors) - gen.if((0, codegen_1.not)(valid), () => gen.break()); - }); - } - } - exports.validateAdditionalItems = validateAdditionalItems; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js -var require_items2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateTuple = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var code_1 = require_code4(); - var def = { - keyword: "items", - type: "array", - schemaType: ["object", "array", "boolean"], - before: "uniqueItems", - code(cxt) { - const { schema, it } = cxt; - if (Array.isArray(schema)) - return validateTuple(cxt, "additionalItems", schema); - it.items = true; - if ((0, util_1.alwaysValidSchema)(it, schema)) - return; - cxt.ok((0, code_1.validateArray)(cxt)); - } - }; - function validateTuple(cxt, extraItems, schArr = cxt.schema) { - const { gen, parentSchema, data, keyword, it } = cxt; - checkStrictTuple(parentSchema); - if (it.opts.unevaluated && schArr.length && it.items !== true) { - it.items = util_1.mergeEvaluated.items(gen, schArr.length, it.items); - } - const valid = gen.name("valid"); - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - schArr.forEach((sch, i) => { - if ((0, util_1.alwaysValidSchema)(it, sch)) - return; - gen.if((0, codegen_1._)`${len} > ${i}`, () => cxt.subschema({ - keyword, - schemaProp: i, - dataProp: i - }, valid)); - cxt.ok(valid); - }); - function checkStrictTuple(sch) { - const { opts, errSchemaPath } = it; - const l3 = schArr.length; - const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); - if (opts.strictTuples && !fullTuple) { - const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; - (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); - } - } - } - exports.validateTuple = validateTuple; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js -var require_prefixItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var items_1 = require_items2(); - var def = { - keyword: "prefixItems", - type: "array", - schemaType: ["array"], - before: "uniqueItems", - code: (cxt) => (0, items_1.validateTuple)(cxt, "items") - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js -var require_items20202 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var code_1 = require_code4(); - var additionalItems_1 = require_additionalItems2(); - var error61 = { - message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, - params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` - }; - var def = { - keyword: "items", - type: "array", - schemaType: ["object", "boolean"], - before: "uniqueItems", - error: error61, - code(cxt) { - const { schema, parentSchema, it } = cxt; - const { prefixItems } = parentSchema; - it.items = true; - if ((0, util_1.alwaysValidSchema)(it, schema)) - return; - if (prefixItems) - (0, additionalItems_1.validateAdditionalItems)(cxt, prefixItems); - else - cxt.ok((0, code_1.validateArray)(cxt)); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js -var require_contains2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1.str)`must contain at least ${min} valid item(s)` : (0, codegen_1.str)`must contain at least ${min} and no more than ${max} valid item(s)`, - params: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1._)`{minContains: ${min}}` : (0, codegen_1._)`{minContains: ${min}, maxContains: ${max}}` - }; - var def = { - keyword: "contains", - type: "array", - schemaType: ["object", "boolean"], - before: "uniqueItems", - trackErrors: true, - error: error61, - code(cxt) { - const { gen, schema, parentSchema, data, it } = cxt; - let min; - let max; - const { minContains, maxContains } = parentSchema; - if (it.opts.next) { - min = minContains === void 0 ? 1 : minContains; - max = maxContains; - } else { - min = 1; - } - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - cxt.setParams({ min, max }); - if (max === void 0 && min === 0) { - (0, util_1.checkStrictMode)(it, `"minContains" == 0 without "maxContains": "contains" keyword ignored`); - return; - } - if (max !== void 0 && min > max) { - (0, util_1.checkStrictMode)(it, `"minContains" > "maxContains" is always invalid`); - cxt.fail(); - return; - } - if ((0, util_1.alwaysValidSchema)(it, schema)) { - let cond = (0, codegen_1._)`${len} >= ${min}`; - if (max !== void 0) - cond = (0, codegen_1._)`${cond} && ${len} <= ${max}`; - cxt.pass(cond); - return; - } - it.items = true; - const valid = gen.name("valid"); - if (max === void 0 && min === 1) { - validateItems(valid, () => gen.if(valid, () => gen.break())); - } else if (min === 0) { - gen.let(valid, true); - if (max !== void 0) - gen.if((0, codegen_1._)`${data}.length > 0`, validateItemsWithCount); - } else { - gen.let(valid, false); - validateItemsWithCount(); - } - cxt.result(valid, () => cxt.reset()); - function validateItemsWithCount() { - const schValid = gen.name("_valid"); - const count = gen.let("count", 0); - validateItems(schValid, () => gen.if(schValid, () => checkLimits(count))); - } - function validateItems(_valid, block) { - gen.forRange("i", 0, len, (i) => { - cxt.subschema({ - keyword: "contains", - dataProp: i, - dataPropType: util_1.Type.Num, - compositeRule: true - }, _valid); - block(); - }); - } - function checkLimits(count) { - gen.code((0, codegen_1._)`${count}++`); - if (max === void 0) { - gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break()); - } else { - gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break()); - if (min === 1) - gen.assign(valid, true); - else - gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true)); - } - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js -var require_dependencies2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var code_1 = require_code4(); - exports.error = { - message: ({ params: { property, depsCount, deps } }) => { - const property_ies = depsCount === 1 ? "property" : "properties"; - return (0, codegen_1.str)`must have ${property_ies} ${deps} when property ${property} is present`; - }, - params: ({ params: { property, depsCount, deps, missingProperty } }) => (0, codegen_1._)`{property: ${property}, - missingProperty: ${missingProperty}, - depsCount: ${depsCount}, - deps: ${deps}}` - // TODO change to reference - }; - var def = { - keyword: "dependencies", - type: "object", - schemaType: "object", - error: exports.error, - code(cxt) { - const [propDeps, schDeps] = splitDependencies(cxt); - validatePropertyDeps(cxt, propDeps); - validateSchemaDeps(cxt, schDeps); - } - }; - function splitDependencies({ schema }) { - const propertyDeps = {}; - const schemaDeps = {}; - for (const key in schema) { - if (key === "__proto__") - continue; - const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps; - deps[key] = schema[key]; - } - return [propertyDeps, schemaDeps]; - } - function validatePropertyDeps(cxt, propertyDeps = cxt.schema) { - const { gen, data, it } = cxt; - if (Object.keys(propertyDeps).length === 0) - return; - const missing = gen.let("missing"); - for (const prop in propertyDeps) { - const deps = propertyDeps[prop]; - if (deps.length === 0) - continue; - const hasProperty = (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties); - cxt.setParams({ - property: prop, - depsCount: deps.length, - deps: deps.join(", ") - }); - if (it.allErrors) { - gen.if(hasProperty, () => { - for (const depProp of deps) { - (0, code_1.checkReportMissingProp)(cxt, depProp); - } - }); - } else { - gen.if((0, codegen_1._)`${hasProperty} && (${(0, code_1.checkMissingProp)(cxt, deps, missing)})`); - (0, code_1.reportMissingProp)(cxt, missing); - gen.else(); - } - } - } - exports.validatePropertyDeps = validatePropertyDeps; - function validateSchemaDeps(cxt, schemaDeps = cxt.schema) { - const { gen, data, keyword, it } = cxt; - const valid = gen.name("valid"); - for (const prop in schemaDeps) { - if ((0, util_1.alwaysValidSchema)(it, schemaDeps[prop])) - continue; - gen.if( - (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties), - () => { - const schCxt = cxt.subschema({ keyword, schemaProp: prop }, valid); - cxt.mergeValidEvaluated(schCxt, valid); - }, - () => gen.var(valid, true) - // TODO var - ); - cxt.ok(valid); - } - } - exports.validateSchemaDeps = validateSchemaDeps; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js -var require_propertyNames2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: "property name must be valid", - params: ({ params }) => (0, codegen_1._)`{propertyName: ${params.propertyName}}` - }; - var def = { - keyword: "propertyNames", - type: "object", - schemaType: ["object", "boolean"], - error: error61, - code(cxt) { - const { gen, schema, data, it } = cxt; - if ((0, util_1.alwaysValidSchema)(it, schema)) - return; - const valid = gen.name("valid"); - gen.forIn("key", data, (key) => { - cxt.setParams({ propertyName: key }); - cxt.subschema({ - keyword: "propertyNames", - data: key, - dataTypes: ["string"], - propertyName: key, - compositeRule: true - }, valid); - gen.if((0, codegen_1.not)(valid), () => { - cxt.error(true); - if (!it.allErrors) - gen.break(); - }); - }); - cxt.ok(valid); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js -var require_additionalProperties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var util_1 = require_util2(); - var error61 = { - message: "must NOT have additional properties", - params: ({ params }) => (0, codegen_1._)`{additionalProperty: ${params.additionalProperty}}` - }; - var def = { - keyword: "additionalProperties", - type: ["object"], - schemaType: ["boolean", "object"], - allowUndefined: true, - trackErrors: true, - error: error61, - code(cxt) { - const { gen, schema, parentSchema, data, errsCount, it } = cxt; - if (!errsCount) - throw new Error("ajv implementation error"); - const { allErrors, opts } = it; - it.props = true; - if (opts.removeAdditional !== "all" && (0, util_1.alwaysValidSchema)(it, schema)) - return; - const props = (0, code_1.allSchemaProperties)(parentSchema.properties); - const patProps = (0, code_1.allSchemaProperties)(parentSchema.patternProperties); - checkAdditionalProperties(); - cxt.ok((0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); - function checkAdditionalProperties() { - gen.forIn("key", data, (key) => { - if (!props.length && !patProps.length) - additionalPropertyCode(key); - else - gen.if(isAdditional(key), () => additionalPropertyCode(key)); - }); - } - function isAdditional(key) { - let definedProp; - if (props.length > 8) { - const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema.properties, "properties"); - definedProp = (0, code_1.isOwnProperty)(gen, propsSchema, key); - } else if (props.length) { - definedProp = (0, codegen_1.or)(...props.map((p) => (0, codegen_1._)`${key} === ${p}`)); - } else { - definedProp = codegen_1.nil; - } - if (patProps.length) { - definedProp = (0, codegen_1.or)(definedProp, ...patProps.map((p) => (0, codegen_1._)`${(0, code_1.usePattern)(cxt, p)}.test(${key})`)); - } - return (0, codegen_1.not)(definedProp); - } - function deleteAdditional(key) { - gen.code((0, codegen_1._)`delete ${data}[${key}]`); - } - function additionalPropertyCode(key) { - if (opts.removeAdditional === "all" || opts.removeAdditional && schema === false) { - deleteAdditional(key); - return; - } - if (schema === false) { - cxt.setParams({ additionalProperty: key }); - cxt.error(); - if (!allErrors) - gen.break(); - return; - } - if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { - const valid = gen.name("valid"); - if (opts.removeAdditional === "failing") { - applyAdditionalSchema(key, valid, false); - gen.if((0, codegen_1.not)(valid), () => { - cxt.reset(); - deleteAdditional(key); - }); - } else { - applyAdditionalSchema(key, valid); - if (!allErrors) - gen.if((0, codegen_1.not)(valid), () => gen.break()); - } - } - } - function applyAdditionalSchema(key, valid, errors) { - const subschema = { - keyword: "additionalProperties", - dataProp: key, - dataPropType: util_1.Type.Str - }; - if (errors === false) { - Object.assign(subschema, { - compositeRule: true, - createErrors: false, - allErrors: false - }); - } - cxt.subschema(subschema, valid); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js -var require_properties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var validate_1 = require_validate2(); - var code_1 = require_code4(); - var util_1 = require_util2(); - var additionalProperties_1 = require_additionalProperties2(); - var def = { - keyword: "properties", - type: "object", - schemaType: "object", - code(cxt) { - const { gen, schema, parentSchema, data, it } = cxt; - if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === void 0) { - additionalProperties_1.default.code(new validate_1.KeywordCxt(it, additionalProperties_1.default, "additionalProperties")); - } - const allProps = (0, code_1.allSchemaProperties)(schema); - for (const prop of allProps) { - it.definedProperties.add(prop); - } - if (it.opts.unevaluated && allProps.length && it.props !== true) { - it.props = util_1.mergeEvaluated.props(gen, (0, util_1.toHash)(allProps), it.props); - } - const properties = allProps.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p])); - if (properties.length === 0) - return; - const valid = gen.name("valid"); - for (const prop of properties) { - if (hasDefault(prop)) { - applyPropertySchema(prop); - } else { - gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties)); - applyPropertySchema(prop); - if (!it.allErrors) - gen.else().var(valid, true); - gen.endIf(); - } - cxt.it.definedProperties.add(prop); - cxt.ok(valid); - } - function hasDefault(prop) { - return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== void 0; - } - function applyPropertySchema(prop) { - cxt.subschema({ - keyword: "properties", - schemaProp: prop, - dataProp: prop - }, valid); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js -var require_patternProperties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var util_2 = require_util2(); - var def = { - keyword: "patternProperties", - type: "object", - schemaType: "object", - code(cxt) { - const { gen, schema, data, parentSchema, it } = cxt; - const { opts } = it; - const patterns = (0, code_1.allSchemaProperties)(schema); - const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p])); - if (patterns.length === 0 || alwaysValidPatterns.length === patterns.length && (!it.opts.unevaluated || it.props === true)) { - return; - } - const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties; - const valid = gen.name("valid"); - if (it.props !== true && !(it.props instanceof codegen_1.Name)) { - it.props = (0, util_2.evaluatedPropsToName)(gen, it.props); - } - const { props } = it; - validatePatternProperties(); - function validatePatternProperties() { - for (const pat of patterns) { - if (checkProperties) - checkMatchingProperties(pat); - if (it.allErrors) { - validateProperties(pat); - } else { - gen.var(valid, true); - validateProperties(pat); - gen.if(valid); - } - } - } - function checkMatchingProperties(pat) { - for (const prop in checkProperties) { - if (new RegExp(pat).test(prop)) { - (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`); - } - } - } - function validateProperties(pat) { - gen.forIn("key", data, (key) => { - gen.if((0, codegen_1._)`${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => { - const alwaysValid = alwaysValidPatterns.includes(pat); - if (!alwaysValid) { - cxt.subschema({ - keyword: "patternProperties", - schemaProp: pat, - dataProp: key, - dataPropType: util_2.Type.Str - }, valid); - } - if (it.opts.unevaluated && props !== true) { - gen.assign((0, codegen_1._)`${props}[${key}]`, true); - } else if (!alwaysValid && !it.allErrors) { - gen.if((0, codegen_1.not)(valid), () => gen.break()); - } - }); - }); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js -var require_not2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util2(); - var def = { - keyword: "not", - schemaType: ["object", "boolean"], - trackErrors: true, - code(cxt) { - const { gen, schema, it } = cxt; - if ((0, util_1.alwaysValidSchema)(it, schema)) { - cxt.fail(); - return; - } - const valid = gen.name("valid"); - cxt.subschema({ - keyword: "not", - compositeRule: true, - createErrors: false, - allErrors: false - }, valid); - cxt.failResult(valid, () => cxt.reset(), () => cxt.error()); - }, - error: { message: "must NOT be valid" } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js -var require_anyOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var def = { - keyword: "anyOf", - schemaType: "array", - trackErrors: true, - code: code_1.validateUnion, - error: { message: "must match a schema in anyOf" } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js -var require_oneOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: "must match exactly one schema in oneOf", - params: ({ params }) => (0, codegen_1._)`{passingSchemas: ${params.passing}}` - }; - var def = { - keyword: "oneOf", - schemaType: "array", - trackErrors: true, - error: error61, - code(cxt) { - const { gen, schema, parentSchema, it } = cxt; - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - if (it.opts.discriminator && parentSchema.discriminator) - return; - const schArr = schema; - const valid = gen.let("valid", false); - const passing = gen.let("passing", null); - const schValid = gen.name("_valid"); - cxt.setParams({ passing }); - gen.block(validateOneOf); - cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); - function validateOneOf() { - schArr.forEach((sch, i) => { - let schCxt; - if ((0, util_1.alwaysValidSchema)(it, sch)) { - gen.var(schValid, true); - } else { - schCxt = cxt.subschema({ - keyword: "oneOf", - schemaProp: i, - compositeRule: true - }, schValid); - } - if (i > 0) { - gen.if((0, codegen_1._)`${schValid} && ${valid}`).assign(valid, false).assign(passing, (0, codegen_1._)`[${passing}, ${i}]`).else(); - } - gen.if(schValid, () => { - gen.assign(valid, true); - gen.assign(passing, i); - if (schCxt) - cxt.mergeEvaluated(schCxt, codegen_1.Name); - }); - }); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js -var require_allOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util2(); - var def = { - keyword: "allOf", - schemaType: "array", - code(cxt) { - const { gen, schema, it } = cxt; - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - const valid = gen.name("valid"); - schema.forEach((sch, i) => { - if ((0, util_1.alwaysValidSchema)(it, sch)) - return; - const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid); - cxt.ok(valid); - cxt.mergeEvaluated(schCxt); - }); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js -var require_if2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`, - params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}` - }; - var def = { - keyword: "if", - schemaType: ["object", "boolean"], - trackErrors: true, - error: error61, - code(cxt) { - const { gen, parentSchema, it } = cxt; - if (parentSchema.then === void 0 && parentSchema.else === void 0) { - (0, util_1.checkStrictMode)(it, '"if" without "then" and "else" is ignored'); - } - const hasThen = hasSchema(it, "then"); - const hasElse = hasSchema(it, "else"); - if (!hasThen && !hasElse) - return; - const valid = gen.let("valid", true); - const schValid = gen.name("_valid"); - validateIf(); - cxt.reset(); - if (hasThen && hasElse) { - const ifClause = gen.let("ifClause"); - cxt.setParams({ ifClause }); - gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause)); - } else if (hasThen) { - gen.if(schValid, validateClause("then")); - } else { - gen.if((0, codegen_1.not)(schValid), validateClause("else")); - } - cxt.pass(valid, () => cxt.error(true)); - function validateIf() { - const schCxt = cxt.subschema({ - keyword: "if", - compositeRule: true, - createErrors: false, - allErrors: false - }, schValid); - cxt.mergeEvaluated(schCxt); - } - function validateClause(keyword, ifClause) { - return () => { - const schCxt = cxt.subschema({ keyword }, schValid); - gen.assign(valid, schValid); - cxt.mergeValidEvaluated(schCxt, valid); - if (ifClause) - gen.assign(ifClause, (0, codegen_1._)`${keyword}`); - else - cxt.setParams({ ifClause: keyword }); - }; - } - } - }; - function hasSchema(it, keyword) { - const schema = it.schema[keyword]; - return schema !== void 0 && !(0, util_1.alwaysValidSchema)(it, schema); - } - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js -var require_thenElse2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util2(); - var def = { - keyword: ["then", "else"], - schemaType: ["object", "boolean"], - code({ keyword, parentSchema, it }) { - if (parentSchema.if === void 0) - (0, util_1.checkStrictMode)(it, `"${keyword}" without "if" is ignored`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js -var require_applicator2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var additionalItems_1 = require_additionalItems2(); - var prefixItems_1 = require_prefixItems2(); - var items_1 = require_items2(); - var items2020_1 = require_items20202(); - var contains_1 = require_contains2(); - var dependencies_1 = require_dependencies2(); - var propertyNames_1 = require_propertyNames2(); - var additionalProperties_1 = require_additionalProperties2(); - var properties_1 = require_properties2(); - var patternProperties_1 = require_patternProperties2(); - var not_1 = require_not2(); - var anyOf_1 = require_anyOf2(); - var oneOf_1 = require_oneOf2(); - var allOf_1 = require_allOf2(); - var if_1 = require_if2(); - var thenElse_1 = require_thenElse2(); - function getApplicator(draft2020 = false) { - const applicator = [ - // any - not_1.default, - anyOf_1.default, - oneOf_1.default, - allOf_1.default, - if_1.default, - thenElse_1.default, - // object - propertyNames_1.default, - additionalProperties_1.default, - dependencies_1.default, - properties_1.default, - patternProperties_1.default - ]; - if (draft2020) - applicator.push(prefixItems_1.default, items2020_1.default); - else - applicator.push(additionalItems_1.default, items_1.default); - applicator.push(contains_1.default); - return applicator; - } - exports.default = getApplicator; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js -var require_format3 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var error61 = { - message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`, - params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}` - }; - var def = { - keyword: "format", - type: ["number", "string"], - schemaType: "string", - $data: true, - error: error61, - code(cxt, ruleType) { - const { gen, data, $data, schema, schemaCode, it } = cxt; - const { opts, errSchemaPath, schemaEnv, self } = it; - if (!opts.validateFormats) - return; - if ($data) - validate$DataFormat(); - else - validateFormat(); - function validate$DataFormat() { - const fmts = gen.scopeValue("formats", { - ref: self.formats, - code: opts.code.formats - }); - const fDef = gen.const("fDef", (0, codegen_1._)`${fmts}[${schemaCode}]`); - const fType = gen.let("fType"); - const format = gen.let("format"); - gen.if((0, codegen_1._)`typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._)`${fDef}.type || "string"`).assign(format, (0, codegen_1._)`${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._)`"string"`).assign(format, fDef)); - cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt())); - function unknownFmt() { - if (opts.strictSchema === false) - return codegen_1.nil; - return (0, codegen_1._)`${schemaCode} && !${format}`; - } - function invalidFmt() { - const callFormat = schemaEnv.$async ? (0, codegen_1._)`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))` : (0, codegen_1._)`${format}(${data})`; - const validData = (0, codegen_1._)`(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`; - return (0, codegen_1._)`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`; - } - } - function validateFormat() { - const formatDef = self.formats[schema]; - if (!formatDef) { - unknownFormat(); - return; - } - if (formatDef === true) - return; - const [fmtType, format, fmtRef] = getFormat(formatDef); - if (fmtType === ruleType) - cxt.pass(validCondition()); - function unknownFormat() { - if (opts.strictSchema === false) { - self.logger.warn(unknownMsg()); - return; - } - throw new Error(unknownMsg()); - function unknownMsg() { - return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`; - } - } - function getFormat(fmtDef) { - const code = fmtDef instanceof RegExp ? (0, codegen_1.regexpCode)(fmtDef) : opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(schema)}` : void 0; - const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code }); - if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) { - return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._)`${fmt}.validate`]; - } - return ["string", fmtDef, fmt]; - } - function validCondition() { - if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) { - if (!schemaEnv.$async) - throw new Error("async format in sync schema"); - return (0, codegen_1._)`await ${fmtRef}(${data})`; - } - return typeof format == "function" ? (0, codegen_1._)`${fmtRef}(${data})` : (0, codegen_1._)`${fmtRef}.test(${data})`; - } - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js -var require_format4 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var format_1 = require_format3(); - var format = [format_1.default]; - exports.default = format; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js -var require_metadata2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.contentVocabulary = exports.metadataVocabulary = void 0; - exports.metadataVocabulary = [ - "title", - "description", - "default", - "deprecated", - "readOnly", - "writeOnly", - "examples" - ]; - exports.contentVocabulary = [ - "contentMediaType", - "contentEncoding", - "contentSchema" - ]; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js -var require_draft72 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var core_1 = require_core4(); - var validation_1 = require_validation2(); - var applicator_1 = require_applicator2(); - var format_1 = require_format4(); - var metadata_1 = require_metadata2(); - var draft7Vocabularies = [ - core_1.default, - validation_1.default, - (0, applicator_1.default)(), - format_1.default, - metadata_1.metadataVocabulary, - metadata_1.contentVocabulary - ]; - exports.default = draft7Vocabularies; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js -var require_types2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.DiscrError = void 0; - var DiscrError; - (function(DiscrError2) { - DiscrError2["Tag"] = "tag"; - DiscrError2["Mapping"] = "mapping"; - })(DiscrError || (exports.DiscrError = DiscrError = {})); - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js -var require_discriminator2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var types_1 = require_types2(); - var compile_1 = require_compile2(); - var ref_error_1 = require_ref_error2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`, - params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}` - }; - var def = { - keyword: "discriminator", - type: "object", - schemaType: "object", - error: error61, - code(cxt) { - const { gen, data, schema, parentSchema, it } = cxt; - const { oneOf } = parentSchema; - if (!it.opts.discriminator) { - throw new Error("discriminator: requires discriminator option"); - } - const tagName = schema.propertyName; - if (typeof tagName != "string") - throw new Error("discriminator: requires propertyName"); - if (schema.mapping) - throw new Error("discriminator: mapping is not supported"); - if (!oneOf) - throw new Error("discriminator: requires oneOf keyword"); - const valid = gen.let("valid", false); - const tag = gen.const("tag", (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(tagName)}`); - gen.if((0, codegen_1._)`typeof ${tag} == "string"`, () => validateMapping(), () => cxt.error(false, { discrError: types_1.DiscrError.Tag, tag, tagName })); - cxt.ok(valid); - function validateMapping() { - const mapping = getMapping(); - gen.if(false); - for (const tagValue in mapping) { - gen.elseIf((0, codegen_1._)`${tag} === ${tagValue}`); - gen.assign(valid, applyTagSchema(mapping[tagValue])); - } - gen.else(); - cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag, tagName }); - gen.endIf(); - } - function applyTagSchema(schemaProp) { - const _valid = gen.name("valid"); - const schCxt = cxt.subschema({ keyword: "oneOf", schemaProp }, _valid); - cxt.mergeEvaluated(schCxt, codegen_1.Name); - return _valid; - } - function getMapping() { - var _a3; - const oneOfMapping = {}; - const topRequired = hasRequired(parentSchema); - let tagRequired = true; - for (let i = 0; i < oneOf.length; i++) { - let sch = oneOf[i]; - if ((sch === null || sch === void 0 ? void 0 : sch.$ref) && !(0, util_1.schemaHasRulesButRef)(sch, it.self.RULES)) { - const ref = sch.$ref; - sch = compile_1.resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref); - if (sch instanceof compile_1.SchemaEnv) - sch = sch.schema; - if (sch === void 0) - throw new ref_error_1.default(it.opts.uriResolver, it.baseId, ref); - } - const propSch = (_a3 = sch === null || sch === void 0 ? void 0 : sch.properties) === null || _a3 === void 0 ? void 0 : _a3[tagName]; - if (typeof propSch != "object") { - throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`); - } - tagRequired = tagRequired && (topRequired || hasRequired(sch)); - addMappings(propSch, i); - } - if (!tagRequired) - throw new Error(`discriminator: "${tagName}" must be required`); - return oneOfMapping; - function hasRequired({ required: required2 }) { - return Array.isArray(required2) && required2.includes(tagName); - } - function addMappings(sch, i) { - if (sch.const) { - addMapping(sch.const, i); - } else if (sch.enum) { - for (const tagValue of sch.enum) { - addMapping(tagValue, i); - } - } else { - throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`); - } - } - function addMapping(tagValue, i) { - if (typeof tagValue != "string" || tagValue in oneOfMapping) { - throw new Error(`discriminator: "${tagName}" values must be unique strings`); - } - oneOfMapping[tagValue] = i; - } - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json -var require_json_schema_draft_072 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { - module.exports = { - $schema: "http://json-schema.org/draft-07/schema#", - $id: "http://json-schema.org/draft-07/schema#", - title: "Core schema meta-schema", - definitions: { - schemaArray: { - type: "array", - minItems: 1, - items: { $ref: "#" } - }, - nonNegativeInteger: { - type: "integer", - minimum: 0 - }, - nonNegativeIntegerDefault0: { - allOf: [{ $ref: "#/definitions/nonNegativeInteger" }, { default: 0 }] - }, - simpleTypes: { - enum: ["array", "boolean", "integer", "null", "number", "object", "string"] - }, - stringArray: { - type: "array", - items: { type: "string" }, - uniqueItems: true, - default: [] - } - }, - type: ["object", "boolean"], - properties: { - $id: { - type: "string", - format: "uri-reference" - }, - $schema: { - type: "string", - format: "uri" - }, - $ref: { - type: "string", - format: "uri-reference" - }, - $comment: { - type: "string" - }, - title: { - type: "string" - }, - description: { - type: "string" - }, - default: true, - readOnly: { - type: "boolean", - default: false - }, - examples: { - type: "array", - items: true - }, - multipleOf: { - type: "number", - exclusiveMinimum: 0 - }, - maximum: { - type: "number" - }, - exclusiveMaximum: { - type: "number" - }, - minimum: { - type: "number" - }, - exclusiveMinimum: { - type: "number" - }, - maxLength: { $ref: "#/definitions/nonNegativeInteger" }, - minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, - pattern: { - type: "string", - format: "regex" - }, - additionalItems: { $ref: "#" }, - items: { - anyOf: [{ $ref: "#" }, { $ref: "#/definitions/schemaArray" }], - default: true - }, - maxItems: { $ref: "#/definitions/nonNegativeInteger" }, - minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, - uniqueItems: { - type: "boolean", - default: false - }, - contains: { $ref: "#" }, - maxProperties: { $ref: "#/definitions/nonNegativeInteger" }, - minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, - required: { $ref: "#/definitions/stringArray" }, - additionalProperties: { $ref: "#" }, - definitions: { - type: "object", - additionalProperties: { $ref: "#" }, - default: {} - }, - properties: { - type: "object", - additionalProperties: { $ref: "#" }, - default: {} - }, - patternProperties: { - type: "object", - additionalProperties: { $ref: "#" }, - propertyNames: { format: "regex" }, - default: {} - }, - dependencies: { - type: "object", - additionalProperties: { - anyOf: [{ $ref: "#" }, { $ref: "#/definitions/stringArray" }] - } - }, - propertyNames: { $ref: "#" }, - const: true, - enum: { - type: "array", - items: true, - minItems: 1, - uniqueItems: true - }, - type: { - anyOf: [ - { $ref: "#/definitions/simpleTypes" }, - { - type: "array", - items: { $ref: "#/definitions/simpleTypes" }, - minItems: 1, - uniqueItems: true - } - ] - }, - format: { type: "string" }, - contentMediaType: { type: "string" }, - contentEncoding: { type: "string" }, - if: { $ref: "#" }, - then: { $ref: "#" }, - else: { $ref: "#" }, - allOf: { $ref: "#/definitions/schemaArray" }, - anyOf: { $ref: "#/definitions/schemaArray" }, - oneOf: { $ref: "#/definitions/schemaArray" }, - not: { $ref: "#" } - }, - default: true - }; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/ajv.js -var require_ajv2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/ajv.js"(exports, module) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; - var core_1 = require_core3(); - var draft7_1 = require_draft72(); - var discriminator_1 = require_discriminator2(); - var draft7MetaSchema = require_json_schema_draft_072(); - var META_SUPPORT_DATA = ["/properties"]; - var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema"; - var Ajv2 = class extends core_1.default { - _addVocabularies() { - super._addVocabularies(); - draft7_1.default.forEach((v2) => this.addVocabulary(v2)); - if (this.opts.discriminator) - this.addKeyword(discriminator_1.default); - } - _addDefaultMetaSchema() { - super._addDefaultMetaSchema(); - if (!this.opts.meta) - return; - const metaSchema = this.opts.$data ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA) : draft7MetaSchema; - this.addMetaSchema(metaSchema, META_SCHEMA_ID, false); - this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID; - } - defaultMeta() { - return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0); - } - }; - exports.Ajv = Ajv2; - module.exports = exports = Ajv2; - module.exports.Ajv = Ajv2; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.default = Ajv2; - var validate_1 = require_validate2(); - Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { - return validate_1.KeywordCxt; - } }); - var codegen_1 = require_codegen2(); - Object.defineProperty(exports, "_", { enumerable: true, get: function() { - return codegen_1._; - } }); - Object.defineProperty(exports, "str", { enumerable: true, get: function() { - return codegen_1.str; - } }); - Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { - return codegen_1.stringify; - } }); - Object.defineProperty(exports, "nil", { enumerable: true, get: function() { - return codegen_1.nil; - } }); - Object.defineProperty(exports, "Name", { enumerable: true, get: function() { - return codegen_1.Name; - } }); - Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { - return codegen_1.CodeGen; - } }); - var validation_error_1 = require_validation_error2(); - Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { - return validation_error_1.default; - } }); - var ref_error_1 = require_ref_error2(); - Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { - return ref_error_1.default; - } }); - } -}); - // node_modules/ajv-formats/dist/limit.js var require_limit = __commonJS({ "node_modules/ajv-formats/dist/limit.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatLimitDefinition = void 0; - var ajv_1 = require_ajv2(); - var codegen_1 = require_codegen2(); + var ajv_1 = require_ajv(); + var codegen_1 = require_codegen(); var ops = codegen_1.operators; var KWDs = { formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, @@ -12766,7 +7159,7 @@ var require_dist = __commonJS({ Object.defineProperty(exports, "__esModule", { value: true }); var formats_1 = require_formats(); var limit_1 = require_limit(); - var codegen_1 = require_codegen2(); + var codegen_1 = require_codegen(); var fullName = new codegen_1.Name("fullFormats"); var fastName = new codegen_1.Name("fastFormats"); var formatsPlugin = (ajv, opts = { keywords: true }) => { @@ -33254,10 +27647,10 @@ function isTerminal(status) { return status === "completed" || status === "failed" || status === "cancelled"; } -// node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/Options.js +// node_modules/zod-to-json-schema/dist/esm/Options.js var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use"); -// node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/parsers/string.js +// node_modules/zod-to-json-schema/dist/esm/parsers/string.js var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789"); // node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js @@ -35653,147 +30046,140 @@ function L() { return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null }; } var T = L(); -function G(l3) { - T = l3; +function G(u3) { + T = u3; } -var E = { exec: () => null }; -function d(l3, e = "") { - let t = typeof l3 == "string" ? l3 : l3.source, n = { replace: (r, i) => { +var I = { exec: () => null }; +function d(u3, e = "") { + let t = typeof u3 == "string" ? u3 : u3.source, n = { replace: (r, i) => { let s = typeof i == "string" ? i : i.source; return s = s.replace(m.caret, "$1"), t = t.replace(r, s), n; }, getRegex: () => new RegExp(t, e) }; return n; } -var be = (() => { - try { - return !!new RegExp("(?<=1)(?/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (l3) => new RegExp(`^( {0,3}${l3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}#`), htmlBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; -var Re = /^(?:[ \t]*(?:\n|$))+/; -var Te = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; -var Oe = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; -var I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; -var we = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; +var m = { codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, outputLinkReplace: /\\([\[\]])/g, indentCodeCompensation: /^(\s+)(?:```)/, beginningSpace: /^\s+/, endingHash: /#$/, startingSpaceChar: /^ /, endingSpaceChar: / $/, nonSpaceChar: /[^ ]/, newLineCharGlobal: /\n/g, tabCharGlobal: /\t/g, multipleSpaceGlobal: /\s+/g, blankLine: /^[ \t]*$/, doubleBlankLine: /\n[ \t]*\n[ \t]*$/, blockquoteStart: /^ {0,3}>/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (u3) => new RegExp(`^( {0,3}${u3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}#`), htmlBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; +var be = /^(?:[ \t]*(?:\n|$))+/; +var Re = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; +var Te = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; +var E = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; +var Oe = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; var F = /(?:[*+-]|\d{1,9}[.)])/; var ie = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/; var oe = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(); -var ye = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); +var we = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); var j = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; -var Pe = /^[^\n]+/; +var ye = /^[^\n]+/; var Q = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/; -var Se = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); -var $e = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); +var Pe = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); +var Se = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); var v = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; var U = /|$))/; -var _e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); -var ae = d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var Le = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); -var K = { blockquote: Le, code: Te, def: Se, fences: Oe, heading: we, hr: I, html: _e, lheading: oe, list: $e, newline: Re, paragraph: ae, table: E, text: Pe }; -var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var Me = { ...K, lheading: ye, table: re, paragraph: d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; -var ze = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: E, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", I).replace("heading", ` *#{1,6} *[^ +var $e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); +var ae = d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var _e = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); +var K = { blockquote: _e, code: Re, def: Pe, fences: Te, heading: Oe, hr: E, html: $e, lheading: oe, list: Se, newline: be, paragraph: ae, table: I, text: ye }; +var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var Le = { ...K, lheading: we, table: re, paragraph: d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; +var Me = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: I, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", E).replace("heading", ` *#{1,6} *[^ ]`).replace("lheading", oe).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }; -var Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; -var Ee = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; +var ze = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; +var Ae = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; var le = /^( {2,}|\\)\n(?!\s*$)/; var Ie = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", be ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(); +var Ce = /(?!~)[\s\p{P}\p{S}]/u; +var Be = /(?:[^\s\p{P}\p{S}]|~)/u; +var qe = /\[(?:[^\[\]`]|`[^`]*?`)*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)|`[^`]*?`|<(?! )[^<>]*?>/g; var ce = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/; -var De = d(ce, "u").replace(/punct/g, D).getRegex(); -var He = d(ce, "u").replace(/punct/g, pe).getRegex(); +var ve = d(ce, "u").replace(/punct/g, D).getRegex(); +var De = d(ce, "u").replace(/punct/g, pe).getRegex(); var he = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)"; -var Ze = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Ge = d(he, "gu").replace(/notPunctSpace/g, qe).replace(/punctSpace/g, Be).replace(/punct/g, pe).getRegex(); -var Ne = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Fe = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); -var je = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); -var Qe = d(U).replace("(?:-->|$)", "-->").getRegex(); -var Ue = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", Qe).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); +var He = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Ze = d(he, "gu").replace(/notPunctSpace/g, Be).replace(/punctSpace/g, Ce).replace(/punct/g, pe).getRegex(); +var Ge = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Ne = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); +var Fe = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); +var je = d(U).replace("(?:-->|$)", "-->").getRegex(); +var Qe = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", je).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); var q = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/; -var Ke = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); +var Ue = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); var de = d(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", Q).getRegex(); var ke = d(/^!?\[(ref)\](?:\[\])?/).replace("ref", Q).getRegex(); -var We = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); +var Ke = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); var se = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/; -var X = { _backpedal: E, anyPunctuation: Fe, autolink: je, blockSkip: ve, br: le, code: Ee, del: E, emStrongLDelim: De, emStrongRDelimAst: Ze, emStrongRDelimUnd: Ne, escape: Ae, link: Ke, nolink: ke, punctuation: Ce, reflink: de, reflinkSearch: We, tag: Ue, text: Ie, url: E }; -var Xe = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; -var N = { ...X, emStrongRDelimAst: Ge, emStrongLDelim: He, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; -var ge = (l3) => Ve[l3]; -function w(l3, e) { +var X = { _backpedal: I, anyPunctuation: Ne, autolink: Fe, blockSkip: qe, br: le, code: Ae, del: I, emStrongLDelim: ve, emStrongRDelimAst: He, emStrongRDelimUnd: Ge, escape: ze, link: Ue, nolink: ke, punctuation: Ee, reflink: de, reflinkSearch: Ke, tag: Qe, text: Ie, url: I }; +var We = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; +var N = { ...X, emStrongRDelimAst: Ze, emStrongLDelim: De, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; +var ge = (u3) => Je[u3]; +function w(u3, e) { if (e) { - if (m.escapeTest.test(l3)) return l3.replace(m.escapeReplace, ge); - } else if (m.escapeTestNoEncode.test(l3)) return l3.replace(m.escapeReplaceNoEncode, ge); - return l3; + if (m.escapeTest.test(u3)) return u3.replace(m.escapeReplace, ge); + } else if (m.escapeTestNoEncode.test(u3)) return u3.replace(m.escapeReplaceNoEncode, ge); + return u3; } -function J(l3) { +function J(u3) { try { - l3 = encodeURI(l3).replace(m.percentDecode, "%"); + u3 = encodeURI(u3).replace(m.percentDecode, "%"); } catch { return null; } - return l3; + return u3; } -function V(l3, e) { - let t = l3.replace(m.findPipe, (i, s, a) => { - let o = false, p = s; - for (; --p >= 0 && a[p] === "\\"; ) o = !o; - return o ? "|" : " |"; +function V(u3, e) { + let t = u3.replace(m.findPipe, (i, s, o) => { + let a = false, l = s; + for (; --l >= 0 && o[l] === "\\"; ) a = !a; + return a ? "|" : " |"; }), n = t.split(m.splitPipe), r = 0; if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e) if (n.length > e) n.splice(e); else for (; n.length < e; ) n.push(""); for (; r < n.length; r++) n[r] = n[r].trim().replace(m.slashPipe, "|"); return n; } -function z2(l3, e, t) { - let n = l3.length; +function z2(u3, e, t) { + let n = u3.length; if (n === 0) return ""; let r = 0; for (; r < n; ) { - let i = l3.charAt(n - r - 1); + let i = u3.charAt(n - r - 1); if (i === e && !t) r++; else if (i !== e && t) r++; else break; } - return l3.slice(0, n - r); + return u3.slice(0, n - r); } -function fe(l3, e) { - if (l3.indexOf(e[1]) === -1) return -1; +function fe(u3, e) { + if (u3.indexOf(e[1]) === -1) return -1; let t = 0; - for (let n = 0; n < l3.length; n++) if (l3[n] === "\\") n++; - else if (l3[n] === e[0]) t++; - else if (l3[n] === e[1] && (t--, t < 0)) return n; + for (let n = 0; n < u3.length; n++) if (u3[n] === "\\") n++; + else if (u3[n] === e[0]) t++; + else if (u3[n] === e[1] && (t--, t < 0)) return n; return t > 0 ? -2 : -1; } -function me(l3, e, t, n, r) { - let i = e.href, s = e.title || null, a = l3[1].replace(r.other.outputLinkReplace, "$1"); +function me(u3, e, t, n, r) { + let i = e.href, s = e.title || null, o = u3[1].replace(r.other.outputLinkReplace, "$1"); n.state.inLink = true; - let o = { type: l3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: a, tokens: n.inlineTokens(a) }; - return n.state.inLink = false, o; + let a = { type: u3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: o, tokens: n.inlineTokens(o) }; + return n.state.inLink = false, a; } -function Ye(l3, e, t) { - let n = l3.match(t.other.indentCodeCompensation); +function Ve(u3, e, t) { + let n = u3.match(t.other.indentCodeCompensation); if (n === null) return e; let r = n[1]; return e.split(` `).map((i) => { let s = i.match(t.other.beginningSpace); if (s === null) return i; - let [a] = s; - return a.length >= r.length ? i.slice(r.length) : i; + let [o] = s; + return o.length >= r.length ? i.slice(r.length) : i; }).join(` `); } @@ -35819,7 +30205,7 @@ var y = class { fences(e) { let t = this.rules.block.fences.exec(e); if (t) { - let n = t[0], r = Ye(n, t[3] || "", this.rules); + let n = t[0], r = Ve(n, t[3] || "", this.rules); return { type: "code", raw: n, lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2], text: r }; } } @@ -35846,19 +30232,19 @@ var y = class { `).split(` `), r = "", i = "", s = []; for (; n.length > 0; ) { - let a = false, o = [], p; - for (p = 0; p < n.length; p++) if (this.rules.other.blockquoteStart.test(n[p])) o.push(n[p]), a = true; - else if (!a) o.push(n[p]); + let o = false, a = [], l; + for (l = 0; l < n.length; l++) if (this.rules.other.blockquoteStart.test(n[l])) a.push(n[l]), o = true; + else if (!o) a.push(n[l]); else break; - n = n.slice(p); - let u = o.join(` -`), c = u.replace(this.rules.other.blockquoteSetextReplace, ` + n = n.slice(l); + let c = a.join(` +`), p = c.replace(this.rules.other.blockquoteSetextReplace, ` $1`).replace(this.rules.other.blockquoteSetextReplace2, ""); r = r ? `${r} -${u}` : u, i = i ? `${i} -${c}` : c; +${c}` : c, i = i ? `${i} +${p}` : p; let g = this.lexer.state.top; - if (this.lexer.state.top = true, this.lexer.blockTokens(c, s, true), this.lexer.state.top = g, n.length === 0) break; + if (this.lexer.state.top = true, this.lexer.blockTokens(p, s, true), this.lexer.state.top = g, n.length === 0) break; let h = s.at(-1); if (h?.type === "code") break; if (h?.type === "blockquote") { @@ -35884,45 +30270,45 @@ ${c}` : c; if (t) { let n = t[1].trim(), r = n.length > 1, i = { type: "list", raw: "", ordered: r, start: r ? +n.slice(0, -1) : "", loose: false, items: [] }; n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); - let s = this.rules.other.listItemRegex(n), a = false; + let s = this.rules.other.listItemRegex(n), o = false; for (; e; ) { - let p = false, u = "", c = ""; + let l = false, c = "", p = ""; if (!(t = s.exec(e)) || this.rules.block.hr.test(e)) break; - u = t[0], e = e.substring(u.length); + c = t[0], e = e.substring(c.length); let g = t[2].split(` `, 1)[0].replace(this.rules.other.listReplaceTabs, (H) => " ".repeat(3 * H.length)), h = e.split(` `, 1)[0], R = !g.trim(), f = 0; - if (this.options.pedantic ? (f = 2, c = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, c = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (u += h + ` -`, e = e.substring(h.length + 1), p = true), !p) { + if (this.options.pedantic ? (f = 2, p = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, p = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (c += h + ` +`, e = e.substring(h.length + 1), l = true), !l) { let H = this.rules.other.nextBulletRegex(f), ee = this.rules.other.hrRegex(f), te = this.rules.other.fencesBeginRegex(f), ne = this.rules.other.headingBeginRegex(f), xe = this.rules.other.htmlBeginRegex(f); for (; e; ) { let Z = e.split(` `, 1)[0], A; if (h = Z, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, " "), A = h) : A = h.replace(this.rules.other.tabCharGlobal, " "), te.test(h) || ne.test(h) || xe.test(h) || H.test(h) || ee.test(h)) break; - if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) c += ` + if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) p += ` ` + A.slice(f); else { if (R || g.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || te.test(g) || ne.test(g) || ee.test(g)) break; - c += ` + p += ` ` + h; } - !R && !h.trim() && (R = true), u += Z + ` + !R && !h.trim() && (R = true), c += Z + ` `, e = e.substring(Z.length + 1), g = A.slice(f); } } - i.loose || (a ? i.loose = true : this.rules.other.doubleBlankLine.test(u) && (a = true)); + i.loose || (o ? i.loose = true : this.rules.other.doubleBlankLine.test(c) && (o = true)); let O = null, Y; - this.options.gfm && (O = this.rules.other.listIsTask.exec(c), O && (Y = O[0] !== "[ ] ", c = c.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: u, task: !!O, checked: Y, loose: false, text: c, tokens: [] }), i.raw += u; + this.options.gfm && (O = this.rules.other.listIsTask.exec(p), O && (Y = O[0] !== "[ ] ", p = p.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: c, task: !!O, checked: Y, loose: false, text: p, tokens: [] }), i.raw += c; } - let o = i.items.at(-1); - if (o) o.raw = o.raw.trimEnd(), o.text = o.text.trimEnd(); + let a = i.items.at(-1); + if (a) a.raw = a.raw.trimEnd(), a.text = a.text.trimEnd(); else return; i.raw = i.raw.trimEnd(); - for (let p = 0; p < i.items.length; p++) if (this.lexer.state.top = false, i.items[p].tokens = this.lexer.blockTokens(i.items[p].text, []), !i.loose) { - let u = i.items[p].tokens.filter((g) => g.type === "space"), c = u.length > 0 && u.some((g) => this.rules.other.anyLine.test(g.raw)); - i.loose = c; + for (let l = 0; l < i.items.length; l++) if (this.lexer.state.top = false, i.items[l].tokens = this.lexer.blockTokens(i.items[l].text, []), !i.loose) { + let c = i.items[l].tokens.filter((g) => g.type === "space"), p = c.length > 0 && c.some((g) => this.rules.other.anyLine.test(g.raw)); + i.loose = p; } - if (i.loose) for (let p = 0; p < i.items.length; p++) i.items[p].loose = true; + if (i.loose) for (let l = 0; l < i.items.length; l++) i.items[l].loose = true; return i; } } @@ -35943,9 +30329,9 @@ ${c}` : c; let n = V(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(` `) : [], s = { type: "table", raw: t[0], header: [], align: [], rows: [] }; if (n.length === r.length) { - for (let a of r) this.rules.other.tableAlignRight.test(a) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(a) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(a) ? s.align.push("left") : s.align.push(null); - for (let a = 0; a < n.length; a++) s.header.push({ text: n[a], tokens: this.lexer.inline(n[a]), header: true, align: s.align[a] }); - for (let a of i) s.rows.push(V(a, s.header.length).map((o, p) => ({ text: o, tokens: this.lexer.inline(o), header: false, align: s.align[p] }))); + for (let o of r) this.rules.other.tableAlignRight.test(o) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(o) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(o) ? s.align.push("left") : s.align.push(null); + for (let o = 0; o < n.length; o++) s.header.push({ text: n[o], tokens: this.lexer.inline(n[o]), header: true, align: s.align[o] }); + for (let o of i) s.rows.push(V(o, s.header.length).map((a, l) => ({ text: a, tokens: this.lexer.inline(a), header: false, align: s.align[l] }))); return s; } } @@ -35985,8 +30371,8 @@ ${c}` : c; let s = fe(t[2], "()"); if (s === -2) return; if (s > -1) { - let o = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; - t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, o).trim(), t[3] = ""; + let a = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; + t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, a).trim(), t[3] = ""; } } let r = t[2], i = ""; @@ -36012,20 +30398,20 @@ ${c}` : c; let r = this.rules.inline.emStrongLDelim.exec(e); if (!r || r[3] && n.match(this.rules.other.unicodeAlphaNumeric)) return; if (!(r[1] || r[2] || "") || !n || this.rules.inline.punctuation.exec(n)) { - let s = [...r[0]].length - 1, a, o, p = s, u = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; - for (c.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = c.exec(t)) != null; ) { - if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a) continue; - if (o = [...a].length, r[3] || r[4]) { - p += o; + let s = [...r[0]].length - 1, o, a, l = s, c = 0, p = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + for (p.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = p.exec(t)) != null; ) { + if (o = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !o) continue; + if (a = [...o].length, r[3] || r[4]) { + l += a; continue; - } else if ((r[5] || r[6]) && s % 3 && !((s + o) % 3)) { - u += o; + } else if ((r[5] || r[6]) && s % 3 && !((s + a) % 3)) { + c += a; continue; } - if (p -= o, p > 0) continue; - o = Math.min(o, o + p + u); - let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + o); - if (Math.min(s, o) % 2) { + if (l -= a, l > 0) continue; + a = Math.min(a, a + l + c); + let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + a); + if (Math.min(s, a) % 2) { let f = h.slice(1, -1); return { type: "em", raw: h, text: f, tokens: this.lexer.inlineTokens(f) }; } @@ -36079,7 +30465,7 @@ ${c}` : c; } } }; -var x = class l { +var x = class u { tokens; options; state; @@ -36094,10 +30480,10 @@ var x = class l { return { block: C, inline: M }; } static lex(e, t) { - return new l(t).lex(e); + return new u(t).lex(e); } static lexInline(e, t) { - return new l(t).inlineTokens(e); + return new u(t).inlineTokens(e); } lex(e) { e = e.replace(m.carriageReturn, ` @@ -36171,9 +30557,9 @@ var x = class l { } let i = e; if (this.options.extensions?.startBlock) { - let s = 1 / 0, a = e.slice(1), o; - this.options.extensions.startBlock.forEach((p) => { - o = p.call({ lexer: this }, a), typeof o == "number" && o >= 0 && (s = Math.min(s, o)); + let s = 1 / 0, o = e.slice(1), a; + this.options.extensions.startBlock.forEach((l) => { + a = l.call({ lexer: this }, o), typeof a == "number" && a >= 0 && (s = Math.min(s, a)); }), s < 1 / 0 && s >= 0 && (i = e.substring(0, s + 1)); } if (this.state.top && (r = this.tokenizer.paragraph(i))) { @@ -36213,14 +30599,13 @@ var x = class l { if (o.length > 0) for (; (r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) != null; ) o.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); } for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null; ) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); - let i; - for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) i = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i) + "[" + "a".repeat(r[0].length - i - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n; - let s = false, a = ""; + let i = false, s = ""; for (; e; ) { - s || (a = ""), s = false; + i || (s = ""), i = false; let o; - if (this.options.extensions?.inline?.some((u) => (o = u.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; + if (this.options.extensions?.inline?.some((l) => (o = l.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; if (o = this.tokenizer.escape(e)) { e = e.substring(o.raw.length), t.push(o); continue; @@ -36235,11 +30620,11 @@ var x = class l { } if (o = this.tokenizer.reflink(e, this.tokens.links)) { e = e.substring(o.raw.length); - let u = t.at(-1); - o.type === "text" && u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); + let l = t.at(-1); + o.type === "text" && l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); continue; } - if (o = this.tokenizer.emStrong(e, n, a)) { + if (o = this.tokenizer.emStrong(e, n, s)) { e = e.substring(o.raw.length), t.push(o); continue; } @@ -36263,25 +30648,25 @@ var x = class l { e = e.substring(o.raw.length), t.push(o); continue; } - let p = e; + let a = e; if (this.options.extensions?.startInline) { - let u = 1 / 0, c = e.slice(1), g; - this.options.extensions.startInline.forEach((h) => { - g = h.call({ lexer: this }, c), typeof g == "number" && g >= 0 && (u = Math.min(u, g)); - }), u < 1 / 0 && u >= 0 && (p = e.substring(0, u + 1)); - } - if (o = this.tokenizer.inlineText(p)) { - e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (a = o.raw.slice(-1)), s = true; - let u = t.at(-1); - u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); + let l = 1 / 0, c = e.slice(1), p; + this.options.extensions.startInline.forEach((g) => { + p = g.call({ lexer: this }, c), typeof p == "number" && p >= 0 && (l = Math.min(l, p)); + }), l < 1 / 0 && l >= 0 && (a = e.substring(0, l + 1)); + } + if (o = this.tokenizer.inlineText(a)) { + e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (s = o.raw.slice(-1)), i = true; + let l = t.at(-1); + l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); continue; } if (e) { - let u = "Infinite loop on byte: " + e.charCodeAt(0); + let l = "Infinite loop on byte: " + e.charCodeAt(0); if (this.options.silent) { - console.error(u); + console.error(l); break; - } else throw new Error(u); + } else throw new Error(l); } } return t; @@ -36324,9 +30709,9 @@ ${this.parser.parse(e)} } list(e) { let t = e.ordered, n = e.start, r = ""; - for (let a = 0; a < e.items.length; a++) { - let o = e.items[a]; - r += this.listitem(o); + for (let o = 0; o < e.items.length; o++) { + let a = e.items[o]; + r += this.listitem(a); } let i = t ? "ol" : "ul", s = t && n !== 1 ? ' start="' + n + '"' : ""; return "<" + i + s + `> @@ -36357,7 +30742,7 @@ ${this.parser.parse(e)} for (let i = 0; i < e.rows.length; i++) { let s = e.rows[i]; n = ""; - for (let a = 0; a < s.length; a++) n += this.tablecell(s[a]); + for (let o = 0; o < s.length; o++) n += this.tablecell(s[o]); r += this.tablerow({ text: n }); } return r && (r = `${r}`), `
@@ -36439,7 +30824,7 @@ var $ = class { return ""; } }; -var b = class l2 { +var b = class u2 { options; renderer; textRenderer; @@ -36447,19 +30832,19 @@ var b = class l2 { this.options = e || T, this.options.renderer = this.options.renderer || new P(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new $(); } static parse(e, t) { - return new l2(t).parse(e); + return new u2(t).parse(e); } static parseInline(e, t) { - return new l2(t).parseInline(e); + return new u2(t).parseInline(e); } parse(e, t = true) { let n = ""; for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let a = i, o = this.options.extensions.renderers[a.type].call({ parser: this }, a); - if (o !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(a.type)) { - n += o || ""; + let o = i, a = this.options.extensions.renderers[o.type].call({ parser: this }, o); + if (a !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(o.type)) { + n += a || ""; continue; } } @@ -36506,16 +30891,16 @@ var b = class l2 { continue; } case "text": { - let a = s, o = this.renderer.text(a); - for (; r + 1 < e.length && e[r + 1].type === "text"; ) a = e[++r], o += ` -` + this.renderer.text(a); - t ? n += this.renderer.paragraph({ type: "paragraph", raw: o, text: o, tokens: [{ type: "text", raw: o, text: o, escaped: true }] }) : n += o; + let o = s, a = this.renderer.text(o); + for (; r + 1 < e.length && e[r + 1].type === "text"; ) o = e[++r], a += ` +` + this.renderer.text(o); + t ? n += this.renderer.paragraph({ type: "paragraph", raw: a, text: a, tokens: [{ type: "text", raw: a, text: a, escaped: true }] }) : n += a; continue; } default: { - let a = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(a), ""; - throw new Error(a); + let o = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(o), ""; + throw new Error(o); } } } @@ -36526,9 +30911,9 @@ var b = class l2 { for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let a = this.options.extensions.renderers[i.type].call({ parser: this }, i); - if (a !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { - n += a || ""; + let o = this.options.extensions.renderers[i.type].call({ parser: this }, i); + if (o !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { + n += o || ""; continue; } } @@ -36575,9 +30960,9 @@ var b = class l2 { break; } default: { - let a = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(a), ""; - throw new Error(a); + let o = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(o), ""; + throw new Error(o); } } } @@ -36631,7 +31016,7 @@ var B = class { case "table": { let i = r; for (let s of i.header) n = n.concat(this.walkTokens(s.tokens, t)); - for (let s of i.rows) for (let a of s) n = n.concat(this.walkTokens(a.tokens, t)); + for (let s of i.rows) for (let o of s) n = n.concat(this.walkTokens(o.tokens, t)); break; } case "list": { @@ -36642,8 +31027,8 @@ var B = class { default: { let i = r; this.defaults.extensions?.childTokens?.[i.type] ? this.defaults.extensions.childTokens[i.type].forEach((s) => { - let a = i[s].flat(1 / 0); - n = n.concat(this.walkTokens(a, t)); + let o = i[s].flat(1 / 0); + n = n.concat(this.walkTokens(o, t)); }) : i.tokens && (n = n.concat(this.walkTokens(i.tokens, t))); } } @@ -36657,9 +31042,9 @@ var B = class { if (!i.name) throw new Error("extension name required"); if ("renderer" in i) { let s = t.renderers[i.name]; - s ? t.renderers[i.name] = function(...a) { - let o = i.renderer.apply(this, a); - return o === false && (o = s.apply(this, a)), o; + s ? t.renderers[i.name] = function(...o) { + let a = i.renderer.apply(this, o); + return a === false && (a = s.apply(this, o)), a; } : t.renderers[i.name] = i.renderer; } if ("tokenizer" in i) { @@ -36673,10 +31058,10 @@ var B = class { for (let s in n.renderer) { if (!(s in i)) throw new Error(`renderer '${s}' does not exist`); if (["options", "parser"].includes(s)) continue; - let a = s, o = n.renderer[a], p = i[a]; - i[a] = (...u) => { - let c = o.apply(i, u); - return c === false && (c = p.apply(i, u)), c || ""; + let o = s, a = n.renderer[o], l = i[o]; + i[o] = (...c) => { + let p = a.apply(i, c); + return p === false && (p = l.apply(i, c)), p || ""; }; } r.renderer = i; @@ -36686,10 +31071,10 @@ var B = class { for (let s in n.tokenizer) { if (!(s in i)) throw new Error(`tokenizer '${s}' does not exist`); if (["options", "rules", "lexer"].includes(s)) continue; - let a = s, o = n.tokenizer[a], p = i[a]; - i[a] = (...u) => { - let c = o.apply(i, u); - return c === false && (c = p.apply(i, u)), c; + let o = s, a = n.tokenizer[o], l = i[o]; + i[o] = (...c) => { + let p = a.apply(i, c); + return p === false && (p = l.apply(i, c)), p; }; } r.tokenizer = i; @@ -36699,30 +31084,30 @@ var B = class { for (let s in n.hooks) { if (!(s in i)) throw new Error(`hook '${s}' does not exist`); if (["options", "block"].includes(s)) continue; - let a = s, o = n.hooks[a], p = i[a]; - S.passThroughHooks.has(s) ? i[a] = (u) => { + let o = s, a = n.hooks[o], l = i[o]; + S.passThroughHooks.has(s) ? i[o] = (c) => { if (this.defaults.async && S.passThroughHooksRespectAsync.has(s)) return (async () => { - let g = await o.call(i, u); - return p.call(i, g); + let g = await a.call(i, c); + return l.call(i, g); })(); - let c = o.call(i, u); - return p.call(i, c); - } : i[a] = (...u) => { + let p = a.call(i, c); + return l.call(i, p); + } : i[o] = (...c) => { if (this.defaults.async) return (async () => { - let g = await o.apply(i, u); - return g === false && (g = await p.apply(i, u)), g; + let g = await a.apply(i, c); + return g === false && (g = await l.apply(i, c)), g; })(); - let c = o.apply(i, u); - return c === false && (c = p.apply(i, u)), c; + let p = a.apply(i, c); + return p === false && (p = l.apply(i, c)), p; }; } r.hooks = i; } if (n.walkTokens) { let i = this.defaults.walkTokens, s = n.walkTokens; - r.walkTokens = function(a) { - let o = []; - return o.push(s.call(this, a)), i && (o = o.concat(i.call(this, a))), o; + r.walkTokens = function(o) { + let a = []; + return a.push(s.call(this, o)), i && (a = a.concat(i.call(this, o))), a; }; } this.defaults = { ...this.defaults, ...r }; @@ -36739,24 +31124,24 @@ var B = class { } parseMarkdown(e) { return (n, r) => { - let i = { ...r }, s = { ...this.defaults, ...i }, a = this.onError(!!s.silent, !!s.async); - if (this.defaults.async === true && i.async === false) return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); - if (typeof n > "u" || n === null) return a(new Error("marked(): input parameter is undefined or null")); - if (typeof n != "string") return a(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); + let i = { ...r }, s = { ...this.defaults, ...i }, o = this.onError(!!s.silent, !!s.async); + if (this.defaults.async === true && i.async === false) return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + if (typeof n > "u" || n === null) return o(new Error("marked(): input parameter is undefined or null")); + if (typeof n != "string") return o(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); if (s.hooks && (s.hooks.options = s, s.hooks.block = e), s.async) return (async () => { - let o = s.hooks ? await s.hooks.preprocess(n) : n, u = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(o, s), c = s.hooks ? await s.hooks.processAllTokens(u) : u; - s.walkTokens && await Promise.all(this.walkTokens(c, s.walkTokens)); - let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(c, s); + let a = s.hooks ? await s.hooks.preprocess(n) : n, c = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(a, s), p = s.hooks ? await s.hooks.processAllTokens(c) : c; + s.walkTokens && await Promise.all(this.walkTokens(p, s.walkTokens)); + let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); return s.hooks ? await s.hooks.postprocess(h) : h; - })().catch(a); + })().catch(o); try { s.hooks && (n = s.hooks.preprocess(n)); - let p = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); - s.hooks && (p = s.hooks.processAllTokens(p)), s.walkTokens && this.walkTokens(p, s.walkTokens); - let c = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); - return s.hooks && (c = s.hooks.postprocess(c)), c; - } catch (o) { - return a(o); + let l = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); + s.hooks && (l = s.hooks.processAllTokens(l)), s.walkTokens && this.walkTokens(l, s.walkTokens); + let p = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(l, s); + return s.hooks && (p = s.hooks.postprocess(p)), p; + } catch (a) { + return o(a); } }; } @@ -36773,19 +31158,19 @@ Please report this to https://github.com/markedjs/marked.`, e) { } }; var _ = new B(); -function k(l3, e) { - return _.parse(l3, e); +function k(u3, e) { + return _.parse(u3, e); } -k.options = k.setOptions = function(l3) { - return _.setOptions(l3), k.defaults = _.defaults, G(k.defaults), k; +k.options = k.setOptions = function(u3) { + return _.setOptions(u3), k.defaults = _.defaults, G(k.defaults), k; }; k.getDefaults = L; k.defaults = T; -k.use = function(...l3) { - return _.use(...l3), k.defaults = _.defaults, G(k.defaults), k; +k.use = function(...u3) { + return _.use(...u3), k.defaults = _.defaults, G(k.defaults), k; }; -k.walkTokens = function(l3, e) { - return _.walkTokens(l3, e); +k.walkTokens = function(u3, e) { + return _.walkTokens(u3, e); }; k.parseInline = _.parseInline; k.Parser = b; @@ -36797,13 +31182,13 @@ k.lexer = x.lex; k.Tokenizer = y; k.Hooks = S; k.parse = k; -var Zt = k.options; -var Gt = k.setOptions; -var Nt = k.use; -var Ft = k.walkTokens; -var jt = k.parseInline; -var Ut = b.parse; -var Kt = x.lex; +var Ht = k.options; +var Zt = k.setOptions; +var Gt = k.use; +var Nt = k.walkTokens; +var Ft = k.parseInline; +var Qt = b.parse; +var Ut = x.lex; // src/show.ts function formatConversationAsMarkdown(jsonl, startLine, endLine) { From e0792eb48e49baf1db4f737f2179d5171a42736b Mon Sep 17 00:00:00 2001 From: HengYang Date: Sun, 11 Oct 2026 12:29:34 +0800 Subject: [PATCH 29/33] build: retain native MCP scope without dependency churn --- dist/mcp-server.js | 6856 ++++---------------------------------------- 1 file changed, 620 insertions(+), 6236 deletions(-) diff --git a/dist/mcp-server.js b/dist/mcp-server.js index a6862460..f1f75c14 100644 --- a/dist/mcp-server.js +++ b/dist/mcp-server.js @@ -6,11 +6,7 @@ var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { - try { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - } catch (e) { - throw mod = 0, e; - } + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) @@ -33,9 +29,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge mod )); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js +// node_modules/ajv/dist/compile/codegen/code.js var require_code = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "node_modules/ajv/dist/compile/codegen/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; @@ -187,9 +183,9 @@ var require_code = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js +// node_modules/ajv/dist/compile/codegen/scope.js var require_scope = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "node_modules/ajv/dist/compile/codegen/scope.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; @@ -332,9 +328,9 @@ var require_scope = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js +// node_modules/ajv/dist/compile/codegen/index.js var require_codegen = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "node_modules/ajv/dist/compile/codegen/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; @@ -1052,9 +1048,9 @@ var require_codegen = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js +// node_modules/ajv/dist/compile/util.js var require_util = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/util.js"(exports) { + "node_modules/ajv/dist/compile/util.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; @@ -1219,9 +1215,9 @@ var require_util = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js +// node_modules/ajv/dist/compile/names.js var require_names = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/names.js"(exports) { + "node_modules/ajv/dist/compile/names.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -1258,9 +1254,9 @@ var require_names = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js +// node_modules/ajv/dist/compile/errors.js var require_errors = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/errors.js"(exports) { + "node_modules/ajv/dist/compile/errors.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; @@ -1380,9 +1376,9 @@ var require_errors = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js +// node_modules/ajv/dist/compile/validate/boolSchema.js var require_boolSchema = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; @@ -1431,9 +1427,9 @@ var require_boolSchema = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js +// node_modules/ajv/dist/compile/rules.js var require_rules = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/rules.js"(exports) { + "node_modules/ajv/dist/compile/rules.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getRules = exports.isJSONType = void 0; @@ -1462,9 +1458,9 @@ var require_rules = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js +// node_modules/ajv/dist/compile/validate/applicability.js var require_applicability = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "node_modules/ajv/dist/compile/validate/applicability.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; @@ -1485,9 +1481,9 @@ var require_applicability = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js +// node_modules/ajv/dist/compile/validate/dataType.js var require_dataType = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "node_modules/ajv/dist/compile/validate/dataType.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; @@ -1669,9 +1665,9 @@ var require_dataType = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js +// node_modules/ajv/dist/compile/validate/defaults.js var require_defaults = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "node_modules/ajv/dist/compile/validate/defaults.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.assignDefaults = void 0; @@ -1706,9 +1702,9 @@ var require_defaults = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js +// node_modules/ajv/dist/vocabularies/code.js var require_code2 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/code.js"(exports) { + "node_modules/ajv/dist/vocabularies/code.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; @@ -1779,13 +1775,13 @@ var require_code2 = __commonJS({ exports.callValidateCode = callValidateCode; var newRegExp = (0, codegen_1._)`new RegExp`; function usePattern({ gen, it: { opts } }, pattern) { - const u = opts.unicodeRegExp ? "u" : ""; + const u3 = opts.unicodeRegExp ? "u" : ""; const { regExp } = opts.code; - const rx = regExp(pattern, u); + const rx = regExp(pattern, u3); return gen.scopeValue("pattern", { key: rx.toString(), ref: rx, - code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u3})` }); } exports.usePattern = usePattern; @@ -1839,9 +1835,9 @@ var require_code2 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js +// node_modules/ajv/dist/compile/validate/keyword.js var require_keyword = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "node_modules/ajv/dist/compile/validate/keyword.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; @@ -1957,9 +1953,9 @@ var require_keyword = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js +// node_modules/ajv/dist/compile/validate/subschema.js var require_subschema = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "node_modules/ajv/dist/compile/validate/subschema.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; @@ -2163,9 +2159,9 @@ var require_json_schema_traverse = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js +// node_modules/ajv/dist/compile/resolve.js var require_resolve = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/resolve.js"(exports) { + "node_modules/ajv/dist/compile/resolve.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; @@ -2319,9 +2315,9 @@ var require_resolve = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js +// node_modules/ajv/dist/compile/validate/index.js var require_validate = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/validate/index.js"(exports) { + "node_modules/ajv/dist/compile/validate/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; @@ -2827,9 +2823,9 @@ var require_validate = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js +// node_modules/ajv/dist/runtime/validation_error.js var require_validation_error = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "node_modules/ajv/dist/runtime/validation_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ValidationError = class extends Error { @@ -2843,9 +2839,9 @@ var require_validation_error = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js +// node_modules/ajv/dist/compile/ref_error.js var require_ref_error = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/ref_error.js"(exports) { + "node_modules/ajv/dist/compile/ref_error.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var resolve_1 = require_resolve(); @@ -2860,9 +2856,9 @@ var require_ref_error = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js +// node_modules/ajv/dist/compile/index.js var require_compile = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/compile/index.js"(exports) { + "node_modules/ajv/dist/compile/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; @@ -3084,9 +3080,9 @@ var require_compile = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json +// node_modules/ajv/dist/refs/data.json var require_data = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/data.json"(exports, module) { + "node_modules/ajv/dist/refs/data.json"(exports, module) { module.exports = { $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", @@ -4221,9 +4217,9 @@ var require_fast_uri = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js +// node_modules/ajv/dist/runtime/uri.js var require_uri = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/uri.js"(exports) { + "node_modules/ajv/dist/runtime/uri.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var uri = require_fast_uri(); @@ -4232,9 +4228,9 @@ var require_uri = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js +// node_modules/ajv/dist/core.js var require_core = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/core.js"(exports) { + "node_modules/ajv/dist/core.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; @@ -4843,9 +4839,9 @@ var require_core = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js +// node_modules/ajv/dist/vocabularies/core/id.js var require_id = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "node_modules/ajv/dist/vocabularies/core/id.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var def = { @@ -4858,9 +4854,9 @@ var require_id = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js +// node_modules/ajv/dist/vocabularies/core/ref.js var require_ref = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.callRef = exports.getValidate = void 0; @@ -4980,9 +4976,9 @@ var require_ref = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js +// node_modules/ajv/dist/vocabularies/core/index.js var require_core2 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/core/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var id_1 = require_id(); @@ -5001,9 +4997,9 @@ var require_core2 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +// node_modules/ajv/dist/vocabularies/validation/limitNumber.js var require_limitNumber = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5033,9 +5029,9 @@ var require_limitNumber = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +// node_modules/ajv/dist/vocabularies/validation/multipleOf.js var require_multipleOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5061,9 +5057,9 @@ var require_multipleOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js +// node_modules/ajv/dist/runtime/ucs2length.js var require_ucs2length = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "node_modules/ajv/dist/runtime/ucs2length.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function ucs2length(str) { @@ -5087,9 +5083,9 @@ var require_ucs2length = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js +// node_modules/ajv/dist/vocabularies/validation/limitLength.js var require_limitLength = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5119,9 +5115,9 @@ var require_limitLength = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js +// node_modules/ajv/dist/vocabularies/validation/pattern.js var require_pattern = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5139,12 +5135,12 @@ var require_pattern = __commonJS({ error: error61, code(cxt) { const { gen, data, $data, schema, schemaCode, it } = cxt; - const u = it.opts.unicodeRegExp ? "u" : ""; + const u3 = it.opts.unicodeRegExp ? "u" : ""; if ($data) { const { regExp } = it.opts.code; const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); const valid = gen.let("valid"); - gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u3}).test(${data})`), () => gen.assign(valid, false)); cxt.fail$data((0, codegen_1._)`!${valid}`); } else { const regExp = (0, code_1.usePattern)(cxt, schema); @@ -5156,9 +5152,9 @@ var require_pattern = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +// node_modules/ajv/dist/vocabularies/validation/limitProperties.js var require_limitProperties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5185,9 +5181,9 @@ var require_limitProperties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js +// node_modules/ajv/dist/vocabularies/validation/required.js var require_required = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5267,9 +5263,9 @@ var require_required = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js +// node_modules/ajv/dist/vocabularies/validation/limitItems.js var require_limitItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5296,9 +5292,9 @@ var require_limitItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js +// node_modules/ajv/dist/runtime/equal.js var require_equal = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/runtime/equal.js"(exports) { + "node_modules/ajv/dist/runtime/equal.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var equal = require_fast_deep_equal(); @@ -5307,9 +5303,9 @@ var require_equal = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +// node_modules/ajv/dist/vocabularies/validation/uniqueItems.js var require_uniqueItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var dataType_1 = require_dataType(); @@ -5374,9 +5370,9 @@ var require_uniqueItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js +// node_modules/ajv/dist/vocabularies/validation/const.js var require_const = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5403,9 +5399,9 @@ var require_const = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js +// node_modules/ajv/dist/vocabularies/validation/enum.js var require_enum = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5452,9 +5448,9 @@ var require_enum = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js +// node_modules/ajv/dist/vocabularies/validation/index.js var require_validation = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var limitNumber_1 = require_limitNumber(); @@ -5490,9 +5486,9 @@ var require_validation = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +// node_modules/ajv/dist/vocabularies/applicator/additionalItems.js var require_additionalItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateAdditionalItems = void 0; @@ -5543,9 +5539,9 @@ var require_additionalItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js +// node_modules/ajv/dist/vocabularies/applicator/items.js var require_items = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateTuple = void 0; @@ -5587,10 +5583,10 @@ var require_items = __commonJS({ }); function checkStrictTuple(sch) { const { opts, errSchemaPath } = it; - const l3 = schArr.length; - const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); + const l = schArr.length; + const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false); if (opts.strictTuples && !fullTuple) { - const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + const msg = `"${keyword}" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); } } @@ -5600,9 +5596,9 @@ var require_items = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +// node_modules/ajv/dist/vocabularies/applicator/prefixItems.js var require_prefixItems = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var items_1 = require_items(); @@ -5617,9 +5613,9 @@ var require_prefixItems = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js +// node_modules/ajv/dist/vocabularies/applicator/items2020.js var require_items2020 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5652,9 +5648,9 @@ var require_items2020 = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js +// node_modules/ajv/dist/vocabularies/applicator/contains.js var require_contains = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5746,9 +5742,9 @@ var require_contains = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +// node_modules/ajv/dist/vocabularies/applicator/dependencies.js var require_dependencies = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; @@ -5840,9 +5836,9 @@ var require_dependencies = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +// node_modules/ajv/dist/vocabularies/applicator/propertyNames.js var require_propertyNames = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -5883,9 +5879,9 @@ var require_propertyNames = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +// node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js var require_additionalProperties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -5989,9 +5985,9 @@ var require_additionalProperties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js +// node_modules/ajv/dist/vocabularies/applicator/properties.js var require_properties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var validate_1 = require_validate(); @@ -6047,9 +6043,9 @@ var require_properties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +// node_modules/ajv/dist/vocabularies/applicator/patternProperties.js var require_patternProperties = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6121,9 +6117,9 @@ var require_patternProperties = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js +// node_modules/ajv/dist/vocabularies/applicator/not.js var require_not = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6152,9 +6148,9 @@ var require_not = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +// node_modules/ajv/dist/vocabularies/applicator/anyOf.js var require_anyOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var code_1 = require_code2(); @@ -6169,9 +6165,9 @@ var require_anyOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +// node_modules/ajv/dist/vocabularies/applicator/oneOf.js var require_oneOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); @@ -6227,9 +6223,9 @@ var require_oneOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js +// node_modules/ajv/dist/vocabularies/applicator/allOf.js var require_allOf = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var util_1 = require_util(); @@ -6254,5823 +6250,13 @@ var require_allOf = __commonJS({ } }); -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js +// node_modules/ajv/dist/vocabularies/applicator/if.js var require_if = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen(); - var util_1 = require_util(); - var error61 = { - message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`, - params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}` - }; - var def = { - keyword: "if", - schemaType: ["object", "boolean"], - trackErrors: true, - error: error61, - code(cxt) { - const { gen, parentSchema, it } = cxt; - if (parentSchema.then === void 0 && parentSchema.else === void 0) { - (0, util_1.checkStrictMode)(it, '"if" without "then" and "else" is ignored'); - } - const hasThen = hasSchema(it, "then"); - const hasElse = hasSchema(it, "else"); - if (!hasThen && !hasElse) - return; - const valid = gen.let("valid", true); - const schValid = gen.name("_valid"); - validateIf(); - cxt.reset(); - if (hasThen && hasElse) { - const ifClause = gen.let("ifClause"); - cxt.setParams({ ifClause }); - gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause)); - } else if (hasThen) { - gen.if(schValid, validateClause("then")); - } else { - gen.if((0, codegen_1.not)(schValid), validateClause("else")); - } - cxt.pass(valid, () => cxt.error(true)); - function validateIf() { - const schCxt = cxt.subschema({ - keyword: "if", - compositeRule: true, - createErrors: false, - allErrors: false - }, schValid); - cxt.mergeEvaluated(schCxt); - } - function validateClause(keyword, ifClause) { - return () => { - const schCxt = cxt.subschema({ keyword }, schValid); - gen.assign(valid, schValid); - cxt.mergeValidEvaluated(schCxt, valid); - if (ifClause) - gen.assign(ifClause, (0, codegen_1._)`${keyword}`); - else - cxt.setParams({ ifClause: keyword }); - }; - } - } - }; - function hasSchema(it, keyword) { - const schema = it.schema[keyword]; - return schema !== void 0 && !(0, util_1.alwaysValidSchema)(it, schema); - } - exports.default = def; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js -var require_thenElse = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util(); - var def = { - keyword: ["then", "else"], - schemaType: ["object", "boolean"], - code({ keyword, parentSchema, it }) { - if (parentSchema.if === void 0) - (0, util_1.checkStrictMode)(it, `"${keyword}" without "if" is ignored`); - } - }; - exports.default = def; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js -var require_applicator = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var additionalItems_1 = require_additionalItems(); - var prefixItems_1 = require_prefixItems(); - var items_1 = require_items(); - var items2020_1 = require_items2020(); - var contains_1 = require_contains(); - var dependencies_1 = require_dependencies(); - var propertyNames_1 = require_propertyNames(); - var additionalProperties_1 = require_additionalProperties(); - var properties_1 = require_properties(); - var patternProperties_1 = require_patternProperties(); - var not_1 = require_not(); - var anyOf_1 = require_anyOf(); - var oneOf_1 = require_oneOf(); - var allOf_1 = require_allOf(); - var if_1 = require_if(); - var thenElse_1 = require_thenElse(); - function getApplicator(draft2020 = false) { - const applicator = [ - // any - not_1.default, - anyOf_1.default, - oneOf_1.default, - allOf_1.default, - if_1.default, - thenElse_1.default, - // object - propertyNames_1.default, - additionalProperties_1.default, - dependencies_1.default, - properties_1.default, - patternProperties_1.default - ]; - if (draft2020) - applicator.push(prefixItems_1.default, items2020_1.default); - else - applicator.push(additionalItems_1.default, items_1.default); - applicator.push(contains_1.default); - return applicator; - } - exports.default = getApplicator; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js -var require_format = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen(); - var error61 = { - message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`, - params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}` - }; - var def = { - keyword: "format", - type: ["number", "string"], - schemaType: "string", - $data: true, - error: error61, - code(cxt, ruleType) { - const { gen, data, $data, schema, schemaCode, it } = cxt; - const { opts, errSchemaPath, schemaEnv, self } = it; - if (!opts.validateFormats) - return; - if ($data) - validate$DataFormat(); - else - validateFormat(); - function validate$DataFormat() { - const fmts = gen.scopeValue("formats", { - ref: self.formats, - code: opts.code.formats - }); - const fDef = gen.const("fDef", (0, codegen_1._)`${fmts}[${schemaCode}]`); - const fType = gen.let("fType"); - const format = gen.let("format"); - gen.if((0, codegen_1._)`typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._)`${fDef}.type || "string"`).assign(format, (0, codegen_1._)`${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._)`"string"`).assign(format, fDef)); - cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt())); - function unknownFmt() { - if (opts.strictSchema === false) - return codegen_1.nil; - return (0, codegen_1._)`${schemaCode} && !${format}`; - } - function invalidFmt() { - const callFormat = schemaEnv.$async ? (0, codegen_1._)`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))` : (0, codegen_1._)`${format}(${data})`; - const validData = (0, codegen_1._)`(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`; - return (0, codegen_1._)`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`; - } - } - function validateFormat() { - const formatDef = self.formats[schema]; - if (!formatDef) { - unknownFormat(); - return; - } - if (formatDef === true) - return; - const [fmtType, format, fmtRef] = getFormat(formatDef); - if (fmtType === ruleType) - cxt.pass(validCondition()); - function unknownFormat() { - if (opts.strictSchema === false) { - self.logger.warn(unknownMsg()); - return; - } - throw new Error(unknownMsg()); - function unknownMsg() { - return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`; - } - } - function getFormat(fmtDef) { - const code = fmtDef instanceof RegExp ? (0, codegen_1.regexpCode)(fmtDef) : opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(schema)}` : void 0; - const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code }); - if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) { - return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._)`${fmt}.validate`]; - } - return ["string", fmtDef, fmt]; - } - function validCondition() { - if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) { - if (!schemaEnv.$async) - throw new Error("async format in sync schema"); - return (0, codegen_1._)`await ${fmtRef}(${data})`; - } - return typeof format == "function" ? (0, codegen_1._)`${fmtRef}(${data})` : (0, codegen_1._)`${fmtRef}.test(${data})`; - } - } - } - }; - exports.default = def; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js -var require_format2 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var format_1 = require_format(); - var format = [format_1.default]; - exports.default = format; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js -var require_metadata = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.contentVocabulary = exports.metadataVocabulary = void 0; - exports.metadataVocabulary = [ - "title", - "description", - "default", - "deprecated", - "readOnly", - "writeOnly", - "examples" - ]; - exports.contentVocabulary = [ - "contentMediaType", - "contentEncoding", - "contentSchema" - ]; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js -var require_draft7 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var core_1 = require_core2(); - var validation_1 = require_validation(); - var applicator_1 = require_applicator(); - var format_1 = require_format2(); - var metadata_1 = require_metadata(); - var draft7Vocabularies = [ - core_1.default, - validation_1.default, - (0, applicator_1.default)(), - format_1.default, - metadata_1.metadataVocabulary, - metadata_1.contentVocabulary - ]; - exports.default = draft7Vocabularies; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js -var require_types = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.DiscrError = void 0; - var DiscrError; - (function(DiscrError2) { - DiscrError2["Tag"] = "tag"; - DiscrError2["Mapping"] = "mapping"; - })(DiscrError || (exports.DiscrError = DiscrError = {})); - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js -var require_discriminator = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var codegen_1 = require_codegen(); - var types_1 = require_types(); - var compile_1 = require_compile(); - var ref_error_1 = require_ref_error(); var util_1 = require_util(); - var error61 = { - message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`, - params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}` - }; - var def = { - keyword: "discriminator", - type: "object", - schemaType: "object", - error: error61, - code(cxt) { - const { gen, data, schema, parentSchema, it } = cxt; - const { oneOf } = parentSchema; - if (!it.opts.discriminator) { - throw new Error("discriminator: requires discriminator option"); - } - const tagName = schema.propertyName; - if (typeof tagName != "string") - throw new Error("discriminator: requires propertyName"); - if (schema.mapping) - throw new Error("discriminator: mapping is not supported"); - if (!oneOf) - throw new Error("discriminator: requires oneOf keyword"); - const valid = gen.let("valid", false); - const tag = gen.const("tag", (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(tagName)}`); - gen.if((0, codegen_1._)`typeof ${tag} == "string"`, () => validateMapping(), () => cxt.error(false, { discrError: types_1.DiscrError.Tag, tag, tagName })); - cxt.ok(valid); - function validateMapping() { - const mapping = getMapping(); - gen.if(false); - for (const tagValue in mapping) { - gen.elseIf((0, codegen_1._)`${tag} === ${tagValue}`); - gen.assign(valid, applyTagSchema(mapping[tagValue])); - } - gen.else(); - cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag, tagName }); - gen.endIf(); - } - function applyTagSchema(schemaProp) { - const _valid = gen.name("valid"); - const schCxt = cxt.subschema({ keyword: "oneOf", schemaProp }, _valid); - cxt.mergeEvaluated(schCxt, codegen_1.Name); - return _valid; - } - function getMapping() { - var _a3; - const oneOfMapping = {}; - const topRequired = hasRequired(parentSchema); - let tagRequired = true; - for (let i = 0; i < oneOf.length; i++) { - let sch = oneOf[i]; - if ((sch === null || sch === void 0 ? void 0 : sch.$ref) && !(0, util_1.schemaHasRulesButRef)(sch, it.self.RULES)) { - const ref = sch.$ref; - sch = compile_1.resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref); - if (sch instanceof compile_1.SchemaEnv) - sch = sch.schema; - if (sch === void 0) - throw new ref_error_1.default(it.opts.uriResolver, it.baseId, ref); - } - const propSch = (_a3 = sch === null || sch === void 0 ? void 0 : sch.properties) === null || _a3 === void 0 ? void 0 : _a3[tagName]; - if (typeof propSch != "object") { - throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`); - } - tagRequired = tagRequired && (topRequired || hasRequired(sch)); - addMappings(propSch, i); - } - if (!tagRequired) - throw new Error(`discriminator: "${tagName}" must be required`); - return oneOfMapping; - function hasRequired({ required: required2 }) { - return Array.isArray(required2) && required2.includes(tagName); - } - function addMappings(sch, i) { - if (sch.const) { - addMapping(sch.const, i); - } else if (sch.enum) { - for (const tagValue of sch.enum) { - addMapping(tagValue, i); - } - } else { - throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`); - } - } - function addMapping(tagValue, i) { - if (typeof tagValue != "string" || tagValue in oneOfMapping) { - throw new Error(`discriminator: "${tagName}" values must be unique strings`); - } - oneOfMapping[tagValue] = i; - } - } - } - }; - exports.default = def; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json -var require_json_schema_draft_07 = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { - module.exports = { - $schema: "http://json-schema.org/draft-07/schema#", - $id: "http://json-schema.org/draft-07/schema#", - title: "Core schema meta-schema", - definitions: { - schemaArray: { - type: "array", - minItems: 1, - items: { $ref: "#" } - }, - nonNegativeInteger: { - type: "integer", - minimum: 0 - }, - nonNegativeIntegerDefault0: { - allOf: [{ $ref: "#/definitions/nonNegativeInteger" }, { default: 0 }] - }, - simpleTypes: { - enum: ["array", "boolean", "integer", "null", "number", "object", "string"] - }, - stringArray: { - type: "array", - items: { type: "string" }, - uniqueItems: true, - default: [] - } - }, - type: ["object", "boolean"], - properties: { - $id: { - type: "string", - format: "uri-reference" - }, - $schema: { - type: "string", - format: "uri" - }, - $ref: { - type: "string", - format: "uri-reference" - }, - $comment: { - type: "string" - }, - title: { - type: "string" - }, - description: { - type: "string" - }, - default: true, - readOnly: { - type: "boolean", - default: false - }, - examples: { - type: "array", - items: true - }, - multipleOf: { - type: "number", - exclusiveMinimum: 0 - }, - maximum: { - type: "number" - }, - exclusiveMaximum: { - type: "number" - }, - minimum: { - type: "number" - }, - exclusiveMinimum: { - type: "number" - }, - maxLength: { $ref: "#/definitions/nonNegativeInteger" }, - minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, - pattern: { - type: "string", - format: "regex" - }, - additionalItems: { $ref: "#" }, - items: { - anyOf: [{ $ref: "#" }, { $ref: "#/definitions/schemaArray" }], - default: true - }, - maxItems: { $ref: "#/definitions/nonNegativeInteger" }, - minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, - uniqueItems: { - type: "boolean", - default: false - }, - contains: { $ref: "#" }, - maxProperties: { $ref: "#/definitions/nonNegativeInteger" }, - minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, - required: { $ref: "#/definitions/stringArray" }, - additionalProperties: { $ref: "#" }, - definitions: { - type: "object", - additionalProperties: { $ref: "#" }, - default: {} - }, - properties: { - type: "object", - additionalProperties: { $ref: "#" }, - default: {} - }, - patternProperties: { - type: "object", - additionalProperties: { $ref: "#" }, - propertyNames: { format: "regex" }, - default: {} - }, - dependencies: { - type: "object", - additionalProperties: { - anyOf: [{ $ref: "#" }, { $ref: "#/definitions/stringArray" }] - } - }, - propertyNames: { $ref: "#" }, - const: true, - enum: { - type: "array", - items: true, - minItems: 1, - uniqueItems: true - }, - type: { - anyOf: [ - { $ref: "#/definitions/simpleTypes" }, - { - type: "array", - items: { $ref: "#/definitions/simpleTypes" }, - minItems: 1, - uniqueItems: true - } - ] - }, - format: { type: "string" }, - contentMediaType: { type: "string" }, - contentEncoding: { type: "string" }, - if: { $ref: "#" }, - then: { $ref: "#" }, - else: { $ref: "#" }, - allOf: { $ref: "#/definitions/schemaArray" }, - anyOf: { $ref: "#/definitions/schemaArray" }, - oneOf: { $ref: "#/definitions/schemaArray" }, - not: { $ref: "#" } - }, - default: true - }; - } -}); - -// node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js -var require_ajv = __commonJS({ - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv/dist/ajv.js"(exports, module) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; - var core_1 = require_core(); - var draft7_1 = require_draft7(); - var discriminator_1 = require_discriminator(); - var draft7MetaSchema = require_json_schema_draft_07(); - var META_SUPPORT_DATA = ["/properties"]; - var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema"; - var Ajv2 = class extends core_1.default { - _addVocabularies() { - super._addVocabularies(); - draft7_1.default.forEach((v2) => this.addVocabulary(v2)); - if (this.opts.discriminator) - this.addKeyword(discriminator_1.default); - } - _addDefaultMetaSchema() { - super._addDefaultMetaSchema(); - if (!this.opts.meta) - return; - const metaSchema = this.opts.$data ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA) : draft7MetaSchema; - this.addMetaSchema(metaSchema, META_SCHEMA_ID, false); - this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID; - } - defaultMeta() { - return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0); - } - }; - exports.Ajv = Ajv2; - module.exports = exports = Ajv2; - module.exports.Ajv = Ajv2; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.default = Ajv2; - var validate_1 = require_validate(); - Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { - return validate_1.KeywordCxt; - } }); - var codegen_1 = require_codegen(); - Object.defineProperty(exports, "_", { enumerable: true, get: function() { - return codegen_1._; - } }); - Object.defineProperty(exports, "str", { enumerable: true, get: function() { - return codegen_1.str; - } }); - Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { - return codegen_1.stringify; - } }); - Object.defineProperty(exports, "nil", { enumerable: true, get: function() { - return codegen_1.nil; - } }); - Object.defineProperty(exports, "Name", { enumerable: true, get: function() { - return codegen_1.Name; - } }); - Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { - return codegen_1.CodeGen; - } }); - var validation_error_1 = require_validation_error(); - Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { - return validation_error_1.default; - } }); - var ref_error_1 = require_ref_error(); - Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { - return ref_error_1.default; - } }); - } -}); - -// node_modules/ajv-formats/dist/formats.js -var require_formats = __commonJS({ - "node_modules/ajv-formats/dist/formats.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.formatNames = exports.fastFormats = exports.fullFormats = void 0; - function fmtDef(validate2, compare) { - return { validate: validate2, compare }; - } - exports.fullFormats = { - // date: http://tools.ietf.org/html/rfc3339#section-5.6 - date: fmtDef(date5, compareDate), - // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 - time: fmtDef(getTime(true), compareTime), - "date-time": fmtDef(getDateTime(true), compareDateTime), - "iso-time": fmtDef(getTime(), compareIsoTime), - "iso-date-time": fmtDef(getDateTime(), compareIsoDateTime), - // duration: https://tools.ietf.org/html/rfc3339#appendix-A - duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, - uri, - "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i, - // uri-template: https://tools.ietf.org/html/rfc6570 - "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i, - // For the source: https://gist.github.com/dperini/729294 - // For test cases: https://mathiasbynens.be/demo/url-regex - url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu, - email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, - hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i, - // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/, - ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, - regex, - // uuid: http://tools.ietf.org/html/rfc4122 - uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, - // JSON-pointer: https://tools.ietf.org/html/rfc6901 - // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A - "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/, - "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i, - // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 - "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/, - // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types - // byte: https://github.com/miguelmota/is-base64 - byte, - // signed 32 bit integer - int32: { type: "number", validate: validateInt32 }, - // signed 64 bit integer - int64: { type: "number", validate: validateInt64 }, - // C-type float - float: { type: "number", validate: validateNumber }, - // C-type double - double: { type: "number", validate: validateNumber }, - // hint to the UI to hide input strings - password: true, - // unchecked string payload - binary: true - }; - exports.fastFormats = { - ...exports.fullFormats, - date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate), - time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime), - "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), - "iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime), - "iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime), - // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js - uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, - "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, - // email (sources from jsen validator): - // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 - // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation') - email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i - }; - exports.formatNames = Object.keys(exports.fullFormats); - function isLeapYear(year) { - return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); - } - var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; - var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - function date5(str) { - const matches = DATE.exec(str); - if (!matches) - return false; - const year = +matches[1]; - const month = +matches[2]; - const day = +matches[3]; - return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]); - } - function compareDate(d1, d2) { - if (!(d1 && d2)) - return void 0; - if (d1 > d2) - return 1; - if (d1 < d2) - return -1; - return 0; - } - var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i; - function getTime(strictTimeZone) { - return function time3(str) { - const matches = TIME.exec(str); - if (!matches) - return false; - const hr = +matches[1]; - const min = +matches[2]; - const sec = +matches[3]; - const tz = matches[4]; - const tzSign = matches[5] === "-" ? -1 : 1; - const tzH = +(matches[6] || 0); - const tzM = +(matches[7] || 0); - if (tzH > 23 || tzM > 59 || strictTimeZone && !tz) - return false; - if (hr <= 23 && min <= 59 && sec < 60) - return true; - const utcMin = min - tzM * tzSign; - const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0); - return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61; - }; - } - function compareTime(s1, s2) { - if (!(s1 && s2)) - return void 0; - const t1 = (/* @__PURE__ */ new Date("2020-01-01T" + s1)).valueOf(); - const t2 = (/* @__PURE__ */ new Date("2020-01-01T" + s2)).valueOf(); - if (!(t1 && t2)) - return void 0; - return t1 - t2; - } - function compareIsoTime(t1, t2) { - if (!(t1 && t2)) - return void 0; - const a1 = TIME.exec(t1); - const a2 = TIME.exec(t2); - if (!(a1 && a2)) - return void 0; - t1 = a1[1] + a1[2] + a1[3]; - t2 = a2[1] + a2[2] + a2[3]; - if (t1 > t2) - return 1; - if (t1 < t2) - return -1; - return 0; - } - var DATE_TIME_SEPARATOR = /t|\s/i; - function getDateTime(strictTimeZone) { - const time3 = getTime(strictTimeZone); - return function date_time(str) { - const dateTime = str.split(DATE_TIME_SEPARATOR); - return dateTime.length === 2 && date5(dateTime[0]) && time3(dateTime[1]); - }; - } - function compareDateTime(dt1, dt2) { - if (!(dt1 && dt2)) - return void 0; - const d1 = new Date(dt1).valueOf(); - const d2 = new Date(dt2).valueOf(); - if (!(d1 && d2)) - return void 0; - return d1 - d2; - } - function compareIsoDateTime(dt1, dt2) { - if (!(dt1 && dt2)) - return void 0; - const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR); - const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR); - const res = compareDate(d1, d2); - if (res === void 0) - return void 0; - return res || compareTime(t1, t2); - } - var NOT_URI_FRAGMENT = /\/|:/; - var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; - function uri(str) { - return NOT_URI_FRAGMENT.test(str) && URI.test(str); - } - var BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm; - function byte(str) { - BYTE.lastIndex = 0; - return BYTE.test(str); - } - var MIN_INT32 = -(2 ** 31); - var MAX_INT32 = 2 ** 31 - 1; - function validateInt32(value) { - return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32; - } - function validateInt64(value) { - return Number.isInteger(value); - } - function validateNumber() { - return true; - } - var Z_ANCHOR = /[^\\]\\Z/; - function regex(str) { - if (Z_ANCHOR.test(str)) - return false; - try { - new RegExp(str); - return true; - } catch (e) { - return false; - } - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js -var require_code3 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/code.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; - var _CodeOrName = class { - }; - exports._CodeOrName = _CodeOrName; - exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; - var Name = class extends _CodeOrName { - constructor(s) { - super(); - if (!exports.IDENTIFIER.test(s)) - throw new Error("CodeGen: name must be a valid identifier"); - this.str = s; - } - toString() { - return this.str; - } - emptyStr() { - return false; - } - get names() { - return { [this.str]: 1 }; - } - }; - exports.Name = Name; - var _Code = class extends _CodeOrName { - constructor(code) { - super(); - this._items = typeof code === "string" ? [code] : code; - } - toString() { - return this.str; - } - emptyStr() { - if (this._items.length > 1) - return false; - const item = this._items[0]; - return item === "" || item === '""'; - } - get str() { - var _a3; - return (_a3 = this._str) !== null && _a3 !== void 0 ? _a3 : this._str = this._items.reduce((s, c) => `${s}${c}`, ""); - } - get names() { - var _a3; - return (_a3 = this._names) !== null && _a3 !== void 0 ? _a3 : this._names = this._items.reduce((names, c) => { - if (c instanceof Name) - names[c.str] = (names[c.str] || 0) + 1; - return names; - }, {}); - } - }; - exports._Code = _Code; - exports.nil = new _Code(""); - function _2(strs, ...args) { - const code = [strs[0]]; - let i = 0; - while (i < args.length) { - addCodeArg(code, args[i]); - code.push(strs[++i]); - } - return new _Code(code); - } - exports._ = _2; - var plus = new _Code("+"); - function str(strs, ...args) { - const expr = [safeStringify(strs[0])]; - let i = 0; - while (i < args.length) { - expr.push(plus); - addCodeArg(expr, args[i]); - expr.push(plus, safeStringify(strs[++i])); - } - optimize(expr); - return new _Code(expr); - } - exports.str = str; - function addCodeArg(code, arg) { - if (arg instanceof _Code) - code.push(...arg._items); - else if (arg instanceof Name) - code.push(arg); - else - code.push(interpolate(arg)); - } - exports.addCodeArg = addCodeArg; - function optimize(expr) { - let i = 1; - while (i < expr.length - 1) { - if (expr[i] === plus) { - const res = mergeExprItems(expr[i - 1], expr[i + 1]); - if (res !== void 0) { - expr.splice(i - 1, 3, res); - continue; - } - expr[i++] = "+"; - } - i++; - } - } - function mergeExprItems(a, b2) { - if (b2 === '""') - return a; - if (a === '""') - return b2; - if (typeof a == "string") { - if (b2 instanceof Name || a[a.length - 1] !== '"') - return; - if (typeof b2 != "string") - return `${a.slice(0, -1)}${b2}"`; - if (b2[0] === '"') - return a.slice(0, -1) + b2.slice(1); - return; - } - if (typeof b2 == "string" && b2[0] === '"' && !(a instanceof Name)) - return `"${a}${b2.slice(1)}`; - return; - } - function strConcat(c1, c2) { - return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str`${c1}${c2}`; - } - exports.strConcat = strConcat; - function interpolate(x2) { - return typeof x2 == "number" || typeof x2 == "boolean" || x2 === null ? x2 : safeStringify(Array.isArray(x2) ? x2.join(",") : x2); - } - function stringify(x2) { - return new _Code(safeStringify(x2)); - } - exports.stringify = stringify; - function safeStringify(x2) { - return JSON.stringify(x2).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); - } - exports.safeStringify = safeStringify; - function getProperty(key) { - return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _2`[${key}]`; - } - exports.getProperty = getProperty; - function getEsmExportName(key) { - if (typeof key == "string" && exports.IDENTIFIER.test(key)) { - return new _Code(`${key}`); - } - throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`); - } - exports.getEsmExportName = getEsmExportName; - function regexpCode(rx) { - return new _Code(rx.toString()); - } - exports.regexpCode = regexpCode; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js -var require_scope2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/scope.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; - var code_1 = require_code3(); - var ValueError = class extends Error { - constructor(name) { - super(`CodeGen: "code" for ${name} not defined`); - this.value = name.value; - } - }; - var UsedValueState; - (function(UsedValueState2) { - UsedValueState2[UsedValueState2["Started"] = 0] = "Started"; - UsedValueState2[UsedValueState2["Completed"] = 1] = "Completed"; - })(UsedValueState || (exports.UsedValueState = UsedValueState = {})); - exports.varKinds = { - const: new code_1.Name("const"), - let: new code_1.Name("let"), - var: new code_1.Name("var") - }; - var Scope = class { - constructor({ prefixes, parent } = {}) { - this._names = {}; - this._prefixes = prefixes; - this._parent = parent; - } - toName(nameOrPrefix) { - return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix); - } - name(prefix) { - return new code_1.Name(this._newName(prefix)); - } - _newName(prefix) { - const ng = this._names[prefix] || this._nameGroup(prefix); - return `${prefix}${ng.index++}`; - } - _nameGroup(prefix) { - var _a3, _b; - if (((_b = (_a3 = this._parent) === null || _a3 === void 0 ? void 0 : _a3._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || this._prefixes && !this._prefixes.has(prefix)) { - throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`); - } - return this._names[prefix] = { prefix, index: 0 }; - } - }; - exports.Scope = Scope; - var ValueScopeName = class extends code_1.Name { - constructor(prefix, nameStr) { - super(nameStr); - this.prefix = prefix; - } - setValue(value, { property, itemIndex }) { - this.value = value; - this.scopePath = (0, code_1._)`.${new code_1.Name(property)}[${itemIndex}]`; - } - }; - exports.ValueScopeName = ValueScopeName; - var line = (0, code_1._)`\n`; - var ValueScope = class extends Scope { - constructor(opts) { - super(opts); - this._values = {}; - this._scope = opts.scope; - this.opts = { ...opts, _n: opts.lines ? line : code_1.nil }; - } - get() { - return this._scope; - } - name(prefix) { - return new ValueScopeName(prefix, this._newName(prefix)); - } - value(nameOrPrefix, value) { - var _a3; - if (value.ref === void 0) - throw new Error("CodeGen: ref must be passed in value"); - const name = this.toName(nameOrPrefix); - const { prefix } = name; - const valueKey = (_a3 = value.key) !== null && _a3 !== void 0 ? _a3 : value.ref; - let vs = this._values[prefix]; - if (vs) { - const _name = vs.get(valueKey); - if (_name) - return _name; - } else { - vs = this._values[prefix] = /* @__PURE__ */ new Map(); - } - vs.set(valueKey, name); - const s = this._scope[prefix] || (this._scope[prefix] = []); - const itemIndex = s.length; - s[itemIndex] = value.ref; - name.setValue(value, { property: prefix, itemIndex }); - return name; - } - getValue(prefix, keyOrRef) { - const vs = this._values[prefix]; - if (!vs) - return; - return vs.get(keyOrRef); - } - scopeRefs(scopeName, values = this._values) { - return this._reduceValues(values, (name) => { - if (name.scopePath === void 0) - throw new Error(`CodeGen: name "${name}" has no value`); - return (0, code_1._)`${scopeName}${name.scopePath}`; - }); - } - scopeCode(values = this._values, usedValues, getCode) { - return this._reduceValues(values, (name) => { - if (name.value === void 0) - throw new Error(`CodeGen: name "${name}" has no value`); - return name.value.code; - }, usedValues, getCode); - } - _reduceValues(values, valueCode, usedValues = {}, getCode) { - let code = code_1.nil; - for (const prefix in values) { - const vs = values[prefix]; - if (!vs) - continue; - const nameSet = usedValues[prefix] = usedValues[prefix] || /* @__PURE__ */ new Map(); - vs.forEach((name) => { - if (nameSet.has(name)) - return; - nameSet.set(name, UsedValueState.Started); - let c = valueCode(name); - if (c) { - const def = this.opts.es5 ? exports.varKinds.var : exports.varKinds.const; - code = (0, code_1._)`${code}${def} ${name} = ${c};${this.opts._n}`; - } else if (c = getCode === null || getCode === void 0 ? void 0 : getCode(name)) { - code = (0, code_1._)`${code}${c}${this.opts._n}`; - } else { - throw new ValueError(name); - } - nameSet.set(name, UsedValueState.Completed); - }); - } - return code; - } - }; - exports.ValueScope = ValueScope; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js -var require_codegen2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/codegen/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; - var code_1 = require_code3(); - var scope_1 = require_scope2(); - var code_2 = require_code3(); - Object.defineProperty(exports, "_", { enumerable: true, get: function() { - return code_2._; - } }); - Object.defineProperty(exports, "str", { enumerable: true, get: function() { - return code_2.str; - } }); - Object.defineProperty(exports, "strConcat", { enumerable: true, get: function() { - return code_2.strConcat; - } }); - Object.defineProperty(exports, "nil", { enumerable: true, get: function() { - return code_2.nil; - } }); - Object.defineProperty(exports, "getProperty", { enumerable: true, get: function() { - return code_2.getProperty; - } }); - Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { - return code_2.stringify; - } }); - Object.defineProperty(exports, "regexpCode", { enumerable: true, get: function() { - return code_2.regexpCode; - } }); - Object.defineProperty(exports, "Name", { enumerable: true, get: function() { - return code_2.Name; - } }); - var scope_2 = require_scope2(); - Object.defineProperty(exports, "Scope", { enumerable: true, get: function() { - return scope_2.Scope; - } }); - Object.defineProperty(exports, "ValueScope", { enumerable: true, get: function() { - return scope_2.ValueScope; - } }); - Object.defineProperty(exports, "ValueScopeName", { enumerable: true, get: function() { - return scope_2.ValueScopeName; - } }); - Object.defineProperty(exports, "varKinds", { enumerable: true, get: function() { - return scope_2.varKinds; - } }); - exports.operators = { - GT: new code_1._Code(">"), - GTE: new code_1._Code(">="), - LT: new code_1._Code("<"), - LTE: new code_1._Code("<="), - EQ: new code_1._Code("==="), - NEQ: new code_1._Code("!=="), - NOT: new code_1._Code("!"), - OR: new code_1._Code("||"), - AND: new code_1._Code("&&"), - ADD: new code_1._Code("+") - }; - var Node = class { - optimizeNodes() { - return this; - } - optimizeNames(_names, _constants) { - return this; - } - }; - var Def = class extends Node { - constructor(varKind, name, rhs) { - super(); - this.varKind = varKind; - this.name = name; - this.rhs = rhs; - } - render({ es5, _n }) { - const varKind = es5 ? scope_1.varKinds.var : this.varKind; - const rhs = this.rhs === void 0 ? "" : ` = ${this.rhs}`; - return `${varKind} ${this.name}${rhs};` + _n; - } - optimizeNames(names, constants) { - if (!names[this.name.str]) - return; - if (this.rhs) - this.rhs = optimizeExpr(this.rhs, names, constants); - return this; - } - get names() { - return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {}; - } - }; - var Assign = class extends Node { - constructor(lhs, rhs, sideEffects) { - super(); - this.lhs = lhs; - this.rhs = rhs; - this.sideEffects = sideEffects; - } - render({ _n }) { - return `${this.lhs} = ${this.rhs};` + _n; - } - optimizeNames(names, constants) { - if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects) - return; - this.rhs = optimizeExpr(this.rhs, names, constants); - return this; - } - get names() { - const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names }; - return addExprNames(names, this.rhs); - } - }; - var AssignOp = class extends Assign { - constructor(lhs, op, rhs, sideEffects) { - super(lhs, rhs, sideEffects); - this.op = op; - } - render({ _n }) { - return `${this.lhs} ${this.op}= ${this.rhs};` + _n; - } - }; - var Label = class extends Node { - constructor(label) { - super(); - this.label = label; - this.names = {}; - } - render({ _n }) { - return `${this.label}:` + _n; - } - }; - var Break = class extends Node { - constructor(label) { - super(); - this.label = label; - this.names = {}; - } - render({ _n }) { - const label = this.label ? ` ${this.label}` : ""; - return `break${label};` + _n; - } - }; - var Throw = class extends Node { - constructor(error61) { - super(); - this.error = error61; - } - render({ _n }) { - return `throw ${this.error};` + _n; - } - get names() { - return this.error.names; - } - }; - var AnyCode = class extends Node { - constructor(code) { - super(); - this.code = code; - } - render({ _n }) { - return `${this.code};` + _n; - } - optimizeNodes() { - return `${this.code}` ? this : void 0; - } - optimizeNames(names, constants) { - this.code = optimizeExpr(this.code, names, constants); - return this; - } - get names() { - return this.code instanceof code_1._CodeOrName ? this.code.names : {}; - } - }; - var ParentNode = class extends Node { - constructor(nodes = []) { - super(); - this.nodes = nodes; - } - render(opts) { - return this.nodes.reduce((code, n) => code + n.render(opts), ""); - } - optimizeNodes() { - const { nodes } = this; - let i = nodes.length; - while (i--) { - const n = nodes[i].optimizeNodes(); - if (Array.isArray(n)) - nodes.splice(i, 1, ...n); - else if (n) - nodes[i] = n; - else - nodes.splice(i, 1); - } - return nodes.length > 0 ? this : void 0; - } - optimizeNames(names, constants) { - const { nodes } = this; - let i = nodes.length; - while (i--) { - const n = nodes[i]; - if (n.optimizeNames(names, constants)) - continue; - subtractNames(names, n.names); - nodes.splice(i, 1); - } - return nodes.length > 0 ? this : void 0; - } - get names() { - return this.nodes.reduce((names, n) => addNames(names, n.names), {}); - } - }; - var BlockNode = class extends ParentNode { - render(opts) { - return "{" + opts._n + super.render(opts) + "}" + opts._n; - } - }; - var Root = class extends ParentNode { - }; - var Else = class extends BlockNode { - }; - Else.kind = "else"; - var If = class _If extends BlockNode { - constructor(condition, nodes) { - super(nodes); - this.condition = condition; - } - render(opts) { - let code = `if(${this.condition})` + super.render(opts); - if (this.else) - code += "else " + this.else.render(opts); - return code; - } - optimizeNodes() { - super.optimizeNodes(); - const cond = this.condition; - if (cond === true) - return this.nodes; - let e = this.else; - if (e) { - const ns = e.optimizeNodes(); - e = this.else = Array.isArray(ns) ? new Else(ns) : ns; - } - if (e) { - if (cond === false) - return e instanceof _If ? e : e.nodes; - if (this.nodes.length) - return this; - return new _If(not(cond), e instanceof _If ? [e] : e.nodes); - } - if (cond === false || !this.nodes.length) - return void 0; - return this; - } - optimizeNames(names, constants) { - var _a3; - this.else = (_a3 = this.else) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); - if (!(super.optimizeNames(names, constants) || this.else)) - return; - this.condition = optimizeExpr(this.condition, names, constants); - return this; - } - get names() { - const names = super.names; - addExprNames(names, this.condition); - if (this.else) - addNames(names, this.else.names); - return names; - } - }; - If.kind = "if"; - var For = class extends BlockNode { - }; - For.kind = "for"; - var ForLoop = class extends For { - constructor(iteration) { - super(); - this.iteration = iteration; - } - render(opts) { - return `for(${this.iteration})` + super.render(opts); - } - optimizeNames(names, constants) { - if (!super.optimizeNames(names, constants)) - return; - this.iteration = optimizeExpr(this.iteration, names, constants); - return this; - } - get names() { - return addNames(super.names, this.iteration.names); - } - }; - var ForRange = class extends For { - constructor(varKind, name, from, to) { - super(); - this.varKind = varKind; - this.name = name; - this.from = from; - this.to = to; - } - render(opts) { - const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind; - const { name, from, to } = this; - return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts); - } - get names() { - const names = addExprNames(super.names, this.from); - return addExprNames(names, this.to); - } - }; - var ForIter = class extends For { - constructor(loop, varKind, name, iterable) { - super(); - this.loop = loop; - this.varKind = varKind; - this.name = name; - this.iterable = iterable; - } - render(opts) { - return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts); - } - optimizeNames(names, constants) { - if (!super.optimizeNames(names, constants)) - return; - this.iterable = optimizeExpr(this.iterable, names, constants); - return this; - } - get names() { - return addNames(super.names, this.iterable.names); - } - }; - var Func = class extends BlockNode { - constructor(name, args, async) { - super(); - this.name = name; - this.args = args; - this.async = async; - } - render(opts) { - const _async = this.async ? "async " : ""; - return `${_async}function ${this.name}(${this.args})` + super.render(opts); - } - }; - Func.kind = "func"; - var Return = class extends ParentNode { - render(opts) { - return "return " + super.render(opts); - } - }; - Return.kind = "return"; - var Try = class extends BlockNode { - render(opts) { - let code = "try" + super.render(opts); - if (this.catch) - code += this.catch.render(opts); - if (this.finally) - code += this.finally.render(opts); - return code; - } - optimizeNodes() { - var _a3, _b; - super.optimizeNodes(); - (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNodes(); - (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes(); - return this; - } - optimizeNames(names, constants) { - var _a3, _b; - super.optimizeNames(names, constants); - (_a3 = this.catch) === null || _a3 === void 0 ? void 0 : _a3.optimizeNames(names, constants); - (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants); - return this; - } - get names() { - const names = super.names; - if (this.catch) - addNames(names, this.catch.names); - if (this.finally) - addNames(names, this.finally.names); - return names; - } - }; - var Catch = class extends BlockNode { - constructor(error61) { - super(); - this.error = error61; - } - render(opts) { - return `catch(${this.error})` + super.render(opts); - } - }; - Catch.kind = "catch"; - var Finally = class extends BlockNode { - render(opts) { - return "finally" + super.render(opts); - } - }; - Finally.kind = "finally"; - var CodeGen = class { - constructor(extScope, opts = {}) { - this._values = {}; - this._blockStarts = []; - this._constants = {}; - this.opts = { ...opts, _n: opts.lines ? "\n" : "" }; - this._extScope = extScope; - this._scope = new scope_1.Scope({ parent: extScope }); - this._nodes = [new Root()]; - } - toString() { - return this._root.render(this.opts); - } - // returns unique name in the internal scope - name(prefix) { - return this._scope.name(prefix); - } - // reserves unique name in the external scope - scopeName(prefix) { - return this._extScope.name(prefix); - } - // reserves unique name in the external scope and assigns value to it - scopeValue(prefixOrName, value) { - const name = this._extScope.value(prefixOrName, value); - const vs = this._values[name.prefix] || (this._values[name.prefix] = /* @__PURE__ */ new Set()); - vs.add(name); - return name; - } - getScopeValue(prefix, keyOrRef) { - return this._extScope.getValue(prefix, keyOrRef); - } - // return code that assigns values in the external scope to the names that are used internally - // (same names that were returned by gen.scopeName or gen.scopeValue) - scopeRefs(scopeName) { - return this._extScope.scopeRefs(scopeName, this._values); - } - scopeCode() { - return this._extScope.scopeCode(this._values); - } - _def(varKind, nameOrPrefix, rhs, constant) { - const name = this._scope.toName(nameOrPrefix); - if (rhs !== void 0 && constant) - this._constants[name.str] = rhs; - this._leafNode(new Def(varKind, name, rhs)); - return name; - } - // `const` declaration (`var` in es5 mode) - const(nameOrPrefix, rhs, _constant) { - return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant); - } - // `let` declaration with optional assignment (`var` in es5 mode) - let(nameOrPrefix, rhs, _constant) { - return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant); - } - // `var` declaration with optional assignment - var(nameOrPrefix, rhs, _constant) { - return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant); - } - // assignment code - assign(lhs, rhs, sideEffects) { - return this._leafNode(new Assign(lhs, rhs, sideEffects)); - } - // `+=` code - add(lhs, rhs) { - return this._leafNode(new AssignOp(lhs, exports.operators.ADD, rhs)); - } - // appends passed SafeExpr to code or executes Block - code(c) { - if (typeof c == "function") - c(); - else if (c !== code_1.nil) - this._leafNode(new AnyCode(c)); - return this; - } - // returns code for object literal for the passed argument list of key-value pairs - object(...keyValues) { - const code = ["{"]; - for (const [key, value] of keyValues) { - if (code.length > 1) - code.push(","); - code.push(key); - if (key !== value || this.opts.es5) { - code.push(":"); - (0, code_1.addCodeArg)(code, value); - } - } - code.push("}"); - return new code_1._Code(code); - } - // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed) - if(condition, thenBody, elseBody) { - this._blockNode(new If(condition)); - if (thenBody && elseBody) { - this.code(thenBody).else().code(elseBody).endIf(); - } else if (thenBody) { - this.code(thenBody).endIf(); - } else if (elseBody) { - throw new Error('CodeGen: "else" body without "then" body'); - } - return this; - } - // `else if` clause - invalid without `if` or after `else` clauses - elseIf(condition) { - return this._elseNode(new If(condition)); - } - // `else` clause - only valid after `if` or `else if` clauses - else() { - return this._elseNode(new Else()); - } - // end `if` statement (needed if gen.if was used only with condition) - endIf() { - return this._endBlockNode(If, Else); - } - _for(node2, forBody) { - this._blockNode(node2); - if (forBody) - this.code(forBody).endFor(); - return this; - } - // a generic `for` clause (or statement if `forBody` is passed) - for(iteration, forBody) { - return this._for(new ForLoop(iteration), forBody); - } - // `for` statement for a range of values - forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) { - const name = this._scope.toName(nameOrPrefix); - return this._for(new ForRange(varKind, name, from, to), () => forBody(name)); - } - // `for-of` statement (in es5 mode replace with a normal for loop) - forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) { - const name = this._scope.toName(nameOrPrefix); - if (this.opts.es5) { - const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable); - return this.forRange("_i", 0, (0, code_1._)`${arr}.length`, (i) => { - this.var(name, (0, code_1._)`${arr}[${i}]`); - forBody(name); - }); - } - return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name)); - } - // `for-in` statement. - // With option `ownProperties` replaced with a `for-of` loop for object keys - forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) { - if (this.opts.ownProperties) { - return this.forOf(nameOrPrefix, (0, code_1._)`Object.keys(${obj})`, forBody); - } - const name = this._scope.toName(nameOrPrefix); - return this._for(new ForIter("in", varKind, name, obj), () => forBody(name)); - } - // end `for` loop - endFor() { - return this._endBlockNode(For); - } - // `label` statement - label(label) { - return this._leafNode(new Label(label)); - } - // `break` statement - break(label) { - return this._leafNode(new Break(label)); - } - // `return` statement - return(value) { - const node2 = new Return(); - this._blockNode(node2); - this.code(value); - if (node2.nodes.length !== 1) - throw new Error('CodeGen: "return" should have one node'); - return this._endBlockNode(Return); - } - // `try` statement - try(tryBody, catchCode, finallyCode) { - if (!catchCode && !finallyCode) - throw new Error('CodeGen: "try" without "catch" and "finally"'); - const node2 = new Try(); - this._blockNode(node2); - this.code(tryBody); - if (catchCode) { - const error61 = this.name("e"); - this._currNode = node2.catch = new Catch(error61); - catchCode(error61); - } - if (finallyCode) { - this._currNode = node2.finally = new Finally(); - this.code(finallyCode); - } - return this._endBlockNode(Catch, Finally); - } - // `throw` statement - throw(error61) { - return this._leafNode(new Throw(error61)); - } - // start self-balancing block - block(body, nodeCount) { - this._blockStarts.push(this._nodes.length); - if (body) - this.code(body).endBlock(nodeCount); - return this; - } - // end the current self-balancing block - endBlock(nodeCount) { - const len = this._blockStarts.pop(); - if (len === void 0) - throw new Error("CodeGen: not in self-balancing block"); - const toClose = this._nodes.length - len; - if (toClose < 0 || nodeCount !== void 0 && toClose !== nodeCount) { - throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`); - } - this._nodes.length = len; - return this; - } - // `function` heading (or definition if funcBody is passed) - func(name, args = code_1.nil, async, funcBody) { - this._blockNode(new Func(name, args, async)); - if (funcBody) - this.code(funcBody).endFunc(); - return this; - } - // end function definition - endFunc() { - return this._endBlockNode(Func); - } - optimize(n = 1) { - while (n-- > 0) { - this._root.optimizeNodes(); - this._root.optimizeNames(this._root.names, this._constants); - } - } - _leafNode(node2) { - this._currNode.nodes.push(node2); - return this; - } - _blockNode(node2) { - this._currNode.nodes.push(node2); - this._nodes.push(node2); - } - _endBlockNode(N1, N2) { - const n = this._currNode; - if (n instanceof N1 || N2 && n instanceof N2) { - this._nodes.pop(); - return this; - } - throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`); - } - _elseNode(node2) { - const n = this._currNode; - if (!(n instanceof If)) { - throw new Error('CodeGen: "else" without "if"'); - } - this._currNode = n.else = node2; - return this; - } - get _root() { - return this._nodes[0]; - } - get _currNode() { - const ns = this._nodes; - return ns[ns.length - 1]; - } - set _currNode(node2) { - const ns = this._nodes; - ns[ns.length - 1] = node2; - } - }; - exports.CodeGen = CodeGen; - function addNames(names, from) { - for (const n in from) - names[n] = (names[n] || 0) + (from[n] || 0); - return names; - } - function addExprNames(names, from) { - return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names; - } - function optimizeExpr(expr, names, constants) { - if (expr instanceof code_1.Name) - return replaceName(expr); - if (!canOptimize(expr)) - return expr; - return new code_1._Code(expr._items.reduce((items, c) => { - if (c instanceof code_1.Name) - c = replaceName(c); - if (c instanceof code_1._Code) - items.push(...c._items); - else - items.push(c); - return items; - }, [])); - function replaceName(n) { - const c = constants[n.str]; - if (c === void 0 || names[n.str] !== 1) - return n; - delete names[n.str]; - return c; - } - function canOptimize(e) { - return e instanceof code_1._Code && e._items.some((c) => c instanceof code_1.Name && names[c.str] === 1 && constants[c.str] !== void 0); - } - } - function subtractNames(names, from) { - for (const n in from) - names[n] = (names[n] || 0) - (from[n] || 0); - } - function not(x2) { - return typeof x2 == "boolean" || typeof x2 == "number" || x2 === null ? !x2 : (0, code_1._)`!${par(x2)}`; - } - exports.not = not; - var andCode = mappend(exports.operators.AND); - function and(...args) { - return args.reduce(andCode); - } - exports.and = and; - var orCode = mappend(exports.operators.OR); - function or(...args) { - return args.reduce(orCode); - } - exports.or = or; - function mappend(op) { - return (x2, y2) => x2 === code_1.nil ? y2 : y2 === code_1.nil ? x2 : (0, code_1._)`${par(x2)} ${op} ${par(y2)}`; - } - function par(x2) { - return x2 instanceof code_1.Name ? x2 : (0, code_1._)`(${x2})`; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js -var require_util2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/util.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; - var codegen_1 = require_codegen2(); - var code_1 = require_code3(); - function toHash(arr) { - const hash2 = {}; - for (const item of arr) - hash2[item] = true; - return hash2; - } - exports.toHash = toHash; - function alwaysValidSchema(it, schema) { - if (typeof schema == "boolean") - return schema; - if (Object.keys(schema).length === 0) - return true; - checkUnknownRules(it, schema); - return !schemaHasRules(schema, it.self.RULES.all); - } - exports.alwaysValidSchema = alwaysValidSchema; - function checkUnknownRules(it, schema = it.schema) { - const { opts, self } = it; - if (!opts.strictSchema) - return; - if (typeof schema === "boolean") - return; - const rules = self.RULES.keywords; - for (const key in schema) { - if (!rules[key]) - checkStrictMode(it, `unknown keyword: "${key}"`); - } - } - exports.checkUnknownRules = checkUnknownRules; - function schemaHasRules(schema, rules) { - if (typeof schema == "boolean") - return !schema; - for (const key in schema) - if (rules[key]) - return true; - return false; - } - exports.schemaHasRules = schemaHasRules; - function schemaHasRulesButRef(schema, RULES) { - if (typeof schema == "boolean") - return !schema; - for (const key in schema) - if (key !== "$ref" && RULES.all[key]) - return true; - return false; - } - exports.schemaHasRulesButRef = schemaHasRulesButRef; - function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) { - if (!$data) { - if (typeof schema == "number" || typeof schema == "boolean") - return schema; - if (typeof schema == "string") - return (0, codegen_1._)`${schema}`; - } - return (0, codegen_1._)`${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`; - } - exports.schemaRefOrVal = schemaRefOrVal; - function unescapeFragment(str) { - return unescapeJsonPointer(decodeURIComponent(str)); - } - exports.unescapeFragment = unescapeFragment; - function escapeFragment(str) { - return encodeURIComponent(escapeJsonPointer(str)); - } - exports.escapeFragment = escapeFragment; - function escapeJsonPointer(str) { - if (typeof str == "number") - return `${str}`; - return str.replace(/~/g, "~0").replace(/\//g, "~1"); - } - exports.escapeJsonPointer = escapeJsonPointer; - function unescapeJsonPointer(str) { - return str.replace(/~1/g, "/").replace(/~0/g, "~"); - } - exports.unescapeJsonPointer = unescapeJsonPointer; - function eachItem(xs, f) { - if (Array.isArray(xs)) { - for (const x2 of xs) - f(x2); - } else { - f(xs); - } - } - exports.eachItem = eachItem; - function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues: mergeValues2, resultToName }) { - return (gen, from, to, toName) => { - const res = to === void 0 ? from : to instanceof codegen_1.Name ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to) : from instanceof codegen_1.Name ? (mergeToName(gen, to, from), from) : mergeValues2(from, to); - return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res; - }; - } - exports.mergeEvaluated = { - props: makeMergeEvaluated({ - mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => { - gen.if((0, codegen_1._)`${from} === true`, () => gen.assign(to, true), () => gen.assign(to, (0, codegen_1._)`${to} || {}`).code((0, codegen_1._)`Object.assign(${to}, ${from})`)); - }), - mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => { - if (from === true) { - gen.assign(to, true); - } else { - gen.assign(to, (0, codegen_1._)`${to} || {}`); - setEvaluated(gen, to, from); - } - }), - mergeValues: (from, to) => from === true ? true : { ...from, ...to }, - resultToName: evaluatedPropsToName - }), - items: makeMergeEvaluated({ - mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => gen.assign(to, (0, codegen_1._)`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)), - mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => gen.assign(to, from === true ? true : (0, codegen_1._)`${to} > ${from} ? ${to} : ${from}`)), - mergeValues: (from, to) => from === true ? true : Math.max(from, to), - resultToName: (gen, items) => gen.var("items", items) - }) - }; - function evaluatedPropsToName(gen, ps) { - if (ps === true) - return gen.var("props", true); - const props = gen.var("props", (0, codegen_1._)`{}`); - if (ps !== void 0) - setEvaluated(gen, props, ps); - return props; - } - exports.evaluatedPropsToName = evaluatedPropsToName; - function setEvaluated(gen, props, ps) { - Object.keys(ps).forEach((p) => gen.assign((0, codegen_1._)`${props}${(0, codegen_1.getProperty)(p)}`, true)); - } - exports.setEvaluated = setEvaluated; - var snippets = {}; - function useFunc(gen, f) { - return gen.scopeValue("func", { - ref: f, - code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code)) - }); - } - exports.useFunc = useFunc; - var Type; - (function(Type2) { - Type2[Type2["Num"] = 0] = "Num"; - Type2[Type2["Str"] = 1] = "Str"; - })(Type || (exports.Type = Type = {})); - function getErrorPath(dataProp, dataPropType, jsPropertySyntax) { - if (dataProp instanceof codegen_1.Name) { - const isNumber = dataPropType === Type.Num; - return jsPropertySyntax ? isNumber ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`; - } - return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp); - } - exports.getErrorPath = getErrorPath; - function checkStrictMode(it, msg, mode = it.opts.strictSchema) { - if (!mode) - return; - msg = `strict mode: ${msg}`; - if (mode === true) - throw new Error(msg); - it.self.logger.warn(msg); - } - exports.checkStrictMode = checkStrictMode; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js -var require_names2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/names.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var names = { - // validation function arguments - data: new codegen_1.Name("data"), - // data passed to validation function - // args passed from referencing schema - valCxt: new codegen_1.Name("valCxt"), - // validation/data context - should not be used directly, it is destructured to the names below - instancePath: new codegen_1.Name("instancePath"), - parentData: new codegen_1.Name("parentData"), - parentDataProperty: new codegen_1.Name("parentDataProperty"), - rootData: new codegen_1.Name("rootData"), - // root data - same as the data passed to the first/top validation function - dynamicAnchors: new codegen_1.Name("dynamicAnchors"), - // used to support recursiveRef and dynamicRef - // function scoped variables - vErrors: new codegen_1.Name("vErrors"), - // null or array of validation errors - errors: new codegen_1.Name("errors"), - // counter of validation errors - this: new codegen_1.Name("this"), - // "globals" - self: new codegen_1.Name("self"), - scope: new codegen_1.Name("scope"), - // JTD serialize/parse name for JSON string and position - json: new codegen_1.Name("json"), - jsonPos: new codegen_1.Name("jsonPos"), - jsonLen: new codegen_1.Name("jsonLen"), - jsonPart: new codegen_1.Name("jsonPart") - }; - exports.default = names; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js -var require_errors2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/errors.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var names_1 = require_names2(); - exports.keywordError = { - message: ({ keyword }) => (0, codegen_1.str)`must pass "${keyword}" keyword validation` - }; - exports.keyword$DataError = { - message: ({ keyword, schemaType }) => schemaType ? (0, codegen_1.str)`"${keyword}" keyword must be ${schemaType} ($data)` : (0, codegen_1.str)`"${keyword}" keyword is invalid ($data)` - }; - function reportError(cxt, error61 = exports.keywordError, errorPaths, overrideAllErrors) { - const { it } = cxt; - const { gen, compositeRule, allErrors } = it; - const errObj = errorObjectCode(cxt, error61, errorPaths); - if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : compositeRule || allErrors) { - addError(gen, errObj); - } else { - returnErrors(it, (0, codegen_1._)`[${errObj}]`); - } - } - exports.reportError = reportError; - function reportExtraError(cxt, error61 = exports.keywordError, errorPaths) { - const { it } = cxt; - const { gen, compositeRule, allErrors } = it; - const errObj = errorObjectCode(cxt, error61, errorPaths); - addError(gen, errObj); - if (!(compositeRule || allErrors)) { - returnErrors(it, names_1.default.vErrors); - } - } - exports.reportExtraError = reportExtraError; - function resetErrorsCount(gen, errsCount) { - gen.assign(names_1.default.errors, errsCount); - gen.if((0, codegen_1._)`${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign((0, codegen_1._)`${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null))); - } - exports.resetErrorsCount = resetErrorsCount; - function extendErrors({ gen, keyword, schemaValue, data, errsCount, it }) { - if (errsCount === void 0) - throw new Error("ajv implementation error"); - const err = gen.name("err"); - gen.forRange("i", errsCount, names_1.default.errors, (i) => { - gen.const(err, (0, codegen_1._)`${names_1.default.vErrors}[${i}]`); - gen.if((0, codegen_1._)`${err}.instancePath === undefined`, () => gen.assign((0, codegen_1._)`${err}.instancePath`, (0, codegen_1.strConcat)(names_1.default.instancePath, it.errorPath))); - gen.assign((0, codegen_1._)`${err}.schemaPath`, (0, codegen_1.str)`${it.errSchemaPath}/${keyword}`); - if (it.opts.verbose) { - gen.assign((0, codegen_1._)`${err}.schema`, schemaValue); - gen.assign((0, codegen_1._)`${err}.data`, data); - } - }); - } - exports.extendErrors = extendErrors; - function addError(gen, errObj) { - const err = gen.const("err", errObj); - gen.if((0, codegen_1._)`${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, (0, codegen_1._)`[${err}]`), (0, codegen_1._)`${names_1.default.vErrors}.push(${err})`); - gen.code((0, codegen_1._)`${names_1.default.errors}++`); - } - function returnErrors(it, errs) { - const { gen, validateName, schemaEnv } = it; - if (schemaEnv.$async) { - gen.throw((0, codegen_1._)`new ${it.ValidationError}(${errs})`); - } else { - gen.assign((0, codegen_1._)`${validateName}.errors`, errs); - gen.return(false); - } - } - var E2 = { - keyword: new codegen_1.Name("keyword"), - schemaPath: new codegen_1.Name("schemaPath"), - // also used in JTD errors - params: new codegen_1.Name("params"), - propertyName: new codegen_1.Name("propertyName"), - message: new codegen_1.Name("message"), - schema: new codegen_1.Name("schema"), - parentSchema: new codegen_1.Name("parentSchema") - }; - function errorObjectCode(cxt, error61, errorPaths) { - const { createErrors } = cxt.it; - if (createErrors === false) - return (0, codegen_1._)`{}`; - return errorObject(cxt, error61, errorPaths); - } - function errorObject(cxt, error61, errorPaths = {}) { - const { gen, it } = cxt; - const keyValues = [ - errorInstancePath(it, errorPaths), - errorSchemaPath(cxt, errorPaths) - ]; - extraErrorProps(cxt, error61, keyValues); - return gen.object(...keyValues); - } - function errorInstancePath({ errorPath }, { instancePath }) { - const instPath = instancePath ? (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(instancePath, util_1.Type.Str)}` : errorPath; - return [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, instPath)]; - } - function errorSchemaPath({ keyword, it: { errSchemaPath } }, { schemaPath, parentSchema }) { - let schPath = parentSchema ? errSchemaPath : (0, codegen_1.str)`${errSchemaPath}/${keyword}`; - if (schemaPath) { - schPath = (0, codegen_1.str)`${schPath}${(0, util_1.getErrorPath)(schemaPath, util_1.Type.Str)}`; - } - return [E2.schemaPath, schPath]; - } - function extraErrorProps(cxt, { params, message }, keyValues) { - const { keyword, data, schemaValue, it } = cxt; - const { opts, propertyName, topSchemaRef, schemaPath } = it; - keyValues.push([E2.keyword, keyword], [E2.params, typeof params == "function" ? params(cxt) : params || (0, codegen_1._)`{}`]); - if (opts.messages) { - keyValues.push([E2.message, typeof message == "function" ? message(cxt) : message]); - } - if (opts.verbose) { - keyValues.push([E2.schema, schemaValue], [E2.parentSchema, (0, codegen_1._)`${topSchemaRef}${schemaPath}`], [names_1.default.data, data]); - } - if (propertyName) - keyValues.push([E2.propertyName, propertyName]); - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js -var require_boolSchema2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; - var errors_1 = require_errors2(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var boolError = { - message: "boolean schema is false" - }; - function topBoolOrEmptySchema(it) { - const { gen, schema, validateName } = it; - if (schema === false) { - falseSchemaError(it, false); - } else if (typeof schema == "object" && schema.$async === true) { - gen.return(names_1.default.data); - } else { - gen.assign((0, codegen_1._)`${validateName}.errors`, null); - gen.return(true); - } - } - exports.topBoolOrEmptySchema = topBoolOrEmptySchema; - function boolOrEmptySchema(it, valid) { - const { gen, schema } = it; - if (schema === false) { - gen.var(valid, false); - falseSchemaError(it); - } else { - gen.var(valid, true); - } - } - exports.boolOrEmptySchema = boolOrEmptySchema; - function falseSchemaError(it, overrideAllErrors) { - const { gen, data } = it; - const cxt = { - gen, - keyword: "false schema", - data, - schema: false, - schemaCode: false, - schemaValue: false, - params: {}, - it - }; - (0, errors_1.reportError)(cxt, boolError, void 0, overrideAllErrors); - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js -var require_rules2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/rules.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getRules = exports.isJSONType = void 0; - var _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"]; - var jsonTypes = new Set(_jsonTypes); - function isJSONType(x2) { - return typeof x2 == "string" && jsonTypes.has(x2); - } - exports.isJSONType = isJSONType; - function getRules() { - const groups = { - number: { type: "number", rules: [] }, - string: { type: "string", rules: [] }, - array: { type: "array", rules: [] }, - object: { type: "object", rules: [] } - }; - return { - types: { ...groups, integer: true, boolean: true, null: true }, - rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object], - post: { rules: [] }, - all: {}, - keywords: {} - }; - } - exports.getRules = getRules; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js -var require_applicability2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/applicability.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; - function schemaHasRulesForType({ schema, self }, type) { - const group = self.RULES.types[type]; - return group && group !== true && shouldUseGroup(schema, group); - } - exports.schemaHasRulesForType = schemaHasRulesForType; - function shouldUseGroup(schema, group) { - return group.rules.some((rule) => shouldUseRule(schema, rule)); - } - exports.shouldUseGroup = shouldUseGroup; - function shouldUseRule(schema, rule) { - var _a3; - return schema[rule.keyword] !== void 0 || ((_a3 = rule.definition.implements) === null || _a3 === void 0 ? void 0 : _a3.some((kwd) => schema[kwd] !== void 0)); - } - exports.shouldUseRule = shouldUseRule; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js -var require_dataType2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/dataType.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; - var rules_1 = require_rules2(); - var applicability_1 = require_applicability2(); - var errors_1 = require_errors2(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var DataType; - (function(DataType2) { - DataType2[DataType2["Correct"] = 0] = "Correct"; - DataType2[DataType2["Wrong"] = 1] = "Wrong"; - })(DataType || (exports.DataType = DataType = {})); - function getSchemaTypes(schema) { - const types = getJSONTypes(schema.type); - const hasNull = types.includes("null"); - if (hasNull) { - if (schema.nullable === false) - throw new Error("type: null contradicts nullable: false"); - } else { - if (!types.length && schema.nullable !== void 0) { - throw new Error('"nullable" cannot be used without "type"'); - } - if (schema.nullable === true) - types.push("null"); - } - return types; - } - exports.getSchemaTypes = getSchemaTypes; - function getJSONTypes(ts) { - const types = Array.isArray(ts) ? ts : ts ? [ts] : []; - if (types.every(rules_1.isJSONType)) - return types; - throw new Error("type must be JSONType or JSONType[]: " + types.join(",")); - } - exports.getJSONTypes = getJSONTypes; - function coerceAndCheckDataType(it, types) { - const { gen, data, opts } = it; - const coerceTo = coerceToTypes(types, opts.coerceTypes); - const checkTypes = types.length > 0 && !(coerceTo.length === 0 && types.length === 1 && (0, applicability_1.schemaHasRulesForType)(it, types[0])); - if (checkTypes) { - const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong); - gen.if(wrongType, () => { - if (coerceTo.length) - coerceData(it, types, coerceTo); - else - reportTypeError(it); - }); - } - return checkTypes; - } - exports.coerceAndCheckDataType = coerceAndCheckDataType; - var COERCIBLE = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean", "null"]); - function coerceToTypes(types, coerceTypes) { - return coerceTypes ? types.filter((t) => COERCIBLE.has(t) || coerceTypes === "array" && t === "array") : []; - } - function coerceData(it, types, coerceTo) { - const { gen, data, opts } = it; - const dataType = gen.let("dataType", (0, codegen_1._)`typeof ${data}`); - const coerced = gen.let("coerced", (0, codegen_1._)`undefined`); - if (opts.coerceTypes === "array") { - gen.if((0, codegen_1._)`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen.assign(data, (0, codegen_1._)`${data}[0]`).assign(dataType, (0, codegen_1._)`typeof ${data}`).if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))); - } - gen.if((0, codegen_1._)`${coerced} !== undefined`); - for (const t of coerceTo) { - if (COERCIBLE.has(t) || t === "array" && opts.coerceTypes === "array") { - coerceSpecificType(t); - } - } - gen.else(); - reportTypeError(it); - gen.endIf(); - gen.if((0, codegen_1._)`${coerced} !== undefined`, () => { - gen.assign(data, coerced); - assignParentData(it, coerced); - }); - function coerceSpecificType(t) { - switch (t) { - case "string": - gen.elseIf((0, codegen_1._)`${dataType} == "number" || ${dataType} == "boolean"`).assign(coerced, (0, codegen_1._)`"" + ${data}`).elseIf((0, codegen_1._)`${data} === null`).assign(coerced, (0, codegen_1._)`""`); - return; - case "number": - gen.elseIf((0, codegen_1._)`${dataType} == "boolean" || ${data} === null - || (${dataType} == "string" && ${data} && ${data} == +${data})`).assign(coerced, (0, codegen_1._)`+${data}`); - return; - case "integer": - gen.elseIf((0, codegen_1._)`${dataType} === "boolean" || ${data} === null - || (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`).assign(coerced, (0, codegen_1._)`+${data}`); - return; - case "boolean": - gen.elseIf((0, codegen_1._)`${data} === "false" || ${data} === 0 || ${data} === null`).assign(coerced, false).elseIf((0, codegen_1._)`${data} === "true" || ${data} === 1`).assign(coerced, true); - return; - case "null": - gen.elseIf((0, codegen_1._)`${data} === "" || ${data} === 0 || ${data} === false`); - gen.assign(coerced, null); - return; - case "array": - gen.elseIf((0, codegen_1._)`${dataType} === "string" || ${dataType} === "number" - || ${dataType} === "boolean" || ${data} === null`).assign(coerced, (0, codegen_1._)`[${data}]`); - } - } - } - function assignParentData({ gen, parentData, parentDataProperty }, expr) { - gen.if((0, codegen_1._)`${parentData} !== undefined`, () => gen.assign((0, codegen_1._)`${parentData}[${parentDataProperty}]`, expr)); - } - function checkDataType(dataType, data, strictNums, correct = DataType.Correct) { - const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ; - let cond; - switch (dataType) { - case "null": - return (0, codegen_1._)`${data} ${EQ} null`; - case "array": - cond = (0, codegen_1._)`Array.isArray(${data})`; - break; - case "object": - cond = (0, codegen_1._)`${data} && typeof ${data} == "object" && !Array.isArray(${data})`; - break; - case "integer": - cond = numCond((0, codegen_1._)`!(${data} % 1) && !isNaN(${data})`); - break; - case "number": - cond = numCond(); - break; - default: - return (0, codegen_1._)`typeof ${data} ${EQ} ${dataType}`; - } - return correct === DataType.Correct ? cond : (0, codegen_1.not)(cond); - function numCond(_cond = codegen_1.nil) { - return (0, codegen_1.and)((0, codegen_1._)`typeof ${data} == "number"`, _cond, strictNums ? (0, codegen_1._)`isFinite(${data})` : codegen_1.nil); - } - } - exports.checkDataType = checkDataType; - function checkDataTypes(dataTypes, data, strictNums, correct) { - if (dataTypes.length === 1) { - return checkDataType(dataTypes[0], data, strictNums, correct); - } - let cond; - const types = (0, util_1.toHash)(dataTypes); - if (types.array && types.object) { - const notObj = (0, codegen_1._)`typeof ${data} != "object"`; - cond = types.null ? notObj : (0, codegen_1._)`!${data} || ${notObj}`; - delete types.null; - delete types.array; - delete types.object; - } else { - cond = codegen_1.nil; - } - if (types.number) - delete types.integer; - for (const t in types) - cond = (0, codegen_1.and)(cond, checkDataType(t, data, strictNums, correct)); - return cond; - } - exports.checkDataTypes = checkDataTypes; - var typeError = { - message: ({ schema }) => `must be ${schema}`, - params: ({ schema, schemaValue }) => typeof schema == "string" ? (0, codegen_1._)`{type: ${schema}}` : (0, codegen_1._)`{type: ${schemaValue}}` - }; - function reportTypeError(it) { - const cxt = getTypeErrorContext(it); - (0, errors_1.reportError)(cxt, typeError); - } - exports.reportTypeError = reportTypeError; - function getTypeErrorContext(it) { - const { gen, data, schema } = it; - const schemaCode = (0, util_1.schemaRefOrVal)(it, schema, "type"); - return { - gen, - keyword: "type", - data, - schema: schema.type, - schemaCode, - schemaValue: schemaCode, - parentSchema: schema, - params: {}, - it - }; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js -var require_defaults2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/defaults.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.assignDefaults = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - function assignDefaults(it, ty) { - const { properties, items } = it.schema; - if (ty === "object" && properties) { - for (const key in properties) { - assignDefault(it, key, properties[key].default); - } - } else if (ty === "array" && Array.isArray(items)) { - items.forEach((sch, i) => assignDefault(it, i, sch.default)); - } - } - exports.assignDefaults = assignDefaults; - function assignDefault(it, prop, defaultValue) { - const { gen, compositeRule, data, opts } = it; - if (defaultValue === void 0) - return; - const childData = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(prop)}`; - if (compositeRule) { - (0, util_1.checkStrictMode)(it, `default is ignored for: ${childData}`); - return; - } - let condition = (0, codegen_1._)`${childData} === undefined`; - if (opts.useDefaults === "empty") { - condition = (0, codegen_1._)`${condition} || ${childData} === null || ${childData} === ""`; - } - gen.if(condition, (0, codegen_1._)`${childData} = ${(0, codegen_1.stringify)(defaultValue)}`); - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js -var require_code4 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/code.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var names_1 = require_names2(); - var util_2 = require_util2(); - function checkReportMissingProp(cxt, prop) { - const { gen, data, it } = cxt; - gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => { - cxt.setParams({ missingProperty: (0, codegen_1._)`${prop}` }, true); - cxt.error(); - }); - } - exports.checkReportMissingProp = checkReportMissingProp; - function checkMissingProp({ gen, data, it: { opts } }, properties, missing) { - return (0, codegen_1.or)(...properties.map((prop) => (0, codegen_1.and)(noPropertyInData(gen, data, prop, opts.ownProperties), (0, codegen_1._)`${missing} = ${prop}`))); - } - exports.checkMissingProp = checkMissingProp; - function reportMissingProp(cxt, missing) { - cxt.setParams({ missingProperty: missing }, true); - cxt.error(); - } - exports.reportMissingProp = reportMissingProp; - function hasPropFunc(gen) { - return gen.scopeValue("func", { - // eslint-disable-next-line @typescript-eslint/unbound-method - ref: Object.prototype.hasOwnProperty, - code: (0, codegen_1._)`Object.prototype.hasOwnProperty` - }); - } - exports.hasPropFunc = hasPropFunc; - function isOwnProperty(gen, data, property) { - return (0, codegen_1._)`${hasPropFunc(gen)}.call(${data}, ${property})`; - } - exports.isOwnProperty = isOwnProperty; - function propertyInData(gen, data, property, ownProperties) { - const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} !== undefined`; - return ownProperties ? (0, codegen_1._)`${cond} && ${isOwnProperty(gen, data, property)}` : cond; - } - exports.propertyInData = propertyInData; - function noPropertyInData(gen, data, property, ownProperties) { - const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} === undefined`; - return ownProperties ? (0, codegen_1.or)(cond, (0, codegen_1.not)(isOwnProperty(gen, data, property))) : cond; - } - exports.noPropertyInData = noPropertyInData; - function allSchemaProperties(schemaMap) { - return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : []; - } - exports.allSchemaProperties = allSchemaProperties; - function schemaProperties(it, schemaMap) { - return allSchemaProperties(schemaMap).filter((p) => !(0, util_1.alwaysValidSchema)(it, schemaMap[p])); - } - exports.schemaProperties = schemaProperties; - function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) { - const dataAndSchema = passSchema ? (0, codegen_1._)`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data; - const valCxt = [ - [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, errorPath)], - [names_1.default.parentData, it.parentData], - [names_1.default.parentDataProperty, it.parentDataProperty], - [names_1.default.rootData, names_1.default.rootData] - ]; - if (it.opts.dynamicRef) - valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]); - const args = (0, codegen_1._)`${dataAndSchema}, ${gen.object(...valCxt)}`; - return context !== codegen_1.nil ? (0, codegen_1._)`${func}.call(${context}, ${args})` : (0, codegen_1._)`${func}(${args})`; - } - exports.callValidateCode = callValidateCode; - var newRegExp = (0, codegen_1._)`new RegExp`; - function usePattern({ gen, it: { opts } }, pattern) { - const u = opts.unicodeRegExp ? "u" : ""; - const { regExp } = opts.code; - const rx = regExp(pattern, u); - return gen.scopeValue("pattern", { - key: rx.toString(), - ref: rx, - code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` - }); - } - exports.usePattern = usePattern; - function validateArray(cxt) { - const { gen, data, keyword, it } = cxt; - const valid = gen.name("valid"); - if (it.allErrors) { - const validArr = gen.let("valid", true); - validateItems(() => gen.assign(validArr, false)); - return validArr; - } - gen.var(valid, true); - validateItems(() => gen.break()); - return valid; - function validateItems(notValid) { - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - gen.forRange("i", 0, len, (i) => { - cxt.subschema({ - keyword, - dataProp: i, - dataPropType: util_1.Type.Num - }, valid); - gen.if((0, codegen_1.not)(valid), notValid); - }); - } - } - exports.validateArray = validateArray; - function validateUnion(cxt) { - const { gen, schema, keyword, it } = cxt; - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - const alwaysValid = schema.some((sch) => (0, util_1.alwaysValidSchema)(it, sch)); - if (alwaysValid && !it.opts.unevaluated) - return; - const valid = gen.let("valid", false); - const schValid = gen.name("_valid"); - gen.block(() => schema.forEach((_sch, i) => { - const schCxt = cxt.subschema({ - keyword, - schemaProp: i, - compositeRule: true - }, schValid); - gen.assign(valid, (0, codegen_1._)`${valid} || ${schValid}`); - const merged = cxt.mergeValidEvaluated(schCxt, schValid); - if (!merged) - gen.if((0, codegen_1.not)(valid)); - })); - cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); - } - exports.validateUnion = validateUnion; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js -var require_keyword2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/keyword.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var code_1 = require_code4(); - var errors_1 = require_errors2(); - function macroKeywordCode(cxt, def) { - const { gen, keyword, schema, parentSchema, it } = cxt; - const macroSchema = def.macro.call(it.self, schema, parentSchema, it); - const schemaRef = useKeyword(gen, keyword, macroSchema); - if (it.opts.validateSchema !== false) - it.self.validateSchema(macroSchema, true); - const valid = gen.name("valid"); - cxt.subschema({ - schema: macroSchema, - schemaPath: codegen_1.nil, - errSchemaPath: `${it.errSchemaPath}/${keyword}`, - topSchemaRef: schemaRef, - compositeRule: true - }, valid); - cxt.pass(valid, () => cxt.error(true)); - } - exports.macroKeywordCode = macroKeywordCode; - function funcKeywordCode(cxt, def) { - var _a3; - const { gen, keyword, schema, parentSchema, $data, it } = cxt; - checkAsyncKeyword(it, def); - const validate2 = !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate; - const validateRef = useKeyword(gen, keyword, validate2); - const valid = gen.let("valid"); - cxt.block$data(valid, validateKeyword); - cxt.ok((_a3 = def.valid) !== null && _a3 !== void 0 ? _a3 : valid); - function validateKeyword() { - if (def.errors === false) { - assignValid(); - if (def.modifying) - modifyData(cxt); - reportErrs(() => cxt.error()); - } else { - const ruleErrs = def.async ? validateAsync2() : validateSync(); - if (def.modifying) - modifyData(cxt); - reportErrs(() => addErrs(cxt, ruleErrs)); - } - } - function validateAsync2() { - const ruleErrs = gen.let("ruleErrs", null); - gen.try(() => assignValid((0, codegen_1._)`await `), (e) => gen.assign(valid, false).if((0, codegen_1._)`${e} instanceof ${it.ValidationError}`, () => gen.assign(ruleErrs, (0, codegen_1._)`${e}.errors`), () => gen.throw(e))); - return ruleErrs; - } - function validateSync() { - const validateErrs = (0, codegen_1._)`${validateRef}.errors`; - gen.assign(validateErrs, null); - assignValid(codegen_1.nil); - return validateErrs; - } - function assignValid(_await = def.async ? (0, codegen_1._)`await ` : codegen_1.nil) { - const passCxt = it.opts.passContext ? names_1.default.this : names_1.default.self; - const passSchema = !("compile" in def && !$data || def.schema === false); - gen.assign(valid, (0, codegen_1._)`${_await}${(0, code_1.callValidateCode)(cxt, validateRef, passCxt, passSchema)}`, def.modifying); - } - function reportErrs(errors) { - var _a4; - gen.if((0, codegen_1.not)((_a4 = def.valid) !== null && _a4 !== void 0 ? _a4 : valid), errors); - } - } - exports.funcKeywordCode = funcKeywordCode; - function modifyData(cxt) { - const { gen, data, it } = cxt; - gen.if(it.parentData, () => gen.assign(data, (0, codegen_1._)`${it.parentData}[${it.parentDataProperty}]`)); - } - function addErrs(cxt, errs) { - const { gen } = cxt; - gen.if((0, codegen_1._)`Array.isArray(${errs})`, () => { - gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`).assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); - (0, errors_1.extendErrors)(cxt); - }, () => cxt.error()); - } - function checkAsyncKeyword({ schemaEnv }, def) { - if (def.async && !schemaEnv.$async) - throw new Error("async keyword in sync schema"); - } - function useKeyword(gen, keyword, result) { - if (result === void 0) - throw new Error(`keyword "${keyword}" failed to compile`); - return gen.scopeValue("keyword", typeof result == "function" ? { ref: result } : { ref: result, code: (0, codegen_1.stringify)(result) }); - } - function validSchemaType(schema, schemaType, allowUndefined = false) { - return !schemaType.length || schemaType.some((st) => st === "array" ? Array.isArray(schema) : st === "object" ? schema && typeof schema == "object" && !Array.isArray(schema) : typeof schema == st || allowUndefined && typeof schema == "undefined"); - } - exports.validSchemaType = validSchemaType; - function validateKeywordUsage({ schema, opts, self, errSchemaPath }, def, keyword) { - if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) { - throw new Error("ajv implementation error"); - } - const deps = def.dependencies; - if (deps === null || deps === void 0 ? void 0 : deps.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) { - throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(",")}`); - } - if (def.validateSchema) { - const valid = def.validateSchema(schema[keyword]); - if (!valid) { - const msg = `keyword "${keyword}" value is invalid at path "${errSchemaPath}": ` + self.errorsText(def.validateSchema.errors); - if (opts.validateSchema === "log") - self.logger.error(msg); - else - throw new Error(msg); - } - } - } - exports.validateKeywordUsage = validateKeywordUsage; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js -var require_subschema2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/subschema.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - function getSubschema(it, { keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef }) { - if (keyword !== void 0 && schema !== void 0) { - throw new Error('both "keyword" and "schema" passed, only one allowed'); - } - if (keyword !== void 0) { - const sch = it.schema[keyword]; - return schemaProp === void 0 ? { - schema: sch, - schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}`, - errSchemaPath: `${it.errSchemaPath}/${keyword}` - } : { - schema: sch[schemaProp], - schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}${(0, codegen_1.getProperty)(schemaProp)}`, - errSchemaPath: `${it.errSchemaPath}/${keyword}/${(0, util_1.escapeFragment)(schemaProp)}` - }; - } - if (schema !== void 0) { - if (schemaPath === void 0 || errSchemaPath === void 0 || topSchemaRef === void 0) { - throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"'); - } - return { - schema, - schemaPath, - topSchemaRef, - errSchemaPath - }; - } - throw new Error('either "keyword" or "schema" must be passed'); - } - exports.getSubschema = getSubschema; - function extendSubschemaData(subschema, it, { dataProp, dataPropType: dpType, data, dataTypes, propertyName }) { - if (data !== void 0 && dataProp !== void 0) { - throw new Error('both "data" and "dataProp" passed, only one allowed'); - } - const { gen } = it; - if (dataProp !== void 0) { - const { errorPath, dataPathArr, opts } = it; - const nextData = gen.let("data", (0, codegen_1._)`${it.data}${(0, codegen_1.getProperty)(dataProp)}`, true); - dataContextProps(nextData); - subschema.errorPath = (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(dataProp, dpType, opts.jsPropertySyntax)}`; - subschema.parentDataProperty = (0, codegen_1._)`${dataProp}`; - subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty]; - } - if (data !== void 0) { - const nextData = data instanceof codegen_1.Name ? data : gen.let("data", data, true); - dataContextProps(nextData); - if (propertyName !== void 0) - subschema.propertyName = propertyName; - } - if (dataTypes) - subschema.dataTypes = dataTypes; - function dataContextProps(_nextData) { - subschema.data = _nextData; - subschema.dataLevel = it.dataLevel + 1; - subschema.dataTypes = []; - it.definedProperties = /* @__PURE__ */ new Set(); - subschema.parentData = it.data; - subschema.dataNames = [...it.dataNames, _nextData]; - } - } - exports.extendSubschemaData = extendSubschemaData; - function extendSubschemaMode(subschema, { jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors }) { - if (compositeRule !== void 0) - subschema.compositeRule = compositeRule; - if (createErrors !== void 0) - subschema.createErrors = createErrors; - if (allErrors !== void 0) - subschema.allErrors = allErrors; - subschema.jtdDiscriminator = jtdDiscriminator; - subschema.jtdMetadata = jtdMetadata; - } - exports.extendSubschemaMode = extendSubschemaMode; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js -var require_resolve2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/resolve.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; - var util_1 = require_util2(); - var equal = require_fast_deep_equal(); - var traverse = require_json_schema_traverse(); - var SIMPLE_INLINED = /* @__PURE__ */ new Set([ - "type", - "format", - "pattern", - "maxLength", - "minLength", - "maxProperties", - "minProperties", - "maxItems", - "minItems", - "maximum", - "minimum", - "uniqueItems", - "multipleOf", - "required", - "enum", - "const" - ]); - function inlineRef(schema, limit = true) { - if (typeof schema == "boolean") - return true; - if (limit === true) - return !hasRef(schema); - if (!limit) - return false; - return countKeys(schema) <= limit; - } - exports.inlineRef = inlineRef; - var REF_KEYWORDS = /* @__PURE__ */ new Set([ - "$ref", - "$recursiveRef", - "$recursiveAnchor", - "$dynamicRef", - "$dynamicAnchor" - ]); - function hasRef(schema) { - for (const key in schema) { - if (REF_KEYWORDS.has(key)) - return true; - const sch = schema[key]; - if (Array.isArray(sch) && sch.some(hasRef)) - return true; - if (typeof sch == "object" && hasRef(sch)) - return true; - } - return false; - } - function countKeys(schema) { - let count = 0; - for (const key in schema) { - if (key === "$ref") - return Infinity; - count++; - if (SIMPLE_INLINED.has(key)) - continue; - if (typeof schema[key] == "object") { - (0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch)); - } - if (count === Infinity) - return Infinity; - } - return count; - } - function getFullPath(resolver, id = "", normalize) { - if (normalize !== false) - id = normalizeId(id); - const p = resolver.parse(id); - return _getFullPath(resolver, p); - } - exports.getFullPath = getFullPath; - function _getFullPath(resolver, p) { - const serialized = resolver.serialize(p); - return serialized.split("#")[0] + "#"; - } - exports._getFullPath = _getFullPath; - var TRAILING_SLASH_HASH = /#\/?$/; - function normalizeId(id) { - return id ? id.replace(TRAILING_SLASH_HASH, "") : ""; - } - exports.normalizeId = normalizeId; - function resolveUrl(resolver, baseId, id) { - id = normalizeId(id); - return resolver.resolve(baseId, id); - } - exports.resolveUrl = resolveUrl; - var ANCHOR = /^[a-z_][-a-z0-9._]*$/i; - function getSchemaRefs(schema, baseId) { - if (typeof schema == "boolean") - return {}; - const { schemaId, uriResolver } = this.opts; - const schId = normalizeId(schema[schemaId] || baseId); - const baseIds = { "": schId }; - const pathPrefix = getFullPath(uriResolver, schId, false); - const localRefs = {}; - const schemaRefs = /* @__PURE__ */ new Set(); - traverse(schema, { allKeys: true }, (sch, jsonPtr, _2, parentJsonPtr) => { - if (parentJsonPtr === void 0) - return; - const fullPath = pathPrefix + jsonPtr; - let innerBaseId = baseIds[parentJsonPtr]; - if (typeof sch[schemaId] == "string") - innerBaseId = addRef.call(this, sch[schemaId]); - addAnchor.call(this, sch.$anchor); - addAnchor.call(this, sch.$dynamicAnchor); - baseIds[jsonPtr] = innerBaseId; - function addRef(ref) { - const _resolve = this.opts.uriResolver.resolve; - ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref); - if (schemaRefs.has(ref)) - throw ambiguos(ref); - schemaRefs.add(ref); - let schOrRef = this.refs[ref]; - if (typeof schOrRef == "string") - schOrRef = this.refs[schOrRef]; - if (typeof schOrRef == "object") { - checkAmbiguosRef(sch, schOrRef.schema, ref); - } else if (ref !== normalizeId(fullPath)) { - if (ref[0] === "#") { - checkAmbiguosRef(sch, localRefs[ref], ref); - localRefs[ref] = sch; - } else { - this.refs[ref] = fullPath; - } - } - return ref; - } - function addAnchor(anchor2) { - if (typeof anchor2 == "string") { - if (!ANCHOR.test(anchor2)) - throw new Error(`invalid anchor "${anchor2}"`); - addRef.call(this, `#${anchor2}`); - } - } - }); - return localRefs; - function checkAmbiguosRef(sch1, sch2, ref) { - if (sch2 !== void 0 && !equal(sch1, sch2)) - throw ambiguos(ref); - } - function ambiguos(ref) { - return new Error(`reference "${ref}" resolves to more than one schema`); - } - } - exports.getSchemaRefs = getSchemaRefs; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js -var require_validate2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/validate/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; - var boolSchema_1 = require_boolSchema2(); - var dataType_1 = require_dataType2(); - var applicability_1 = require_applicability2(); - var dataType_2 = require_dataType2(); - var defaults_1 = require_defaults2(); - var keyword_1 = require_keyword2(); - var subschema_1 = require_subschema2(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var resolve_1 = require_resolve2(); - var util_1 = require_util2(); - var errors_1 = require_errors2(); - function validateFunctionCode(it) { - if (isSchemaObj(it)) { - checkKeywords(it); - if (schemaCxtHasRules(it)) { - topSchemaObjCode(it); - return; - } - } - validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it)); - } - exports.validateFunctionCode = validateFunctionCode; - function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) { - if (opts.code.es5) { - gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => { - gen.code((0, codegen_1._)`"use strict"; ${funcSourceUrl(schema, opts)}`); - destructureValCxtES5(gen, opts); - gen.code(body); - }); - } else { - gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body)); - } - } - function destructureValCxt(opts) { - return (0, codegen_1._)`{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._)`, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`; - } - function destructureValCxtES5(gen, opts) { - gen.if(names_1.default.valCxt, () => { - gen.var(names_1.default.instancePath, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.instancePath}`); - gen.var(names_1.default.parentData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentData}`); - gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentDataProperty}`); - gen.var(names_1.default.rootData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.rootData}`); - if (opts.dynamicRef) - gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`); - }, () => { - gen.var(names_1.default.instancePath, (0, codegen_1._)`""`); - gen.var(names_1.default.parentData, (0, codegen_1._)`undefined`); - gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`undefined`); - gen.var(names_1.default.rootData, names_1.default.data); - if (opts.dynamicRef) - gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`{}`); - }); - } - function topSchemaObjCode(it) { - const { schema, opts, gen } = it; - validateFunction(it, () => { - if (opts.$comment && schema.$comment) - commentKeyword(it); - checkNoDefault(it); - gen.let(names_1.default.vErrors, null); - gen.let(names_1.default.errors, 0); - if (opts.unevaluated) - resetEvaluated(it); - typeAndKeywords(it); - returnResults(it); - }); - return; - } - function resetEvaluated(it) { - const { gen, validateName } = it; - it.evaluated = gen.const("evaluated", (0, codegen_1._)`${validateName}.evaluated`); - gen.if((0, codegen_1._)`${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._)`${it.evaluated}.props`, (0, codegen_1._)`undefined`)); - gen.if((0, codegen_1._)`${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._)`${it.evaluated}.items`, (0, codegen_1._)`undefined`)); - } - function funcSourceUrl(schema, opts) { - const schId = typeof schema == "object" && schema[opts.schemaId]; - return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._)`/*# sourceURL=${schId} */` : codegen_1.nil; - } - function subschemaCode(it, valid) { - if (isSchemaObj(it)) { - checkKeywords(it); - if (schemaCxtHasRules(it)) { - subSchemaObjCode(it, valid); - return; - } - } - (0, boolSchema_1.boolOrEmptySchema)(it, valid); - } - function schemaCxtHasRules({ schema, self }) { - if (typeof schema == "boolean") - return !schema; - for (const key in schema) - if (self.RULES.all[key]) - return true; - return false; - } - function isSchemaObj(it) { - return typeof it.schema != "boolean"; - } - function subSchemaObjCode(it, valid) { - const { schema, gen, opts } = it; - if (opts.$comment && schema.$comment) - commentKeyword(it); - updateContext(it); - checkAsyncSchema(it); - const errsCount = gen.const("_errs", names_1.default.errors); - typeAndKeywords(it, errsCount); - gen.var(valid, (0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); - } - function checkKeywords(it) { - (0, util_1.checkUnknownRules)(it); - checkRefsAndKeywords(it); - } - function typeAndKeywords(it, errsCount) { - if (it.opts.jtd) - return schemaKeywords(it, [], false, errsCount); - const types = (0, dataType_1.getSchemaTypes)(it.schema); - const checkedTypes = (0, dataType_1.coerceAndCheckDataType)(it, types); - schemaKeywords(it, types, !checkedTypes, errsCount); - } - function checkRefsAndKeywords(it) { - const { schema, errSchemaPath, opts, self } = it; - if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) { - self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`); - } - } - function checkNoDefault(it) { - const { schema, opts } = it; - if (schema.default !== void 0 && opts.useDefaults && opts.strictSchema) { - (0, util_1.checkStrictMode)(it, "default is ignored in the schema root"); - } - } - function updateContext(it) { - const schId = it.schema[it.opts.schemaId]; - if (schId) - it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId); - } - function checkAsyncSchema(it) { - if (it.schema.$async && !it.schemaEnv.$async) - throw new Error("async schema in sync schema"); - } - function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) { - const msg = schema.$comment; - if (opts.$comment === true) { - gen.code((0, codegen_1._)`${names_1.default.self}.logger.log(${msg})`); - } else if (typeof opts.$comment == "function") { - const schemaPath = (0, codegen_1.str)`${errSchemaPath}/$comment`; - const rootName = gen.scopeValue("root", { ref: schemaEnv.root }); - gen.code((0, codegen_1._)`${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`); - } - } - function returnResults(it) { - const { gen, schemaEnv, validateName, ValidationError, opts } = it; - if (schemaEnv.$async) { - gen.if((0, codegen_1._)`${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._)`new ${ValidationError}(${names_1.default.vErrors})`)); - } else { - gen.assign((0, codegen_1._)`${validateName}.errors`, names_1.default.vErrors); - if (opts.unevaluated) - assignEvaluated(it); - gen.return((0, codegen_1._)`${names_1.default.errors} === 0`); - } - } - function assignEvaluated({ gen, evaluated, props, items }) { - if (props instanceof codegen_1.Name) - gen.assign((0, codegen_1._)`${evaluated}.props`, props); - if (items instanceof codegen_1.Name) - gen.assign((0, codegen_1._)`${evaluated}.items`, items); - } - function schemaKeywords(it, types, typeErrors, errsCount) { - const { gen, schema, data, allErrors, opts, self } = it; - const { RULES } = self; - if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) { - gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition)); - return; - } - if (!opts.jtd) - checkStrictTypes(it, types); - gen.block(() => { - for (const group of RULES.rules) - groupKeywords(group); - groupKeywords(RULES.post); - }); - function groupKeywords(group) { - if (!(0, applicability_1.shouldUseGroup)(schema, group)) - return; - if (group.type) { - gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers)); - iterateKeywords(it, group); - if (types.length === 1 && types[0] === group.type && typeErrors) { - gen.else(); - (0, dataType_2.reportTypeError)(it); - } - gen.endIf(); - } else { - iterateKeywords(it, group); - } - if (!allErrors) - gen.if((0, codegen_1._)`${names_1.default.errors} === ${errsCount || 0}`); - } - } - function iterateKeywords(it, group) { - const { gen, schema, opts: { useDefaults } } = it; - if (useDefaults) - (0, defaults_1.assignDefaults)(it, group.type); - gen.block(() => { - for (const rule of group.rules) { - if ((0, applicability_1.shouldUseRule)(schema, rule)) { - keywordCode(it, rule.keyword, rule.definition, group.type); - } - } - }); - } - function checkStrictTypes(it, types) { - if (it.schemaEnv.meta || !it.opts.strictTypes) - return; - checkContextTypes(it, types); - if (!it.opts.allowUnionTypes) - checkMultipleTypes(it, types); - checkKeywordTypes(it, it.dataTypes); - } - function checkContextTypes(it, types) { - if (!types.length) - return; - if (!it.dataTypes.length) { - it.dataTypes = types; - return; - } - types.forEach((t) => { - if (!includesType(it.dataTypes, t)) { - strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`); - } - }); - narrowSchemaTypes(it, types); - } - function checkMultipleTypes(it, ts) { - if (ts.length > 1 && !(ts.length === 2 && ts.includes("null"))) { - strictTypesError(it, "use allowUnionTypes to allow union type keyword"); - } - } - function checkKeywordTypes(it, ts) { - const rules = it.self.RULES.all; - for (const keyword in rules) { - const rule = rules[keyword]; - if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) { - const { type } = rule.definition; - if (type.length && !type.some((t) => hasApplicableType(ts, t))) { - strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`); - } - } - } - } - function hasApplicableType(schTs, kwdT) { - return schTs.includes(kwdT) || kwdT === "number" && schTs.includes("integer"); - } - function includesType(ts, t) { - return ts.includes(t) || t === "integer" && ts.includes("number"); - } - function narrowSchemaTypes(it, withTypes) { - const ts = []; - for (const t of it.dataTypes) { - if (includesType(withTypes, t)) - ts.push(t); - else if (withTypes.includes("integer") && t === "number") - ts.push("integer"); - } - it.dataTypes = ts; - } - function strictTypesError(it, msg) { - const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; - msg += ` at "${schemaPath}" (strictTypes)`; - (0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes); - } - var KeywordCxt = class { - constructor(it, def, keyword) { - (0, keyword_1.validateKeywordUsage)(it, def, keyword); - this.gen = it.gen; - this.allErrors = it.allErrors; - this.keyword = keyword; - this.data = it.data; - this.schema = it.schema[keyword]; - this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data; - this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data); - this.schemaType = def.schemaType; - this.parentSchema = it.schema; - this.params = {}; - this.it = it; - this.def = def; - if (this.$data) { - this.schemaCode = it.gen.const("vSchema", getData(this.$data, it)); - } else { - this.schemaCode = this.schemaValue; - if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) { - throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`); - } - } - if ("code" in def ? def.trackErrors : def.errors !== false) { - this.errsCount = it.gen.const("_errs", names_1.default.errors); - } - } - result(condition, successAction, failAction) { - this.failResult((0, codegen_1.not)(condition), successAction, failAction); - } - failResult(condition, successAction, failAction) { - this.gen.if(condition); - if (failAction) - failAction(); - else - this.error(); - if (successAction) { - this.gen.else(); - successAction(); - if (this.allErrors) - this.gen.endIf(); - } else { - if (this.allErrors) - this.gen.endIf(); - else - this.gen.else(); - } - } - pass(condition, failAction) { - this.failResult((0, codegen_1.not)(condition), void 0, failAction); - } - fail(condition) { - if (condition === void 0) { - this.error(); - if (!this.allErrors) - this.gen.if(false); - return; - } - this.gen.if(condition); - this.error(); - if (this.allErrors) - this.gen.endIf(); - else - this.gen.else(); - } - fail$data(condition) { - if (!this.$data) - return this.fail(condition); - const { schemaCode } = this; - this.fail((0, codegen_1._)`${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`); - } - error(append, errorParams, errorPaths) { - if (errorParams) { - this.setParams(errorParams); - this._error(append, errorPaths); - this.setParams({}); - return; - } - this._error(append, errorPaths); - } - _error(append, errorPaths) { - ; - (append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths); - } - $dataError() { - (0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError); - } - reset() { - if (this.errsCount === void 0) - throw new Error('add "trackErrors" to keyword definition'); - (0, errors_1.resetErrorsCount)(this.gen, this.errsCount); - } - ok(cond) { - if (!this.allErrors) - this.gen.if(cond); - } - setParams(obj, assign) { - if (assign) - Object.assign(this.params, obj); - else - this.params = obj; - } - block$data(valid, codeBlock, $dataValid = codegen_1.nil) { - this.gen.block(() => { - this.check$data(valid, $dataValid); - codeBlock(); - }); - } - check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) { - if (!this.$data) - return; - const { gen, schemaCode, schemaType, def } = this; - gen.if((0, codegen_1.or)((0, codegen_1._)`${schemaCode} === undefined`, $dataValid)); - if (valid !== codegen_1.nil) - gen.assign(valid, true); - if (schemaType.length || def.validateSchema) { - gen.elseIf(this.invalid$data()); - this.$dataError(); - if (valid !== codegen_1.nil) - gen.assign(valid, false); - } - gen.else(); - } - invalid$data() { - const { gen, schemaCode, schemaType, def, it } = this; - return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema()); - function wrong$DataType() { - if (schemaType.length) { - if (!(schemaCode instanceof codegen_1.Name)) - throw new Error("ajv implementation error"); - const st = Array.isArray(schemaType) ? schemaType : [schemaType]; - return (0, codegen_1._)`${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`; - } - return codegen_1.nil; - } - function invalid$DataSchema() { - if (def.validateSchema) { - const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema }); - return (0, codegen_1._)`!${validateSchemaRef}(${schemaCode})`; - } - return codegen_1.nil; - } - } - subschema(appl, valid) { - const subschema = (0, subschema_1.getSubschema)(this.it, appl); - (0, subschema_1.extendSubschemaData)(subschema, this.it, appl); - (0, subschema_1.extendSubschemaMode)(subschema, appl); - const nextContext = { ...this.it, ...subschema, items: void 0, props: void 0 }; - subschemaCode(nextContext, valid); - return nextContext; - } - mergeEvaluated(schemaCxt, toName) { - const { it, gen } = this; - if (!it.opts.unevaluated) - return; - if (it.props !== true && schemaCxt.props !== void 0) { - it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName); - } - if (it.items !== true && schemaCxt.items !== void 0) { - it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName); - } - } - mergeValidEvaluated(schemaCxt, valid) { - const { it, gen } = this; - if (it.opts.unevaluated && (it.props !== true || it.items !== true)) { - gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name)); - return true; - } - } - }; - exports.KeywordCxt = KeywordCxt; - function keywordCode(it, keyword, def, ruleType) { - const cxt = new KeywordCxt(it, def, keyword); - if ("code" in def) { - def.code(cxt, ruleType); - } else if (cxt.$data && def.validate) { - (0, keyword_1.funcKeywordCode)(cxt, def); - } else if ("macro" in def) { - (0, keyword_1.macroKeywordCode)(cxt, def); - } else if (def.compile || def.validate) { - (0, keyword_1.funcKeywordCode)(cxt, def); - } - } - var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/; - var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/; - function getData($data, { dataLevel, dataNames, dataPathArr }) { - let jsonPointer; - let data; - if ($data === "") - return names_1.default.rootData; - if ($data[0] === "/") { - if (!JSON_POINTER.test($data)) - throw new Error(`Invalid JSON-pointer: ${$data}`); - jsonPointer = $data; - data = names_1.default.rootData; - } else { - const matches = RELATIVE_JSON_POINTER.exec($data); - if (!matches) - throw new Error(`Invalid JSON-pointer: ${$data}`); - const up = +matches[1]; - jsonPointer = matches[2]; - if (jsonPointer === "#") { - if (up >= dataLevel) - throw new Error(errorMsg("property/index", up)); - return dataPathArr[dataLevel - up]; - } - if (up > dataLevel) - throw new Error(errorMsg("data", up)); - data = dataNames[dataLevel - up]; - if (!jsonPointer) - return data; - } - let expr = data; - const segments = jsonPointer.split("/"); - for (const segment of segments) { - if (segment) { - data = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`; - expr = (0, codegen_1._)`${expr} && ${data}`; - } - } - return expr; - function errorMsg(pointerType, up) { - return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`; - } - } - exports.getData = getData; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js -var require_validation_error2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/validation_error.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ValidationError = class extends Error { - constructor(errors) { - super("validation failed"); - this.errors = errors; - this.ajv = this.validation = true; - } - }; - exports.default = ValidationError; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js -var require_ref_error2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/ref_error.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var resolve_1 = require_resolve2(); - var MissingRefError = class extends Error { - constructor(resolver, baseId, ref, msg) { - super(msg || `can't resolve reference ${ref} from id ${baseId}`); - this.missingRef = (0, resolve_1.resolveUrl)(resolver, baseId, ref); - this.missingSchema = (0, resolve_1.normalizeId)((0, resolve_1.getFullPath)(resolver, this.missingRef)); - } - }; - exports.default = MissingRefError; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js -var require_compile2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/compile/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; - var codegen_1 = require_codegen2(); - var validation_error_1 = require_validation_error2(); - var names_1 = require_names2(); - var resolve_1 = require_resolve2(); - var util_1 = require_util2(); - var validate_1 = require_validate2(); - var SchemaEnv = class { - constructor(env) { - var _a3; - this.refs = {}; - this.dynamicAnchors = {}; - let schema; - if (typeof env.schema == "object") - schema = env.schema; - this.schema = env.schema; - this.schemaId = env.schemaId; - this.root = env.root || this; - this.baseId = (_a3 = env.baseId) !== null && _a3 !== void 0 ? _a3 : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]); - this.schemaPath = env.schemaPath; - this.localRefs = env.localRefs; - this.meta = env.meta; - this.$async = schema === null || schema === void 0 ? void 0 : schema.$async; - this.refs = {}; - } - }; - exports.SchemaEnv = SchemaEnv; - function compileSchema(sch) { - const _sch = getCompilingSchema.call(this, sch); - if (_sch) - return _sch; - const rootId = (0, resolve_1.getFullPath)(this.opts.uriResolver, sch.root.baseId); - const { es5, lines } = this.opts.code; - const { ownProperties } = this.opts; - const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties }); - let _ValidationError; - if (sch.$async) { - _ValidationError = gen.scopeValue("Error", { - ref: validation_error_1.default, - code: (0, codegen_1._)`require("ajv/dist/runtime/validation_error").default` - }); - } - const validateName = gen.scopeName("validate"); - sch.validateName = validateName; - const schemaCxt = { - gen, - allErrors: this.opts.allErrors, - data: names_1.default.data, - parentData: names_1.default.parentData, - parentDataProperty: names_1.default.parentDataProperty, - dataNames: [names_1.default.data], - dataPathArr: [codegen_1.nil], - // TODO can its length be used as dataLevel if nil is removed? - dataLevel: 0, - dataTypes: [], - definedProperties: /* @__PURE__ */ new Set(), - topSchemaRef: gen.scopeValue("schema", this.opts.code.source === true ? { ref: sch.schema, code: (0, codegen_1.stringify)(sch.schema) } : { ref: sch.schema }), - validateName, - ValidationError: _ValidationError, - schema: sch.schema, - schemaEnv: sch, - rootId, - baseId: sch.baseId || rootId, - schemaPath: codegen_1.nil, - errSchemaPath: sch.schemaPath || (this.opts.jtd ? "" : "#"), - errorPath: (0, codegen_1._)`""`, - opts: this.opts, - self: this - }; - let sourceCode; - try { - this._compilations.add(sch); - (0, validate_1.validateFunctionCode)(schemaCxt); - gen.optimize(this.opts.code.optimize); - const validateCode = gen.toString(); - sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${validateCode}`; - if (this.opts.code.process) - sourceCode = this.opts.code.process(sourceCode, sch); - const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); - const validate2 = makeValidate(this, this.scope.get()); - this.scope.value(validateName, { ref: validate2 }); - validate2.errors = null; - validate2.schema = sch.schema; - validate2.schemaEnv = sch; - if (sch.$async) - validate2.$async = true; - if (this.opts.code.source === true) { - validate2.source = { validateName, validateCode, scopeValues: gen._values }; - } - if (this.opts.unevaluated) { - const { props, items } = schemaCxt; - validate2.evaluated = { - props: props instanceof codegen_1.Name ? void 0 : props, - items: items instanceof codegen_1.Name ? void 0 : items, - dynamicProps: props instanceof codegen_1.Name, - dynamicItems: items instanceof codegen_1.Name - }; - if (validate2.source) - validate2.source.evaluated = (0, codegen_1.stringify)(validate2.evaluated); - } - sch.validate = validate2; - return sch; - } catch (e) { - delete sch.validate; - delete sch.validateName; - if (sourceCode) - this.logger.error("Error compiling schema, function code:", sourceCode); - throw e; - } finally { - this._compilations.delete(sch); - } - } - exports.compileSchema = compileSchema; - function resolveRef2(root, baseId, ref) { - var _a3; - ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref); - const schOrFunc = root.refs[ref]; - if (schOrFunc) - return schOrFunc; - let _sch = resolve.call(this, root, ref); - if (_sch === void 0) { - const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref]; - const { schemaId } = this.opts; - if (schema) - _sch = new SchemaEnv({ schema, schemaId, root, baseId }); - } - if (_sch === void 0) - return; - return root.refs[ref] = inlineOrCompile.call(this, _sch); - } - exports.resolveRef = resolveRef2; - function inlineOrCompile(sch) { - if ((0, resolve_1.inlineRef)(sch.schema, this.opts.inlineRefs)) - return sch.schema; - return sch.validate ? sch : compileSchema.call(this, sch); - } - function getCompilingSchema(schEnv) { - for (const sch of this._compilations) { - if (sameSchemaEnv(sch, schEnv)) - return sch; - } - } - exports.getCompilingSchema = getCompilingSchema; - function sameSchemaEnv(s1, s2) { - return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId; - } - function resolve(root, ref) { - let sch; - while (typeof (sch = this.refs[ref]) == "string") - ref = sch; - return sch || this.schemas[ref] || resolveSchema.call(this, root, ref); - } - function resolveSchema(root, ref) { - const p = this.opts.uriResolver.parse(ref); - const refPath = (0, resolve_1._getFullPath)(this.opts.uriResolver, p); - let baseId = (0, resolve_1.getFullPath)(this.opts.uriResolver, root.baseId, void 0); - if (Object.keys(root.schema).length > 0 && refPath === baseId) { - return getJsonPointer.call(this, p, root); - } - const id = (0, resolve_1.normalizeId)(refPath); - const schOrRef = this.refs[id] || this.schemas[id]; - if (typeof schOrRef == "string") { - const sch = resolveSchema.call(this, root, schOrRef); - if (typeof (sch === null || sch === void 0 ? void 0 : sch.schema) !== "object") - return; - return getJsonPointer.call(this, p, sch); - } - if (typeof (schOrRef === null || schOrRef === void 0 ? void 0 : schOrRef.schema) !== "object") - return; - if (!schOrRef.validate) - compileSchema.call(this, schOrRef); - if (id === (0, resolve_1.normalizeId)(ref)) { - const { schema } = schOrRef; - const { schemaId } = this.opts; - const schId = schema[schemaId]; - if (schId) - baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); - return new SchemaEnv({ schema, schemaId, root, baseId }); - } - return getJsonPointer.call(this, p, schOrRef); - } - exports.resolveSchema = resolveSchema; - var PREVENT_SCOPE_CHANGE = /* @__PURE__ */ new Set([ - "properties", - "patternProperties", - "enum", - "dependencies", - "definitions" - ]); - function getJsonPointer(parsedRef, { baseId, schema, root }) { - var _a3; - if (((_a3 = parsedRef.fragment) === null || _a3 === void 0 ? void 0 : _a3[0]) !== "/") - return; - for (const part of parsedRef.fragment.slice(1).split("/")) { - if (typeof schema === "boolean") - return; - const partSchema = schema[(0, util_1.unescapeFragment)(part)]; - if (partSchema === void 0) - return; - schema = partSchema; - const schId = typeof schema === "object" && schema[this.opts.schemaId]; - if (!PREVENT_SCOPE_CHANGE.has(part) && schId) { - baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); - } - } - let env; - if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) { - const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref); - env = resolveSchema.call(this, root, $ref); - } - const { schemaId } = this.opts; - env = env || new SchemaEnv({ schema, schemaId, root, baseId }); - if (env.schema !== env.root.schema) - return env; - return void 0; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json -var require_data2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/refs/data.json"(exports, module) { - module.exports = { - $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", - description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", - type: "object", - required: ["$data"], - properties: { - $data: { - type: "string", - anyOf: [{ format: "relative-json-pointer" }, { format: "json-pointer" }] - } - }, - additionalProperties: false - }; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js -var require_uri2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/uri.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var uri = require_fast_uri(); - uri.code = 'require("ajv/dist/runtime/uri").default'; - exports.default = uri; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/core.js -var require_core3 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/core.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; - var validate_1 = require_validate2(); - Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { - return validate_1.KeywordCxt; - } }); - var codegen_1 = require_codegen2(); - Object.defineProperty(exports, "_", { enumerable: true, get: function() { - return codegen_1._; - } }); - Object.defineProperty(exports, "str", { enumerable: true, get: function() { - return codegen_1.str; - } }); - Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { - return codegen_1.stringify; - } }); - Object.defineProperty(exports, "nil", { enumerable: true, get: function() { - return codegen_1.nil; - } }); - Object.defineProperty(exports, "Name", { enumerable: true, get: function() { - return codegen_1.Name; - } }); - Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { - return codegen_1.CodeGen; - } }); - var validation_error_1 = require_validation_error2(); - var ref_error_1 = require_ref_error2(); - var rules_1 = require_rules2(); - var compile_1 = require_compile2(); - var codegen_2 = require_codegen2(); - var resolve_1 = require_resolve2(); - var dataType_1 = require_dataType2(); - var util_1 = require_util2(); - var $dataRefSchema = require_data2(); - var uri_1 = require_uri2(); - var defaultRegExp = (str, flags) => new RegExp(str, flags); - defaultRegExp.code = "new RegExp"; - var META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes"]; - var EXT_SCOPE_NAMES = /* @__PURE__ */ new Set([ - "validate", - "serialize", - "parse", - "wrapper", - "root", - "schema", - "keyword", - "pattern", - "formats", - "validate$data", - "func", - "obj", - "Error" - ]); - var removedOptions = { - errorDataPath: "", - format: "`validateFormats: false` can be used instead.", - nullable: '"nullable" keyword is supported by default.', - jsonPointers: "Deprecated jsPropertySyntax can be used instead.", - extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.", - missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.", - processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`", - sourceCode: "Use option `code: {source: true}`", - strictDefaults: "It is default now, see option `strict`.", - strictKeywords: "It is default now, see option `strict`.", - uniqueItems: '"uniqueItems" keyword is always validated.', - unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).", - cache: "Map is used as cache, schema object as key.", - serialize: "Map is used as cache, schema object as key.", - ajvErrors: "It is default now." - }; - var deprecatedOptions = { - ignoreKeywordsWithRef: "", - jsPropertySyntax: "", - unicode: '"minLength"/"maxLength" account for unicode characters by default.' - }; - var MAX_EXPRESSION = 200; - function requiredOptions(o) { - var _a3, _b, _c, _d, _e2, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; - const s = o.strict; - const _optz = (_a3 = o.code) === null || _a3 === void 0 ? void 0 : _a3.optimize; - const optimize = _optz === true || _optz === void 0 ? 1 : _optz || 0; - const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp; - const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default; - return { - strictSchema: (_f = (_e2 = o.strictSchema) !== null && _e2 !== void 0 ? _e2 : s) !== null && _f !== void 0 ? _f : true, - strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true, - strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log", - strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log", - strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false, - code: o.code ? { ...o.code, optimize, regExp } : { optimize, regExp }, - loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION, - loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION, - meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true, - messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true, - inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true, - schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id", - addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true, - validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true, - validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true, - unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true, - int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true, - uriResolver - }; - } - var Ajv2 = class { - constructor(opts = {}) { - this.schemas = {}; - this.refs = {}; - this.formats = /* @__PURE__ */ Object.create(null); - this._compilations = /* @__PURE__ */ new Set(); - this._loading = {}; - this._cache = /* @__PURE__ */ new Map(); - opts = this.opts = { ...opts, ...requiredOptions(opts) }; - const { es5, lines } = this.opts.code; - this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines }); - this.logger = getLogger(opts.logger); - const formatOpt = opts.validateFormats; - opts.validateFormats = false; - this.RULES = (0, rules_1.getRules)(); - checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED"); - checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn"); - this._metaOpts = getMetaSchemaOptions.call(this); - if (opts.formats) - addInitialFormats.call(this); - this._addVocabularies(); - this._addDefaultMetaSchema(); - if (opts.keywords) - addInitialKeywords.call(this, opts.keywords); - if (typeof opts.meta == "object") - this.addMetaSchema(opts.meta); - addInitialSchemas.call(this); - opts.validateFormats = formatOpt; - } - _addVocabularies() { - this.addKeyword("$async"); - } - _addDefaultMetaSchema() { - const { $data, meta: meta3, schemaId } = this.opts; - let _dataRefSchema = $dataRefSchema; - if (schemaId === "id") { - _dataRefSchema = { ...$dataRefSchema }; - _dataRefSchema.id = _dataRefSchema.$id; - delete _dataRefSchema.$id; - } - if (meta3 && $data) - this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false); - } - defaultMeta() { - const { meta: meta3, schemaId } = this.opts; - return this.opts.defaultMeta = typeof meta3 == "object" ? meta3[schemaId] || meta3 : void 0; - } - validate(schemaKeyRef, data) { - let v2; - if (typeof schemaKeyRef == "string") { - v2 = this.getSchema(schemaKeyRef); - if (!v2) - throw new Error(`no schema with key or ref "${schemaKeyRef}"`); - } else { - v2 = this.compile(schemaKeyRef); - } - const valid = v2(data); - if (!("$async" in v2)) - this.errors = v2.errors; - return valid; - } - compile(schema, _meta) { - const sch = this._addSchema(schema, _meta); - return sch.validate || this._compileSchemaEnv(sch); - } - compileAsync(schema, meta3) { - if (typeof this.opts.loadSchema != "function") { - throw new Error("options.loadSchema should be a function"); - } - const { loadSchema } = this.opts; - return runCompileAsync.call(this, schema, meta3); - async function runCompileAsync(_schema, _meta) { - await loadMetaSchema.call(this, _schema.$schema); - const sch = this._addSchema(_schema, _meta); - return sch.validate || _compileAsync.call(this, sch); - } - async function loadMetaSchema($ref) { - if ($ref && !this.getSchema($ref)) { - await runCompileAsync.call(this, { $ref }, true); - } - } - async function _compileAsync(sch) { - try { - return this._compileSchemaEnv(sch); - } catch (e) { - if (!(e instanceof ref_error_1.default)) - throw e; - checkLoaded.call(this, e); - await loadMissingSchema.call(this, e.missingSchema); - return _compileAsync.call(this, sch); - } - } - function checkLoaded({ missingSchema: ref, missingRef }) { - if (this.refs[ref]) { - throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`); - } - } - async function loadMissingSchema(ref) { - const _schema = await _loadSchema.call(this, ref); - if (!this.refs[ref]) - await loadMetaSchema.call(this, _schema.$schema); - if (!this.refs[ref]) - this.addSchema(_schema, ref, meta3); - } - async function _loadSchema(ref) { - const p = this._loading[ref]; - if (p) - return p; - try { - return await (this._loading[ref] = loadSchema(ref)); - } finally { - delete this._loading[ref]; - } - } - } - // Adds schema to the instance - addSchema(schema, key, _meta, _validateSchema = this.opts.validateSchema) { - if (Array.isArray(schema)) { - for (const sch of schema) - this.addSchema(sch, void 0, _meta, _validateSchema); - return this; - } - let id; - if (typeof schema === "object") { - const { schemaId } = this.opts; - id = schema[schemaId]; - if (id !== void 0 && typeof id != "string") { - throw new Error(`schema ${schemaId} must be string`); - } - } - key = (0, resolve_1.normalizeId)(key || id); - this._checkUnique(key); - this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true); - return this; - } - // Add schema that will be used to validate other schemas - // options in META_IGNORE_OPTIONS are alway set to false - addMetaSchema(schema, key, _validateSchema = this.opts.validateSchema) { - this.addSchema(schema, key, true, _validateSchema); - return this; - } - // Validate schema against its meta-schema - validateSchema(schema, throwOrLogError) { - if (typeof schema == "boolean") - return true; - let $schema; - $schema = schema.$schema; - if ($schema !== void 0 && typeof $schema != "string") { - throw new Error("$schema must be a string"); - } - $schema = $schema || this.opts.defaultMeta || this.defaultMeta(); - if (!$schema) { - this.logger.warn("meta-schema not available"); - this.errors = null; - return true; - } - const valid = this.validate($schema, schema); - if (!valid && throwOrLogError) { - const message = "schema is invalid: " + this.errorsText(); - if (this.opts.validateSchema === "log") - this.logger.error(message); - else - throw new Error(message); - } - return valid; - } - // Get compiled schema by `key` or `ref`. - // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id) - getSchema(keyRef) { - let sch; - while (typeof (sch = getSchEnv.call(this, keyRef)) == "string") - keyRef = sch; - if (sch === void 0) { - const { schemaId } = this.opts; - const root = new compile_1.SchemaEnv({ schema: {}, schemaId }); - sch = compile_1.resolveSchema.call(this, root, keyRef); - if (!sch) - return; - this.refs[keyRef] = sch; - } - return sch.validate || this._compileSchemaEnv(sch); - } - // Remove cached schema(s). - // If no parameter is passed all schemas but meta-schemas are removed. - // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. - // Even if schema is referenced by other schemas it still can be removed as other schemas have local references. - removeSchema(schemaKeyRef) { - if (schemaKeyRef instanceof RegExp) { - this._removeAllSchemas(this.schemas, schemaKeyRef); - this._removeAllSchemas(this.refs, schemaKeyRef); - return this; - } - switch (typeof schemaKeyRef) { - case "undefined": - this._removeAllSchemas(this.schemas); - this._removeAllSchemas(this.refs); - this._cache.clear(); - return this; - case "string": { - const sch = getSchEnv.call(this, schemaKeyRef); - if (typeof sch == "object") - this._cache.delete(sch.schema); - delete this.schemas[schemaKeyRef]; - delete this.refs[schemaKeyRef]; - return this; - } - case "object": { - const cacheKey = schemaKeyRef; - this._cache.delete(cacheKey); - let id = schemaKeyRef[this.opts.schemaId]; - if (id) { - id = (0, resolve_1.normalizeId)(id); - delete this.schemas[id]; - delete this.refs[id]; - } - return this; - } - default: - throw new Error("ajv.removeSchema: invalid parameter"); - } - } - // add "vocabulary" - a collection of keywords - addVocabulary(definitions) { - for (const def of definitions) - this.addKeyword(def); - return this; - } - addKeyword(kwdOrDef, def) { - let keyword; - if (typeof kwdOrDef == "string") { - keyword = kwdOrDef; - if (typeof def == "object") { - this.logger.warn("these parameters are deprecated, see docs for addKeyword"); - def.keyword = keyword; - } - } else if (typeof kwdOrDef == "object" && def === void 0) { - def = kwdOrDef; - keyword = def.keyword; - if (Array.isArray(keyword) && !keyword.length) { - throw new Error("addKeywords: keyword must be string or non-empty array"); - } - } else { - throw new Error("invalid addKeywords parameters"); - } - checkKeyword.call(this, keyword, def); - if (!def) { - (0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd)); - return this; - } - keywordMetaschema.call(this, def); - const definition = { - ...def, - type: (0, dataType_1.getJSONTypes)(def.type), - schemaType: (0, dataType_1.getJSONTypes)(def.schemaType) - }; - (0, util_1.eachItem)(keyword, definition.type.length === 0 ? (k2) => addRule.call(this, k2, definition) : (k2) => definition.type.forEach((t) => addRule.call(this, k2, definition, t))); - return this; - } - getKeyword(keyword) { - const rule = this.RULES.all[keyword]; - return typeof rule == "object" ? rule.definition : !!rule; - } - // Remove keyword - removeKeyword(keyword) { - const { RULES } = this; - delete RULES.keywords[keyword]; - delete RULES.all[keyword]; - for (const group of RULES.rules) { - const i = group.rules.findIndex((rule) => rule.keyword === keyword); - if (i >= 0) - group.rules.splice(i, 1); - } - return this; - } - // Add format - addFormat(name, format) { - if (typeof format == "string") - format = new RegExp(format); - this.formats[name] = format; - return this; - } - errorsText(errors = this.errors, { separator = ", ", dataVar = "data" } = {}) { - if (!errors || errors.length === 0) - return "No errors"; - return errors.map((e) => `${dataVar}${e.instancePath} ${e.message}`).reduce((text, msg) => text + separator + msg); - } - $dataMetaSchema(metaSchema, keywordsJsonPointers) { - const rules = this.RULES.all; - metaSchema = JSON.parse(JSON.stringify(metaSchema)); - for (const jsonPointer of keywordsJsonPointers) { - const segments = jsonPointer.split("/").slice(1); - let keywords = metaSchema; - for (const seg of segments) - keywords = keywords[seg]; - for (const key in rules) { - const rule = rules[key]; - if (typeof rule != "object") - continue; - const { $data } = rule.definition; - const schema = keywords[key]; - if ($data && schema) - keywords[key] = schemaOrData(schema); - } - } - return metaSchema; - } - _removeAllSchemas(schemas, regex) { - for (const keyRef in schemas) { - const sch = schemas[keyRef]; - if (!regex || regex.test(keyRef)) { - if (typeof sch == "string") { - delete schemas[keyRef]; - } else if (sch && !sch.meta) { - this._cache.delete(sch.schema); - delete schemas[keyRef]; - } - } - } - } - _addSchema(schema, meta3, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) { - let id; - const { schemaId } = this.opts; - if (typeof schema == "object") { - id = schema[schemaId]; - } else { - if (this.opts.jtd) - throw new Error("schema must be object"); - else if (typeof schema != "boolean") - throw new Error("schema must be object or boolean"); - } - let sch = this._cache.get(schema); - if (sch !== void 0) - return sch; - baseId = (0, resolve_1.normalizeId)(id || baseId); - const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId); - sch = new compile_1.SchemaEnv({ schema, schemaId, meta: meta3, baseId, localRefs }); - this._cache.set(sch.schema, sch); - if (addSchema && !baseId.startsWith("#")) { - if (baseId) - this._checkUnique(baseId); - this.refs[baseId] = sch; - } - if (validateSchema) - this.validateSchema(schema, true); - return sch; - } - _checkUnique(id) { - if (this.schemas[id] || this.refs[id]) { - throw new Error(`schema with key or id "${id}" already exists`); - } - } - _compileSchemaEnv(sch) { - if (sch.meta) - this._compileMetaSchema(sch); - else - compile_1.compileSchema.call(this, sch); - if (!sch.validate) - throw new Error("ajv implementation error"); - return sch.validate; - } - _compileMetaSchema(sch) { - const currentOpts = this.opts; - this.opts = this._metaOpts; - try { - compile_1.compileSchema.call(this, sch); - } finally { - this.opts = currentOpts; - } - } - }; - Ajv2.ValidationError = validation_error_1.default; - Ajv2.MissingRefError = ref_error_1.default; - exports.default = Ajv2; - function checkOptions(checkOpts, options, msg, log = "error") { - for (const key in checkOpts) { - const opt = key; - if (opt in options) - this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`); - } - } - function getSchEnv(keyRef) { - keyRef = (0, resolve_1.normalizeId)(keyRef); - return this.schemas[keyRef] || this.refs[keyRef]; - } - function addInitialSchemas() { - const optsSchemas = this.opts.schemas; - if (!optsSchemas) - return; - if (Array.isArray(optsSchemas)) - this.addSchema(optsSchemas); - else - for (const key in optsSchemas) - this.addSchema(optsSchemas[key], key); - } - function addInitialFormats() { - for (const name in this.opts.formats) { - const format = this.opts.formats[name]; - if (format) - this.addFormat(name, format); - } - } - function addInitialKeywords(defs) { - if (Array.isArray(defs)) { - this.addVocabulary(defs); - return; - } - this.logger.warn("keywords option as map is deprecated, pass array"); - for (const keyword in defs) { - const def = defs[keyword]; - if (!def.keyword) - def.keyword = keyword; - this.addKeyword(def); - } - } - function getMetaSchemaOptions() { - const metaOpts = { ...this.opts }; - for (const opt of META_IGNORE_OPTIONS) - delete metaOpts[opt]; - return metaOpts; - } - var noLogs = { log() { - }, warn() { - }, error() { - } }; - function getLogger(logger) { - if (logger === false) - return noLogs; - if (logger === void 0) - return console; - if (logger.log && logger.warn && logger.error) - return logger; - throw new Error("logger must implement log, warn and error methods"); - } - var KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i; - function checkKeyword(keyword, def) { - const { RULES } = this; - (0, util_1.eachItem)(keyword, (kwd) => { - if (RULES.keywords[kwd]) - throw new Error(`Keyword ${kwd} is already defined`); - if (!KEYWORD_NAME.test(kwd)) - throw new Error(`Keyword ${kwd} has invalid name`); - }); - if (!def) - return; - if (def.$data && !("code" in def || "validate" in def)) { - throw new Error('$data keyword must have "code" or "validate" function'); - } - } - function addRule(keyword, definition, dataType) { - var _a3; - const post = definition === null || definition === void 0 ? void 0 : definition.post; - if (dataType && post) - throw new Error('keyword with "post" flag cannot have "type"'); - const { RULES } = this; - let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType); - if (!ruleGroup) { - ruleGroup = { type: dataType, rules: [] }; - RULES.rules.push(ruleGroup); - } - RULES.keywords[keyword] = true; - if (!definition) - return; - const rule = { - keyword, - definition: { - ...definition, - type: (0, dataType_1.getJSONTypes)(definition.type), - schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType) - } - }; - if (definition.before) - addBeforeRule.call(this, ruleGroup, rule, definition.before); - else - ruleGroup.rules.push(rule); - RULES.all[keyword] = rule; - (_a3 = definition.implements) === null || _a3 === void 0 ? void 0 : _a3.forEach((kwd) => this.addKeyword(kwd)); - } - function addBeforeRule(ruleGroup, rule, before) { - const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before); - if (i >= 0) { - ruleGroup.rules.splice(i, 0, rule); - } else { - ruleGroup.rules.push(rule); - this.logger.warn(`rule ${before} is not defined`); - } - } - function keywordMetaschema(def) { - let { metaSchema } = def; - if (metaSchema === void 0) - return; - if (def.$data && this.opts.$data) - metaSchema = schemaOrData(metaSchema); - def.validateSchema = this.compile(metaSchema, true); - } - var $dataRef = { - $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" - }; - function schemaOrData(schema) { - return { anyOf: [schema, $dataRef] }; - } - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js -var require_id2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/id.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var def = { - keyword: "id", - code() { - throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID'); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js -var require_ref2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.callRef = exports.getValidate = void 0; - var ref_error_1 = require_ref_error2(); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var compile_1 = require_compile2(); - var util_1 = require_util2(); - var def = { - keyword: "$ref", - schemaType: "string", - code(cxt) { - const { gen, schema: $ref, it } = cxt; - const { baseId, schemaEnv: env, validateName, opts, self } = it; - const { root } = env; - if (($ref === "#" || $ref === "#/") && baseId === root.baseId) - return callRootRef(); - const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref); - if (schOrEnv === void 0) - throw new ref_error_1.default(it.opts.uriResolver, baseId, $ref); - if (schOrEnv instanceof compile_1.SchemaEnv) - return callValidate(schOrEnv); - return inlineRefSchema(schOrEnv); - function callRootRef() { - if (env === root) - return callRef(cxt, validateName, env, env.$async); - const rootName = gen.scopeValue("root", { ref: root }); - return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async); - } - function callValidate(sch) { - const v2 = getValidate(cxt, sch); - callRef(cxt, v2, sch, sch.$async); - } - function inlineRefSchema(sch) { - const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: (0, codegen_1.stringify)(sch) } : { ref: sch }); - const valid = gen.name("valid"); - const schCxt = cxt.subschema({ - schema: sch, - dataTypes: [], - schemaPath: codegen_1.nil, - topSchemaRef: schName, - errSchemaPath: $ref - }, valid); - cxt.mergeEvaluated(schCxt); - cxt.ok(valid); - } - } - }; - function getValidate(cxt, sch) { - const { gen } = cxt; - return sch.validate ? gen.scopeValue("validate", { ref: sch.validate }) : (0, codegen_1._)`${gen.scopeValue("wrapper", { ref: sch })}.validate`; - } - exports.getValidate = getValidate; - function callRef(cxt, v2, sch, $async) { - const { gen, it } = cxt; - const { allErrors, schemaEnv: env, opts } = it; - const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil; - if ($async) - callAsyncRef(); - else - callSyncRef(); - function callAsyncRef() { - if (!env.$async) - throw new Error("async schema referenced by sync schema"); - const valid = gen.let("valid"); - gen.try(() => { - gen.code((0, codegen_1._)`await ${(0, code_1.callValidateCode)(cxt, v2, passCxt)}`); - addEvaluatedFrom(v2); - if (!allErrors) - gen.assign(valid, true); - }, (e) => { - gen.if((0, codegen_1._)`!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e)); - addErrorsFrom(e); - if (!allErrors) - gen.assign(valid, false); - }); - cxt.ok(valid); - } - function callSyncRef() { - cxt.result((0, code_1.callValidateCode)(cxt, v2, passCxt), () => addEvaluatedFrom(v2), () => addErrorsFrom(v2)); - } - function addErrorsFrom(source) { - const errs = (0, codegen_1._)`${source}.errors`; - gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`); - gen.assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); - } - function addEvaluatedFrom(source) { - var _a3; - if (!it.opts.unevaluated) - return; - const schEvaluated = (_a3 = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a3 === void 0 ? void 0 : _a3.evaluated; - if (it.props !== true) { - if (schEvaluated && !schEvaluated.dynamicProps) { - if (schEvaluated.props !== void 0) { - it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props); - } - } else { - const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`); - it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name); - } - } - if (it.items !== true) { - if (schEvaluated && !schEvaluated.dynamicItems) { - if (schEvaluated.items !== void 0) { - it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items); - } - } else { - const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`); - it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name); - } - } - } - } - exports.callRef = callRef; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js -var require_core4 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/core/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var id_1 = require_id2(); - var ref_1 = require_ref2(); - var core = [ - "$schema", - "$id", - "$defs", - "$vocabulary", - { keyword: "$comment" }, - "definitions", - id_1.default, - ref_1.default - ]; - exports.default = core; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js -var require_limitNumber2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var ops = codegen_1.operators; - var KWDs = { - maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, - minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, - exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, - exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE } - }; - var error61 = { - message: ({ keyword, schemaCode }) => (0, codegen_1.str)`must be ${KWDs[keyword].okStr} ${schemaCode}`, - params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}` - }; - var def = { - keyword: Object.keys(KWDs), - type: "number", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode } = cxt; - cxt.fail$data((0, codegen_1._)`${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js -var require_multipleOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var error61 = { - message: ({ schemaCode }) => (0, codegen_1.str)`must be multiple of ${schemaCode}`, - params: ({ schemaCode }) => (0, codegen_1._)`{multipleOf: ${schemaCode}}` - }; - var def = { - keyword: "multipleOf", - type: "number", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { gen, data, schemaCode, it } = cxt; - const prec = it.opts.multipleOfPrecision; - const res = gen.let("res"); - const invalid = prec ? (0, codegen_1._)`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}` : (0, codegen_1._)`${res} !== parseInt(${res})`; - cxt.fail$data((0, codegen_1._)`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js -var require_ucs2length2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/ucs2length.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - function ucs2length(str) { - const len = str.length; - let length = 0; - let pos = 0; - let value; - while (pos < len) { - length++; - value = str.charCodeAt(pos++); - if (value >= 55296 && value <= 56319 && pos < len) { - value = str.charCodeAt(pos); - if ((value & 64512) === 56320) - pos++; - } - } - return length; - } - exports.default = ucs2length; - ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default'; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js -var require_limitLength2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var ucs2length_1 = require_ucs2length2(); - var error61 = { - message({ keyword, schemaCode }) { - const comp = keyword === "maxLength" ? "more" : "fewer"; - return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} characters`; - }, - params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` - }; - var def = { - keyword: ["maxLength", "minLength"], - type: "string", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode, it } = cxt; - const op = keyword === "maxLength" ? codegen_1.operators.GT : codegen_1.operators.LT; - const len = it.opts.unicode === false ? (0, codegen_1._)`${data}.length` : (0, codegen_1._)`${(0, util_1.useFunc)(cxt.gen, ucs2length_1.default)}(${data})`; - cxt.fail$data((0, codegen_1._)`${len} ${op} ${schemaCode}`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js -var require_pattern2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var util_1 = require_util2(); - var codegen_1 = require_codegen2(); - var error61 = { - message: ({ schemaCode }) => (0, codegen_1.str)`must match pattern "${schemaCode}"`, - params: ({ schemaCode }) => (0, codegen_1._)`{pattern: ${schemaCode}}` - }; - var def = { - keyword: "pattern", - type: "string", - schemaType: "string", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schema, schemaCode, it } = cxt; - const u = it.opts.unicodeRegExp ? "u" : ""; - if ($data) { - const { regExp } = it.opts.code; - const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); - const valid = gen.let("valid"); - gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); - cxt.fail$data((0, codegen_1._)`!${valid}`); - } else { - const regExp = (0, code_1.usePattern)(cxt, schema); - cxt.fail$data((0, codegen_1._)`!${regExp}.test(${data})`); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js -var require_limitProperties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var error61 = { - message({ keyword, schemaCode }) { - const comp = keyword === "maxProperties" ? "more" : "fewer"; - return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} properties`; - }, - params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` - }; - var def = { - keyword: ["maxProperties", "minProperties"], - type: "object", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode } = cxt; - const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT; - cxt.fail$data((0, codegen_1._)`Object.keys(${data}).length ${op} ${schemaCode}`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js -var require_required2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params: { missingProperty } }) => (0, codegen_1.str)`must have required property '${missingProperty}'`, - params: ({ params: { missingProperty } }) => (0, codegen_1._)`{missingProperty: ${missingProperty}}` - }; - var def = { - keyword: "required", - type: "object", - schemaType: "array", - $data: true, - error: error61, - code(cxt) { - const { gen, schema, schemaCode, data, $data, it } = cxt; - const { opts } = it; - if (!$data && schema.length === 0) - return; - const useLoop = schema.length >= opts.loopRequired; - if (it.allErrors) - allErrorsMode(); - else - exitOnErrorMode(); - if (opts.strictRequired) { - const props = cxt.parentSchema.properties; - const { definedProperties } = cxt.it; - for (const requiredKey of schema) { - if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === void 0 && !definedProperties.has(requiredKey)) { - const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; - const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`; - (0, util_1.checkStrictMode)(it, msg, it.opts.strictRequired); - } - } - } - function allErrorsMode() { - if (useLoop || $data) { - cxt.block$data(codegen_1.nil, loopAllRequired); - } else { - for (const prop of schema) { - (0, code_1.checkReportMissingProp)(cxt, prop); - } - } - } - function exitOnErrorMode() { - const missing = gen.let("missing"); - if (useLoop || $data) { - const valid = gen.let("valid", true); - cxt.block$data(valid, () => loopUntilMissing(missing, valid)); - cxt.ok(valid); - } else { - gen.if((0, code_1.checkMissingProp)(cxt, schema, missing)); - (0, code_1.reportMissingProp)(cxt, missing); - gen.else(); - } - } - function loopAllRequired() { - gen.forOf("prop", schemaCode, (prop) => { - cxt.setParams({ missingProperty: prop }); - gen.if((0, code_1.noPropertyInData)(gen, data, prop, opts.ownProperties), () => cxt.error()); - }); - } - function loopUntilMissing(missing, valid) { - cxt.setParams({ missingProperty: missing }); - gen.forOf(missing, schemaCode, () => { - gen.assign(valid, (0, code_1.propertyInData)(gen, data, missing, opts.ownProperties)); - gen.if((0, codegen_1.not)(valid), () => { - cxt.error(); - gen.break(); - }); - }, codegen_1.nil); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js -var require_limitItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var error61 = { - message({ keyword, schemaCode }) { - const comp = keyword === "maxItems" ? "more" : "fewer"; - return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} items`; - }, - params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` - }; - var def = { - keyword: ["maxItems", "minItems"], - type: "array", - schemaType: "number", - $data: true, - error: error61, - code(cxt) { - const { keyword, data, schemaCode } = cxt; - const op = keyword === "maxItems" ? codegen_1.operators.GT : codegen_1.operators.LT; - cxt.fail$data((0, codegen_1._)`${data}.length ${op} ${schemaCode}`); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js -var require_equal2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/runtime/equal.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var equal = require_fast_deep_equal(); - equal.code = 'require("ajv/dist/runtime/equal").default'; - exports.default = equal; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js -var require_uniqueItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var dataType_1 = require_dataType2(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var equal_1 = require_equal2(); - var error61 = { - message: ({ params: { i, j: j2 } }) => (0, codegen_1.str)`must NOT have duplicate items (items ## ${j2} and ${i} are identical)`, - params: ({ params: { i, j: j2 } }) => (0, codegen_1._)`{i: ${i}, j: ${j2}}` - }; - var def = { - keyword: "uniqueItems", - type: "array", - schemaType: "boolean", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt; - if (!$data && !schema) - return; - const valid = gen.let("valid"); - const itemTypes = parentSchema.items ? (0, dataType_1.getSchemaTypes)(parentSchema.items) : []; - cxt.block$data(valid, validateUniqueItems, (0, codegen_1._)`${schemaCode} === false`); - cxt.ok(valid); - function validateUniqueItems() { - const i = gen.let("i", (0, codegen_1._)`${data}.length`); - const j2 = gen.let("j"); - cxt.setParams({ i, j: j2 }); - gen.assign(valid, true); - gen.if((0, codegen_1._)`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j2)); - } - function canOptimize() { - return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array"); - } - function loopN(i, j2) { - const item = gen.name("item"); - const wrongType = (0, dataType_1.checkDataTypes)(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong); - const indices = gen.const("indices", (0, codegen_1._)`{}`); - gen.for((0, codegen_1._)`;${i}--;`, () => { - gen.let(item, (0, codegen_1._)`${data}[${i}]`); - gen.if(wrongType, (0, codegen_1._)`continue`); - if (itemTypes.length > 1) - gen.if((0, codegen_1._)`typeof ${item} == "string"`, (0, codegen_1._)`${item} += "_"`); - gen.if((0, codegen_1._)`typeof ${indices}[${item}] == "number"`, () => { - gen.assign(j2, (0, codegen_1._)`${indices}[${item}]`); - cxt.error(); - gen.assign(valid, false).break(); - }).code((0, codegen_1._)`${indices}[${item}] = ${i}`); - }); - } - function loopN2(i, j2) { - const eql = (0, util_1.useFunc)(gen, equal_1.default); - const outer = gen.name("outer"); - gen.label(outer).for((0, codegen_1._)`;${i}--;`, () => gen.for((0, codegen_1._)`${j2} = ${i}; ${j2}--;`, () => gen.if((0, codegen_1._)`${eql}(${data}[${i}], ${data}[${j2}])`, () => { - cxt.error(); - gen.assign(valid, false).break(outer); - }))); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js -var require_const2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var equal_1 = require_equal2(); - var error61 = { - message: "must be equal to constant", - params: ({ schemaCode }) => (0, codegen_1._)`{allowedValue: ${schemaCode}}` - }; - var def = { - keyword: "const", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schemaCode, schema } = cxt; - if ($data || schema && typeof schema == "object") { - cxt.fail$data((0, codegen_1._)`!${(0, util_1.useFunc)(gen, equal_1.default)}(${data}, ${schemaCode})`); - } else { - cxt.fail((0, codegen_1._)`${schema} !== ${data}`); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js -var require_enum2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var equal_1 = require_equal2(); - var error61 = { - message: "must be equal to one of the allowed values", - params: ({ schemaCode }) => (0, codegen_1._)`{allowedValues: ${schemaCode}}` - }; - var def = { - keyword: "enum", - schemaType: "array", - $data: true, - error: error61, - code(cxt) { - const { gen, data, $data, schema, schemaCode, it } = cxt; - if (!$data && schema.length === 0) - throw new Error("enum must have non-empty array"); - const useLoop = schema.length >= it.opts.loopEnum; - let eql; - const getEql = () => eql !== null && eql !== void 0 ? eql : eql = (0, util_1.useFunc)(gen, equal_1.default); - let valid; - if (useLoop || $data) { - valid = gen.let("valid"); - cxt.block$data(valid, loopEnum); - } else { - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - const vSchema = gen.const("vSchema", schemaCode); - valid = (0, codegen_1.or)(...schema.map((_x, i) => equalCode(vSchema, i))); - } - cxt.pass(valid); - function loopEnum() { - gen.assign(valid, false); - gen.forOf("v", schemaCode, (v2) => gen.if((0, codegen_1._)`${getEql()}(${data}, ${v2})`, () => gen.assign(valid, true).break())); - } - function equalCode(vSchema, i) { - const sch = schema[i]; - return typeof sch === "object" && sch !== null ? (0, codegen_1._)`${getEql()}(${data}, ${vSchema}[${i}])` : (0, codegen_1._)`${data} === ${sch}`; - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js -var require_validation2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var limitNumber_1 = require_limitNumber2(); - var multipleOf_1 = require_multipleOf2(); - var limitLength_1 = require_limitLength2(); - var pattern_1 = require_pattern2(); - var limitProperties_1 = require_limitProperties2(); - var required_1 = require_required2(); - var limitItems_1 = require_limitItems2(); - var uniqueItems_1 = require_uniqueItems2(); - var const_1 = require_const2(); - var enum_1 = require_enum2(); - var validation = [ - // number - limitNumber_1.default, - multipleOf_1.default, - // string - limitLength_1.default, - pattern_1.default, - // object - limitProperties_1.default, - required_1.default, - // array - limitItems_1.default, - uniqueItems_1.default, - // any - { keyword: "type", schemaType: ["string", "array"] }, - { keyword: "nullable", schemaType: "boolean" }, - const_1.default, - enum_1.default - ]; - exports.default = validation; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js -var require_additionalItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateAdditionalItems = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, - params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` - }; - var def = { - keyword: "additionalItems", - type: "array", - schemaType: ["boolean", "object"], - before: "uniqueItems", - error: error61, - code(cxt) { - const { parentSchema, it } = cxt; - const { items } = parentSchema; - if (!Array.isArray(items)) { - (0, util_1.checkStrictMode)(it, '"additionalItems" is ignored when "items" is not an array of schemas'); - return; - } - validateAdditionalItems(cxt, items); - } - }; - function validateAdditionalItems(cxt, items) { - const { gen, schema, data, keyword, it } = cxt; - it.items = true; - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - if (schema === false) { - cxt.setParams({ len: items.length }); - cxt.pass((0, codegen_1._)`${len} <= ${items.length}`); - } else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { - const valid = gen.var("valid", (0, codegen_1._)`${len} <= ${items.length}`); - gen.if((0, codegen_1.not)(valid), () => validateItems(valid)); - cxt.ok(valid); - } - function validateItems(valid) { - gen.forRange("i", items.length, len, (i) => { - cxt.subschema({ keyword, dataProp: i, dataPropType: util_1.Type.Num }, valid); - if (!it.allErrors) - gen.if((0, codegen_1.not)(valid), () => gen.break()); - }); - } - } - exports.validateAdditionalItems = validateAdditionalItems; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js -var require_items2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateTuple = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var code_1 = require_code4(); - var def = { - keyword: "items", - type: "array", - schemaType: ["object", "array", "boolean"], - before: "uniqueItems", - code(cxt) { - const { schema, it } = cxt; - if (Array.isArray(schema)) - return validateTuple(cxt, "additionalItems", schema); - it.items = true; - if ((0, util_1.alwaysValidSchema)(it, schema)) - return; - cxt.ok((0, code_1.validateArray)(cxt)); - } - }; - function validateTuple(cxt, extraItems, schArr = cxt.schema) { - const { gen, parentSchema, data, keyword, it } = cxt; - checkStrictTuple(parentSchema); - if (it.opts.unevaluated && schArr.length && it.items !== true) { - it.items = util_1.mergeEvaluated.items(gen, schArr.length, it.items); - } - const valid = gen.name("valid"); - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - schArr.forEach((sch, i) => { - if ((0, util_1.alwaysValidSchema)(it, sch)) - return; - gen.if((0, codegen_1._)`${len} > ${i}`, () => cxt.subschema({ - keyword, - schemaProp: i, - dataProp: i - }, valid)); - cxt.ok(valid); - }); - function checkStrictTuple(sch) { - const { opts, errSchemaPath } = it; - const l3 = schArr.length; - const fullTuple = l3 === sch.minItems && (l3 === sch.maxItems || sch[extraItems] === false); - if (opts.strictTuples && !fullTuple) { - const msg = `"${keyword}" is ${l3}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; - (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); - } - } - } - exports.validateTuple = validateTuple; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js -var require_prefixItems2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var items_1 = require_items2(); - var def = { - keyword: "prefixItems", - type: "array", - schemaType: ["array"], - before: "uniqueItems", - code: (cxt) => (0, items_1.validateTuple)(cxt, "items") - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js -var require_items20202 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var code_1 = require_code4(); - var additionalItems_1 = require_additionalItems2(); - var error61 = { - message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, - params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` - }; - var def = { - keyword: "items", - type: "array", - schemaType: ["object", "boolean"], - before: "uniqueItems", - error: error61, - code(cxt) { - const { schema, parentSchema, it } = cxt; - const { prefixItems } = parentSchema; - it.items = true; - if ((0, util_1.alwaysValidSchema)(it, schema)) - return; - if (prefixItems) - (0, additionalItems_1.validateAdditionalItems)(cxt, prefixItems); - else - cxt.ok((0, code_1.validateArray)(cxt)); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js -var require_contains2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1.str)`must contain at least ${min} valid item(s)` : (0, codegen_1.str)`must contain at least ${min} and no more than ${max} valid item(s)`, - params: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1._)`{minContains: ${min}}` : (0, codegen_1._)`{minContains: ${min}, maxContains: ${max}}` - }; - var def = { - keyword: "contains", - type: "array", - schemaType: ["object", "boolean"], - before: "uniqueItems", - trackErrors: true, - error: error61, - code(cxt) { - const { gen, schema, parentSchema, data, it } = cxt; - let min; - let max; - const { minContains, maxContains } = parentSchema; - if (it.opts.next) { - min = minContains === void 0 ? 1 : minContains; - max = maxContains; - } else { - min = 1; - } - const len = gen.const("len", (0, codegen_1._)`${data}.length`); - cxt.setParams({ min, max }); - if (max === void 0 && min === 0) { - (0, util_1.checkStrictMode)(it, `"minContains" == 0 without "maxContains": "contains" keyword ignored`); - return; - } - if (max !== void 0 && min > max) { - (0, util_1.checkStrictMode)(it, `"minContains" > "maxContains" is always invalid`); - cxt.fail(); - return; - } - if ((0, util_1.alwaysValidSchema)(it, schema)) { - let cond = (0, codegen_1._)`${len} >= ${min}`; - if (max !== void 0) - cond = (0, codegen_1._)`${cond} && ${len} <= ${max}`; - cxt.pass(cond); - return; - } - it.items = true; - const valid = gen.name("valid"); - if (max === void 0 && min === 1) { - validateItems(valid, () => gen.if(valid, () => gen.break())); - } else if (min === 0) { - gen.let(valid, true); - if (max !== void 0) - gen.if((0, codegen_1._)`${data}.length > 0`, validateItemsWithCount); - } else { - gen.let(valid, false); - validateItemsWithCount(); - } - cxt.result(valid, () => cxt.reset()); - function validateItemsWithCount() { - const schValid = gen.name("_valid"); - const count = gen.let("count", 0); - validateItems(schValid, () => gen.if(schValid, () => checkLimits(count))); - } - function validateItems(_valid, block) { - gen.forRange("i", 0, len, (i) => { - cxt.subschema({ - keyword: "contains", - dataProp: i, - dataPropType: util_1.Type.Num, - compositeRule: true - }, _valid); - block(); - }); - } - function checkLimits(count) { - gen.code((0, codegen_1._)`${count}++`); - if (max === void 0) { - gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break()); - } else { - gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break()); - if (min === 1) - gen.assign(valid, true); - else - gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true)); - } - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js -var require_dependencies2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var code_1 = require_code4(); - exports.error = { - message: ({ params: { property, depsCount, deps } }) => { - const property_ies = depsCount === 1 ? "property" : "properties"; - return (0, codegen_1.str)`must have ${property_ies} ${deps} when property ${property} is present`; - }, - params: ({ params: { property, depsCount, deps, missingProperty } }) => (0, codegen_1._)`{property: ${property}, - missingProperty: ${missingProperty}, - depsCount: ${depsCount}, - deps: ${deps}}` - // TODO change to reference - }; - var def = { - keyword: "dependencies", - type: "object", - schemaType: "object", - error: exports.error, - code(cxt) { - const [propDeps, schDeps] = splitDependencies(cxt); - validatePropertyDeps(cxt, propDeps); - validateSchemaDeps(cxt, schDeps); - } - }; - function splitDependencies({ schema }) { - const propertyDeps = {}; - const schemaDeps = {}; - for (const key in schema) { - if (key === "__proto__") - continue; - const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps; - deps[key] = schema[key]; - } - return [propertyDeps, schemaDeps]; - } - function validatePropertyDeps(cxt, propertyDeps = cxt.schema) { - const { gen, data, it } = cxt; - if (Object.keys(propertyDeps).length === 0) - return; - const missing = gen.let("missing"); - for (const prop in propertyDeps) { - const deps = propertyDeps[prop]; - if (deps.length === 0) - continue; - const hasProperty = (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties); - cxt.setParams({ - property: prop, - depsCount: deps.length, - deps: deps.join(", ") - }); - if (it.allErrors) { - gen.if(hasProperty, () => { - for (const depProp of deps) { - (0, code_1.checkReportMissingProp)(cxt, depProp); - } - }); - } else { - gen.if((0, codegen_1._)`${hasProperty} && (${(0, code_1.checkMissingProp)(cxt, deps, missing)})`); - (0, code_1.reportMissingProp)(cxt, missing); - gen.else(); - } - } - } - exports.validatePropertyDeps = validatePropertyDeps; - function validateSchemaDeps(cxt, schemaDeps = cxt.schema) { - const { gen, data, keyword, it } = cxt; - const valid = gen.name("valid"); - for (const prop in schemaDeps) { - if ((0, util_1.alwaysValidSchema)(it, schemaDeps[prop])) - continue; - gen.if( - (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties), - () => { - const schCxt = cxt.subschema({ keyword, schemaProp: prop }, valid); - cxt.mergeValidEvaluated(schCxt, valid); - }, - () => gen.var(valid, true) - // TODO var - ); - cxt.ok(valid); - } - } - exports.validateSchemaDeps = validateSchemaDeps; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js -var require_propertyNames2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: "property name must be valid", - params: ({ params }) => (0, codegen_1._)`{propertyName: ${params.propertyName}}` - }; - var def = { - keyword: "propertyNames", - type: "object", - schemaType: ["object", "boolean"], - error: error61, - code(cxt) { - const { gen, schema, data, it } = cxt; - if ((0, util_1.alwaysValidSchema)(it, schema)) - return; - const valid = gen.name("valid"); - gen.forIn("key", data, (key) => { - cxt.setParams({ propertyName: key }); - cxt.subschema({ - keyword: "propertyNames", - data: key, - dataTypes: ["string"], - propertyName: key, - compositeRule: true - }, valid); - gen.if((0, codegen_1.not)(valid), () => { - cxt.error(true); - if (!it.allErrors) - gen.break(); - }); - }); - cxt.ok(valid); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js -var require_additionalProperties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var names_1 = require_names2(); - var util_1 = require_util2(); - var error61 = { - message: "must NOT have additional properties", - params: ({ params }) => (0, codegen_1._)`{additionalProperty: ${params.additionalProperty}}` - }; - var def = { - keyword: "additionalProperties", - type: ["object"], - schemaType: ["boolean", "object"], - allowUndefined: true, - trackErrors: true, - error: error61, - code(cxt) { - const { gen, schema, parentSchema, data, errsCount, it } = cxt; - if (!errsCount) - throw new Error("ajv implementation error"); - const { allErrors, opts } = it; - it.props = true; - if (opts.removeAdditional !== "all" && (0, util_1.alwaysValidSchema)(it, schema)) - return; - const props = (0, code_1.allSchemaProperties)(parentSchema.properties); - const patProps = (0, code_1.allSchemaProperties)(parentSchema.patternProperties); - checkAdditionalProperties(); - cxt.ok((0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); - function checkAdditionalProperties() { - gen.forIn("key", data, (key) => { - if (!props.length && !patProps.length) - additionalPropertyCode(key); - else - gen.if(isAdditional(key), () => additionalPropertyCode(key)); - }); - } - function isAdditional(key) { - let definedProp; - if (props.length > 8) { - const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema.properties, "properties"); - definedProp = (0, code_1.isOwnProperty)(gen, propsSchema, key); - } else if (props.length) { - definedProp = (0, codegen_1.or)(...props.map((p) => (0, codegen_1._)`${key} === ${p}`)); - } else { - definedProp = codegen_1.nil; - } - if (patProps.length) { - definedProp = (0, codegen_1.or)(definedProp, ...patProps.map((p) => (0, codegen_1._)`${(0, code_1.usePattern)(cxt, p)}.test(${key})`)); - } - return (0, codegen_1.not)(definedProp); - } - function deleteAdditional(key) { - gen.code((0, codegen_1._)`delete ${data}[${key}]`); - } - function additionalPropertyCode(key) { - if (opts.removeAdditional === "all" || opts.removeAdditional && schema === false) { - deleteAdditional(key); - return; - } - if (schema === false) { - cxt.setParams({ additionalProperty: key }); - cxt.error(); - if (!allErrors) - gen.break(); - return; - } - if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { - const valid = gen.name("valid"); - if (opts.removeAdditional === "failing") { - applyAdditionalSchema(key, valid, false); - gen.if((0, codegen_1.not)(valid), () => { - cxt.reset(); - deleteAdditional(key); - }); - } else { - applyAdditionalSchema(key, valid); - if (!allErrors) - gen.if((0, codegen_1.not)(valid), () => gen.break()); - } - } - } - function applyAdditionalSchema(key, valid, errors) { - const subschema = { - keyword: "additionalProperties", - dataProp: key, - dataPropType: util_1.Type.Str - }; - if (errors === false) { - Object.assign(subschema, { - compositeRule: true, - createErrors: false, - allErrors: false - }); - } - cxt.subschema(subschema, valid); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js -var require_properties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var validate_1 = require_validate2(); - var code_1 = require_code4(); - var util_1 = require_util2(); - var additionalProperties_1 = require_additionalProperties2(); - var def = { - keyword: "properties", - type: "object", - schemaType: "object", - code(cxt) { - const { gen, schema, parentSchema, data, it } = cxt; - if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === void 0) { - additionalProperties_1.default.code(new validate_1.KeywordCxt(it, additionalProperties_1.default, "additionalProperties")); - } - const allProps = (0, code_1.allSchemaProperties)(schema); - for (const prop of allProps) { - it.definedProperties.add(prop); - } - if (it.opts.unevaluated && allProps.length && it.props !== true) { - it.props = util_1.mergeEvaluated.props(gen, (0, util_1.toHash)(allProps), it.props); - } - const properties = allProps.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p])); - if (properties.length === 0) - return; - const valid = gen.name("valid"); - for (const prop of properties) { - if (hasDefault(prop)) { - applyPropertySchema(prop); - } else { - gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties)); - applyPropertySchema(prop); - if (!it.allErrors) - gen.else().var(valid, true); - gen.endIf(); - } - cxt.it.definedProperties.add(prop); - cxt.ok(valid); - } - function hasDefault(prop) { - return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== void 0; - } - function applyPropertySchema(prop) { - cxt.subschema({ - keyword: "properties", - schemaProp: prop, - dataProp: prop - }, valid); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js -var require_patternProperties2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var util_2 = require_util2(); - var def = { - keyword: "patternProperties", - type: "object", - schemaType: "object", - code(cxt) { - const { gen, schema, data, parentSchema, it } = cxt; - const { opts } = it; - const patterns = (0, code_1.allSchemaProperties)(schema); - const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p])); - if (patterns.length === 0 || alwaysValidPatterns.length === patterns.length && (!it.opts.unevaluated || it.props === true)) { - return; - } - const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties; - const valid = gen.name("valid"); - if (it.props !== true && !(it.props instanceof codegen_1.Name)) { - it.props = (0, util_2.evaluatedPropsToName)(gen, it.props); - } - const { props } = it; - validatePatternProperties(); - function validatePatternProperties() { - for (const pat of patterns) { - if (checkProperties) - checkMatchingProperties(pat); - if (it.allErrors) { - validateProperties(pat); - } else { - gen.var(valid, true); - validateProperties(pat); - gen.if(valid); - } - } - } - function checkMatchingProperties(pat) { - for (const prop in checkProperties) { - if (new RegExp(pat).test(prop)) { - (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`); - } - } - } - function validateProperties(pat) { - gen.forIn("key", data, (key) => { - gen.if((0, codegen_1._)`${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => { - const alwaysValid = alwaysValidPatterns.includes(pat); - if (!alwaysValid) { - cxt.subschema({ - keyword: "patternProperties", - schemaProp: pat, - dataProp: key, - dataPropType: util_2.Type.Str - }, valid); - } - if (it.opts.unevaluated && props !== true) { - gen.assign((0, codegen_1._)`${props}[${key}]`, true); - } else if (!alwaysValid && !it.allErrors) { - gen.if((0, codegen_1.not)(valid), () => gen.break()); - } - }); - }); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js -var require_not2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util2(); - var def = { - keyword: "not", - schemaType: ["object", "boolean"], - trackErrors: true, - code(cxt) { - const { gen, schema, it } = cxt; - if ((0, util_1.alwaysValidSchema)(it, schema)) { - cxt.fail(); - return; - } - const valid = gen.name("valid"); - cxt.subschema({ - keyword: "not", - compositeRule: true, - createErrors: false, - allErrors: false - }, valid); - cxt.failResult(valid, () => cxt.reset(), () => cxt.error()); - }, - error: { message: "must NOT be valid" } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js -var require_anyOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var code_1 = require_code4(); - var def = { - keyword: "anyOf", - schemaType: "array", - trackErrors: true, - code: code_1.validateUnion, - error: { message: "must match a schema in anyOf" } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js -var require_oneOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); - var error61 = { - message: "must match exactly one schema in oneOf", - params: ({ params }) => (0, codegen_1._)`{passingSchemas: ${params.passing}}` - }; - var def = { - keyword: "oneOf", - schemaType: "array", - trackErrors: true, - error: error61, - code(cxt) { - const { gen, schema, parentSchema, it } = cxt; - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - if (it.opts.discriminator && parentSchema.discriminator) - return; - const schArr = schema; - const valid = gen.let("valid", false); - const passing = gen.let("passing", null); - const schValid = gen.name("_valid"); - cxt.setParams({ passing }); - gen.block(validateOneOf); - cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); - function validateOneOf() { - schArr.forEach((sch, i) => { - let schCxt; - if ((0, util_1.alwaysValidSchema)(it, sch)) { - gen.var(schValid, true); - } else { - schCxt = cxt.subschema({ - keyword: "oneOf", - schemaProp: i, - compositeRule: true - }, schValid); - } - if (i > 0) { - gen.if((0, codegen_1._)`${schValid} && ${valid}`).assign(valid, false).assign(passing, (0, codegen_1._)`[${passing}, ${i}]`).else(); - } - gen.if(schValid, () => { - gen.assign(valid, true); - gen.assign(passing, i); - if (schCxt) - cxt.mergeEvaluated(schCxt, codegen_1.Name); - }); - }); - } - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js -var require_allOf2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util2(); - var def = { - keyword: "allOf", - schemaType: "array", - code(cxt) { - const { gen, schema, it } = cxt; - if (!Array.isArray(schema)) - throw new Error("ajv implementation error"); - const valid = gen.name("valid"); - schema.forEach((sch, i) => { - if ((0, util_1.alwaysValidSchema)(it, sch)) - return; - const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid); - cxt.ok(valid); - cxt.mergeEvaluated(schCxt); - }); - } - }; - exports.default = def; - } -}); - -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js -var require_if2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var util_1 = require_util2(); var error61 = { message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`, params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}` @@ -12133,12 +6319,12 @@ var require_if2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js -var require_thenElse2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { +// node_modules/ajv/dist/vocabularies/applicator/thenElse.js +var require_thenElse = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var util_1 = require_util2(); + var util_1 = require_util(); var def = { keyword: ["then", "else"], schemaType: ["object", "boolean"], @@ -12151,27 +6337,27 @@ var require_thenElse2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js -var require_applicator2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { +// node_modules/ajv/dist/vocabularies/applicator/index.js +var require_applicator = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var additionalItems_1 = require_additionalItems2(); - var prefixItems_1 = require_prefixItems2(); - var items_1 = require_items2(); - var items2020_1 = require_items20202(); - var contains_1 = require_contains2(); - var dependencies_1 = require_dependencies2(); - var propertyNames_1 = require_propertyNames2(); - var additionalProperties_1 = require_additionalProperties2(); - var properties_1 = require_properties2(); - var patternProperties_1 = require_patternProperties2(); - var not_1 = require_not2(); - var anyOf_1 = require_anyOf2(); - var oneOf_1 = require_oneOf2(); - var allOf_1 = require_allOf2(); - var if_1 = require_if2(); - var thenElse_1 = require_thenElse2(); + var additionalItems_1 = require_additionalItems(); + var prefixItems_1 = require_prefixItems(); + var items_1 = require_items(); + var items2020_1 = require_items2020(); + var contains_1 = require_contains(); + var dependencies_1 = require_dependencies(); + var propertyNames_1 = require_propertyNames(); + var additionalProperties_1 = require_additionalProperties(); + var properties_1 = require_properties(); + var patternProperties_1 = require_patternProperties(); + var not_1 = require_not(); + var anyOf_1 = require_anyOf(); + var oneOf_1 = require_oneOf(); + var allOf_1 = require_allOf(); + var if_1 = require_if(); + var thenElse_1 = require_thenElse(); function getApplicator(draft2020 = false) { const applicator = [ // any @@ -12199,12 +6385,12 @@ var require_applicator2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js -var require_format3 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/format.js"(exports) { +// node_modules/ajv/dist/vocabularies/format/format.js +var require_format = __commonJS({ + "node_modules/ajv/dist/vocabularies/format/format.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); + var codegen_1 = require_codegen(); var error61 = { message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`, params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}` @@ -12289,20 +6475,20 @@ var require_format3 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js -var require_format4 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/format/index.js"(exports) { +// node_modules/ajv/dist/vocabularies/format/index.js +var require_format2 = __commonJS({ + "node_modules/ajv/dist/vocabularies/format/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var format_1 = require_format3(); + var format_1 = require_format(); var format = [format_1.default]; exports.default = format; } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js -var require_metadata2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/metadata.js"(exports) { +// node_modules/ajv/dist/vocabularies/metadata.js +var require_metadata = __commonJS({ + "node_modules/ajv/dist/vocabularies/metadata.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.contentVocabulary = exports.metadataVocabulary = void 0; @@ -12323,16 +6509,16 @@ var require_metadata2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js -var require_draft72 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/draft7.js"(exports) { +// node_modules/ajv/dist/vocabularies/draft7.js +var require_draft7 = __commonJS({ + "node_modules/ajv/dist/vocabularies/draft7.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var core_1 = require_core4(); - var validation_1 = require_validation2(); - var applicator_1 = require_applicator2(); - var format_1 = require_format4(); - var metadata_1 = require_metadata2(); + var core_1 = require_core2(); + var validation_1 = require_validation(); + var applicator_1 = require_applicator(); + var format_1 = require_format2(); + var metadata_1 = require_metadata(); var draft7Vocabularies = [ core_1.default, validation_1.default, @@ -12345,9 +6531,9 @@ var require_draft72 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js -var require_types2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { +// node_modules/ajv/dist/vocabularies/discriminator/types.js +var require_types = __commonJS({ + "node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DiscrError = void 0; @@ -12359,16 +6545,16 @@ var require_types2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js -var require_discriminator2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { +// node_modules/ajv/dist/vocabularies/discriminator/index.js +var require_discriminator = __commonJS({ + "node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - var codegen_1 = require_codegen2(); - var types_1 = require_types2(); - var compile_1 = require_compile2(); - var ref_error_1 = require_ref_error2(); - var util_1 = require_util2(); + var codegen_1 = require_codegen(); + var types_1 = require_types(); + var compile_1 = require_compile(); + var ref_error_1 = require_ref_error(); + var util_1 = require_util(); var error61 = { message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`, params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}` @@ -12464,9 +6650,9 @@ var require_discriminator2 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json -var require_json_schema_draft_072 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { +// node_modules/ajv/dist/refs/json-schema-draft-07.json +var require_json_schema_draft_07 = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { module.exports = { $schema: "http://json-schema.org/draft-07/schema#", $id: "http://json-schema.org/draft-07/schema#", @@ -12621,16 +6807,16 @@ var require_json_schema_draft_072 = __commonJS({ } }); -// node_modules/ajv-formats/node_modules/ajv/dist/ajv.js -var require_ajv2 = __commonJS({ - "node_modules/ajv-formats/node_modules/ajv/dist/ajv.js"(exports, module) { +// node_modules/ajv/dist/ajv.js +var require_ajv = __commonJS({ + "node_modules/ajv/dist/ajv.js"(exports, module) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; - var core_1 = require_core3(); - var draft7_1 = require_draft72(); - var discriminator_1 = require_discriminator2(); - var draft7MetaSchema = require_json_schema_draft_072(); + var core_1 = require_core(); + var draft7_1 = require_draft7(); + var discriminator_1 = require_discriminator(); + var draft7MetaSchema = require_json_schema_draft_07(); var META_SUPPORT_DATA = ["/properties"]; var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema"; var Ajv2 = class extends core_1.default { @@ -12657,11 +6843,11 @@ var require_ajv2 = __commonJS({ module.exports.Ajv = Ajv2; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Ajv2; - var validate_1 = require_validate2(); + var validate_1 = require_validate(); Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { return validate_1.KeywordCxt; } }); - var codegen_1 = require_codegen2(); + var codegen_1 = require_codegen(); Object.defineProperty(exports, "_", { enumerable: true, get: function() { return codegen_1._; } }); @@ -12680,25 +6866,228 @@ var require_ajv2 = __commonJS({ Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { return codegen_1.CodeGen; } }); - var validation_error_1 = require_validation_error2(); + var validation_error_1 = require_validation_error(); Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { return validation_error_1.default; } }); - var ref_error_1 = require_ref_error2(); + var ref_error_1 = require_ref_error(); Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { return ref_error_1.default; } }); } }); +// node_modules/ajv-formats/dist/formats.js +var require_formats = __commonJS({ + "node_modules/ajv-formats/dist/formats.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.formatNames = exports.fastFormats = exports.fullFormats = void 0; + function fmtDef(validate2, compare) { + return { validate: validate2, compare }; + } + exports.fullFormats = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: fmtDef(date5, compareDate), + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: fmtDef(getTime(true), compareTime), + "date-time": fmtDef(getDateTime(true), compareDateTime), + "iso-time": fmtDef(getTime(), compareIsoTime), + "iso-date-time": fmtDef(getDateTime(), compareIsoDateTime), + // duration: https://tools.ietf.org/html/rfc3339#appendix-A + duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, + uri, + "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i, + // uri-template: https://tools.ietf.org/html/rfc6570 + "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i, + // For the source: https://gist.github.com/dperini/729294 + // For test cases: https://mathiasbynens.be/demo/url-regex + url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/, + ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, + regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/, + "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/, + // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types + // byte: https://github.com/miguelmota/is-base64 + byte, + // signed 32 bit integer + int32: { type: "number", validate: validateInt32 }, + // signed 64 bit integer + int64: { type: "number", validate: validateInt64 }, + // C-type float + float: { type: "number", validate: validateNumber }, + // C-type double + double: { type: "number", validate: validateNumber }, + // hint to the UI to hide input strings + password: true, + // unchecked string payload + binary: true + }; + exports.fastFormats = { + ...exports.fullFormats, + date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate), + time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime), + "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), + "iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime), + "iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime), + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, + "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i + }; + exports.formatNames = Object.keys(exports.fullFormats); + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; + var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function date5(str) { + const matches = DATE.exec(str); + if (!matches) + return false; + const year = +matches[1]; + const month = +matches[2]; + const day = +matches[3]; + return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]); + } + function compareDate(d1, d2) { + if (!(d1 && d2)) + return void 0; + if (d1 > d2) + return 1; + if (d1 < d2) + return -1; + return 0; + } + var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i; + function getTime(strictTimeZone) { + return function time3(str) { + const matches = TIME.exec(str); + if (!matches) + return false; + const hr = +matches[1]; + const min = +matches[2]; + const sec = +matches[3]; + const tz = matches[4]; + const tzSign = matches[5] === "-" ? -1 : 1; + const tzH = +(matches[6] || 0); + const tzM = +(matches[7] || 0); + if (tzH > 23 || tzM > 59 || strictTimeZone && !tz) + return false; + if (hr <= 23 && min <= 59 && sec < 60) + return true; + const utcMin = min - tzM * tzSign; + const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0); + return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61; + }; + } + function compareTime(s1, s2) { + if (!(s1 && s2)) + return void 0; + const t1 = (/* @__PURE__ */ new Date("2020-01-01T" + s1)).valueOf(); + const t2 = (/* @__PURE__ */ new Date("2020-01-01T" + s2)).valueOf(); + if (!(t1 && t2)) + return void 0; + return t1 - t2; + } + function compareIsoTime(t1, t2) { + if (!(t1 && t2)) + return void 0; + const a1 = TIME.exec(t1); + const a2 = TIME.exec(t2); + if (!(a1 && a2)) + return void 0; + t1 = a1[1] + a1[2] + a1[3]; + t2 = a2[1] + a2[2] + a2[3]; + if (t1 > t2) + return 1; + if (t1 < t2) + return -1; + return 0; + } + var DATE_TIME_SEPARATOR = /t|\s/i; + function getDateTime(strictTimeZone) { + const time3 = getTime(strictTimeZone); + return function date_time(str) { + const dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length === 2 && date5(dateTime[0]) && time3(dateTime[1]); + }; + } + function compareDateTime(dt1, dt2) { + if (!(dt1 && dt2)) + return void 0; + const d1 = new Date(dt1).valueOf(); + const d2 = new Date(dt2).valueOf(); + if (!(d1 && d2)) + return void 0; + return d1 - d2; + } + function compareIsoDateTime(dt1, dt2) { + if (!(dt1 && dt2)) + return void 0; + const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR); + const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR); + const res = compareDate(d1, d2); + if (res === void 0) + return void 0; + return res || compareTime(t1, t2); + } + var NOT_URI_FRAGMENT = /\/|:/; + var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; + function uri(str) { + return NOT_URI_FRAGMENT.test(str) && URI.test(str); + } + var BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm; + function byte(str) { + BYTE.lastIndex = 0; + return BYTE.test(str); + } + var MIN_INT32 = -(2 ** 31); + var MAX_INT32 = 2 ** 31 - 1; + function validateInt32(value) { + return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32; + } + function validateInt64(value) { + return Number.isInteger(value); + } + function validateNumber() { + return true; + } + var Z_ANCHOR = /[^\\]\\Z/; + function regex(str) { + if (Z_ANCHOR.test(str)) + return false; + try { + new RegExp(str); + return true; + } catch (e) { + return false; + } + } + } +}); + // node_modules/ajv-formats/dist/limit.js var require_limit = __commonJS({ "node_modules/ajv-formats/dist/limit.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatLimitDefinition = void 0; - var ajv_1 = require_ajv2(); - var codegen_1 = require_codegen2(); + var ajv_1 = require_ajv(); + var codegen_1 = require_codegen(); var ops = codegen_1.operators; var KWDs = { formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, @@ -12770,7 +7159,7 @@ var require_dist = __commonJS({ Object.defineProperty(exports, "__esModule", { value: true }); var formats_1 = require_formats(); var limit_1 = require_limit(); - var codegen_1 = require_codegen2(); + var codegen_1 = require_codegen(); var fullName = new codegen_1.Name("fullFormats"); var fastName = new codegen_1.Name("fastFormats"); var formatsPlugin = (ajv, opts = { keywords: true }) => { @@ -25050,8 +19439,8 @@ function registry() { var globalRegistry = globalThis.__zod_globalRegistry; // node_modules/zod/v4/core/compile.js -var INVALID = /* @__PURE__ */ Symbol.for("zod.compile.invalid"); -var FALLBACK_FLAG = /* @__PURE__ */ Symbol.for("zod.compile.fallback"); +var INVALID = Symbol.for("zod.compile.invalid"); +var FALLBACK_FLAG = Symbol.for("zod.compile.fallback"); var ZodCompileAsyncError = class extends Error { constructor(message = "z.compile does not support async refinements, transforms, or checks") { super(message); @@ -28680,7 +23069,7 @@ var nonoptionalProcessor = (schema, ctx, _json, params) => { const seen = ctx.seen.get(schema); seen.ref = def.innerType; }; -var UNREPRESENTABLE_DEFAULT = /* @__PURE__ */ Symbol(); +var UNREPRESENTABLE_DEFAULT = Symbol(); function serializeDefaultValue(value, schema, ctx, json2, params) { let unrepresentable = false; const serialized = JSON.stringify(value, (_2, val) => { @@ -28919,7 +23308,7 @@ var JSONSchemaGenerator = class { var json_schema_exports = {}; // node_modules/zod/v4/core/visit.js -var RESOLVING = /* @__PURE__ */ Symbol("z.visit/resolving"); +var RESOLVING = Symbol("z.visit/resolving"); function visit(schema, fnOrHandlers) { const fn = typeof fnOrHandlers === "function" ? fnOrHandlers : (node2, rewritten) => { const h = fnOrHandlers[node2._zod.def.type]; @@ -33258,7 +27647,10 @@ function isTerminal(status) { return status === "completed" || status === "failed" || status === "cancelled"; } -// node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema/dist/esm/parsers/string.js +// node_modules/zod-to-json-schema/dist/esm/Options.js +var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use"); + +// node_modules/zod-to-json-schema/dist/esm/parsers/string.js var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789"); // node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js @@ -36089,147 +30481,140 @@ function L() { return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null }; } var T = L(); -function G(l3) { - T = l3; +function G(u3) { + T = u3; } -var E = { exec: () => null }; -function d(l3, e = "") { - let t = typeof l3 == "string" ? l3 : l3.source, n = { replace: (r, i) => { +var I = { exec: () => null }; +function d(u3, e = "") { + let t = typeof u3 == "string" ? u3 : u3.source, n = { replace: (r, i) => { let s = typeof i == "string" ? i : i.source; return s = s.replace(m.caret, "$1"), t = t.replace(r, s), n; }, getRegex: () => new RegExp(t, e) }; return n; } -var be = (() => { - try { - return !!new RegExp("(?<=1)(?/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (l3) => new RegExp(`^( {0,3}${l3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}#`), htmlBeginRegex: (l3) => new RegExp(`^ {0,${Math.min(3, l3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; -var Re = /^(?:[ \t]*(?:\n|$))+/; -var Te = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; -var Oe = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; -var I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; -var we = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; +var m = { codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, outputLinkReplace: /\\([\[\]])/g, indentCodeCompensation: /^(\s+)(?:```)/, beginningSpace: /^\s+/, endingHash: /#$/, startingSpaceChar: /^ /, endingSpaceChar: / $/, nonSpaceChar: /[^ ]/, newLineCharGlobal: /\n/g, tabCharGlobal: /\t/g, multipleSpaceGlobal: /\s+/g, blankLine: /^[ \t]*$/, doubleBlankLine: /\n[ \t]*\n[ \t]*$/, blockquoteStart: /^ {0,3}>/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] /, listReplaceTask: /^\[[ xX]\] +/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (u3) => new RegExp(`^( {0,3}${u3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}#`), htmlBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}<(?:[a-z].*>|!--)`, "i") }; +var be = /^(?:[ \t]*(?:\n|$))+/; +var Re = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; +var Te = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; +var E = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; +var Oe = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; var F = /(?:[*+-]|\d{1,9}[.)])/; var ie = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/; var oe = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(); -var ye = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); +var we = d(ie).replace(/bull/g, F).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); var j = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; -var Pe = /^[^\n]+/; +var ye = /^[^\n]+/; var Q = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/; -var Se = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); -var $e = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); +var Pe = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", Q).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); +var Se = d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, F).getRegex(); var v = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; var U = /|$))/; -var _e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); -var ae = d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var Le = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); -var K = { blockquote: Le, code: Te, def: Se, fences: Oe, heading: we, hr: I, html: _e, lheading: oe, list: $e, newline: Re, paragraph: ae, table: E, text: Pe }; -var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); -var Me = { ...K, lheading: ye, table: re, paragraph: d(j).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; -var ze = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: E, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", I).replace("heading", ` *#{1,6} *[^ +var $e = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", U).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); +var ae = d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var _e = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ae).getRegex(); +var K = { blockquote: _e, code: Re, def: Pe, fences: Te, heading: Oe, hr: E, html: $e, lheading: oe, list: Se, newline: be, paragraph: ae, table: I, text: ye }; +var re = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(); +var Le = { ...K, lheading: we, table: re, paragraph: d(j).replace("hr", E).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", re).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }; +var Me = { ...K, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", U).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: I, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(j).replace("hr", E).replace("heading", ` *#{1,6} *[^ ]`).replace("lheading", oe).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }; -var Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; -var Ee = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; +var ze = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; +var Ae = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; var le = /^( {2,}|\\)\n(?!\s*$)/; var Ie = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", be ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(); +var Ce = /(?!~)[\s\p{P}\p{S}]/u; +var Be = /(?:[^\s\p{P}\p{S}]|~)/u; +var qe = /\[(?:[^\[\]`]|`[^`]*?`)*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)|`[^`]*?`|<(?! )[^<>]*?>/g; var ce = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/; -var De = d(ce, "u").replace(/punct/g, D).getRegex(); -var He = d(ce, "u").replace(/punct/g, pe).getRegex(); +var ve = d(ce, "u").replace(/punct/g, D).getRegex(); +var De = d(ce, "u").replace(/punct/g, pe).getRegex(); var he = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)"; -var Ze = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Ge = d(he, "gu").replace(/notPunctSpace/g, qe).replace(/punctSpace/g, Be).replace(/punct/g, pe).getRegex(); -var Ne = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); -var Fe = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); -var je = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); -var Qe = d(U).replace("(?:-->|$)", "-->").getRegex(); -var Ue = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", Qe).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); +var He = d(he, "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Ze = d(he, "gu").replace(/notPunctSpace/g, Be).replace(/punctSpace/g, Ce).replace(/punct/g, pe).getRegex(); +var Ge = d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ue).replace(/punctSpace/g, W).replace(/punct/g, D).getRegex(); +var Ne = d(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(); +var Fe = d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); +var je = d(U).replace("(?:-->|$)", "-->").getRegex(); +var Qe = d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", je).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); var q = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/; -var Ke = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); +var Ue = d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); var de = d(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", Q).getRegex(); var ke = d(/^!?\[(ref)\](?:\[\])?/).replace("ref", Q).getRegex(); -var We = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); +var Ke = d("reflink|nolink(?!\\()", "g").replace("reflink", de).replace("nolink", ke).getRegex(); var se = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/; -var X = { _backpedal: E, anyPunctuation: Fe, autolink: je, blockSkip: ve, br: le, code: Ee, del: E, emStrongLDelim: De, emStrongRDelimAst: Ze, emStrongRDelimUnd: Ne, escape: Ae, link: Ke, nolink: ke, punctuation: Ce, reflink: de, reflinkSearch: We, tag: Ue, text: Ie, url: E }; -var Xe = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; -var N = { ...X, emStrongRDelimAst: Ge, emStrongLDelim: He, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; -var ge = (l3) => Ve[l3]; -function w(l3, e) { +var X = { _backpedal: I, anyPunctuation: Ne, autolink: Fe, blockSkip: qe, br: le, code: Ae, del: I, emStrongLDelim: ve, emStrongRDelimAst: He, emStrongRDelimUnd: Ge, escape: ze, link: Ue, nolink: ke, punctuation: Ee, reflink: de, reflinkSearch: Ke, tag: Qe, text: Ie, url: I }; +var We = { ...X, link: d(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }; +var N = { ...X, emStrongRDelimAst: Ze, emStrongLDelim: De, url: d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", se).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }; +var ge = (u3) => Je[u3]; +function w(u3, e) { if (e) { - if (m.escapeTest.test(l3)) return l3.replace(m.escapeReplace, ge); - } else if (m.escapeTestNoEncode.test(l3)) return l3.replace(m.escapeReplaceNoEncode, ge); - return l3; + if (m.escapeTest.test(u3)) return u3.replace(m.escapeReplace, ge); + } else if (m.escapeTestNoEncode.test(u3)) return u3.replace(m.escapeReplaceNoEncode, ge); + return u3; } -function J(l3) { +function J(u3) { try { - l3 = encodeURI(l3).replace(m.percentDecode, "%"); + u3 = encodeURI(u3).replace(m.percentDecode, "%"); } catch { return null; } - return l3; + return u3; } -function V(l3, e) { - let t = l3.replace(m.findPipe, (i, s, a) => { - let o = false, p = s; - for (; --p >= 0 && a[p] === "\\"; ) o = !o; - return o ? "|" : " |"; +function V(u3, e) { + let t = u3.replace(m.findPipe, (i, s, o) => { + let a = false, l = s; + for (; --l >= 0 && o[l] === "\\"; ) a = !a; + return a ? "|" : " |"; }), n = t.split(m.splitPipe), r = 0; if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e) if (n.length > e) n.splice(e); else for (; n.length < e; ) n.push(""); for (; r < n.length; r++) n[r] = n[r].trim().replace(m.slashPipe, "|"); return n; } -function z2(l3, e, t) { - let n = l3.length; +function z2(u3, e, t) { + let n = u3.length; if (n === 0) return ""; let r = 0; for (; r < n; ) { - let i = l3.charAt(n - r - 1); + let i = u3.charAt(n - r - 1); if (i === e && !t) r++; else if (i !== e && t) r++; else break; } - return l3.slice(0, n - r); + return u3.slice(0, n - r); } -function fe(l3, e) { - if (l3.indexOf(e[1]) === -1) return -1; +function fe(u3, e) { + if (u3.indexOf(e[1]) === -1) return -1; let t = 0; - for (let n = 0; n < l3.length; n++) if (l3[n] === "\\") n++; - else if (l3[n] === e[0]) t++; - else if (l3[n] === e[1] && (t--, t < 0)) return n; + for (let n = 0; n < u3.length; n++) if (u3[n] === "\\") n++; + else if (u3[n] === e[0]) t++; + else if (u3[n] === e[1] && (t--, t < 0)) return n; return t > 0 ? -2 : -1; } -function me(l3, e, t, n, r) { - let i = e.href, s = e.title || null, a = l3[1].replace(r.other.outputLinkReplace, "$1"); +function me(u3, e, t, n, r) { + let i = e.href, s = e.title || null, o = u3[1].replace(r.other.outputLinkReplace, "$1"); n.state.inLink = true; - let o = { type: l3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: a, tokens: n.inlineTokens(a) }; - return n.state.inLink = false, o; + let a = { type: u3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: o, tokens: n.inlineTokens(o) }; + return n.state.inLink = false, a; } -function Ye(l3, e, t) { - let n = l3.match(t.other.indentCodeCompensation); +function Ve(u3, e, t) { + let n = u3.match(t.other.indentCodeCompensation); if (n === null) return e; let r = n[1]; return e.split(` `).map((i) => { let s = i.match(t.other.beginningSpace); if (s === null) return i; - let [a] = s; - return a.length >= r.length ? i.slice(r.length) : i; + let [o] = s; + return o.length >= r.length ? i.slice(r.length) : i; }).join(` `); } @@ -36255,7 +30640,7 @@ var y = class { fences(e) { let t = this.rules.block.fences.exec(e); if (t) { - let n = t[0], r = Ye(n, t[3] || "", this.rules); + let n = t[0], r = Ve(n, t[3] || "", this.rules); return { type: "code", raw: n, lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2], text: r }; } } @@ -36282,19 +30667,19 @@ var y = class { `).split(` `), r = "", i = "", s = []; for (; n.length > 0; ) { - let a = false, o = [], p; - for (p = 0; p < n.length; p++) if (this.rules.other.blockquoteStart.test(n[p])) o.push(n[p]), a = true; - else if (!a) o.push(n[p]); + let o = false, a = [], l; + for (l = 0; l < n.length; l++) if (this.rules.other.blockquoteStart.test(n[l])) a.push(n[l]), o = true; + else if (!o) a.push(n[l]); else break; - n = n.slice(p); - let u = o.join(` -`), c = u.replace(this.rules.other.blockquoteSetextReplace, ` + n = n.slice(l); + let c = a.join(` +`), p = c.replace(this.rules.other.blockquoteSetextReplace, ` $1`).replace(this.rules.other.blockquoteSetextReplace2, ""); r = r ? `${r} -${u}` : u, i = i ? `${i} -${c}` : c; +${c}` : c, i = i ? `${i} +${p}` : p; let g = this.lexer.state.top; - if (this.lexer.state.top = true, this.lexer.blockTokens(c, s, true), this.lexer.state.top = g, n.length === 0) break; + if (this.lexer.state.top = true, this.lexer.blockTokens(p, s, true), this.lexer.state.top = g, n.length === 0) break; let h = s.at(-1); if (h?.type === "code") break; if (h?.type === "blockquote") { @@ -36320,45 +30705,45 @@ ${c}` : c; if (t) { let n = t[1].trim(), r = n.length > 1, i = { type: "list", raw: "", ordered: r, start: r ? +n.slice(0, -1) : "", loose: false, items: [] }; n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); - let s = this.rules.other.listItemRegex(n), a = false; + let s = this.rules.other.listItemRegex(n), o = false; for (; e; ) { - let p = false, u = "", c = ""; + let l = false, c = "", p = ""; if (!(t = s.exec(e)) || this.rules.block.hr.test(e)) break; - u = t[0], e = e.substring(u.length); + c = t[0], e = e.substring(c.length); let g = t[2].split(` `, 1)[0].replace(this.rules.other.listReplaceTabs, (H) => " ".repeat(3 * H.length)), h = e.split(` `, 1)[0], R = !g.trim(), f = 0; - if (this.options.pedantic ? (f = 2, c = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, c = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (u += h + ` -`, e = e.substring(h.length + 1), p = true), !p) { + if (this.options.pedantic ? (f = 2, p = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, p = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (c += h + ` +`, e = e.substring(h.length + 1), l = true), !l) { let H = this.rules.other.nextBulletRegex(f), ee = this.rules.other.hrRegex(f), te = this.rules.other.fencesBeginRegex(f), ne = this.rules.other.headingBeginRegex(f), xe = this.rules.other.htmlBeginRegex(f); for (; e; ) { let Z = e.split(` `, 1)[0], A; if (h = Z, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, " "), A = h) : A = h.replace(this.rules.other.tabCharGlobal, " "), te.test(h) || ne.test(h) || xe.test(h) || H.test(h) || ee.test(h)) break; - if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) c += ` + if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) p += ` ` + A.slice(f); else { if (R || g.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || te.test(g) || ne.test(g) || ee.test(g)) break; - c += ` + p += ` ` + h; } - !R && !h.trim() && (R = true), u += Z + ` + !R && !h.trim() && (R = true), c += Z + ` `, e = e.substring(Z.length + 1), g = A.slice(f); } } - i.loose || (a ? i.loose = true : this.rules.other.doubleBlankLine.test(u) && (a = true)); + i.loose || (o ? i.loose = true : this.rules.other.doubleBlankLine.test(c) && (o = true)); let O = null, Y; - this.options.gfm && (O = this.rules.other.listIsTask.exec(c), O && (Y = O[0] !== "[ ] ", c = c.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: u, task: !!O, checked: Y, loose: false, text: c, tokens: [] }), i.raw += u; + this.options.gfm && (O = this.rules.other.listIsTask.exec(p), O && (Y = O[0] !== "[ ] ", p = p.replace(this.rules.other.listReplaceTask, ""))), i.items.push({ type: "list_item", raw: c, task: !!O, checked: Y, loose: false, text: p, tokens: [] }), i.raw += c; } - let o = i.items.at(-1); - if (o) o.raw = o.raw.trimEnd(), o.text = o.text.trimEnd(); + let a = i.items.at(-1); + if (a) a.raw = a.raw.trimEnd(), a.text = a.text.trimEnd(); else return; i.raw = i.raw.trimEnd(); - for (let p = 0; p < i.items.length; p++) if (this.lexer.state.top = false, i.items[p].tokens = this.lexer.blockTokens(i.items[p].text, []), !i.loose) { - let u = i.items[p].tokens.filter((g) => g.type === "space"), c = u.length > 0 && u.some((g) => this.rules.other.anyLine.test(g.raw)); - i.loose = c; + for (let l = 0; l < i.items.length; l++) if (this.lexer.state.top = false, i.items[l].tokens = this.lexer.blockTokens(i.items[l].text, []), !i.loose) { + let c = i.items[l].tokens.filter((g) => g.type === "space"), p = c.length > 0 && c.some((g) => this.rules.other.anyLine.test(g.raw)); + i.loose = p; } - if (i.loose) for (let p = 0; p < i.items.length; p++) i.items[p].loose = true; + if (i.loose) for (let l = 0; l < i.items.length; l++) i.items[l].loose = true; return i; } } @@ -36379,9 +30764,9 @@ ${c}` : c; let n = V(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(` `) : [], s = { type: "table", raw: t[0], header: [], align: [], rows: [] }; if (n.length === r.length) { - for (let a of r) this.rules.other.tableAlignRight.test(a) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(a) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(a) ? s.align.push("left") : s.align.push(null); - for (let a = 0; a < n.length; a++) s.header.push({ text: n[a], tokens: this.lexer.inline(n[a]), header: true, align: s.align[a] }); - for (let a of i) s.rows.push(V(a, s.header.length).map((o, p) => ({ text: o, tokens: this.lexer.inline(o), header: false, align: s.align[p] }))); + for (let o of r) this.rules.other.tableAlignRight.test(o) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(o) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(o) ? s.align.push("left") : s.align.push(null); + for (let o = 0; o < n.length; o++) s.header.push({ text: n[o], tokens: this.lexer.inline(n[o]), header: true, align: s.align[o] }); + for (let o of i) s.rows.push(V(o, s.header.length).map((a, l) => ({ text: a, tokens: this.lexer.inline(a), header: false, align: s.align[l] }))); return s; } } @@ -36421,8 +30806,8 @@ ${c}` : c; let s = fe(t[2], "()"); if (s === -2) return; if (s > -1) { - let o = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; - t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, o).trim(), t[3] = ""; + let a = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; + t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, a).trim(), t[3] = ""; } } let r = t[2], i = ""; @@ -36448,20 +30833,20 @@ ${c}` : c; let r = this.rules.inline.emStrongLDelim.exec(e); if (!r || r[3] && n.match(this.rules.other.unicodeAlphaNumeric)) return; if (!(r[1] || r[2] || "") || !n || this.rules.inline.punctuation.exec(n)) { - let s = [...r[0]].length - 1, a, o, p = s, u = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; - for (c.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = c.exec(t)) != null; ) { - if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a) continue; - if (o = [...a].length, r[3] || r[4]) { - p += o; + let s = [...r[0]].length - 1, o, a, l = s, c = 0, p = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + for (p.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = p.exec(t)) != null; ) { + if (o = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !o) continue; + if (a = [...o].length, r[3] || r[4]) { + l += a; continue; - } else if ((r[5] || r[6]) && s % 3 && !((s + o) % 3)) { - u += o; + } else if ((r[5] || r[6]) && s % 3 && !((s + a) % 3)) { + c += a; continue; } - if (p -= o, p > 0) continue; - o = Math.min(o, o + p + u); - let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + o); - if (Math.min(s, o) % 2) { + if (l -= a, l > 0) continue; + a = Math.min(a, a + l + c); + let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + a); + if (Math.min(s, a) % 2) { let f = h.slice(1, -1); return { type: "em", raw: h, text: f, tokens: this.lexer.inlineTokens(f) }; } @@ -36515,7 +30900,7 @@ ${c}` : c; } } }; -var x = class l { +var x = class u { tokens; options; state; @@ -36530,10 +30915,10 @@ var x = class l { return { block: C, inline: M }; } static lex(e, t) { - return new l(t).lex(e); + return new u(t).lex(e); } static lexInline(e, t) { - return new l(t).inlineTokens(e); + return new u(t).inlineTokens(e); } lex(e) { e = e.replace(m.carriageReturn, ` @@ -36607,9 +30992,9 @@ var x = class l { } let i = e; if (this.options.extensions?.startBlock) { - let s = 1 / 0, a = e.slice(1), o; - this.options.extensions.startBlock.forEach((p) => { - o = p.call({ lexer: this }, a), typeof o == "number" && o >= 0 && (s = Math.min(s, o)); + let s = 1 / 0, o = e.slice(1), a; + this.options.extensions.startBlock.forEach((l) => { + a = l.call({ lexer: this }, o), typeof a == "number" && a >= 0 && (s = Math.min(s, a)); }), s < 1 / 0 && s >= 0 && (i = e.substring(0, s + 1)); } if (this.state.top && (r = this.tokenizer.paragraph(i))) { @@ -36649,14 +31034,13 @@ var x = class l { if (o.length > 0) for (; (r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) != null; ) o.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); } for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null; ) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); - let i; - for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) i = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i) + "[" + "a".repeat(r[0].length - i - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n; - let s = false, a = ""; + let i = false, s = ""; for (; e; ) { - s || (a = ""), s = false; + i || (s = ""), i = false; let o; - if (this.options.extensions?.inline?.some((u) => (o = u.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; + if (this.options.extensions?.inline?.some((l) => (o = l.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; if (o = this.tokenizer.escape(e)) { e = e.substring(o.raw.length), t.push(o); continue; @@ -36671,11 +31055,11 @@ var x = class l { } if (o = this.tokenizer.reflink(e, this.tokens.links)) { e = e.substring(o.raw.length); - let u = t.at(-1); - o.type === "text" && u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); + let l = t.at(-1); + o.type === "text" && l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); continue; } - if (o = this.tokenizer.emStrong(e, n, a)) { + if (o = this.tokenizer.emStrong(e, n, s)) { e = e.substring(o.raw.length), t.push(o); continue; } @@ -36699,25 +31083,25 @@ var x = class l { e = e.substring(o.raw.length), t.push(o); continue; } - let p = e; + let a = e; if (this.options.extensions?.startInline) { - let u = 1 / 0, c = e.slice(1), g; - this.options.extensions.startInline.forEach((h) => { - g = h.call({ lexer: this }, c), typeof g == "number" && g >= 0 && (u = Math.min(u, g)); - }), u < 1 / 0 && u >= 0 && (p = e.substring(0, u + 1)); - } - if (o = this.tokenizer.inlineText(p)) { - e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (a = o.raw.slice(-1)), s = true; - let u = t.at(-1); - u?.type === "text" ? (u.raw += o.raw, u.text += o.text) : t.push(o); + let l = 1 / 0, c = e.slice(1), p; + this.options.extensions.startInline.forEach((g) => { + p = g.call({ lexer: this }, c), typeof p == "number" && p >= 0 && (l = Math.min(l, p)); + }), l < 1 / 0 && l >= 0 && (a = e.substring(0, l + 1)); + } + if (o = this.tokenizer.inlineText(a)) { + e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (s = o.raw.slice(-1)), i = true; + let l = t.at(-1); + l?.type === "text" ? (l.raw += o.raw, l.text += o.text) : t.push(o); continue; } if (e) { - let u = "Infinite loop on byte: " + e.charCodeAt(0); + let l = "Infinite loop on byte: " + e.charCodeAt(0); if (this.options.silent) { - console.error(u); + console.error(l); break; - } else throw new Error(u); + } else throw new Error(l); } } return t; @@ -36760,9 +31144,9 @@ ${this.parser.parse(e)} } list(e) { let t = e.ordered, n = e.start, r = ""; - for (let a = 0; a < e.items.length; a++) { - let o = e.items[a]; - r += this.listitem(o); + for (let o = 0; o < e.items.length; o++) { + let a = e.items[o]; + r += this.listitem(a); } let i = t ? "ol" : "ul", s = t && n !== 1 ? ' start="' + n + '"' : ""; return "<" + i + s + `> @@ -36793,7 +31177,7 @@ ${this.parser.parse(e)} for (let i = 0; i < e.rows.length; i++) { let s = e.rows[i]; n = ""; - for (let a = 0; a < s.length; a++) n += this.tablecell(s[a]); + for (let o = 0; o < s.length; o++) n += this.tablecell(s[o]); r += this.tablerow({ text: n }); } return r && (r = `${r}`), `
@@ -36875,7 +31259,7 @@ var $ = class { return ""; } }; -var b = class l2 { +var b = class u2 { options; renderer; textRenderer; @@ -36883,19 +31267,19 @@ var b = class l2 { this.options = e || T, this.options.renderer = this.options.renderer || new P(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new $(); } static parse(e, t) { - return new l2(t).parse(e); + return new u2(t).parse(e); } static parseInline(e, t) { - return new l2(t).parseInline(e); + return new u2(t).parseInline(e); } parse(e, t = true) { let n = ""; for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let a = i, o = this.options.extensions.renderers[a.type].call({ parser: this }, a); - if (o !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(a.type)) { - n += o || ""; + let o = i, a = this.options.extensions.renderers[o.type].call({ parser: this }, o); + if (a !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(o.type)) { + n += a || ""; continue; } } @@ -36942,16 +31326,16 @@ var b = class l2 { continue; } case "text": { - let a = s, o = this.renderer.text(a); - for (; r + 1 < e.length && e[r + 1].type === "text"; ) a = e[++r], o += ` -` + this.renderer.text(a); - t ? n += this.renderer.paragraph({ type: "paragraph", raw: o, text: o, tokens: [{ type: "text", raw: o, text: o, escaped: true }] }) : n += o; + let o = s, a = this.renderer.text(o); + for (; r + 1 < e.length && e[r + 1].type === "text"; ) o = e[++r], a += ` +` + this.renderer.text(o); + t ? n += this.renderer.paragraph({ type: "paragraph", raw: a, text: a, tokens: [{ type: "text", raw: a, text: a, escaped: true }] }) : n += a; continue; } default: { - let a = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(a), ""; - throw new Error(a); + let o = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(o), ""; + throw new Error(o); } } } @@ -36962,9 +31346,9 @@ var b = class l2 { for (let r = 0; r < e.length; r++) { let i = e[r]; if (this.options.extensions?.renderers?.[i.type]) { - let a = this.options.extensions.renderers[i.type].call({ parser: this }, i); - if (a !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { - n += a || ""; + let o = this.options.extensions.renderers[i.type].call({ parser: this }, i); + if (o !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) { + n += o || ""; continue; } } @@ -37011,9 +31395,9 @@ var b = class l2 { break; } default: { - let a = 'Token with "' + s.type + '" type was not found.'; - if (this.options.silent) return console.error(a), ""; - throw new Error(a); + let o = 'Token with "' + s.type + '" type was not found.'; + if (this.options.silent) return console.error(o), ""; + throw new Error(o); } } } @@ -37067,7 +31451,7 @@ var B = class { case "table": { let i = r; for (let s of i.header) n = n.concat(this.walkTokens(s.tokens, t)); - for (let s of i.rows) for (let a of s) n = n.concat(this.walkTokens(a.tokens, t)); + for (let s of i.rows) for (let o of s) n = n.concat(this.walkTokens(o.tokens, t)); break; } case "list": { @@ -37078,8 +31462,8 @@ var B = class { default: { let i = r; this.defaults.extensions?.childTokens?.[i.type] ? this.defaults.extensions.childTokens[i.type].forEach((s) => { - let a = i[s].flat(1 / 0); - n = n.concat(this.walkTokens(a, t)); + let o = i[s].flat(1 / 0); + n = n.concat(this.walkTokens(o, t)); }) : i.tokens && (n = n.concat(this.walkTokens(i.tokens, t))); } } @@ -37093,9 +31477,9 @@ var B = class { if (!i.name) throw new Error("extension name required"); if ("renderer" in i) { let s = t.renderers[i.name]; - s ? t.renderers[i.name] = function(...a) { - let o = i.renderer.apply(this, a); - return o === false && (o = s.apply(this, a)), o; + s ? t.renderers[i.name] = function(...o) { + let a = i.renderer.apply(this, o); + return a === false && (a = s.apply(this, o)), a; } : t.renderers[i.name] = i.renderer; } if ("tokenizer" in i) { @@ -37109,10 +31493,10 @@ var B = class { for (let s in n.renderer) { if (!(s in i)) throw new Error(`renderer '${s}' does not exist`); if (["options", "parser"].includes(s)) continue; - let a = s, o = n.renderer[a], p = i[a]; - i[a] = (...u) => { - let c = o.apply(i, u); - return c === false && (c = p.apply(i, u)), c || ""; + let o = s, a = n.renderer[o], l = i[o]; + i[o] = (...c) => { + let p = a.apply(i, c); + return p === false && (p = l.apply(i, c)), p || ""; }; } r.renderer = i; @@ -37122,10 +31506,10 @@ var B = class { for (let s in n.tokenizer) { if (!(s in i)) throw new Error(`tokenizer '${s}' does not exist`); if (["options", "rules", "lexer"].includes(s)) continue; - let a = s, o = n.tokenizer[a], p = i[a]; - i[a] = (...u) => { - let c = o.apply(i, u); - return c === false && (c = p.apply(i, u)), c; + let o = s, a = n.tokenizer[o], l = i[o]; + i[o] = (...c) => { + let p = a.apply(i, c); + return p === false && (p = l.apply(i, c)), p; }; } r.tokenizer = i; @@ -37135,30 +31519,30 @@ var B = class { for (let s in n.hooks) { if (!(s in i)) throw new Error(`hook '${s}' does not exist`); if (["options", "block"].includes(s)) continue; - let a = s, o = n.hooks[a], p = i[a]; - S.passThroughHooks.has(s) ? i[a] = (u) => { + let o = s, a = n.hooks[o], l = i[o]; + S.passThroughHooks.has(s) ? i[o] = (c) => { if (this.defaults.async && S.passThroughHooksRespectAsync.has(s)) return (async () => { - let g = await o.call(i, u); - return p.call(i, g); + let g = await a.call(i, c); + return l.call(i, g); })(); - let c = o.call(i, u); - return p.call(i, c); - } : i[a] = (...u) => { + let p = a.call(i, c); + return l.call(i, p); + } : i[o] = (...c) => { if (this.defaults.async) return (async () => { - let g = await o.apply(i, u); - return g === false && (g = await p.apply(i, u)), g; + let g = await a.apply(i, c); + return g === false && (g = await l.apply(i, c)), g; })(); - let c = o.apply(i, u); - return c === false && (c = p.apply(i, u)), c; + let p = a.apply(i, c); + return p === false && (p = l.apply(i, c)), p; }; } r.hooks = i; } if (n.walkTokens) { let i = this.defaults.walkTokens, s = n.walkTokens; - r.walkTokens = function(a) { - let o = []; - return o.push(s.call(this, a)), i && (o = o.concat(i.call(this, a))), o; + r.walkTokens = function(o) { + let a = []; + return a.push(s.call(this, o)), i && (a = a.concat(i.call(this, o))), a; }; } this.defaults = { ...this.defaults, ...r }; @@ -37175,24 +31559,24 @@ var B = class { } parseMarkdown(e) { return (n, r) => { - let i = { ...r }, s = { ...this.defaults, ...i }, a = this.onError(!!s.silent, !!s.async); - if (this.defaults.async === true && i.async === false) return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); - if (typeof n > "u" || n === null) return a(new Error("marked(): input parameter is undefined or null")); - if (typeof n != "string") return a(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); + let i = { ...r }, s = { ...this.defaults, ...i }, o = this.onError(!!s.silent, !!s.async); + if (this.defaults.async === true && i.async === false) return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + if (typeof n > "u" || n === null) return o(new Error("marked(): input parameter is undefined or null")); + if (typeof n != "string") return o(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); if (s.hooks && (s.hooks.options = s, s.hooks.block = e), s.async) return (async () => { - let o = s.hooks ? await s.hooks.preprocess(n) : n, u = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(o, s), c = s.hooks ? await s.hooks.processAllTokens(u) : u; - s.walkTokens && await Promise.all(this.walkTokens(c, s.walkTokens)); - let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(c, s); + let a = s.hooks ? await s.hooks.preprocess(n) : n, c = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(a, s), p = s.hooks ? await s.hooks.processAllTokens(c) : c; + s.walkTokens && await Promise.all(this.walkTokens(p, s.walkTokens)); + let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); return s.hooks ? await s.hooks.postprocess(h) : h; - })().catch(a); + })().catch(o); try { s.hooks && (n = s.hooks.preprocess(n)); - let p = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); - s.hooks && (p = s.hooks.processAllTokens(p)), s.walkTokens && this.walkTokens(p, s.walkTokens); - let c = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(p, s); - return s.hooks && (c = s.hooks.postprocess(c)), c; - } catch (o) { - return a(o); + let l = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); + s.hooks && (l = s.hooks.processAllTokens(l)), s.walkTokens && this.walkTokens(l, s.walkTokens); + let p = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(l, s); + return s.hooks && (p = s.hooks.postprocess(p)), p; + } catch (a) { + return o(a); } }; } @@ -37209,19 +31593,19 @@ Please report this to https://github.com/markedjs/marked.`, e) { } }; var _ = new B(); -function k(l3, e) { - return _.parse(l3, e); +function k(u3, e) { + return _.parse(u3, e); } -k.options = k.setOptions = function(l3) { - return _.setOptions(l3), k.defaults = _.defaults, G(k.defaults), k; +k.options = k.setOptions = function(u3) { + return _.setOptions(u3), k.defaults = _.defaults, G(k.defaults), k; }; k.getDefaults = L; k.defaults = T; -k.use = function(...l3) { - return _.use(...l3), k.defaults = _.defaults, G(k.defaults), k; +k.use = function(...u3) { + return _.use(...u3), k.defaults = _.defaults, G(k.defaults), k; }; -k.walkTokens = function(l3, e) { - return _.walkTokens(l3, e); +k.walkTokens = function(u3, e) { + return _.walkTokens(u3, e); }; k.parseInline = _.parseInline; k.Parser = b; @@ -37233,13 +31617,13 @@ k.lexer = x.lex; k.Tokenizer = y; k.Hooks = S; k.parse = k; -var Zt = k.options; -var Gt = k.setOptions; -var Nt = k.use; -var Ft = k.walkTokens; -var jt = k.parseInline; -var Ut = b.parse; -var Kt = x.lex; +var Ht = k.options; +var Zt = k.setOptions; +var Gt = k.use; +var Nt = k.walkTokens; +var Ft = k.parseInline; +var Qt = b.parse; +var Ut = x.lex; // src/show.ts function formatConversationAsMarkdown(jsonl, startLine, endLine) { From c7cca0f00a0b25923123f505edf54f101b7962c4 Mon Sep 17 00:00:00 2001 From: HengYang Date: Thu, 15 Oct 2026 13:36:58 +0800 Subject: [PATCH 30/33] fix(admission): withhold removed transcripts instead of failing search A retained search row whose transcript has since been removed made the whole request fail with "Conversation changed during record admission". Codex replaces archived rollouts with compressed .jsonl.zst files, so a transcript indexed before compression disappears and every query that matched one of its rows failed. A removed transcript has nothing left to verify or expose, so search now withholds its rows and continues. Symlink substitution, indexed-range rewrites and other admission failures still fail closed. --- dist/record-admission.js | 15 +++++++++++++-- src/record-admission.ts | 14 +++++++++++--- test/search-admission.test.ts | 6 ++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/dist/record-admission.js b/dist/record-admission.js index 396a9166..2b7c5091 100644 --- a/dist/record-admission.js +++ b/dist/record-admission.js @@ -584,7 +584,18 @@ export function createSearchAdmission() { return !cached.excluded; let fd; try { - const pathInfo = fs.lstatSync(file); + let pathInfo; + try { + pathInfo = fs.lstatSync(file); + } + catch (error) { + // A transcript removed since indexing has nothing left to verify or expose: + // withhold its retained rows instead of failing the whole search. + if (error.code !== 'ENOENT') + throw error; + files.set(file, { excluded: true }); + return false; + } if (!pathInfo.isFile()) throw new Error('Conversation changed during record admission'); fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); @@ -628,7 +639,7 @@ export function createSearchAdmission() { verify() { assertUnchangedPolicy(policySnapshot); for (const [file, { initial, digest }] of files) { - if (digest !== undefined) + if (initial !== undefined && digest !== undefined) assertUnchangedSearchPrefix(file, initial, digest); } assertUnchangedPolicy(policySnapshot); diff --git a/src/record-admission.ts b/src/record-admission.ts index 3254fd10..a050814d 100644 --- a/src/record-admission.ts +++ b/src/record-admission.ts @@ -512,14 +512,22 @@ export async function archiveAdmittedConversation(source: string, destination: s export function createSearchAdmission() { const policy = readRecordExclusions(); const policySnapshot = JSON.stringify(policy); - const files = new Map(); + const files = new Map(); const checkFile = (file: string) => { assertUnchangedPolicy(policySnapshot); const cached = files.get(file); if (cached) return !cached.excluded; let fd: number | undefined; try { - const pathInfo = fs.lstatSync(file); + let pathInfo: fs.Stats; + try { pathInfo = fs.lstatSync(file); } + catch (error) { + // A transcript removed since indexing has nothing left to verify or expose: + // withhold its retained rows instead of failing the whole search. + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error; + files.set(file, { excluded: true }); + return false; + } if (!pathInfo.isFile()) throw new Error('Conversation changed during record admission'); fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); const initial = fs.fstatSync(fd); @@ -554,7 +562,7 @@ export function createSearchAdmission() { verify() { assertUnchangedPolicy(policySnapshot); for (const [file, { initial, digest }] of files) { - if (digest !== undefined) assertUnchangedSearchPrefix(file, initial, digest); + if (initial !== undefined && digest !== undefined) assertUnchangedSearchPrefix(file, initial, digest); } assertUnchangedPolicy(policySnapshot); }, diff --git a/test/search-admission.test.ts b/test/search-admission.test.ts index f339c533..3f796870 100644 --- a/test/search-admission.test.ts +++ b/test/search-admission.test.ts @@ -130,6 +130,12 @@ describe('retained search admission', () => { fs.symlinkSync(file + '.original', file); await expect(searchConversations('needle', { mode: 'text' })).rejects.toThrow(/changed during record admission/); }); + it.each(['text', 'vector', 'both'] as const)('withholds a removed transcript without failing %s search', async mode => { + seed('safe'); const removed = seed('removed', '2026-02-01T00:00:00Z'); + fs.rmSync(removed); + const results = await searchConversations('needle', { mode, limit: 2 }); + expect(results.map(x => x.exchange.id)).toEqual(['safe']); + }); it('keeps an indexed exchange searchable while its transcript grows during admission', async () => { const file = seed('safe'); const original = fs.readSync; From e0698c8e9da8394af5bea7d5ba3b24ab3020fcf3 Mon Sep 17 00:00:00 2001 From: HengYang Date: Mon, 9 Nov 2026 00:56:22 +0800 Subject: [PATCH 31/33] fix(summary): preserve provider when source resume is disabled --- dist/summarizer.d.ts | 5 ++++- dist/summarizer.js | 14 ++++++-------- src/summarizer.ts | 17 ++++++++++------- test/codex-summary-routing.test.ts | 19 +++++++++++++++++++ 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/dist/summarizer.d.ts b/dist/summarizer.d.ts index 039d6252..59f599bc 100644 --- a/dist/summarizer.d.ts +++ b/dist/summarizer.d.ts @@ -174,4 +174,7 @@ export declare function runCodexCommand(command: CodexSummarizerCommand): Promis * See https://github.com/obra/episodic-memory/issues/98. */ export declare function getCodexModel(_exchanges: ConversationExchange[]): string | undefined; -export declare function summarizeConversation(exchanges: ConversationExchange[], sessionId?: string): Promise; +export interface SummarizeOptions { + allowResume?: boolean; +} +export declare function summarizeConversation(exchanges: ConversationExchange[], sessionId?: string, options?: SummarizeOptions): Promise; diff --git a/dist/summarizer.js b/dist/summarizer.js index 9a73c134..54e4705d 100644 --- a/dist/summarizer.js +++ b/dist/summarizer.js @@ -709,11 +709,10 @@ function getCodexSessionId(exchanges, sessionId) { export function getCodexModel(_exchanges) { return process.env.EPISODIC_MEMORY_CODEX_MODEL || undefined; } -export async function summarizeConversation(exchanges, sessionId) { +export async function summarizeConversation(exchanges, sessionId, options = {}) { const recordPolicy = readRecordExclusions(); exchanges = exchanges.map(exchange => admitExchange(exchange, recordPolicy)).filter((exchange) => exchange !== null); - if (recordPolicy) - sessionId = undefined; + const allowResume = options.allowResume !== false && recordPolicy === null; // Handle trivial conversations if (exchanges.length === 0) { return 'Trivial conversation with no substantive content.'; @@ -724,11 +723,10 @@ export async function summarizeConversation(exchanges, sessionId) { return 'Trivial conversation with no substantive content.'; } } - const codexSessionId = getCodexSessionId(exchanges, sessionId); + const codexSessionId = allowResume ? getCodexSessionId(exchanges, sessionId) : undefined; if (exchanges.some(exchange => exchange.harness === 'codex')) { - // A sessionless or policy-filtered transcript has no source context to fork. - // Summarize its admitted text in a fresh, isolated Codex thread instead. - const isolated = recordPolicy !== null || !codexSessionId; + // Filtered text must not recover unscreened source context. + const isolated = !codexSessionId; const prompt = isolated ? `${SUMMARIZER_CONTEXT_MARKER}. Summarize only the following admitted transcript in 2-4 factual sentences inside . Do not inspect files, use tools or recover any original session.\n\n${formatConversationText(exchanges)}` : buildCodexSummaryPrompt(); @@ -749,7 +747,7 @@ export async function summarizeConversation(exchanges, sessionId) { // would fail on every one before the no-resume retry kicks in. Treat // missing harness as Claude for backward compatibility with old archives. const isClaudeSession = exchanges.some(e => e.harness === 'claude' || e.harness === undefined); - const claudeSessionId = !codexSessionId && isClaudeSession ? sessionId : undefined; + const claudeSessionId = allowResume && isClaudeSession ? sessionId : undefined; const cwd = claudeSessionId ? exchanges.find(e => e.cwd)?.cwd : undefined; const conversationText = claudeSessionId ? '' // When resuming, no need to include conversation text - it's already in context diff --git a/src/summarizer.ts b/src/summarizer.ts index 8ef8c59c..aa8d4ca5 100644 --- a/src/summarizer.ts +++ b/src/summarizer.ts @@ -784,10 +784,14 @@ export function getCodexModel(_exchanges: ConversationExchange[]): string | unde return process.env.EPISODIC_MEMORY_CODEX_MODEL || undefined; } -export async function summarizeConversation(exchanges: ConversationExchange[], sessionId?: string): Promise { +export interface SummarizeOptions { + allowResume?: boolean; +} + +export async function summarizeConversation(exchanges: ConversationExchange[], sessionId?: string, options: SummarizeOptions = {}): Promise { const recordPolicy = readRecordExclusions(); exchanges = exchanges.map(exchange => admitExchange(exchange, recordPolicy)).filter((exchange): exchange is ConversationExchange => exchange !== null); - if (recordPolicy) sessionId = undefined; + const allowResume = options.allowResume !== false && recordPolicy === null; // Handle trivial conversations if (exchanges.length === 0) { return 'Trivial conversation with no substantive content.'; @@ -800,11 +804,10 @@ export async function summarizeConversation(exchanges: ConversationExchange[], s } } - const codexSessionId = getCodexSessionId(exchanges, sessionId); + const codexSessionId = allowResume ? getCodexSessionId(exchanges, sessionId) : undefined; if (exchanges.some(exchange => exchange.harness === 'codex')) { - // A sessionless or policy-filtered transcript has no source context to fork. - // Summarize its admitted text in a fresh, isolated Codex thread instead. - const isolated = recordPolicy !== null || !codexSessionId; + // Filtered text must not recover unscreened source context. + const isolated = !codexSessionId; const prompt = isolated ? `${SUMMARIZER_CONTEXT_MARKER}. Summarize only the following admitted transcript in 2-4 factual sentences inside . Do not inspect files, use tools or recover any original session.\n\n${formatConversationText(exchanges)}` : buildCodexSummaryPrompt(); @@ -829,7 +832,7 @@ export async function summarizeConversation(exchanges: ConversationExchange[], s const isClaudeSession = exchanges.some( e => e.harness === 'claude' || e.harness === undefined ); - const claudeSessionId = !codexSessionId && isClaudeSession ? sessionId : undefined; + const claudeSessionId = allowResume && isClaudeSession ? sessionId : undefined; const cwd = claudeSessionId ? exchanges.find(e => e.cwd)?.cwd : undefined; const conversationText = claudeSessionId ? '' // When resuming, no need to include conversation text - it's already in context diff --git a/test/codex-summary-routing.test.ts b/test/codex-summary-routing.test.ts index 52f9bd70..130cab3f 100644 --- a/test/codex-summary-routing.test.ts +++ b/test/codex-summary-routing.test.ts @@ -183,6 +183,25 @@ describe('Codex summary provider ownership', () => { expect(query).not.toHaveBeenCalled(); }); + it('uses only admitted Codex text when source-session resume is disabled', async () => { + installFakeCodex('thread/fork'); + + expect(await summarizeConversation([exchange('source-session')], 'source-session', { allowResume: false })) + .toBe('Codex kept provider ownership.'); + expect(query).not.toHaveBeenCalled(); + }); + + it('uses only transcript text when Claude source-session resume is disabled', async () => { + const transcript = { ...exchange('source-session'), harness: 'claude' as const }; + + expect(await summarizeConversation([transcript], 'source-session', { allowResume: false })) + .toBe('Wrong provider.'); + const [request] = vi.mocked(query).mock.calls[0]; + expect(request.options?.resume).toBeUndefined(); + expect(request.prompt).toContain(transcript.userMessage); + expect(request.prompt).toContain(transcript.assistantMessage); + }); + it('does not fall back to Claude when a Codex fork fails', async () => { installFakeCodex('thread/fork'); From 55c61f002d60dae56796dc132c01c377b9da7c9e Mon Sep 17 00:00:00 2001 From: HengYang Date: Tue, 10 Nov 2026 02:10:13 +0800 Subject: [PATCH 32/33] fix(summarizer): retain native authentication under settings isolation --- README.md | 2 + dist/summarizer.js | 30 ++++++++++- src/summarizer.ts | 29 ++++++++++- test/summarizer-auth-isolation.test.ts | 70 ++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 test/summarizer-auth-isolation.test.ts diff --git a/README.md b/README.md index 896d58b7..6d258573 100644 --- a/README.md +++ b/README.md @@ -231,6 +231,8 @@ In Codex and opencode, the skill guides the agent to use the episodic-memory MCP By default, episodic-memory uses your Claude Code authentication for Claude Code summarization. Codex-indexed sessions with a session ID are summarized through `codex app-server` by creating an ephemeral `thread/fork`, so the summary can use Codex session context and reasoning summaries without appending to the original rollout. A Codex transcript without a session ID is summarized from its admitted text in an isolated ephemeral `thread/start`; it is never sent to Claude. +Claude summaries preserve the user-level `apiKeyHelper` and `env.ANTHROPIC_BASE_URL` from the selected Claude configuration directory. The helper remains with Claude Code; episodic-memory does not retrieve or store its credential. Explicit environment and episodic endpoint overrides take precedence. Hooks, plugins, project settings and MCP servers remain excluded from the summarizer. Missing settings leave native environment or OAuth authentication available; unreadable or malformed settings stop the call with a message that omits their contents. + To route summarization through a custom Anthropic-compatible endpoint or override the model: ```bash diff --git a/dist/summarizer.js b/dist/summarizer.js index 80fd6c3b..893fc3f7 100644 --- a/dist/summarizer.js +++ b/dist/summarizer.js @@ -2,6 +2,7 @@ import fs from 'fs'; import os from 'node:os'; import path from 'node:path'; import { admitExchange, readRecordExclusions } from './record-admission.js'; +import { getClaudeDir } from './paths.js'; import { query } from '@anthropic-ai/claude-agent-sdk'; import { SUMMARIZER_CONTEXT_MARKER } from './constants.js'; import { VERSION } from './version.js'; @@ -296,6 +297,25 @@ function extractSummary(text) { // Fallback if no tags found return text.trim(); } +function readClaudeSummaryAuthentication() { + let settings; + try { + settings = JSON.parse(fs.readFileSync(path.join(getClaudeDir(), 'settings.json'), 'utf8')); + } + catch (error) { + if (error.code === 'ENOENT') + return {}; + // Parser and filesystem errors can contain private setting values or paths. + throw new Error('Cannot read Claude summarizer authentication settings'); + } + const apiKeyHelper = settings?.apiKeyHelper; + const baseUrl = settings?.env?.ANTHROPIC_BASE_URL; + if ((apiKeyHelper !== undefined && typeof apiKeyHelper !== 'string') || + (baseUrl !== undefined && typeof baseUrl !== 'string')) { + throw new Error('Cannot read Claude summarizer authentication settings'); + } + return { apiKeyHelper, baseUrl }; +} /** * Build the options object passed to the Claude Agent SDK's query() for a * summarization call. @@ -310,10 +330,16 @@ function extractSummary(text) { */ export function buildSummarizerQueryOptions(args) { const { model, sessionId, cwd } = args; + const authentication = readClaudeSummaryAuthentication(); + const env = getApiEnv(); + if (!env.ANTHROPIC_BASE_URL && authentication.baseUrl) { + env.ANTHROPIC_BASE_URL = authentication.baseUrl; + } return { model, max_tokens: 4096, - env: getApiEnv(), + env, + ...(authentication.apiKeyHelper ? { settings: { apiKeyHelper: authentication.apiKeyHelper } } : {}), resume: sessionId, persistSession: false, // Summarizers never call tools — disabling them stops a resumed live @@ -328,7 +354,7 @@ export function buildSummarizerQueryOptions(args) { // strictMcpConfig only blocks ~/.claude.json MCP servers; user settings // still load every enabled plugin (each with its own MCP server) plus the // user's Stop/Notification hooks (#136) into the subprocess. Summarizers - // need no plugins, hooks, or user settings at all. + // need no behavior settings. Only authentication is passed separately. settingSources: [], // Resume looks up the session under ~/.claude/projects//, so pass the recorded cwd when it still exists on disk. ...(cwd && fs.existsSync(cwd) ? { cwd } : {}), diff --git a/src/summarizer.ts b/src/summarizer.ts index 22732255..d8269d6d 100644 --- a/src/summarizer.ts +++ b/src/summarizer.ts @@ -3,6 +3,7 @@ import os from 'node:os'; import path from 'node:path'; import { admitExchange, readRecordExclusions } from './record-admission.js'; import { ConversationExchange } from './types.js'; +import { getClaudeDir } from './paths.js'; import { query } from '@anthropic-ai/claude-agent-sdk'; import { SUMMARIZER_CONTEXT_MARKER } from './constants.js'; import { VERSION } from './version.js'; @@ -334,6 +335,24 @@ function extractSummary(text: string): string { return text.trim(); } +function readClaudeSummaryAuthentication(): { apiKeyHelper?: string; baseUrl?: string } { + let settings: { apiKeyHelper?: unknown; env?: { ANTHROPIC_BASE_URL?: unknown } } | null; + try { + settings = JSON.parse(fs.readFileSync(path.join(getClaudeDir(), 'settings.json'), 'utf8')); + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return {}; + // Parser and filesystem errors can contain private setting values or paths. + throw new Error('Cannot read Claude summarizer authentication settings'); + } + const apiKeyHelper = settings?.apiKeyHelper; + const baseUrl = settings?.env?.ANTHROPIC_BASE_URL; + if ((apiKeyHelper !== undefined && typeof apiKeyHelper !== 'string') || + (baseUrl !== undefined && typeof baseUrl !== 'string')) { + throw new Error('Cannot read Claude summarizer authentication settings'); + } + return { apiKeyHelper, baseUrl }; +} + /** * Build the options object passed to the Claude Agent SDK's query() for a * summarization call. @@ -352,10 +371,16 @@ export function buildSummarizerQueryOptions(args: { cwd?: string; }): Record { const { model, sessionId, cwd } = args; + const authentication = readClaudeSummaryAuthentication(); + const env = getApiEnv()!; + if (!env.ANTHROPIC_BASE_URL && authentication.baseUrl) { + env.ANTHROPIC_BASE_URL = authentication.baseUrl; + } return { model, max_tokens: 4096, - env: getApiEnv(), + env, + ...(authentication.apiKeyHelper ? { settings: { apiKeyHelper: authentication.apiKeyHelper } } : {}), resume: sessionId, persistSession: false, // Summarizers never call tools — disabling them stops a resumed live @@ -370,7 +395,7 @@ export function buildSummarizerQueryOptions(args: { // strictMcpConfig only blocks ~/.claude.json MCP servers; user settings // still load every enabled plugin (each with its own MCP server) plus the // user's Stop/Notification hooks (#136) into the subprocess. Summarizers - // need no plugins, hooks, or user settings at all. + // need no behavior settings. Only authentication is passed separately. settingSources: [], // Resume looks up the session under ~/.claude/projects//, so pass the recorded cwd when it still exists on disk. ...(cwd && fs.existsSync(cwd) ? { cwd } : {}), diff --git a/test/summarizer-auth-isolation.test.ts b/test/summarizer-auth-isolation.test.ts new file mode 100644 index 00000000..b28a4d00 --- /dev/null +++ b/test/summarizer-auth-isolation.test.ts @@ -0,0 +1,70 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { buildSummarizerQueryOptions } from '../src/summarizer.js'; + +describe('isolated Claude summarizer authentication', () => { + let root: string; + + beforeEach(() => { + root = mkdtempSync(join(tmpdir(), 'episodic-auth-settings-')); + vi.stubEnv('CLAUDE_CONFIG_DIR', root); + vi.stubEnv('ANTHROPIC_BASE_URL', undefined); + vi.stubEnv('EPISODIC_MEMORY_API_BASE_URL', undefined); + }); + + afterEach(() => { + vi.unstubAllEnvs(); + rmSync(root, { recursive: true, force: true }); + }); + + it('keeps the user credential helper and endpoint without loading behavior settings', () => { + writeFileSync(join(root, 'settings.json'), JSON.stringify({ + apiKeyHelper: 'existing-credential-helper', + env: { ANTHROPIC_BASE_URL: 'https://fixture.invalid/api', UNRELATED: 'excluded' }, + hooks: { Stop: [{ hooks: [{ type: 'command', command: 'must-not-run' }] }] }, + enabledPlugins: { 'fixture@marketplace': true }, + permissions: { allow: ['Bash(*)'] }, + model: 'must-not-select', + })); + + const options = buildSummarizerQueryOptions({ model: 'haiku' }); + expect(options.settings).toEqual({ apiKeyHelper: 'existing-credential-helper' }); + expect(options.env).toMatchObject({ ANTHROPIC_BASE_URL: 'https://fixture.invalid/api' }); + expect((options.env as Record).UNRELATED).toBeUndefined(); + expect(options.settingSources).toEqual([]); + expect(options.tools).toEqual([]); + expect(options.strictMcpConfig).toBe(true); + expect(options.persistSession).toBe(false); + expect(options.model).toBe('haiku'); + }); + + it('preserves explicit inherited and episodic endpoint overrides', () => { + writeFileSync(join(root, 'settings.json'), JSON.stringify({ + env: { ANTHROPIC_BASE_URL: 'https://settings.invalid' }, + })); + vi.stubEnv('ANTHROPIC_BASE_URL', 'https://inherited.invalid'); + expect(buildSummarizerQueryOptions({ model: 'haiku' }).env).toMatchObject({ + ANTHROPIC_BASE_URL: 'https://inherited.invalid', + }); + vi.stubEnv('EPISODIC_MEMORY_API_BASE_URL', 'https://explicit.invalid'); + expect(buildSummarizerQueryOptions({ model: 'haiku' }).env).toMatchObject({ + ANTHROPIC_BASE_URL: 'https://explicit.invalid', + }); + }); + + it('leaves native environment and OAuth authentication available when settings are absent', () => { + vi.stubEnv('ANTHROPIC_API_KEY', 'synthetic-fixture-value'); + const options = buildSummarizerQueryOptions({ model: 'haiku' }); + expect(options.settings).toBeUndefined(); + expect(options.env).toMatchObject({ ANTHROPIC_API_KEY: 'synthetic-fixture-value' }); + expect(options.settingSources).toEqual([]); + }); + + it('refuses malformed authentication settings without exposing their contents', () => { + writeFileSync(join(root, 'settings.json'), '{"apiKeyHelper":"PRIVATE_FIXTURE_VALUE",'); + expect(() => buildSummarizerQueryOptions({ model: 'haiku' })) + .toThrow(/^Cannot read Claude summarizer authentication settings$/); + }); +}); From aa29032ef859c66eaf6bb3b5a95c5dc4a0880dae Mon Sep 17 00:00:00 2001 From: HengYang Date: Tue, 10 Nov 2026 02:28:17 +0800 Subject: [PATCH 33/33] test: clean isolated configuration after each suite --- test/setup-isolated-config-cleanup.test.ts | 61 ++++++++++++++++++++++ test/setup-isolated-config.ts | 7 ++- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 test/setup-isolated-config-cleanup.test.ts diff --git a/test/setup-isolated-config-cleanup.test.ts b/test/setup-isolated-config-cleanup.test.ts new file mode 100644 index 00000000..db0862c4 --- /dev/null +++ b/test/setup-isolated-config-cleanup.test.ts @@ -0,0 +1,61 @@ +import { afterEach, describe, expect, it } from 'vitest'; +import { spawnSync } from 'node:child_process'; +import { mkdtempSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '..'); +const fixtureRoots: string[] = []; + +afterEach(() => { + for (const root of fixtureRoots.splice(0)) { + rmSync(root, { recursive: true, force: true }); + } +}); + +describe('test configuration isolation cleanup', () => { + it.each([false, true])('removes its own state after a run (failure: %s)', (fail) => { + const root = mkdtempSync(join(tmpdir(), 'episodic-setup-cleanup-')); + fixtureRoots.push(root); + const temporary = join(root, 'temporary'); + const sibling = join(temporary, 'unrelated'); + mkdirSync(sibling, { recursive: true }); + writeFileSync(join(sibling, 'keep.txt'), 'preserved'); + + writeFileSync(join(root, 'vitest.config.mjs'), `export default ${JSON.stringify({ + test: { + include: ['fixture.test.mjs'], + setupFiles: [join(repoRoot, 'test/setup-isolated-config.ts')], + }, + })};`); + writeFileSync(join(root, 'fixture.test.mjs'), ` + import { it, expect } from ${JSON.stringify(join(repoRoot, 'node_modules/vitest/dist/index.js'))}; + import { mkdirSync, writeFileSync } from 'node:fs'; + import { join } from 'node:path'; + it('writes only isolated synthetic state', () => { + const config = process.env.EPISODIC_MEMORY_CONFIG_DIR; + expect(config.startsWith(${JSON.stringify(temporary)})).toBe(true); + mkdirSync(config, { recursive: true }); + writeFileSync(join(config, 'synthetic-state.txt'), 'fixture'); + expect(${fail}).toBe(false); + }); + `); + + const result = spawnSync(process.execPath, [ + join(repoRoot, 'node_modules/vitest/vitest.mjs'), 'run', + '--root', root, '--config', join(root, 'vitest.config.mjs'), + '--maxWorkers=1', '--minWorkers=1', + ], { + cwd: root, + env: { ...process.env, TMPDIR: temporary, TMP: temporary, TEMP: temporary }, + timeout: 15000, + encoding: 'utf-8', + }); + + expect(result.error).toBeUndefined(); + expect(result.status, result.stdout + result.stderr).toBe(fail ? 1 : 0); + expect(readdirSync(temporary).filter(name => name.startsWith('episodic-memory-vitest-'))).toEqual([]); + expect(readFileSync(join(sibling, 'keep.txt'), 'utf-8')).toBe('preserved'); + }); +}); diff --git a/test/setup-isolated-config.ts b/test/setup-isolated-config.ts index 2b298c07..8314b2ca 100644 --- a/test/setup-isolated-config.ts +++ b/test/setup-isolated-config.ts @@ -1,4 +1,5 @@ -import { mkdtempSync } from 'fs'; +import { afterAll } from 'vitest'; +import { mkdtempSync, rmSync } from 'fs'; import { tmpdir } from 'os'; import { join } from 'path'; @@ -10,6 +11,10 @@ import { join } from 'path'; */ const isolatedRoot = mkdtempSync(join(tmpdir(), 'episodic-memory-vitest-')); +afterAll(() => { + rmSync(isolatedRoot, { recursive: true, force: true }); +}); + process.env.EPISODIC_MEMORY_CONFIG_DIR = join(isolatedRoot, 'superpowers'); process.env.CLAUDE_CONFIG_DIR = join(isolatedRoot, 'claude'); process.env.CODEX_HOME = join(isolatedRoot, 'codex');