@fractary/codex-mcp 0.10.4 → 0.10.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +9518 -8303
- package/dist/cli.cjs.map +1 -1
- package/dist/index.cjs +9328 -6550
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -21
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/tsup/assets/cjs_shims.js","../../../node_modules/braces/lib/utils.js","../../../node_modules/braces/lib/stringify.js","../../../node_modules/is-number/index.js","../../../node_modules/to-regex-range/index.js","../../../node_modules/fill-range/index.js","../../../node_modules/braces/lib/compile.js","../../../node_modules/braces/lib/expand.js","../../../node_modules/braces/lib/constants.js","../../../node_modules/braces/lib/parse.js","../../../node_modules/braces/index.js","../../../node_modules/micromatch/node_modules/picomatch/lib/constants.js","../../../node_modules/micromatch/node_modules/picomatch/lib/utils.js","../../../node_modules/micromatch/node_modules/picomatch/lib/scan.js","../../../node_modules/micromatch/node_modules/picomatch/lib/parse.js","../../../node_modules/micromatch/node_modules/picomatch/lib/picomatch.js","../../../node_modules/micromatch/node_modules/picomatch/index.js","../../../node_modules/micromatch/index.js","../src/index.ts","../src/server.ts","../../../node_modules/zod/index.js","../../../node_modules/zod/v3/external.js","../../../node_modules/zod/v3/errors.js","../../../node_modules/zod/v3/locales/en.js","../../../node_modules/zod/v3/ZodError.js","../../../node_modules/zod/v3/helpers/util.js","../../../node_modules/zod/v3/helpers/parseUtil.js","../../../node_modules/zod/v3/types.js","../../../node_modules/zod/v3/helpers/errorUtil.js","../../../node_modules/js-yaml/dist/js-yaml.mjs","../../../sdk/js/src/core/patterns/matcher.ts","../../../sdk/js/src/sync/directional-patterns.ts","../../../sdk/js/src/errors/CodexError.ts","../../../sdk/js/src/errors/ConfigurationError.ts","../../../sdk/js/src/errors/ValidationError.ts","../../../sdk/js/src/references/validator.ts","../../../sdk/js/src/references/parser.ts","../../../sdk/js/src/references/resolver.ts","../../../sdk/js/src/types/built-in.ts","../../../sdk/js/src/types/registry.ts","../../../sdk/js/src/types/custom.ts","../../../sdk/js/src/schemas/metadata.ts","../../../sdk/js/src/schemas/config.ts","../../../sdk/js/src/core/metadata/parser.ts","../../../sdk/js/src/core/patterns/index.ts","../../../sdk/js/src/core/config/organization.ts","../../../sdk/js/src/core/config/defaults.ts","../../../sdk/js/src/core/config/loader.ts","../../../sdk/js/src/core/config/sync-presets.ts","../../../sdk/js/src/core/routing/evaluator.ts","../../../sdk/js/src/core/custom/destinations.ts","../../../sdk/js/src/storage/provider.ts","../../../sdk/js/src/storage/local.ts","../../../sdk/js/src/storage/github.ts","../../../sdk/js/src/storage/http.ts","../../../sdk/js/src/file-integration/source-resolver.ts","../../../sdk/js/src/storage/errors.ts","../../../sdk/js/src/storage/file-plugin.ts","../../../sdk/js/src/utils/execFileNoThrow.ts","../../../sdk/js/src/storage/s3-archive.ts","../../../sdk/js/src/storage/manager.ts","../../../sdk/js/src/cache/entry.ts","../../../sdk/js/src/cache/persistence.ts","../../../sdk/js/src/cache/manager.ts","../../../sdk/js/src/sync/types.ts","../../../sdk/js/src/sync/evaluator.ts","../../../sdk/js/src/sync/planner.ts","../../../sdk/js/src/sync/routing-scanner.ts","../../../sdk/js/src/sync/manager.ts","../../../sdk/js/src/permissions/types.ts","../../../sdk/js/src/permissions/evaluator.ts","../../../sdk/js/src/permissions/manager.ts","../../../sdk/js/src/migration/detector.ts","../../../sdk/js/src/migration/migrator.ts","../../../sdk/js/src/migration/references.ts","../../../sdk/js/src/core/env/index.ts","../../../sdk/js/src/core/yaml/index.ts","../../../sdk/js/src/core/utils/index.ts","../src/tools.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","'use strict';\n\nexports.isInteger = num => {\n if (typeof num === 'number') {\n return Number.isInteger(num);\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isInteger(Number(num));\n }\n return false;\n};\n\n/**\n * Find a node of the given type\n */\n\nexports.find = (node, type) => node.nodes.find(node => node.type === type);\n\n/**\n * Find a node of the given type\n */\n\nexports.exceedsLimit = (min, max, step = 1, limit) => {\n if (limit === false) return false;\n if (!exports.isInteger(min) || !exports.isInteger(max)) return false;\n return ((Number(max) - Number(min)) / Number(step)) >= limit;\n};\n\n/**\n * Escape the given node with '\\\\' before node.value\n */\n\nexports.escapeNode = (block, n = 0, type) => {\n const node = block.nodes[n];\n if (!node) return;\n\n if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {\n if (node.escaped !== true) {\n node.value = '\\\\' + node.value;\n node.escaped = true;\n }\n }\n};\n\n/**\n * Returns true if the given brace node should be enclosed in literal braces\n */\n\nexports.encloseBrace = node => {\n if (node.type !== 'brace') return false;\n if ((node.commas >> 0 + node.ranges >> 0) === 0) {\n node.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a brace node is invalid.\n */\n\nexports.isInvalidBrace = block => {\n if (block.type !== 'brace') return false;\n if (block.invalid === true || block.dollar) return true;\n if ((block.commas >> 0 + block.ranges >> 0) === 0) {\n block.invalid = true;\n return true;\n }\n if (block.open !== true || block.close !== true) {\n block.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a node is an open or close node\n */\n\nexports.isOpenOrClose = node => {\n if (node.type === 'open' || node.type === 'close') {\n return true;\n }\n return node.open === true || node.close === true;\n};\n\n/**\n * Reduce an array of text nodes.\n */\n\nexports.reduce = nodes => nodes.reduce((acc, node) => {\n if (node.type === 'text') acc.push(node.value);\n if (node.type === 'range') node.type = 'text';\n return acc;\n}, []);\n\n/**\n * Flatten an array\n */\n\nexports.flatten = (...args) => {\n const result = [];\n\n const flat = arr => {\n for (let i = 0; i < arr.length; i++) {\n const ele = arr[i];\n\n if (Array.isArray(ele)) {\n flat(ele);\n continue;\n }\n\n if (ele !== undefined) {\n result.push(ele);\n }\n }\n return result;\n };\n\n flat(args);\n return result;\n};\n","'use strict';\n\nconst utils = require('./utils');\n\nmodule.exports = (ast, options = {}) => {\n const stringify = (node, parent = {}) => {\n const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);\n const invalidNode = node.invalid === true && options.escapeInvalid === true;\n let output = '';\n\n if (node.value) {\n if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) {\n return '\\\\' + node.value;\n }\n return node.value;\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes) {\n for (const child of node.nodes) {\n output += stringify(child);\n }\n }\n return output;\n };\n\n return stringify(ast);\n};\n\n","/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function(num) {\n if (typeof num === 'number') {\n return num - num === 0;\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);\n }\n return false;\n};\n","/*!\n * to-regex-range <https://github.com/micromatch/to-regex-range>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst isNumber = require('is-number');\n\nconst toRegexRange = (min, max, options) => {\n if (isNumber(min) === false) {\n throw new TypeError('toRegexRange: expected the first argument to be a number');\n }\n\n if (max === void 0 || min === max) {\n return String(min);\n }\n\n if (isNumber(max) === false) {\n throw new TypeError('toRegexRange: expected the second argument to be a number.');\n }\n\n let opts = { relaxZeros: true, ...options };\n if (typeof opts.strictZeros === 'boolean') {\n opts.relaxZeros = opts.strictZeros === false;\n }\n\n let relax = String(opts.relaxZeros);\n let shorthand = String(opts.shorthand);\n let capture = String(opts.capture);\n let wrap = String(opts.wrap);\n let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap;\n\n if (toRegexRange.cache.hasOwnProperty(cacheKey)) {\n return toRegexRange.cache[cacheKey].result;\n }\n\n let a = Math.min(min, max);\n let b = Math.max(min, max);\n\n if (Math.abs(a - b) === 1) {\n let result = min + '|' + max;\n if (opts.capture) {\n return `(${result})`;\n }\n if (opts.wrap === false) {\n return result;\n }\n return `(?:${result})`;\n }\n\n let isPadded = hasPadding(min) || hasPadding(max);\n let state = { min, max, a, b };\n let positives = [];\n let negatives = [];\n\n if (isPadded) {\n state.isPadded = isPadded;\n state.maxLen = String(state.max).length;\n }\n\n if (a < 0) {\n let newMin = b < 0 ? Math.abs(b) : 1;\n negatives = splitToPatterns(newMin, Math.abs(a), state, opts);\n a = state.a = 0;\n }\n\n if (b >= 0) {\n positives = splitToPatterns(a, b, state, opts);\n }\n\n state.negatives = negatives;\n state.positives = positives;\n state.result = collatePatterns(negatives, positives, opts);\n\n if (opts.capture === true) {\n state.result = `(${state.result})`;\n } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) {\n state.result = `(?:${state.result})`;\n }\n\n toRegexRange.cache[cacheKey] = state;\n return state.result;\n};\n\nfunction collatePatterns(neg, pos, options) {\n let onlyNegative = filterPatterns(neg, pos, '-', false, options) || [];\n let onlyPositive = filterPatterns(pos, neg, '', false, options) || [];\n let intersected = filterPatterns(neg, pos, '-?', true, options) || [];\n let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);\n return subpatterns.join('|');\n}\n\nfunction splitToRanges(min, max) {\n let nines = 1;\n let zeros = 1;\n\n let stop = countNines(min, nines);\n let stops = new Set([max]);\n\n while (min <= stop && stop <= max) {\n stops.add(stop);\n nines += 1;\n stop = countNines(min, nines);\n }\n\n stop = countZeros(max + 1, zeros) - 1;\n\n while (min < stop && stop <= max) {\n stops.add(stop);\n zeros += 1;\n stop = countZeros(max + 1, zeros) - 1;\n }\n\n stops = [...stops];\n stops.sort(compare);\n return stops;\n}\n\n/**\n * Convert a range to a regex pattern\n * @param {Number} `start`\n * @param {Number} `stop`\n * @return {String}\n */\n\nfunction rangeToPattern(start, stop, options) {\n if (start === stop) {\n return { pattern: start, count: [], digits: 0 };\n }\n\n let zipped = zip(start, stop);\n let digits = zipped.length;\n let pattern = '';\n let count = 0;\n\n for (let i = 0; i < digits; i++) {\n let [startDigit, stopDigit] = zipped[i];\n\n if (startDigit === stopDigit) {\n pattern += startDigit;\n\n } else if (startDigit !== '0' || stopDigit !== '9') {\n pattern += toCharacterClass(startDigit, stopDigit, options);\n\n } else {\n count++;\n }\n }\n\n if (count) {\n pattern += options.shorthand === true ? '\\\\d' : '[0-9]';\n }\n\n return { pattern, count: [count], digits };\n}\n\nfunction splitToPatterns(min, max, tok, options) {\n let ranges = splitToRanges(min, max);\n let tokens = [];\n let start = min;\n let prev;\n\n for (let i = 0; i < ranges.length; i++) {\n let max = ranges[i];\n let obj = rangeToPattern(String(start), String(max), options);\n let zeros = '';\n\n if (!tok.isPadded && prev && prev.pattern === obj.pattern) {\n if (prev.count.length > 1) {\n prev.count.pop();\n }\n\n prev.count.push(obj.count[0]);\n prev.string = prev.pattern + toQuantifier(prev.count);\n start = max + 1;\n continue;\n }\n\n if (tok.isPadded) {\n zeros = padZeros(max, tok, options);\n }\n\n obj.string = zeros + obj.pattern + toQuantifier(obj.count);\n tokens.push(obj);\n start = max + 1;\n prev = obj;\n }\n\n return tokens;\n}\n\nfunction filterPatterns(arr, comparison, prefix, intersection, options) {\n let result = [];\n\n for (let ele of arr) {\n let { string } = ele;\n\n // only push if _both_ are negative...\n if (!intersection && !contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n\n // or _both_ are positive\n if (intersection && contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n }\n return result;\n}\n\n/**\n * Zip strings\n */\n\nfunction zip(a, b) {\n let arr = [];\n for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]);\n return arr;\n}\n\nfunction compare(a, b) {\n return a > b ? 1 : b > a ? -1 : 0;\n}\n\nfunction contains(arr, key, val) {\n return arr.some(ele => ele[key] === val);\n}\n\nfunction countNines(min, len) {\n return Number(String(min).slice(0, -len) + '9'.repeat(len));\n}\n\nfunction countZeros(integer, zeros) {\n return integer - (integer % Math.pow(10, zeros));\n}\n\nfunction toQuantifier(digits) {\n let [start = 0, stop = ''] = digits;\n if (stop || start > 1) {\n return `{${start + (stop ? ',' + stop : '')}}`;\n }\n return '';\n}\n\nfunction toCharacterClass(a, b, options) {\n return `[${a}${(b - a === 1) ? '' : '-'}${b}]`;\n}\n\nfunction hasPadding(str) {\n return /^-?(0+)\\d/.test(str);\n}\n\nfunction padZeros(value, tok, options) {\n if (!tok.isPadded) {\n return value;\n }\n\n let diff = Math.abs(tok.maxLen - String(value).length);\n let relax = options.relaxZeros !== false;\n\n switch (diff) {\n case 0:\n return '';\n case 1:\n return relax ? '0?' : '0';\n case 2:\n return relax ? '0{0,2}' : '00';\n default: {\n return relax ? `0{0,${diff}}` : `0{${diff}}`;\n }\n }\n}\n\n/**\n * Cache\n */\n\ntoRegexRange.cache = {};\ntoRegexRange.clearCache = () => (toRegexRange.cache = {});\n\n/**\n * Expose `toRegexRange`\n */\n\nmodule.exports = toRegexRange;\n","/*!\n * fill-range <https://github.com/jonschlinkert/fill-range>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nconst util = require('util');\nconst toRegexRange = require('to-regex-range');\n\nconst isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\n\nconst transform = toNumber => {\n return value => toNumber === true ? Number(value) : String(value);\n};\n\nconst isValidValue = value => {\n return typeof value === 'number' || (typeof value === 'string' && value !== '');\n};\n\nconst isNumber = num => Number.isInteger(+num);\n\nconst zeros = input => {\n let value = `${input}`;\n let index = -1;\n if (value[0] === '-') value = value.slice(1);\n if (value === '0') return false;\n while (value[++index] === '0');\n return index > 0;\n};\n\nconst stringify = (start, end, options) => {\n if (typeof start === 'string' || typeof end === 'string') {\n return true;\n }\n return options.stringify === true;\n};\n\nconst pad = (input, maxLength, toNumber) => {\n if (maxLength > 0) {\n let dash = input[0] === '-' ? '-' : '';\n if (dash) input = input.slice(1);\n input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));\n }\n if (toNumber === false) {\n return String(input);\n }\n return input;\n};\n\nconst toMaxLen = (input, maxLength) => {\n let negative = input[0] === '-' ? '-' : '';\n if (negative) {\n input = input.slice(1);\n maxLength--;\n }\n while (input.length < maxLength) input = '0' + input;\n return negative ? ('-' + input) : input;\n};\n\nconst toSequence = (parts, options, maxLen) => {\n parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n\n let prefix = options.capture ? '' : '?:';\n let positives = '';\n let negatives = '';\n let result;\n\n if (parts.positives.length) {\n positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|');\n }\n\n if (parts.negatives.length) {\n negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`;\n }\n\n if (positives && negatives) {\n result = `${positives}|${negatives}`;\n } else {\n result = positives || negatives;\n }\n\n if (options.wrap) {\n return `(${prefix}${result})`;\n }\n\n return result;\n};\n\nconst toRange = (a, b, isNumbers, options) => {\n if (isNumbers) {\n return toRegexRange(a, b, { wrap: false, ...options });\n }\n\n let start = String.fromCharCode(a);\n if (a === b) return start;\n\n let stop = String.fromCharCode(b);\n return `[${start}-${stop}]`;\n};\n\nconst toRegex = (start, end, options) => {\n if (Array.isArray(start)) {\n let wrap = options.wrap === true;\n let prefix = options.capture ? '' : '?:';\n return wrap ? `(${prefix}${start.join('|')})` : start.join('|');\n }\n return toRegexRange(start, end, options);\n};\n\nconst rangeError = (...args) => {\n return new RangeError('Invalid range arguments: ' + util.inspect(...args));\n};\n\nconst invalidRange = (start, end, options) => {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n};\n\nconst invalidStep = (step, options) => {\n if (options.strictRanges === true) {\n throw new TypeError(`Expected step \"${step}\" to be a number`);\n }\n return [];\n};\n\nconst fillNumbers = (start, end, step = 1, options = {}) => {\n let a = Number(start);\n let b = Number(end);\n\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n }\n\n // fix negative zero\n if (a === 0) a = 0;\n if (b === 0) b = 0;\n\n let descending = a > b;\n let startString = String(start);\n let endString = String(end);\n let stepString = String(step);\n step = Math.max(Math.abs(step), 1);\n\n let padded = zeros(startString) || zeros(endString) || zeros(stepString);\n let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;\n let toNumber = padded === false && stringify(start, end, options) === false;\n let format = options.transform || transform(toNumber);\n\n if (options.toRegex && step === 1) {\n return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);\n }\n\n let parts = { negatives: [], positives: [] };\n let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n if (options.toRegex === true && step > 1) {\n push(a);\n } else {\n range.push(pad(format(a, index), maxLen, toNumber));\n }\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return step > 1\n ? toSequence(parts, options, maxLen)\n : toRegex(range, null, { wrap: false, ...options });\n }\n\n return range;\n};\n\nconst fillLetters = (start, end, step = 1, options = {}) => {\n if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {\n return invalidRange(start, end, options);\n }\n\n let format = options.transform || (val => String.fromCharCode(val));\n let a = `${start}`.charCodeAt(0);\n let b = `${end}`.charCodeAt(0);\n\n let descending = a > b;\n let min = Math.min(a, b);\n let max = Math.max(a, b);\n\n if (options.toRegex && step === 1) {\n return toRange(min, max, false, options);\n }\n\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n range.push(format(a, index));\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return toRegex(range, null, { wrap: false, options });\n }\n\n return range;\n};\n\nconst fill = (start, end, step, options = {}) => {\n if (end == null && isValidValue(start)) {\n return [start];\n }\n\n if (!isValidValue(start) || !isValidValue(end)) {\n return invalidRange(start, end, options);\n }\n\n if (typeof step === 'function') {\n return fill(start, end, 1, { transform: step });\n }\n\n if (isObject(step)) {\n return fill(start, end, 0, step);\n }\n\n let opts = { ...options };\n if (opts.capture === true) opts.wrap = true;\n step = step || opts.step || 1;\n\n if (!isNumber(step)) {\n if (step != null && !isObject(step)) return invalidStep(step, opts);\n return fill(start, end, 1, step);\n }\n\n if (isNumber(start) && isNumber(end)) {\n return fillNumbers(start, end, step, opts);\n }\n\n return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);\n};\n\nmodule.exports = fill;\n","'use strict';\n\nconst fill = require('fill-range');\nconst utils = require('./utils');\n\nconst compile = (ast, options = {}) => {\n const walk = (node, parent = {}) => {\n const invalidBlock = utils.isInvalidBrace(parent);\n const invalidNode = node.invalid === true && options.escapeInvalid === true;\n const invalid = invalidBlock === true || invalidNode === true;\n const prefix = options.escapeInvalid === true ? '\\\\' : '';\n let output = '';\n\n if (node.isOpen === true) {\n return prefix + node.value;\n }\n\n if (node.isClose === true) {\n console.log('node.isClose', prefix, node.value);\n return prefix + node.value;\n }\n\n if (node.type === 'open') {\n return invalid ? prefix + node.value : '(';\n }\n\n if (node.type === 'close') {\n return invalid ? prefix + node.value : ')';\n }\n\n if (node.type === 'comma') {\n return node.prev.type === 'comma' ? '' : invalid ? node.value : '|';\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes && node.ranges > 0) {\n const args = utils.reduce(node.nodes);\n const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true });\n\n if (range.length !== 0) {\n return args.length > 1 && range.length > 1 ? `(${range})` : range;\n }\n }\n\n if (node.nodes) {\n for (const child of node.nodes) {\n output += walk(child, node);\n }\n }\n\n return output;\n };\n\n return walk(ast);\n};\n\nmodule.exports = compile;\n","'use strict';\n\nconst fill = require('fill-range');\nconst stringify = require('./stringify');\nconst utils = require('./utils');\n\nconst append = (queue = '', stash = '', enclose = false) => {\n const result = [];\n\n queue = [].concat(queue);\n stash = [].concat(stash);\n\n if (!stash.length) return queue;\n if (!queue.length) {\n return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;\n }\n\n for (const item of queue) {\n if (Array.isArray(item)) {\n for (const value of item) {\n result.push(append(value, stash, enclose));\n }\n } else {\n for (let ele of stash) {\n if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;\n result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele);\n }\n }\n }\n return utils.flatten(result);\n};\n\nconst expand = (ast, options = {}) => {\n const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit;\n\n const walk = (node, parent = {}) => {\n node.queue = [];\n\n let p = parent;\n let q = parent.queue;\n\n while (p.type !== 'brace' && p.type !== 'root' && p.parent) {\n p = p.parent;\n q = p.queue;\n }\n\n if (node.invalid || node.dollar) {\n q.push(append(q.pop(), stringify(node, options)));\n return;\n }\n\n if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {\n q.push(append(q.pop(), ['{}']));\n return;\n }\n\n if (node.nodes && node.ranges > 0) {\n const args = utils.reduce(node.nodes);\n\n if (utils.exceedsLimit(...args, options.step, rangeLimit)) {\n throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');\n }\n\n let range = fill(...args, options);\n if (range.length === 0) {\n range = stringify(node, options);\n }\n\n q.push(append(q.pop(), range));\n node.nodes = [];\n return;\n }\n\n const enclose = utils.encloseBrace(node);\n let queue = node.queue;\n let block = node;\n\n while (block.type !== 'brace' && block.type !== 'root' && block.parent) {\n block = block.parent;\n queue = block.queue;\n }\n\n for (let i = 0; i < node.nodes.length; i++) {\n const child = node.nodes[i];\n\n if (child.type === 'comma' && node.type === 'brace') {\n if (i === 1) queue.push('');\n queue.push('');\n continue;\n }\n\n if (child.type === 'close') {\n q.push(append(q.pop(), queue, enclose));\n continue;\n }\n\n if (child.value && child.type !== 'open') {\n queue.push(append(queue.pop(), child.value));\n continue;\n }\n\n if (child.nodes) {\n walk(child, node);\n }\n }\n\n return queue;\n };\n\n return utils.flatten(walk(ast));\n};\n\nmodule.exports = expand;\n","'use strict';\n\nmodule.exports = {\n MAX_LENGTH: 10000,\n\n // Digits\n CHAR_0: '0', /* 0 */\n CHAR_9: '9', /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 'A', /* A */\n CHAR_LOWERCASE_A: 'a', /* a */\n CHAR_UPPERCASE_Z: 'Z', /* Z */\n CHAR_LOWERCASE_Z: 'z', /* z */\n\n CHAR_LEFT_PARENTHESES: '(', /* ( */\n CHAR_RIGHT_PARENTHESES: ')', /* ) */\n\n CHAR_ASTERISK: '*', /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: '&', /* & */\n CHAR_AT: '@', /* @ */\n CHAR_BACKSLASH: '\\\\', /* \\ */\n CHAR_BACKTICK: '`', /* ` */\n CHAR_CARRIAGE_RETURN: '\\r', /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */\n CHAR_COLON: ':', /* : */\n CHAR_COMMA: ',', /* , */\n CHAR_DOLLAR: '$', /* . */\n CHAR_DOT: '.', /* . */\n CHAR_DOUBLE_QUOTE: '\"', /* \" */\n CHAR_EQUAL: '=', /* = */\n CHAR_EXCLAMATION_MARK: '!', /* ! */\n CHAR_FORM_FEED: '\\f', /* \\f */\n CHAR_FORWARD_SLASH: '/', /* / */\n CHAR_HASH: '#', /* # */\n CHAR_HYPHEN_MINUS: '-', /* - */\n CHAR_LEFT_ANGLE_BRACKET: '<', /* < */\n CHAR_LEFT_CURLY_BRACE: '{', /* { */\n CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */\n CHAR_LINE_FEED: '\\n', /* \\n */\n CHAR_NO_BREAK_SPACE: '\\u00A0', /* \\u00A0 */\n CHAR_PERCENT: '%', /* % */\n CHAR_PLUS: '+', /* + */\n CHAR_QUESTION_MARK: '?', /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */\n CHAR_RIGHT_CURLY_BRACE: '}', /* } */\n CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */\n CHAR_SEMICOLON: ';', /* ; */\n CHAR_SINGLE_QUOTE: '\\'', /* ' */\n CHAR_SPACE: ' ', /* */\n CHAR_TAB: '\\t', /* \\t */\n CHAR_UNDERSCORE: '_', /* _ */\n CHAR_VERTICAL_LINE: '|', /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\\uFEFF' /* \\uFEFF */\n};\n","'use strict';\n\nconst stringify = require('./stringify');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n CHAR_BACKSLASH, /* \\ */\n CHAR_BACKTICK, /* ` */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_RIGHT_SQUARE_BRACKET, /* ] */\n CHAR_DOUBLE_QUOTE, /* \" */\n CHAR_SINGLE_QUOTE, /* ' */\n CHAR_NO_BREAK_SPACE,\n CHAR_ZERO_WIDTH_NOBREAK_SPACE\n} = require('./constants');\n\n/**\n * parse\n */\n\nconst parse = (input, options = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n const opts = options || {};\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n if (input.length > max) {\n throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);\n }\n\n const ast = { type: 'root', input, nodes: [] };\n const stack = [ast];\n let block = ast;\n let prev = ast;\n let brackets = 0;\n const length = input.length;\n let index = 0;\n let depth = 0;\n let value;\n\n /**\n * Helpers\n */\n\n const advance = () => input[index++];\n const push = node => {\n if (node.type === 'text' && prev.type === 'dot') {\n prev.type = 'text';\n }\n\n if (prev && prev.type === 'text' && node.type === 'text') {\n prev.value += node.value;\n return;\n }\n\n block.nodes.push(node);\n node.parent = block;\n node.prev = prev;\n prev = node;\n return node;\n };\n\n push({ type: 'bos' });\n\n while (index < length) {\n block = stack[stack.length - 1];\n value = advance();\n\n /**\n * Invalid chars\n */\n\n if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) {\n continue;\n }\n\n /**\n * Escaped chars\n */\n\n if (value === CHAR_BACKSLASH) {\n push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() });\n continue;\n }\n\n /**\n * Right square bracket (literal): ']'\n */\n\n if (value === CHAR_RIGHT_SQUARE_BRACKET) {\n push({ type: 'text', value: '\\\\' + value });\n continue;\n }\n\n /**\n * Left square bracket: '['\n */\n\n if (value === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n\n let next;\n\n while (index < length && (next = advance())) {\n value += next;\n\n if (next === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n continue;\n }\n\n if (next === CHAR_BACKSLASH) {\n value += advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n brackets--;\n\n if (brackets === 0) {\n break;\n }\n }\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === CHAR_LEFT_PARENTHESES) {\n block = push({ type: 'paren', nodes: [] });\n stack.push(block);\n push({ type: 'text', value });\n continue;\n }\n\n if (value === CHAR_RIGHT_PARENTHESES) {\n if (block.type !== 'paren') {\n push({ type: 'text', value });\n continue;\n }\n block = stack.pop();\n push({ type: 'text', value });\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Quotes: '|\"|`\n */\n\n if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {\n const open = value;\n let next;\n\n if (options.keepQuotes !== true) {\n value = '';\n }\n\n while (index < length && (next = advance())) {\n if (next === CHAR_BACKSLASH) {\n value += next + advance();\n continue;\n }\n\n if (next === open) {\n if (options.keepQuotes === true) value += next;\n break;\n }\n\n value += next;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Left curly brace: '{'\n */\n\n if (value === CHAR_LEFT_CURLY_BRACE) {\n depth++;\n\n const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;\n const brace = {\n type: 'brace',\n open: true,\n close: false,\n dollar,\n depth,\n commas: 0,\n ranges: 0,\n nodes: []\n };\n\n block = push(brace);\n stack.push(block);\n push({ type: 'open', value });\n continue;\n }\n\n /**\n * Right curly brace: '}'\n */\n\n if (value === CHAR_RIGHT_CURLY_BRACE) {\n if (block.type !== 'brace') {\n push({ type: 'text', value });\n continue;\n }\n\n const type = 'close';\n block = stack.pop();\n block.close = true;\n\n push({ type, value });\n depth--;\n\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Comma: ','\n */\n\n if (value === CHAR_COMMA && depth > 0) {\n if (block.ranges > 0) {\n block.ranges = 0;\n const open = block.nodes.shift();\n block.nodes = [open, { type: 'text', value: stringify(block) }];\n }\n\n push({ type: 'comma', value });\n block.commas++;\n continue;\n }\n\n /**\n * Dot: '.'\n */\n\n if (value === CHAR_DOT && depth > 0 && block.commas === 0) {\n const siblings = block.nodes;\n\n if (depth === 0 || siblings.length === 0) {\n push({ type: 'text', value });\n continue;\n }\n\n if (prev.type === 'dot') {\n block.range = [];\n prev.value += value;\n prev.type = 'range';\n\n if (block.nodes.length !== 3 && block.nodes.length !== 5) {\n block.invalid = true;\n block.ranges = 0;\n prev.type = 'text';\n continue;\n }\n\n block.ranges++;\n block.args = [];\n continue;\n }\n\n if (prev.type === 'range') {\n siblings.pop();\n\n const before = siblings[siblings.length - 1];\n before.value += prev.value + value;\n prev = before;\n block.ranges--;\n continue;\n }\n\n push({ type: 'dot', value });\n continue;\n }\n\n /**\n * Text\n */\n\n push({ type: 'text', value });\n }\n\n // Mark imbalanced braces and brackets as invalid\n do {\n block = stack.pop();\n\n if (block.type !== 'root') {\n block.nodes.forEach(node => {\n if (!node.nodes) {\n if (node.type === 'open') node.isOpen = true;\n if (node.type === 'close') node.isClose = true;\n if (!node.nodes) node.type = 'text';\n node.invalid = true;\n }\n });\n\n // get the location of the block on parent.nodes (block's siblings)\n const parent = stack[stack.length - 1];\n const index = parent.nodes.indexOf(block);\n // replace the (invalid) block with it's nodes\n parent.nodes.splice(index, 1, ...block.nodes);\n }\n } while (stack.length > 0);\n\n push({ type: 'eos' });\n return ast;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst stringify = require('./lib/stringify');\nconst compile = require('./lib/compile');\nconst expand = require('./lib/expand');\nconst parse = require('./lib/parse');\n\n/**\n * Expand the given pattern or create a regex-compatible string.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)']\n * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c']\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\nconst braces = (input, options = {}) => {\n let output = [];\n\n if (Array.isArray(input)) {\n for (const pattern of input) {\n const result = braces.create(pattern, options);\n if (Array.isArray(result)) {\n output.push(...result);\n } else {\n output.push(result);\n }\n }\n } else {\n output = [].concat(braces.create(input, options));\n }\n\n if (options && options.expand === true && options.nodupes === true) {\n output = [...new Set(output)];\n }\n return output;\n};\n\n/**\n * Parse the given `str` with the given `options`.\n *\n * ```js\n * // braces.parse(pattern, [, options]);\n * const ast = braces.parse('a/{b,c}/d');\n * console.log(ast);\n * ```\n * @param {String} pattern Brace pattern to parse\n * @param {Object} options\n * @return {Object} Returns an AST\n * @api public\n */\n\nbraces.parse = (input, options = {}) => parse(input, options);\n\n/**\n * Creates a braces string from an AST, or an AST node.\n *\n * ```js\n * const braces = require('braces');\n * let ast = braces.parse('foo/{a,b}/bar');\n * console.log(stringify(ast.nodes[2])); //=> '{a,b}'\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.stringify = (input, options = {}) => {\n if (typeof input === 'string') {\n return stringify(braces.parse(input, options), options);\n }\n return stringify(input, options);\n};\n\n/**\n * Compiles a brace pattern into a regex-compatible, optimized string.\n * This method is called by the main [braces](#braces) function by default.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.compile('a/{b,c}/d'));\n * //=> ['a/(b|c)/d']\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.compile = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n return compile(input, options);\n};\n\n/**\n * Expands a brace pattern into an array. This method is called by the\n * main [braces](#braces) function when `options.expand` is true. Before\n * using this method it's recommended that you read the [performance notes](#performance))\n * and advantages of using [.compile](#compile) instead.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.expand('a/{b,c}/d'));\n * //=> ['a/b/d', 'a/c/d'];\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.expand = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n\n let result = expand(input, options);\n\n // filter out empty strings if specified\n if (options.noempty === true) {\n result = result.filter(Boolean);\n }\n\n // filter out duplicates if specified\n if (options.nodupes === true) {\n result = [...new Set(result)];\n }\n\n return result;\n};\n\n/**\n * Processes a brace pattern and returns either an expanded array\n * (if `options.expand` is true), a highly optimized regex-compatible string.\n * This method is called by the main [braces](#braces) function.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))\n * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.create = (input, options = {}) => {\n if (input === '' || input.length < 3) {\n return [input];\n }\n\n return options.expand !== true\n ? braces.compile(input, options)\n : braces.expand(input, options);\n};\n\n/**\n * Expose \"braces\"\n */\n\nmodule.exports = braces;\n","'use strict';\n\nconst path = require('path');\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\n\nconst POSIX_CHARS = {\n DOT_LITERAL,\n PLUS_LITERAL,\n QMARK_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n QMARK,\n END_ANCHOR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n ...POSIX_CHARS,\n\n SLASH_LITERAL: `[${WIN_SLASH}]`,\n QMARK: WIN_NO_SLASH,\n STAR: `${WIN_NO_SLASH}*?`,\n DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n NO_DOT: `(?!${DOT_LITERAL})`,\n NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n END_ANCHOR: `(?:[${WIN_SLASH}]|$)`\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n POSIX_REGEX_SOURCE,\n\n // regular expressions\n REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n // Replace globs with equivalent patterns to reduce parsing time.\n REPLACEMENTS: {\n '***': '*',\n '**/**': '**',\n '**/**/**': '**'\n },\n\n // Digits\n CHAR_0: 48, /* 0 */\n CHAR_9: 57, /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 65, /* A */\n CHAR_LOWERCASE_A: 97, /* a */\n CHAR_UPPERCASE_Z: 90, /* Z */\n CHAR_LOWERCASE_Z: 122, /* z */\n\n CHAR_LEFT_PARENTHESES: 40, /* ( */\n CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n CHAR_ASTERISK: 42, /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: 38, /* & */\n CHAR_AT: 64, /* @ */\n CHAR_BACKWARD_SLASH: 92, /* \\ */\n CHAR_CARRIAGE_RETURN: 13, /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n CHAR_COLON: 58, /* : */\n CHAR_COMMA: 44, /* , */\n CHAR_DOT: 46, /* . */\n CHAR_DOUBLE_QUOTE: 34, /* \" */\n CHAR_EQUAL: 61, /* = */\n CHAR_EXCLAMATION_MARK: 33, /* ! */\n CHAR_FORM_FEED: 12, /* \\f */\n CHAR_FORWARD_SLASH: 47, /* / */\n CHAR_GRAVE_ACCENT: 96, /* ` */\n CHAR_HASH: 35, /* # */\n CHAR_HYPHEN_MINUS: 45, /* - */\n CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n CHAR_LEFT_CURLY_BRACE: 123, /* { */\n CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n CHAR_LINE_FEED: 10, /* \\n */\n CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n CHAR_PERCENT: 37, /* % */\n CHAR_PLUS: 43, /* + */\n CHAR_QUESTION_MARK: 63, /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n CHAR_SEMICOLON: 59, /* ; */\n CHAR_SINGLE_QUOTE: 39, /* ' */\n CHAR_SPACE: 32, /* */\n CHAR_TAB: 9, /* \\t */\n CHAR_UNDERSCORE: 95, /* _ */\n CHAR_VERTICAL_LINE: 124, /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n SEP: path.sep,\n\n /**\n * Create EXTGLOB_CHARS\n */\n\n extglobChars(chars) {\n return {\n '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n '?': { type: 'qmark', open: '(?:', close: ')?' },\n '+': { type: 'plus', open: '(?:', close: ')+' },\n '*': { type: 'star', open: '(?:', close: ')*' },\n '@': { type: 'at', open: '(?:', close: ')' }\n };\n },\n\n /**\n * Create GLOB_CHARS\n */\n\n globChars(win32) {\n return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n }\n};\n","'use strict';\n\nconst path = require('path');\nconst win32 = process.platform === 'win32';\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.supportsLookbehinds = () => {\n const segs = process.version.slice(1).split('.').map(Number);\n if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {\n return true;\n }\n return false;\n};\n\nexports.isWindows = options => {\n if (options && typeof options.windows === 'boolean') {\n return options.windows;\n }\n return win32 === true || path.sep === '\\\\';\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n","'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let negatedExtglob = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n if (code === CHAR_EXCLAMATION_MARK && index === start) {\n negatedExtglob = true;\n }\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated,\n negatedExtglob\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n","'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n POSIX_REGEX_SOURCE,\n REGEX_NON_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_BACKREF,\n REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n if (typeof options.expandRange === 'function') {\n return options.expandRange(...args, options);\n }\n\n args.sort();\n const value = `[${args.join('-')}]`;\n\n try {\n /* eslint-disable-next-line no-new */\n new RegExp(value);\n } catch (ex) {\n return args.map(v => utils.escapeRegex(v)).join('..');\n }\n\n return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n input = REPLACEMENTS[input] || input;\n\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n let len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n const tokens = [bos];\n\n const capture = opts.capture ? '' : '?:';\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const PLATFORM_CHARS = constants.globChars(win32);\n const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n const {\n DOT_LITERAL,\n PLUS_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n } = PLATFORM_CHARS;\n\n const globstar = opts => {\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const nodot = opts.dot ? '' : NO_DOT;\n const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n let star = opts.bash === true ? globstar(opts) : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n // minimatch options support\n if (typeof opts.noext === 'boolean') {\n opts.noextglob = opts.noext;\n }\n\n const state = {\n input,\n index: -1,\n start: 0,\n dot: opts.dot === true,\n consumed: '',\n output: '',\n prefix: '',\n backtrack: false,\n negated: false,\n brackets: 0,\n braces: 0,\n parens: 0,\n quotes: 0,\n globstar: false,\n tokens\n };\n\n input = utils.removePrefix(input, state);\n len = input.length;\n\n const extglobs = [];\n const braces = [];\n const stack = [];\n let prev = bos;\n let value;\n\n /**\n * Tokenizing helpers\n */\n\n const eos = () => state.index === len - 1;\n const peek = state.peek = (n = 1) => input[state.index + n];\n const advance = state.advance = () => input[++state.index] || '';\n const remaining = () => input.slice(state.index + 1);\n const consume = (value = '', num = 0) => {\n state.consumed += value;\n state.index += num;\n };\n\n const append = token => {\n state.output += token.output != null ? token.output : token.value;\n consume(token.value);\n };\n\n const negate = () => {\n let count = 1;\n\n while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n advance();\n state.start++;\n count++;\n }\n\n if (count % 2 === 0) {\n return false;\n }\n\n state.negated = true;\n state.start++;\n return true;\n };\n\n const increment = type => {\n state[type]++;\n stack.push(type);\n };\n\n const decrement = type => {\n state[type]--;\n stack.pop();\n };\n\n /**\n * Push tokens onto the tokens array. This helper speeds up\n * tokenizing by 1) helping us avoid backtracking as much as possible,\n * and 2) helping us avoid creating extra tokens when consecutive\n * characters are plain text. This improves performance and simplifies\n * lookbehinds.\n */\n\n const push = tok => {\n if (prev.type === 'globstar') {\n const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n state.output = state.output.slice(0, -prev.output.length);\n prev.type = 'star';\n prev.value = '*';\n prev.output = star;\n state.output += prev.output;\n }\n }\n\n if (extglobs.length && tok.type !== 'paren') {\n extglobs[extglobs.length - 1].inner += tok.value;\n }\n\n if (tok.value || tok.output) append(tok);\n if (prev && prev.type === 'text' && tok.type === 'text') {\n prev.value += tok.value;\n prev.output = (prev.output || '') + tok.value;\n return;\n }\n\n tok.prev = prev;\n tokens.push(tok);\n prev = tok;\n };\n\n const extglobOpen = (type, value) => {\n const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n token.prev = prev;\n token.parens = state.parens;\n token.output = state.output;\n const output = (opts.capture ? '(' : '') + token.open;\n\n increment('parens');\n push({ type, value, output: state.output ? '' : ONE_CHAR });\n push({ type: 'paren', extglob: true, value: advance(), output });\n extglobs.push(token);\n };\n\n const extglobClose = token => {\n let output = token.close + (opts.capture ? ')' : '');\n let rest;\n\n if (token.type === 'negate') {\n let extglobStar = star;\n\n if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n extglobStar = globstar(opts);\n }\n\n if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n output = token.close = `)$))${extglobStar}`;\n }\n\n if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n // In this case, we need to parse the string and use it in the output of the original pattern.\n // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n //\n // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n output = token.close = `)${expression})${extglobStar})`;\n }\n\n if (token.prev.type === 'bos') {\n state.negatedExtglob = true;\n }\n }\n\n push({ type: 'paren', extglob: true, value, output });\n decrement('parens');\n };\n\n /**\n * Fast paths\n */\n\n if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n let backslashes = false;\n\n let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n if (first === '\\\\') {\n backslashes = true;\n return m;\n }\n\n if (first === '?') {\n if (esc) {\n return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n }\n if (index === 0) {\n return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n }\n return QMARK.repeat(chars.length);\n }\n\n if (first === '.') {\n return DOT_LITERAL.repeat(chars.length);\n }\n\n if (first === '*') {\n if (esc) {\n return esc + first + (rest ? star : '');\n }\n return star;\n }\n return esc ? m : `\\\\${m}`;\n });\n\n if (backslashes === true) {\n if (opts.unescape === true) {\n output = output.replace(/\\\\/g, '');\n } else {\n output = output.replace(/\\\\+/g, m => {\n return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n });\n }\n }\n\n if (output === input && opts.contains === true) {\n state.output = input;\n return state;\n }\n\n state.output = utils.wrapOutput(output, state, options);\n return state;\n }\n\n /**\n * Tokenize input until we reach end-of-string\n */\n\n while (!eos()) {\n value = advance();\n\n if (value === '\\u0000') {\n continue;\n }\n\n /**\n * Escaped characters\n */\n\n if (value === '\\\\') {\n const next = peek();\n\n if (next === '/' && opts.bash !== true) {\n continue;\n }\n\n if (next === '.' || next === ';') {\n continue;\n }\n\n if (!next) {\n value += '\\\\';\n push({ type: 'text', value });\n continue;\n }\n\n // collapse slashes to reduce potential for exploits\n const match = /^\\\\+/.exec(remaining());\n let slashes = 0;\n\n if (match && match[0].length > 2) {\n slashes = match[0].length;\n state.index += slashes;\n if (slashes % 2 !== 0) {\n value += '\\\\';\n }\n }\n\n if (opts.unescape === true) {\n value = advance();\n } else {\n value += advance();\n }\n\n if (state.brackets === 0) {\n push({ type: 'text', value });\n continue;\n }\n }\n\n /**\n * If we're inside a regex character class, continue\n * until we reach the closing bracket.\n */\n\n if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n if (opts.posix !== false && value === ':') {\n const inner = prev.value.slice(1);\n if (inner.includes('[')) {\n prev.posix = true;\n\n if (inner.includes(':')) {\n const idx = prev.value.lastIndexOf('[');\n const pre = prev.value.slice(0, idx);\n const rest = prev.value.slice(idx + 2);\n const posix = POSIX_REGEX_SOURCE[rest];\n if (posix) {\n prev.value = pre + posix;\n state.backtrack = true;\n advance();\n\n if (!bos.output && tokens.indexOf(prev) === 1) {\n bos.output = ONE_CHAR;\n }\n continue;\n }\n }\n }\n }\n\n if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n value = `\\\\${value}`;\n }\n\n if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n value = `\\\\${value}`;\n }\n\n if (opts.posix === true && value === '!' && prev.value === '[') {\n value = '^';\n }\n\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * If we're inside a quoted string, continue\n * until we reach the closing double quote.\n */\n\n if (state.quotes === 1 && value !== '\"') {\n value = utils.escapeRegex(value);\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * Double quotes\n */\n\n if (value === '\"') {\n state.quotes = state.quotes === 1 ? 0 : 1;\n if (opts.keepQuotes === true) {\n push({ type: 'text', value });\n }\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === '(') {\n increment('parens');\n push({ type: 'paren', value });\n continue;\n }\n\n if (value === ')') {\n if (state.parens === 0 && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '('));\n }\n\n const extglob = extglobs[extglobs.length - 1];\n if (extglob && state.parens === extglob.parens + 1) {\n extglobClose(extglobs.pop());\n continue;\n }\n\n push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n decrement('parens');\n continue;\n }\n\n /**\n * Square brackets\n */\n\n if (value === '[') {\n if (opts.nobracket === true || !remaining().includes(']')) {\n if (opts.nobracket !== true && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('closing', ']'));\n }\n\n value = `\\\\${value}`;\n } else {\n increment('brackets');\n }\n\n push({ type: 'bracket', value });\n continue;\n }\n\n if (value === ']') {\n if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n if (state.brackets === 0) {\n if (opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '['));\n }\n\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n decrement('brackets');\n\n const prevValue = prev.value.slice(1);\n if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n value = `/${value}`;\n }\n\n prev.value += value;\n append({ value });\n\n // when literal brackets are explicitly disabled\n // assume we should match with a regex character class\n if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n continue;\n }\n\n const escaped = utils.escapeRegex(prev.value);\n state.output = state.output.slice(0, -prev.value.length);\n\n // when literal brackets are explicitly enabled\n // assume we should escape the brackets to match literal characters\n if (opts.literalBrackets === true) {\n state.output += escaped;\n prev.value = escaped;\n continue;\n }\n\n // when the user specifies nothing, try to match both\n prev.value = `(${capture}${escaped}|${prev.value})`;\n state.output += prev.value;\n continue;\n }\n\n /**\n * Braces\n */\n\n if (value === '{' && opts.nobrace !== true) {\n increment('braces');\n\n const open = {\n type: 'brace',\n value,\n output: '(',\n outputIndex: state.output.length,\n tokensIndex: state.tokens.length\n };\n\n braces.push(open);\n push(open);\n continue;\n }\n\n if (value === '}') {\n const brace = braces[braces.length - 1];\n\n if (opts.nobrace === true || !brace) {\n push({ type: 'text', value, output: value });\n continue;\n }\n\n let output = ')';\n\n if (brace.dots === true) {\n const arr = tokens.slice();\n const range = [];\n\n for (let i = arr.length - 1; i >= 0; i--) {\n tokens.pop();\n if (arr[i].type === 'brace') {\n break;\n }\n if (arr[i].type !== 'dots') {\n range.unshift(arr[i].value);\n }\n }\n\n output = expandRange(range, opts);\n state.backtrack = true;\n }\n\n if (brace.comma !== true && brace.dots !== true) {\n const out = state.output.slice(0, brace.outputIndex);\n const toks = state.tokens.slice(brace.tokensIndex);\n brace.value = brace.output = '\\\\{';\n value = output = '\\\\}';\n state.output = out;\n for (const t of toks) {\n state.output += (t.output || t.value);\n }\n }\n\n push({ type: 'brace', value, output });\n decrement('braces');\n braces.pop();\n continue;\n }\n\n /**\n * Pipes\n */\n\n if (value === '|') {\n if (extglobs.length > 0) {\n extglobs[extglobs.length - 1].conditions++;\n }\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Commas\n */\n\n if (value === ',') {\n let output = value;\n\n const brace = braces[braces.length - 1];\n if (brace && stack[stack.length - 1] === 'braces') {\n brace.comma = true;\n output = '|';\n }\n\n push({ type: 'comma', value, output });\n continue;\n }\n\n /**\n * Slashes\n */\n\n if (value === '/') {\n // if the beginning of the glob is \"./\", advance the start\n // to the current index, and don't add the \"./\" characters\n // to the state. This greatly simplifies lookbehinds when\n // checking for BOS characters like \"!\" and \".\" (not \"./\")\n if (prev.type === 'dot' && state.index === state.start + 1) {\n state.start = state.index + 1;\n state.consumed = '';\n state.output = '';\n tokens.pop();\n prev = bos; // reset \"prev\" to the first token\n continue;\n }\n\n push({ type: 'slash', value, output: SLASH_LITERAL });\n continue;\n }\n\n /**\n * Dots\n */\n\n if (value === '.') {\n if (state.braces > 0 && prev.type === 'dot') {\n if (prev.value === '.') prev.output = DOT_LITERAL;\n const brace = braces[braces.length - 1];\n prev.type = 'dots';\n prev.output += value;\n prev.value += value;\n brace.dots = true;\n continue;\n }\n\n if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n push({ type: 'text', value, output: DOT_LITERAL });\n continue;\n }\n\n push({ type: 'dot', value, output: DOT_LITERAL });\n continue;\n }\n\n /**\n * Question marks\n */\n\n if (value === '?') {\n const isGroup = prev && prev.value === '(';\n if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('qmark', value);\n continue;\n }\n\n if (prev && prev.type === 'paren') {\n const next = peek();\n let output = value;\n\n if (next === '<' && !utils.supportsLookbehinds()) {\n throw new Error('Node.js v10 or higher is required for regex lookbehinds');\n }\n\n if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n output = `\\\\${value}`;\n }\n\n push({ type: 'text', value, output });\n continue;\n }\n\n if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n push({ type: 'qmark', value, output: QMARK_NO_DOT });\n continue;\n }\n\n push({ type: 'qmark', value, output: QMARK });\n continue;\n }\n\n /**\n * Exclamation\n */\n\n if (value === '!') {\n if (opts.noextglob !== true && peek() === '(') {\n if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n extglobOpen('negate', value);\n continue;\n }\n }\n\n if (opts.nonegate !== true && state.index === 0) {\n negate();\n continue;\n }\n }\n\n /**\n * Plus\n */\n\n if (value === '+') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('plus', value);\n continue;\n }\n\n if ((prev && prev.value === '(') || opts.regex === false) {\n push({ type: 'plus', value, output: PLUS_LITERAL });\n continue;\n }\n\n if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n push({ type: 'plus', value });\n continue;\n }\n\n push({ type: 'plus', value: PLUS_LITERAL });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value === '@') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n push({ type: 'at', extglob: true, value, output: '' });\n continue;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value !== '*') {\n if (value === '$' || value === '^') {\n value = `\\\\${value}`;\n }\n\n const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n if (match) {\n value += match[0];\n state.index += match[0].length;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Stars\n */\n\n if (prev && (prev.type === 'globstar' || prev.star === true)) {\n prev.type = 'star';\n prev.star = true;\n prev.value += value;\n prev.output = star;\n state.backtrack = true;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n let rest = remaining();\n if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n extglobOpen('star', value);\n continue;\n }\n\n if (prev.type === 'star') {\n if (opts.noglobstar === true) {\n consume(value);\n continue;\n }\n\n const prior = prev.prev;\n const before = prior.prev;\n const isStart = prior.type === 'slash' || prior.type === 'bos';\n const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n // strip consecutive `/**/`\n while (rest.slice(0, 3) === '/**') {\n const after = input[state.index + 4];\n if (after && after !== '/') {\n break;\n }\n rest = rest.slice(3);\n consume('/**', 3);\n }\n\n if (prior.type === 'bos' && eos()) {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = globstar(opts);\n state.output = prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n prev.value += value;\n state.globstar = true;\n state.output += prior.output + prev.output;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n const end = rest[1] !== void 0 ? '|$' : '';\n\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n prev.value += value;\n\n state.output += prior.output + prev.output;\n state.globstar = true;\n\n consume(value + advance());\n\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n if (prior.type === 'bos' && rest[0] === '/') {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n state.output = prev.output;\n state.globstar = true;\n consume(value + advance());\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n // remove single star from output\n state.output = state.output.slice(0, -prev.output.length);\n\n // reset previous token to globstar\n prev.type = 'globstar';\n prev.output = globstar(opts);\n prev.value += value;\n\n // reset output with globstar\n state.output += prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n const token = { type: 'star', value, output: star };\n\n if (opts.bash === true) {\n token.output = '.*?';\n if (prev.type === 'bos' || prev.type === 'slash') {\n token.output = nodot + token.output;\n }\n push(token);\n continue;\n }\n\n if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n token.output = value;\n push(token);\n continue;\n }\n\n if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n if (prev.type === 'dot') {\n state.output += NO_DOT_SLASH;\n prev.output += NO_DOT_SLASH;\n\n } else if (opts.dot === true) {\n state.output += NO_DOTS_SLASH;\n prev.output += NO_DOTS_SLASH;\n\n } else {\n state.output += nodot;\n prev.output += nodot;\n }\n\n if (peek() !== '*') {\n state.output += ONE_CHAR;\n prev.output += ONE_CHAR;\n }\n }\n\n push(token);\n }\n\n while (state.brackets > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n state.output = utils.escapeLast(state.output, '[');\n decrement('brackets');\n }\n\n while (state.parens > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n state.output = utils.escapeLast(state.output, '(');\n decrement('parens');\n }\n\n while (state.braces > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n state.output = utils.escapeLast(state.output, '{');\n decrement('braces');\n }\n\n if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n }\n\n // rebuild the output if we had to backtrack at any point\n if (state.backtrack === true) {\n state.output = '';\n\n for (const token of state.tokens) {\n state.output += token.output != null ? token.output : token.value;\n\n if (token.suffix) {\n state.output += token.suffix;\n }\n }\n }\n\n return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n const len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n input = REPLACEMENTS[input] || input;\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const {\n DOT_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOTS_SLASH,\n STAR,\n START_ANCHOR\n } = constants.globChars(win32);\n\n const nodot = opts.dot ? NO_DOTS : NO_DOT;\n const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n const capture = opts.capture ? '' : '?:';\n const state = { negated: false, prefix: '' };\n let star = opts.bash === true ? '.*?' : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n const globstar = opts => {\n if (opts.noglobstar === true) return star;\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const create = str => {\n switch (str) {\n case '*':\n return `${nodot}${ONE_CHAR}${star}`;\n\n case '.*':\n return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*.*':\n return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*/*':\n return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n case '**':\n return nodot + globstar(opts);\n\n case '**/*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n case '**/*.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '**/.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n default: {\n const match = /^(.*?)\\.(\\w+)$/.exec(str);\n if (!match) return;\n\n const source = create(match[1]);\n if (!source) return;\n\n return source + DOT_LITERAL + match[2];\n }\n }\n };\n\n const output = utils.removePrefix(input, state);\n let source = create(output);\n\n if (source && opts.strictSlashes !== true) {\n source += `${SLASH_LITERAL}?`;\n }\n\n return source;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst path = require('path');\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n if (Array.isArray(glob)) {\n const fns = glob.map(input => picomatch(input, options, returnState));\n const arrayMatcher = str => {\n for (const isMatch of fns) {\n const state = isMatch(str);\n if (state) return state;\n }\n return false;\n };\n return arrayMatcher;\n }\n\n const isState = isObject(glob) && glob.tokens && glob.input;\n\n if (glob === '' || (typeof glob !== 'string' && !isState)) {\n throw new TypeError('Expected pattern to be a non-empty string');\n }\n\n const opts = options || {};\n const posix = utils.isWindows(options);\n const regex = isState\n ? picomatch.compileRe(glob, options)\n : picomatch.makeRe(glob, options, false, true);\n\n const state = regex.state;\n delete regex.state;\n\n let isIgnored = () => false;\n if (opts.ignore) {\n const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n }\n\n const matcher = (input, returnObject = false) => {\n const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n if (typeof opts.onResult === 'function') {\n opts.onResult(result);\n }\n\n if (isMatch === false) {\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (isIgnored(input)) {\n if (typeof opts.onIgnore === 'function') {\n opts.onIgnore(result);\n }\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (typeof opts.onMatch === 'function') {\n opts.onMatch(result);\n }\n return returnObject ? result : true;\n };\n\n if (returnState) {\n matcher.state = state;\n }\n\n return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (input === '') {\n return { isMatch: false, output: '' };\n }\n\n const opts = options || {};\n const format = opts.format || (posix ? utils.toPosixSlashes : null);\n let match = input === glob;\n let output = (match && format) ? format(input) : input;\n\n if (match === false) {\n output = format ? format(input) : input;\n match = output === glob;\n }\n\n if (match === false || opts.capture === true) {\n if (opts.matchBase === true || opts.basename === true) {\n match = picomatch.matchBase(input, regex, options, posix);\n } else {\n match = regex.exec(output);\n }\n }\n\n return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {\n const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n return regex.test(path.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n * input: '!./foo/*.js',\n * start: 3,\n * base: 'foo',\n * glob: '*.js',\n * isBrace: false,\n * isBracket: false,\n * isGlob: true,\n * isExtglob: false,\n * isGlobstar: false,\n * negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n if (returnOutput === true) {\n return state.output;\n }\n\n const opts = options || {};\n const prepend = opts.contains ? '' : '^';\n const append = opts.contains ? '' : '$';\n\n let source = `${prepend}(?:${state.output})${append}`;\n if (state && state.negated === true) {\n source = `^(?!${source}).*$`;\n }\n\n const regex = picomatch.toRegex(source, options);\n if (returnState === true) {\n regex.state = state;\n }\n\n return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n if (!input || typeof input !== 'string') {\n throw new TypeError('Expected a non-empty string');\n }\n\n let parsed = { negated: false, fastpaths: true };\n\n if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n parsed.output = parse.fastpaths(input, options);\n }\n\n if (!parsed.output) {\n parsed = parse(input, options);\n }\n\n return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n try {\n const opts = options || {};\n return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n } catch (err) {\n if (options && options.debug === true) throw err;\n return /$^/;\n }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n","'use strict';\n\nmodule.exports = require('./lib/picomatch');\n","'use strict';\n\nconst util = require('util');\nconst braces = require('braces');\nconst picomatch = require('picomatch');\nconst utils = require('picomatch/lib/utils');\n\nconst isEmptyString = v => v === '' || v === './';\nconst hasBraces = v => {\n const index = v.indexOf('{');\n return index > -1 && v.indexOf('}', index) > -1;\n};\n\n/**\n * Returns an array of strings that match one or more glob patterns.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm(list, patterns[, options]);\n *\n * console.log(mm(['a.js', 'a.txt'], ['*.js']));\n * //=> [ 'a.js' ]\n * ```\n * @param {String|Array<string>} `list` List of strings to match.\n * @param {String|Array<string>} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options)\n * @return {Array} Returns an array of matches\n * @summary false\n * @api public\n */\n\nconst micromatch = (list, patterns, options) => {\n patterns = [].concat(patterns);\n list = [].concat(list);\n\n let omit = new Set();\n let keep = new Set();\n let items = new Set();\n let negatives = 0;\n\n let onResult = state => {\n items.add(state.output);\n if (options && options.onResult) {\n options.onResult(state);\n }\n };\n\n for (let i = 0; i < patterns.length; i++) {\n let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true);\n let negated = isMatch.state.negated || isMatch.state.negatedExtglob;\n if (negated) negatives++;\n\n for (let item of list) {\n let matched = isMatch(item, true);\n\n let match = negated ? !matched.isMatch : matched.isMatch;\n if (!match) continue;\n\n if (negated) {\n omit.add(matched.output);\n } else {\n omit.delete(matched.output);\n keep.add(matched.output);\n }\n }\n }\n\n let result = negatives === patterns.length ? [...items] : [...keep];\n let matches = result.filter(item => !omit.has(item));\n\n if (options && matches.length === 0) {\n if (options.failglob === true) {\n throw new Error(`No matches found for \"${patterns.join(', ')}\"`);\n }\n\n if (options.nonull === true || options.nullglob === true) {\n return options.unescape ? patterns.map(p => p.replace(/\\\\/g, '')) : patterns;\n }\n }\n\n return matches;\n};\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.match = micromatch;\n\n/**\n * Returns a matcher function from the given glob `pattern` and `options`.\n * The returned function takes a string to match as its only argument and returns\n * true if the string is a match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matcher(pattern[, options]);\n *\n * const isMatch = mm.matcher('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @param {String} `pattern` Glob pattern\n * @param {Object} `options`\n * @return {Function} Returns a matcher function.\n * @api public\n */\n\nmicromatch.matcher = (pattern, options) => picomatch(pattern, options);\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.isMatch(string, patterns[, options]);\n *\n * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(mm.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `[options]` See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.any = micromatch.isMatch;\n\n/**\n * Returns a list of strings that _**do not match any**_ of the given `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.not(list, patterns[, options]);\n *\n * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));\n * //=> ['b.b', 'c.c']\n * ```\n * @param {Array} `list` Array of strings to match.\n * @param {String|Array} `patterns` One or more glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of strings that **do not match** the given patterns.\n * @api public\n */\n\nmicromatch.not = (list, patterns, options = {}) => {\n patterns = [].concat(patterns).map(String);\n let result = new Set();\n let items = [];\n\n let onResult = state => {\n if (options.onResult) options.onResult(state);\n items.push(state.output);\n };\n\n let matches = new Set(micromatch(list, patterns, { ...options, onResult }));\n\n for (let item of items) {\n if (!matches.has(item)) {\n result.add(item);\n }\n }\n return [...result];\n};\n\n/**\n * Returns true if the given `string` contains the given pattern. Similar\n * to [.isMatch](#isMatch) but the pattern can match any part of the string.\n *\n * ```js\n * var mm = require('micromatch');\n * // mm.contains(string, pattern[, options]);\n *\n * console.log(mm.contains('aa/bb/cc', '*b'));\n * //=> true\n * console.log(mm.contains('aa/bb/cc', '*d'));\n * //=> false\n * ```\n * @param {String} `str` The string to match.\n * @param {String|Array} `patterns` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any of the patterns matches any part of `str`.\n * @api public\n */\n\nmicromatch.contains = (str, pattern, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n if (Array.isArray(pattern)) {\n return pattern.some(p => micromatch.contains(str, p, options));\n }\n\n if (typeof pattern === 'string') {\n if (isEmptyString(str) || isEmptyString(pattern)) {\n return false;\n }\n\n if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) {\n return true;\n }\n }\n\n return micromatch.isMatch(str, pattern, { ...options, contains: true });\n};\n\n/**\n * Filter the keys of the given object with the given `glob` pattern\n * and `options`. Does not attempt to match nested keys. If you need this feature,\n * use [glob-object][] instead.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matchKeys(object, patterns[, options]);\n *\n * const obj = { aa: 'a', ab: 'b', ac: 'c' };\n * console.log(mm.matchKeys(obj, '*b'));\n * //=> { ab: 'b' }\n * ```\n * @param {Object} `object` The object with keys to filter.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Object} Returns an object with only keys that match the given patterns.\n * @api public\n */\n\nmicromatch.matchKeys = (obj, patterns, options) => {\n if (!utils.isObject(obj)) {\n throw new TypeError('Expected the first argument to be an object');\n }\n let keys = micromatch(Object.keys(obj), patterns, options);\n let res = {};\n for (let key of keys) res[key] = obj[key];\n return res;\n};\n\n/**\n * Returns true if some of the strings in the given `list` match any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.some(list, patterns[, options]);\n *\n * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // true\n * console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any `patterns` matches any of the strings in `list`\n * @api public\n */\n\nmicromatch.some = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (items.some(item => isMatch(item))) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns true if every string in the given `list` matches\n * any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.every(list, patterns[, options]);\n *\n * console.log(mm.every('foo.js', ['foo.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // false\n * console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if all `patterns` matches all of the strings in `list`\n * @api public\n */\n\nmicromatch.every = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (!items.every(item => isMatch(item))) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns true if **all** of the given `patterns` match\n * the specified string.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.all(string, patterns[, options]);\n *\n * console.log(mm.all('foo.js', ['foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', '!foo.js']));\n * // false\n *\n * console.log(mm.all('foo.js', ['*.js', 'foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));\n * // true\n * ```\n * @param {String|Array} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.all = (str, patterns, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n return [].concat(patterns).every(p => picomatch(p, options)(str));\n};\n\n/**\n * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.capture(pattern, string[, options]);\n *\n * console.log(mm.capture('test/*.js', 'test/foo.js'));\n * //=> ['foo']\n * console.log(mm.capture('test/*.js', 'foo/bar.css'));\n * //=> null\n * ```\n * @param {String} `glob` Glob pattern to use for matching.\n * @param {String} `input` String to match\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array|null} Returns an array of captures if the input matches the glob pattern, otherwise `null`.\n * @api public\n */\n\nmicromatch.capture = (glob, input, options) => {\n let posix = utils.isWindows(options);\n let regex = picomatch.makeRe(String(glob), { ...options, capture: true });\n let match = regex.exec(posix ? utils.toPosixSlashes(input) : input);\n\n if (match) {\n return match.slice(1).map(v => v === void 0 ? '' : v);\n }\n};\n\n/**\n * Create a regular expression from the given glob `pattern`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.makeRe(pattern[, options]);\n *\n * console.log(mm.makeRe('*.js'));\n * //=> /^(?:(\\.[\\\\\\/])?(?!\\.)(?=.)[^\\/]*?\\.js)$/\n * ```\n * @param {String} `pattern` A glob pattern to convert to regex.\n * @param {Object} `options`\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\nmicromatch.makeRe = (...args) => picomatch.makeRe(...args);\n\n/**\n * Scan a glob pattern to separate the pattern into segments. Used\n * by the [split](#split) method.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.scan(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\nmicromatch.scan = (...args) => picomatch.scan(...args);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.parse(pattern[, options]);\n * ```\n * @param {String} `glob`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as regex source string.\n * @api public\n */\n\nmicromatch.parse = (patterns, options) => {\n let res = [];\n for (let pattern of [].concat(patterns || [])) {\n for (let str of braces(String(pattern), options)) {\n res.push(picomatch.parse(str, options));\n }\n }\n return res;\n};\n\n/**\n * Process the given brace `pattern`.\n *\n * ```js\n * const { braces } = require('micromatch');\n * console.log(braces('foo/{a,b,c}/bar'));\n * //=> [ 'foo/(a|b|c)/bar' ]\n *\n * console.log(braces('foo/{a,b,c}/bar', { expand: true }));\n * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ]\n * ```\n * @param {String} `pattern` String with brace pattern to process.\n * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options.\n * @return {Array}\n * @api public\n */\n\nmicromatch.braces = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n if ((options && options.nobrace === true) || !hasBraces(pattern)) {\n return [pattern];\n }\n return braces(pattern, options);\n};\n\n/**\n * Expand braces\n */\n\nmicromatch.braceExpand = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n return micromatch.braces(pattern, { ...options, expand: true });\n};\n\n/**\n * Expose micromatch\n */\n\n// exposed for tests\nmicromatch.hasBraces = hasBraces;\nmodule.exports = micromatch;\n","/**\n * @fractary/codex-mcp-server\n *\n * MCP server for Fractary Codex knowledge management.\n * Provides Model Context Protocol integration for AI agents and tools.\n */\n\n// Export server\nexport { McpServer, createMcpServer, type McpServerConfig } from './server.js'\n\n// Export tool registration bridge (for programmatic usage)\nexport {\n CODEX_TOOLS,\n handleToolCall,\n handleFetch,\n handleSearch,\n handleList,\n handleCacheClear,\n type ToolHandlerContext,\n} from './tools.js'\n\n// Export types\nexport type {\n McpTool,\n McpResource,\n McpResourceTemplate,\n McpCapabilities,\n McpServerInfo,\n FetchToolArgs,\n SearchToolArgs,\n ListToolArgs,\n CacheClearToolArgs,\n ToolResult,\n ResourceContent,\n SearchResult,\n} from './types.js'\n","/**\n * MCP Server implementation\n *\n * Implements a Model Context Protocol server for the Codex SDK.\n * This server can be used standalone or embedded in other applications.\n */\n\nimport type { CacheManager } from '@fractary/codex'\nimport type { StorageManager } from '@fractary/codex'\nimport { resolveReference } from '@fractary/codex'\nimport type {\n McpServerInfo,\n McpCapabilities,\n McpTool,\n McpResource,\n McpResourceTemplate,\n ResourceContent,\n ToolResult,\n} from './types.js'\nimport { CODEX_TOOLS, handleToolCall, type ToolHandlerContext } from './tools.js'\n\n/**\n * MCP Server configuration\n */\nexport interface McpServerConfig {\n /** Server name */\n name?: string\n /** Server version */\n version?: string\n /** Cache manager instance */\n cache: CacheManager\n /** Storage manager instance */\n storage: StorageManager\n}\n\n/**\n * MCP Server for Codex\n *\n * Provides a Model Context Protocol server implementation that exposes\n * Codex functionality as MCP tools and resources.\n */\nexport class McpServer {\n private config: Required<Omit<McpServerConfig, 'cache' | 'storage'>> & Pick<McpServerConfig, 'cache' | 'storage'>\n private toolContext: ToolHandlerContext\n\n constructor(config: McpServerConfig) {\n this.config = {\n name: config.name ?? 'codex',\n version: config.version ?? '1.0.0',\n cache: config.cache,\n storage: config.storage,\n }\n\n this.toolContext = {\n cache: config.cache,\n storage: config.storage,\n }\n }\n\n /**\n * Get server info\n */\n getServerInfo(): McpServerInfo {\n return {\n name: this.config.name,\n version: this.config.version,\n capabilities: this.getCapabilities(),\n }\n }\n\n /**\n * Get server capabilities\n */\n getCapabilities(): McpCapabilities {\n return {\n tools: {\n listChanged: false,\n },\n resources: {\n subscribe: false,\n listChanged: false,\n },\n }\n }\n\n /**\n * List available tools\n */\n listTools(): McpTool[] {\n return CODEX_TOOLS\n }\n\n /**\n * Call a tool\n */\n async callTool(name: string, args: Record<string, unknown>): Promise<ToolResult> {\n return handleToolCall(name, args, this.toolContext)\n }\n\n /**\n * List available resources\n */\n async listResources(): Promise<McpResource[]> {\n // List cached documents as resources\n const resources: McpResource[] = []\n\n // Get cache stats for info\n const stats = await this.config.cache.getStats()\n\n // Add a summary resource\n resources.push({\n uri: 'codex://cache/summary',\n name: 'Cache Summary',\n description: `${stats.entryCount} cached documents`,\n mimeType: 'text/plain',\n })\n\n return resources\n }\n\n /**\n * List resource templates\n */\n listResourceTemplates(): McpResourceTemplate[] {\n return [\n {\n uriTemplate: 'codex://{org}/{project}/{path}',\n name: 'Codex Document',\n description: 'Fetch a document from the Codex knowledge base',\n mimeType: 'text/markdown',\n },\n ]\n }\n\n /**\n * Read a resource\n */\n async readResource(uri: string): Promise<ResourceContent[]> {\n // Handle special URIs\n if (uri === 'codex://cache/summary') {\n const stats = await this.config.cache.getStats()\n return [\n {\n uri,\n mimeType: 'text/plain',\n text: `Cache Statistics:\n- Total entries: ${stats.entryCount}\n- Memory entries: ${stats.memoryEntries}\n- Fresh: ${stats.freshCount}\n- Stale: ${stats.staleCount}\n- Expired: ${stats.expiredCount}`,\n },\n ]\n }\n\n // Resolve and fetch the reference\n const ref = resolveReference(uri)\n if (!ref) {\n throw new Error(`Invalid codex URI: ${uri}`)\n }\n\n const result = await this.config.cache.get(ref)\n return [\n {\n uri,\n mimeType: result.contentType,\n text: result.content.toString('utf-8'),\n },\n ]\n }\n\n /**\n * Handle JSON-RPC request\n *\n * This method handles the low-level MCP protocol messages.\n */\n async handleRequest(method: string, params?: Record<string, unknown>): Promise<unknown> {\n switch (method) {\n case 'initialize':\n return {\n protocolVersion: '2024-11-05',\n serverInfo: this.getServerInfo(),\n capabilities: this.getCapabilities(),\n }\n\n case 'tools/list':\n return { tools: this.listTools() }\n\n case 'tools/call': {\n const { name, arguments: args } = params as { name: string; arguments: Record<string, unknown> }\n return await this.callTool(name, args)\n }\n\n case 'resources/list':\n return { resources: await this.listResources() }\n\n case 'resources/templates/list':\n return { resourceTemplates: this.listResourceTemplates() }\n\n case 'resources/read': {\n const { uri } = params as { uri: string }\n return { contents: await this.readResource(uri) }\n }\n\n case 'prompts/list':\n return { prompts: [] }\n\n default:\n throw new Error(`Unknown method: ${method}`)\n }\n }\n\n /**\n * Process a JSON-RPC message\n */\n async processMessage(message: string): Promise<string> {\n let id: unknown = null\n\n try {\n const request = JSON.parse(message)\n id = request.id\n const { method, params } = request\n\n const result = await this.handleRequest(method, params)\n\n return JSON.stringify({\n jsonrpc: '2.0',\n id,\n result,\n })\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n return JSON.stringify({\n jsonrpc: '2.0',\n id,\n error: {\n code: -32603,\n message: errorMessage,\n },\n })\n }\n }\n}\n\n/**\n * Create an MCP server\n */\nexport function createMcpServer(config: McpServerConfig): McpServer {\n return new McpServer(config)\n}\n","import * as z from \"./v3/external.js\";\nexport * from \"./v3/external.js\";\nexport { z };\nexport default z;\n","export * from \"./errors.js\";\nexport * from \"./helpers/parseUtil.js\";\nexport * from \"./helpers/typeAliases.js\";\nexport * from \"./helpers/util.js\";\nexport * from \"./types.js\";\nexport * from \"./ZodError.js\";\n","import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n overrideErrorMap = map;\n}\nexport function getErrorMap() {\n return overrideErrorMap;\n}\n","import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"bigint\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\nexport default errorMap;\n","import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n","export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n","import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nexport const INVALID = Object.freeze({\n status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n","import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[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])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n if (!header)\n return false;\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n","export var errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n // biome-ignore lint:\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n","\n/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '→') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\n// set a property of a literal object, while protecting against prototype pollution,\n// see https://github.com/nodeca/js-yaml/issues/164 for more details\nfunction setProperty(object, key, value) {\n // used for this specific key only because Object.defineProperty is slow\n if (key === '__proto__') {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: value\n });\n } else {\n object[key] = value;\n }\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n setProperty(destination, key, source[key]);\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n setProperty(_result, keyNode, valueNode);\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent\n atNewLine = false,\n hasContent = false,\n typeIndex,\n typeQuantity,\n typeList,\n type,\n flowIndent,\n blockIndent;\n\n if (state.listener !== null) {\n state.listener('open', state);\n }\n\n state.tag = null;\n state.anchor = null;\n state.kind = null;\n state.result = null;\n\n allowBlockStyles = allowBlockScalars = allowBlockCollections =\n CONTEXT_BLOCK_OUT === nodeContext ||\n CONTEXT_BLOCK_IN === nodeContext;\n\n if (allowToSeek) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"!<?> [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn’t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out ⇒ ns-plain-safe-out\n// c = flow-in ⇒ ns-plain-safe-in\n// c = block-key ⇒ ns-plain-safe-out\n// c = flow-key ⇒ ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - “:” - “#” )\n// | ( /* An ns-char preceding */ “#” )\n// | ( “:” /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “\"”\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | “%” | “@” | “`”)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// • No ending newline => unaffected; already using strip \"-\" chomping.\n// • Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines—\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | “-”\n // [39] ns-uri-char ::= “%” ns-hex-digit ns-hex-digit | ns-word-char | “#”\n // | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,”\n // | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]”\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n","import micromatch from 'micromatch'\n\n/**\n * Match a pattern against a value using glob syntax\n *\n * Based on SPEC-00003: Pattern Matching\n *\n * @param pattern - Glob pattern (e.g., \"api-*\", \"core-*\")\n * @param value - Value to test (e.g., \"api-gateway\")\n * @returns true if pattern matches value\n */\nexport function matchPattern(pattern: string, value: string): boolean {\n // Special case: exact match\n if (pattern === value) return true\n\n // Use micromatch for glob pattern matching\n return micromatch.isMatch(value, pattern)\n}\n\n/**\n * Check if value matches any pattern in array\n *\n * @param patterns - Array of glob patterns\n * @param value - Value to test\n * @returns true if value matches any pattern\n */\nexport function matchAnyPattern(\n patterns: string[],\n value: string\n): boolean {\n // Special case: [*] matches everything\n if (patterns.length === 1 && patterns[0] === '*') {\n return true\n }\n\n // Empty array matches nothing\n if (patterns.length === 0) {\n return false\n }\n\n // Check each pattern\n return patterns.some(pattern => matchPattern(pattern, value))\n}\n\n/**\n * Filter values that match any pattern\n *\n * @param patterns - Array of glob patterns\n * @param values - Array of values to filter\n * @returns Values that match any pattern\n */\nexport function filterByPatterns(\n patterns: string[],\n values: string[]\n): string[] {\n return values.filter(value => matchAnyPattern(patterns, value))\n}\n\n/**\n * Evaluate include/exclude rules\n *\n * @param options - Evaluation options\n * @returns true if value should be included\n */\nexport function evaluatePatterns(options: {\n value: string\n include?: string[]\n exclude?: string[]\n}): boolean {\n const { value, include = [], exclude = [] } = options\n\n // Check exclusions first (exclusions take priority)\n if (exclude.length > 0 && matchAnyPattern(exclude, value)) {\n return false\n }\n\n // Check inclusions\n if (include.length === 0) {\n // No include patterns = include by default\n return true\n }\n\n return matchAnyPattern(include, value)\n}\n","/**\n * Pattern matching for directional sync (to-codex / from-codex)\n *\n * Provides functions to evaluate if files should sync based on directional\n * sync configuration patterns.\n *\n * URI Format: codex://org/project/path\n * - org: Organization name (e.g., \"fractary\")\n * - project: Project name (e.g., \"etl.corthion.ai\")\n * - path: File path within project (e.g., \"docs/**\")\n *\n * Supported placeholders:\n * - {org}: Resolves to configured organization\n * - {project}: Resolves to target project name\n * - {codex_repo}: Resolves to codex repository name (e.g., \"codex.fractary.com\")\n */\n\nimport { matchPattern } from '../core/patterns/matcher.js'\n\n/** Codex URI prefix */\nconst CODEX_URI_PREFIX = 'codex://'\n\n/**\n * Check if a local file path matches to_codex patterns\n *\n * Used when syncing TO codex to determine which local files should be pushed.\n */\nexport function matchToCodexPattern(filePath: string, patterns: string[]): boolean {\n if (!patterns || patterns.length === 0) {\n return false\n }\n\n return patterns.some((pattern) => matchPattern(pattern, filePath))\n}\n\n/**\n * Options for from_codex pattern matching\n */\nexport interface FromCodexMatchOptions {\n /** Organization name for {org} placeholder */\n org?: string\n /** Codex repository name for {codex_repo} placeholder */\n codexRepo?: string\n}\n\n/**\n * Check if a codex file path matches from_codex patterns\n *\n * Used when syncing FROM codex to determine which codex files should be pulled.\n *\n * Supports four pattern formats:\n * 1. codex://org/project/path - Full codex URI (recommended)\n * 2. \"projects/project/path/pattern\" - Direct projects/ path match\n * 3. \"project-name/path/pattern\" - Legacy bare path format\n * 4. \"path/pattern\" - Legacy format, matches files from target project\n *\n * @param codexFilePath - File path in codex repo (e.g., \"projects/etl.corthion.ai/docs/file.md\")\n * @param patterns - Array of patterns to match against\n * @param targetProject - Target project name for implicit patterns\n * @param options - Optional org and codexRepo for placeholder expansion\n */\nexport function matchFromCodexPattern(\n codexFilePath: string,\n patterns: string[],\n targetProject: string,\n options?: FromCodexMatchOptions\n): boolean {\n if (!patterns || patterns.length === 0) {\n return false\n }\n\n return patterns.some((pattern) => {\n // Handle codex:// URI format (recommended)\n if (pattern.startsWith(CODEX_URI_PREFIX)) {\n return matchCodexUri(pattern, codexFilePath, targetProject, options)\n }\n\n // Legacy support: patterns starting with \"projects/\" match directly\n if (pattern.startsWith('projects/')) {\n return matchPattern(pattern, codexFilePath)\n }\n\n // Legacy support: bare path patterns\n // These patterns work with both flat and projects/ codex structures\n // Check if pattern includes a project prefix\n // Project names contain dots (e.g., \"etl.corthion.ai\")\n // Path segments don't (e.g., \"docs\")\n const projectSeparatorIndex = pattern.indexOf('/')\n\n if (projectSeparatorIndex === -1) {\n // No slash - pattern applies to target project only\n const fullPattern = `${targetProject}/${pattern}`\n return matchPattern(fullPattern, codexFilePath)\n }\n\n // Extract first segment before slash\n const firstSegment = pattern.substring(0, projectSeparatorIndex)\n\n // Check if first segment looks like a project name (contains dots)\n if (firstSegment.includes('.')) {\n // Has dots - likely a project name, match directly\n return matchPattern(pattern, codexFilePath)\n } else {\n // No dots - likely a path segment, prepend target project\n const fullPattern = `${targetProject}/${pattern}`\n return matchPattern(fullPattern, codexFilePath)\n }\n })\n}\n\n/**\n * Parse and match a codex:// URI pattern against a file path\n *\n * URI format: codex://org/project/path\n * Maps to codex repo structure: projects/{project}/path\n *\n * @param uriPattern - The codex:// URI pattern (e.g., \"codex://fractary/etl.corthion.ai/docs/**\")\n * @param codexFilePath - File path in codex repo (e.g., \"projects/etl.corthion.ai/docs/file.md\")\n * @param targetProject - Target project name for {project} placeholder\n * @param options - Optional org and codexRepo for placeholder expansion\n */\nfunction matchCodexUri(\n uriPattern: string,\n codexFilePath: string,\n targetProject: string,\n options?: FromCodexMatchOptions\n): boolean {\n // Parse: codex://org/project/path\n let withoutPrefix = uriPattern.slice(CODEX_URI_PREFIX.length)\n\n // Expand placeholders BEFORE parsing\n withoutPrefix = withoutPrefix\n .replace(/{org}/g, options?.org || '')\n .replace(/{project}/g, targetProject)\n .replace(/{codex_repo}/g, options?.codexRepo || '')\n\n const parts = withoutPrefix.split('/')\n\n // Need at least org and project\n if (parts.length < 2) {\n return false\n }\n\n // org is parts[0] - we don't use it for matching (org is for cache path namespacing)\n const project = parts[1]\n const pathPattern = parts.slice(2).join('/')\n\n // Skip if project is empty (e.g., placeholder wasn't expanded)\n if (!project) {\n return false\n }\n\n // Match against codex repo structure: projects/{project}/path\n const fullPattern = pathPattern\n ? `projects/${project}/${pathPattern}`\n : `projects/${project}/**`\n\n return matchPattern(fullPattern, codexFilePath)\n}\n\n/**\n * Extract project name from codex file path\n */\nexport function extractProjectFromCodexPath(codexFilePath: string): string | null {\n const firstSlashIndex = codexFilePath.indexOf('/')\n if (firstSlashIndex === -1) {\n return null\n }\n return codexFilePath.substring(0, firstSlashIndex)\n}\n\n/**\n * Get relative path within project from codex file path\n */\nexport function getRelativePath(codexFilePath: string): string | null {\n const firstSlashIndex = codexFilePath.indexOf('/')\n if (firstSlashIndex === -1) {\n return null\n }\n return codexFilePath.substring(firstSlashIndex + 1)\n}\n\n/**\n * Options for placeholder expansion\n */\nexport interface ExpandPlaceholderOptions {\n /** Organization name for {org} placeholder */\n org?: string\n /** Codex repository name for {codex_repo} placeholder */\n codexRepo?: string\n}\n\n/**\n * Expand placeholders in patterns\n *\n * Supported placeholders:\n * - {project}: Target project name\n * - {org}: Organization name\n * - {codex_repo}: Codex repository name\n *\n * @param patterns - Array of patterns to expand\n * @param targetProject - Target project name for {project} placeholder\n * @param options - Optional org and codexRepo for additional placeholders\n */\nexport function expandPlaceholders(\n patterns: string[] | undefined,\n targetProject: string,\n options?: ExpandPlaceholderOptions\n): string[] | undefined {\n if (!patterns) {\n return patterns\n }\n\n return patterns.map((pattern) => {\n let expanded = pattern.replace(/{project}/g, targetProject)\n\n if (options?.org) {\n expanded = expanded.replace(/{org}/g, options.org)\n }\n\n if (options?.codexRepo) {\n expanded = expanded.replace(/{codex_repo}/g, options.codexRepo)\n }\n\n return expanded\n })\n}\n","/**\n * Base error class for all Codex SDK errors\n */\nexport class CodexError extends Error {\n constructor(\n message: string,\n options?: ErrorOptions\n ) {\n super(message, options)\n this.name = 'CodexError'\n Object.setPrototypeOf(this, CodexError.prototype)\n }\n}\n","import { CodexError } from './CodexError.js'\n\n/**\n * Error thrown when configuration is missing or invalid\n */\nexport class ConfigurationError extends CodexError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ConfigurationError'\n Object.setPrototypeOf(this, ConfigurationError.prototype)\n }\n}\n","import { CodexError } from './CodexError.js'\n\n/**\n * Error thrown when data validation fails\n */\nexport class ValidationError extends CodexError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ValidationError'\n Object.setPrototypeOf(this, ValidationError.prototype)\n }\n}\n","/**\n * Path validation utilities for codex references\n *\n * Provides security validation to prevent directory traversal attacks\n * and other path-based security issues.\n */\n\nimport path from 'path'\n\n/**\n * Forbidden path patterns that could indicate security issues\n */\nconst FORBIDDEN_PATTERNS = [\n /^\\//, // Absolute paths\n /\\.\\./, // Parent directory traversal\n /^~/, // Home directory expansion\n /\\0/, // Null bytes\n]\n\n/**\n * Forbidden protocol prefixes\n */\nconst FORBIDDEN_PROTOCOLS = ['file:', 'http:', 'https:', 'ftp:', 'data:', 'javascript:']\n\n/**\n * Validate a path component to ensure it's safe\n *\n * @param filePath - The path to validate\n * @returns true if the path is safe, false otherwise\n */\nexport function validatePath(filePath: string): boolean {\n // Empty paths are invalid\n if (!filePath || filePath.trim() === '') {\n return false\n }\n\n // Check for forbidden patterns\n for (const pattern of FORBIDDEN_PATTERNS) {\n if (pattern.test(filePath)) {\n return false\n }\n }\n\n // Check for protocol prefixes\n const lowerPath = filePath.toLowerCase()\n for (const protocol of FORBIDDEN_PROTOCOLS) {\n if (lowerPath.startsWith(protocol)) {\n return false\n }\n }\n\n // Normalize and check for traversal after normalization\n const normalized = path.normalize(filePath)\n if (normalized.startsWith('..') || normalized.includes('/../') || normalized.includes('\\\\..\\\\')) {\n return false\n }\n\n return true\n}\n\n/**\n * Sanitize a path by removing dangerous components\n *\n * @param filePath - The path to sanitize\n * @returns The sanitized path\n */\nexport function sanitizePath(filePath: string): string {\n if (!filePath) {\n return ''\n }\n\n // Remove protocol prefixes\n let sanitized = filePath\n for (const protocol of FORBIDDEN_PROTOCOLS) {\n if (sanitized.toLowerCase().startsWith(protocol)) {\n sanitized = sanitized.slice(protocol.length)\n }\n }\n\n // Remove leading slashes (absolute paths)\n sanitized = sanitized.replace(/^\\/+/, '')\n\n // Remove home directory expansion\n sanitized = sanitized.replace(/^~\\//, '')\n\n // Normalize the path\n sanitized = path.normalize(sanitized)\n\n // Remove any remaining parent directory references\n sanitized = sanitized.replace(/\\.\\.\\//g, '').replace(/\\.\\./g, '')\n\n // Remove leading ./ if present\n sanitized = sanitized.replace(/^\\.\\//, '')\n\n // Remove null bytes\n sanitized = sanitized.replace(/\\0/g, '')\n\n return sanitized\n}\n\n/**\n * Validate an organization name\n *\n * @param org - The organization name to validate\n * @returns true if valid, false otherwise\n */\nexport function validateOrg(org: string): boolean {\n if (!org || org.trim() === '') {\n return false\n }\n\n // Org names should be alphanumeric with hyphens/underscores\n // GitHub org names: 1-39 chars, alphanumeric or hyphen, cannot start/end with hyphen\n const orgPattern = /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/\n return orgPattern.test(org) && org.length <= 39\n}\n\n/**\n * Validate a project name\n *\n * @param project - The project name to validate\n * @returns true if valid, false otherwise\n */\nexport function validateProject(project: string): boolean {\n if (!project || project.trim() === '') {\n return false\n }\n\n // Project names should be alphanumeric with hyphens/underscores/dots\n // GitHub repo names: 1-100 chars, alphanumeric, hyphen, underscore, or period\n const projectPattern = /^[a-zA-Z0-9._-]+$/\n return projectPattern.test(project) && project.length <= 100 && !project.includes('..')\n}\n\n/**\n * Validate a complete URI\n *\n * @param uri - The URI to validate\n * @returns true if the URI format is valid\n */\nexport function validateUri(uri: string): boolean {\n if (!uri || !uri.startsWith('codex://')) {\n return false\n }\n\n const pathPart = uri.slice('codex://'.length)\n const parts = pathPart.split('/')\n\n // Must have at least org/project\n if (parts.length < 2) {\n return false\n }\n\n const [org, project, ...rest] = parts\n\n if (!org || !validateOrg(org)) {\n return false\n }\n\n if (!project || !validateProject(project)) {\n return false\n }\n\n // If there's a path, validate it\n if (rest.length > 0) {\n const filePath = rest.join('/')\n if (!validatePath(filePath)) {\n return false\n }\n }\n\n return true\n}\n","/**\n * URI parsing for codex references\n *\n * Parses codex:// URIs into their component parts.\n * URI format: codex://org/project/path/to/file.md\n */\n\nimport { validateUri, validatePath, sanitizePath } from './validator.js'\n\n/**\n * Parsed reference components\n */\nexport interface ParsedReference {\n /** Original URI string */\n uri: string\n /** Organization name */\n org: string\n /** Project/repository name */\n project: string\n /** File path within project (may be empty) */\n path: string\n}\n\n/**\n * Parse options\n */\nexport interface ParseOptions {\n /** Whether to sanitize the path (default: true) */\n sanitize?: boolean\n /** Whether to validate strictly (default: true) */\n strict?: boolean\n}\n\n/**\n * The codex URI prefix\n */\nexport const CODEX_URI_PREFIX = 'codex://'\n\n/**\n * Legacy reference prefix (v2 format)\n */\nexport const LEGACY_REF_PREFIX = '@codex/'\n\n/**\n * Check if a string is a valid codex URI\n *\n * @param uri - The string to check\n * @returns true if it's a valid codex:// URI\n */\nexport function isValidUri(uri: string): boolean {\n return validateUri(uri)\n}\n\n/**\n * Check if a string is a legacy reference format\n *\n * @param ref - The string to check\n * @returns true if it's a legacy @codex/ reference\n */\nexport function isLegacyReference(ref: string): boolean {\n return ref.startsWith(LEGACY_REF_PREFIX)\n}\n\n/**\n * Convert a legacy reference to the new URI format\n *\n * @param ref - Legacy reference (e.g., @codex/project/path)\n * @param defaultOrg - Default organization to use\n * @returns The converted URI or null if invalid\n */\nexport function convertLegacyReference(ref: string, defaultOrg: string): string | null {\n if (!isLegacyReference(ref)) {\n return null\n }\n\n // Remove @codex/ prefix\n const pathPart = ref.slice(LEGACY_REF_PREFIX.length)\n const parts = pathPart.split('/')\n\n if (parts.length < 1 || !parts[0]) {\n return null\n }\n\n // Legacy format: @codex/project/path -> codex://org/project/path\n const project = parts[0]\n const filePath = parts.slice(1).join('/')\n\n if (filePath) {\n return `${CODEX_URI_PREFIX}${defaultOrg}/${project}/${filePath}`\n }\n return `${CODEX_URI_PREFIX}${defaultOrg}/${project}`\n}\n\n/**\n * Parse a codex URI into its components\n *\n * @param uri - The URI to parse (e.g., codex://org/project/path/to/file.md)\n * @param options - Parse options\n * @returns The parsed reference or null if invalid\n */\nexport function parseReference(uri: string, options: ParseOptions = {}): ParsedReference | null {\n const { sanitize = true, strict = true } = options\n\n // Must start with codex://\n if (!uri.startsWith(CODEX_URI_PREFIX)) {\n return null\n }\n\n // Strict validation\n if (strict && !validateUri(uri)) {\n return null\n }\n\n // Extract the path after codex://\n const pathPart = uri.slice(CODEX_URI_PREFIX.length)\n const parts = pathPart.split('/')\n\n // Must have at least org and project\n if (parts.length < 2) {\n return null\n }\n\n const org = parts[0]\n const project = parts[1]\n let filePath = parts.slice(2).join('/')\n\n // Validate org and project are not empty\n if (!org || !project) {\n return null\n }\n\n // Sanitize path if requested\n if (sanitize && filePath) {\n if (!validatePath(filePath)) {\n filePath = sanitizePath(filePath)\n }\n }\n\n return {\n uri,\n org,\n project,\n path: filePath,\n }\n}\n\n/**\n * Build a codex URI from components\n *\n * @param org - Organization name\n * @param project - Project name\n * @param path - Optional file path\n * @returns The constructed URI\n */\nexport function buildUri(org: string, project: string, path?: string): string {\n const base = `${CODEX_URI_PREFIX}${org}/${project}`\n if (path) {\n // Ensure path doesn't start with /\n const cleanPath = path.startsWith('/') ? path.slice(1) : path\n return `${base}/${cleanPath}`\n }\n return base\n}\n\n/**\n * Extract the file extension from a URI\n *\n * @param uri - The URI to extract from\n * @returns The extension (without dot) or empty string\n */\nexport function getExtension(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastDot = parsed.path.lastIndexOf('.')\n if (lastDot === -1 || lastDot === parsed.path.length - 1) {\n return ''\n }\n\n return parsed.path.slice(lastDot + 1).toLowerCase()\n}\n\n/**\n * Get the filename from a URI\n *\n * @param uri - The URI to extract from\n * @returns The filename or empty string\n */\nexport function getFilename(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastSlash = parsed.path.lastIndexOf('/')\n if (lastSlash === -1) {\n return parsed.path\n }\n\n return parsed.path.slice(lastSlash + 1)\n}\n\n/**\n * Get the directory path from a URI\n *\n * @param uri - The URI to extract from\n * @returns The directory path or empty string\n */\nexport function getDirectory(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastSlash = parsed.path.lastIndexOf('/')\n if (lastSlash === -1) {\n return ''\n }\n\n return parsed.path.slice(0, lastSlash)\n}\n","/**\n * URI resolution for codex references\n *\n * Resolves codex:// URIs to filesystem paths, determining whether\n * the reference points to the current project (local file) or\n * needs to be fetched from cache/remote.\n */\n\nimport path from 'path'\nimport { execSync } from 'child_process'\nimport { parseReference, type ParsedReference } from './parser.js'\nimport type { StorageProviderType } from '../storage/provider.js'\n\n/**\n * Resolved reference with filesystem paths\n */\nexport interface ResolvedReference extends ParsedReference {\n /** Path in the cache directory */\n cachePath: string\n /** Whether this URI refers to the current project */\n isCurrentProject: boolean\n /** Local filesystem path if current project */\n localPath?: string\n /** Source type for storage routing */\n sourceType?: StorageProviderType\n /** File plugin source name if sourceType is 'file-plugin' */\n filePluginSource?: string\n}\n\n/**\n * Options for resolving references\n */\nexport interface ResolveOptions {\n /** Base directory for cache (default: .fractary/codex/cache) */\n cacheDir?: string\n /** Override current organization detection */\n currentOrg?: string\n /** Override current project detection */\n currentProject?: string\n /** Current working directory (for git detection) */\n cwd?: string\n /** Unified config for file plugin source resolution */\n config?: any // Type will be UnifiedConfig, using 'any' to avoid circular dependency\n}\n\n/**\n * Default cache directory (v4.0 standard)\n */\nexport const DEFAULT_CACHE_DIR = '.fractary/codex/cache'\n\n/**\n * Detect the current project from git remote\n *\n * @param cwd - Current working directory\n * @returns Object with org and project, or nulls if not detected\n */\nexport function detectCurrentProject(cwd?: string): { org: string | null; project: string | null } {\n try {\n const options = cwd ? { cwd, encoding: 'utf-8' as const } : { encoding: 'utf-8' as const }\n const stdout = execSync('git remote get-url origin', options)\n const url = stdout.toString().trim()\n\n // Parse GitHub URLs (SSH and HTTPS formats)\n // git@github.com:org/repo.git\n // https://github.com/org/repo.git\n // https://github.com/org/repo\n const patterns = [\n /github\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n /gitlab\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n /bitbucket\\.org[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n ]\n\n for (const pattern of patterns) {\n const match = url.match(pattern)\n if (match && match[1] && match[2]) {\n return { org: match[1], project: match[2] }\n }\n }\n } catch {\n // Git not available or not in a git repo\n }\n\n return { org: null, project: null }\n}\n\n/**\n * Get the current organization and project\n *\n * Priority:\n * 1. Explicit options\n * 2. Environment variables (CODEX_CURRENT_ORG, CODEX_CURRENT_PROJECT)\n * 3. Git remote detection\n *\n * @param options - Resolve options\n * @returns Object with org and project\n */\nexport function getCurrentContext(options: ResolveOptions = {}): {\n org: string | null\n project: string | null\n} {\n // Priority 1: Explicit options\n if (options.currentOrg && options.currentProject) {\n return { org: options.currentOrg, project: options.currentProject }\n }\n\n // Priority 2: Environment variables\n const envOrg = process.env.CODEX_CURRENT_ORG\n const envProject = process.env.CODEX_CURRENT_PROJECT\n if (envOrg && envProject) {\n return { org: envOrg, project: envProject }\n }\n\n // Priority 3: Git detection\n return detectCurrentProject(options.cwd)\n}\n\n/**\n * Calculate the cache path for a URI\n *\n * @param org - Organization\n * @param project - Project\n * @param filePath - File path within project\n * @param cacheDir - Base cache directory\n * @returns The cache file path\n */\nexport function calculateCachePath(\n org: string,\n project: string,\n filePath: string,\n cacheDir: string\n): string {\n // Cache structure: {cacheDir}/{org}/{project}/{path}\n return path.join(cacheDir, org, project, filePath)\n}\n\n/**\n * Resolve a codex URI to filesystem paths\n *\n * @param uri - The URI to resolve\n * @param options - Resolution options\n * @returns The resolved reference or null if invalid\n */\nexport function resolveReference(\n uri: string,\n options: ResolveOptions = {}\n): ResolvedReference | null {\n const parsed = parseReference(uri)\n if (!parsed) {\n return null\n }\n\n const cacheDir = options.cacheDir || DEFAULT_CACHE_DIR\n const currentContext = getCurrentContext(options)\n\n // Calculate cache path\n const cachePath = parsed.path\n ? calculateCachePath(parsed.org, parsed.project, parsed.path, cacheDir)\n : path.join(cacheDir, parsed.org, parsed.project)\n\n // Check if this is the current project\n const isCurrentProject =\n currentContext.org === parsed.org && currentContext.project === parsed.project\n\n // Build the resolved reference\n const resolved: ResolvedReference = {\n ...parsed,\n cachePath,\n isCurrentProject,\n }\n\n // If it's the current project and there's a path, provide the local path\n if (isCurrentProject && parsed.path) {\n resolved.localPath = parsed.path\n\n // Check if this path belongs to a file plugin source\n if (options.config) {\n const fileSource = detectFilePluginSource(parsed.path, options.config)\n if (fileSource) {\n resolved.sourceType = 'file-plugin'\n resolved.filePluginSource = fileSource.name\n resolved.localPath = fileSource.fullPath\n }\n }\n }\n\n return resolved\n}\n\n/**\n * Detect if a path belongs to a file plugin source\n *\n * @param filePath - The file path from the URI\n * @param config - Unified configuration\n * @returns Matching file source info or null\n */\nfunction detectFilePluginSource(\n filePath: string,\n config: any\n): { name: string; fullPath: string } | null {\n if (!config?.file?.sources) {\n return null\n }\n\n // Check each file source to see if the path matches\n for (const [sourceName, source] of Object.entries(config.file.sources) as [string, any][]) {\n const basePath = source.local?.base_path\n if (!basePath) {\n continue\n }\n\n // Normalize paths for comparison\n const normalizedPath = filePath.replace(/^\\.\\//, '').replace(/^\\//, '')\n const normalizedBasePath = basePath.replace(/^\\.\\//, '').replace(/^\\//, '').replace(/\\/$/, '')\n\n // Check if path starts with source's base_path\n // Examples:\n // filePath: \"specs/SPEC-001.md\"\n // basePath: \".fractary/specs\"\n // normalizedPath: \"specs/SPEC-001.md\"\n // normalizedBasePath: \".fractary/specs\"\n //\n // Or if path is already prefixed:\n // filePath: \".fractary/specs/SPEC-001.md\"\n // normalizedPath: \".fractary/specs/SPEC-001.md\"\n //\n // We need to check two scenarios:\n // 1. Path already includes base_path: \".fractary/specs/SPEC-001.md\" starts with \".fractary/specs\"\n // 2. Path is relative to base_path: \"specs/SPEC-001.md\" and base_path is \".fractary/specs\"\n // In this case, we extract the source name from base_path and check if path starts with it\n\n if (normalizedPath.startsWith(normalizedBasePath)) {\n // Scenario 1: Path already includes full base_path\n return {\n name: sourceName,\n fullPath: path.join(basePath, normalizedPath.substring(normalizedBasePath.length).replace(/^\\//, '')),\n }\n }\n\n // Scenario 2: Extract source name from base_path (e.g., \"specs\" from \".fractary/specs\")\n const sourceNameInPath = normalizedBasePath.split('/').pop()\n if (sourceNameInPath && normalizedPath.startsWith(sourceNameInPath + '/')) {\n // Path starts with source name (e.g., \"specs/SPEC-001.md\")\n // Strip the source name prefix to avoid duplication\n const pathWithoutSource = normalizedPath.substring(sourceNameInPath.length + 1)\n return {\n name: sourceName,\n fullPath: path.join(basePath, pathWithoutSource),\n }\n }\n }\n\n return null\n}\n\n/**\n * Resolve multiple URIs at once\n *\n * @param uris - Array of URIs to resolve\n * @param options - Resolution options\n * @returns Array of resolved references (nulls filtered out)\n */\nexport function resolveReferences(\n uris: string[],\n options: ResolveOptions = {}\n): ResolvedReference[] {\n return uris.map((uri) => resolveReference(uri, options)).filter((r): r is ResolvedReference => r !== null)\n}\n\n/**\n * Check if a URI refers to the current project\n *\n * @param uri - The URI to check\n * @param options - Resolution options\n * @returns true if the URI refers to the current project\n */\nexport function isCurrentProjectUri(uri: string, options: ResolveOptions = {}): boolean {\n const resolved = resolveReference(uri, options)\n return resolved?.isCurrentProject ?? false\n}\n\n/**\n * Get the relative cache path for a URI (without the cache directory prefix)\n *\n * @param uri - The URI\n * @returns The relative path or null if invalid\n */\nexport function getRelativeCachePath(uri: string): string | null {\n const parsed = parseReference(uri)\n if (!parsed) {\n return null\n }\n\n if (parsed.path) {\n return path.join(parsed.org, parsed.project, parsed.path)\n }\n return path.join(parsed.org, parsed.project)\n}\n","/**\n * Built-in artifact types for the Codex SDK\n *\n * These types define common artifact categories with default TTLs,\n * archival policies, and pattern matching rules.\n */\n\n/**\n * Artifact type definition\n */\nexport interface ArtifactType {\n /** Unique type name */\n name: string\n /** Human-readable description */\n description: string\n /** Glob patterns to match files of this type */\n patterns: string[]\n /** Default TTL in seconds for cached content */\n defaultTtl: number\n /** Days after which to archive (null = never) */\n archiveAfterDays: number | null\n /** Where to archive (null = don't archive) */\n archiveStorage: 'local' | 'cloud' | 'drive' | null\n /** Patterns for sync operations (optional override) */\n syncPatterns?: string[]\n /** Patterns to exclude from sync */\n excludePatterns?: string[]\n /** Default permissions (optional) */\n permissions?: {\n include: string[]\n exclude: string[]\n }\n}\n\n/**\n * TTL constants in seconds\n */\nexport const TTL = {\n ONE_HOUR: 3600,\n ONE_DAY: 86400,\n ONE_WEEK: 604800,\n TWO_WEEKS: 1209600,\n ONE_MONTH: 2592000,\n ONE_YEAR: 31536000,\n} as const\n\n/**\n * Built-in artifact types\n *\n * These cover common use cases and serve as defaults.\n * Users can override or extend these via configuration.\n */\nexport const BUILT_IN_TYPES: Record<string, ArtifactType> = {\n docs: {\n name: 'docs',\n description: 'Documentation files',\n patterns: ['docs/**', 'README.md', 'CLAUDE.md', '*.md'],\n defaultTtl: TTL.ONE_WEEK,\n archiveAfterDays: 365,\n archiveStorage: 'cloud',\n },\n\n specs: {\n name: 'specs',\n description: 'Technical specifications',\n patterns: ['specs/**', 'SPEC-*.md', '**/specs/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: null, // Never auto-archive specs\n archiveStorage: null,\n },\n\n logs: {\n name: 'logs',\n description: 'Session and workflow logs',\n patterns: ['.fractary/**/logs/**', 'logs/**', '*.log'],\n defaultTtl: TTL.ONE_DAY,\n archiveAfterDays: 30,\n archiveStorage: 'cloud',\n },\n\n standards: {\n name: 'standards',\n description: 'Organization standards and guides',\n patterns: ['standards/**', 'guides/**', '.fractary/standards/**'],\n defaultTtl: TTL.ONE_MONTH,\n archiveAfterDays: null, // Never auto-archive standards\n archiveStorage: null,\n },\n\n templates: {\n name: 'templates',\n description: 'Reusable templates',\n patterns: ['templates/**', '.templates/**', '.fractary/templates/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: 180,\n archiveStorage: 'cloud',\n },\n\n state: {\n name: 'state',\n description: 'Workflow state files',\n patterns: ['.fractary/**/state.json', '.fractary/**/state/**', '**/state.json'],\n defaultTtl: TTL.ONE_HOUR,\n archiveAfterDays: 7,\n archiveStorage: 'local',\n },\n\n config: {\n name: 'config',\n description: 'Configuration files',\n patterns: [\n '.fractary/**/*.json',\n '*.config.js',\n '*.config.ts',\n 'tsconfig.json',\n 'package.json',\n ],\n defaultTtl: TTL.ONE_DAY,\n archiveAfterDays: null,\n archiveStorage: null,\n },\n\n systems: {\n name: 'systems',\n description: 'System definitions',\n patterns: ['.fractary/systems/**', 'systems/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: null,\n archiveStorage: null,\n },\n}\n\n/**\n * Default type to use when no pattern matches\n */\nexport const DEFAULT_TYPE: ArtifactType = {\n name: 'default',\n description: 'Default type for unmatched files',\n patterns: ['**/*'],\n defaultTtl: TTL.ONE_WEEK,\n archiveAfterDays: 90,\n archiveStorage: 'cloud',\n}\n\n/**\n * Get a built-in type by name\n *\n * @param name - Type name\n * @returns The type or undefined\n */\nexport function getBuiltInType(name: string): ArtifactType | undefined {\n return BUILT_IN_TYPES[name]\n}\n\n/**\n * Get all built-in type names\n *\n * @returns Array of type names\n */\nexport function getBuiltInTypeNames(): string[] {\n return Object.keys(BUILT_IN_TYPES)\n}\n\n/**\n * Check if a name is a built-in type\n *\n * @param name - Type name to check\n * @returns true if it's a built-in type\n */\nexport function isBuiltInType(name: string): boolean {\n return name in BUILT_IN_TYPES\n}\n","/**\n * Type registry for artifact types\n *\n * Manages both built-in and custom artifact types, providing\n * type detection, TTL lookup, and registration functionality.\n */\n\nimport micromatch from 'micromatch'\nimport {\n type ArtifactType,\n BUILT_IN_TYPES,\n DEFAULT_TYPE,\n isBuiltInType,\n} from './built-in.js'\n\n/**\n * Options for creating a TypeRegistry\n */\nexport interface TypeRegistryOptions {\n /** Whether to include built-in types (default: true) */\n includeBuiltIn?: boolean\n /** Custom types to register */\n customTypes?: Record<string, Partial<ArtifactType>>\n}\n\n/**\n * Type registry for managing artifact types\n */\nexport class TypeRegistry {\n private types: Map<string, ArtifactType> = new Map()\n private patternCache: Map<string, string> = new Map()\n\n constructor(options: TypeRegistryOptions = {}) {\n const { includeBuiltIn = true, customTypes = {} } = options\n\n // Load built-in types\n if (includeBuiltIn) {\n for (const [name, type] of Object.entries(BUILT_IN_TYPES)) {\n this.types.set(name, type)\n }\n }\n\n // Load custom types\n for (const [name, partialType] of Object.entries(customTypes)) {\n this.register({\n ...DEFAULT_TYPE,\n ...partialType,\n name,\n })\n }\n }\n\n /**\n * Get a type by name\n *\n * Custom types take precedence over built-in types with the same name.\n *\n * @param name - Type name\n * @returns The type or undefined\n */\n get(name: string): ArtifactType | undefined {\n return this.types.get(name)\n }\n\n /**\n * Register a custom type\n *\n * @param type - The type to register\n */\n register(type: ArtifactType): void {\n this.types.set(type.name, type)\n // Clear pattern cache when types change\n this.patternCache.clear()\n }\n\n /**\n * Unregister a type\n *\n * Note: Built-in types can be unregistered but this is not recommended.\n *\n * @param name - Type name to unregister\n * @returns true if the type was removed\n */\n unregister(name: string): boolean {\n const result = this.types.delete(name)\n if (result) {\n this.patternCache.clear()\n }\n return result\n }\n\n /**\n * Check if a type exists\n *\n * @param name - Type name\n * @returns true if the type exists\n */\n has(name: string): boolean {\n return this.types.has(name)\n }\n\n /**\n * List all registered types\n *\n * @returns Array of all types\n */\n list(): ArtifactType[] {\n return Array.from(this.types.values())\n }\n\n /**\n * List all type names\n *\n * @returns Array of type names\n */\n listNames(): string[] {\n return Array.from(this.types.keys())\n }\n\n /**\n * Detect the type of a file based on its path\n *\n * Types are checked in order of specificity (most specific patterns first).\n * Returns 'default' if no type matches.\n *\n * @param filePath - File path to check\n * @returns The detected type name\n */\n detectType(filePath: string): string {\n // Check cache first\n const cached = this.patternCache.get(filePath)\n if (cached) {\n return cached\n }\n\n // Normalize path separators\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n\n // Check each type's patterns\n // Sort by pattern specificity (longer patterns first)\n const sortedTypes = this.list().sort((a, b) => {\n const aMaxLen = Math.max(...a.patterns.map((p) => p.length))\n const bMaxLen = Math.max(...b.patterns.map((p) => p.length))\n return bMaxLen - aMaxLen\n })\n\n for (const type of sortedTypes) {\n if (type.name === 'default') continue\n\n for (const pattern of type.patterns) {\n if (micromatch.isMatch(normalizedPath, pattern)) {\n this.patternCache.set(filePath, type.name)\n return type.name\n }\n }\n }\n\n // No match, return default\n this.patternCache.set(filePath, 'default')\n return 'default'\n }\n\n /**\n * Get the TTL for a file based on its type\n *\n * @param filePath - File path\n * @param override - Optional TTL override\n * @returns TTL in seconds\n */\n getTtl(filePath: string, override?: number): number {\n if (override !== undefined) {\n return override\n }\n\n const typeName = this.detectType(filePath)\n const type = this.get(typeName) || DEFAULT_TYPE\n return type.defaultTtl\n }\n\n /**\n * Get archive configuration for a file\n *\n * @param filePath - File path\n * @returns Archive configuration or null if archiving is disabled\n */\n getArchiveConfig(filePath: string): {\n afterDays: number\n storage: 'local' | 'cloud' | 'drive'\n } | null {\n const typeName = this.detectType(filePath)\n const type = this.get(typeName) || DEFAULT_TYPE\n\n if (type.archiveAfterDays === null || type.archiveStorage === null) {\n return null\n }\n\n return {\n afterDays: type.archiveAfterDays,\n storage: type.archiveStorage,\n }\n }\n\n /**\n * Get all files that match a type's patterns\n *\n * @param typeName - Type name\n * @param files - Array of file paths to filter\n * @returns Filtered file paths\n */\n filterByType(typeName: string, files: string[]): string[] {\n const type = this.get(typeName)\n if (!type) {\n return []\n }\n\n return files.filter((file) => {\n const normalized = file.replace(/\\\\/g, '/')\n return type.patterns.some((pattern) => micromatch.isMatch(normalized, pattern))\n })\n }\n\n /**\n * Check if a type is a built-in type\n *\n * @param name - Type name\n * @returns true if it's a built-in type\n */\n isBuiltIn(name: string): boolean {\n return isBuiltInType(name)\n }\n\n /**\n * Get the number of registered types\n */\n get size(): number {\n return this.types.size\n }\n\n /**\n * Clear pattern cache\n *\n * Call this if you need to force re-detection of types.\n */\n clearCache(): void {\n this.patternCache.clear()\n }\n}\n\n/**\n * Create a default TypeRegistry with built-in types\n *\n * @returns A new TypeRegistry instance\n */\nexport function createDefaultRegistry(): TypeRegistry {\n return new TypeRegistry()\n}\n","/**\n * Custom type loading from configuration\n *\n * Loads user-defined artifact types from configuration files\n * and validates them against the type schema.\n */\n\nimport { z } from 'zod'\nimport type { ArtifactType } from './built-in.js'\nimport { DEFAULT_TYPE, TTL } from './built-in.js'\n\n/**\n * Schema for custom type definition in config\n */\nexport const CustomTypeSchema = z.object({\n description: z.string().optional(),\n patterns: z.array(z.string()).min(1),\n defaultTtl: z.number().positive().optional(),\n archiveAfterDays: z.number().positive().nullable().optional(),\n archiveStorage: z.enum(['local', 'cloud', 'drive']).nullable().optional(),\n syncPatterns: z.array(z.string()).optional(),\n excludePatterns: z.array(z.string()).optional(),\n permissions: z\n .object({\n include: z.array(z.string()),\n exclude: z.array(z.string()),\n })\n .optional(),\n})\n\nexport type CustomTypeConfig = z.infer<typeof CustomTypeSchema>\n\n/**\n * Schema for the types section of configuration\n */\nexport const TypesConfigSchema = z.object({\n custom: z.record(z.string(), CustomTypeSchema).optional(),\n})\n\nexport type TypesConfig = z.infer<typeof TypesConfigSchema>\n\n/**\n * Validation result for custom types\n */\nexport interface ValidationResult {\n valid: boolean\n errors: Array<{\n name: string\n field: string\n message: string\n }>\n}\n\n/**\n * Parse a TTL value from config (can be number or string like \"7d\", \"1w\")\n *\n * @param value - TTL value\n * @returns TTL in seconds\n */\nexport function parseTtl(value: string | number): number {\n if (typeof value === 'number') {\n return value\n }\n\n const match = value.match(/^(\\d+)(s|m|h|d|w)$/)\n if (!match || !match[1] || !match[2]) {\n return TTL.ONE_WEEK // Default fallback\n }\n\n const num = parseInt(match[1], 10)\n const unit = match[2]\n\n switch (unit) {\n case 's':\n return num\n case 'm':\n return num * 60\n case 'h':\n return num * 3600\n case 'd':\n return num * 86400\n case 'w':\n return num * 604800\n default:\n return TTL.ONE_WEEK\n }\n}\n\n/**\n * Validate custom types configuration\n *\n * @param config - Types configuration object\n * @returns Validation result\n */\nexport function validateCustomTypes(config: unknown): ValidationResult {\n const result: ValidationResult = {\n valid: true,\n errors: [],\n }\n\n if (!config || typeof config !== 'object') {\n return result // Empty config is valid\n }\n\n const typesConfig = config as Record<string, unknown>\n const customTypes = typesConfig.custom as Record<string, unknown> | undefined\n\n if (!customTypes) {\n return result\n }\n\n for (const [name, typeConfig] of Object.entries(customTypes)) {\n // Validate name\n if (!/^[a-z][a-z0-9_-]*$/.test(name)) {\n result.valid = false\n result.errors.push({\n name,\n field: 'name',\n message: 'Type name must start with a letter and contain only lowercase letters, numbers, hyphens, and underscores',\n })\n }\n\n // Validate config against schema\n const parseResult = CustomTypeSchema.safeParse(typeConfig)\n if (!parseResult.success) {\n result.valid = false\n for (const issue of parseResult.error.issues) {\n result.errors.push({\n name,\n field: issue.path.join('.'),\n message: issue.message,\n })\n }\n }\n }\n\n return result\n}\n\n/**\n * Load custom types from configuration\n *\n * @param config - Types configuration\n * @returns Map of type name to ArtifactType\n */\nexport function loadCustomTypes(config: TypesConfig): Map<string, ArtifactType> {\n const types = new Map<string, ArtifactType>()\n\n if (!config.custom) {\n return types\n }\n\n for (const [name, typeConfig] of Object.entries(config.custom)) {\n const type: ArtifactType = {\n name,\n description: typeConfig.description || `Custom type: ${name}`,\n patterns: typeConfig.patterns,\n defaultTtl: typeConfig.defaultTtl ?? DEFAULT_TYPE.defaultTtl,\n archiveAfterDays: typeConfig.archiveAfterDays ?? DEFAULT_TYPE.archiveAfterDays,\n archiveStorage: typeConfig.archiveStorage ?? DEFAULT_TYPE.archiveStorage,\n syncPatterns: typeConfig.syncPatterns,\n excludePatterns: typeConfig.excludePatterns,\n permissions: typeConfig.permissions,\n }\n\n types.set(name, type)\n }\n\n return types\n}\n\n/**\n * Merge custom types with built-in types\n *\n * Custom types override built-in types with the same name.\n *\n * @param builtIn - Built-in types\n * @param custom - Custom types\n * @returns Merged types\n */\nexport function mergeTypes(\n builtIn: Record<string, ArtifactType>,\n custom: Map<string, ArtifactType>\n): Map<string, ArtifactType> {\n const merged = new Map<string, ArtifactType>()\n\n // Add built-in types first\n for (const [name, type] of Object.entries(builtIn)) {\n merged.set(name, type)\n }\n\n // Override/add custom types\n for (const [name, type] of custom) {\n merged.set(name, type)\n }\n\n return merged\n}\n\n/**\n * Create a partial type definition for extending a built-in type\n *\n * @param baseName - Name of the built-in type to extend\n * @param overrides - Properties to override\n * @returns Partial type definition\n */\nexport function extendType(\n baseName: string,\n overrides: Partial<Omit<ArtifactType, 'name'>>\n): Partial<ArtifactType> {\n return {\n ...overrides,\n name: baseName,\n }\n}\n","import { z } from 'zod'\n\n/**\n * Schema for document frontmatter metadata\n *\n * Based on SPEC-00002: Metadata Parsing\n */\nexport const MetadataSchema = z\n .object({\n // Organizational\n org: z.string().optional(),\n system: z.string().optional(),\n\n // Sync rules\n codex_sync_include: z.array(z.string()).optional(),\n codex_sync_exclude: z.array(z.string()).optional(),\n codex_sync_custom: z.array(z.string()).optional(),\n\n // Metadata\n title: z.string().optional(),\n description: z.string().optional(),\n visibility: z.enum(['public', 'internal', 'private']).optional(),\n audience: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n\n // Timestamps\n created: z.string().optional(), // ISO 8601 date string\n updated: z.string().optional(),\n })\n .passthrough() // Allow additional fields for extensibility\n\nexport type Metadata = z.infer<typeof MetadataSchema>\n","import { z } from 'zod'\n\n/**\n * Schema for auto-sync patterns\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport const AutoSyncPatternSchema = z.object({\n pattern: z.string(),\n include: z.array(z.string()),\n exclude: z.array(z.string()).optional(),\n})\n\nexport type AutoSyncPattern = z.infer<typeof AutoSyncPatternSchema>\n\n/**\n * Schema for sync rules configuration\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport const SyncRulesSchema = z.object({\n autoSyncPatterns: z.array(AutoSyncPatternSchema).optional(),\n preventSelfSync: z.boolean().optional(),\n preventCodexSync: z.boolean().optional(),\n allowProjectOverrides: z.boolean().optional(),\n defaultInclude: z.array(z.string()).optional(),\n defaultExclude: z.array(z.string()).optional(),\n})\n\nexport type SyncRules = z.infer<typeof SyncRulesSchema>\n\n/**\n * Schema for directional sync config (v0.7.0+)\n *\n * Defines include/exclude patterns for a sync direction\n */\nexport const DirectionalSyncConfigSchema = z.object({\n /** Patterns to include (required) */\n include: z.array(z.string()),\n /** Patterns to exclude (optional) */\n exclude: z.array(z.string()).optional(),\n})\n\nexport type DirectionalSyncConfig = z.infer<typeof DirectionalSyncConfigSchema>\n\n/**\n * Schema for from_codex sync config with URI validation\n *\n * from_codex patterns MUST use codex:// URIs to specify which files\n * to pull from the codex repository. Plain paths are not valid.\n *\n * Valid patterns:\n * - \"codex://org/repo/docs/**\"\n * - \"codex://{org}/{codex_repo}/docs/**\" (with placeholders)\n *\n * Invalid patterns:\n * - \"docs/**\" (plain path - won't work)\n * - \"standards/**\" (plain path - won't work)\n */\nexport const FromCodexSyncConfigSchema = DirectionalSyncConfigSchema.refine(\n (config) => {\n // Validate that all include patterns use codex:// URI format\n const includeValid = config.include.every((pattern) =>\n pattern.startsWith('codex://')\n )\n // Validate exclude patterns too (if present)\n const excludeValid =\n !config.exclude ||\n config.exclude.every((pattern) => pattern.startsWith('codex://'))\n return includeValid && excludeValid\n },\n {\n message:\n 'from_codex patterns must use codex:// URI format (e.g., \"codex://{org}/{codex_repo}/docs/**\"). Plain paths like \"docs/**\" are not valid for from_codex.',\n }\n)\n\nexport type FromCodexSyncConfig = z.infer<typeof FromCodexSyncConfigSchema>\n\n/**\n * Schema for directional sync configuration\n *\n * Defines what files sync TO codex (push) and FROM codex (pull)\n */\nexport const DirectionalSyncSchema = z.object({\n // New format (v0.7.0+) - Recommended\n // Patterns for files to push from this project to codex (plain paths)\n to_codex: DirectionalSyncConfigSchema.optional(),\n\n // Patterns for files to pull from codex to this project (codex:// URIs required)\n from_codex: FromCodexSyncConfigSchema.optional(),\n\n // Global exclude patterns (applied to both directions)\n exclude: z.array(z.string()).optional(),\n\n // Legacy format (deprecated, backward compatible)\n // Org-level defaults (only in codex repository config)\n default_to_codex: z.array(z.string()).optional(),\n default_from_codex: z.array(z.string()).optional(),\n})\n\nexport type DirectionalSync = z.infer<typeof DirectionalSyncSchema>\n\n/**\n * Schema for archive configuration per project\n *\n * Based on SPEC-20260111: Codex Archive Awareness\n */\nexport const ArchiveProjectConfigSchema = z.object({\n enabled: z.boolean(),\n handler: z.enum(['s3', 'r2', 'gcs', 'local']),\n bucket: z.string().optional(),\n prefix: z.string().optional(),\n patterns: z.array(z.string()).optional(),\n})\n\nexport type ArchiveProjectConfig = z.infer<typeof ArchiveProjectConfigSchema>\n\n/**\n * Schema for archive configuration\n *\n * Maps project identifiers (org/project) to their archive config\n */\nexport const ArchiveConfigSchema = z.object({\n projects: z.record(ArchiveProjectConfigSchema),\n})\n\nexport type ArchiveConfig = z.infer<typeof ArchiveConfigSchema>\n\n/**\n * Schema for GitHub authentication configuration\n */\nexport const GitHubAuthConfigSchema = z.object({\n /** Default token environment variable name (default: GITHUB_TOKEN) */\n default_token_env: z.string().optional(),\n /** Fallback to public access if authentication fails */\n fallback_to_public: z.boolean().optional(),\n})\n\nexport type GitHubAuthConfig = z.infer<typeof GitHubAuthConfigSchema>\n\n/**\n * Schema for authentication configuration\n */\nexport const AuthConfigSchema = z.object({\n /** GitHub authentication configuration */\n github: GitHubAuthConfigSchema.optional(),\n})\n\nexport type AuthConfig = z.infer<typeof AuthConfigSchema>\n\n/**\n * Schema for remote repository configuration\n *\n * Configures authentication for external repositories referenced in from_codex patterns.\n * Token can be a direct value or an environment variable reference using ${VAR} syntax.\n *\n * Example:\n * remotes:\n * partner-org/their-docs:\n * token: ${PARTNER_TOKEN}\n */\nexport const RemoteConfigSchema = z.object({\n /** Authentication token - can be direct value or ${ENV_VAR} reference */\n token: z.string().optional(),\n})\n\nexport type RemoteConfig = z.infer<typeof RemoteConfigSchema>\n\n/**\n * Schema for Codex configuration\n *\n * Based on SPEC-00005: Configuration System\n */\nexport const CodexConfigSchema = z\n .object({\n organizationSlug: z.string(),\n\n /** Project name (optional) */\n project: z.string().optional(),\n\n directories: z\n .object({\n source: z.string().optional(),\n target: z.string().optional(),\n systems: z.string().optional(),\n })\n .optional(),\n\n rules: SyncRulesSchema.optional(),\n\n // Directional sync configuration\n sync: DirectionalSyncSchema.optional(),\n\n // Archive configuration\n archive: ArchiveConfigSchema.optional(),\n\n // Authentication configuration\n auth: AuthConfigSchema.optional(),\n\n // Remote repositories configuration (external projects)\n // Keys are org/project identifiers, values configure authentication\n remotes: z.record(RemoteConfigSchema).optional(),\n })\n .strict()\n\nexport type CodexConfig = z.infer<typeof CodexConfigSchema>\n\n/**\n * Schema for file plugin source configuration\n *\n * Based on SPEC-20260115: Codex-File Plugin Integration\n */\nexport const FileSourceSchema = z\n .object({\n type: z.enum(['s3', 'r2', 'gcs', 'local']),\n bucket: z.string().optional(),\n prefix: z.string().optional(),\n region: z.string().optional(),\n local: z.object({\n base_path: z.string(),\n }),\n push: z\n .object({\n compress: z.boolean().optional(),\n keep_local: z.boolean().optional(),\n })\n .optional(),\n auth: z\n .object({\n profile: z.string().optional(),\n })\n .optional(),\n })\n .refine(\n (data) => {\n // Bucket is required for cloud storage types (s3, r2, gcs)\n if (data.type !== 'local' && !data.bucket) {\n return false\n }\n return true\n },\n {\n message: \"Bucket is required for s3, r2, and gcs storage types\",\n path: ['bucket'],\n }\n )\n\nexport type FileSource = z.infer<typeof FileSourceSchema>\n\n/**\n * Schema for file plugin configuration\n *\n * Manages local project artifacts (specs, logs, assets) with push/pull to cloud storage\n */\nexport const FileConfigSchema = z.object({\n schema_version: z.string(),\n sources: z.record(FileSourceSchema),\n})\n\nexport type FileConfig = z.infer<typeof FileConfigSchema>\n\n/**\n * Schema for unified configuration\n *\n * Combines file plugin and codex plugin configuration in a single file\n * Location: .fractary/config.yaml\n */\nexport const UnifiedConfigSchema = z.object({\n file: FileConfigSchema.optional(),\n codex: CodexConfigSchema.optional(),\n})\n\nexport type UnifiedConfig = z.infer<typeof UnifiedConfigSchema>\n","import yaml from 'js-yaml'\nimport { MetadataSchema, type Metadata } from '../../schemas/metadata.js'\nimport { ValidationError } from '../../errors/index.js'\n\nexport interface ParseMetadataOptions {\n strict?: boolean // Throw on validation errors (default: true)\n normalize?: boolean // Normalize line endings (default: true)\n}\n\nexport interface ParseResult {\n metadata: Metadata\n content: string // Document content without frontmatter\n raw: string // Raw frontmatter block\n}\n\n/**\n * Extracts and parses YAML frontmatter from markdown content\n *\n * Based on SPEC-00002: Metadata Parsing\n *\n * @param content - Markdown file content\n * @param options - Parsing options\n * @returns Parsed metadata and content\n * @throws ValidationError if frontmatter is malformed (in strict mode)\n */\nexport function parseMetadata(\n content: string,\n options: ParseMetadataOptions = {}\n): ParseResult {\n const { strict = true, normalize = true } = options\n\n // Normalize line endings (CRLF → LF)\n const normalizedContent = normalize\n ? content.replace(/\\r\\n/g, '\\n')\n : content\n\n // Extract frontmatter block\n const frontmatterMatch = normalizedContent.match(\n /^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/\n )\n\n if (!frontmatterMatch) {\n // No frontmatter found\n return {\n metadata: {},\n content: normalizedContent,\n raw: '',\n }\n }\n\n const rawFrontmatter = frontmatterMatch[1]!\n const documentContent = frontmatterMatch[2]!\n\n try {\n // Parse YAML\n const parsed = yaml.load(rawFrontmatter) as Record<string, unknown>\n\n // Normalize legacy formats\n const normalized = normalizeLegacyMetadata(parsed)\n\n // Validate against schema\n const metadata = strict\n ? MetadataSchema.parse(normalized)\n : MetadataSchema.safeParse(normalized).data || {}\n\n return {\n metadata,\n content: documentContent,\n raw: rawFrontmatter,\n }\n } catch (error) {\n if (strict) {\n throw new ValidationError(\n `Invalid frontmatter: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error }\n )\n }\n\n // Non-strict mode: return empty metadata\n return {\n metadata: {},\n content: documentContent,\n raw: rawFrontmatter,\n }\n }\n}\n\n/**\n * Normalize legacy frontmatter formats to standard format\n *\n * Handles:\n * - Nested codex.includes → codex_sync_include\n * - Nested codex.excludes → codex_sync_exclude\n * - Flat plural codex_sync_includes → codex_sync_include\n * - Flat plural codex_sync_excludes → codex_sync_exclude\n */\nfunction normalizeLegacyMetadata(parsed: any): any {\n const normalized: any = { ...parsed }\n\n // Handle nested codex.includes → codex_sync_include\n if (parsed.codex?.includes && !parsed.codex_sync_include) {\n normalized.codex_sync_include = parsed.codex.includes\n }\n\n // Handle nested codex.excludes → codex_sync_exclude\n if (parsed.codex?.excludes && !parsed.codex_sync_exclude) {\n normalized.codex_sync_exclude = parsed.codex.excludes\n }\n\n // Handle flat plural codex_sync_includes → codex_sync_include\n if (parsed.codex_sync_includes && !normalized.codex_sync_include) {\n normalized.codex_sync_include = parsed.codex_sync_includes\n }\n\n // Handle flat plural codex_sync_excludes → codex_sync_exclude\n if (parsed.codex_sync_excludes && !normalized.codex_sync_exclude) {\n normalized.codex_sync_exclude = parsed.codex_sync_excludes\n }\n\n return normalized\n}\n\n/**\n * Check if content has frontmatter\n */\nexport function hasFrontmatter(content: string): boolean {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n return /^---\\n[\\s\\S]*?\\n---\\n/.test(normalized)\n}\n\n/**\n * Validate metadata without parsing content\n */\nexport function validateMetadata(\n metadata: unknown\n): { valid: boolean; errors?: string[] } {\n const result = MetadataSchema.safeParse(metadata)\n\n if (result.success) {\n return { valid: true }\n }\n\n return {\n valid: false,\n errors: result.error.issues.map(issue => issue.message),\n }\n}\n\n/**\n * Extract only frontmatter (no validation)\n */\nexport function extractRawFrontmatter(content: string): string | null {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n const match = normalized.match(/^---\\n([\\s\\S]*?)\\n---\\n/)\n return match && match[1] ? match[1] : null\n}\n","export {\n matchPattern,\n matchAnyPattern,\n filterByPatterns,\n evaluatePatterns,\n} from './matcher.js'\n","import { ConfigurationError } from '../../errors/index.js'\n\nexport interface ResolveOrgOptions {\n orgSlug?: string // Explicit org slug\n repoName?: string // Repo name for auto-detection\n autoDetect?: boolean // Enable auto-detection (default: true)\n}\n\n/**\n * Resolve organization slug from multiple sources\n *\n * Based on SPEC-00005: Configuration System\n *\n * Priority:\n * 1. Explicit orgSlug parameter\n * 2. Auto-detect from repoName (if enabled)\n * 3. Environment variable (ORGANIZATION_SLUG or CODEX_ORG_SLUG)\n * 4. Throw ConfigurationError if none found\n *\n * @param options - Resolution options\n * @returns Organization slug\n * @throws ConfigurationError if slug cannot be determined\n */\nexport function resolveOrganization(\n options: ResolveOrgOptions = {}\n): string {\n const { orgSlug, repoName, autoDetect = true } = options\n\n // 1. Explicit parameter\n if (orgSlug) {\n return orgSlug\n }\n\n // 2. Auto-detect from repo name\n if (autoDetect && repoName) {\n const detected = extractOrgFromRepoName(repoName)\n if (detected) {\n return detected\n }\n }\n\n // 3. Environment variables\n const envOrg =\n process.env['ORGANIZATION_SLUG'] || process.env['CODEX_ORG_SLUG']\n\n if (envOrg) {\n return envOrg\n }\n\n // 4. Fail - required parameter missing\n throw new ConfigurationError(\n 'Organization slug could not be determined. ' +\n 'Set ORGANIZATION_SLUG environment variable or pass orgSlug option.'\n )\n}\n\n/**\n * Extract org slug from repo name pattern\n *\n * Patterns:\n * - codex.fractary.com → \"fractary\"\n * - codex.acme.ai → \"acme\"\n * - codex.my-org.io → \"my-org\"\n *\n * @param repoName - Repository name\n * @returns Organization slug or null if pattern doesn't match\n */\nexport function extractOrgFromRepoName(repoName: string): string | null {\n // Pattern: codex.{org}.{tld}\n const match = repoName.match(/^codex\\.([^.]+)\\.[^.]+$/)\n\n if (match && match[1]) {\n return match[1]\n }\n\n return null\n}\n","import type { CodexConfig, SyncRules } from '../../schemas/config.js'\n\n/**\n * Get default directory structure\n *\n * Based on SPEC-00005: Configuration System\n */\nexport function getDefaultDirectories(orgSlug: string) {\n return {\n source: `.${orgSlug}`,\n target: `.${orgSlug}`,\n systems: `.${orgSlug}/systems`,\n }\n}\n\n/**\n * Get default sync rules\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport function getDefaultRules(): SyncRules {\n return {\n autoSyncPatterns: [],\n preventSelfSync: true,\n preventCodexSync: true,\n allowProjectOverrides: true,\n defaultInclude: [],\n defaultExclude: [],\n }\n}\n\n/**\n * Get default archive configuration\n *\n * No archives enabled by default - must be explicitly configured per project\n */\nexport function getDefaultArchiveConfig() {\n return {\n projects: {},\n }\n}\n\n/**\n * Get default configuration\n *\n * @param orgSlug - Organization slug\n * @returns Default CodexConfig\n */\nexport function getDefaultConfig(orgSlug: string): CodexConfig {\n return {\n organizationSlug: orgSlug,\n directories: getDefaultDirectories(orgSlug),\n rules: getDefaultRules(),\n archive: getDefaultArchiveConfig(),\n }\n}\n","import {\n CodexConfigSchema,\n type CodexConfig,\n type SyncRules,\n} from '../../schemas/config.js'\nimport { resolveOrganization } from './organization.js'\nimport { getDefaultDirectories, getDefaultRules } from './defaults.js'\n\nexport interface LoadConfigOptions {\n organizationSlug?: string\n repoName?: string\n env?: Record<string, string | undefined> // Environment variables (default: process.env)\n}\n\n/**\n * Load and resolve configuration from all sources\n *\n * Based on SPEC-00005: Configuration System\n *\n * @param options - Loading options\n * @returns Fully resolved configuration\n */\nexport function loadConfig(options: LoadConfigOptions = {}): CodexConfig {\n // 1. Resolve organization slug\n const orgSlug = resolveOrganization({\n orgSlug: options.organizationSlug,\n repoName: options.repoName,\n })\n\n // 2. Build base config with defaults\n let config: Partial<CodexConfig> = {\n organizationSlug: orgSlug,\n directories: getDefaultDirectories(orgSlug),\n rules: getDefaultRules(),\n }\n\n // 3. Apply environment variable overrides\n const envConfig = loadConfigFromEnv(options.env || process.env)\n config = mergeConfigs(config, envConfig)\n\n // 4. Validate final configuration\n return CodexConfigSchema.parse(config)\n}\n\n/**\n * Load configuration from environment variables\n */\nfunction loadConfigFromEnv(\n env: Record<string, string | undefined>\n): Partial<CodexConfig> {\n const config: Partial<CodexConfig> = {}\n\n // Organization\n if (env['ORGANIZATION_SLUG'] || env['CODEX_ORG_SLUG']) {\n config.organizationSlug = env['ORGANIZATION_SLUG'] || env['CODEX_ORG_SLUG']\n }\n\n // Directories\n if (env['CODEX_SOURCE_DIR'] || env['CODEX_TARGET_DIR']) {\n config.directories = {\n source: env['CODEX_SOURCE_DIR'],\n target: env['CODEX_TARGET_DIR'],\n }\n }\n\n // Rules\n const rules: Partial<SyncRules> = {}\n\n if (env['CODEX_PREVENT_SELF_SYNC'] !== undefined) {\n rules.preventSelfSync = env['CODEX_PREVENT_SELF_SYNC'] === 'true'\n }\n\n if (env['CODEX_PREVENT_CODEX_SYNC'] !== undefined) {\n rules.preventCodexSync = env['CODEX_PREVENT_CODEX_SYNC'] === 'true'\n }\n\n if (env['CODEX_ALLOW_PROJECT_OVERRIDES'] !== undefined) {\n rules.allowProjectOverrides =\n env['CODEX_ALLOW_PROJECT_OVERRIDES'] === 'true'\n }\n\n if (Object.keys(rules).length > 0) {\n config.rules = rules\n }\n\n return config\n}\n\n/**\n * Deep merge two configuration objects\n * Later config overrides earlier config\n */\nfunction mergeConfigs(\n base: Partial<CodexConfig>,\n override: Partial<CodexConfig>\n): Partial<CodexConfig> {\n return {\n organizationSlug: override.organizationSlug ?? base.organizationSlug,\n\n directories: {\n ...base.directories,\n ...override.directories,\n },\n\n rules: {\n ...base.rules,\n ...override.rules,\n\n // Arrays are replaced, not merged\n autoSyncPatterns:\n override.rules?.autoSyncPatterns ?? base.rules?.autoSyncPatterns,\n defaultInclude:\n override.rules?.defaultInclude ?? base.rules?.defaultInclude,\n defaultExclude:\n override.rules?.defaultExclude ?? base.rules?.defaultExclude,\n },\n\n // Only include sync if either base or override has sync config\n ...(base.sync || override.sync\n ? {\n sync: {\n ...base.sync,\n ...override.sync,\n\n // Arrays are replaced, not merged\n to_codex: override.sync?.to_codex ?? base.sync?.to_codex,\n from_codex: override.sync?.from_codex ?? base.sync?.from_codex,\n default_to_codex:\n override.sync?.default_to_codex ?? base.sync?.default_to_codex,\n default_from_codex:\n override.sync?.default_from_codex ?? base.sync?.default_from_codex,\n },\n }\n : {}),\n }\n}\n","/**\n * Sync configuration presets\n *\n * Centralized source of truth for sync pattern presets used across:\n * - SDK (programmatic configuration)\n * - CLI (config init command)\n * - MCP Plugin (configurator agent)\n *\n * IMPORTANT: When updating presets here, also update the corresponding\n * JSON file at plugins/codex/config/sync-presets.json to keep them in sync.\n */\n\nimport { ValidationError } from '../../errors/index.js'\n\n/**\n * Configuration schema version\n */\nexport const CONFIG_SCHEMA_VERSION = '2.0' as const\n\n/**\n * Directional sync configuration (mutable version for generated configs)\n */\nexport interface SyncPresetConfig {\n to_codex: {\n include: string[]\n exclude?: string[]\n }\n from_codex: {\n include: string[]\n exclude?: string[]\n }\n}\n\n/**\n * Sync preset definition (readonly for preset definitions)\n */\nexport interface SyncPreset {\n /** Preset identifier */\n readonly name: string\n /** Human-readable description */\n readonly description: string\n /** Sync configuration */\n readonly config: {\n readonly to_codex: {\n readonly include: readonly string[]\n readonly exclude?: readonly string[]\n }\n readonly from_codex: {\n readonly include: readonly string[]\n readonly exclude?: readonly string[]\n }\n }\n}\n\n/**\n * Sync pattern presets\n *\n * Available presets for common sync configurations.\n * The `from_codex` patterns use `{org}` and `{codex_repo}` placeholders\n * that must be substituted with actual values when generating config.\n */\nexport const SYNC_PATTERN_PRESETS: Record<string, SyncPreset> = {\n standard: {\n name: 'standard',\n description: 'Standard configuration with docs, README, and CLAUDE.md',\n config: {\n to_codex: {\n include: ['docs/**', 'README.md', 'CLAUDE.md'],\n exclude: ['*.tmp'],\n },\n from_codex: {\n include: ['codex://{org}/{codex_repo}/docs/**'],\n },\n },\n },\n minimal: {\n name: 'minimal',\n description: 'Minimal configuration with just docs and README',\n config: {\n to_codex: {\n include: ['docs/**', 'README.md'],\n },\n from_codex: {\n include: ['codex://{org}/{codex_repo}/docs/**'],\n },\n },\n },\n}\n\n/**\n * Default global exclude patterns\n *\n * Applied to all sync operations regardless of preset.\n * These patterns exclude common files that should never be synced.\n */\nexport const DEFAULT_GLOBAL_EXCLUDES = [\n '**/.git/**',\n '**/node_modules/**',\n '**/.env',\n '**/.env.*',\n '**/*.log',\n '**/dist/**',\n '**/build/**',\n '**/.DS_Store',\n '**/credentials.json',\n '**/*secret*',\n '**/*password*',\n] as const\n\n/**\n * Get a sync preset by name\n *\n * @param name - Preset name ('standard' or 'minimal')\n * @returns The preset or undefined if not found\n */\nexport function getSyncPreset(name: string): SyncPreset | undefined {\n return SYNC_PATTERN_PRESETS[name]\n}\n\n/**\n * Get all available preset names\n *\n * @returns Array of preset names\n */\nexport function getSyncPresetNames(): string[] {\n return Object.keys(SYNC_PATTERN_PRESETS)\n}\n\n/**\n * Substitute placeholders in sync patterns\n *\n * Replaces all occurrences of `{org}` and `{codex_repo}` with actual values.\n *\n * @param patterns - Patterns with placeholders\n * @param org - Organization name (must be non-empty)\n * @param codexRepo - Codex repository name (must be non-empty)\n * @returns Patterns with placeholders replaced\n * @throws ValidationError if org or codexRepo is empty\n */\nexport function substitutePatternPlaceholders(\n patterns: readonly string[],\n org: string,\n codexRepo: string\n): string[] {\n if (!org || typeof org !== 'string' || org.trim() === '') {\n throw new ValidationError('org must be a non-empty string')\n }\n if (!codexRepo || typeof codexRepo !== 'string' || codexRepo.trim() === '') {\n throw new ValidationError('codexRepo must be a non-empty string')\n }\n\n return patterns.map((pattern) =>\n pattern.replace(/\\{org\\}/g, org).replace(/\\{codex_repo\\}/g, codexRepo)\n )\n}\n\n/**\n * Options for generating sync config from preset\n */\nexport interface GenerateSyncConfigOptions {\n /**\n * Whether to include DEFAULT_GLOBAL_EXCLUDES in the generated config.\n * When true, global excludes are merged into to_codex.exclude.\n * @default false\n */\n includeGlobalExcludes?: boolean\n}\n\n/**\n * Generate a sync config from a preset with actual values\n *\n * @param presetName - Preset name\n * @param org - Organization name\n * @param codexRepo - Codex repository name\n * @param options - Generation options\n * @returns Sync config with placeholders substituted, or undefined if preset not found\n */\nexport function generateSyncConfigFromPreset(\n presetName: string,\n org: string,\n codexRepo: string,\n options?: GenerateSyncConfigOptions\n): SyncPresetConfig | undefined {\n const preset = getSyncPreset(presetName)\n if (!preset) {\n return undefined\n }\n\n // Build exclude list, optionally including global excludes\n let toCodexExclude: string[] | undefined\n if (options?.includeGlobalExcludes) {\n toCodexExclude = [\n ...(preset.config.to_codex.exclude || []),\n ...DEFAULT_GLOBAL_EXCLUDES,\n ]\n } else if (preset.config.to_codex.exclude) {\n toCodexExclude = [...preset.config.to_codex.exclude]\n }\n\n return {\n to_codex: {\n include: [...preset.config.to_codex.include],\n exclude: toCodexExclude,\n },\n from_codex: {\n include: substitutePatternPlaceholders(\n preset.config.from_codex.include,\n org,\n codexRepo\n ),\n exclude: preset.config.from_codex.exclude\n ? substitutePatternPlaceholders(\n preset.config.from_codex.exclude,\n org,\n codexRepo\n )\n : undefined,\n },\n }\n}\n","import type { Metadata } from '../../schemas/metadata.js'\nimport type { SyncRules, AutoSyncPattern } from '../../schemas/config.js'\nimport { matchPattern, evaluatePatterns } from '../patterns/matcher.js'\nimport { getDefaultRules } from '../config/defaults.js'\n\nexport interface ShouldSyncOptions {\n filePath: string // Path to file being evaluated\n fileMetadata: Metadata // Parsed frontmatter from file\n targetRepo: string // Repository to sync to\n sourceRepo: string // Repository file is from\n rules?: SyncRules // Optional routing rules (defaults applied)\n}\n\n/**\n * Determine if a file should be synced to a target repository\n *\n * Based on SPEC-00004: Routing & Distribution\n *\n * @param options - Evaluation options\n * @returns true if file should sync to targetRepo\n */\nexport function shouldSyncToRepo(options: ShouldSyncOptions): boolean {\n const {\n filePath,\n fileMetadata,\n targetRepo,\n sourceRepo,\n rules = getDefaultRules(),\n } = options\n\n // 1. Check special rules first\n const specialRuleResult = evaluateSpecialRules({\n filePath,\n targetRepo,\n sourceRepo,\n rules,\n })\n\n if (specialRuleResult !== null) {\n return specialRuleResult\n }\n\n // 2. Evaluate frontmatter rules\n return evaluateFrontmatterRules({\n metadata: fileMetadata,\n targetRepo,\n allowOverrides: rules.allowProjectOverrides ?? true,\n })\n}\n\n/**\n * Evaluate special routing rules\n *\n * Returns true/false if a special rule matches, null otherwise\n */\nfunction evaluateSpecialRules(options: {\n filePath: string\n targetRepo: string\n sourceRepo: string\n rules: SyncRules\n}): boolean | null {\n const { filePath, targetRepo, sourceRepo, rules } = options\n\n // Rule 1: Auto-sync patterns (highest priority)\n if (rules.autoSyncPatterns?.length) {\n const autoSyncResult = evaluateAutoSyncPatterns(\n filePath,\n targetRepo,\n rules.autoSyncPatterns\n )\n\n if (autoSyncResult !== null) {\n return autoSyncResult\n }\n }\n\n // Rule 2: Prevent self-sync\n if (rules.preventSelfSync) {\n const selfSyncResult = preventSelfSync(filePath, targetRepo, sourceRepo)\n\n if (selfSyncResult !== null) {\n return selfSyncResult\n }\n }\n\n // Rule 3: Prevent codex sync\n if (rules.preventCodexSync) {\n const codexSyncResult = preventCodexSync(targetRepo, sourceRepo)\n\n if (codexSyncResult !== null) {\n return codexSyncResult\n }\n }\n\n // No special rule applies\n return null\n}\n\n/**\n * Evaluate auto-sync patterns\n */\nfunction evaluateAutoSyncPatterns(\n filePath: string,\n targetRepo: string,\n patterns: AutoSyncPattern[]\n): boolean | null {\n for (const autoPattern of patterns) {\n // Check if file matches auto-sync pattern\n if (matchPattern(autoPattern.pattern, filePath)) {\n // File matches - evaluate repo include/exclude\n return evaluatePatterns({\n value: targetRepo,\n include: autoPattern.include,\n ...(autoPattern.exclude && { exclude: autoPattern.exclude }),\n })\n }\n }\n\n // No auto-sync pattern matched\n return null\n}\n\n/**\n * Prevent system files from syncing to their own repository\n */\nfunction preventSelfSync(\n filePath: string,\n targetRepo: string,\n _sourceRepo: string\n): boolean | null {\n // Extract system name from file path\n // Example: \".fractary/systems/api-gateway/docs/README.md\" → \"api-gateway\"\n const systemMatch = filePath.match(/systems\\/([^/]+)\\//)\n\n if (systemMatch && systemMatch[1]) {\n const systemName = systemMatch[1]\n\n if (systemName === targetRepo) {\n // Prevent: Don't sync system files to their own repo\n return false\n }\n }\n\n // Not a system file, or different system\n return null\n}\n\n/**\n * Prevent files from syncing back to the codex repository\n */\nfunction preventCodexSync(\n targetRepo: string,\n sourceRepo: string\n): boolean | null {\n // Detect if target is the codex repo\n const isCodexRepo =\n targetRepo === sourceRepo || targetRepo.startsWith('codex.')\n\n if (isCodexRepo) {\n return false\n }\n\n return null\n}\n\n/**\n * Evaluate frontmatter sync rules\n */\nfunction evaluateFrontmatterRules(options: {\n metadata: Metadata\n targetRepo: string\n allowOverrides: boolean\n}): boolean {\n const { metadata, targetRepo, allowOverrides } = options\n\n // If project overrides disabled, return false (no sync by default)\n if (!allowOverrides) {\n return false\n }\n\n const include = metadata.codex_sync_include || []\n const exclude = metadata.codex_sync_exclude || []\n\n // If no include rules, don't sync (must be explicit)\n if (include.length === 0) {\n return false\n }\n\n // Evaluate include/exclude patterns\n return evaluatePatterns({\n value: targetRepo,\n include,\n exclude,\n })\n}\n\n/**\n * Determine all repos that should receive a file\n *\n * @param options - Evaluation options\n * @returns Array of repository names that should receive this file\n */\nexport function getTargetRepos(options: {\n filePath: string\n fileMetadata: Metadata\n sourceRepo: string\n allRepos: string[]\n rules?: SyncRules\n}): string[] {\n const { filePath, fileMetadata, sourceRepo, allRepos, rules } = options\n\n return allRepos.filter(targetRepo =>\n shouldSyncToRepo({\n filePath,\n fileMetadata,\n targetRepo,\n sourceRepo,\n ...(rules && { rules }),\n })\n )\n}\n","import type { Metadata } from '../../schemas/metadata.js'\nimport { ValidationError } from '../../errors/ValidationError.js'\n\n/**\n * Represents a custom sync destination with repository and path\n */\nexport interface CustomSyncDestination {\n repo: string // Repository identifier (e.g., \"developers.fractary.com\")\n path: string // Target path within repository (e.g., \"src/content/docs/forge/\")\n}\n\n/**\n * Parse a custom destination string in format \"repo:path\"\n *\n * @param value - Custom destination string (e.g., \"developers.fractary.com:src/content/docs/forge/\")\n * @returns Parsed destination object\n * @throws ValidationError if format is invalid\n *\n * @example\n * ```typescript\n * const dest = parseCustomDestination('developers.fractary.com:src/content/docs/forge/')\n * // { repo: 'developers.fractary.com', path: 'src/content/docs/forge/' }\n * ```\n */\nexport function parseCustomDestination(value: string): CustomSyncDestination {\n if (typeof value !== 'string' || !value) {\n throw new ValidationError('Custom destination must be a non-empty string')\n }\n\n const colonIndex = value.indexOf(':')\n\n if (colonIndex === -1) {\n throw new ValidationError(\n `Invalid custom destination format: \"${value}\". Expected format: \"repo:path\"`\n )\n }\n\n const repo = value.substring(0, colonIndex).trim()\n const path = value.substring(colonIndex + 1).trim()\n\n if (!repo) {\n throw new ValidationError(\n `Invalid custom destination: repository name cannot be empty in \"${value}\"`\n )\n }\n\n if (!path) {\n throw new ValidationError(\n `Invalid custom destination: path cannot be empty in \"${value}\"`\n )\n }\n\n return { repo, path }\n}\n\n/**\n * Extract all custom sync destinations from metadata\n *\n * @param metadata - Parsed frontmatter metadata\n * @returns Array of custom sync destinations\n *\n * @example\n * ```typescript\n * const metadata = {\n * codex_sync_custom: [\n * 'developers.fractary.com:src/content/docs/forge/',\n * 'docs.example.com:api/'\n * ]\n * }\n *\n * const destinations = getCustomSyncDestinations(metadata)\n * // [\n * // { repo: 'developers.fractary.com', path: 'src/content/docs/forge/' },\n * // { repo: 'docs.example.com', path: 'api/' }\n * // ]\n * ```\n */\nexport function getCustomSyncDestinations(\n metadata: Metadata\n): CustomSyncDestination[] {\n const customDestinations = metadata.codex_sync_custom\n\n if (!customDestinations || !Array.isArray(customDestinations)) {\n return []\n }\n\n const results: CustomSyncDestination[] = []\n\n for (const destination of customDestinations) {\n try {\n const parsed = parseCustomDestination(destination)\n results.push(parsed)\n } catch (_error) {\n // Skip invalid destinations but preserve valid ones\n // Consumers can validate metadata if they want strict validation\n continue\n }\n }\n\n return results\n}\n","/**\n * Storage provider interface and types\n *\n * Defines the contract for storage providers that can fetch\n * content from various sources (local, GitHub, HTTP, etc.)\n */\n\nimport type { ResolvedReference } from '../references/index.js'\n\n/**\n * Supported storage provider types\n */\nexport type StorageProviderType =\n | 'local'\n | 'github'\n | 'http'\n | 's3'\n | 's3-archive'\n | 'r2'\n | 'gcs'\n | 'drive'\n | 'file-plugin'\n\n/**\n * Result of a fetch operation\n */\nexport interface FetchResult {\n /** Fetched content as Buffer */\n content: Buffer\n /** Content type (MIME type) */\n contentType: string\n /** Content size in bytes */\n size: number\n /** Source identifier (e.g., 'github', 'local') */\n source: string\n /** Optional metadata */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Options for fetch operations\n */\nexport interface FetchOptions {\n /** Timeout in milliseconds */\n timeout?: number\n /** Maximum number of retries */\n maxRetries?: number\n /** Authentication token */\n token?: string\n /** Branch to fetch from (for git-based providers) */\n branch?: string\n /** Whether to follow redirects */\n followRedirects?: boolean\n /** Maximum content size in bytes */\n maxSize?: number\n}\n\n/**\n * Storage provider interface\n *\n * All storage providers must implement this interface.\n */\nexport interface StorageProvider {\n /** Provider name (e.g., 'github', 'local') */\n readonly name: string\n /** Provider type */\n readonly type: StorageProviderType\n\n /**\n * Fetch content for a resolved reference\n *\n * @param reference - The resolved reference to fetch\n * @param options - Fetch options\n * @returns The fetch result\n * @throws Error if fetch fails\n */\n fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult>\n\n /**\n * Check if content exists at the reference\n *\n * @param reference - The resolved reference to check\n * @param options - Fetch options\n * @returns true if content exists\n */\n exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean>\n\n /**\n * Check if this provider can handle the given reference\n *\n * @param reference - The resolved reference\n * @returns true if this provider can handle the reference\n */\n canHandle(reference: ResolvedReference): boolean\n}\n\n/**\n * Storage provider configuration\n */\nexport interface StorageProviderConfig {\n /** Provider type */\n type: StorageProviderType\n /** Provider-specific options */\n options?: Record<string, unknown>\n /** Default timeout */\n timeout?: number\n /** Default max retries */\n maxRetries?: number\n /** Authentication configuration */\n auth?: {\n /** Environment variable containing the token */\n tokenEnv?: string\n /** Static token (not recommended) */\n token?: string\n }\n}\n\n/**\n * Default fetch options\n */\nexport const DEFAULT_FETCH_OPTIONS: Required<FetchOptions> = {\n timeout: 30000, // 30 seconds\n maxRetries: 3,\n token: '',\n branch: 'main',\n followRedirects: true,\n maxSize: 10 * 1024 * 1024, // 10MB\n}\n\n/**\n * Merge fetch options with defaults\n *\n * @param options - User-provided options\n * @returns Merged options with defaults\n */\nexport function mergeFetchOptions(options?: FetchOptions): Required<FetchOptions> {\n return {\n ...DEFAULT_FETCH_OPTIONS,\n ...options,\n }\n}\n\n/**\n * Detect content type from file extension\n *\n * @param path - File path\n * @returns MIME type\n */\nexport function detectContentType(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase()\n\n const mimeTypes: Record<string, string> = {\n md: 'text/markdown',\n markdown: 'text/markdown',\n txt: 'text/plain',\n json: 'application/json',\n yaml: 'application/x-yaml',\n yml: 'application/x-yaml',\n xml: 'application/xml',\n html: 'text/html',\n htm: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n ts: 'application/typescript',\n py: 'text/x-python',\n rb: 'text/x-ruby',\n go: 'text/x-go',\n rs: 'text/x-rust',\n java: 'text/x-java',\n c: 'text/x-c',\n cpp: 'text/x-c++',\n h: 'text/x-c',\n hpp: 'text/x-c++',\n sh: 'application/x-sh',\n bash: 'application/x-sh',\n zsh: 'application/x-sh',\n pdf: 'application/pdf',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n }\n\n return mimeTypes[ext || ''] || 'application/octet-stream'\n}\n","/**\n * Local filesystem storage provider\n *\n * Fetches content from the local filesystem for current project references.\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating a LocalStorage provider\n */\nexport interface LocalStorageOptions {\n /** Base directory for resolving paths (default: process.cwd()) */\n baseDir?: string\n}\n\n/**\n * Local filesystem storage provider\n *\n * Handles fetching content from the local filesystem for references\n * that point to the current project.\n */\nexport class LocalStorage implements StorageProvider {\n readonly name = 'local'\n readonly type = 'local' as const\n\n private baseDir: string\n\n constructor(options: LocalStorageOptions = {}) {\n this.baseDir = options.baseDir || process.cwd()\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * Local provider handles references that are in the current project\n * and have a local path.\n */\n canHandle(reference: ResolvedReference): boolean {\n return reference.isCurrentProject && !!reference.localPath\n }\n\n /**\n * Fetch content from local filesystem\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n\n if (!reference.localPath) {\n throw new Error(`No local path for reference: ${reference.uri}`)\n }\n\n const fullPath = path.isAbsolute(reference.localPath)\n ? reference.localPath\n : path.join(this.baseDir, reference.localPath)\n\n // Check file exists\n try {\n await fs.access(fullPath)\n } catch {\n throw new Error(`File not found: ${fullPath}`)\n }\n\n // Check file size\n const stats = await fs.stat(fullPath)\n if (stats.size > opts.maxSize) {\n throw new Error(\n `File too large: ${stats.size} bytes (max: ${opts.maxSize} bytes)`\n )\n }\n\n // Read file content\n const content = await fs.readFile(fullPath)\n\n return {\n content,\n contentType: detectContentType(reference.localPath),\n size: content.length,\n source: 'local',\n metadata: {\n path: fullPath,\n mtime: stats.mtime.toISOString(),\n },\n }\n }\n\n /**\n * Check if file exists locally\n */\n async exists(reference: ResolvedReference): Promise<boolean> {\n if (!reference.localPath) {\n return false\n }\n\n const fullPath = path.isAbsolute(reference.localPath)\n ? reference.localPath\n : path.join(this.baseDir, reference.localPath)\n\n try {\n await fs.access(fullPath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Read file content as string\n */\n async readText(filePath: string): Promise<string> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n return fs.readFile(fullPath, 'utf-8')\n }\n\n /**\n * Write content to file\n */\n async write(filePath: string, content: string | Buffer): Promise<void> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(fullPath), { recursive: true })\n\n await fs.writeFile(fullPath, content)\n }\n\n /**\n * Delete a file\n */\n async delete(filePath: string): Promise<boolean> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n try {\n await fs.unlink(fullPath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * List files in a directory\n */\n async list(dirPath: string): Promise<string[]> {\n const fullPath = path.isAbsolute(dirPath)\n ? dirPath\n : path.join(this.baseDir, dirPath)\n\n try {\n const entries = await fs.readdir(fullPath, { withFileTypes: true })\n return entries\n .filter((e) => e.isFile())\n .map((e) => path.join(dirPath, e.name))\n } catch {\n return []\n }\n }\n}\n\n/**\n * Create a LocalStorage provider\n */\nexport function createLocalStorage(options?: LocalStorageOptions): LocalStorage {\n return new LocalStorage(options)\n}\n","/**\n * GitHub storage provider\n *\n * Fetches content from GitHub repositories using the GitHub API\n * or raw content URLs. Supports both public and private repos.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating a GitHub storage provider\n */\nexport interface GitHubStorageOptions {\n /** GitHub API token for authentication */\n token?: string\n /** Environment variable containing the token */\n tokenEnv?: string\n /** Base URL for GitHub API (default: https://api.github.com) */\n apiBaseUrl?: string\n /** Base URL for raw content (default: https://raw.githubusercontent.com) */\n rawBaseUrl?: string\n /** Default branch to use (default: main) */\n defaultBranch?: string\n}\n\n/**\n * GitHub API response for file content\n */\ninterface GitHubContentResponse {\n name: string\n path: string\n sha: string\n size: number\n type: 'file' | 'dir'\n content?: string\n encoding?: string\n download_url?: string\n}\n\n/**\n * GitHub storage provider\n *\n * Handles fetching content from GitHub repositories.\n * Uses raw.githubusercontent.com for public repos and\n * GitHub API for private repos (with authentication).\n */\nexport class GitHubStorage implements StorageProvider {\n readonly name = 'github'\n readonly type = 'github' as const\n\n private apiBaseUrl: string\n private rawBaseUrl: string\n private defaultBranch: string\n private token?: string\n\n constructor(options: GitHubStorageOptions = {}) {\n this.apiBaseUrl = options.apiBaseUrl || 'https://api.github.com'\n this.rawBaseUrl = options.rawBaseUrl || 'https://raw.githubusercontent.com'\n this.defaultBranch = options.defaultBranch || 'main'\n\n // Get token from options or environment\n this.token = options.token || (options.tokenEnv ? process.env[options.tokenEnv] : undefined)\n if (!this.token) {\n // Try common environment variables\n this.token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN\n }\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * GitHub provider handles references that are NOT in the current project\n * (those need to be fetched from GitHub).\n */\n canHandle(reference: ResolvedReference): boolean {\n return !reference.isCurrentProject\n }\n\n /**\n * Fetch content from GitHub\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const token = opts.token || this.token\n const branch = opts.branch || this.defaultBranch\n\n if (!reference.path) {\n throw new Error(`No path specified for reference: ${reference.uri}`)\n }\n\n // Try raw content first (faster, works for public repos)\n try {\n return await this.fetchRaw(reference, branch, opts, token)\n } catch (error) {\n // If raw fetch fails and we have a token, try API\n if (token) {\n return await this.fetchApi(reference, branch, opts, token)\n }\n throw error\n }\n }\n\n /**\n * Fetch using raw.githubusercontent.com\n */\n private async fetchRaw(\n reference: ResolvedReference,\n branch: string,\n opts: Required<FetchOptions>,\n token?: string\n ): Promise<FetchResult> {\n const url = `${this.rawBaseUrl}/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n }\n\n if (token) {\n headers['Authorization'] = `token ${token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), opts.timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n redirect: opts.followRedirects ? 'follow' : 'manual',\n })\n\n if (!response.ok) {\n throw new Error(`GitHub raw fetch failed: ${response.status} ${response.statusText}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const content = Buffer.from(arrayBuffer)\n\n if (content.length > opts.maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${opts.maxSize} bytes)`)\n }\n\n return {\n content,\n contentType: response.headers.get('content-type') || detectContentType(reference.path),\n size: content.length,\n source: 'github-raw',\n metadata: {\n url,\n branch,\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Fetch using GitHub API (for private repos)\n */\n private async fetchApi(\n reference: ResolvedReference,\n branch: string,\n opts: Required<FetchOptions>,\n token: string\n ): Promise<FetchResult> {\n const url = `${this.apiBaseUrl}/repos/${reference.org}/${reference.project}/contents/${reference.path}?ref=${branch}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n Accept: 'application/vnd.github.v3+json',\n Authorization: `token ${token}`,\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), opts.timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n throw new Error(`GitHub API fetch failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as GitHubContentResponse\n\n if (data.type !== 'file') {\n throw new Error(`Reference is not a file: ${reference.uri}`)\n }\n\n let content: Buffer\n\n if (data.content && data.encoding === 'base64') {\n // Content is base64 encoded in API response\n content = Buffer.from(data.content, 'base64')\n } else if (data.download_url) {\n // Fetch from download URL\n const downloadResponse = await fetch(data.download_url, {\n headers: { 'User-Agent': 'fractary-codex' },\n signal: controller.signal,\n })\n const arrayBuffer = await downloadResponse.arrayBuffer()\n content = Buffer.from(arrayBuffer)\n } else {\n throw new Error(`No content available for: ${reference.uri}`)\n }\n\n if (content.length > opts.maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${opts.maxSize} bytes)`)\n }\n\n return {\n content,\n contentType: detectContentType(reference.path),\n size: content.length,\n source: 'github-api',\n metadata: {\n sha: data.sha,\n url,\n branch,\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Check if file exists on GitHub\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const token = opts.token || this.token\n const branch = opts.branch || this.defaultBranch\n\n if (!reference.path) {\n return false\n }\n\n // Try HEAD request to raw URL\n const url = `${this.rawBaseUrl}/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n }\n\n if (token) {\n headers['Authorization'] = `token ${token}`\n }\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n })\n return response.ok\n } catch {\n return false\n }\n }\n\n /**\n * Get repository metadata\n */\n async getRepoInfo(\n org: string,\n project: string\n ): Promise<{\n defaultBranch: string\n private: boolean\n size: number\n } | null> {\n const url = `${this.apiBaseUrl}/repos/${org}/${project}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n Accept: 'application/vnd.github.v3+json',\n }\n\n if (this.token) {\n headers['Authorization'] = `token ${this.token}`\n }\n\n try {\n const response = await fetch(url, { headers })\n if (!response.ok) {\n return null\n }\n\n const data = (await response.json()) as {\n default_branch: string\n private: boolean\n size: number\n }\n\n return {\n defaultBranch: data.default_branch,\n private: data.private,\n size: data.size,\n }\n } catch {\n return null\n }\n }\n}\n\n/**\n * Create a GitHub storage provider\n */\nexport function createGitHubStorage(options?: GitHubStorageOptions): GitHubStorage {\n return new GitHubStorage(options)\n}\n","/**\n * HTTP storage provider\n *\n * Fetches content from HTTP/HTTPS URLs. Used for external\n * documentation, APIs, and other web resources.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating an HTTP storage provider\n */\nexport interface HttpStorageOptions {\n /** Default timeout in milliseconds */\n timeout?: number\n /** Maximum content size in bytes */\n maxSize?: number\n /** Custom headers to include in requests */\n headers?: Record<string, string>\n /** User agent string */\n userAgent?: string\n}\n\n/**\n * HTTP storage provider\n *\n * Generic provider for fetching content from HTTP/HTTPS URLs.\n * This is a fallback provider for external resources.\n */\nexport class HttpStorage implements StorageProvider {\n readonly name = 'http'\n readonly type = 'http' as const\n\n private defaultTimeout: number\n private defaultMaxSize: number\n private defaultHeaders: Record<string, string>\n\n constructor(options: HttpStorageOptions = {}) {\n this.defaultTimeout = options.timeout || 30000\n this.defaultMaxSize = options.maxSize || 10 * 1024 * 1024 // 10MB\n this.defaultHeaders = {\n 'User-Agent': options.userAgent || 'fractary-codex',\n ...options.headers,\n }\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * HTTP provider is a fallback - it can handle any reference\n * but should have lower priority than specialized providers.\n */\n canHandle(_reference: ResolvedReference): boolean {\n // HTTP provider is a fallback, so it can handle anything\n // but let other providers take precedence\n return true\n }\n\n /**\n * Fetch content from HTTP URL\n *\n * This method constructs a URL from the reference and fetches it.\n * The URL pattern is: https://raw.githubusercontent.com/{org}/{project}/{branch}/{path}\n *\n * For custom URL schemes, use the fetchUrl method directly.\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const branch = opts.branch || 'main'\n\n if (!reference.path) {\n throw new Error(`No path specified for reference: ${reference.uri}`)\n }\n\n // Construct URL (GitHub raw content as default)\n const url = `https://raw.githubusercontent.com/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n return this.fetchUrl(url, opts)\n }\n\n /**\n * Fetch content from any URL\n */\n async fetchUrl(url: string, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const timeout = opts.timeout || this.defaultTimeout\n const maxSize = opts.maxSize || this.defaultMaxSize\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n }\n\n if (opts.token) {\n headers['Authorization'] = `Bearer ${opts.token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n redirect: opts.followRedirects ? 'follow' : 'manual',\n })\n\n if (!response.ok) {\n throw new Error(`HTTP fetch failed: ${response.status} ${response.statusText}`)\n }\n\n // Check content length header first\n const contentLength = response.headers.get('content-length')\n if (contentLength && parseInt(contentLength, 10) > maxSize) {\n throw new Error(`Content too large: ${contentLength} bytes (max: ${maxSize} bytes)`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const content = Buffer.from(arrayBuffer)\n\n if (content.length > maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${maxSize} bytes)`)\n }\n\n // Extract filename from URL for content type detection\n const pathname = new URL(url).pathname\n const filename = pathname.split('/').pop() || ''\n\n return {\n content,\n contentType: response.headers.get('content-type') || detectContentType(filename),\n size: content.length,\n source: 'http',\n metadata: {\n url,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Check if URL exists (HEAD request)\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const branch = opts.branch || 'main'\n\n if (!reference.path) {\n return false\n }\n\n const url = `https://raw.githubusercontent.com/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n return this.urlExists(url, opts)\n }\n\n /**\n * Check if any URL exists\n */\n async urlExists(url: string, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const timeout = opts.timeout || this.defaultTimeout\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n }\n\n if (opts.token) {\n headers['Authorization'] = `Bearer ${opts.token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n signal: controller.signal,\n redirect: 'follow',\n })\n\n return response.ok\n } catch {\n return false\n } finally {\n clearTimeout(timeoutId)\n }\n }\n}\n\n/**\n * Create an HTTP storage provider\n */\nexport function createHttpStorage(options?: HttpStorageOptions): HttpStorage {\n return new HttpStorage(options)\n}\n","/**\n * File plugin source resolution\n *\n * Resolves file plugin sources from unified configuration and provides\n * utilities for matching paths to file sources.\n *\n * Based on SPEC-20260115: Codex-File Plugin Integration\n */\n\nimport type { UnifiedConfig, FileSource } from '../schemas/config.js'\n\n/**\n * Resolved file source with local and remote paths\n */\nexport interface ResolvedFileSource {\n /** Source name (e.g., \"specs\", \"logs\") */\n name: string\n /** Source type identifier */\n type: 'file-plugin'\n /** Local filesystem path */\n localPath: string\n /** Remote S3/R2/GCS path if configured */\n remotePath?: string\n /** Cloud storage bucket name */\n bucket?: string\n /** Cloud storage prefix */\n prefix?: string\n /** Always true for current project */\n isCurrentProject: boolean\n /** Raw file source configuration */\n config: FileSource\n}\n\n/**\n * File source resolver\n *\n * Parses file plugin sources from unified configuration and provides\n * utilities for resolving and matching file paths.\n */\nexport class FileSourceResolver {\n private sources: Map<string, ResolvedFileSource> = new Map()\n\n constructor(private config: UnifiedConfig) {\n this.initializeSources()\n }\n\n /**\n * Initialize sources from config\n */\n private initializeSources(): void {\n if (!this.config.file?.sources) {\n return\n }\n\n for (const [name, sourceConfig] of Object.entries(this.config.file.sources)) {\n const resolved: ResolvedFileSource = {\n name,\n type: 'file-plugin',\n localPath: sourceConfig.local.base_path,\n isCurrentProject: true,\n config: sourceConfig,\n }\n\n // Add remote path if cloud storage is configured\n if (sourceConfig.bucket && sourceConfig.type !== 'local') {\n resolved.bucket = sourceConfig.bucket\n resolved.prefix = sourceConfig.prefix\n resolved.remotePath = this.buildRemotePath(sourceConfig)\n }\n\n this.sources.set(name, resolved)\n }\n }\n\n /**\n * Build remote path from source config\n */\n private buildRemotePath(source: FileSource): string {\n const protocol = source.type === 's3' ? 's3://' : source.type === 'r2' ? 'r2://' : 'gcs://'\n const bucket = source.bucket\n const prefix = source.prefix ? `/${source.prefix}` : ''\n return `${protocol}${bucket}${prefix}`\n }\n\n /**\n * Get all available file plugin sources\n *\n * @returns Array of resolved file sources\n */\n getAvailableSources(): ResolvedFileSource[] {\n return Array.from(this.sources.values())\n }\n\n /**\n * Resolve a source by name\n *\n * @param name - Source name (e.g., \"specs\", \"logs\")\n * @returns Resolved source or null if not found\n */\n resolveSource(name: string): ResolvedFileSource | null {\n return this.sources.get(name) || null\n }\n\n /**\n * Check if a path belongs to any file plugin source\n *\n * @param path - File path to check\n * @returns True if path matches any source's base_path\n */\n isFilePluginPath(path: string): boolean {\n return this.getSourceForPath(path) !== null\n }\n\n /**\n * Get the source for a given path\n *\n * Matches path against all source base_paths and returns the matching source.\n * Uses longest-match strategy if multiple sources match.\n *\n * @param path - File path to match\n * @returns Matching source or null\n */\n getSourceForPath(path: string): ResolvedFileSource | null {\n let bestMatch: ResolvedFileSource | null = null\n let bestMatchLength = 0\n\n for (const source of this.sources.values()) {\n // Normalize paths for comparison\n const normalizedPath = this.normalizePath(path)\n const normalizedBasePath = this.normalizePath(source.localPath)\n\n // Check if path starts with source's base_path\n if (normalizedPath.startsWith(normalizedBasePath)) {\n const matchLength = normalizedBasePath.length\n\n // Use longest match strategy\n if (matchLength > bestMatchLength) {\n bestMatch = source\n bestMatchLength = matchLength\n }\n }\n }\n\n return bestMatch\n }\n\n /**\n * Normalize path for comparison\n * - Remove leading \"./\" or \"/\"\n * - Remove trailing \"/\"\n * - Convert to lowercase for case-insensitive comparison\n */\n private normalizePath(path: string): string {\n return path\n .replace(/^\\.\\//, '')\n .replace(/^\\//, '')\n .replace(/\\/$/, '')\n .toLowerCase()\n }\n\n /**\n * Get source names\n *\n * @returns Array of source names\n */\n getSourceNames(): string[] {\n return Array.from(this.sources.keys())\n }\n\n /**\n * Check if sources are configured\n *\n * @returns True if any file plugin sources are configured\n */\n hasSources(): boolean {\n return this.sources.size > 0\n }\n}\n","/**\n * Storage-related error classes\n */\n\n/**\n * Options for FilePluginFileNotFoundError\n */\nexport interface FilePluginFileNotFoundErrorOptions {\n /** Whether to include cloud storage suggestions (default: true) */\n includeCloudSuggestions?: boolean\n /** Cloud storage type (e.g., 's3', 'r2', 'gcs') */\n storageType?: string\n}\n\n/**\n * Error thrown when a file is not found in file plugin storage\n */\nexport class FilePluginFileNotFoundError extends Error {\n constructor(\n public readonly filePath: string,\n public readonly sourceName: string,\n options?: FilePluginFileNotFoundErrorOptions\n ) {\n const includeCloudSuggestions = options?.includeCloudSuggestions !== false\n const storageType = options?.storageType\n\n let message = `File not found: ${filePath}\\n\\n`\n\n if (includeCloudSuggestions) {\n if (storageType) {\n message += `This file may be in cloud storage (${storageType}).\\n\\n`\n } else {\n message += `This file may not have been synced from remote storage yet.\\n`\n }\n message += `To fetch from cloud storage, run:\\n`\n message += ` file pull ${sourceName}\\n\\n`\n message += `Or sync all sources:\\n`\n message += ` file sync`\n } else {\n message += `Please ensure the file exists locally or pull it from cloud storage.`\n }\n\n super(message)\n this.name = 'FilePluginFileNotFoundError'\n\n // Maintain proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FilePluginFileNotFoundError)\n }\n }\n}\n","/**\n * File plugin storage provider\n *\n * Provides storage integration with the file plugin (Fractary Core)\n * for current project artifact access. Reads directly from local filesystem\n * without caching for optimal freshness during active development.\n *\n * Based on SPEC-20260115: Codex-File Plugin Integration\n */\n\nimport * as fs from 'fs/promises'\nimport * as path from 'path'\nimport type { StorageProvider, FetchResult, FetchOptions } from './provider.js'\nimport type { ResolvedReference } from '../references/index.js'\nimport type { UnifiedConfig } from '../schemas/config.js'\nimport { FileSourceResolver, type ResolvedFileSource } from '../file-integration/index.js'\nimport { FilePluginFileNotFoundError } from './errors.js'\n\n/**\n * File plugin storage configuration\n */\nexport interface FilePluginStorageOptions {\n /** Unified configuration */\n config: UnifiedConfig\n /** Enable S3 fallback suggestions */\n enableS3Fallback?: boolean\n /** Base directory for resolving relative paths */\n baseDir?: string\n}\n\n/**\n * File plugin storage provider\n *\n * Handles file reads for current project file plugin sources.\n * Does NOT cache results - always reads fresh from disk.\n */\nexport class FilePluginStorage implements StorageProvider {\n readonly name = 'file-plugin'\n readonly type = 'local' as const // Reuse local type for compatibility\n\n private sourceResolver: FileSourceResolver\n private baseDir: string\n\n constructor(private options: FilePluginStorageOptions) {\n this.sourceResolver = new FileSourceResolver(options.config)\n this.baseDir = options.baseDir || process.cwd()\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * Only handles:\n * - Current project references\n * - With sourceType === 'file-plugin'\n *\n * @param reference - Resolved reference\n * @returns True if this provider can handle the reference\n */\n canHandle(reference: ResolvedReference): boolean {\n return reference.isCurrentProject && reference.sourceType === 'file-plugin'\n }\n\n /**\n * Fetch content for a reference\n *\n * Reads from local filesystem based on the resolved local path.\n * If file not found and S3 fallback is enabled, throws helpful error.\n *\n * @param reference - Resolved reference\n * @param options - Fetch options (unused for local reads)\n * @returns Fetch result with content\n */\n async fetch(reference: ResolvedReference, _options?: FetchOptions): Promise<FetchResult> {\n if (!reference.localPath) {\n throw new Error(`File plugin reference missing localPath: ${reference.uri}`)\n }\n\n if (!reference.filePluginSource) {\n throw new Error(`File plugin reference missing source name: ${reference.uri}`)\n }\n\n // Resolve absolute path and validate against path traversal\n const absolutePath = path.isAbsolute(reference.localPath)\n ? path.resolve(reference.localPath)\n : path.resolve(this.baseDir, reference.localPath)\n\n // Security: Validate that resolved path stays within allowed directory\n const source = this.sourceResolver.resolveSource(reference.filePluginSource)\n if (source) {\n const allowedDir = path.resolve(this.baseDir, source.localPath)\n if (!absolutePath.startsWith(allowedDir + path.sep) && absolutePath !== allowedDir) {\n throw new Error(\n `Path traversal detected: ${reference.localPath} resolves outside allowed directory ${source.localPath}`\n )\n }\n }\n\n try {\n // Read file content\n const content = await fs.readFile(absolutePath)\n\n // Detect content type from extension\n const contentType = this.detectContentType(absolutePath)\n\n return {\n content,\n contentType,\n size: content.length,\n source: 'file-plugin',\n metadata: {\n filePluginSource: reference.filePluginSource,\n localPath: absolutePath,\n },\n }\n } catch (error) {\n // File not found - provide helpful error message\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n const source = this.sourceResolver.resolveSource(reference.filePluginSource)\n throw this.createFileNotFoundError(reference, source)\n }\n\n // Other errors - rethrow\n throw error\n }\n }\n\n /**\n * Check if a reference exists\n *\n * @param reference - Resolved reference\n * @param options - Fetch options (unused)\n * @returns True if file exists\n */\n async exists(reference: ResolvedReference, _options?: FetchOptions): Promise<boolean> {\n if (!reference.localPath) {\n return false\n }\n\n // Resolve absolute path and validate against path traversal\n const absolutePath = path.isAbsolute(reference.localPath)\n ? path.resolve(reference.localPath)\n : path.resolve(this.baseDir, reference.localPath)\n\n // Security: Validate that resolved path stays within allowed directory\n if (reference.filePluginSource) {\n const source = this.sourceResolver.resolveSource(reference.filePluginSource)\n if (source) {\n const allowedDir = path.resolve(this.baseDir, source.localPath)\n if (!absolutePath.startsWith(allowedDir + path.sep) && absolutePath !== allowedDir) {\n return false // Path traversal attempt - file doesn't \"exist\" from our perspective\n }\n }\n }\n\n try {\n await fs.access(absolutePath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Detect content type from file extension\n */\n private detectContentType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase()\n\n const mimeTypes: Record<string, string> = {\n '.md': 'text/markdown',\n '.txt': 'text/plain',\n '.json': 'application/json',\n '.yaml': 'text/yaml',\n '.yml': 'text/yaml',\n '.html': 'text/html',\n '.xml': 'application/xml',\n '.log': 'text/plain',\n '.js': 'application/javascript',\n '.ts': 'application/typescript',\n '.py': 'text/x-python',\n '.sh': 'application/x-sh',\n }\n\n return mimeTypes[ext] || 'application/octet-stream'\n }\n\n /**\n * Create a helpful error message when file is not found\n */\n private createFileNotFoundError(\n reference: ResolvedReference,\n source: ResolvedFileSource | null\n ): FilePluginFileNotFoundError {\n // Use the custom error class which includes helpful messages\n const includeCloudSuggestions = this.options.enableS3Fallback !== false\n const storageType = source?.config.type\n\n return new FilePluginFileNotFoundError(\n reference.localPath || reference.path || '',\n reference.filePluginSource || '',\n {\n includeCloudSuggestions,\n storageType,\n }\n )\n }\n}\n","/**\n * Safe command execution utility\n *\n * Uses execFile instead of exec to prevent shell injection.\n * Provides structured output with stdout, stderr, and status.\n */\n\nimport { execFile } from 'child_process'\nimport { promisify } from 'util'\n\nconst execFileAsync = promisify(execFile)\n\nexport interface ExecResult {\n stdout: string\n stderr: string\n exitCode: number\n}\n\n/**\n * Execute a command safely using execFile\n *\n * @param command - Command to execute (NOT a shell string)\n * @param args - Array of arguments\n * @param options - Options for execFile\n * @returns Promise with stdout, stderr, and exit code\n */\nexport async function execFileNoThrow(\n command: string,\n args: string[] = [],\n options?: {\n cwd?: string\n timeout?: number\n maxBuffer?: number\n env?: NodeJS.ProcessEnv\n }\n): Promise<ExecResult> {\n try {\n const { stdout, stderr } = await execFileAsync(command, args, {\n ...options,\n maxBuffer: options?.maxBuffer || 1024 * 1024 * 10, // 10MB default\n })\n\n return {\n stdout: stdout || '',\n stderr: stderr || '',\n exitCode: 0,\n }\n } catch (error: any) {\n // execFile throws on non-zero exit codes\n // error.code is a string (e.g., 'ENOENT'), error.exitCode is the numeric exit code\n const exitCode = typeof error.exitCode === 'number' ? error.exitCode : 1\n\n return {\n stdout: error.stdout || '',\n stderr: error.stderr || error.message || '',\n exitCode,\n }\n }\n}\n","/**\n * S3 Archive storage provider\n *\n * Fetches archived content from S3 using fractary-file CLI.\n * Provides transparent fallback for documents that have been archived.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\nimport { execFileNoThrow } from '../utils/execFileNoThrow.js'\n\n/**\n * Archive configuration for a project\n */\nexport interface ArchiveProjectConfig {\n enabled: boolean\n handler: 's3' | 'r2' | 'gcs' | 'local'\n bucket?: string\n prefix?: string\n patterns?: string[]\n}\n\n/**\n * Options for creating an S3ArchiveStorage provider\n */\nexport interface S3ArchiveStorageOptions {\n /** Archive configurations per project (key: \"org/project\") */\n projects?: Record<string, ArchiveProjectConfig>\n /** Path to fractary CLI (default: 'fractary') */\n fractaryCli?: string\n}\n\n/**\n * S3 Archive storage provider\n *\n * Handles fetching archived content from S3 via fractary-file CLI.\n * Only activates for current project files that match archive config.\n */\nexport class S3ArchiveStorage implements StorageProvider {\n readonly name = 's3-archive'\n readonly type = 's3-archive' as const\n\n private projects: Record<string, ArchiveProjectConfig>\n private fractaryCli: string\n\n constructor(options: S3ArchiveStorageOptions = {}) {\n this.projects = options.projects || {}\n this.fractaryCli = options.fractaryCli || 'fractary'\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * S3 Archive provider handles references that:\n * 1. Are for the current project (same org/project)\n * 2. Have archive enabled in config\n * 3. Match configured patterns (if specified)\n */\n canHandle(reference: ResolvedReference): boolean {\n // Only handle current project files\n if (!reference.isCurrentProject) {\n return false\n }\n\n // Get archive config for this project\n const projectKey = `${reference.org}/${reference.project}`\n const config = this.projects[projectKey]\n\n // Check if archive is enabled\n if (!config || !config.enabled) {\n return false\n }\n\n // Check patterns if specified\n if (config.patterns && config.patterns.length > 0) {\n return this.matchesPatterns(reference.path, config.patterns)\n }\n\n // No patterns = handle all files\n return true\n }\n\n /**\n * Fetch content from S3 archive via fractary-file CLI\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const projectKey = `${reference.org}/${reference.project}`\n const config = this.projects[projectKey]\n\n if (!config) {\n throw new Error(`No archive config for project: ${projectKey}`)\n }\n\n // Calculate archive path with project config\n const archivePath = this.calculateArchivePath(reference, config)\n\n // Call fractary-file CLI to read from archive\n try {\n const result = await execFileNoThrow(\n this.fractaryCli,\n [\n 'file',\n 'read',\n '--remote-path',\n archivePath,\n '--handler',\n config.handler,\n ...(config.bucket ? ['--bucket', config.bucket] : []),\n ],\n {\n timeout: opts.timeout,\n }\n )\n\n if (result.exitCode !== 0) {\n throw new Error(`fractary-file read failed: ${result.stderr}`)\n }\n\n const content = Buffer.from(result.stdout)\n\n return {\n content,\n contentType: detectContentType(reference.path),\n size: content.length,\n source: 's3-archive',\n metadata: {\n archivePath,\n bucket: config.bucket,\n handler: config.handler,\n },\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to fetch from archive: ${message}`)\n }\n }\n\n /**\n * Check if archived file exists\n *\n * Note: This currently downloads the file to check existence.\n * TODO: Optimize by using fractary-file 'stat' or 'head' command when available\n * to avoid downloading full file for existence checks.\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n const projectKey = `${reference.org}/${reference.project}`\n const config = this.projects[projectKey]\n\n if (!config) {\n return false\n }\n\n try {\n // Use fetch with minimal options for existence check\n // Note: This still downloads the file - requires fractary-file enhancement for true optimization\n await this.fetch(reference, { ...options, timeout: 5000 })\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Calculate archive path from reference\n *\n * Pattern: {prefix}/{type}/{org}/{project}/{original-path}\n *\n * Examples (with default prefix \"archive/\"):\n * specs/WORK-123.md → archive/specs/org/project/specs/WORK-123.md\n * docs/api.md → archive/docs/org/project/docs/api.md\n *\n * Examples (with custom prefix \"archived-docs/\"):\n * specs/WORK-123.md → archived-docs/specs/org/project/specs/WORK-123.md\n */\n private calculateArchivePath(reference: ResolvedReference, config: ArchiveProjectConfig): string {\n const type = this.detectType(reference.path)\n const prefix = config.prefix || 'archive/'\n\n // Validate prefix is not empty or whitespace-only\n const trimmedPrefix = prefix.trim()\n if (!trimmedPrefix) {\n throw new Error('Archive prefix cannot be empty or whitespace-only')\n }\n\n // Ensure prefix ends with / for consistent path construction\n const normalizedPrefix = trimmedPrefix.endsWith('/') ? trimmedPrefix : `${trimmedPrefix}/`\n\n return `${normalizedPrefix}${type}/${reference.org}/${reference.project}/${reference.path}`\n }\n\n /**\n * Detect artifact type from path\n *\n * Used to organize archives by type\n */\n private detectType(path: string): string {\n if (path.startsWith('specs/')) return 'specs'\n if (path.startsWith('docs/')) return 'docs'\n if (path.includes('/logs/')) return 'logs'\n return 'misc'\n }\n\n /**\n * Check if path matches any of the patterns\n *\n * Supports glob-style patterns:\n * - specs/** (all files in specs/)\n * - *.md (all markdown files)\n * - docs/*.md (markdown files in docs/)\n */\n private matchesPatterns(path: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n if (this.matchesPattern(path, pattern)) {\n return true\n }\n }\n return false\n }\n\n /**\n * Check if path matches a single pattern\n */\n private matchesPattern(path: string, pattern: string): boolean {\n // Convert glob pattern to regex using placeholder approach\n // to prevent ** replacement from being affected by * replacement\n\n // Step 1: Protect ** with placeholder\n const DOUBLE_STAR = '\\x00DOUBLE_STAR\\x00'\n let regexPattern = pattern.replace(/\\*\\*/g, DOUBLE_STAR)\n\n // Step 2: Escape regex special chars (except our placeholder and glob chars * ?)\n // Escape: . [ ] ( ) { } + ^ $ | \\\n regexPattern = regexPattern.replace(/[.[\\](){}+^$|\\\\]/g, '\\\\$&')\n\n // Step 3: Replace single * and ?\n regexPattern = regexPattern\n .replace(/\\*/g, '[^/]*')\n .replace(/\\?/g, '[^/]')\n\n // Step 4: Replace placeholder with final regex\n regexPattern = regexPattern.replace(new RegExp(DOUBLE_STAR, 'g'), '.*')\n\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(path)\n }\n}\n","/**\n * Storage manager\n *\n * Coordinates multiple storage providers and handles fallback logic.\n * The manager tries providers in priority order until one succeeds.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport { type StorageProvider, type FetchResult, type FetchOptions, type StorageProviderType } from './provider.js'\nimport { LocalStorage, type LocalStorageOptions } from './local.js'\nimport { GitHubStorage, type GitHubStorageOptions } from './github.js'\nimport { HttpStorage, type HttpStorageOptions } from './http.js'\nimport { S3ArchiveStorage, type S3ArchiveStorageOptions } from './s3-archive.js'\nimport { FilePluginStorage, type FilePluginStorageOptions } from './file-plugin.js'\nimport type { CodexConfig } from '../schemas/config.js'\n\n/**\n * Storage manager configuration\n */\nexport interface StorageManagerConfig {\n /** Local storage options */\n local?: LocalStorageOptions\n /** GitHub storage options */\n github?: GitHubStorageOptions\n /** HTTP storage options */\n http?: HttpStorageOptions\n /** S3 Archive storage options */\n s3Archive?: S3ArchiveStorageOptions\n /** File plugin storage options */\n filePlugin?: FilePluginStorageOptions\n /** Provider priority order */\n priority?: StorageProviderType[]\n /** Whether to enable caching (handled by cache layer, not storage) */\n enableCaching?: boolean\n /** Full codex configuration (for auth and remotes) */\n codexConfig?: CodexConfig\n}\n\n/**\n * Storage manager\n *\n * Manages multiple storage providers and routes fetch requests\n * to the appropriate provider based on reference type and availability.\n */\nexport class StorageManager {\n private providers: Map<StorageProviderType, StorageProvider> = new Map()\n private priority: StorageProviderType[]\n private codexConfig?: CodexConfig\n\n constructor(config: StorageManagerConfig = {}) {\n // Store codex config for auth resolution\n this.codexConfig = config.codexConfig\n\n // Initialize default providers\n this.providers.set('local', new LocalStorage(config.local))\n this.providers.set('github', new GitHubStorage(config.github))\n this.providers.set('http', new HttpStorage(config.http))\n\n // Initialize S3 Archive provider if configured\n if (config.s3Archive) {\n this.providers.set('s3-archive', new S3ArchiveStorage(config.s3Archive))\n }\n\n // Initialize File Plugin provider if configured\n if (config.filePlugin) {\n this.providers.set('file-plugin', new FilePluginStorage(config.filePlugin))\n }\n\n // Set priority order\n // file-plugin first (current project, no cache)\n // then local, s3-archive, github, http\n this.priority =\n config.priority ||\n (config.filePlugin && config.s3Archive\n ? ['file-plugin', 'local', 's3-archive', 'github', 'http']\n : config.filePlugin\n ? ['file-plugin', 'local', 'github', 'http']\n : config.s3Archive\n ? ['local', 's3-archive', 'github', 'http']\n : ['local', 'github', 'http'])\n }\n\n /**\n * Resolve a token value, expanding ${VAR} references to environment variables\n */\n private resolveTokenValue(token: string): string | undefined {\n // Check for ${VAR} syntax\n const envVarMatch = token.match(/^\\$\\{([^}]+)\\}$/)\n if (envVarMatch && envVarMatch[1]) {\n const envVarName = envVarMatch[1]\n return process.env[envVarName]\n }\n // Direct token value\n return token\n }\n\n /**\n * Resolve authentication token for a reference\n *\n * Looks up remote-specific authentication or falls back to default\n */\n private resolveToken(reference: ResolvedReference): string | undefined {\n if (!this.codexConfig) {\n return undefined\n }\n\n // Build remote key: org/project\n const remoteKey = `${reference.org}/${reference.project}`\n\n // Check for remote-specific auth\n if (this.codexConfig.remotes?.[remoteKey]?.token) {\n const token = this.resolveTokenValue(this.codexConfig.remotes[remoteKey].token)\n if (token) {\n return token\n }\n }\n\n // Fall back to default GitHub auth\n const defaultTokenEnv = this.codexConfig.auth?.github?.default_token_env || 'GITHUB_TOKEN'\n return process.env[defaultTokenEnv]\n }\n\n /**\n * Resolve fetch options with authentication\n *\n * Merges reference-specific authentication with provided options\n */\n private resolveFetchOptions(reference: ResolvedReference, options?: FetchOptions): FetchOptions {\n const token = this.resolveToken(reference)\n\n return {\n ...options,\n token: options?.token || token, // Explicit option overrides resolved token\n }\n }\n\n /**\n * Register a custom storage provider\n */\n registerProvider(provider: StorageProvider): void {\n this.providers.set(provider.type, provider)\n }\n\n /**\n * Remove a storage provider\n */\n removeProvider(type: StorageProviderType): boolean {\n return this.providers.delete(type)\n }\n\n /**\n * Get a provider by type\n */\n getProvider(type: StorageProviderType): StorageProvider | undefined {\n return this.providers.get(type)\n }\n\n /**\n * Get all registered providers\n */\n getProviders(): StorageProvider[] {\n return Array.from(this.providers.values())\n }\n\n /**\n * Find the best provider for a reference\n */\n findProvider(reference: ResolvedReference): StorageProvider | null {\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (provider && provider.canHandle(reference)) {\n return provider\n }\n }\n return null\n }\n\n /**\n * Fetch content for a reference\n *\n * Tries providers in priority order until one succeeds.\n * Automatically resolves authentication based on remote configuration.\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n // Resolve authentication options\n const resolvedOptions = this.resolveFetchOptions(reference, options)\n const errors: Error[] = []\n\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (!provider || !provider.canHandle(reference)) {\n continue\n }\n\n try {\n return await provider.fetch(reference, resolvedOptions)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n // Continue to next provider\n }\n }\n\n // All providers failed\n if (errors.length === 0) {\n throw new Error(`No provider can handle reference: ${reference.uri}`)\n }\n\n // Throw the first error with context about other failures\n const firstError = errors[0]\n if (firstError) {\n if (errors.length > 1) {\n throw new Error(`All providers failed for ${reference.uri}. First error: ${firstError.message}`)\n }\n throw firstError\n }\n\n throw new Error(`Unknown error fetching ${reference.uri}`)\n }\n\n /**\n * Check if content exists for a reference\n *\n * Returns true if any provider reports the content exists.\n * Automatically resolves authentication based on remote configuration.\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n // Resolve authentication options\n const resolvedOptions = this.resolveFetchOptions(reference, options)\n\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (!provider || !provider.canHandle(reference)) {\n continue\n }\n\n try {\n if (await provider.exists(reference, resolvedOptions)) {\n return true\n }\n } catch {\n // Continue to next provider\n }\n }\n\n return false\n }\n\n /**\n * Fetch content using a specific provider\n */\n async fetchWith(\n type: StorageProviderType,\n reference: ResolvedReference,\n options?: FetchOptions\n ): Promise<FetchResult> {\n const provider = this.providers.get(type)\n if (!provider) {\n throw new Error(`Provider not found: ${type}`)\n }\n\n return provider.fetch(reference, options)\n }\n\n /**\n * Fetch multiple references in parallel\n *\n * Automatically resolves authentication for each reference based on dependency configuration.\n */\n async fetchMany(\n references: ResolvedReference[],\n options?: FetchOptions\n ): Promise<Map<string, FetchResult | Error>> {\n const results = new Map<string, FetchResult | Error>()\n\n const promises = references.map(async (ref) => {\n try {\n // Each reference gets its own resolved options\n const result = await this.fetch(ref, options)\n results.set(ref.uri, result)\n } catch (error) {\n results.set(ref.uri, error instanceof Error ? error : new Error(String(error)))\n }\n })\n\n await Promise.all(promises)\n return results\n }\n\n /**\n * Get provider status (for diagnostics)\n */\n getStatus(): Array<{\n type: StorageProviderType\n name: string\n priority: number\n }> {\n return this.priority.map((type, index) => {\n const provider = this.providers.get(type)\n return {\n type,\n name: provider?.name || type,\n priority: index,\n }\n })\n }\n}\n\n/**\n * Create a storage manager with default configuration\n */\nexport function createStorageManager(config?: StorageManagerConfig): StorageManager {\n return new StorageManager(config)\n}\n\n/**\n * Default storage manager instance\n */\nlet defaultManager: StorageManager | null = null\n\n/**\n * Get the default storage manager\n */\nexport function getDefaultStorageManager(): StorageManager {\n if (!defaultManager) {\n defaultManager = createStorageManager()\n }\n return defaultManager\n}\n\n/**\n * Set the default storage manager\n */\nexport function setDefaultStorageManager(manager: StorageManager): void {\n defaultManager = manager\n}\n","/**\n * Cache entry types and utilities\n *\n * Defines the structure of cache entries with metadata for\n * TTL management, freshness checking, and content versioning.\n */\n\nimport type { FetchResult } from '../storage/provider.js'\n\n/**\n * Cache entry status\n */\nexport type CacheEntryStatus = 'fresh' | 'stale' | 'expired'\n\n/**\n * Cache entry metadata\n */\nexport interface CacheEntryMetadata {\n /** Original URI */\n uri: string\n /** When the entry was cached */\n cachedAt: number\n /** When the entry expires (timestamp) */\n expiresAt: number\n /** TTL in seconds */\n ttl: number\n /** ETag for conditional requests */\n etag?: string\n /** Last-Modified header value */\n lastModified?: string\n /** Content hash for change detection */\n contentHash: string\n /** Size in bytes */\n size: number\n /** Content type */\n contentType: string\n /** Source provider that fetched the content */\n source: string\n /** Number of times this entry has been accessed */\n accessCount: number\n /** Last access timestamp */\n lastAccessedAt: number\n /** Custom metadata from provider */\n providerMetadata?: Record<string, unknown>\n}\n\n/**\n * Cache entry with content and metadata\n */\nexport interface CacheEntry {\n /** Entry metadata */\n metadata: CacheEntryMetadata\n /** Cached content */\n content: Buffer\n}\n\n/**\n * Serializable cache entry for persistence\n */\nexport interface SerializedCacheEntry {\n /** Entry metadata */\n metadata: CacheEntryMetadata\n /** Content as base64 string */\n content: string\n}\n\n/**\n * Calculate a simple hash for content\n *\n * Uses a fast, non-cryptographic hash suitable for change detection.\n */\nexport function calculateContentHash(content: Buffer): string {\n // Simple FNV-1a hash for speed\n let hash = 2166136261\n for (let i = 0; i < content.length; i++) {\n hash ^= content[i] ?? 0\n hash = Math.imul(hash, 16777619)\n }\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n\n/**\n * Create a new cache entry from fetch result\n */\nexport function createCacheEntry(uri: string, result: FetchResult, ttl: number): CacheEntry {\n const now = Date.now()\n\n const metadata: CacheEntryMetadata = {\n uri,\n cachedAt: now,\n expiresAt: now + ttl * 1000,\n ttl,\n contentHash: calculateContentHash(result.content),\n size: result.size,\n contentType: result.contentType,\n source: result.source,\n accessCount: 1,\n lastAccessedAt: now,\n providerMetadata: result.metadata,\n }\n\n // Extract ETag and Last-Modified from provider metadata if available\n if (result.metadata?.etag && typeof result.metadata.etag === 'string') {\n metadata.etag = result.metadata.etag\n }\n if (result.metadata?.lastModified && typeof result.metadata.lastModified === 'string') {\n metadata.lastModified = result.metadata.lastModified\n }\n\n return {\n metadata,\n content: result.content,\n }\n}\n\n/**\n * Get the status of a cache entry\n */\nexport function getCacheEntryStatus(entry: CacheEntry): CacheEntryStatus {\n const now = Date.now()\n\n if (now < entry.metadata.expiresAt) {\n return 'fresh'\n }\n\n // Consider stale for up to 5 minutes past expiry\n const staleWindow = 5 * 60 * 1000\n if (now < entry.metadata.expiresAt + staleWindow) {\n return 'stale'\n }\n\n return 'expired'\n}\n\n/**\n * Check if entry is still valid (fresh or stale)\n */\nexport function isCacheEntryValid(entry: CacheEntry): boolean {\n const status = getCacheEntryStatus(entry)\n return status === 'fresh' || status === 'stale'\n}\n\n/**\n * Check if entry is fresh (not expired)\n */\nexport function isCacheEntryFresh(entry: CacheEntry): boolean {\n return getCacheEntryStatus(entry) === 'fresh'\n}\n\n/**\n * Update entry access statistics\n */\nexport function touchCacheEntry(entry: CacheEntry): void {\n entry.metadata.accessCount++\n entry.metadata.lastAccessedAt = Date.now()\n}\n\n/**\n * Serialize cache entry for persistence\n */\nexport function serializeCacheEntry(entry: CacheEntry): SerializedCacheEntry {\n return {\n metadata: entry.metadata,\n content: entry.content.toString('base64'),\n }\n}\n\n/**\n * Deserialize cache entry from persistence\n */\nexport function deserializeCacheEntry(serialized: SerializedCacheEntry): CacheEntry {\n return {\n metadata: serialized.metadata,\n content: Buffer.from(serialized.content, 'base64'),\n }\n}\n\n/**\n * Calculate remaining TTL in seconds\n */\nexport function getRemainingTtl(entry: CacheEntry): number {\n const remaining = entry.metadata.expiresAt - Date.now()\n return Math.max(0, Math.floor(remaining / 1000))\n}\n\n/**\n * Check if content has changed based on hash\n */\nexport function hasContentChanged(entry: CacheEntry, newContent: Buffer): boolean {\n return entry.metadata.contentHash !== calculateContentHash(newContent)\n}\n\n/**\n * Get entry age in seconds\n */\nexport function getCacheEntryAge(entry: CacheEntry): number {\n return Math.floor((Date.now() - entry.metadata.cachedAt) / 1000)\n}\n","/**\n * Cache persistence layer\n *\n * Handles reading and writing cache entries to disk with\n * atomic writes and corruption detection.\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { CacheEntry } from './entry.js'\n\n/**\n * Options for cache persistence\n */\nexport interface CachePersistenceOptions {\n /** Base directory for cache storage */\n cacheDir: string\n /** File extension for cache files */\n extension?: string\n /** Whether to use atomic writes */\n atomicWrites?: boolean\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /** Total number of entries */\n entryCount: number\n /** Total size in bytes */\n totalSize: number\n /** Number of fresh entries */\n freshCount: number\n /** Number of stale entries */\n staleCount: number\n /** Number of expired entries */\n expiredCount: number\n}\n\n/**\n * Cache persistence layer\n *\n * Handles reading and writing cache entries to the filesystem.\n * Uses a directory structure: {cacheDir}/{org}/{project}/{path}.cache\n */\nexport class CachePersistence {\n private cacheDir: string\n private extension: string\n private atomicWrites: boolean\n\n constructor(options: CachePersistenceOptions) {\n this.cacheDir = options.cacheDir\n this.extension = options.extension || '.cache'\n this.atomicWrites = options.atomicWrites ?? true\n }\n\n /**\n * Get the cache file path for a URI\n */\n getCachePath(uri: string): string {\n // Parse the URI to extract org/project/path\n const match = uri.match(/^codex:\\/\\/([^/]+)\\/([^/]+)(?:\\/(.*))?$/)\n if (!match || !match[1] || !match[2]) {\n throw new Error(`Invalid codex URI: ${uri}`)\n }\n\n const [, org, project, filePath] = match\n const relativePath = filePath || 'index'\n\n return path.join(this.cacheDir, org, project, relativePath + this.extension)\n }\n\n /**\n * Get the metadata file path for a URI\n */\n getMetadataPath(uri: string): string {\n return this.getCachePath(uri).replace(this.extension, '.meta.json')\n }\n\n /**\n * Read a cache entry from disk\n */\n async read(uri: string): Promise<CacheEntry | null> {\n const cachePath = this.getCachePath(uri)\n const metadataPath = this.getMetadataPath(uri)\n\n try {\n // Read metadata and content in parallel\n const [metadataJson, content] = await Promise.all([\n fs.readFile(metadataPath, 'utf-8'),\n fs.readFile(cachePath),\n ])\n\n const metadata = JSON.parse(metadataJson)\n return {\n metadata,\n content,\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null\n }\n throw error\n }\n }\n\n /**\n * Write a cache entry to disk\n */\n async write(entry: CacheEntry): Promise<void> {\n const cachePath = this.getCachePath(entry.metadata.uri)\n const metadataPath = this.getMetadataPath(entry.metadata.uri)\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(cachePath), { recursive: true })\n\n if (this.atomicWrites) {\n // Write to temp files first, then rename\n const tempCachePath = cachePath + '.tmp'\n const tempMetadataPath = metadataPath + '.tmp'\n\n try {\n await Promise.all([\n fs.writeFile(tempCachePath, entry.content),\n fs.writeFile(tempMetadataPath, JSON.stringify(entry.metadata, null, 2)),\n ])\n\n await Promise.all([\n fs.rename(tempCachePath, cachePath),\n fs.rename(tempMetadataPath, metadataPath),\n ])\n } catch (error) {\n // Clean up temp files on error\n await Promise.all([\n fs.unlink(tempCachePath).catch(() => {}),\n fs.unlink(tempMetadataPath).catch(() => {}),\n ])\n throw error\n }\n } else {\n await Promise.all([\n fs.writeFile(cachePath, entry.content),\n fs.writeFile(metadataPath, JSON.stringify(entry.metadata, null, 2)),\n ])\n }\n }\n\n /**\n * Delete a cache entry\n */\n async delete(uri: string): Promise<boolean> {\n const cachePath = this.getCachePath(uri)\n const metadataPath = this.getMetadataPath(uri)\n\n try {\n await Promise.all([fs.unlink(cachePath), fs.unlink(metadataPath)])\n return true\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return false\n }\n throw error\n }\n }\n\n /**\n * Check if a cache entry exists\n */\n async exists(uri: string): Promise<boolean> {\n const cachePath = this.getCachePath(uri)\n\n try {\n await fs.access(cachePath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * List all cached URIs\n */\n async list(): Promise<string[]> {\n const uris: string[] = []\n\n try {\n const orgs = await fs.readdir(this.cacheDir)\n\n for (const org of orgs) {\n const orgPath = path.join(this.cacheDir, org)\n const orgStat = await fs.stat(orgPath)\n if (!orgStat.isDirectory()) continue\n\n const projects = await fs.readdir(orgPath)\n\n for (const project of projects) {\n const projectPath = path.join(orgPath, project)\n const projectStat = await fs.stat(projectPath)\n if (!projectStat.isDirectory()) continue\n\n // Recursively find all cache files\n const files = await this.listFilesRecursive(projectPath)\n\n for (const file of files) {\n if (file.endsWith(this.extension)) {\n // Convert path back to URI\n const relativePath = path.relative(projectPath, file)\n const filePath = relativePath.slice(0, -this.extension.length)\n uris.push(`codex://${org}/${project}/${filePath}`)\n }\n }\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return []\n }\n throw error\n }\n\n return uris\n }\n\n /**\n * Recursively list files in a directory\n */\n private async listFilesRecursive(dir: string): Promise<string[]> {\n const files: string[] = []\n const entries = await fs.readdir(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n files.push(...(await this.listFilesRecursive(fullPath)))\n } else if (entry.isFile()) {\n files.push(fullPath)\n }\n }\n\n return files\n }\n\n /**\n * Clear all cache entries\n */\n async clear(): Promise<number> {\n let count = 0\n\n try {\n const orgs = await fs.readdir(this.cacheDir)\n\n for (const org of orgs) {\n const orgPath = path.join(this.cacheDir, org)\n const stat = await fs.stat(orgPath)\n if (stat.isDirectory()) {\n await fs.rm(orgPath, { recursive: true })\n count++\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error\n }\n }\n\n return count\n }\n\n /**\n * Clear expired entries\n */\n async clearExpired(): Promise<number> {\n const uris = await this.list()\n let cleared = 0\n\n for (const uri of uris) {\n const entry = await this.read(uri)\n if (entry && entry.metadata.expiresAt < Date.now()) {\n if (await this.delete(uri)) {\n cleared++\n }\n }\n }\n\n return cleared\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats> {\n const stats: CacheStats = {\n entryCount: 0,\n totalSize: 0,\n freshCount: 0,\n staleCount: 0,\n expiredCount: 0,\n }\n\n const uris = await this.list()\n const now = Date.now()\n const staleWindow = 5 * 60 * 1000\n\n for (const uri of uris) {\n const entry = await this.read(uri)\n if (entry) {\n stats.entryCount++\n stats.totalSize += entry.metadata.size\n\n if (now < entry.metadata.expiresAt) {\n stats.freshCount++\n } else if (now < entry.metadata.expiresAt + staleWindow) {\n stats.staleCount++\n } else {\n stats.expiredCount++\n }\n }\n }\n\n return stats\n }\n\n /**\n * Ensure cache directory exists\n */\n async ensureDir(): Promise<void> {\n await fs.mkdir(this.cacheDir, { recursive: true })\n }\n\n /**\n * Get cache directory path\n */\n getCacheDir(): string {\n return this.cacheDir\n }\n}\n\n/**\n * Create a cache persistence layer\n */\nexport function createCachePersistence(options: CachePersistenceOptions): CachePersistence {\n return new CachePersistence(options)\n}\n","/**\n * Cache manager\n *\n * Multi-tier cache manager that coordinates in-memory caching,\n * disk persistence, and storage providers for optimal performance.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport type { StorageManager } from '../storage/manager.js'\nimport type { FetchOptions, FetchResult } from '../storage/provider.js'\nimport {\n type CacheEntry,\n type CacheEntryMetadata,\n createCacheEntry,\n getCacheEntryStatus,\n touchCacheEntry,\n isCacheEntryFresh,\n getRemainingTtl,\n} from './entry.js'\nimport { type CachePersistence, type CacheStats, createCachePersistence } from './persistence.js'\n\n/**\n * Cache manager configuration\n */\nexport interface CacheManagerConfig {\n /** Cache directory path */\n cacheDir: string\n /** Default TTL in seconds */\n defaultTtl?: number\n /** Maximum entries in memory cache */\n maxMemoryEntries?: number\n /** Maximum memory cache size in bytes */\n maxMemorySize?: number\n /** Whether to persist cache to disk */\n enablePersistence?: boolean\n /** Whether to use stale-while-revalidate pattern */\n staleWhileRevalidate?: boolean\n /** Background refresh threshold (seconds before expiry) */\n backgroundRefreshThreshold?: number\n}\n\n/**\n * Cache lookup result\n */\nexport interface CacheLookupResult {\n /** Cache entry if found */\n entry: CacheEntry | null\n /** Whether the entry was found */\n hit: boolean\n /** Whether the entry is fresh */\n fresh: boolean\n /** Source of the entry (memory, disk, network) */\n source: 'memory' | 'disk' | 'network' | 'none'\n}\n\n/**\n * Cache manager\n *\n * Provides a multi-tier caching system with:\n * - L1: In-memory cache (fast, limited size)\n * - L2: Disk persistence (larger, survives restarts)\n * - L3: Storage providers (network fetch)\n */\nexport class CacheManager {\n private memoryCache: Map<string, CacheEntry> = new Map()\n private persistence: CachePersistence | null\n private storage: StorageManager | null = null\n private config: Required<CacheManagerConfig>\n\n // LRU tracking\n private accessOrder: string[] = []\n\n // Background refresh tracking\n private refreshPromises: Map<string, Promise<CacheEntry | null>> = new Map()\n\n constructor(config: CacheManagerConfig) {\n this.config = {\n cacheDir: config.cacheDir,\n defaultTtl: config.defaultTtl ?? 3600, // 1 hour default\n maxMemoryEntries: config.maxMemoryEntries ?? 1000,\n maxMemorySize: config.maxMemorySize ?? 50 * 1024 * 1024, // 50MB\n enablePersistence: config.enablePersistence ?? true,\n staleWhileRevalidate: config.staleWhileRevalidate ?? true,\n backgroundRefreshThreshold: config.backgroundRefreshThreshold ?? 60, // 1 minute\n }\n\n this.persistence = this.config.enablePersistence\n ? createCachePersistence({ cacheDir: this.config.cacheDir })\n : null\n }\n\n /**\n * Set the storage manager for fetching\n */\n setStorageManager(storage: StorageManager): void {\n this.storage = storage\n }\n\n /**\n * Get content for a reference\n *\n * Implements cache-first strategy with stale-while-revalidate.\n *\n * EXCEPTION: File plugin sources (current project files) bypass cache entirely.\n * They are always read fresh from disk for optimal development experience.\n */\n async get(\n reference: ResolvedReference,\n options?: FetchOptions & { ttl?: number }\n ): Promise<FetchResult> {\n // Bypass cache for current project file plugin sources\n // These are read directly from disk for freshness\n if (reference.isCurrentProject && reference.sourceType === 'file-plugin') {\n if (!this.storage) {\n throw new Error('Storage manager not set')\n }\n return await this.storage.fetch(reference, options)\n }\n\n const ttl = options?.ttl ?? this.config.defaultTtl\n\n // Check memory cache\n let entry = this.memoryCache.get(reference.uri)\n\n // Check disk cache if not in memory\n if (!entry && this.persistence) {\n entry = await this.persistence.read(reference.uri) ?? undefined\n if (entry) {\n // Promote to memory cache\n this.setMemoryEntry(reference.uri, entry)\n }\n }\n\n if (entry) {\n const status = getCacheEntryStatus(entry)\n\n if (status === 'fresh') {\n touchCacheEntry(entry)\n return this.entryToResult(entry)\n }\n\n if (status === 'stale' && this.config.staleWhileRevalidate) {\n // Return stale content immediately\n touchCacheEntry(entry)\n const result = this.entryToResult(entry)\n\n // Trigger background refresh\n this.backgroundRefresh(reference, ttl, options)\n\n return result\n }\n }\n\n // Fetch from storage\n return this.fetchAndCache(reference, ttl, options)\n }\n\n /**\n * Check if content is cached\n */\n async has(uri: string): Promise<boolean> {\n if (this.memoryCache.has(uri)) {\n return true\n }\n\n if (this.persistence) {\n return this.persistence.exists(uri)\n }\n\n return false\n }\n\n /**\n * Get cache entry without fetching\n */\n async lookup(uri: string): Promise<CacheLookupResult> {\n // Check memory cache\n let entry = this.memoryCache.get(uri)\n if (entry) {\n return {\n entry,\n hit: true,\n fresh: isCacheEntryFresh(entry),\n source: 'memory',\n }\n }\n\n // Check disk cache\n if (this.persistence) {\n entry = await this.persistence.read(uri) ?? undefined\n if (entry) {\n this.setMemoryEntry(uri, entry)\n return {\n entry,\n hit: true,\n fresh: isCacheEntryFresh(entry),\n source: 'disk',\n }\n }\n }\n\n return {\n entry: null,\n hit: false,\n fresh: false,\n source: 'none',\n }\n }\n\n /**\n * Store content in cache\n */\n async set(uri: string, result: FetchResult, ttl?: number): Promise<CacheEntry> {\n const actualTtl = ttl ?? this.config.defaultTtl\n const entry = createCacheEntry(uri, result, actualTtl)\n\n // Store in memory\n this.setMemoryEntry(uri, entry)\n\n // Persist to disk\n if (this.persistence) {\n await this.persistence.write(entry)\n }\n\n return entry\n }\n\n /**\n * Invalidate a cache entry\n */\n async invalidate(uri: string): Promise<boolean> {\n let removed = false\n\n if (this.memoryCache.has(uri)) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n removed = true\n }\n\n if (this.persistence) {\n const diskRemoved = await this.persistence.delete(uri)\n removed = removed || diskRemoved\n }\n\n return removed\n }\n\n /**\n * Invalidate all entries matching a pattern\n */\n async invalidatePattern(pattern: RegExp): Promise<number> {\n let count = 0\n\n // Memory cache\n for (const uri of this.memoryCache.keys()) {\n if (pattern.test(uri)) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n count++\n }\n }\n\n // Disk cache\n if (this.persistence) {\n const uris = await this.persistence.list()\n for (const uri of uris) {\n if (pattern.test(uri)) {\n await this.persistence.delete(uri)\n count++\n }\n }\n }\n\n return count\n }\n\n /**\n * Clear all cache entries\n */\n async clear(): Promise<void> {\n this.memoryCache.clear()\n this.accessOrder = []\n\n if (this.persistence) {\n await this.persistence.clear()\n }\n }\n\n /**\n * Clear expired entries\n */\n async clearExpired(): Promise<number> {\n let count = 0\n const now = Date.now()\n\n // Memory cache\n for (const [uri, entry] of this.memoryCache) {\n if (entry.metadata.expiresAt < now) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n count++\n }\n }\n\n // Disk cache\n if (this.persistence) {\n count += await this.persistence.clearExpired()\n }\n\n return count\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats & { memoryEntries: number; memorySize: number }> {\n let diskStats: CacheStats = {\n entryCount: 0,\n totalSize: 0,\n freshCount: 0,\n staleCount: 0,\n expiredCount: 0,\n }\n\n if (this.persistence) {\n diskStats = await this.persistence.getStats()\n }\n\n // Calculate memory stats\n let memorySize = 0\n for (const entry of this.memoryCache.values()) {\n memorySize += entry.metadata.size\n }\n\n return {\n ...diskStats,\n memoryEntries: this.memoryCache.size,\n memorySize,\n }\n }\n\n /**\n * Preload content into cache\n */\n async preload(references: ResolvedReference[], options?: FetchOptions): Promise<void> {\n if (!this.storage) {\n throw new Error('Storage manager not set')\n }\n\n await Promise.all(\n references.map(async (ref) => {\n try {\n await this.get(ref, options)\n } catch {\n // Ignore preload errors\n }\n })\n )\n }\n\n /**\n * Get metadata for a cached entry\n */\n async getMetadata(uri: string): Promise<CacheEntryMetadata | null> {\n const result = await this.lookup(uri)\n return result.entry?.metadata ?? null\n }\n\n /**\n * Get remaining TTL for an entry\n */\n async getTtl(uri: string): Promise<number | null> {\n const result = await this.lookup(uri)\n if (result.entry) {\n return getRemainingTtl(result.entry)\n }\n return null\n }\n\n /**\n * Fetch content and store in cache\n *\n * EXCEPTION: File plugin sources are not cached (should not reach here,\n * but added as safety check).\n */\n private async fetchAndCache(\n reference: ResolvedReference,\n ttl: number,\n options?: FetchOptions\n ): Promise<FetchResult> {\n if (!this.storage) {\n throw new Error('Storage manager not set')\n }\n\n const result = await this.storage.fetch(reference, options)\n\n // Don't cache current project file plugin sources\n // They should always be read fresh from disk\n if (!(reference.isCurrentProject && reference.sourceType === 'file-plugin')) {\n await this.set(reference.uri, result, ttl)\n }\n\n return result\n }\n\n /**\n * Background refresh for stale-while-revalidate\n */\n private backgroundRefresh(\n reference: ResolvedReference,\n ttl: number,\n options?: FetchOptions\n ): void {\n const uri = reference.uri\n\n // Don't start multiple refreshes for the same URI\n if (this.refreshPromises.has(uri)) {\n return\n }\n\n const promise = this.fetchAndCache(reference, ttl, options)\n .then(() => {\n const entry = this.memoryCache.get(uri)\n return entry ?? null\n })\n .catch(() => null)\n .finally(() => {\n this.refreshPromises.delete(uri)\n })\n\n this.refreshPromises.set(uri, promise)\n }\n\n /**\n * Set entry in memory cache with LRU eviction\n */\n private setMemoryEntry(uri: string, entry: CacheEntry): void {\n // Remove from current position in access order\n this.removeFromAccessOrder(uri)\n\n // Add to end (most recently used)\n this.accessOrder.push(uri)\n this.memoryCache.set(uri, entry)\n\n // Evict if necessary\n this.evictIfNeeded()\n }\n\n /**\n * Evict entries if over limits\n */\n private evictIfNeeded(): void {\n // Check entry count\n while (this.memoryCache.size > this.config.maxMemoryEntries) {\n this.evictOldest()\n }\n\n // Check memory size\n let totalSize = 0\n for (const entry of this.memoryCache.values()) {\n totalSize += entry.metadata.size\n }\n\n while (totalSize > this.config.maxMemorySize && this.memoryCache.size > 0) {\n const evicted = this.evictOldest()\n if (evicted) {\n totalSize -= evicted.metadata.size\n } else {\n break\n }\n }\n }\n\n /**\n * Evict the oldest entry (LRU)\n */\n private evictOldest(): CacheEntry | null {\n if (this.accessOrder.length === 0) {\n return null\n }\n\n const oldest = this.accessOrder.shift()\n if (oldest) {\n const entry = this.memoryCache.get(oldest)\n this.memoryCache.delete(oldest)\n return entry ?? null\n }\n\n return null\n }\n\n /**\n * Remove URI from access order\n */\n private removeFromAccessOrder(uri: string): void {\n const index = this.accessOrder.indexOf(uri)\n if (index !== -1) {\n this.accessOrder.splice(index, 1)\n }\n }\n\n /**\n * Convert cache entry to fetch result\n */\n private entryToResult(entry: CacheEntry): FetchResult {\n return {\n content: entry.content,\n contentType: entry.metadata.contentType,\n size: entry.metadata.size,\n source: entry.metadata.source,\n metadata: entry.metadata.providerMetadata,\n }\n }\n}\n\n/**\n * Create a cache manager\n */\nexport function createCacheManager(config: CacheManagerConfig): CacheManager {\n return new CacheManager(config)\n}\n\n/**\n * Default cache manager instance\n */\nlet defaultCacheManager: CacheManager | null = null\n\n/**\n * Get the default cache manager\n */\nexport function getDefaultCacheManager(): CacheManager {\n if (!defaultCacheManager) {\n defaultCacheManager = createCacheManager({\n cacheDir: '.fractary/plugins/codex/cache',\n })\n }\n return defaultCacheManager\n}\n\n/**\n * Set the default cache manager\n */\nexport function setDefaultCacheManager(manager: CacheManager): void {\n defaultCacheManager = manager\n}\n","/**\n * Sync types\n *\n * Type definitions for the synchronization system.\n */\n\n/**\n * Sync direction\n */\nexport type SyncDirection = 'to-codex' | 'from-codex' | 'bidirectional'\n\n/**\n * Sync operation type\n */\nexport type SyncOperation = 'create' | 'update' | 'delete' | 'skip' | 'conflict'\n\n/**\n * File sync status\n */\nexport interface FileSyncStatus {\n /** File path relative to project root */\n path: string\n /** Operation to perform */\n operation: SyncOperation\n /** Size in bytes */\n size?: number\n /** Last modified timestamp */\n mtime?: number\n /** Content hash */\n hash?: string\n /** Reason for skip or conflict */\n reason?: string\n}\n\n/**\n * Sync manifest entry\n */\nexport interface SyncManifestEntry {\n /** File path */\n path: string\n /** Content hash */\n hash: string\n /** File size */\n size: number\n /** Last synced timestamp */\n syncedAt: number\n /** Source of last sync */\n source: 'local' | 'remote'\n}\n\n/**\n * Sync manifest\n *\n * Tracks the state of synced files.\n */\nexport interface SyncManifest {\n /** Manifest version */\n version: number\n /** Organization */\n org: string\n /** Project */\n project: string\n /** Last full sync timestamp */\n lastSync: number\n /** File entries */\n entries: Record<string, SyncManifestEntry>\n}\n\n/**\n * Sync plan\n *\n * A plan of operations to perform during sync.\n */\nexport interface SyncPlan {\n /** Direction of sync */\n direction: SyncDirection\n /** Source location */\n source: string\n /** Target location */\n target: string\n /** Files to sync */\n files: FileSyncStatus[]\n /** Total files to process */\n totalFiles: number\n /** Total bytes to transfer */\n totalBytes: number\n /** Estimated time in ms */\n estimatedTime?: number\n /** Conflicts that need resolution */\n conflicts: FileSyncStatus[]\n /** Files that will be skipped */\n skipped: FileSyncStatus[]\n}\n\n/**\n * Sync result\n */\nexport interface SyncResult {\n /** Whether sync completed successfully */\n success: boolean\n /** Plan that was executed */\n plan: SyncPlan\n /** Number of files synced */\n synced: number\n /** Number of files failed */\n failed: number\n /** Number of files skipped */\n skipped: number\n /** Errors encountered */\n errors: Array<{ path: string; error: string }>\n /** Duration in ms */\n duration: number\n /** Timestamp */\n timestamp: number\n}\n\n/**\n * Sync options\n */\nexport interface SyncOptions {\n /** Sync direction */\n direction?: SyncDirection\n /** Whether to perform a dry run */\n dryRun?: boolean\n /** Force overwrite on conflicts */\n force?: boolean\n /** Delete files not in source */\n delete?: boolean\n /** Patterns to include */\n include?: string[]\n /** Patterns to exclude */\n exclude?: string[]\n /** Maximum files to sync */\n maxFiles?: number\n /** Timeout in ms */\n timeout?: number\n /** Progress callback */\n onProgress?: (current: number, total: number, file: string) => void\n /**\n * Pre-matched source files (bypasses internal file scanning).\n * When provided, createPlan will use these files instead of scanning the sourceDir.\n * Useful when the caller has already performed glob matching.\n */\n sourceFiles?: Array<{ path: string; size: number; mtime: number; hash?: string }>\n}\n\n/**\n * Sync rule\n */\nexport interface SyncRule {\n /** Pattern to match */\n pattern: string\n /** Whether to include (true) or exclude (false) */\n include: boolean\n /** Priority (higher = evaluated first) */\n priority?: number\n /** Sync direction this rule applies to */\n direction?: SyncDirection\n}\n\n/**\n * Directional sync configuration (v0.7.0+)\n *\n * Provides explicit include/exclude patterns for a sync direction.\n */\nexport interface DirectionalSyncConfig {\n /** Patterns to include (required) */\n include: string[]\n /** Patterns to exclude (optional) */\n exclude?: string[]\n}\n\n/**\n * Routing configuration\n */\nexport interface RoutingConfig {\n /** Whether to use frontmatter-based routing (default: false in v0.7.0+) */\n use_frontmatter?: boolean\n}\n\n/**\n * Sync configuration\n */\nexport interface SyncConfig {\n /** Default sync direction */\n defaultDirection: SyncDirection\n /** Sync rules */\n rules: SyncRule[]\n /** Default patterns to exclude */\n defaultExcludes: string[]\n /** Whether to delete orphaned files */\n deleteOrphans: boolean\n /** Conflict resolution strategy */\n conflictStrategy: 'newest' | 'local' | 'remote' | 'manual'\n\n // New format (v0.7.0+) - Recommended\n /** Configuration for pulling from codex (new format) */\n from_codex?: DirectionalSyncConfig\n /** Configuration for pushing to codex (new format) */\n to_codex?: DirectionalSyncConfig\n /** Routing configuration */\n routing?: RoutingConfig\n\n // Legacy format (deprecated, backward compatible)\n /** @deprecated Use from_codex.include instead. Org-level defaults for pulling from codex */\n default_from_codex?: string[]\n /** @deprecated Use to_codex.include instead. Org-level defaults for pushing to codex */\n default_to_codex?: string[]\n /** @deprecated Use from_codex.exclude or to_codex.exclude instead. Global exclude patterns */\n exclude?: string[]\n}\n\n/**\n * Default sync configuration\n */\nexport const DEFAULT_SYNC_CONFIG: SyncConfig = {\n defaultDirection: 'to-codex',\n rules: [],\n defaultExcludes: [\n '**/node_modules/**',\n '**/.git/**',\n '**/.DS_Store',\n '**/Thumbs.db',\n '**/*.log',\n '**/.env*',\n '**/dist/**',\n '**/build/**',\n '**/coverage/**',\n ],\n deleteOrphans: false,\n conflictStrategy: 'newest',\n}\n","/**\n * Sync rule evaluator\n *\n * Evaluates sync rules to determine which files should be synced.\n */\n\nimport micromatch from 'micromatch'\nimport type { SyncRule, SyncDirection } from './types.js'\n\n/**\n * Evaluation result for a single file\n */\nexport interface EvaluationResult {\n /** File path */\n path: string\n /** Whether the file should be synced */\n shouldSync: boolean\n /** Matching rule (if any) */\n matchedRule?: SyncRule\n /** Reason for the decision */\n reason: string\n}\n\n/**\n * Evaluate a file path against sync rules\n *\n * @param path - File path to evaluate\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Evaluation result\n */\nexport function evaluatePath(\n path: string,\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): EvaluationResult {\n // First check default excludes\n for (const pattern of defaultExcludes) {\n if (micromatch.isMatch(path, pattern)) {\n return {\n path,\n shouldSync: false,\n reason: `Excluded by default pattern: ${pattern}`,\n }\n }\n }\n\n // Sort rules by priority (higher first)\n const sortedRules = [...rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n\n // Find first matching rule\n for (const rule of sortedRules) {\n // Skip rules that don't apply to this direction\n if (rule.direction && rule.direction !== direction) {\n continue\n }\n\n if (micromatch.isMatch(path, rule.pattern)) {\n return {\n path,\n shouldSync: rule.include,\n matchedRule: rule,\n reason: rule.include\n ? `Included by rule: ${rule.pattern}`\n : `Excluded by rule: ${rule.pattern}`,\n }\n }\n }\n\n // Default: include if no rule matches\n return {\n path,\n shouldSync: true,\n reason: 'No matching rule, included by default',\n }\n}\n\n/**\n * Evaluate multiple paths against sync rules\n *\n * @param paths - Array of file paths\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Map of path to evaluation result\n */\nexport function evaluatePaths(\n paths: string[],\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): Map<string, EvaluationResult> {\n const results = new Map<string, EvaluationResult>()\n\n for (const path of paths) {\n results.set(path, evaluatePath(path, rules, direction, defaultExcludes))\n }\n\n return results\n}\n\n/**\n * Filter paths to get only syncable files\n *\n * @param paths - Array of file paths\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Array of paths that should be synced\n */\nexport function filterSyncablePaths(\n paths: string[],\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): string[] {\n return paths.filter(\n (path) => evaluatePath(path, rules, direction, defaultExcludes).shouldSync\n )\n}\n\n/**\n * Create sync rules from patterns\n *\n * @param include - Patterns to include\n * @param exclude - Patterns to exclude\n * @returns Array of sync rules\n */\nexport function createRulesFromPatterns(\n include: string[] = [],\n exclude: string[] = []\n): SyncRule[] {\n const rules: SyncRule[] = []\n\n // Add exclude rules with higher priority\n for (const pattern of exclude) {\n rules.push({\n pattern,\n include: false,\n priority: 100,\n })\n }\n\n // Add include rules\n for (const pattern of include) {\n rules.push({\n pattern,\n include: true,\n priority: 50,\n })\n }\n\n return rules\n}\n\n/**\n * Merge multiple sets of rules\n *\n * @param ruleSets - Arrays of rules to merge\n * @returns Merged rules array\n */\nexport function mergeRules(...ruleSets: SyncRule[][]): SyncRule[] {\n return ruleSets.flat()\n}\n\n/**\n * Get summary of evaluation results\n */\nexport interface EvaluationSummary {\n total: number\n included: number\n excluded: number\n byReason: Record<string, number>\n}\n\n/**\n * Summarize evaluation results\n *\n * @param results - Evaluation results map\n * @returns Summary of results\n */\nexport function summarizeEvaluations(\n results: Map<string, EvaluationResult>\n): EvaluationSummary {\n const summary: EvaluationSummary = {\n total: results.size,\n included: 0,\n excluded: 0,\n byReason: {},\n }\n\n for (const result of results.values()) {\n if (result.shouldSync) {\n summary.included++\n } else {\n summary.excluded++\n }\n\n summary.byReason[result.reason] = (summary.byReason[result.reason] ?? 0) + 1\n }\n\n return summary\n}\n\n/**\n * Validate sync rules\n *\n * @param rules - Rules to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateRules(rules: SyncRule[]): string[] {\n const errors: string[] = []\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i]\n if (!rule) continue\n\n // Check pattern is valid\n if (!rule.pattern || rule.pattern.trim() === '') {\n errors.push(`Rule ${i}: pattern is empty`)\n continue\n }\n\n // Check pattern is valid glob\n try {\n micromatch.isMatch('test', rule.pattern)\n } catch {\n errors.push(`Rule ${i}: invalid pattern \"${rule.pattern}\"`)\n }\n\n // Check direction is valid\n if (rule.direction && !['to-codex', 'from-codex', 'bidirectional'].includes(rule.direction)) {\n errors.push(`Rule ${i}: invalid direction \"${rule.direction}\"`)\n }\n }\n\n return errors\n}\n","/**\n * Sync planner\n *\n * Creates sync plans by comparing source and target file states.\n */\n\nimport type {\n SyncPlan,\n SyncOptions,\n SyncDirection,\n FileSyncStatus,\n SyncConfig,\n} from './types.js'\nimport { evaluatePath } from './evaluator.js'\n\n/**\n * File info for comparison\n */\nexport interface FileInfo {\n path: string\n size: number\n mtime: number\n hash?: string\n}\n\n/**\n * Create a sync plan by comparing source and target files\n *\n * @param sourceFiles - Files in the source\n * @param targetFiles - Files in the target\n * @param options - Sync options\n * @param config - Sync configuration\n * @returns Sync plan\n */\nexport function createSyncPlan(\n sourceFiles: FileInfo[],\n targetFiles: FileInfo[],\n options: SyncOptions,\n config: SyncConfig\n): SyncPlan {\n const direction = options.direction ?? config.defaultDirection\n const targetMap = new Map(targetFiles.map((f) => [f.path, f]))\n const sourceMap = new Map(sourceFiles.map((f) => [f.path, f]))\n\n const files: FileSyncStatus[] = []\n const conflicts: FileSyncStatus[] = []\n const skipped: FileSyncStatus[] = []\n\n // Build include/exclude rules\n const rules = [\n ...config.rules,\n ...(options.include ?? []).map((p) => ({ pattern: p, include: true, priority: 200 })),\n ...(options.exclude ?? []).map((p) => ({ pattern: p, include: false, priority: 200 })),\n ]\n\n const excludes = [...config.defaultExcludes]\n\n // Process source files\n for (const sourceFile of sourceFiles) {\n // Evaluate if file should be synced\n const evaluation = evaluatePath(sourceFile.path, rules, direction, excludes)\n\n if (!evaluation.shouldSync) {\n skipped.push({\n path: sourceFile.path,\n operation: 'skip',\n size: sourceFile.size,\n reason: evaluation.reason,\n })\n continue\n }\n\n const targetFile = targetMap.get(sourceFile.path)\n\n if (!targetFile) {\n // File doesn't exist in target - create it\n files.push({\n path: sourceFile.path,\n operation: 'create',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n } else {\n // File exists in both - check for changes\n const isDifferent = sourceFile.hash !== targetFile.hash\n\n if (isDifferent) {\n if (options.force) {\n // Force overwrite\n files.push({\n path: sourceFile.path,\n operation: 'update',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n } else if (targetFile.mtime > sourceFile.mtime) {\n // Target is newer - conflict\n conflicts.push({\n path: sourceFile.path,\n operation: 'conflict',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n reason: 'Target file is newer than source',\n })\n } else {\n // Source is newer - update\n files.push({\n path: sourceFile.path,\n operation: 'update',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n }\n } else {\n // Files are identical - skip\n skipped.push({\n path: sourceFile.path,\n operation: 'skip',\n size: sourceFile.size,\n reason: 'Files are identical',\n })\n }\n }\n }\n\n // Handle deletions if enabled\n if (options.delete) {\n for (const targetFile of targetFiles) {\n if (!sourceMap.has(targetFile.path)) {\n // File in target but not in source\n const evaluation = evaluatePath(targetFile.path, rules, direction, excludes)\n\n if (evaluation.shouldSync) {\n files.push({\n path: targetFile.path,\n operation: 'delete',\n size: targetFile.size,\n })\n }\n }\n }\n }\n\n // Apply max files limit\n let limitedFiles = files\n if (options.maxFiles && files.length > options.maxFiles) {\n limitedFiles = files.slice(0, options.maxFiles)\n for (const file of files.slice(options.maxFiles)) {\n skipped.push({\n ...file,\n operation: 'skip',\n reason: 'Exceeded max files limit',\n })\n }\n }\n\n // Calculate totals\n const totalBytes = limitedFiles.reduce((sum, f) => sum + (f.size ?? 0), 0)\n\n return {\n direction,\n source: direction === 'from-codex' ? 'codex' : 'local',\n target: direction === 'from-codex' ? 'local' : 'codex',\n files: limitedFiles,\n totalFiles: limitedFiles.length,\n totalBytes,\n conflicts,\n skipped,\n }\n}\n\n/**\n * Estimate sync time based on file sizes\n *\n * @param plan - Sync plan\n * @param bytesPerSecond - Estimated transfer speed (default: 1MB/s)\n * @returns Estimated time in milliseconds\n */\nexport function estimateSyncTime(plan: SyncPlan, bytesPerSecond = 1024 * 1024): number {\n const transferTime = (plan.totalBytes / bytesPerSecond) * 1000\n const overheadPerFile = 50 // ms per file\n const overhead = plan.totalFiles * overheadPerFile\n\n return Math.ceil(transferTime + overhead)\n}\n\n/**\n * Create an empty sync plan\n */\nexport function createEmptySyncPlan(direction: SyncDirection = 'to-codex'): SyncPlan {\n return {\n direction,\n source: direction === 'from-codex' ? 'codex' : 'local',\n target: direction === 'from-codex' ? 'local' : 'codex',\n files: [],\n totalFiles: 0,\n totalBytes: 0,\n conflicts: [],\n skipped: [],\n }\n}\n\n/**\n * Filter plan to only include specific operations\n */\nexport function filterPlanOperations(\n plan: SyncPlan,\n operations: Array<'create' | 'update' | 'delete'>\n): SyncPlan {\n const filtered = plan.files.filter((f) =>\n operations.includes(f.operation as 'create' | 'update' | 'delete')\n )\n\n return {\n ...plan,\n files: filtered,\n totalFiles: filtered.length,\n totalBytes: filtered.reduce((sum, f) => sum + (f.size ?? 0), 0),\n }\n}\n\n/**\n * Get plan statistics\n */\nexport interface PlanStats {\n creates: number\n updates: number\n deletes: number\n skips: number\n conflicts: number\n totalBytes: number\n}\n\n/**\n * Get statistics from a sync plan\n */\nexport function getPlanStats(plan: SyncPlan): PlanStats {\n return {\n creates: plan.files.filter((f) => f.operation === 'create').length,\n updates: plan.files.filter((f) => f.operation === 'update').length,\n deletes: plan.files.filter((f) => f.operation === 'delete').length,\n skips: plan.skipped.length,\n conflicts: plan.conflicts.length,\n totalBytes: plan.totalBytes,\n }\n}\n\n/**\n * Format plan as human-readable summary\n */\nexport function formatPlanSummary(plan: SyncPlan): string {\n const stats = getPlanStats(plan)\n\n const lines = [\n `Sync Plan: ${plan.source} → ${plan.target}`,\n `Direction: ${plan.direction}`,\n '',\n `Operations:`,\n ` Create: ${stats.creates} files`,\n ` Update: ${stats.updates} files`,\n ` Delete: ${stats.deletes} files`,\n ` Skip: ${stats.skips} files`,\n '',\n ]\n\n if (stats.conflicts > 0) {\n lines.push(`⚠️ Conflicts: ${stats.conflicts} files`)\n lines.push('')\n }\n\n lines.push(`Total: ${plan.totalFiles} files (${formatBytes(stats.totalBytes)})`)\n\n return lines.join('\\n')\n}\n\n/**\n * Format bytes as human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n}\n","/**\n * Routing-aware codex scanner\n *\n * Scans entire codex repository and evaluates routing rules to determine\n * which files should sync to a target project based on frontmatter metadata.\n *\n * Based on SPEC-20260105: Routing-Aware Sync Implementation\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { Metadata } from '../schemas/metadata.js'\nimport type { SyncRules } from '../schemas/config.js'\nimport { shouldSyncToRepo } from '../core/routing/evaluator.js'\nimport { parseMetadata } from '../core/metadata/parser.js'\nimport { calculateContentHash } from '../cache/entry.js'\nimport type { LocalStorage } from '../storage/local.js'\n\n/**\n * File information with routing metadata\n */\nexport interface RoutedFileInfo {\n /** File path relative to codex root */\n path: string\n /** File size in bytes */\n size: number\n /** Last modified timestamp */\n mtime: number\n /** Content hash for change detection */\n hash: string\n /** Parsed frontmatter metadata */\n metadata: Metadata\n /** Source project in codex (e.g., \"etl.corthion.ai\") */\n sourceProject: string\n}\n\n/**\n * Options for routing-aware scan\n */\nexport interface RoutingScanOptions {\n /** Path to codex repository directory */\n codexDir: string\n /** Target project to sync to (e.g., \"lake.corthonomy.ai\") */\n targetProject: string\n /** Organization name (e.g., \"corthosai\") */\n org: string\n /** Codex repository name (e.g., \"codex.fractary.com\") for {codex_repo} placeholder */\n codexRepo?: string\n /** Routing rules configuration (optional, uses defaults if not provided) */\n rules?: SyncRules\n /** Storage provider for reading files */\n storage: LocalStorage\n /** Skip files without frontmatter (default: true) */\n skipNoFrontmatter?: boolean\n /** Maximum file size to process in bytes (default: 10MB) */\n maxFileSize?: number\n /** Directional from_codex patterns (takes precedence over frontmatter routing) */\n fromCodexPatterns?: string[]\n /** Routing configuration (controls frontmatter parsing) */\n routing?: { use_frontmatter?: boolean }\n}\n\n/**\n * Statistics from a routing scan\n */\nexport interface RoutingScanStats {\n /** Total files scanned */\n totalScanned: number\n /** Files that matched routing rules */\n totalMatched: number\n /** Files skipped (no frontmatter, errors, etc.) */\n totalSkipped: number\n /** Unique source projects found */\n sourceProjects: string[]\n /** Duration of scan in milliseconds */\n durationMs: number\n /** Errors encountered (non-fatal) */\n errors: Array<{ path: string; error: string }>\n}\n\n/**\n * Result from routing-aware scan\n */\nexport interface RoutingScanResult {\n /** Files that should sync to target project */\n files: RoutedFileInfo[]\n /** Scan statistics */\n stats: RoutingScanStats\n}\n\n/**\n * Scan entire codex repository and return files that route to target project\n *\n * This is the core function that enables cross-project knowledge sharing by:\n * 1. Listing ALL files in the entire codex repository (not just target project)\n * 2. Parsing frontmatter metadata from each file\n * 3. Evaluating codex_sync_include patterns against target project\n * 4. Returning only files that match routing rules\n *\n * @example\n * ```typescript\n * const result = await scanCodexWithRouting({\n * codexDir: '/path/to/codex.corthos.ai',\n * targetProject: 'lake.corthonomy.ai',\n * org: 'corthosai',\n * storage: localStorage\n * })\n *\n * console.log(`Found ${result.files.length} files routing to lake.corthonomy.ai`)\n * console.log(`From ${result.stats.sourceProjects.length} projects`)\n * ```\n *\n * @param options - Scan options\n * @returns Files that should sync to target project with scan statistics\n */\nexport async function scanCodexWithRouting(\n options: RoutingScanOptions\n): Promise<RoutingScanResult> {\n const {\n codexDir,\n targetProject,\n org,\n codexRepo,\n rules,\n storage,\n skipNoFrontmatter = false,\n maxFileSize = 10 * 1024 * 1024, // 10MB default\n fromCodexPatterns,\n } = options\n\n const startTime = Date.now()\n const routedFiles: RoutedFileInfo[] = []\n const sourceProjectsSet = new Set<string>()\n const errors: Array<{ path: string; error: string }> = []\n let totalScanned = 0\n let totalSkipped = 0\n\n // Import directional pattern matcher and expand placeholders if using from_codex patterns\n let expandedFromCodexPatterns = fromCodexPatterns\n let matchFromCodexPattern: ((\n filePath: string,\n patterns: string[],\n targetProject: string,\n options?: { org?: string; codexRepo?: string }\n ) => boolean) | null = null\n\n if (fromCodexPatterns && fromCodexPatterns.length > 0) {\n const module = await import('./directional-patterns.js')\n matchFromCodexPattern = module.matchFromCodexPattern\n // Expand placeholders in patterns ({project}, {org}, {codex_repo})\n expandedFromCodexPatterns = module.expandPlaceholders(fromCodexPatterns, targetProject, {\n org,\n codexRepo,\n })\n }\n\n // Step 1: List ALL files recursively in entire codex repository\n const allFiles = await listAllFilesRecursive(codexDir)\n\n // Step 2: For each file, evaluate routing\n for (const filePath of allFiles) {\n totalScanned++\n\n try {\n // Check all file types for frontmatter (not just markdown)\n // This enables syncing of JSON schemas, YAML configs, and other files with routing metadata\n\n // Get full path for reading\n const fullPath = path.join(codexDir, filePath)\n\n // Check file size before reading\n const stats = await fs.stat(fullPath)\n if (stats.size > maxFileSize) {\n totalSkipped++\n errors.push({\n path: filePath,\n error: `File too large (${stats.size} bytes, max: ${maxFileSize})`,\n })\n continue\n }\n\n // Read file content\n const content = await storage.readText(fullPath)\n\n // Extract source project from path (needed for both pattern matching and routing)\n const sourceProject = extractProjectFromPath(filePath, org)\n\n // Determine if file should sync using either directional patterns or frontmatter routing\n let shouldSync = false\n let parseResult: ReturnType<typeof parseMetadata> | null = null\n\n // Check if we should use frontmatter routing (v0.7.0+)\n // Default is FALSE - frontmatter routing is deprecated\n const useFrontmatter = options.routing?.use_frontmatter === true\n\n if (matchFromCodexPattern && expandedFromCodexPatterns && expandedFromCodexPatterns.length > 0) {\n // Use directional from_codex patterns (takes precedence, no frontmatter needed)\n shouldSync = matchFromCodexPattern(filePath, expandedFromCodexPatterns, targetProject, {\n org,\n codexRepo,\n })\n\n // Still parse metadata for the file info, but don't use for routing\n parseResult = parseMetadata(content, { strict: false })\n } else if (useFrontmatter) {\n // Parse frontmatter for routing (legacy behavior, deprecated)\n parseResult = parseMetadata(content, { strict: false })\n\n // Add deprecation warning if frontmatter routing is detected\n if (parseResult.metadata.codex_sync_include) {\n console.warn(\n `[DEPRECATION] File ${filePath} uses codex_sync_include frontmatter. ` +\n `This feature will be removed in v1.0. Use config.yaml patterns instead.`\n )\n }\n\n // Skip files without frontmatter if configured\n if (skipNoFrontmatter && Object.keys(parseResult.metadata).length === 0) {\n totalSkipped++\n continue\n }\n\n // Fall back to frontmatter-based routing\n shouldSync = shouldSyncToRepo({\n filePath,\n fileMetadata: parseResult.metadata,\n targetRepo: targetProject,\n sourceRepo: sourceProject,\n rules,\n })\n } else {\n // Neither config patterns nor frontmatter routing enabled - skip\n totalSkipped++\n continue\n }\n\n if (shouldSync) {\n // Calculate file metadata\n const buffer = Buffer.from(content)\n const hash = calculateContentHash(buffer)\n\n routedFiles.push({\n path: filePath,\n size: buffer.length,\n mtime: stats.mtimeMs,\n hash,\n metadata: parseResult?.metadata ?? {},\n sourceProject,\n })\n\n sourceProjectsSet.add(sourceProject)\n } else {\n totalSkipped++\n }\n } catch (error) {\n // Log error but continue processing other files\n totalSkipped++\n errors.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n const durationMs = Date.now() - startTime\n\n return {\n files: routedFiles,\n stats: {\n totalScanned,\n totalMatched: routedFiles.length,\n totalSkipped,\n sourceProjects: Array.from(sourceProjectsSet).sort(),\n durationMs,\n errors,\n },\n }\n}\n\n/**\n * Extract project name from codex file path\n *\n * Supports two codex structures:\n * 1. Flat: {org}/{project}/{path/to/file.md}\n * Example: \"corthosai/etl.corthion.ai/docs/api.md\" → \"etl.corthion.ai\"\n * 2. Projects dir: projects/{project}/{path/to/file.md}\n * Example: \"projects/etl.corthion.ai/docs/api.md\" → \"etl.corthion.ai\"\n *\n * @param filePath - File path like \"corthosai/etl.corthion.ai/docs/api.md\" or \"projects/etl.corthion.ai/docs/api.md\"\n * @param org - Organization name like \"corthosai\"\n * @returns Project name like \"etl.corthion.ai\"\n */\nexport function extractProjectFromPath(filePath: string, org: string): string {\n // Normalize path separators\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n\n // Remove leading org directory if present\n const withoutOrg = normalizedPath.startsWith(`${org}/`)\n ? normalizedPath.slice(org.length + 1)\n : normalizedPath\n\n // Check if using projects/ subdirectory structure\n if (withoutOrg.startsWith('projects/')) {\n // Extract project name from projects/{project}/...\n const afterProjects = withoutOrg.slice('projects/'.length)\n const firstSlash = afterProjects.indexOf('/')\n if (firstSlash === -1) {\n // No further path segments, use entire remainder as project\n return afterProjects\n }\n return afterProjects.slice(0, firstSlash)\n }\n\n // Flat structure: extract first path segment as project name\n const firstSlash = withoutOrg.indexOf('/')\n if (firstSlash === -1) {\n // File is at root level, use entire path as project\n return withoutOrg\n }\n\n return withoutOrg.slice(0, firstSlash)\n}\n\n/**\n * Recursively list all files in directory\n *\n * @param dirPath - Directory to scan\n * @returns Array of relative file paths\n */\nexport async function listAllFilesRecursive(dirPath: string): Promise<string[]> {\n const files: string[] = []\n\n async function scanDirectory(currentPath: string, relativePath: string = ''): Promise<void> {\n try {\n const entries = await fs.readdir(currentPath, { withFileTypes: true })\n\n for (const entry of entries) {\n const entryPath = path.join(currentPath, entry.name)\n const entryRelativePath = relativePath\n ? path.join(relativePath, entry.name)\n : entry.name\n\n if (entry.isDirectory()) {\n // Skip hidden directories and common ignore patterns\n if (\n entry.name.startsWith('.') ||\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === 'build'\n ) {\n continue\n }\n\n // Recursively scan subdirectory\n await scanDirectory(entryPath, entryRelativePath)\n } else if (entry.isFile()) {\n // Add file to list\n files.push(entryRelativePath)\n }\n }\n } catch {\n // Ignore directories we can't read (permissions, etc.)\n // Silently skip - this is expected for permission issues\n }\n }\n\n await scanDirectory(dirPath)\n\n return files\n}\n\n/**\n * Group routed files by source project\n *\n * Utility function for displaying results grouped by project.\n *\n * @param files - Files from routing scan\n * @returns Map of project name to files from that project\n */\nexport function groupFilesByProject(\n files: RoutedFileInfo[]\n): Map<string, RoutedFileInfo[]> {\n const grouped = new Map<string, RoutedFileInfo[]>()\n\n for (const file of files) {\n const existing = grouped.get(file.sourceProject) || []\n existing.push(file)\n grouped.set(file.sourceProject, existing)\n }\n\n return grouped\n}\n\n/**\n * Calculate total size of routed files\n *\n * @param files - Files from routing scan\n * @returns Total size in bytes\n */\nexport function calculateTotalSize(files: RoutedFileInfo[]): number {\n return files.reduce((total, file) => total + file.size, 0)\n}\n\n/**\n * Format scan statistics for display\n *\n * @param stats - Scan statistics\n * @returns Human-readable statistics string\n */\nexport function formatScanStats(stats: RoutingScanStats): string {\n const lines: string[] = []\n\n lines.push(`Scanned: ${stats.totalScanned} files`)\n lines.push(`Matched: ${stats.totalMatched} files`)\n lines.push(`Skipped: ${stats.totalSkipped} files`)\n lines.push(`Source projects: ${stats.sourceProjects.length}`)\n lines.push(` ${stats.sourceProjects.join(', ')}`)\n lines.push(`Duration: ${stats.durationMs}ms`)\n\n if (stats.errors.length > 0) {\n lines.push(`Errors: ${stats.errors.length}`)\n stats.errors.slice(0, 5).forEach((err) => {\n lines.push(` ${err.path}: ${err.error}`)\n })\n if (stats.errors.length > 5) {\n lines.push(` ... and ${stats.errors.length - 5} more`)\n }\n }\n\n return lines.join('\\n')\n}\n","/**\n * Sync manager\n *\n * Coordinates sync operations between local files and codex repository.\n */\n\nimport type { LocalStorage } from '../storage/local.js'\nimport type {\n SyncPlan,\n SyncResult,\n SyncOptions,\n SyncConfig,\n SyncManifest,\n SyncManifestEntry,\n FileSyncStatus,\n} from './types.js'\nimport { DEFAULT_SYNC_CONFIG } from './types.js'\nimport { createSyncPlan, estimateSyncTime, type FileInfo } from './planner.js'\nimport { calculateContentHash } from '../cache/entry.js'\nimport { scanCodexWithRouting, type RoutingScanResult } from './routing-scanner.js'\n\n/**\n * Sync manager configuration\n */\nexport interface SyncManagerConfig {\n /** Local storage provider */\n localStorage: LocalStorage\n /** Sync configuration */\n config?: Partial<SyncConfig>\n /** Manifest file path */\n manifestPath?: string\n}\n\n/**\n * Sync manager\n *\n * Manages synchronization between local files and the codex repository.\n */\nexport class SyncManager {\n private localStorage: LocalStorage\n private config: SyncConfig\n private manifestPath: string\n private manifest: SyncManifest | null = null\n\n constructor(options: SyncManagerConfig) {\n this.localStorage = options.localStorage\n this.config = {\n ...DEFAULT_SYNC_CONFIG,\n ...options.config,\n }\n this.manifestPath = options.manifestPath ?? '.fractary/codex-sync-manifest.json'\n }\n\n /**\n * Resolve from_codex include patterns (v0.7.0+)\n *\n * Supports both new format (from_codex.include) and legacy format (default_from_codex).\n * New format takes precedence.\n */\n private resolveFromCodexPatterns(): string[] {\n // New format takes precedence\n if (this.config.from_codex?.include) {\n return this.config.from_codex.include\n }\n\n // Fall back to legacy format\n return this.config.default_from_codex || []\n }\n\n /**\n * Resolve to_codex include patterns (v0.7.0+)\n *\n * Supports both new format (to_codex.include) and legacy format (default_to_codex).\n * New format takes precedence.\n */\n private resolveToCodexPatterns(): string[] {\n // New format takes precedence\n if (this.config.to_codex?.include) {\n return this.config.to_codex.include\n }\n\n // Fall back to legacy format\n return this.config.default_to_codex || []\n }\n\n /**\n * Get resolved to-codex include patterns (public accessor)\n *\n * Returns the resolved patterns from config, handling both new format\n * (to_codex.include) and legacy format (default_to_codex).\n */\n public getToCodexPatterns(): string[] {\n return this.resolveToCodexPatterns()\n }\n\n /**\n * Get resolved from-codex include patterns (public accessor)\n *\n * Returns the resolved patterns from config, handling both new format\n * (from_codex.include) and legacy format (default_from_codex).\n */\n public getFromCodexPatterns(): string[] {\n return this.resolveFromCodexPatterns()\n }\n\n /**\n * Load the sync manifest\n */\n async loadManifest(): Promise<SyncManifest | null> {\n try {\n const content = await this.localStorage.readText(this.manifestPath)\n this.manifest = JSON.parse(content)\n return this.manifest\n } catch {\n return null\n }\n }\n\n /**\n * Save the sync manifest\n */\n async saveManifest(manifest: SyncManifest): Promise<void> {\n this.manifest = manifest\n await this.localStorage.write(this.manifestPath, JSON.stringify(manifest, null, 2))\n }\n\n /**\n * Get or create manifest\n */\n async getOrCreateManifest(org: string, project: string): Promise<SyncManifest> {\n let manifest = await this.loadManifest()\n\n if (!manifest || manifest.org !== org || manifest.project !== project) {\n manifest = {\n version: 1,\n org,\n project,\n lastSync: 0,\n entries: {},\n }\n }\n\n return manifest\n }\n\n /**\n * List local files\n */\n async listLocalFiles(directory: string): Promise<FileInfo[]> {\n const files = await this.localStorage.list(directory)\n const fileInfos: FileInfo[] = []\n\n for (const file of files) {\n try {\n const content = await this.localStorage.readText(file)\n const buffer = Buffer.from(content)\n fileInfos.push({\n path: file,\n size: buffer.length,\n mtime: Date.now(), // Would need fs.stat for real mtime\n hash: calculateContentHash(buffer),\n })\n } catch {\n // Skip files that can't be read\n }\n }\n\n return fileInfos\n }\n\n /**\n * Create a sync plan\n *\n * @param _org - Organization (reserved for future use)\n * @param _project - Project (reserved for future use)\n * @param sourceDir - Source directory to sync from\n * @param targetFiles - Files currently in the target\n * @param options - Sync options\n */\n async createPlan(\n _org: string,\n _project: string,\n sourceDir: string,\n targetFiles: FileInfo[],\n options?: SyncOptions\n ): Promise<SyncPlan> {\n let sourceFiles: FileInfo[]\n\n // Use pre-matched sourceFiles if provided (bypasses internal scanning)\n if (options?.sourceFiles && options.sourceFiles.length > 0) {\n sourceFiles = options.sourceFiles\n } else {\n // Fall back to internal file scanning\n sourceFiles = await this.listLocalFiles(sourceDir)\n\n // For to-codex direction, filter files based on to_codex config patterns\n if (options?.direction === 'to-codex') {\n const toCodexPatterns = this.resolveToCodexPatterns()\n\n if (toCodexPatterns.length > 0) {\n const { matchToCodexPattern } = await import('./directional-patterns.js')\n\n sourceFiles = sourceFiles.filter((file) =>\n matchToCodexPattern(file.path, toCodexPatterns)\n )\n }\n }\n }\n\n const plan = createSyncPlan(\n sourceFiles,\n targetFiles,\n options ?? {},\n this.config\n )\n\n plan.estimatedTime = estimateSyncTime(plan)\n\n return plan\n }\n\n /**\n * Create a routing-aware sync plan\n *\n * Scans entire codex repository and evaluates routing rules to find all files\n * that should sync to the target project based on codex_sync_include patterns.\n *\n * This enables cross-project knowledge sharing where files from multiple\n * projects can be synced to the target based on their frontmatter metadata.\n *\n * @param org - Organization name (e.g., \"corthosai\")\n * @param project - Target project name (e.g., \"lake.corthonomy.ai\")\n * @param codexDir - Path to codex repository directory\n * @param options - Sync options\n * @returns Sync plan with routing metadata\n *\n * @example\n * ```typescript\n * const plan = await manager.createRoutingAwarePlan(\n * 'corthosai',\n * 'lake.corthonomy.ai',\n * '/path/to/codex.corthos.ai',\n * { direction: 'from-codex' }\n * )\n *\n * console.log(`Found ${plan.totalFiles} files from ${plan.metadata.scannedProjects.length} projects`)\n * ```\n */\n async createRoutingAwarePlan(\n org: string,\n project: string,\n codexDir: string,\n options?: SyncOptions & { codexRepo?: string }\n ): Promise<SyncPlan & { routingScan?: RoutingScanResult }> {\n // Step 1: Scan entire codex with routing evaluation\n // Resolve patterns using new helper functions (supports both new and legacy formats)\n const fromCodexPatterns = this.resolveFromCodexPatterns()\n\n const routingScan = await scanCodexWithRouting({\n codexDir,\n targetProject: project,\n org,\n codexRepo: options?.codexRepo, // For codex:// URI {codex_repo} placeholder\n rules: undefined, // Use default routing rules (preventSelfSync, preventCodexSync, etc.)\n storage: this.localStorage,\n fromCodexPatterns: fromCodexPatterns.length > 0 ? fromCodexPatterns : undefined,\n routing: this.config.routing, // Pass routing config for frontmatter control\n })\n\n // Step 2: Convert routed files to FileInfo format expected by planner\n const sourceFiles: FileInfo[] = routingScan.files.map((rf) => ({\n path: rf.path,\n size: rf.size,\n mtime: rf.mtime,\n hash: rf.hash,\n }))\n\n // Step 3: Get current local files for comparison\n const targetFiles = await this.listLocalFiles(process.cwd())\n\n // Step 4: Create sync plan using existing planner logic\n // IMPORTANT: Strip include/exclude patterns from options because routing scanner\n // has already filtered files based on routing rules (codex_sync_include frontmatter).\n // We only keep execution options (force, dryRun) to avoid double filtering.\n const planOptions: SyncOptions = {\n direction: options?.direction,\n force: options?.force,\n dryRun: options?.dryRun,\n // Explicitly exclude include/exclude to prevent double filtering\n // include: undefined,\n // exclude: undefined,\n }\n const plan = createSyncPlan(sourceFiles, targetFiles, planOptions, this.config)\n\n plan.estimatedTime = estimateSyncTime(plan)\n\n // Override source/target paths for from-codex routing-aware sync\n // Files should be copied from codex to cache directory preserving full paths\n plan.source = codexDir\n plan.target = '.fractary/codex/cache'\n\n // Step 5: Enhance plan with routing metadata\n return {\n ...plan,\n routingScan,\n }\n }\n\n /**\n * Execute a sync plan\n *\n * Copies files from source to target based on the plan.\n * For from-codex syncs, files are copied to .fractary/codex/cache/ preserving full paths.\n * For to-codex syncs, files are copied to the codex repository.\n */\n async executePlan(plan: SyncPlan, options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now()\n const errors: Array<{ path: string; error: string }> = []\n let synced = 0\n let failed = 0\n\n if (options?.dryRun) {\n // Dry run - just return what would happen\n return {\n success: true,\n plan,\n synced: plan.totalFiles,\n failed: 0,\n skipped: plan.skipped.length,\n errors: [],\n duration: Date.now() - startTime,\n timestamp: Date.now(),\n }\n }\n\n // Execute operations\n for (let i = 0; i < plan.files.length; i++) {\n const file = plan.files[i]\n if (!file) continue\n\n try {\n // Report progress\n if (options?.onProgress) {\n options.onProgress(i + 1, plan.totalFiles, file.path)\n }\n\n // Execute the sync operation\n if (file.operation === 'create' || file.operation === 'update') {\n // Copy file from source to target\n const sourcePath = `${plan.source}/${file.path}`\n const targetPath = `${plan.target}/${file.path}`\n\n // Ensure target directory exists\n const fs = await import('fs/promises')\n const path = await import('path')\n const targetDir = path.dirname(targetPath)\n await fs.mkdir(targetDir, { recursive: true })\n\n // Copy the file\n await fs.copyFile(sourcePath, targetPath)\n synced++\n } else if (file.operation === 'delete') {\n // Delete file from target\n const targetPath = `${plan.target}/${file.path}`\n const fs = await import('fs/promises')\n try {\n await fs.unlink(targetPath)\n synced++\n } catch (error: any) {\n // Ignore if file doesn't exist\n if (error.code !== 'ENOENT') {\n throw error\n }\n synced++\n }\n } else {\n // Skip operation\n synced++\n }\n } catch (error) {\n failed++\n errors.push({\n path: file.path,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n return {\n success: failed === 0,\n plan,\n synced,\n failed,\n skipped: plan.skipped.length,\n errors,\n duration: Date.now() - startTime,\n timestamp: Date.now(),\n }\n }\n\n /**\n * Update manifest after sync\n */\n async updateManifest(\n org: string,\n project: string,\n syncedFiles: FileSyncStatus[]\n ): Promise<void> {\n const manifest = await this.getOrCreateManifest(org, project)\n const now = Date.now()\n\n for (const file of syncedFiles) {\n if (file.operation === 'delete') {\n delete manifest.entries[file.path]\n } else if (file.operation === 'create' || file.operation === 'update') {\n manifest.entries[file.path] = {\n path: file.path,\n hash: file.hash ?? '',\n size: file.size ?? 0,\n syncedAt: now,\n source: 'local',\n }\n }\n }\n\n manifest.lastSync = now\n await this.saveManifest(manifest)\n }\n\n /**\n * Get sync status for a file\n */\n async getFileStatus(path: string): Promise<SyncManifestEntry | null> {\n const manifest = await this.loadManifest()\n return manifest?.entries[path] ?? null\n }\n\n /**\n * Check if a file is synced\n */\n async isFileSynced(path: string): Promise<boolean> {\n const status = await this.getFileStatus(path)\n return status !== null\n }\n\n /**\n * Get last sync timestamp\n */\n async getLastSyncTime(): Promise<number | null> {\n const manifest = await this.loadManifest()\n return manifest?.lastSync ?? null\n }\n\n /**\n * Clear sync manifest\n */\n async clearManifest(): Promise<void> {\n try {\n await this.localStorage.delete(this.manifestPath)\n this.manifest = null\n } catch {\n // Ignore if manifest doesn't exist\n }\n }\n\n /**\n * Get sync configuration\n */\n getConfig(): SyncConfig {\n return { ...this.config }\n }\n\n /**\n * Update sync configuration\n */\n updateConfig(updates: Partial<SyncConfig>): void {\n this.config = {\n ...this.config,\n ...updates,\n }\n }\n}\n\n/**\n * Create a sync manager\n */\nexport function createSyncManager(config: SyncManagerConfig): SyncManager {\n return new SyncManager(config)\n}\n","/**\n * Permission types\n *\n * Type definitions for the permissions system.\n */\n\n/**\n * Permission levels\n */\nexport type PermissionLevel = 'none' | 'read' | 'write' | 'admin'\n\n/**\n * Permission scope\n */\nexport type PermissionScope = 'global' | 'org' | 'project' | 'path'\n\n/**\n * Permission action\n */\nexport type PermissionAction = 'fetch' | 'cache' | 'sync' | 'invalidate' | 'manage'\n\n/**\n * Permission rule\n */\nexport interface PermissionRule {\n /** Rule ID */\n id?: string\n /** Pattern to match (glob) */\n pattern: string\n /** Actions this rule applies to */\n actions: PermissionAction[]\n /** Permission level granted */\n level: PermissionLevel\n /** Scope of the rule */\n scope: PermissionScope\n /** Organization filter (for org scope) */\n org?: string\n /** Project filter (for project scope) */\n project?: string\n /** Priority (higher = evaluated first) */\n priority?: number\n /** Description of the rule */\n description?: string\n /** Whether rule is active */\n enabled?: boolean\n}\n\n/**\n * Permission context\n *\n * Context for evaluating permissions.\n */\nexport interface PermissionContext {\n /** Current organization */\n org?: string\n /** Current project */\n project?: string\n /** Current environment */\n environment?: string\n /** User/agent identity */\n identity?: string\n /** Additional context data */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Permission check result\n */\nexport interface PermissionResult {\n /** Whether the action is allowed */\n allowed: boolean\n /** Permission level granted */\n level: PermissionLevel\n /** Matching rule (if any) */\n matchedRule?: PermissionRule\n /** Reason for the decision */\n reason: string\n}\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n /** Default permission level */\n defaultLevel: PermissionLevel\n /** Whether to allow by default when no rules match */\n defaultAllow: boolean\n /** Global permission rules */\n rules: PermissionRule[]\n /** Whether permissions are enforced */\n enforced: boolean\n}\n\n/**\n * Default permission configuration\n */\nexport const DEFAULT_PERMISSION_CONFIG: PermissionConfig = {\n defaultLevel: 'read',\n defaultAllow: true,\n rules: [],\n enforced: false,\n}\n\n/**\n * Permission levels ordered by access\n */\nexport const PERMISSION_LEVEL_ORDER: PermissionLevel[] = ['none', 'read', 'write', 'admin']\n\n/**\n * Check if a level grants another level\n */\nexport function levelGrants(granted: PermissionLevel, required: PermissionLevel): boolean {\n const grantedIndex = PERMISSION_LEVEL_ORDER.indexOf(granted)\n const requiredIndex = PERMISSION_LEVEL_ORDER.indexOf(required)\n return grantedIndex >= requiredIndex\n}\n\n/**\n * Get the higher of two permission levels\n */\nexport function maxLevel(a: PermissionLevel, b: PermissionLevel): PermissionLevel {\n const aIndex = PERMISSION_LEVEL_ORDER.indexOf(a)\n const bIndex = PERMISSION_LEVEL_ORDER.indexOf(b)\n return PERMISSION_LEVEL_ORDER[Math.max(aIndex, bIndex)] ?? 'none'\n}\n\n/**\n * Get the lower of two permission levels\n */\nexport function minLevel(a: PermissionLevel, b: PermissionLevel): PermissionLevel {\n const aIndex = PERMISSION_LEVEL_ORDER.indexOf(a)\n const bIndex = PERMISSION_LEVEL_ORDER.indexOf(b)\n return PERMISSION_LEVEL_ORDER[Math.min(aIndex, bIndex)] ?? 'none'\n}\n","/**\n * Permission evaluator\n *\n * Evaluates permission rules to determine access levels.\n */\n\nimport micromatch from 'micromatch'\nimport type {\n PermissionRule,\n PermissionContext,\n PermissionResult,\n PermissionConfig,\n PermissionLevel,\n PermissionAction,\n} from './types.js'\nimport { levelGrants } from './types.js'\n\n/**\n * Check if a rule matches the given context\n */\nexport function ruleMatchesContext(rule: PermissionRule, context: PermissionContext): boolean {\n // Check if rule is enabled\n if (rule.enabled === false) {\n return false\n }\n\n // Check scope constraints\n switch (rule.scope) {\n case 'org':\n if (rule.org && context.org !== rule.org) {\n return false\n }\n break\n case 'project':\n if (rule.org && context.org !== rule.org) {\n return false\n }\n if (rule.project && context.project !== rule.project) {\n return false\n }\n break\n }\n\n return true\n}\n\n/**\n * Check if a rule matches a path\n */\nexport function ruleMatchesPath(rule: PermissionRule, path: string): boolean {\n return micromatch.isMatch(path, rule.pattern)\n}\n\n/**\n * Check if a rule matches an action\n */\nexport function ruleMatchesAction(rule: PermissionRule, action: PermissionAction): boolean {\n return rule.actions.includes(action)\n}\n\n/**\n * Evaluate permission for a path and action\n */\nexport function evaluatePermission(\n path: string,\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): PermissionResult {\n // Sort rules by priority (higher first)\n const sortedRules = [...config.rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n\n // Find first matching rule\n for (const rule of sortedRules) {\n if (!ruleMatchesContext(rule, context)) {\n continue\n }\n\n if (!ruleMatchesPath(rule, path)) {\n continue\n }\n\n if (!ruleMatchesAction(rule, action)) {\n continue\n }\n\n // Rule matches\n return {\n allowed: rule.level !== 'none',\n level: rule.level,\n matchedRule: rule,\n reason: `Matched rule: ${rule.description ?? rule.pattern}`,\n }\n }\n\n // No rule matched - use default\n return {\n allowed: config.defaultAllow,\n level: config.defaultLevel,\n reason: config.defaultAllow ? 'Allowed by default' : 'Denied by default',\n }\n}\n\n/**\n * Check if an action is allowed for a path\n */\nexport function isAllowed(\n path: string,\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): boolean {\n const result = evaluatePermission(path, action, context, config)\n return result.allowed\n}\n\n/**\n * Check if a specific permission level is granted\n */\nexport function hasPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel,\n context: PermissionContext,\n config: PermissionConfig\n): boolean {\n const result = evaluatePermission(path, action, context, config)\n return levelGrants(result.level, requiredLevel)\n}\n\n/**\n * Evaluate permissions for multiple paths\n */\nexport function evaluatePermissions(\n paths: string[],\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): Map<string, PermissionResult> {\n const results = new Map<string, PermissionResult>()\n\n for (const path of paths) {\n results.set(path, evaluatePermission(path, action, context, config))\n }\n\n return results\n}\n\n/**\n * Filter paths by permission\n */\nexport function filterByPermission(\n paths: string[],\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig,\n requiredLevel: PermissionLevel = 'read'\n): string[] {\n return paths.filter((path) => {\n const result = evaluatePermission(path, action, context, config)\n return levelGrants(result.level, requiredLevel)\n })\n}\n\n/**\n * Validate permission rules\n */\nexport function validateRules(rules: PermissionRule[]): string[] {\n const errors: string[] = []\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i]\n if (!rule) continue\n\n // Check pattern\n if (!rule.pattern || rule.pattern.trim() === '') {\n errors.push(`Rule ${i}: pattern is empty`)\n continue\n }\n\n // Validate pattern\n try {\n micromatch.isMatch('test', rule.pattern)\n } catch {\n errors.push(`Rule ${i}: invalid pattern \"${rule.pattern}\"`)\n }\n\n // Check actions\n if (!rule.actions || rule.actions.length === 0) {\n errors.push(`Rule ${i}: actions are empty`)\n }\n\n // Validate scope constraints\n if (rule.scope === 'org' && !rule.org) {\n errors.push(`Rule ${i}: org scope requires org field`)\n }\n\n if (rule.scope === 'project' && !rule.project) {\n errors.push(`Rule ${i}: project scope requires project field`)\n }\n }\n\n return errors\n}\n\n/**\n * Create a permission rule\n */\nexport function createRule(options: {\n pattern: string\n actions: PermissionAction[]\n level: PermissionLevel\n scope?: PermissionRule['scope']\n org?: string\n project?: string\n priority?: number\n description?: string\n}): PermissionRule {\n return {\n pattern: options.pattern,\n actions: options.actions,\n level: options.level,\n scope: options.scope ?? 'global',\n org: options.org,\n project: options.project,\n priority: options.priority ?? 0,\n description: options.description,\n enabled: true,\n }\n}\n\n/**\n * Create common permission rules\n */\nexport const CommonRules = {\n /** Allow all actions for docs */\n allowDocs: (): PermissionRule =>\n createRule({\n pattern: 'docs/**',\n actions: ['fetch', 'cache', 'sync'],\n level: 'read',\n description: 'Allow read access to docs',\n }),\n\n /** Deny access to private files */\n denyPrivate: (): PermissionRule =>\n createRule({\n pattern: '**/.private/**',\n actions: ['fetch', 'cache', 'sync'],\n level: 'none',\n priority: 100,\n description: 'Deny access to private files',\n }),\n\n /** Read-only access to specs */\n readOnlySpecs: (): PermissionRule =>\n createRule({\n pattern: 'specs/**',\n actions: ['fetch', 'cache'],\n level: 'read',\n description: 'Read-only access to specs',\n }),\n\n /** Admin access for management */\n adminManage: (): PermissionRule =>\n createRule({\n pattern: '**',\n actions: ['manage', 'invalidate'],\n level: 'admin',\n description: 'Admin access for management operations',\n }),\n}\n","/**\n * Permission manager\n *\n * Manages permission rules and provides a high-level API\n * for permission checks.\n */\n\nimport type {\n PermissionRule,\n PermissionContext,\n PermissionResult,\n PermissionConfig,\n PermissionLevel,\n PermissionAction,\n} from './types.js'\nimport { DEFAULT_PERMISSION_CONFIG, levelGrants } from './types.js'\nimport { evaluatePermission, validateRules, filterByPermission } from './evaluator.js'\n\n/**\n * Permission manager configuration\n */\nexport interface PermissionManagerConfig {\n /** Initial configuration */\n config?: Partial<PermissionConfig>\n /** Default context */\n defaultContext?: PermissionContext\n}\n\n/**\n * Permission manager\n *\n * Provides a centralized API for managing and checking permissions.\n */\nexport class PermissionManager {\n private config: PermissionConfig\n private defaultContext: PermissionContext\n\n constructor(options: PermissionManagerConfig = {}) {\n this.config = {\n ...DEFAULT_PERMISSION_CONFIG,\n ...options.config,\n // Create a new rules array to avoid shared state\n rules: options.config?.rules ? [...options.config.rules] : [],\n }\n this.defaultContext = options.defaultContext ?? {}\n }\n\n /**\n * Check if an action is allowed for a path\n */\n isAllowed(\n path: string,\n action: PermissionAction,\n context?: PermissionContext\n ): boolean {\n const result = this.evaluate(path, action, context)\n return result.allowed\n }\n\n /**\n * Check if a permission level is granted\n */\n hasPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel,\n context?: PermissionContext\n ): boolean {\n const result = this.evaluate(path, action, context)\n return levelGrants(result.level, requiredLevel)\n }\n\n /**\n * Evaluate permission for a path and action\n */\n evaluate(\n path: string,\n action: PermissionAction,\n context?: PermissionContext\n ): PermissionResult {\n const mergedContext = { ...this.defaultContext, ...context }\n\n // If permissions are not enforced, allow everything\n if (!this.config.enforced) {\n return {\n allowed: true,\n level: 'admin',\n reason: 'Permissions not enforced',\n }\n }\n\n return evaluatePermission(path, action, mergedContext, this.config)\n }\n\n /**\n * Filter paths by permission\n */\n filterAllowed(\n paths: string[],\n action: PermissionAction,\n context?: PermissionContext,\n requiredLevel: PermissionLevel = 'read'\n ): string[] {\n const mergedContext = { ...this.defaultContext, ...context }\n\n if (!this.config.enforced) {\n return paths\n }\n\n return filterByPermission(paths, action, mergedContext, this.config, requiredLevel)\n }\n\n /**\n * Add a permission rule\n */\n addRule(rule: PermissionRule): void {\n const errors = validateRules([rule])\n if (errors.length > 0) {\n throw new Error(`Invalid rule: ${errors.join(', ')}`)\n }\n\n this.config.rules.push(rule)\n }\n\n /**\n * Remove a permission rule by ID\n */\n removeRule(id: string): boolean {\n const index = this.config.rules.findIndex((r) => r.id === id)\n if (index === -1) {\n return false\n }\n\n this.config.rules.splice(index, 1)\n return true\n }\n\n /**\n * Get all rules\n */\n getRules(): PermissionRule[] {\n return [...this.config.rules]\n }\n\n /**\n * Clear all rules\n */\n clearRules(): void {\n this.config.rules = []\n }\n\n /**\n * Set rules (replace all)\n */\n setRules(rules: PermissionRule[]): void {\n const errors = validateRules(rules)\n if (errors.length > 0) {\n throw new Error(`Invalid rules: ${errors.join(', ')}`)\n }\n\n this.config.rules = [...rules]\n }\n\n /**\n * Get configuration\n */\n getConfig(): PermissionConfig {\n return { ...this.config, rules: [...this.config.rules] }\n }\n\n /**\n * Update configuration\n */\n updateConfig(updates: Partial<Omit<PermissionConfig, 'rules'>>): void {\n this.config = {\n ...this.config,\n ...updates,\n }\n }\n\n /**\n * Set default context\n */\n setDefaultContext(context: PermissionContext): void {\n this.defaultContext = { ...context }\n }\n\n /**\n * Get default context\n */\n getDefaultContext(): PermissionContext {\n return { ...this.defaultContext }\n }\n\n /**\n * Enable permission enforcement\n */\n enable(): void {\n this.config.enforced = true\n }\n\n /**\n * Disable permission enforcement\n */\n disable(): void {\n this.config.enforced = false\n }\n\n /**\n * Check if permissions are enforced\n */\n isEnforced(): boolean {\n return this.config.enforced\n }\n\n /**\n * Assert permission (throws if denied)\n */\n assertPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel = 'read',\n context?: PermissionContext\n ): void {\n const result = this.evaluate(path, action, context)\n\n if (!levelGrants(result.level, requiredLevel)) {\n throw new PermissionDeniedError(\n `Permission denied for ${action} on ${path}: ${result.reason}`,\n path,\n action,\n result\n )\n }\n }\n}\n\n/**\n * Permission denied error\n */\nexport class PermissionDeniedError extends Error {\n constructor(\n message: string,\n public readonly path: string,\n public readonly action: PermissionAction,\n public readonly result: PermissionResult\n ) {\n super(message)\n this.name = 'PermissionDeniedError'\n }\n}\n\n/**\n * Create a permission manager\n */\nexport function createPermissionManager(config?: PermissionManagerConfig): PermissionManager {\n return new PermissionManager(config)\n}\n\n/**\n * Default permission manager instance\n */\nlet defaultManager: PermissionManager | null = null\n\n/**\n * Get the default permission manager\n */\nexport function getDefaultPermissionManager(): PermissionManager {\n if (!defaultManager) {\n defaultManager = createPermissionManager()\n }\n return defaultManager\n}\n\n/**\n * Set the default permission manager\n */\nexport function setDefaultPermissionManager(manager: PermissionManager): void {\n defaultManager = manager\n}\n","/**\n * Version detection\n *\n * Detects configuration version for migration.\n */\n\nimport type {\n LegacyCodexConfig,\n ModernCodexConfig,\n VersionDetectionResult,\n} from './types.js'\n\n/**\n * Detect configuration version\n */\nexport function detectVersion(config: unknown): VersionDetectionResult {\n if (!config || typeof config !== 'object') {\n return {\n version: 'unknown',\n confidence: 'high',\n reason: 'Invalid configuration object',\n }\n }\n\n const obj = config as Record<string, unknown>\n\n // Check for explicit version field (v3.0)\n if (obj.version === '3.0') {\n return {\n version: '3.0',\n confidence: 'high',\n reason: 'Explicit version field found',\n }\n }\n\n // Check for v3.0 structure markers\n if (isModernConfig(config)) {\n return {\n version: '3.0',\n confidence: 'medium',\n reason: 'Modern structure detected (organization object, sync.patterns)',\n }\n }\n\n // Check for v2.x markers\n if (isLegacyConfig(config)) {\n return {\n version: '2.x',\n confidence: 'high',\n reason: 'Legacy structure detected (org/defaultOrg/codexRepo at top level)',\n }\n }\n\n // Ambiguous - check for any recognizable fields\n const knownFields = [\n 'org',\n 'defaultOrg',\n 'codexRepo',\n 'autoSync',\n 'syncRules',\n 'organization',\n 'sync',\n 'cache',\n ]\n\n const hasKnownFields = knownFields.some((field) => field in obj)\n\n if (hasKnownFields) {\n return {\n version: '2.x',\n confidence: 'low',\n reason: 'Some known fields found, assuming v2.x',\n }\n }\n\n return {\n version: 'unknown',\n confidence: 'high',\n reason: 'No recognizable configuration structure',\n }\n}\n\n/**\n * Check if config matches modern v3.0 structure\n */\nexport function isModernConfig(config: unknown): config is ModernCodexConfig {\n if (!config || typeof config !== 'object') {\n return false\n }\n\n const obj = config as Record<string, unknown>\n\n // Must have organization object with name and codexRepo\n if (!obj.organization || typeof obj.organization !== 'object') {\n return false\n }\n\n const org = obj.organization as Record<string, unknown>\n if (typeof org.name !== 'string' || typeof org.codexRepo !== 'string') {\n return false\n }\n\n // Must have sync object with patterns array\n if (!obj.sync || typeof obj.sync !== 'object') {\n return false\n }\n\n const sync = obj.sync as Record<string, unknown>\n if (!Array.isArray(sync.patterns)) {\n return false\n }\n\n return true\n}\n\n/**\n * Check if config matches legacy v2.x structure\n */\nexport function isLegacyConfig(config: unknown): config is LegacyCodexConfig {\n if (!config || typeof config !== 'object') {\n return false\n }\n\n const obj = config as Record<string, unknown>\n\n // Look for v2.x markers\n const legacyMarkers = ['org', 'defaultOrg', 'codexRepo', 'codexPath']\n const hasLegacyMarker = legacyMarkers.some(\n (marker) => marker in obj && typeof obj[marker] === 'string'\n )\n\n if (hasLegacyMarker) {\n return true\n }\n\n // Check for legacy autoSync array\n if (Array.isArray(obj.autoSync)) {\n return true\n }\n\n // Check for legacy syncRules object\n if (obj.syncRules && typeof obj.syncRules === 'object') {\n const syncRules = obj.syncRules as Record<string, unknown>\n if (Array.isArray(syncRules.include) || Array.isArray(syncRules.exclude)) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Check if migration is needed\n */\nexport function needsMigration(config: unknown): boolean {\n const detection = detectVersion(config)\n return detection.version === '2.x'\n}\n\n/**\n * Get migration requirements\n */\nexport function getMigrationRequirements(config: unknown): string[] {\n const requirements: string[] = []\n\n if (!config || typeof config !== 'object') {\n requirements.push('Valid configuration object required')\n return requirements\n }\n\n const obj = config as Record<string, unknown>\n\n // Check org\n if (!obj.org && !obj.defaultOrg) {\n requirements.push('Organization name is required (org or defaultOrg)')\n }\n\n // Check codex repo\n if (!obj.codexRepo && !obj.codexPath) {\n requirements.push('Codex repository name is required (codexRepo or codexPath)')\n }\n\n return requirements\n}\n","/**\n * Configuration migrator\n *\n * Migrates v2.x configurations to v3.0 format.\n */\n\nimport type {\n LegacyCodexConfig,\n LegacyAutoSyncPattern,\n ModernCodexConfig,\n ModernSyncPattern,\n MigrationResult,\n MigrationOptions,\n} from './types.js'\nimport { detectVersion, isLegacyConfig, isModernConfig } from './detector.js'\n\n/**\n * Default migration options\n */\nexport const DEFAULT_MIGRATION_OPTIONS: MigrationOptions = {\n preserveUnknown: false,\n strict: false,\n defaultOrg: 'organization',\n defaultCodexRepo: 'codex',\n}\n\n/**\n * Migrate configuration from v2.x to v3.0\n */\nexport function migrateConfig(\n config: unknown,\n options: MigrationOptions = {}\n): MigrationResult {\n const mergedOptions = { ...DEFAULT_MIGRATION_OPTIONS, ...options }\n const result: MigrationResult = {\n success: false,\n warnings: [],\n errors: [],\n changes: [],\n }\n\n // Detect version\n const detection = detectVersion(config)\n\n if (detection.version === '3.0') {\n if (isModernConfig(config)) {\n result.success = true\n result.config = config\n result.warnings.push('Configuration is already v3.0, no migration needed')\n return result\n }\n }\n\n if (detection.version === 'unknown') {\n result.errors.push(`Cannot migrate: ${detection.reason}`)\n return result\n }\n\n if (!isLegacyConfig(config)) {\n result.errors.push('Configuration does not match expected v2.x format')\n return result\n }\n\n try {\n const migrated = performMigration(config, mergedOptions, result)\n result.config = migrated\n result.success = true\n } catch (error) {\n result.errors.push(\n `Migration failed: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n\n return result\n}\n\n/**\n * Perform the actual migration\n */\nfunction performMigration(\n legacy: LegacyCodexConfig,\n options: MigrationOptions,\n result: MigrationResult\n): ModernCodexConfig {\n // Extract org name\n const orgName = legacy.org || legacy.defaultOrg || options.defaultOrg!\n\n if (legacy.org && legacy.defaultOrg && legacy.org !== legacy.defaultOrg) {\n result.warnings.push(\n `Both 'org' and 'defaultOrg' specified with different values. Using 'org': ${legacy.org}`\n )\n }\n\n if (!legacy.org && !legacy.defaultOrg) {\n result.changes.push({\n type: 'added',\n path: 'organization.name',\n newValue: orgName,\n description: `Added default organization name: ${orgName}`,\n })\n } else {\n const fieldUsed = legacy.org ? 'org' : 'defaultOrg'\n result.changes.push({\n type: 'renamed',\n path: 'organization.name',\n oldValue: fieldUsed,\n newValue: 'organization.name',\n description: `Renamed '${fieldUsed}' to 'organization.name'`,\n })\n }\n\n // Extract codex repo\n const codexRepo = legacy.codexRepo || legacy.codexPath || options.defaultCodexRepo!\n\n if (legacy.codexRepo && legacy.codexPath && legacy.codexRepo !== legacy.codexPath) {\n result.warnings.push(\n `Both 'codexRepo' and 'codexPath' specified with different values. Using 'codexRepo': ${legacy.codexRepo}`\n )\n }\n\n if (!legacy.codexRepo && !legacy.codexPath) {\n result.changes.push({\n type: 'added',\n path: 'organization.codexRepo',\n newValue: codexRepo,\n description: `Added default codex repository: ${codexRepo}`,\n })\n } else {\n const fieldUsed = legacy.codexRepo ? 'codexRepo' : 'codexPath'\n result.changes.push({\n type: 'renamed',\n path: 'organization.codexRepo',\n oldValue: fieldUsed,\n newValue: 'organization.codexRepo',\n description: `Renamed '${fieldUsed}' to 'organization.codexRepo'`,\n })\n }\n\n // Migrate auto-sync patterns\n const patterns: ModernSyncPattern[] = []\n\n if (legacy.autoSync && legacy.autoSync.length > 0) {\n for (const legacyPattern of legacy.autoSync) {\n const modernPattern = migrateSyncPattern(legacyPattern, result)\n patterns.push(modernPattern)\n }\n\n result.changes.push({\n type: 'transformed',\n path: 'sync.patterns',\n oldValue: 'autoSync',\n newValue: 'sync.patterns',\n description: `Converted ${legacy.autoSync.length} auto-sync pattern(s) to modern format`,\n })\n }\n\n // Migrate sync rules\n const include: string[] = []\n const exclude: string[] = []\n\n if (legacy.syncRules) {\n if (legacy.syncRules.include) {\n include.push(...legacy.syncRules.include)\n result.changes.push({\n type: 'renamed',\n path: 'sync.include',\n oldValue: 'syncRules.include',\n newValue: 'sync.include',\n description: 'Moved syncRules.include to sync.include',\n })\n }\n\n if (legacy.syncRules.exclude) {\n exclude.push(...legacy.syncRules.exclude)\n result.changes.push({\n type: 'renamed',\n path: 'sync.exclude',\n oldValue: 'syncRules.exclude',\n newValue: 'sync.exclude',\n description: 'Moved syncRules.exclude to sync.exclude',\n })\n }\n }\n\n // Build modern config\n const modern: ModernCodexConfig = {\n version: '3.0',\n organization: {\n name: orgName,\n codexRepo,\n },\n sync: {\n patterns,\n include,\n exclude,\n defaultDirection: 'to-codex',\n },\n }\n\n // Migrate environments\n if (legacy.environments) {\n modern.environments = {}\n\n for (const [envName, envConfig] of Object.entries(legacy.environments)) {\n const envResult: MigrationResult = {\n success: false,\n warnings: [],\n errors: [],\n changes: [],\n }\n\n try {\n const migratedEnv = performMigration(\n { ...legacy, ...envConfig } as LegacyCodexConfig,\n { ...options },\n envResult\n )\n\n // Extract only the overrides\n modern.environments[envName] = {\n organization: migratedEnv.organization,\n sync: migratedEnv.sync,\n }\n\n result.changes.push({\n type: 'transformed',\n path: `environments.${envName}`,\n description: `Migrated environment '${envName}'`,\n })\n\n result.warnings.push(...envResult.warnings.map((w) => `[${envName}] ${w}`))\n } catch {\n result.warnings.push(`Failed to migrate environment '${envName}', skipping`)\n }\n }\n }\n\n result.changes.push({\n type: 'added',\n path: 'version',\n newValue: '3.0',\n description: 'Added version field',\n })\n\n return modern\n}\n\n/**\n * Migrate a single sync pattern\n */\nfunction migrateSyncPattern(\n legacy: LegacyAutoSyncPattern,\n result: MigrationResult\n): ModernSyncPattern {\n const modern: ModernSyncPattern = {\n pattern: legacy.pattern,\n }\n\n if (legacy.destination) {\n modern.target = legacy.destination\n }\n\n if (legacy.bidirectional) {\n modern.direction = 'bidirectional'\n }\n\n if (legacy.targets && legacy.targets.length > 0) {\n result.warnings.push(\n `Pattern '${legacy.pattern}' had multiple targets (${legacy.targets.join(', ')}). ` +\n 'In v3.0, each target should be a separate pattern.'\n )\n\n // Use first target\n if (!modern.target && legacy.targets[0]) {\n modern.target = legacy.targets[0]\n }\n }\n\n return modern\n}\n\n/**\n * Validate migrated configuration\n */\nexport function validateMigratedConfig(config: ModernCodexConfig): string[] {\n const errors: string[] = []\n\n if (config.version !== '3.0') {\n errors.push(`Invalid version: ${config.version}, expected '3.0'`)\n }\n\n if (!config.organization) {\n errors.push('Missing organization configuration')\n } else {\n if (!config.organization.name) {\n errors.push('Missing organization.name')\n }\n if (!config.organization.codexRepo) {\n errors.push('Missing organization.codexRepo')\n }\n }\n\n if (!config.sync) {\n errors.push('Missing sync configuration')\n } else {\n if (!Array.isArray(config.sync.patterns)) {\n errors.push('sync.patterns must be an array')\n }\n if (!Array.isArray(config.sync.include)) {\n errors.push('sync.include must be an array')\n }\n if (!Array.isArray(config.sync.exclude)) {\n errors.push('sync.exclude must be an array')\n }\n }\n\n return errors\n}\n\n/**\n * Generate migration report\n */\nexport function generateMigrationReport(result: MigrationResult): string {\n const lines: string[] = ['# Migration Report', '']\n\n if (result.success) {\n lines.push('Status: SUCCESS')\n } else {\n lines.push('Status: FAILED')\n }\n\n lines.push('')\n\n if (result.changes.length > 0) {\n lines.push('## Changes', '')\n\n for (const change of result.changes) {\n lines.push(`- [${change.type.toUpperCase()}] ${change.path}: ${change.description}`)\n }\n\n lines.push('')\n }\n\n if (result.warnings.length > 0) {\n lines.push('## Warnings', '')\n\n for (const warning of result.warnings) {\n lines.push(`- ${warning}`)\n }\n\n lines.push('')\n }\n\n if (result.errors.length > 0) {\n lines.push('## Errors', '')\n\n for (const error of result.errors) {\n lines.push(`- ${error}`)\n }\n\n lines.push('')\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Create empty modern config\n */\nexport function createEmptyModernConfig(\n org: string,\n codexRepo: string\n): ModernCodexConfig {\n return {\n version: '3.0',\n organization: {\n name: org,\n codexRepo,\n },\n sync: {\n patterns: [],\n include: ['**/*.md', 'CLAUDE.md'],\n exclude: ['**/node_modules/**', '**/.git/**'],\n defaultDirection: 'to-codex',\n },\n }\n}\n","/**\n * Legacy reference migration\n *\n * Converts legacy reference formats to modern codex:// URIs.\n */\n\n/**\n * Legacy reference patterns\n */\nexport const LEGACY_PATTERNS = {\n /** @codex: style references */\n CODEX_TAG: /@codex:\\s*([^\\s\\]]+)/g,\n /** [codex:...] style references */\n CODEX_BRACKET: /\\[codex:\\s*([^\\]]+)\\]/g,\n /** {{codex:...}} style references */\n CODEX_MUSTACHE: /\\{\\{codex:\\s*([^}]+)\\}\\}/g,\n /** Simple path references in specific contexts */\n SIMPLE_PATH: /codex\\/([a-zA-Z0-9_-]+\\/[a-zA-Z0-9_\\-/.]+)/g,\n}\n\n/**\n * Reference conversion result\n */\nexport interface ReferenceConversionResult {\n /** Original text */\n original: string\n /** Converted text */\n converted: string\n /** References found and converted */\n references: ConvertedReference[]\n /** Whether any changes were made */\n modified: boolean\n}\n\n/**\n * Converted reference\n */\nexport interface ConvertedReference {\n /** Original reference text */\n original: string\n /** Converted URI */\n uri: string\n /** Position in original text */\n position: number\n /** Format detected */\n format: 'codex-tag' | 'codex-bracket' | 'codex-mustache' | 'simple-path'\n}\n\n/**\n * Conversion options\n */\nexport interface ConversionOptions {\n /** Default organization */\n defaultOrg?: string\n /** Default project */\n defaultProject?: string\n /** Whether to preserve original format wrapper */\n preserveWrapper?: boolean\n}\n\n/**\n * Convert legacy references in text\n */\nexport function convertLegacyReferences(\n text: string,\n options: ConversionOptions = {}\n): ReferenceConversionResult {\n const result: ReferenceConversionResult = {\n original: text,\n converted: text,\n references: [],\n modified: false,\n }\n\n // Process each pattern type\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_TAG,\n 'codex-tag',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_BRACKET,\n 'codex-bracket',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_MUSTACHE,\n 'codex-mustache',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.SIMPLE_PATH,\n 'simple-path',\n options,\n result.references\n )\n\n result.modified = result.original !== result.converted\n\n return result\n}\n\n/**\n * Process a single pattern type\n */\nfunction processPattern(\n text: string,\n pattern: RegExp,\n format: ConvertedReference['format'],\n options: ConversionOptions,\n references: ConvertedReference[]\n): string {\n // Reset pattern lastIndex\n pattern.lastIndex = 0\n\n return text.replace(pattern, (match, captured: string, offset: number) => {\n const uri = convertToUri(captured.trim(), options)\n\n references.push({\n original: match,\n uri,\n position: offset,\n format,\n })\n\n // Return the appropriate format\n if (options.preserveWrapper) {\n switch (format) {\n case 'codex-tag':\n return `@codex: ${uri}`\n case 'codex-bracket':\n return `[${uri}]`\n case 'codex-mustache':\n return `{{${uri}}}`\n case 'simple-path':\n return uri\n }\n }\n\n return uri\n })\n}\n\n/**\n * Convert a path/reference to codex:// URI\n */\nexport function convertToUri(reference: string, options: ConversionOptions = {}): string {\n const trimmed = reference.trim()\n\n // Already a codex:// URI\n if (trimmed.startsWith('codex://')) {\n return trimmed\n }\n\n // Parse the reference to extract components\n const parts = parseReference(trimmed)\n\n // Build URI\n const org = parts.org || options.defaultOrg || '_'\n const project = parts.project || options.defaultProject || '_'\n const path = parts.path\n\n return `codex://${org}/${project}/${path}`\n}\n\n/**\n * Parse reference components\n */\ninterface ParsedReferenceComponents {\n org?: string\n project?: string\n path: string\n}\n\nfunction parseReference(reference: string): ParsedReferenceComponents {\n // Handle various formats:\n // - org/project/path\n // - project/path (org inferred)\n // - path (org and project inferred)\n // - ./path (relative)\n // - ../path (relative)\n\n const trimmed = reference.trim()\n\n // Handle relative paths\n if (trimmed.startsWith('./') || trimmed.startsWith('../')) {\n return { path: trimmed }\n }\n\n // Split by /\n const parts = trimmed.split('/')\n\n if (parts.length >= 3) {\n // Assume org/project/path format\n const [org, project, ...rest] = parts\n return {\n org: org || undefined,\n project: project || undefined,\n path: rest.join('/'),\n }\n }\n\n if (parts.length === 2) {\n // For legacy reference migration, treat 2-part paths as file paths\n // Common directory names like docs, src, specs should not be inferred as projects\n // Only explicit org/project/path format (3+ parts) will extract org/project\n\n return { path: trimmed }\n }\n\n // Single part - just the path\n return { path: trimmed }\n}\n\n/**\n * Find all legacy references in text (without converting)\n */\nexport function findLegacyReferences(text: string): ConvertedReference[] {\n const references: ConvertedReference[] = []\n\n for (const [name, pattern] of Object.entries(LEGACY_PATTERNS)) {\n pattern.lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = pattern.exec(text)) !== null) {\n const format = name\n .toLowerCase()\n .replace('_', '-') as ConvertedReference['format']\n\n references.push({\n original: match[0],\n uri: match[1] || '',\n position: match.index,\n format,\n })\n }\n }\n\n // Sort by position\n references.sort((a, b) => a.position - b.position)\n\n return references\n}\n\n/**\n * Check if text contains legacy references\n */\nexport function hasLegacyReferences(text: string): boolean {\n for (const pattern of Object.values(LEGACY_PATTERNS)) {\n pattern.lastIndex = 0\n if (pattern.test(text)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Migrate all references in a file content\n */\nexport function migrateFileReferences(\n content: string,\n options: ConversionOptions = {}\n): ReferenceConversionResult {\n return convertLegacyReferences(content, options)\n}\n\n/**\n * Generate reference migration summary\n */\nexport function generateReferenceMigrationSummary(\n results: ReferenceConversionResult[]\n): string {\n const lines: string[] = ['# Reference Migration Summary', '']\n\n let totalRefs = 0\n let modifiedFiles = 0\n\n for (const result of results) {\n if (result.modified) {\n modifiedFiles++\n }\n totalRefs += result.references.length\n }\n\n lines.push(`- Total files processed: ${results.length}`)\n lines.push(`- Files with changes: ${modifiedFiles}`)\n lines.push(`- Total references converted: ${totalRefs}`)\n lines.push('')\n\n // Group by format\n const byFormat = new Map<string, number>()\n\n for (const result of results) {\n for (const ref of result.references) {\n byFormat.set(ref.format, (byFormat.get(ref.format) || 0) + 1)\n }\n }\n\n if (byFormat.size > 0) {\n lines.push('## References by Format', '')\n\n for (const [format, count] of byFormat.entries()) {\n lines.push(`- ${format}: ${count}`)\n }\n }\n\n return lines.join('\\n')\n}\n","/**\n * Environment Variable Utilities\n *\n * Provides functions for expanding environment variables in configuration values.\n * Supports ${VAR_NAME} syntax.\n */\n\n/**\n * Options for environment variable expansion\n */\nexport interface ExpandEnvOptions {\n /**\n * Environment variables to use (default: process.env)\n */\n env?: Record<string, string | undefined>\n\n /**\n * Whether to warn about missing variables (default: false)\n */\n warnOnMissing?: boolean\n\n /**\n * Callback for missing variables\n */\n onMissing?: (varName: string) => void\n}\n\n/**\n * Expand environment variables in a string value\n *\n * Supports ${VAR_NAME} syntax. If a variable is not found,\n * the original placeholder is preserved.\n *\n * @example\n * ```typescript\n * expandEnvVars('Hello ${USER}')\n * // => 'Hello alice' (if USER=alice)\n *\n * expandEnvVars('Token: ${GITHUB_TOKEN}')\n * // => 'Token: ${GITHUB_TOKEN}' (if GITHUB_TOKEN not set)\n * ```\n */\nexport function expandEnvVars(\n value: string,\n options: ExpandEnvOptions = {}\n): string {\n const env = options.env ?? process.env\n\n return value.replace(/\\$\\{([^}]+)\\}/g, (match, varName: string) => {\n const envValue = env[varName]\n\n if (envValue === undefined) {\n if (options.warnOnMissing) {\n console.warn(`Warning: Environment variable ${varName} is not set`)\n }\n if (options.onMissing) {\n options.onMissing(varName)\n }\n // Keep original if not found\n return match\n }\n\n return envValue\n })\n}\n\n/**\n * Recursively expand environment variables in a configuration object\n *\n * Walks through all string values in the object and expands ${VAR_NAME}\n * placeholders using environment variables.\n *\n * @example\n * ```typescript\n * const config = {\n * token: '${GITHUB_TOKEN}',\n * nested: {\n * url: '${API_URL}/v1'\n * },\n * items: ['${ITEM_1}', '${ITEM_2}']\n * }\n *\n * expandEnvVarsInConfig(config)\n * // Expands all ${...} placeholders in string values\n * ```\n */\nexport function expandEnvVarsInConfig<T>(\n config: T,\n options: ExpandEnvOptions = {}\n): T {\n if (typeof config === 'string') {\n return expandEnvVars(config, options) as T\n }\n\n if (Array.isArray(config)) {\n return config.map((item) => expandEnvVarsInConfig(item, options)) as T\n }\n\n if (config !== null && typeof config === 'object') {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(config)) {\n result[key] = expandEnvVarsInConfig(value, options)\n }\n return result as T\n }\n\n return config\n}\n\n/**\n * Check if a string contains environment variable placeholders\n */\nexport function hasEnvVars(value: string): boolean {\n return /\\$\\{[^}]+\\}/.test(value)\n}\n\n/**\n * Extract environment variable names from a string\n *\n * @example\n * ```typescript\n * extractEnvVarNames('${USER}@${HOST}:${PORT}')\n * // => ['USER', 'HOST', 'PORT']\n * ```\n */\nexport function extractEnvVarNames(value: string): string[] {\n const matches = value.matchAll(/\\$\\{([^}]+)\\}/g)\n const names: string[] = []\n for (const match of matches) {\n if (match[1]) {\n names.push(match[1])\n }\n }\n return names\n}\n","/**\n * YAML Configuration Utilities\n *\n * Provides functions for reading and parsing YAML configuration files,\n * with support for the unified config format.\n */\n\nimport * as fs from 'fs/promises'\nimport * as yaml from 'js-yaml'\nimport { expandEnvVarsInConfig, type ExpandEnvOptions } from '../env/index.js'\n\n/**\n * Storage provider type\n */\nexport type StorageProviderType = 'local' | 'github' | 'http' | 's3'\n\n/**\n * Local filesystem storage configuration\n */\nexport interface LocalStorageConfig {\n type: 'local'\n basePath: string\n followSymlinks?: boolean\n priority?: number\n}\n\n/**\n * GitHub storage configuration\n */\nexport interface GitHubStorageConfig {\n type: 'github'\n token?: string\n apiBaseUrl?: string\n rawBaseUrl?: string\n branch?: string\n priority?: number\n}\n\n/**\n * HTTP storage configuration\n */\nexport interface HttpStorageConfig {\n type: 'http'\n baseUrl: string\n headers?: Record<string, string>\n timeout?: number\n priority?: number\n}\n\n/**\n * S3 storage configuration\n */\nexport interface S3StorageConfig {\n type: 's3'\n bucket: string\n region?: string\n accessKeyId?: string\n secretAccessKey?: string\n priority?: number\n}\n\n/**\n * Union type for all storage providers\n */\nexport type StorageProviderConfig =\n | LocalStorageConfig\n | GitHubStorageConfig\n | HttpStorageConfig\n | S3StorageConfig\n\n/**\n * Cache configuration\n *\n * Note: Both `directory` and `cacheDir` are supported for backward compatibility.\n * - `cacheDir` is the preferred field name (matches CLI and top-level config)\n * - `directory` is the legacy field name (used in older cache-specific configs)\n * When both are present, `cacheDir` takes precedence.\n */\nexport interface CacheConfig {\n /** @deprecated Use cacheDir instead. Legacy field for backward compatibility. */\n directory?: string\n /** Directory for storing cache files (preferred) */\n cacheDir?: string\n /** Default TTL in seconds for cached entries */\n defaultTtl?: number\n /** Maximum total size of cache in bytes */\n maxSize?: number\n /** Maximum number of entries in memory cache */\n maxMemoryEntries?: number\n /** Maximum size of memory cache in bytes */\n maxMemorySize?: number\n /** Whether to persist cache to disk */\n enablePersistence?: boolean\n}\n\n/**\n * Custom artifact type definition\n */\nexport interface CustomTypeConfig {\n description?: string\n patterns?: string[]\n defaultTtl?: number\n archiveAfterDays?: number | null\n archiveStorage?: 'local' | 'cloud' | 'drive' | null\n}\n\n/**\n * Types configuration\n */\nexport interface TypesConfig {\n custom?: Record<string, CustomTypeConfig>\n}\n\n/**\n * Permission level\n */\nexport type PermissionLevel = 'none' | 'read' | 'write' | 'admin'\n\n/**\n * Permission rule\n */\nexport interface PermissionRule {\n pattern: string\n permission: PermissionLevel\n users?: string[]\n}\n\n/**\n * Permissions configuration\n */\nexport interface PermissionsConfig {\n default?: PermissionLevel\n rules?: PermissionRule[]\n}\n\n/**\n * Directional sync configuration\n */\nexport interface DirectionalSyncConfig {\n include: string[]\n exclude?: string[]\n}\n\n/**\n * Sync rule\n */\nexport interface SyncRule {\n pattern: string\n direction?: 'to-codex' | 'from-codex' | 'bidirectional'\n}\n\n/**\n * Sync configuration\n */\nexport interface SyncConfig {\n bidirectional?: boolean\n conflictResolution?: 'prompt' | 'local' | 'remote' | 'newest' | 'skip'\n exclude?: string[]\n rules?: SyncRule[]\n to_codex?: DirectionalSyncConfig\n from_codex?: DirectionalSyncConfig\n default_to_codex?: string[]\n default_from_codex?: string[]\n environments?: Record<string, string>\n}\n\n/**\n * MCP server configuration\n */\nexport interface McpConfig {\n enabled?: boolean\n port?: number\n}\n\n/**\n * Project archive configuration\n */\nexport interface ProjectArchiveConfig {\n /** S3 bucket for archived files */\n bucket?: string\n /** S3 prefix/path for archived files */\n prefix?: string\n /** Storage class (STANDARD, GLACIER, etc.) */\n storageClass?: string\n}\n\n/**\n * Archive configuration\n *\n * Configures S3-based archival for project artifacts.\n */\nexport interface ArchiveConfig {\n /** Per-project archive settings */\n projects?: Record<string, ProjectArchiveConfig>\n}\n\n/**\n * File plugin configuration\n */\nexport interface FileConfig {\n sources?: Array<{\n name: string\n path: string\n type?: string\n }>\n}\n\n/**\n * Codex YAML configuration (unified format)\n *\n * This is the format for the codex: section in .fractary/config.yaml\n */\nexport interface CodexYamlConfig {\n organization: string\n project?: string\n codex_repo?: string\n cacheDir?: string\n cache?: CacheConfig\n storage?: StorageProviderConfig[]\n types?: TypesConfig\n permissions?: PermissionsConfig\n sync?: SyncConfig\n mcp?: McpConfig\n archive?: ArchiveConfig\n}\n\n/**\n * Unified configuration file format\n *\n * Contains codex section and optionally other sections (file, etc.)\n */\nexport interface UnifiedConfig {\n codex?: CodexYamlConfig\n file?: FileConfig\n [key: string]: unknown\n}\n\n/**\n * Options for reading configuration\n */\nexport interface ReadConfigOptions {\n /**\n * Whether to expand environment variables (default: true)\n */\n expandEnv?: boolean\n\n /**\n * Environment variables to use (default: process.env)\n */\n env?: Record<string, string | undefined>\n\n /**\n * Whether to warn about missing env vars (default: false)\n */\n warnOnMissingEnv?: boolean\n}\n\n/**\n * Read and parse a YAML configuration file\n *\n * Supports both unified config format (with `codex:` section)\n * and legacy flat format. Automatically expands environment variables.\n *\n * @example\n * ```typescript\n * // Unified format (recommended)\n * // config.yaml:\n * // codex:\n * // organization: myorg\n * // storage:\n * // - type: github\n * // token: ${GITHUB_TOKEN}\n *\n * const config = await readCodexConfig('.fractary/config.yaml')\n * // config.organization === 'myorg'\n * // config.storage[0].token === actual GITHUB_TOKEN value\n * ```\n */\nexport async function readCodexConfig(\n configPath: string,\n options: ReadConfigOptions = {}\n): Promise<CodexYamlConfig> {\n const content = await fs.readFile(configPath, 'utf-8')\n const rawConfig = yaml.load(content) as Record<string, unknown>\n\n // Handle unified config format (has `codex:` section)\n // Note: We use double cast (as unknown as T) because js-yaml returns\n // a generic object type that doesn't overlap with our strict interface.\n // The runtime check (rawConfig?.codex && typeof ...) ensures safety.\n let config: CodexYamlConfig\n if (rawConfig?.codex && typeof rawConfig.codex === 'object') {\n config = rawConfig.codex as unknown as CodexYamlConfig\n } else {\n // Legacy flat format - treat entire config as CodexYamlConfig\n config = rawConfig as unknown as CodexYamlConfig\n }\n\n if (!config.organization) {\n throw new Error('Invalid config: organization is required')\n }\n\n // Expand environment variables by default\n if (options.expandEnv !== false) {\n const envOptions: ExpandEnvOptions = {\n env: options.env,\n warnOnMissing: options.warnOnMissingEnv,\n }\n config = expandEnvVarsInConfig(config, envOptions)\n }\n\n return config\n}\n\n/**\n * Read the full unified configuration file\n *\n * Returns the complete config including non-codex sections (file, etc.)\n *\n * @example\n * ```typescript\n * const unified = await readUnifiedConfig('.fractary/config.yaml')\n * // unified.codex - Codex configuration\n * // unified.file - File plugin configuration\n * ```\n */\nexport async function readUnifiedConfig(\n configPath: string,\n options: ReadConfigOptions = {}\n): Promise<UnifiedConfig> {\n const content = await fs.readFile(configPath, 'utf-8')\n let config = yaml.load(content) as UnifiedConfig\n\n // Expand environment variables by default\n if (options.expandEnv !== false) {\n const envOptions: ExpandEnvOptions = {\n env: options.env,\n warnOnMissing: options.warnOnMissingEnv,\n }\n config = expandEnvVarsInConfig(config, envOptions)\n }\n\n return config\n}\n\n/**\n * Check if a config file uses the unified format\n */\nexport function isUnifiedConfig(config: unknown): config is UnifiedConfig {\n if (config === null || typeof config !== 'object') {\n return false\n }\n const maybeUnified = config as Record<string, unknown>\n // Check for codex section that is a non-null object\n // Note: typeof null === 'object' in JS, so we need explicit null check\n return (\n 'codex' in maybeUnified &&\n maybeUnified.codex !== null &&\n typeof maybeUnified.codex === 'object'\n )\n}\n","/**\n * Core Utilities\n *\n * Common utility functions for parsing durations, sizes, and other values.\n */\n\n/**\n * Duration unit multipliers in seconds\n */\nconst DURATION_MULTIPLIERS: Record<string, number> = {\n s: 1, // seconds\n m: 60, // minutes\n h: 3600, // hours\n d: 86400, // days\n w: 604800, // weeks (7 days)\n M: 2592000, // months (30 days)\n y: 31536000, // years (365 days)\n}\n\n/**\n * Size unit multipliers in bytes\n */\nconst SIZE_MULTIPLIERS: Record<string, number> = {\n B: 1,\n KB: 1024,\n MB: 1024 * 1024,\n GB: 1024 * 1024 * 1024,\n TB: 1024 * 1024 * 1024 * 1024,\n}\n\n/**\n * Parse a duration string to seconds\n *\n * Supports formats like: \"1h\", \"24h\", \"7d\", \"1w\", \"1M\", \"1y\"\n *\n * @example\n * ```typescript\n * parseDuration('30s') // => 30\n * parseDuration('5m') // => 300\n * parseDuration('2h') // => 7200\n * parseDuration('7d') // => 604800\n * parseDuration('1w') // => 604800\n * parseDuration('1M') // => 2592000\n * parseDuration('1y') // => 31536000\n * parseDuration(3600) // => 3600 (pass-through)\n * ```\n *\n * @param duration - Duration string or number\n * @returns Duration in seconds\n * @throws Error if the format is invalid\n */\nexport function parseDuration(duration: string | number): number {\n if (typeof duration === 'number') {\n return duration\n }\n\n const match = duration.match(/^(\\d+(?:\\.\\d+)?)\\s*([smhdwMy])$/)\n if (!match || !match[1] || !match[2]) {\n throw new Error(`Invalid duration format: ${duration}. Use format like \"1h\", \"7d\", \"1M\"`)\n }\n\n const valueStr = match[1]\n const unit = match[2]\n const value = parseFloat(valueStr)\n const multiplier = DURATION_MULTIPLIERS[unit]\n\n if (multiplier === undefined) {\n throw new Error(`Unknown duration unit: ${unit}`)\n }\n\n return Math.round(value * multiplier)\n}\n\n/**\n * Parse a size string to bytes\n *\n * Supports formats like: \"100B\", \"50KB\", \"100MB\", \"1GB\", \"1TB\"\n *\n * @example\n * ```typescript\n * parseSize('100B') // => 100\n * parseSize('50KB') // => 51200\n * parseSize('100MB') // => 104857600\n * parseSize('1GB') // => 1073741824\n * parseSize(1024) // => 1024 (pass-through)\n * ```\n *\n * @param size - Size string or number\n * @returns Size in bytes\n * @throws Error if the format is invalid\n */\nexport function parseSize(size: string | number): number {\n if (typeof size === 'number') {\n return size\n }\n\n const match = size.match(/^(\\d+(?:\\.\\d+)?)\\s*(B|KB|MB|GB|TB)$/i)\n if (!match || !match[1] || !match[2]) {\n throw new Error(`Invalid size format: ${size}. Use format like \"100MB\", \"1GB\"`)\n }\n\n const valueStr = match[1]\n const unit = match[2]\n const value = parseFloat(valueStr)\n const multiplier = SIZE_MULTIPLIERS[unit.toUpperCase()]\n\n if (multiplier === undefined) {\n throw new Error(`Unknown size unit: ${unit}`)\n }\n\n return Math.round(value * multiplier)\n}\n\n/**\n * Format bytes to human-readable size\n *\n * @example\n * ```typescript\n * formatBytes(100) // => '100 B'\n * formatBytes(1024) // => '1.0 KB'\n * formatBytes(1536) // => '1.5 KB'\n * formatBytes(1048576) // => '1.0 MB'\n * formatBytes(1073741824) // => '1.0 GB'\n * ```\n */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n *\n * @example\n * ```typescript\n * formatDuration(500) // => '500ms'\n * formatDuration(1500) // => '1.5s'\n * formatDuration(60000) // => '1.0m'\n * formatDuration(3600000) // => '1.0h'\n * ```\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`\n if (ms < 3600000) return `${(ms / 60000).toFixed(1)}m`\n return `${(ms / 3600000).toFixed(1)}h`\n}\n\n/**\n * Format seconds to human-readable duration string\n *\n * @example\n * ```typescript\n * formatSeconds(30) // => '30s'\n * formatSeconds(90) // => '1.5m'\n * formatSeconds(3600) // => '1.0h'\n * formatSeconds(86400) // => '1.0d'\n * ```\n */\nexport function formatSeconds(seconds: number): string {\n if (seconds < 60) return `${seconds}s`\n if (seconds < 3600) return `${(seconds / 60).toFixed(1)}m`\n if (seconds < 86400) return `${(seconds / 3600).toFixed(1)}h`\n return `${(seconds / 86400).toFixed(1)}d`\n}\n\n/**\n * Check if a value is a valid duration string\n */\nexport function isValidDuration(value: string): boolean {\n return /^\\d+(?:\\.\\d+)?\\s*[smhdwMy]$/.test(value)\n}\n\n/**\n * Check if a value is a valid size string\n */\nexport function isValidSize(value: string): boolean {\n return /^\\d+(?:\\.\\d+)?\\s*(B|KB|MB|GB|TB)$/i.test(value)\n}\n","/**\n * MCP Tool definitions and handlers\n *\n * Implements the tools exposed by the Codex MCP server.\n */\n\nimport type { CacheManager } from '@fractary/codex'\nimport type { StorageManager } from '@fractary/codex'\nimport { resolveReference } from '@fractary/codex'\nimport type {\n McpTool,\n ToolResult,\n FetchToolArgs,\n SearchToolArgs,\n ListToolArgs,\n CacheClearToolArgs,\n} from './types.js'\n\n/**\n * Tool definitions for the MCP server\n */\nexport const CODEX_TOOLS: McpTool[] = [\n {\n name: 'codex_document_fetch',\n description: 'Fetch a document from the Codex knowledge base by URI. Returns the document content.',\n inputSchema: {\n type: 'object',\n properties: {\n uri: {\n type: 'string',\n description: 'Codex URI in format: codex://org/project/path/to/file.md',\n },\n branch: {\n type: 'string',\n description: 'Git branch to fetch from (default: main)',\n },\n noCache: {\n type: 'boolean',\n description: 'Bypass cache and fetch fresh content',\n },\n },\n required: ['uri'],\n },\n },\n {\n name: 'codex_search',\n description: 'Search for documents in the Codex knowledge base.',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search query string',\n },\n org: {\n type: 'string',\n description: 'Filter by organization',\n },\n project: {\n type: 'string',\n description: 'Filter by project',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results (default: 10)',\n },\n type: {\n type: 'string',\n description: 'Filter by artifact type (e.g., docs, specs, logs)',\n },\n },\n required: ['query'],\n },\n },\n {\n name: 'codex_cache_list',\n description: 'List documents in the Codex cache.',\n inputSchema: {\n type: 'object',\n properties: {\n org: {\n type: 'string',\n description: 'Filter by organization',\n },\n project: {\n type: 'string',\n description: 'Filter by project',\n },\n includeExpired: {\n type: 'boolean',\n description: 'Include expired cache entries',\n },\n },\n },\n },\n {\n name: 'codex_cache_clear',\n description: 'Clear cached documents matching a pattern.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'URI pattern to invalidate (supports regex)',\n },\n },\n required: ['pattern'],\n },\n },\n {\n name: 'codex_file_sources_list',\n description: 'List file plugin sources available in the current project.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n]\n\n/**\n * Tool handler context\n */\nexport interface ToolHandlerContext {\n cache: CacheManager\n storage: StorageManager\n}\n\n/**\n * Create a text result\n */\nfunction textResult(text: string, isError = false): ToolResult {\n return {\n content: [{ type: 'text', text }],\n isError,\n }\n}\n\n/**\n * Create a resource result\n */\nfunction resourceResult(uri: string, content: string, mimeType?: string): ToolResult {\n return {\n content: [\n {\n type: 'resource',\n resource: {\n uri,\n mimeType,\n text: content,\n },\n },\n ],\n }\n}\n\n/**\n * Handle codex_document_fetch tool\n */\nexport async function handleFetch(args: FetchToolArgs, ctx: ToolHandlerContext): Promise<ToolResult> {\n const { uri, branch, noCache } = args\n\n // Validate input\n if (!uri || typeof uri !== 'string') {\n return textResult('URI is required and must be a string', true)\n }\n\n if (branch && typeof branch !== 'string') {\n return textResult('Branch must be a string', true)\n }\n\n // Resolve the reference\n const ref = resolveReference(uri)\n if (!ref) {\n return textResult(`Invalid codex URI: ${uri}`, true)\n }\n\n try {\n let result\n\n // Check if this is a current project file plugin source\n const isFilePlugin = ref.isCurrentProject && ref.sourceType === 'file-plugin'\n\n if (noCache) {\n // Bypass cache, fetch directly\n result = await ctx.storage.fetch(ref, { branch })\n // Cache the result for next time (unless it's a file plugin source)\n if (!isFilePlugin) {\n await ctx.cache.set(uri, result)\n }\n } else {\n // Use cache (will bypass cache automatically for file plugin sources)\n result = await ctx.cache.get(ref, { branch })\n }\n\n const content = result.content.toString('utf-8')\n return resourceResult(uri, content, result.contentType)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const errorName = error instanceof Error ? error.name : 'Error'\n\n // Special handling for file plugin errors\n if (errorName === 'FilePluginFileNotFoundError') {\n // Error message already includes helpful guidance\n return textResult(message, true)\n }\n\n return textResult(`Failed to fetch ${uri}: ${message}`, true)\n }\n}\n\n/**\n * Handle codex_search tool\n *\n * Note: This is a basic implementation that searches cached entries.\n * A more sophisticated implementation might use a search index.\n */\nexport async function handleSearch(args: SearchToolArgs, ctx: ToolHandlerContext): Promise<ToolResult> {\n const { query, org, project, limit = 10 } = args\n\n // Validate input\n if (!query || typeof query !== 'string') {\n return textResult('Query is required and must be a string', true)\n }\n\n if (query.length > 500) {\n return textResult('Query too long (max 500 characters)', true)\n }\n\n if (typeof limit !== 'number' || limit < 1 || limit > 100) {\n return textResult('Limit must be a number between 1 and 100', true)\n }\n\n // Get all cached entries\n const stats = await ctx.cache.getStats()\n if (stats.entryCount === 0) {\n return textResult('No documents in cache. Use codex_document_fetch to load documents first.')\n }\n\n // This is a simplified search - in a real implementation,\n // we would use a proper search index\n // For now, we search through the cached URIs and content\n\n // Note: This is a placeholder. The actual search implementation\n // would depend on having access to the cache persistence layer's\n // list of URIs and their content.\n\n const message = `Search functionality requires a search index.\nQuery: \"${query}\"\nFilters: org=${org || 'any'}, project=${project || 'any'}\nLimit: ${limit}\n\nTo fetch documents, use codex_document_fetch with a specific URI like:\ncodex://org/project/docs/file.md`\n\n return textResult(message)\n}\n\n/**\n * Handle codex_cache_list tool\n */\nexport async function handleList(args: ListToolArgs, ctx: ToolHandlerContext): Promise<ToolResult> {\n const { org, project, includeExpired } = args\n\n // Get cache stats and any available info\n const stats = await ctx.cache.getStats()\n\n let message = `Cache Statistics:\n- Total entries: ${stats.entryCount}\n- Memory entries: ${stats.memoryEntries}\n- Memory size: ${formatBytes(stats.memorySize)}\n- Total size: ${formatBytes(stats.totalSize)}\n- Fresh: ${stats.freshCount}\n- Stale: ${stats.staleCount}\n- Expired: ${stats.expiredCount}`\n\n if (org) {\n message += `\\n\\nFiltered by org: ${org}`\n }\n if (project) {\n message += `\\nFiltered by project: ${project}`\n }\n if (includeExpired) {\n message += `\\nIncluding expired entries`\n }\n\n return textResult(message)\n}\n\n/**\n * Validate and sanitize regex pattern to prevent ReDoS attacks\n */\nfunction validateRegexPattern(pattern: string): { valid: boolean; error?: string } {\n // Check pattern length (prevent extremely long patterns)\n if (pattern.length > 1000) {\n return { valid: false, error: 'Pattern too long (max 1000 characters)' }\n }\n\n // Check for common ReDoS patterns\n const redosPatterns = [\n /(\\.\\*){3,}/, // Multiple consecutive .*\n /(\\+\\+|\\*\\*|\\?\\?)/, // Nested quantifiers\n /(\\([^)]*){10,}/, // Too many groups\n /(\\[[^\\]]{100,})/, // Very long character classes\n ]\n\n for (const redos of redosPatterns) {\n if (redos.test(pattern)) {\n return { valid: false, error: 'Pattern contains potentially dangerous constructs' }\n }\n }\n\n // Try to compile the regex to check for syntax errors\n try {\n new RegExp(pattern)\n return { valid: true }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Invalid regex'\n return { valid: false, error: message }\n }\n}\n\n/**\n * Handle codex_cache_clear tool\n */\nexport async function handleCacheClear(args: CacheClearToolArgs, ctx: ToolHandlerContext): Promise<ToolResult> {\n const { pattern } = args\n\n if (!pattern || typeof pattern !== 'string') {\n return textResult('Pattern is required and must be a string', true)\n }\n\n // Validate pattern to prevent ReDoS\n const validation = validateRegexPattern(pattern)\n if (!validation.valid) {\n return textResult(`Invalid pattern: ${validation.error}`, true)\n }\n\n try {\n const regex = new RegExp(pattern)\n const count = await ctx.cache.invalidatePattern(regex)\n\n return textResult(`Cleared ${count} cache entries matching pattern: ${pattern}`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return textResult(`Failed to clear cache: ${message}`, true)\n }\n}\n\n/**\n * Handle codex_file_sources_list tool\n */\nexport async function handleFileSourcesList(ctx: ToolHandlerContext): Promise<ToolResult> {\n try {\n // Check if file plugin provider is registered\n const filePluginProvider = ctx.storage.getProvider('file-plugin')\n\n if (!filePluginProvider) {\n return textResult(`No file plugin sources configured.\n\nTo enable file plugin integration, the storage manager must be initialized with filePlugin configuration.\n\nFile plugin sources allow codex to access current project artifacts (specs, logs, etc.) directly from the local filesystem without caching.`)\n }\n\n // For now, we can't easily extract the sources from the provider without adding more methods\n // This is a basic implementation that just confirms the provider exists\n return textResult(`File plugin provider is configured.\n\nFile plugin sources are available for current project artifact access.\nSources are read directly from local filesystem without caching.\n\nTo see available sources, check the unified configuration at:\n.fractary/config.yaml\n\nLook for the 'file.sources' section which defines:\n- specs: .fractary/specs\n- logs: .fractary/logs\n- etc.`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return textResult(`Failed to list file sources: ${message}`, true)\n }\n}\n\n/**\n * Route a tool call to its handler\n */\nexport async function handleToolCall(\n name: string,\n args: Record<string, unknown>,\n ctx: ToolHandlerContext\n): Promise<ToolResult> {\n switch (name) {\n case 'codex_document_fetch':\n return handleFetch(args as unknown as FetchToolArgs, ctx)\n case 'codex_search':\n return handleSearch(args as unknown as SearchToolArgs, ctx)\n case 'codex_cache_list':\n return handleList(args as unknown as ListToolArgs, ctx)\n case 'codex_cache_clear':\n return handleCacheClear(args as unknown as CacheClearToolArgs, ctx)\n case 'codex_file_sources_list':\n return handleFileSourcesList(ctx)\n default:\n return textResult(`Unknown tool: ${name}`, true)\n }\n}\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n}\n"],"mappings":"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","names":["exports","type","node","exports","module","exports","module","exports","module","max","str","exports","module","util","isObject","exports","module","exports","module","exports","module","exports","module","CHAR_COMMA","CHAR_LEFT_SQUARE_BRACKET","CHAR_RIGHT_SQUARE_BRACKET","CHAR_DOUBLE_QUOTE","CHAR_SINGLE_QUOTE","type","index","exports","module","require_constants","exports","module","require_utils","exports","str","exports","module","CHAR_ASTERISK","CHAR_COMMA","CHAR_LEFT_SQUARE_BRACKET","CHAR_RIGHT_SQUARE_BRACKET","str","require_parse","exports","module","type","opts","value","rest","str","source","exports","module","isObject","str","state","require_picomatch","exports","module","exports","module","util","str","util","objectUtil","json","map","map","pairs","errorUtil","errorMap","ctx","result","schema","pairs","issues","type","elements","processed","type","result","r","ZodFirstPartyTypeKind","exception","map","schema","type","extend","str","string","micromatch","__esm","__export","CODEX_URI_PREFIX","path","path","z"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/tsup/assets/cjs_shims.js","../../../node_modules/braces/lib/utils.js","../../../node_modules/braces/lib/stringify.js","../../../node_modules/is-number/index.js","../../../node_modules/to-regex-range/index.js","../../../node_modules/fill-range/index.js","../../../node_modules/braces/lib/compile.js","../../../node_modules/braces/lib/expand.js","../../../node_modules/braces/lib/constants.js","../../../node_modules/braces/lib/parse.js","../../../node_modules/braces/index.js","../../../node_modules/micromatch/node_modules/picomatch/lib/constants.js","../../../node_modules/micromatch/node_modules/picomatch/lib/utils.js","../../../node_modules/micromatch/node_modules/picomatch/lib/scan.js","../../../node_modules/micromatch/node_modules/picomatch/lib/parse.js","../../../node_modules/micromatch/node_modules/picomatch/lib/picomatch.js","../../../node_modules/micromatch/node_modules/picomatch/index.js","../../../node_modules/micromatch/index.js","../../../node_modules/js-yaml/dist/js-yaml.mjs","../src/index.ts","../src/server.ts","../src/tools.ts","../../../node_modules/zod/index.js","../../../node_modules/zod/v3/external.js","../../../node_modules/zod/v3/errors.js","../../../node_modules/zod/v3/locales/en.js","../../../node_modules/zod/v3/ZodError.js","../../../node_modules/zod/v3/helpers/util.js","../../../node_modules/zod/v3/helpers/parseUtil.js","../../../node_modules/zod/v3/types.js","../../../node_modules/zod/v3/helpers/errorUtil.js","../../../sdk/js/src/errors/CodexError.ts","../../../sdk/js/src/errors/ConfigurationError.ts","../../../sdk/js/src/errors/ValidationError.ts","../../../sdk/js/src/errors/index.ts","../../../sdk/js/src/references/validator.ts","../../../sdk/js/src/references/parser.ts","../../../sdk/js/src/references/resolver.ts","../../../sdk/js/src/references/index.ts","../../../sdk/js/src/types/built-in.ts","../../../sdk/js/src/types/registry.ts","../../../sdk/js/src/types/custom.ts","../../../sdk/js/src/types/index.ts","../../../sdk/js/src/core/patterns/matcher.ts","../../../sdk/js/src/storage/provider.ts","../../../sdk/js/src/storage/local.ts","../../../sdk/js/src/storage/github.ts","../../../sdk/js/src/storage/http.ts","../../../sdk/js/src/file-integration/source-resolver.ts","../../../sdk/js/src/file-integration/index.ts","../../../sdk/js/src/storage/errors.ts","../../../sdk/js/src/storage/file-plugin.ts","../../../sdk/js/src/utils/execFileNoThrow.ts","../../../sdk/js/src/storage/s3-archive.ts","../../../sdk/js/src/storage/manager.ts","../../../sdk/js/src/storage/index.ts","../../../sdk/js/src/cache/entry.ts","../../../sdk/js/src/cache/persistence.ts","../../../sdk/js/src/cache/manager.ts","../../../sdk/js/src/sync/directional-patterns.ts","../../../sdk/js/src/core/env/index.ts","../../../sdk/js/src/core/yaml/index.ts","../../../sdk/js/src/core/utils/index.ts","../../../sdk/js/src/index.ts","../../../sdk/js/src/schemas/metadata.ts","../../../sdk/js/src/schemas/config.ts","../../../sdk/js/src/core/metadata/parser.ts","../../../sdk/js/src/core/patterns/index.ts","../../../sdk/js/src/core/config/organization.ts","../../../sdk/js/src/core/config/defaults.ts","../../../sdk/js/src/core/config/loader.ts","../../../sdk/js/src/core/config/sync-presets.ts","../../../sdk/js/src/core/config/manager.ts","../../../sdk/js/src/core/routing/evaluator.ts","../../../sdk/js/src/core/custom/destinations.ts","../../../sdk/js/src/cache/index.ts","../../../sdk/js/src/sync/types.ts","../../../sdk/js/src/sync/evaluator.ts","../../../sdk/js/src/sync/planner.ts","../../../sdk/js/src/sync/manager.ts","../../../sdk/js/src/sync/routing-scanner.ts","../../../sdk/js/src/permissions/types.ts","../../../sdk/js/src/permissions/evaluator.ts","../../../sdk/js/src/permissions/manager.ts","../../../sdk/js/src/migration/detector.ts","../../../sdk/js/src/migration/migrator.ts","../../../sdk/js/src/migration/references.ts","../../../sdk/js/src/health/checker.ts","../../../sdk/js/src/client/codex-client.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","'use strict';\n\nexports.isInteger = num => {\n if (typeof num === 'number') {\n return Number.isInteger(num);\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isInteger(Number(num));\n }\n return false;\n};\n\n/**\n * Find a node of the given type\n */\n\nexports.find = (node, type) => node.nodes.find(node => node.type === type);\n\n/**\n * Find a node of the given type\n */\n\nexports.exceedsLimit = (min, max, step = 1, limit) => {\n if (limit === false) return false;\n if (!exports.isInteger(min) || !exports.isInteger(max)) return false;\n return ((Number(max) - Number(min)) / Number(step)) >= limit;\n};\n\n/**\n * Escape the given node with '\\\\' before node.value\n */\n\nexports.escapeNode = (block, n = 0, type) => {\n const node = block.nodes[n];\n if (!node) return;\n\n if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {\n if (node.escaped !== true) {\n node.value = '\\\\' + node.value;\n node.escaped = true;\n }\n }\n};\n\n/**\n * Returns true if the given brace node should be enclosed in literal braces\n */\n\nexports.encloseBrace = node => {\n if (node.type !== 'brace') return false;\n if ((node.commas >> 0 + node.ranges >> 0) === 0) {\n node.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a brace node is invalid.\n */\n\nexports.isInvalidBrace = block => {\n if (block.type !== 'brace') return false;\n if (block.invalid === true || block.dollar) return true;\n if ((block.commas >> 0 + block.ranges >> 0) === 0) {\n block.invalid = true;\n return true;\n }\n if (block.open !== true || block.close !== true) {\n block.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a node is an open or close node\n */\n\nexports.isOpenOrClose = node => {\n if (node.type === 'open' || node.type === 'close') {\n return true;\n }\n return node.open === true || node.close === true;\n};\n\n/**\n * Reduce an array of text nodes.\n */\n\nexports.reduce = nodes => nodes.reduce((acc, node) => {\n if (node.type === 'text') acc.push(node.value);\n if (node.type === 'range') node.type = 'text';\n return acc;\n}, []);\n\n/**\n * Flatten an array\n */\n\nexports.flatten = (...args) => {\n const result = [];\n\n const flat = arr => {\n for (let i = 0; i < arr.length; i++) {\n const ele = arr[i];\n\n if (Array.isArray(ele)) {\n flat(ele);\n continue;\n }\n\n if (ele !== undefined) {\n result.push(ele);\n }\n }\n return result;\n };\n\n flat(args);\n return result;\n};\n","'use strict';\n\nconst utils = require('./utils');\n\nmodule.exports = (ast, options = {}) => {\n const stringify = (node, parent = {}) => {\n const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);\n const invalidNode = node.invalid === true && options.escapeInvalid === true;\n let output = '';\n\n if (node.value) {\n if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) {\n return '\\\\' + node.value;\n }\n return node.value;\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes) {\n for (const child of node.nodes) {\n output += stringify(child);\n }\n }\n return output;\n };\n\n return stringify(ast);\n};\n\n","/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function(num) {\n if (typeof num === 'number') {\n return num - num === 0;\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);\n }\n return false;\n};\n","/*!\n * to-regex-range <https://github.com/micromatch/to-regex-range>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst isNumber = require('is-number');\n\nconst toRegexRange = (min, max, options) => {\n if (isNumber(min) === false) {\n throw new TypeError('toRegexRange: expected the first argument to be a number');\n }\n\n if (max === void 0 || min === max) {\n return String(min);\n }\n\n if (isNumber(max) === false) {\n throw new TypeError('toRegexRange: expected the second argument to be a number.');\n }\n\n let opts = { relaxZeros: true, ...options };\n if (typeof opts.strictZeros === 'boolean') {\n opts.relaxZeros = opts.strictZeros === false;\n }\n\n let relax = String(opts.relaxZeros);\n let shorthand = String(opts.shorthand);\n let capture = String(opts.capture);\n let wrap = String(opts.wrap);\n let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap;\n\n if (toRegexRange.cache.hasOwnProperty(cacheKey)) {\n return toRegexRange.cache[cacheKey].result;\n }\n\n let a = Math.min(min, max);\n let b = Math.max(min, max);\n\n if (Math.abs(a - b) === 1) {\n let result = min + '|' + max;\n if (opts.capture) {\n return `(${result})`;\n }\n if (opts.wrap === false) {\n return result;\n }\n return `(?:${result})`;\n }\n\n let isPadded = hasPadding(min) || hasPadding(max);\n let state = { min, max, a, b };\n let positives = [];\n let negatives = [];\n\n if (isPadded) {\n state.isPadded = isPadded;\n state.maxLen = String(state.max).length;\n }\n\n if (a < 0) {\n let newMin = b < 0 ? Math.abs(b) : 1;\n negatives = splitToPatterns(newMin, Math.abs(a), state, opts);\n a = state.a = 0;\n }\n\n if (b >= 0) {\n positives = splitToPatterns(a, b, state, opts);\n }\n\n state.negatives = negatives;\n state.positives = positives;\n state.result = collatePatterns(negatives, positives, opts);\n\n if (opts.capture === true) {\n state.result = `(${state.result})`;\n } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) {\n state.result = `(?:${state.result})`;\n }\n\n toRegexRange.cache[cacheKey] = state;\n return state.result;\n};\n\nfunction collatePatterns(neg, pos, options) {\n let onlyNegative = filterPatterns(neg, pos, '-', false, options) || [];\n let onlyPositive = filterPatterns(pos, neg, '', false, options) || [];\n let intersected = filterPatterns(neg, pos, '-?', true, options) || [];\n let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);\n return subpatterns.join('|');\n}\n\nfunction splitToRanges(min, max) {\n let nines = 1;\n let zeros = 1;\n\n let stop = countNines(min, nines);\n let stops = new Set([max]);\n\n while (min <= stop && stop <= max) {\n stops.add(stop);\n nines += 1;\n stop = countNines(min, nines);\n }\n\n stop = countZeros(max + 1, zeros) - 1;\n\n while (min < stop && stop <= max) {\n stops.add(stop);\n zeros += 1;\n stop = countZeros(max + 1, zeros) - 1;\n }\n\n stops = [...stops];\n stops.sort(compare);\n return stops;\n}\n\n/**\n * Convert a range to a regex pattern\n * @param {Number} `start`\n * @param {Number} `stop`\n * @return {String}\n */\n\nfunction rangeToPattern(start, stop, options) {\n if (start === stop) {\n return { pattern: start, count: [], digits: 0 };\n }\n\n let zipped = zip(start, stop);\n let digits = zipped.length;\n let pattern = '';\n let count = 0;\n\n for (let i = 0; i < digits; i++) {\n let [startDigit, stopDigit] = zipped[i];\n\n if (startDigit === stopDigit) {\n pattern += startDigit;\n\n } else if (startDigit !== '0' || stopDigit !== '9') {\n pattern += toCharacterClass(startDigit, stopDigit, options);\n\n } else {\n count++;\n }\n }\n\n if (count) {\n pattern += options.shorthand === true ? '\\\\d' : '[0-9]';\n }\n\n return { pattern, count: [count], digits };\n}\n\nfunction splitToPatterns(min, max, tok, options) {\n let ranges = splitToRanges(min, max);\n let tokens = [];\n let start = min;\n let prev;\n\n for (let i = 0; i < ranges.length; i++) {\n let max = ranges[i];\n let obj = rangeToPattern(String(start), String(max), options);\n let zeros = '';\n\n if (!tok.isPadded && prev && prev.pattern === obj.pattern) {\n if (prev.count.length > 1) {\n prev.count.pop();\n }\n\n prev.count.push(obj.count[0]);\n prev.string = prev.pattern + toQuantifier(prev.count);\n start = max + 1;\n continue;\n }\n\n if (tok.isPadded) {\n zeros = padZeros(max, tok, options);\n }\n\n obj.string = zeros + obj.pattern + toQuantifier(obj.count);\n tokens.push(obj);\n start = max + 1;\n prev = obj;\n }\n\n return tokens;\n}\n\nfunction filterPatterns(arr, comparison, prefix, intersection, options) {\n let result = [];\n\n for (let ele of arr) {\n let { string } = ele;\n\n // only push if _both_ are negative...\n if (!intersection && !contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n\n // or _both_ are positive\n if (intersection && contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n }\n return result;\n}\n\n/**\n * Zip strings\n */\n\nfunction zip(a, b) {\n let arr = [];\n for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]);\n return arr;\n}\n\nfunction compare(a, b) {\n return a > b ? 1 : b > a ? -1 : 0;\n}\n\nfunction contains(arr, key, val) {\n return arr.some(ele => ele[key] === val);\n}\n\nfunction countNines(min, len) {\n return Number(String(min).slice(0, -len) + '9'.repeat(len));\n}\n\nfunction countZeros(integer, zeros) {\n return integer - (integer % Math.pow(10, zeros));\n}\n\nfunction toQuantifier(digits) {\n let [start = 0, stop = ''] = digits;\n if (stop || start > 1) {\n return `{${start + (stop ? ',' + stop : '')}}`;\n }\n return '';\n}\n\nfunction toCharacterClass(a, b, options) {\n return `[${a}${(b - a === 1) ? '' : '-'}${b}]`;\n}\n\nfunction hasPadding(str) {\n return /^-?(0+)\\d/.test(str);\n}\n\nfunction padZeros(value, tok, options) {\n if (!tok.isPadded) {\n return value;\n }\n\n let diff = Math.abs(tok.maxLen - String(value).length);\n let relax = options.relaxZeros !== false;\n\n switch (diff) {\n case 0:\n return '';\n case 1:\n return relax ? '0?' : '0';\n case 2:\n return relax ? '0{0,2}' : '00';\n default: {\n return relax ? `0{0,${diff}}` : `0{${diff}}`;\n }\n }\n}\n\n/**\n * Cache\n */\n\ntoRegexRange.cache = {};\ntoRegexRange.clearCache = () => (toRegexRange.cache = {});\n\n/**\n * Expose `toRegexRange`\n */\n\nmodule.exports = toRegexRange;\n","/*!\n * fill-range <https://github.com/jonschlinkert/fill-range>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nconst util = require('util');\nconst toRegexRange = require('to-regex-range');\n\nconst isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\n\nconst transform = toNumber => {\n return value => toNumber === true ? Number(value) : String(value);\n};\n\nconst isValidValue = value => {\n return typeof value === 'number' || (typeof value === 'string' && value !== '');\n};\n\nconst isNumber = num => Number.isInteger(+num);\n\nconst zeros = input => {\n let value = `${input}`;\n let index = -1;\n if (value[0] === '-') value = value.slice(1);\n if (value === '0') return false;\n while (value[++index] === '0');\n return index > 0;\n};\n\nconst stringify = (start, end, options) => {\n if (typeof start === 'string' || typeof end === 'string') {\n return true;\n }\n return options.stringify === true;\n};\n\nconst pad = (input, maxLength, toNumber) => {\n if (maxLength > 0) {\n let dash = input[0] === '-' ? '-' : '';\n if (dash) input = input.slice(1);\n input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));\n }\n if (toNumber === false) {\n return String(input);\n }\n return input;\n};\n\nconst toMaxLen = (input, maxLength) => {\n let negative = input[0] === '-' ? '-' : '';\n if (negative) {\n input = input.slice(1);\n maxLength--;\n }\n while (input.length < maxLength) input = '0' + input;\n return negative ? ('-' + input) : input;\n};\n\nconst toSequence = (parts, options, maxLen) => {\n parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n\n let prefix = options.capture ? '' : '?:';\n let positives = '';\n let negatives = '';\n let result;\n\n if (parts.positives.length) {\n positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|');\n }\n\n if (parts.negatives.length) {\n negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`;\n }\n\n if (positives && negatives) {\n result = `${positives}|${negatives}`;\n } else {\n result = positives || negatives;\n }\n\n if (options.wrap) {\n return `(${prefix}${result})`;\n }\n\n return result;\n};\n\nconst toRange = (a, b, isNumbers, options) => {\n if (isNumbers) {\n return toRegexRange(a, b, { wrap: false, ...options });\n }\n\n let start = String.fromCharCode(a);\n if (a === b) return start;\n\n let stop = String.fromCharCode(b);\n return `[${start}-${stop}]`;\n};\n\nconst toRegex = (start, end, options) => {\n if (Array.isArray(start)) {\n let wrap = options.wrap === true;\n let prefix = options.capture ? '' : '?:';\n return wrap ? `(${prefix}${start.join('|')})` : start.join('|');\n }\n return toRegexRange(start, end, options);\n};\n\nconst rangeError = (...args) => {\n return new RangeError('Invalid range arguments: ' + util.inspect(...args));\n};\n\nconst invalidRange = (start, end, options) => {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n};\n\nconst invalidStep = (step, options) => {\n if (options.strictRanges === true) {\n throw new TypeError(`Expected step \"${step}\" to be a number`);\n }\n return [];\n};\n\nconst fillNumbers = (start, end, step = 1, options = {}) => {\n let a = Number(start);\n let b = Number(end);\n\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n }\n\n // fix negative zero\n if (a === 0) a = 0;\n if (b === 0) b = 0;\n\n let descending = a > b;\n let startString = String(start);\n let endString = String(end);\n let stepString = String(step);\n step = Math.max(Math.abs(step), 1);\n\n let padded = zeros(startString) || zeros(endString) || zeros(stepString);\n let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;\n let toNumber = padded === false && stringify(start, end, options) === false;\n let format = options.transform || transform(toNumber);\n\n if (options.toRegex && step === 1) {\n return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);\n }\n\n let parts = { negatives: [], positives: [] };\n let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n if (options.toRegex === true && step > 1) {\n push(a);\n } else {\n range.push(pad(format(a, index), maxLen, toNumber));\n }\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return step > 1\n ? toSequence(parts, options, maxLen)\n : toRegex(range, null, { wrap: false, ...options });\n }\n\n return range;\n};\n\nconst fillLetters = (start, end, step = 1, options = {}) => {\n if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {\n return invalidRange(start, end, options);\n }\n\n let format = options.transform || (val => String.fromCharCode(val));\n let a = `${start}`.charCodeAt(0);\n let b = `${end}`.charCodeAt(0);\n\n let descending = a > b;\n let min = Math.min(a, b);\n let max = Math.max(a, b);\n\n if (options.toRegex && step === 1) {\n return toRange(min, max, false, options);\n }\n\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n range.push(format(a, index));\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return toRegex(range, null, { wrap: false, options });\n }\n\n return range;\n};\n\nconst fill = (start, end, step, options = {}) => {\n if (end == null && isValidValue(start)) {\n return [start];\n }\n\n if (!isValidValue(start) || !isValidValue(end)) {\n return invalidRange(start, end, options);\n }\n\n if (typeof step === 'function') {\n return fill(start, end, 1, { transform: step });\n }\n\n if (isObject(step)) {\n return fill(start, end, 0, step);\n }\n\n let opts = { ...options };\n if (opts.capture === true) opts.wrap = true;\n step = step || opts.step || 1;\n\n if (!isNumber(step)) {\n if (step != null && !isObject(step)) return invalidStep(step, opts);\n return fill(start, end, 1, step);\n }\n\n if (isNumber(start) && isNumber(end)) {\n return fillNumbers(start, end, step, opts);\n }\n\n return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);\n};\n\nmodule.exports = fill;\n","'use strict';\n\nconst fill = require('fill-range');\nconst utils = require('./utils');\n\nconst compile = (ast, options = {}) => {\n const walk = (node, parent = {}) => {\n const invalidBlock = utils.isInvalidBrace(parent);\n const invalidNode = node.invalid === true && options.escapeInvalid === true;\n const invalid = invalidBlock === true || invalidNode === true;\n const prefix = options.escapeInvalid === true ? '\\\\' : '';\n let output = '';\n\n if (node.isOpen === true) {\n return prefix + node.value;\n }\n\n if (node.isClose === true) {\n console.log('node.isClose', prefix, node.value);\n return prefix + node.value;\n }\n\n if (node.type === 'open') {\n return invalid ? prefix + node.value : '(';\n }\n\n if (node.type === 'close') {\n return invalid ? prefix + node.value : ')';\n }\n\n if (node.type === 'comma') {\n return node.prev.type === 'comma' ? '' : invalid ? node.value : '|';\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes && node.ranges > 0) {\n const args = utils.reduce(node.nodes);\n const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true });\n\n if (range.length !== 0) {\n return args.length > 1 && range.length > 1 ? `(${range})` : range;\n }\n }\n\n if (node.nodes) {\n for (const child of node.nodes) {\n output += walk(child, node);\n }\n }\n\n return output;\n };\n\n return walk(ast);\n};\n\nmodule.exports = compile;\n","'use strict';\n\nconst fill = require('fill-range');\nconst stringify = require('./stringify');\nconst utils = require('./utils');\n\nconst append = (queue = '', stash = '', enclose = false) => {\n const result = [];\n\n queue = [].concat(queue);\n stash = [].concat(stash);\n\n if (!stash.length) return queue;\n if (!queue.length) {\n return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;\n }\n\n for (const item of queue) {\n if (Array.isArray(item)) {\n for (const value of item) {\n result.push(append(value, stash, enclose));\n }\n } else {\n for (let ele of stash) {\n if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;\n result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele);\n }\n }\n }\n return utils.flatten(result);\n};\n\nconst expand = (ast, options = {}) => {\n const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit;\n\n const walk = (node, parent = {}) => {\n node.queue = [];\n\n let p = parent;\n let q = parent.queue;\n\n while (p.type !== 'brace' && p.type !== 'root' && p.parent) {\n p = p.parent;\n q = p.queue;\n }\n\n if (node.invalid || node.dollar) {\n q.push(append(q.pop(), stringify(node, options)));\n return;\n }\n\n if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {\n q.push(append(q.pop(), ['{}']));\n return;\n }\n\n if (node.nodes && node.ranges > 0) {\n const args = utils.reduce(node.nodes);\n\n if (utils.exceedsLimit(...args, options.step, rangeLimit)) {\n throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');\n }\n\n let range = fill(...args, options);\n if (range.length === 0) {\n range = stringify(node, options);\n }\n\n q.push(append(q.pop(), range));\n node.nodes = [];\n return;\n }\n\n const enclose = utils.encloseBrace(node);\n let queue = node.queue;\n let block = node;\n\n while (block.type !== 'brace' && block.type !== 'root' && block.parent) {\n block = block.parent;\n queue = block.queue;\n }\n\n for (let i = 0; i < node.nodes.length; i++) {\n const child = node.nodes[i];\n\n if (child.type === 'comma' && node.type === 'brace') {\n if (i === 1) queue.push('');\n queue.push('');\n continue;\n }\n\n if (child.type === 'close') {\n q.push(append(q.pop(), queue, enclose));\n continue;\n }\n\n if (child.value && child.type !== 'open') {\n queue.push(append(queue.pop(), child.value));\n continue;\n }\n\n if (child.nodes) {\n walk(child, node);\n }\n }\n\n return queue;\n };\n\n return utils.flatten(walk(ast));\n};\n\nmodule.exports = expand;\n","'use strict';\n\nmodule.exports = {\n MAX_LENGTH: 10000,\n\n // Digits\n CHAR_0: '0', /* 0 */\n CHAR_9: '9', /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 'A', /* A */\n CHAR_LOWERCASE_A: 'a', /* a */\n CHAR_UPPERCASE_Z: 'Z', /* Z */\n CHAR_LOWERCASE_Z: 'z', /* z */\n\n CHAR_LEFT_PARENTHESES: '(', /* ( */\n CHAR_RIGHT_PARENTHESES: ')', /* ) */\n\n CHAR_ASTERISK: '*', /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: '&', /* & */\n CHAR_AT: '@', /* @ */\n CHAR_BACKSLASH: '\\\\', /* \\ */\n CHAR_BACKTICK: '`', /* ` */\n CHAR_CARRIAGE_RETURN: '\\r', /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */\n CHAR_COLON: ':', /* : */\n CHAR_COMMA: ',', /* , */\n CHAR_DOLLAR: '$', /* . */\n CHAR_DOT: '.', /* . */\n CHAR_DOUBLE_QUOTE: '\"', /* \" */\n CHAR_EQUAL: '=', /* = */\n CHAR_EXCLAMATION_MARK: '!', /* ! */\n CHAR_FORM_FEED: '\\f', /* \\f */\n CHAR_FORWARD_SLASH: '/', /* / */\n CHAR_HASH: '#', /* # */\n CHAR_HYPHEN_MINUS: '-', /* - */\n CHAR_LEFT_ANGLE_BRACKET: '<', /* < */\n CHAR_LEFT_CURLY_BRACE: '{', /* { */\n CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */\n CHAR_LINE_FEED: '\\n', /* \\n */\n CHAR_NO_BREAK_SPACE: '\\u00A0', /* \\u00A0 */\n CHAR_PERCENT: '%', /* % */\n CHAR_PLUS: '+', /* + */\n CHAR_QUESTION_MARK: '?', /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */\n CHAR_RIGHT_CURLY_BRACE: '}', /* } */\n CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */\n CHAR_SEMICOLON: ';', /* ; */\n CHAR_SINGLE_QUOTE: '\\'', /* ' */\n CHAR_SPACE: ' ', /* */\n CHAR_TAB: '\\t', /* \\t */\n CHAR_UNDERSCORE: '_', /* _ */\n CHAR_VERTICAL_LINE: '|', /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\\uFEFF' /* \\uFEFF */\n};\n","'use strict';\n\nconst stringify = require('./stringify');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n CHAR_BACKSLASH, /* \\ */\n CHAR_BACKTICK, /* ` */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_RIGHT_SQUARE_BRACKET, /* ] */\n CHAR_DOUBLE_QUOTE, /* \" */\n CHAR_SINGLE_QUOTE, /* ' */\n CHAR_NO_BREAK_SPACE,\n CHAR_ZERO_WIDTH_NOBREAK_SPACE\n} = require('./constants');\n\n/**\n * parse\n */\n\nconst parse = (input, options = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n const opts = options || {};\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n if (input.length > max) {\n throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);\n }\n\n const ast = { type: 'root', input, nodes: [] };\n const stack = [ast];\n let block = ast;\n let prev = ast;\n let brackets = 0;\n const length = input.length;\n let index = 0;\n let depth = 0;\n let value;\n\n /**\n * Helpers\n */\n\n const advance = () => input[index++];\n const push = node => {\n if (node.type === 'text' && prev.type === 'dot') {\n prev.type = 'text';\n }\n\n if (prev && prev.type === 'text' && node.type === 'text') {\n prev.value += node.value;\n return;\n }\n\n block.nodes.push(node);\n node.parent = block;\n node.prev = prev;\n prev = node;\n return node;\n };\n\n push({ type: 'bos' });\n\n while (index < length) {\n block = stack[stack.length - 1];\n value = advance();\n\n /**\n * Invalid chars\n */\n\n if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) {\n continue;\n }\n\n /**\n * Escaped chars\n */\n\n if (value === CHAR_BACKSLASH) {\n push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() });\n continue;\n }\n\n /**\n * Right square bracket (literal): ']'\n */\n\n if (value === CHAR_RIGHT_SQUARE_BRACKET) {\n push({ type: 'text', value: '\\\\' + value });\n continue;\n }\n\n /**\n * Left square bracket: '['\n */\n\n if (value === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n\n let next;\n\n while (index < length && (next = advance())) {\n value += next;\n\n if (next === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n continue;\n }\n\n if (next === CHAR_BACKSLASH) {\n value += advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n brackets--;\n\n if (brackets === 0) {\n break;\n }\n }\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === CHAR_LEFT_PARENTHESES) {\n block = push({ type: 'paren', nodes: [] });\n stack.push(block);\n push({ type: 'text', value });\n continue;\n }\n\n if (value === CHAR_RIGHT_PARENTHESES) {\n if (block.type !== 'paren') {\n push({ type: 'text', value });\n continue;\n }\n block = stack.pop();\n push({ type: 'text', value });\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Quotes: '|\"|`\n */\n\n if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {\n const open = value;\n let next;\n\n if (options.keepQuotes !== true) {\n value = '';\n }\n\n while (index < length && (next = advance())) {\n if (next === CHAR_BACKSLASH) {\n value += next + advance();\n continue;\n }\n\n if (next === open) {\n if (options.keepQuotes === true) value += next;\n break;\n }\n\n value += next;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Left curly brace: '{'\n */\n\n if (value === CHAR_LEFT_CURLY_BRACE) {\n depth++;\n\n const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;\n const brace = {\n type: 'brace',\n open: true,\n close: false,\n dollar,\n depth,\n commas: 0,\n ranges: 0,\n nodes: []\n };\n\n block = push(brace);\n stack.push(block);\n push({ type: 'open', value });\n continue;\n }\n\n /**\n * Right curly brace: '}'\n */\n\n if (value === CHAR_RIGHT_CURLY_BRACE) {\n if (block.type !== 'brace') {\n push({ type: 'text', value });\n continue;\n }\n\n const type = 'close';\n block = stack.pop();\n block.close = true;\n\n push({ type, value });\n depth--;\n\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Comma: ','\n */\n\n if (value === CHAR_COMMA && depth > 0) {\n if (block.ranges > 0) {\n block.ranges = 0;\n const open = block.nodes.shift();\n block.nodes = [open, { type: 'text', value: stringify(block) }];\n }\n\n push({ type: 'comma', value });\n block.commas++;\n continue;\n }\n\n /**\n * Dot: '.'\n */\n\n if (value === CHAR_DOT && depth > 0 && block.commas === 0) {\n const siblings = block.nodes;\n\n if (depth === 0 || siblings.length === 0) {\n push({ type: 'text', value });\n continue;\n }\n\n if (prev.type === 'dot') {\n block.range = [];\n prev.value += value;\n prev.type = 'range';\n\n if (block.nodes.length !== 3 && block.nodes.length !== 5) {\n block.invalid = true;\n block.ranges = 0;\n prev.type = 'text';\n continue;\n }\n\n block.ranges++;\n block.args = [];\n continue;\n }\n\n if (prev.type === 'range') {\n siblings.pop();\n\n const before = siblings[siblings.length - 1];\n before.value += prev.value + value;\n prev = before;\n block.ranges--;\n continue;\n }\n\n push({ type: 'dot', value });\n continue;\n }\n\n /**\n * Text\n */\n\n push({ type: 'text', value });\n }\n\n // Mark imbalanced braces and brackets as invalid\n do {\n block = stack.pop();\n\n if (block.type !== 'root') {\n block.nodes.forEach(node => {\n if (!node.nodes) {\n if (node.type === 'open') node.isOpen = true;\n if (node.type === 'close') node.isClose = true;\n if (!node.nodes) node.type = 'text';\n node.invalid = true;\n }\n });\n\n // get the location of the block on parent.nodes (block's siblings)\n const parent = stack[stack.length - 1];\n const index = parent.nodes.indexOf(block);\n // replace the (invalid) block with it's nodes\n parent.nodes.splice(index, 1, ...block.nodes);\n }\n } while (stack.length > 0);\n\n push({ type: 'eos' });\n return ast;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst stringify = require('./lib/stringify');\nconst compile = require('./lib/compile');\nconst expand = require('./lib/expand');\nconst parse = require('./lib/parse');\n\n/**\n * Expand the given pattern or create a regex-compatible string.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)']\n * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c']\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\nconst braces = (input, options = {}) => {\n let output = [];\n\n if (Array.isArray(input)) {\n for (const pattern of input) {\n const result = braces.create(pattern, options);\n if (Array.isArray(result)) {\n output.push(...result);\n } else {\n output.push(result);\n }\n }\n } else {\n output = [].concat(braces.create(input, options));\n }\n\n if (options && options.expand === true && options.nodupes === true) {\n output = [...new Set(output)];\n }\n return output;\n};\n\n/**\n * Parse the given `str` with the given `options`.\n *\n * ```js\n * // braces.parse(pattern, [, options]);\n * const ast = braces.parse('a/{b,c}/d');\n * console.log(ast);\n * ```\n * @param {String} pattern Brace pattern to parse\n * @param {Object} options\n * @return {Object} Returns an AST\n * @api public\n */\n\nbraces.parse = (input, options = {}) => parse(input, options);\n\n/**\n * Creates a braces string from an AST, or an AST node.\n *\n * ```js\n * const braces = require('braces');\n * let ast = braces.parse('foo/{a,b}/bar');\n * console.log(stringify(ast.nodes[2])); //=> '{a,b}'\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.stringify = (input, options = {}) => {\n if (typeof input === 'string') {\n return stringify(braces.parse(input, options), options);\n }\n return stringify(input, options);\n};\n\n/**\n * Compiles a brace pattern into a regex-compatible, optimized string.\n * This method is called by the main [braces](#braces) function by default.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.compile('a/{b,c}/d'));\n * //=> ['a/(b|c)/d']\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.compile = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n return compile(input, options);\n};\n\n/**\n * Expands a brace pattern into an array. This method is called by the\n * main [braces](#braces) function when `options.expand` is true. Before\n * using this method it's recommended that you read the [performance notes](#performance))\n * and advantages of using [.compile](#compile) instead.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.expand('a/{b,c}/d'));\n * //=> ['a/b/d', 'a/c/d'];\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.expand = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n\n let result = expand(input, options);\n\n // filter out empty strings if specified\n if (options.noempty === true) {\n result = result.filter(Boolean);\n }\n\n // filter out duplicates if specified\n if (options.nodupes === true) {\n result = [...new Set(result)];\n }\n\n return result;\n};\n\n/**\n * Processes a brace pattern and returns either an expanded array\n * (if `options.expand` is true), a highly optimized regex-compatible string.\n * This method is called by the main [braces](#braces) function.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))\n * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.create = (input, options = {}) => {\n if (input === '' || input.length < 3) {\n return [input];\n }\n\n return options.expand !== true\n ? braces.compile(input, options)\n : braces.expand(input, options);\n};\n\n/**\n * Expose \"braces\"\n */\n\nmodule.exports = braces;\n","'use strict';\n\nconst path = require('path');\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\n\nconst POSIX_CHARS = {\n DOT_LITERAL,\n PLUS_LITERAL,\n QMARK_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n QMARK,\n END_ANCHOR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n ...POSIX_CHARS,\n\n SLASH_LITERAL: `[${WIN_SLASH}]`,\n QMARK: WIN_NO_SLASH,\n STAR: `${WIN_NO_SLASH}*?`,\n DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n NO_DOT: `(?!${DOT_LITERAL})`,\n NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n END_ANCHOR: `(?:[${WIN_SLASH}]|$)`\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n POSIX_REGEX_SOURCE,\n\n // regular expressions\n REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n // Replace globs with equivalent patterns to reduce parsing time.\n REPLACEMENTS: {\n '***': '*',\n '**/**': '**',\n '**/**/**': '**'\n },\n\n // Digits\n CHAR_0: 48, /* 0 */\n CHAR_9: 57, /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 65, /* A */\n CHAR_LOWERCASE_A: 97, /* a */\n CHAR_UPPERCASE_Z: 90, /* Z */\n CHAR_LOWERCASE_Z: 122, /* z */\n\n CHAR_LEFT_PARENTHESES: 40, /* ( */\n CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n CHAR_ASTERISK: 42, /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: 38, /* & */\n CHAR_AT: 64, /* @ */\n CHAR_BACKWARD_SLASH: 92, /* \\ */\n CHAR_CARRIAGE_RETURN: 13, /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n CHAR_COLON: 58, /* : */\n CHAR_COMMA: 44, /* , */\n CHAR_DOT: 46, /* . */\n CHAR_DOUBLE_QUOTE: 34, /* \" */\n CHAR_EQUAL: 61, /* = */\n CHAR_EXCLAMATION_MARK: 33, /* ! */\n CHAR_FORM_FEED: 12, /* \\f */\n CHAR_FORWARD_SLASH: 47, /* / */\n CHAR_GRAVE_ACCENT: 96, /* ` */\n CHAR_HASH: 35, /* # */\n CHAR_HYPHEN_MINUS: 45, /* - */\n CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n CHAR_LEFT_CURLY_BRACE: 123, /* { */\n CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n CHAR_LINE_FEED: 10, /* \\n */\n CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n CHAR_PERCENT: 37, /* % */\n CHAR_PLUS: 43, /* + */\n CHAR_QUESTION_MARK: 63, /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n CHAR_SEMICOLON: 59, /* ; */\n CHAR_SINGLE_QUOTE: 39, /* ' */\n CHAR_SPACE: 32, /* */\n CHAR_TAB: 9, /* \\t */\n CHAR_UNDERSCORE: 95, /* _ */\n CHAR_VERTICAL_LINE: 124, /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n SEP: path.sep,\n\n /**\n * Create EXTGLOB_CHARS\n */\n\n extglobChars(chars) {\n return {\n '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n '?': { type: 'qmark', open: '(?:', close: ')?' },\n '+': { type: 'plus', open: '(?:', close: ')+' },\n '*': { type: 'star', open: '(?:', close: ')*' },\n '@': { type: 'at', open: '(?:', close: ')' }\n };\n },\n\n /**\n * Create GLOB_CHARS\n */\n\n globChars(win32) {\n return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n }\n};\n","'use strict';\n\nconst path = require('path');\nconst win32 = process.platform === 'win32';\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.supportsLookbehinds = () => {\n const segs = process.version.slice(1).split('.').map(Number);\n if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {\n return true;\n }\n return false;\n};\n\nexports.isWindows = options => {\n if (options && typeof options.windows === 'boolean') {\n return options.windows;\n }\n return win32 === true || path.sep === '\\\\';\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n","'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let negatedExtglob = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n if (code === CHAR_EXCLAMATION_MARK && index === start) {\n negatedExtglob = true;\n }\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated,\n negatedExtglob\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n","'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n POSIX_REGEX_SOURCE,\n REGEX_NON_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_BACKREF,\n REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n if (typeof options.expandRange === 'function') {\n return options.expandRange(...args, options);\n }\n\n args.sort();\n const value = `[${args.join('-')}]`;\n\n try {\n /* eslint-disable-next-line no-new */\n new RegExp(value);\n } catch (ex) {\n return args.map(v => utils.escapeRegex(v)).join('..');\n }\n\n return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n input = REPLACEMENTS[input] || input;\n\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n let len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n const tokens = [bos];\n\n const capture = opts.capture ? '' : '?:';\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const PLATFORM_CHARS = constants.globChars(win32);\n const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n const {\n DOT_LITERAL,\n PLUS_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n } = PLATFORM_CHARS;\n\n const globstar = opts => {\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const nodot = opts.dot ? '' : NO_DOT;\n const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n let star = opts.bash === true ? globstar(opts) : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n // minimatch options support\n if (typeof opts.noext === 'boolean') {\n opts.noextglob = opts.noext;\n }\n\n const state = {\n input,\n index: -1,\n start: 0,\n dot: opts.dot === true,\n consumed: '',\n output: '',\n prefix: '',\n backtrack: false,\n negated: false,\n brackets: 0,\n braces: 0,\n parens: 0,\n quotes: 0,\n globstar: false,\n tokens\n };\n\n input = utils.removePrefix(input, state);\n len = input.length;\n\n const extglobs = [];\n const braces = [];\n const stack = [];\n let prev = bos;\n let value;\n\n /**\n * Tokenizing helpers\n */\n\n const eos = () => state.index === len - 1;\n const peek = state.peek = (n = 1) => input[state.index + n];\n const advance = state.advance = () => input[++state.index] || '';\n const remaining = () => input.slice(state.index + 1);\n const consume = (value = '', num = 0) => {\n state.consumed += value;\n state.index += num;\n };\n\n const append = token => {\n state.output += token.output != null ? token.output : token.value;\n consume(token.value);\n };\n\n const negate = () => {\n let count = 1;\n\n while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n advance();\n state.start++;\n count++;\n }\n\n if (count % 2 === 0) {\n return false;\n }\n\n state.negated = true;\n state.start++;\n return true;\n };\n\n const increment = type => {\n state[type]++;\n stack.push(type);\n };\n\n const decrement = type => {\n state[type]--;\n stack.pop();\n };\n\n /**\n * Push tokens onto the tokens array. This helper speeds up\n * tokenizing by 1) helping us avoid backtracking as much as possible,\n * and 2) helping us avoid creating extra tokens when consecutive\n * characters are plain text. This improves performance and simplifies\n * lookbehinds.\n */\n\n const push = tok => {\n if (prev.type === 'globstar') {\n const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n state.output = state.output.slice(0, -prev.output.length);\n prev.type = 'star';\n prev.value = '*';\n prev.output = star;\n state.output += prev.output;\n }\n }\n\n if (extglobs.length && tok.type !== 'paren') {\n extglobs[extglobs.length - 1].inner += tok.value;\n }\n\n if (tok.value || tok.output) append(tok);\n if (prev && prev.type === 'text' && tok.type === 'text') {\n prev.value += tok.value;\n prev.output = (prev.output || '') + tok.value;\n return;\n }\n\n tok.prev = prev;\n tokens.push(tok);\n prev = tok;\n };\n\n const extglobOpen = (type, value) => {\n const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n token.prev = prev;\n token.parens = state.parens;\n token.output = state.output;\n const output = (opts.capture ? '(' : '') + token.open;\n\n increment('parens');\n push({ type, value, output: state.output ? '' : ONE_CHAR });\n push({ type: 'paren', extglob: true, value: advance(), output });\n extglobs.push(token);\n };\n\n const extglobClose = token => {\n let output = token.close + (opts.capture ? ')' : '');\n let rest;\n\n if (token.type === 'negate') {\n let extglobStar = star;\n\n if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n extglobStar = globstar(opts);\n }\n\n if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n output = token.close = `)$))${extglobStar}`;\n }\n\n if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n // In this case, we need to parse the string and use it in the output of the original pattern.\n // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n //\n // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n output = token.close = `)${expression})${extglobStar})`;\n }\n\n if (token.prev.type === 'bos') {\n state.negatedExtglob = true;\n }\n }\n\n push({ type: 'paren', extglob: true, value, output });\n decrement('parens');\n };\n\n /**\n * Fast paths\n */\n\n if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n let backslashes = false;\n\n let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n if (first === '\\\\') {\n backslashes = true;\n return m;\n }\n\n if (first === '?') {\n if (esc) {\n return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n }\n if (index === 0) {\n return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n }\n return QMARK.repeat(chars.length);\n }\n\n if (first === '.') {\n return DOT_LITERAL.repeat(chars.length);\n }\n\n if (first === '*') {\n if (esc) {\n return esc + first + (rest ? star : '');\n }\n return star;\n }\n return esc ? m : `\\\\${m}`;\n });\n\n if (backslashes === true) {\n if (opts.unescape === true) {\n output = output.replace(/\\\\/g, '');\n } else {\n output = output.replace(/\\\\+/g, m => {\n return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n });\n }\n }\n\n if (output === input && opts.contains === true) {\n state.output = input;\n return state;\n }\n\n state.output = utils.wrapOutput(output, state, options);\n return state;\n }\n\n /**\n * Tokenize input until we reach end-of-string\n */\n\n while (!eos()) {\n value = advance();\n\n if (value === '\\u0000') {\n continue;\n }\n\n /**\n * Escaped characters\n */\n\n if (value === '\\\\') {\n const next = peek();\n\n if (next === '/' && opts.bash !== true) {\n continue;\n }\n\n if (next === '.' || next === ';') {\n continue;\n }\n\n if (!next) {\n value += '\\\\';\n push({ type: 'text', value });\n continue;\n }\n\n // collapse slashes to reduce potential for exploits\n const match = /^\\\\+/.exec(remaining());\n let slashes = 0;\n\n if (match && match[0].length > 2) {\n slashes = match[0].length;\n state.index += slashes;\n if (slashes % 2 !== 0) {\n value += '\\\\';\n }\n }\n\n if (opts.unescape === true) {\n value = advance();\n } else {\n value += advance();\n }\n\n if (state.brackets === 0) {\n push({ type: 'text', value });\n continue;\n }\n }\n\n /**\n * If we're inside a regex character class, continue\n * until we reach the closing bracket.\n */\n\n if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n if (opts.posix !== false && value === ':') {\n const inner = prev.value.slice(1);\n if (inner.includes('[')) {\n prev.posix = true;\n\n if (inner.includes(':')) {\n const idx = prev.value.lastIndexOf('[');\n const pre = prev.value.slice(0, idx);\n const rest = prev.value.slice(idx + 2);\n const posix = POSIX_REGEX_SOURCE[rest];\n if (posix) {\n prev.value = pre + posix;\n state.backtrack = true;\n advance();\n\n if (!bos.output && tokens.indexOf(prev) === 1) {\n bos.output = ONE_CHAR;\n }\n continue;\n }\n }\n }\n }\n\n if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n value = `\\\\${value}`;\n }\n\n if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n value = `\\\\${value}`;\n }\n\n if (opts.posix === true && value === '!' && prev.value === '[') {\n value = '^';\n }\n\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * If we're inside a quoted string, continue\n * until we reach the closing double quote.\n */\n\n if (state.quotes === 1 && value !== '\"') {\n value = utils.escapeRegex(value);\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * Double quotes\n */\n\n if (value === '\"') {\n state.quotes = state.quotes === 1 ? 0 : 1;\n if (opts.keepQuotes === true) {\n push({ type: 'text', value });\n }\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === '(') {\n increment('parens');\n push({ type: 'paren', value });\n continue;\n }\n\n if (value === ')') {\n if (state.parens === 0 && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '('));\n }\n\n const extglob = extglobs[extglobs.length - 1];\n if (extglob && state.parens === extglob.parens + 1) {\n extglobClose(extglobs.pop());\n continue;\n }\n\n push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n decrement('parens');\n continue;\n }\n\n /**\n * Square brackets\n */\n\n if (value === '[') {\n if (opts.nobracket === true || !remaining().includes(']')) {\n if (opts.nobracket !== true && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('closing', ']'));\n }\n\n value = `\\\\${value}`;\n } else {\n increment('brackets');\n }\n\n push({ type: 'bracket', value });\n continue;\n }\n\n if (value === ']') {\n if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n if (state.brackets === 0) {\n if (opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '['));\n }\n\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n decrement('brackets');\n\n const prevValue = prev.value.slice(1);\n if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n value = `/${value}`;\n }\n\n prev.value += value;\n append({ value });\n\n // when literal brackets are explicitly disabled\n // assume we should match with a regex character class\n if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n continue;\n }\n\n const escaped = utils.escapeRegex(prev.value);\n state.output = state.output.slice(0, -prev.value.length);\n\n // when literal brackets are explicitly enabled\n // assume we should escape the brackets to match literal characters\n if (opts.literalBrackets === true) {\n state.output += escaped;\n prev.value = escaped;\n continue;\n }\n\n // when the user specifies nothing, try to match both\n prev.value = `(${capture}${escaped}|${prev.value})`;\n state.output += prev.value;\n continue;\n }\n\n /**\n * Braces\n */\n\n if (value === '{' && opts.nobrace !== true) {\n increment('braces');\n\n const open = {\n type: 'brace',\n value,\n output: '(',\n outputIndex: state.output.length,\n tokensIndex: state.tokens.length\n };\n\n braces.push(open);\n push(open);\n continue;\n }\n\n if (value === '}') {\n const brace = braces[braces.length - 1];\n\n if (opts.nobrace === true || !brace) {\n push({ type: 'text', value, output: value });\n continue;\n }\n\n let output = ')';\n\n if (brace.dots === true) {\n const arr = tokens.slice();\n const range = [];\n\n for (let i = arr.length - 1; i >= 0; i--) {\n tokens.pop();\n if (arr[i].type === 'brace') {\n break;\n }\n if (arr[i].type !== 'dots') {\n range.unshift(arr[i].value);\n }\n }\n\n output = expandRange(range, opts);\n state.backtrack = true;\n }\n\n if (brace.comma !== true && brace.dots !== true) {\n const out = state.output.slice(0, brace.outputIndex);\n const toks = state.tokens.slice(brace.tokensIndex);\n brace.value = brace.output = '\\\\{';\n value = output = '\\\\}';\n state.output = out;\n for (const t of toks) {\n state.output += (t.output || t.value);\n }\n }\n\n push({ type: 'brace', value, output });\n decrement('braces');\n braces.pop();\n continue;\n }\n\n /**\n * Pipes\n */\n\n if (value === '|') {\n if (extglobs.length > 0) {\n extglobs[extglobs.length - 1].conditions++;\n }\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Commas\n */\n\n if (value === ',') {\n let output = value;\n\n const brace = braces[braces.length - 1];\n if (brace && stack[stack.length - 1] === 'braces') {\n brace.comma = true;\n output = '|';\n }\n\n push({ type: 'comma', value, output });\n continue;\n }\n\n /**\n * Slashes\n */\n\n if (value === '/') {\n // if the beginning of the glob is \"./\", advance the start\n // to the current index, and don't add the \"./\" characters\n // to the state. This greatly simplifies lookbehinds when\n // checking for BOS characters like \"!\" and \".\" (not \"./\")\n if (prev.type === 'dot' && state.index === state.start + 1) {\n state.start = state.index + 1;\n state.consumed = '';\n state.output = '';\n tokens.pop();\n prev = bos; // reset \"prev\" to the first token\n continue;\n }\n\n push({ type: 'slash', value, output: SLASH_LITERAL });\n continue;\n }\n\n /**\n * Dots\n */\n\n if (value === '.') {\n if (state.braces > 0 && prev.type === 'dot') {\n if (prev.value === '.') prev.output = DOT_LITERAL;\n const brace = braces[braces.length - 1];\n prev.type = 'dots';\n prev.output += value;\n prev.value += value;\n brace.dots = true;\n continue;\n }\n\n if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n push({ type: 'text', value, output: DOT_LITERAL });\n continue;\n }\n\n push({ type: 'dot', value, output: DOT_LITERAL });\n continue;\n }\n\n /**\n * Question marks\n */\n\n if (value === '?') {\n const isGroup = prev && prev.value === '(';\n if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('qmark', value);\n continue;\n }\n\n if (prev && prev.type === 'paren') {\n const next = peek();\n let output = value;\n\n if (next === '<' && !utils.supportsLookbehinds()) {\n throw new Error('Node.js v10 or higher is required for regex lookbehinds');\n }\n\n if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n output = `\\\\${value}`;\n }\n\n push({ type: 'text', value, output });\n continue;\n }\n\n if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n push({ type: 'qmark', value, output: QMARK_NO_DOT });\n continue;\n }\n\n push({ type: 'qmark', value, output: QMARK });\n continue;\n }\n\n /**\n * Exclamation\n */\n\n if (value === '!') {\n if (opts.noextglob !== true && peek() === '(') {\n if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n extglobOpen('negate', value);\n continue;\n }\n }\n\n if (opts.nonegate !== true && state.index === 0) {\n negate();\n continue;\n }\n }\n\n /**\n * Plus\n */\n\n if (value === '+') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('plus', value);\n continue;\n }\n\n if ((prev && prev.value === '(') || opts.regex === false) {\n push({ type: 'plus', value, output: PLUS_LITERAL });\n continue;\n }\n\n if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n push({ type: 'plus', value });\n continue;\n }\n\n push({ type: 'plus', value: PLUS_LITERAL });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value === '@') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n push({ type: 'at', extglob: true, value, output: '' });\n continue;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value !== '*') {\n if (value === '$' || value === '^') {\n value = `\\\\${value}`;\n }\n\n const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n if (match) {\n value += match[0];\n state.index += match[0].length;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Stars\n */\n\n if (prev && (prev.type === 'globstar' || prev.star === true)) {\n prev.type = 'star';\n prev.star = true;\n prev.value += value;\n prev.output = star;\n state.backtrack = true;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n let rest = remaining();\n if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n extglobOpen('star', value);\n continue;\n }\n\n if (prev.type === 'star') {\n if (opts.noglobstar === true) {\n consume(value);\n continue;\n }\n\n const prior = prev.prev;\n const before = prior.prev;\n const isStart = prior.type === 'slash' || prior.type === 'bos';\n const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n // strip consecutive `/**/`\n while (rest.slice(0, 3) === '/**') {\n const after = input[state.index + 4];\n if (after && after !== '/') {\n break;\n }\n rest = rest.slice(3);\n consume('/**', 3);\n }\n\n if (prior.type === 'bos' && eos()) {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = globstar(opts);\n state.output = prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n prev.value += value;\n state.globstar = true;\n state.output += prior.output + prev.output;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n const end = rest[1] !== void 0 ? '|$' : '';\n\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n prev.value += value;\n\n state.output += prior.output + prev.output;\n state.globstar = true;\n\n consume(value + advance());\n\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n if (prior.type === 'bos' && rest[0] === '/') {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n state.output = prev.output;\n state.globstar = true;\n consume(value + advance());\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n // remove single star from output\n state.output = state.output.slice(0, -prev.output.length);\n\n // reset previous token to globstar\n prev.type = 'globstar';\n prev.output = globstar(opts);\n prev.value += value;\n\n // reset output with globstar\n state.output += prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n const token = { type: 'star', value, output: star };\n\n if (opts.bash === true) {\n token.output = '.*?';\n if (prev.type === 'bos' || prev.type === 'slash') {\n token.output = nodot + token.output;\n }\n push(token);\n continue;\n }\n\n if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n token.output = value;\n push(token);\n continue;\n }\n\n if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n if (prev.type === 'dot') {\n state.output += NO_DOT_SLASH;\n prev.output += NO_DOT_SLASH;\n\n } else if (opts.dot === true) {\n state.output += NO_DOTS_SLASH;\n prev.output += NO_DOTS_SLASH;\n\n } else {\n state.output += nodot;\n prev.output += nodot;\n }\n\n if (peek() !== '*') {\n state.output += ONE_CHAR;\n prev.output += ONE_CHAR;\n }\n }\n\n push(token);\n }\n\n while (state.brackets > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n state.output = utils.escapeLast(state.output, '[');\n decrement('brackets');\n }\n\n while (state.parens > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n state.output = utils.escapeLast(state.output, '(');\n decrement('parens');\n }\n\n while (state.braces > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n state.output = utils.escapeLast(state.output, '{');\n decrement('braces');\n }\n\n if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n }\n\n // rebuild the output if we had to backtrack at any point\n if (state.backtrack === true) {\n state.output = '';\n\n for (const token of state.tokens) {\n state.output += token.output != null ? token.output : token.value;\n\n if (token.suffix) {\n state.output += token.suffix;\n }\n }\n }\n\n return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n const len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n input = REPLACEMENTS[input] || input;\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const {\n DOT_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOTS_SLASH,\n STAR,\n START_ANCHOR\n } = constants.globChars(win32);\n\n const nodot = opts.dot ? NO_DOTS : NO_DOT;\n const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n const capture = opts.capture ? '' : '?:';\n const state = { negated: false, prefix: '' };\n let star = opts.bash === true ? '.*?' : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n const globstar = opts => {\n if (opts.noglobstar === true) return star;\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const create = str => {\n switch (str) {\n case '*':\n return `${nodot}${ONE_CHAR}${star}`;\n\n case '.*':\n return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*.*':\n return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*/*':\n return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n case '**':\n return nodot + globstar(opts);\n\n case '**/*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n case '**/*.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '**/.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n default: {\n const match = /^(.*?)\\.(\\w+)$/.exec(str);\n if (!match) return;\n\n const source = create(match[1]);\n if (!source) return;\n\n return source + DOT_LITERAL + match[2];\n }\n }\n };\n\n const output = utils.removePrefix(input, state);\n let source = create(output);\n\n if (source && opts.strictSlashes !== true) {\n source += `${SLASH_LITERAL}?`;\n }\n\n return source;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst path = require('path');\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n if (Array.isArray(glob)) {\n const fns = glob.map(input => picomatch(input, options, returnState));\n const arrayMatcher = str => {\n for (const isMatch of fns) {\n const state = isMatch(str);\n if (state) return state;\n }\n return false;\n };\n return arrayMatcher;\n }\n\n const isState = isObject(glob) && glob.tokens && glob.input;\n\n if (glob === '' || (typeof glob !== 'string' && !isState)) {\n throw new TypeError('Expected pattern to be a non-empty string');\n }\n\n const opts = options || {};\n const posix = utils.isWindows(options);\n const regex = isState\n ? picomatch.compileRe(glob, options)\n : picomatch.makeRe(glob, options, false, true);\n\n const state = regex.state;\n delete regex.state;\n\n let isIgnored = () => false;\n if (opts.ignore) {\n const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n }\n\n const matcher = (input, returnObject = false) => {\n const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n if (typeof opts.onResult === 'function') {\n opts.onResult(result);\n }\n\n if (isMatch === false) {\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (isIgnored(input)) {\n if (typeof opts.onIgnore === 'function') {\n opts.onIgnore(result);\n }\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (typeof opts.onMatch === 'function') {\n opts.onMatch(result);\n }\n return returnObject ? result : true;\n };\n\n if (returnState) {\n matcher.state = state;\n }\n\n return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (input === '') {\n return { isMatch: false, output: '' };\n }\n\n const opts = options || {};\n const format = opts.format || (posix ? utils.toPosixSlashes : null);\n let match = input === glob;\n let output = (match && format) ? format(input) : input;\n\n if (match === false) {\n output = format ? format(input) : input;\n match = output === glob;\n }\n\n if (match === false || opts.capture === true) {\n if (opts.matchBase === true || opts.basename === true) {\n match = picomatch.matchBase(input, regex, options, posix);\n } else {\n match = regex.exec(output);\n }\n }\n\n return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {\n const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n return regex.test(path.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n * input: '!./foo/*.js',\n * start: 3,\n * base: 'foo',\n * glob: '*.js',\n * isBrace: false,\n * isBracket: false,\n * isGlob: true,\n * isExtglob: false,\n * isGlobstar: false,\n * negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n if (returnOutput === true) {\n return state.output;\n }\n\n const opts = options || {};\n const prepend = opts.contains ? '' : '^';\n const append = opts.contains ? '' : '$';\n\n let source = `${prepend}(?:${state.output})${append}`;\n if (state && state.negated === true) {\n source = `^(?!${source}).*$`;\n }\n\n const regex = picomatch.toRegex(source, options);\n if (returnState === true) {\n regex.state = state;\n }\n\n return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n if (!input || typeof input !== 'string') {\n throw new TypeError('Expected a non-empty string');\n }\n\n let parsed = { negated: false, fastpaths: true };\n\n if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n parsed.output = parse.fastpaths(input, options);\n }\n\n if (!parsed.output) {\n parsed = parse(input, options);\n }\n\n return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n try {\n const opts = options || {};\n return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n } catch (err) {\n if (options && options.debug === true) throw err;\n return /$^/;\n }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n","'use strict';\n\nmodule.exports = require('./lib/picomatch');\n","'use strict';\n\nconst util = require('util');\nconst braces = require('braces');\nconst picomatch = require('picomatch');\nconst utils = require('picomatch/lib/utils');\n\nconst isEmptyString = v => v === '' || v === './';\nconst hasBraces = v => {\n const index = v.indexOf('{');\n return index > -1 && v.indexOf('}', index) > -1;\n};\n\n/**\n * Returns an array of strings that match one or more glob patterns.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm(list, patterns[, options]);\n *\n * console.log(mm(['a.js', 'a.txt'], ['*.js']));\n * //=> [ 'a.js' ]\n * ```\n * @param {String|Array<string>} `list` List of strings to match.\n * @param {String|Array<string>} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options)\n * @return {Array} Returns an array of matches\n * @summary false\n * @api public\n */\n\nconst micromatch = (list, patterns, options) => {\n patterns = [].concat(patterns);\n list = [].concat(list);\n\n let omit = new Set();\n let keep = new Set();\n let items = new Set();\n let negatives = 0;\n\n let onResult = state => {\n items.add(state.output);\n if (options && options.onResult) {\n options.onResult(state);\n }\n };\n\n for (let i = 0; i < patterns.length; i++) {\n let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true);\n let negated = isMatch.state.negated || isMatch.state.negatedExtglob;\n if (negated) negatives++;\n\n for (let item of list) {\n let matched = isMatch(item, true);\n\n let match = negated ? !matched.isMatch : matched.isMatch;\n if (!match) continue;\n\n if (negated) {\n omit.add(matched.output);\n } else {\n omit.delete(matched.output);\n keep.add(matched.output);\n }\n }\n }\n\n let result = negatives === patterns.length ? [...items] : [...keep];\n let matches = result.filter(item => !omit.has(item));\n\n if (options && matches.length === 0) {\n if (options.failglob === true) {\n throw new Error(`No matches found for \"${patterns.join(', ')}\"`);\n }\n\n if (options.nonull === true || options.nullglob === true) {\n return options.unescape ? patterns.map(p => p.replace(/\\\\/g, '')) : patterns;\n }\n }\n\n return matches;\n};\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.match = micromatch;\n\n/**\n * Returns a matcher function from the given glob `pattern` and `options`.\n * The returned function takes a string to match as its only argument and returns\n * true if the string is a match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matcher(pattern[, options]);\n *\n * const isMatch = mm.matcher('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @param {String} `pattern` Glob pattern\n * @param {Object} `options`\n * @return {Function} Returns a matcher function.\n * @api public\n */\n\nmicromatch.matcher = (pattern, options) => picomatch(pattern, options);\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.isMatch(string, patterns[, options]);\n *\n * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(mm.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `[options]` See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.any = micromatch.isMatch;\n\n/**\n * Returns a list of strings that _**do not match any**_ of the given `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.not(list, patterns[, options]);\n *\n * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));\n * //=> ['b.b', 'c.c']\n * ```\n * @param {Array} `list` Array of strings to match.\n * @param {String|Array} `patterns` One or more glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of strings that **do not match** the given patterns.\n * @api public\n */\n\nmicromatch.not = (list, patterns, options = {}) => {\n patterns = [].concat(patterns).map(String);\n let result = new Set();\n let items = [];\n\n let onResult = state => {\n if (options.onResult) options.onResult(state);\n items.push(state.output);\n };\n\n let matches = new Set(micromatch(list, patterns, { ...options, onResult }));\n\n for (let item of items) {\n if (!matches.has(item)) {\n result.add(item);\n }\n }\n return [...result];\n};\n\n/**\n * Returns true if the given `string` contains the given pattern. Similar\n * to [.isMatch](#isMatch) but the pattern can match any part of the string.\n *\n * ```js\n * var mm = require('micromatch');\n * // mm.contains(string, pattern[, options]);\n *\n * console.log(mm.contains('aa/bb/cc', '*b'));\n * //=> true\n * console.log(mm.contains('aa/bb/cc', '*d'));\n * //=> false\n * ```\n * @param {String} `str` The string to match.\n * @param {String|Array} `patterns` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any of the patterns matches any part of `str`.\n * @api public\n */\n\nmicromatch.contains = (str, pattern, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n if (Array.isArray(pattern)) {\n return pattern.some(p => micromatch.contains(str, p, options));\n }\n\n if (typeof pattern === 'string') {\n if (isEmptyString(str) || isEmptyString(pattern)) {\n return false;\n }\n\n if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) {\n return true;\n }\n }\n\n return micromatch.isMatch(str, pattern, { ...options, contains: true });\n};\n\n/**\n * Filter the keys of the given object with the given `glob` pattern\n * and `options`. Does not attempt to match nested keys. If you need this feature,\n * use [glob-object][] instead.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matchKeys(object, patterns[, options]);\n *\n * const obj = { aa: 'a', ab: 'b', ac: 'c' };\n * console.log(mm.matchKeys(obj, '*b'));\n * //=> { ab: 'b' }\n * ```\n * @param {Object} `object` The object with keys to filter.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Object} Returns an object with only keys that match the given patterns.\n * @api public\n */\n\nmicromatch.matchKeys = (obj, patterns, options) => {\n if (!utils.isObject(obj)) {\n throw new TypeError('Expected the first argument to be an object');\n }\n let keys = micromatch(Object.keys(obj), patterns, options);\n let res = {};\n for (let key of keys) res[key] = obj[key];\n return res;\n};\n\n/**\n * Returns true if some of the strings in the given `list` match any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.some(list, patterns[, options]);\n *\n * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // true\n * console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any `patterns` matches any of the strings in `list`\n * @api public\n */\n\nmicromatch.some = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (items.some(item => isMatch(item))) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns true if every string in the given `list` matches\n * any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.every(list, patterns[, options]);\n *\n * console.log(mm.every('foo.js', ['foo.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // false\n * console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if all `patterns` matches all of the strings in `list`\n * @api public\n */\n\nmicromatch.every = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (!items.every(item => isMatch(item))) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns true if **all** of the given `patterns` match\n * the specified string.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.all(string, patterns[, options]);\n *\n * console.log(mm.all('foo.js', ['foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', '!foo.js']));\n * // false\n *\n * console.log(mm.all('foo.js', ['*.js', 'foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));\n * // true\n * ```\n * @param {String|Array} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.all = (str, patterns, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n return [].concat(patterns).every(p => picomatch(p, options)(str));\n};\n\n/**\n * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.capture(pattern, string[, options]);\n *\n * console.log(mm.capture('test/*.js', 'test/foo.js'));\n * //=> ['foo']\n * console.log(mm.capture('test/*.js', 'foo/bar.css'));\n * //=> null\n * ```\n * @param {String} `glob` Glob pattern to use for matching.\n * @param {String} `input` String to match\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array|null} Returns an array of captures if the input matches the glob pattern, otherwise `null`.\n * @api public\n */\n\nmicromatch.capture = (glob, input, options) => {\n let posix = utils.isWindows(options);\n let regex = picomatch.makeRe(String(glob), { ...options, capture: true });\n let match = regex.exec(posix ? utils.toPosixSlashes(input) : input);\n\n if (match) {\n return match.slice(1).map(v => v === void 0 ? '' : v);\n }\n};\n\n/**\n * Create a regular expression from the given glob `pattern`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.makeRe(pattern[, options]);\n *\n * console.log(mm.makeRe('*.js'));\n * //=> /^(?:(\\.[\\\\\\/])?(?!\\.)(?=.)[^\\/]*?\\.js)$/\n * ```\n * @param {String} `pattern` A glob pattern to convert to regex.\n * @param {Object} `options`\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\nmicromatch.makeRe = (...args) => picomatch.makeRe(...args);\n\n/**\n * Scan a glob pattern to separate the pattern into segments. Used\n * by the [split](#split) method.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.scan(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\nmicromatch.scan = (...args) => picomatch.scan(...args);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.parse(pattern[, options]);\n * ```\n * @param {String} `glob`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as regex source string.\n * @api public\n */\n\nmicromatch.parse = (patterns, options) => {\n let res = [];\n for (let pattern of [].concat(patterns || [])) {\n for (let str of braces(String(pattern), options)) {\n res.push(picomatch.parse(str, options));\n }\n }\n return res;\n};\n\n/**\n * Process the given brace `pattern`.\n *\n * ```js\n * const { braces } = require('micromatch');\n * console.log(braces('foo/{a,b,c}/bar'));\n * //=> [ 'foo/(a|b|c)/bar' ]\n *\n * console.log(braces('foo/{a,b,c}/bar', { expand: true }));\n * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ]\n * ```\n * @param {String} `pattern` String with brace pattern to process.\n * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options.\n * @return {Array}\n * @api public\n */\n\nmicromatch.braces = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n if ((options && options.nobrace === true) || !hasBraces(pattern)) {\n return [pattern];\n }\n return braces(pattern, options);\n};\n\n/**\n * Expand braces\n */\n\nmicromatch.braceExpand = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n return micromatch.braces(pattern, { ...options, expand: true });\n};\n\n/**\n * Expose micromatch\n */\n\n// exposed for tests\nmicromatch.hasBraces = hasBraces;\nmodule.exports = micromatch;\n","\n/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '→') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\n// set a property of a literal object, while protecting against prototype pollution,\n// see https://github.com/nodeca/js-yaml/issues/164 for more details\nfunction setProperty(object, key, value) {\n // used for this specific key only because Object.defineProperty is slow\n if (key === '__proto__') {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: value\n });\n } else {\n object[key] = value;\n }\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n setProperty(destination, key, source[key]);\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n setProperty(_result, keyNode, valueNode);\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent\n atNewLine = false,\n hasContent = false,\n typeIndex,\n typeQuantity,\n typeList,\n type,\n flowIndent,\n blockIndent;\n\n if (state.listener !== null) {\n state.listener('open', state);\n }\n\n state.tag = null;\n state.anchor = null;\n state.kind = null;\n state.result = null;\n\n allowBlockStyles = allowBlockScalars = allowBlockCollections =\n CONTEXT_BLOCK_OUT === nodeContext ||\n CONTEXT_BLOCK_IN === nodeContext;\n\n if (allowToSeek) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"!<?> [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn’t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out ⇒ ns-plain-safe-out\n// c = flow-in ⇒ ns-plain-safe-in\n// c = block-key ⇒ ns-plain-safe-out\n// c = flow-key ⇒ ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - “:” - “#” )\n// | ( /* An ns-char preceding */ “#” )\n// | ( “:” /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “\"”\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | “%” | “@” | “`”)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// • No ending newline => unaffected; already using strip \"-\" chomping.\n// • Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines—\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | “-”\n // [39] ns-uri-char ::= “%” ns-hex-digit ns-hex-digit | ns-word-char | “#”\n // | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,”\n // | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]”\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n","/**\n * @fractary/codex-mcp-server\n *\n * MCP server for Fractary Codex knowledge management.\n * Provides Model Context Protocol integration for AI agents and tools.\n */\n\n// Export server\nexport { McpServer, createMcpServer, type McpServerConfig } from './server.js'\n\n// Export tool registration bridge (for programmatic usage)\nexport {\n CODEX_TOOLS,\n handleToolCall,\n handleFetch,\n handleList,\n handleCacheClear,\n handleCacheStats,\n handleCacheHealth,\n handleFileSourcesList,\n type ToolHandlerContext,\n} from './tools.js'\n\n// Export types\nexport type {\n McpTool,\n McpResource,\n McpResourceTemplate,\n McpCapabilities,\n McpServerInfo,\n FetchToolArgs,\n ListToolArgs,\n CacheClearToolArgs,\n CacheStatsToolArgs,\n CacheHealthToolArgs,\n ToolResult,\n ResourceContent,\n} from './types.js'\n","/**\n * MCP Server implementation\n *\n * Implements a Model Context Protocol server for the Codex SDK.\n * This server can be used standalone or embedded in other applications.\n */\n\nimport type { CodexClient } from '@fractary/codex'\nimport type {\n McpServerInfo,\n McpCapabilities,\n McpTool,\n McpResource,\n McpResourceTemplate,\n ResourceContent,\n ToolResult,\n} from './types.js'\nimport { CODEX_TOOLS, handleToolCall, type ToolHandlerContext } from './tools.js'\n\n/**\n * MCP Server configuration\n */\nexport interface McpServerConfig {\n /** Server name */\n name?: string\n /** Server version */\n version?: string\n /** CodexClient instance */\n client: CodexClient\n}\n\n/**\n * MCP Server for Codex\n *\n * Provides a Model Context Protocol server implementation that exposes\n * Codex functionality as MCP tools and resources.\n */\nexport class McpServer {\n private config: Required<Omit<McpServerConfig, 'client'>> & Pick<McpServerConfig, 'client'>\n private toolContext: ToolHandlerContext\n\n constructor(config: McpServerConfig) {\n this.config = {\n name: config.name ?? 'codex',\n version: config.version ?? '1.0.0',\n client: config.client,\n }\n\n this.toolContext = {\n client: config.client,\n }\n }\n\n /**\n * Get server info\n */\n getServerInfo(): McpServerInfo {\n return {\n name: this.config.name,\n version: this.config.version,\n capabilities: this.getCapabilities(),\n }\n }\n\n /**\n * Get server capabilities\n */\n getCapabilities(): McpCapabilities {\n return {\n tools: {\n listChanged: false,\n },\n resources: {\n subscribe: false,\n listChanged: false,\n },\n }\n }\n\n /**\n * List available tools\n */\n listTools(): McpTool[] {\n return CODEX_TOOLS\n }\n\n /**\n * Call a tool\n */\n async callTool(name: string, args: Record<string, unknown>): Promise<ToolResult> {\n return handleToolCall(name, args, this.toolContext)\n }\n\n /**\n * List available resources\n */\n async listResources(): Promise<McpResource[]> {\n const resources: McpResource[] = []\n\n const stats = await this.config.client.getCacheStats()\n\n resources.push({\n uri: 'codex://cache/summary',\n name: 'Cache Summary',\n description: `${stats.entryCount} cached documents`,\n mimeType: 'text/plain',\n })\n\n return resources\n }\n\n /**\n * List resource templates\n */\n listResourceTemplates(): McpResourceTemplate[] {\n return [\n {\n uriTemplate: 'codex://{org}/{project}/{path}',\n name: 'Codex Document',\n description: 'Fetch a document from the Codex knowledge base',\n mimeType: 'text/markdown',\n },\n ]\n }\n\n /**\n * Read a resource\n */\n async readResource(uri: string): Promise<ResourceContent[]> {\n if (uri === 'codex://cache/summary') {\n const stats = await this.config.client.getCacheStats()\n return [\n {\n uri,\n mimeType: 'text/plain',\n text: `Cache Statistics:\n- Total entries: ${stats.entryCount}\n- Memory entries: ${stats.memoryEntries}\n- Fresh: ${stats.freshCount}\n- Stale: ${stats.staleCount}\n- Expired: ${stats.expiredCount}`,\n },\n ]\n }\n\n // Fetch via client\n const result = await this.config.client.fetch(uri)\n return [\n {\n uri,\n mimeType: result.contentType || 'text/markdown',\n text: result.content.toString('utf-8'),\n },\n ]\n }\n\n /**\n * Handle JSON-RPC request\n */\n async handleRequest(method: string, params?: Record<string, unknown>): Promise<unknown> {\n switch (method) {\n case 'initialize':\n return {\n protocolVersion: '2024-11-05',\n serverInfo: this.getServerInfo(),\n capabilities: this.getCapabilities(),\n }\n\n case 'tools/list':\n return { tools: this.listTools() }\n\n case 'tools/call': {\n const { name, arguments: args } = params as { name: string; arguments: Record<string, unknown> }\n return await this.callTool(name, args)\n }\n\n case 'resources/list':\n return { resources: await this.listResources() }\n\n case 'resources/templates/list':\n return { resourceTemplates: this.listResourceTemplates() }\n\n case 'resources/read': {\n const { uri } = params as { uri: string }\n return { contents: await this.readResource(uri) }\n }\n\n case 'prompts/list':\n return { prompts: [] }\n\n default:\n throw new Error(`Unknown method: ${method}`)\n }\n }\n\n /**\n * Process a JSON-RPC message\n */\n async processMessage(message: string): Promise<string> {\n let id: unknown = null\n\n try {\n const request = JSON.parse(message)\n id = request.id\n const { method, params } = request\n\n const result = await this.handleRequest(method, params)\n\n return JSON.stringify({\n jsonrpc: '2.0',\n id,\n result,\n })\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n return JSON.stringify({\n jsonrpc: '2.0',\n id,\n error: {\n code: -32603,\n message: errorMessage,\n },\n })\n }\n }\n}\n\n/**\n * Create an MCP server\n */\nexport function createMcpServer(config: McpServerConfig): McpServer {\n return new McpServer(config)\n}\n","/**\n * MCP Tool definitions and handlers\n *\n * Implements the tools exposed by the Codex MCP server.\n * Uses SDK's CodexClient for all operations.\n */\n\nimport type { CodexClient } from '@fractary/codex'\nimport { formatBytes } from '@fractary/codex'\nimport type {\n McpTool,\n ToolResult,\n FetchToolArgs,\n ListToolArgs,\n CacheClearToolArgs,\n CacheStatsToolArgs,\n CacheHealthToolArgs,\n} from './types.js'\n\n/**\n * Tool definitions for the MCP server\n */\nexport const CODEX_TOOLS: McpTool[] = [\n {\n name: 'codex_document_fetch',\n description: 'Fetch a document from the Codex knowledge base by URI. Returns the document content.',\n inputSchema: {\n type: 'object',\n properties: {\n uri: {\n type: 'string',\n description: 'Codex URI in format: codex://org/project/path/to/file.md',\n },\n branch: {\n type: 'string',\n description: 'Git branch to fetch from (default: main)',\n },\n noCache: {\n type: 'boolean',\n description: 'Bypass cache and fetch fresh content',\n },\n },\n required: ['uri'],\n },\n },\n {\n name: 'codex_cache_list',\n description: 'List documents in the Codex cache.',\n inputSchema: {\n type: 'object',\n properties: {\n org: {\n type: 'string',\n description: 'Filter by organization',\n },\n project: {\n type: 'string',\n description: 'Filter by project',\n },\n includeExpired: {\n type: 'boolean',\n description: 'Include expired cache entries',\n },\n },\n },\n },\n {\n name: 'codex_cache_clear',\n description: 'Clear cached documents matching a pattern.',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'URI pattern to invalidate (supports regex)',\n },\n },\n required: ['pattern'],\n },\n },\n {\n name: 'codex_cache_stats',\n description: 'Display cache statistics including entry counts, sizes, and freshness.',\n inputSchema: {\n type: 'object',\n properties: {\n json: {\n type: 'boolean',\n description: 'Return raw JSON stats object',\n },\n },\n },\n },\n {\n name: 'codex_cache_health',\n description: 'Run health diagnostics on the codex setup including cache, storage, and type registry.',\n inputSchema: {\n type: 'object',\n properties: {\n json: {\n type: 'boolean',\n description: 'Return raw JSON health check results',\n },\n },\n },\n },\n {\n name: 'codex_file_sources_list',\n description: 'List file plugin sources available in the current project.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n]\n\n/**\n * Tool handler context\n */\nexport interface ToolHandlerContext {\n client: CodexClient\n}\n\n/**\n * Create a text result\n */\nfunction textResult(text: string, isError = false): ToolResult {\n return {\n content: [{ type: 'text', text }],\n isError,\n }\n}\n\n/**\n * Create a resource result\n */\nfunction resourceResult(uri: string, content: string, mimeType?: string): ToolResult {\n return {\n content: [\n {\n type: 'resource',\n resource: {\n uri,\n mimeType,\n text: content,\n },\n },\n ],\n }\n}\n\n/**\n * Handle codex_document_fetch tool\n */\nexport async function handleFetch(args: FetchToolArgs, ctx: ToolHandlerContext): Promise<ToolResult> {\n const { uri, branch, noCache } = args\n\n if (!uri || typeof uri !== 'string') {\n return textResult('URI is required and must be a string', true)\n }\n\n if (branch && typeof branch !== 'string') {\n return textResult('Branch must be a string', true)\n }\n\n try {\n const result = await ctx.client.fetch(uri, {\n bypassCache: noCache,\n branch,\n })\n\n const content = result.content.toString('utf-8')\n return resourceResult(uri, content, result.contentType)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const errorName = error instanceof Error ? error.name : 'Error'\n\n if (errorName === 'FilePluginFileNotFoundError') {\n return textResult(message, true)\n }\n\n return textResult(`Failed to fetch ${uri}: ${message}`, true)\n }\n}\n\n/**\n * Handle codex_cache_list tool\n */\nexport async function handleList(args: ListToolArgs, ctx: ToolHandlerContext): Promise<ToolResult> {\n const { org, project, includeExpired } = args\n\n const stats = await ctx.client.getCacheStats()\n\n let message = `Cache Statistics:\n- Total entries: ${stats.entryCount}\n- Memory entries: ${stats.memoryEntries}\n- Memory size: ${formatBytes(stats.memorySize)}\n- Total size: ${formatBytes(stats.totalSize)}\n- Fresh: ${stats.freshCount}\n- Stale: ${stats.staleCount}\n- Expired: ${stats.expiredCount}`\n\n if (org) {\n message += `\\n\\nFiltered by org: ${org}`\n }\n if (project) {\n message += `\\nFiltered by project: ${project}`\n }\n if (includeExpired) {\n message += `\\nIncluding expired entries`\n }\n\n return textResult(message)\n}\n\n/**\n * Validate and sanitize regex pattern to prevent ReDoS attacks\n */\nfunction validateRegexPattern(pattern: string): { valid: boolean; error?: string } {\n if (pattern.length > 1000) {\n return { valid: false, error: 'Pattern too long (max 1000 characters)' }\n }\n\n const redosPatterns = [\n /(\\.\\*){3,}/, // Multiple consecutive .*\n /(\\+\\+|\\*\\*|\\?\\?)/, // Nested quantifiers\n /(\\([^)]*){10,}/, // Too many groups\n /(\\[[^\\]]{100,})/, // Very long character classes\n ]\n\n for (const redos of redosPatterns) {\n if (redos.test(pattern)) {\n return { valid: false, error: 'Pattern contains potentially dangerous constructs' }\n }\n }\n\n try {\n new RegExp(pattern)\n return { valid: true }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Invalid regex'\n return { valid: false, error: message }\n }\n}\n\n/**\n * Handle codex_cache_clear tool\n */\nexport async function handleCacheClear(args: CacheClearToolArgs, ctx: ToolHandlerContext): Promise<ToolResult> {\n const { pattern } = args\n\n if (!pattern || typeof pattern !== 'string') {\n return textResult('Pattern is required and must be a string', true)\n }\n\n const validation = validateRegexPattern(pattern)\n if (!validation.valid) {\n return textResult(`Invalid pattern: ${validation.error}`, true)\n }\n\n try {\n const regex = new RegExp(pattern)\n const count = await ctx.client.invalidateCachePattern(regex)\n\n return textResult(`Cleared ${count} cache entries matching pattern: ${pattern}`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return textResult(`Failed to clear cache: ${message}`, true)\n }\n}\n\n/**\n * Handle codex_cache_stats tool\n */\nexport async function handleCacheStats(args: CacheStatsToolArgs, ctx: ToolHandlerContext): Promise<ToolResult> {\n const stats = await ctx.client.getCacheStats()\n\n if (args.json) {\n return textResult(JSON.stringify(stats, null, 2))\n }\n\n const healthPercent = stats.entryCount > 0 ? (stats.freshCount / stats.entryCount) * 100 : 100\n\n const message = `Cache Statistics\n\nOverview:\n Total entries: ${stats.entryCount}\n Total size: ${formatBytes(stats.totalSize)}\n Memory entries: ${stats.memoryEntries}\n Memory size: ${formatBytes(stats.memorySize)}\n\nFreshness:\n Fresh: ${stats.freshCount}\n Stale: ${stats.staleCount}\n Expired: ${stats.expiredCount}\n\nCache health: ${healthPercent.toFixed(0)}% fresh`\n\n return textResult(message)\n}\n\n/**\n * Handle codex_cache_health tool\n */\nexport async function handleCacheHealth(args: CacheHealthToolArgs, ctx: ToolHandlerContext): Promise<ToolResult> {\n const checks = await ctx.client.getHealthChecks()\n\n const passed = checks.filter(c => c.status === 'pass').length\n const warned = checks.filter(c => c.status === 'warn').length\n const failed = checks.filter(c => c.status === 'fail').length\n\n if (args.json) {\n return textResult(JSON.stringify({\n summary: {\n total: checks.length,\n passed,\n warned,\n failed,\n healthy: failed === 0,\n },\n checks,\n }, null, 2))\n }\n\n let message = 'Codex Health Check\\n'\n\n for (const check of checks) {\n const icon = check.status === 'pass' ? '[OK]' :\n check.status === 'warn' ? '[WARN]' :\n '[FAIL]'\n\n message += `\\n${icon} ${check.name}\\n`\n message += ` ${check.message}\\n`\n if (check.details) {\n message += ` ${check.details}\\n`\n }\n }\n\n const overallStatus = failed > 0 ? 'UNHEALTHY' :\n warned > 0 ? 'DEGRADED' :\n 'HEALTHY'\n\n message += `\\nStatus: ${overallStatus}`\n message += `\\n${passed} passed, ${warned} warnings, ${failed} failed`\n\n return textResult(message)\n}\n\n/**\n * Handle codex_file_sources_list tool\n */\nexport async function handleFileSourcesList(ctx: ToolHandlerContext): Promise<ToolResult> {\n try {\n const unifiedConfig = ctx.client.getUnifiedConfig()\n\n if (!unifiedConfig?.file?.sources || unifiedConfig.file.sources.length === 0) {\n return textResult(`No file plugin sources configured.\n\nTo enable file plugin integration, add a 'file.sources' section to .fractary/config.yaml.`)\n }\n\n const sources = unifiedConfig.file.sources\n let message = `File Plugin Sources (${sources.length}):\\n`\n\n for (const source of sources) {\n message += `\\n- ${source.name}`\n message += `\\n Path: ${source.path}`\n if (source.type) {\n message += `\\n Type: ${source.type}`\n }\n }\n\n message += '\\n\\nSources are read directly from local filesystem without caching.'\n\n return textResult(message)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return textResult(`Failed to list file sources: ${message}`, true)\n }\n}\n\n/**\n * Route a tool call to its handler\n */\nexport async function handleToolCall(\n name: string,\n args: Record<string, unknown>,\n ctx: ToolHandlerContext\n): Promise<ToolResult> {\n switch (name) {\n case 'codex_document_fetch':\n return handleFetch(args as unknown as FetchToolArgs, ctx)\n case 'codex_cache_list':\n return handleList(args as unknown as ListToolArgs, ctx)\n case 'codex_cache_clear':\n return handleCacheClear(args as unknown as CacheClearToolArgs, ctx)\n case 'codex_cache_stats':\n return handleCacheStats(args as unknown as CacheStatsToolArgs, ctx)\n case 'codex_cache_health':\n return handleCacheHealth(args as unknown as CacheHealthToolArgs, ctx)\n case 'codex_file_sources_list':\n return handleFileSourcesList(ctx)\n default:\n return textResult(`Unknown tool: ${name}`, true)\n }\n}\n","import * as z from \"./v3/external.js\";\nexport * from \"./v3/external.js\";\nexport { z };\nexport default z;\n","export * from \"./errors.js\";\nexport * from \"./helpers/parseUtil.js\";\nexport * from \"./helpers/typeAliases.js\";\nexport * from \"./helpers/util.js\";\nexport * from \"./types.js\";\nexport * from \"./ZodError.js\";\n","import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n overrideErrorMap = map;\n}\nexport function getErrorMap() {\n return overrideErrorMap;\n}\n","import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"bigint\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\nexport default errorMap;\n","import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n","export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n","import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nexport const INVALID = Object.freeze({\n status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n","import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[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])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n if (!header)\n return false;\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n","export var errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n // biome-ignore lint:\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n","/**\n * Base error class for all Codex SDK errors\n */\nexport class CodexError extends Error {\n constructor(\n message: string,\n options?: ErrorOptions\n ) {\n super(message, options)\n this.name = 'CodexError'\n Object.setPrototypeOf(this, CodexError.prototype)\n }\n}\n","import { CodexError } from './CodexError.js'\n\n/**\n * Error thrown when configuration is missing or invalid\n */\nexport class ConfigurationError extends CodexError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ConfigurationError'\n Object.setPrototypeOf(this, ConfigurationError.prototype)\n }\n}\n","import { CodexError } from './CodexError.js'\n\n/**\n * Error thrown when data validation fails\n */\nexport class ValidationError extends CodexError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ValidationError'\n Object.setPrototypeOf(this, ValidationError.prototype)\n }\n}\n","export { CodexError } from './CodexError.js'\nexport { ConfigurationError } from './ConfigurationError.js'\nexport { ValidationError } from './ValidationError.js'\n","/**\n * Path validation utilities for codex references\n *\n * Provides security validation to prevent directory traversal attacks\n * and other path-based security issues.\n */\n\nimport path from 'path'\n\n/**\n * Forbidden path patterns that could indicate security issues\n */\nconst FORBIDDEN_PATTERNS = [\n /^\\//, // Absolute paths\n /\\.\\./, // Parent directory traversal\n /^~/, // Home directory expansion\n /\\0/, // Null bytes\n]\n\n/**\n * Forbidden protocol prefixes\n */\nconst FORBIDDEN_PROTOCOLS = ['file:', 'http:', 'https:', 'ftp:', 'data:', 'javascript:']\n\n/**\n * Validate a path component to ensure it's safe\n *\n * @param filePath - The path to validate\n * @returns true if the path is safe, false otherwise\n */\nexport function validatePath(filePath: string): boolean {\n // Empty paths are invalid\n if (!filePath || filePath.trim() === '') {\n return false\n }\n\n // Check for forbidden patterns\n for (const pattern of FORBIDDEN_PATTERNS) {\n if (pattern.test(filePath)) {\n return false\n }\n }\n\n // Check for protocol prefixes\n const lowerPath = filePath.toLowerCase()\n for (const protocol of FORBIDDEN_PROTOCOLS) {\n if (lowerPath.startsWith(protocol)) {\n return false\n }\n }\n\n // Normalize and check for traversal after normalization\n const normalized = path.normalize(filePath)\n if (normalized.startsWith('..') || normalized.includes('/../') || normalized.includes('\\\\..\\\\')) {\n return false\n }\n\n return true\n}\n\n/**\n * Sanitize a path by removing dangerous components\n *\n * @param filePath - The path to sanitize\n * @returns The sanitized path\n */\nexport function sanitizePath(filePath: string): string {\n if (!filePath) {\n return ''\n }\n\n // Remove protocol prefixes\n let sanitized = filePath\n for (const protocol of FORBIDDEN_PROTOCOLS) {\n if (sanitized.toLowerCase().startsWith(protocol)) {\n sanitized = sanitized.slice(protocol.length)\n }\n }\n\n // Remove leading slashes (absolute paths)\n sanitized = sanitized.replace(/^\\/+/, '')\n\n // Remove home directory expansion\n sanitized = sanitized.replace(/^~\\//, '')\n\n // Normalize the path\n sanitized = path.normalize(sanitized)\n\n // Remove any remaining parent directory references\n sanitized = sanitized.replace(/\\.\\.\\//g, '').replace(/\\.\\./g, '')\n\n // Remove leading ./ if present\n sanitized = sanitized.replace(/^\\.\\//, '')\n\n // Remove null bytes\n sanitized = sanitized.replace(/\\0/g, '')\n\n return sanitized\n}\n\n/**\n * Validate an organization name\n *\n * @param org - The organization name to validate\n * @returns true if valid, false otherwise\n */\nexport function validateOrg(org: string): boolean {\n if (!org || org.trim() === '') {\n return false\n }\n\n // Org names should be alphanumeric with hyphens/underscores\n // GitHub org names: 1-39 chars, alphanumeric or hyphen, cannot start/end with hyphen\n const orgPattern = /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/\n return orgPattern.test(org) && org.length <= 39\n}\n\n/**\n * Validate a project name\n *\n * @param project - The project name to validate\n * @returns true if valid, false otherwise\n */\nexport function validateProject(project: string): boolean {\n if (!project || project.trim() === '') {\n return false\n }\n\n // Project names should be alphanumeric with hyphens/underscores/dots\n // GitHub repo names: 1-100 chars, alphanumeric, hyphen, underscore, or period\n const projectPattern = /^[a-zA-Z0-9._-]+$/\n return projectPattern.test(project) && project.length <= 100 && !project.includes('..')\n}\n\n/**\n * Validate a complete URI\n *\n * @param uri - The URI to validate\n * @returns true if the URI format is valid\n */\nexport function validateUri(uri: string): boolean {\n if (!uri || !uri.startsWith('codex://')) {\n return false\n }\n\n const pathPart = uri.slice('codex://'.length)\n const parts = pathPart.split('/')\n\n // Must have at least org/project\n if (parts.length < 2) {\n return false\n }\n\n const [org, project, ...rest] = parts\n\n if (!org || !validateOrg(org)) {\n return false\n }\n\n if (!project || !validateProject(project)) {\n return false\n }\n\n // If there's a path, validate it\n if (rest.length > 0) {\n const filePath = rest.join('/')\n if (!validatePath(filePath)) {\n return false\n }\n }\n\n return true\n}\n","/**\n * URI parsing for codex references\n *\n * Parses codex:// URIs into their component parts.\n * URI format: codex://org/project/path/to/file.md\n */\n\nimport { validateUri, validatePath, sanitizePath } from './validator.js'\n\n/**\n * Parsed reference components\n */\nexport interface ParsedReference {\n /** Original URI string */\n uri: string\n /** Organization name */\n org: string\n /** Project/repository name */\n project: string\n /** File path within project (may be empty) */\n path: string\n}\n\n/**\n * Parse options\n */\nexport interface ParseOptions {\n /** Whether to sanitize the path (default: true) */\n sanitize?: boolean\n /** Whether to validate strictly (default: true) */\n strict?: boolean\n}\n\n/**\n * The codex URI prefix\n */\nexport const CODEX_URI_PREFIX = 'codex://'\n\n/**\n * Legacy reference prefix (v2 format)\n */\nexport const LEGACY_REF_PREFIX = '@codex/'\n\n/**\n * Check if a string is a valid codex URI\n *\n * @param uri - The string to check\n * @returns true if it's a valid codex:// URI\n */\nexport function isValidUri(uri: string): boolean {\n return validateUri(uri)\n}\n\n/**\n * Check if a string is a legacy reference format\n *\n * @param ref - The string to check\n * @returns true if it's a legacy @codex/ reference\n */\nexport function isLegacyReference(ref: string): boolean {\n return ref.startsWith(LEGACY_REF_PREFIX)\n}\n\n/**\n * Convert a legacy reference to the new URI format\n *\n * @param ref - Legacy reference (e.g., @codex/project/path)\n * @param defaultOrg - Default organization to use\n * @returns The converted URI or null if invalid\n */\nexport function convertLegacyReference(ref: string, defaultOrg: string): string | null {\n if (!isLegacyReference(ref)) {\n return null\n }\n\n // Remove @codex/ prefix\n const pathPart = ref.slice(LEGACY_REF_PREFIX.length)\n const parts = pathPart.split('/')\n\n if (parts.length < 1 || !parts[0]) {\n return null\n }\n\n // Legacy format: @codex/project/path -> codex://org/project/path\n const project = parts[0]\n const filePath = parts.slice(1).join('/')\n\n if (filePath) {\n return `${CODEX_URI_PREFIX}${defaultOrg}/${project}/${filePath}`\n }\n return `${CODEX_URI_PREFIX}${defaultOrg}/${project}`\n}\n\n/**\n * Parse a codex URI into its components\n *\n * @param uri - The URI to parse (e.g., codex://org/project/path/to/file.md)\n * @param options - Parse options\n * @returns The parsed reference or null if invalid\n */\nexport function parseReference(uri: string, options: ParseOptions = {}): ParsedReference | null {\n const { sanitize = true, strict = true } = options\n\n // Must start with codex://\n if (!uri.startsWith(CODEX_URI_PREFIX)) {\n return null\n }\n\n // Strict validation\n if (strict && !validateUri(uri)) {\n return null\n }\n\n // Extract the path after codex://\n const pathPart = uri.slice(CODEX_URI_PREFIX.length)\n const parts = pathPart.split('/')\n\n // Must have at least org and project\n if (parts.length < 2) {\n return null\n }\n\n const org = parts[0]\n const project = parts[1]\n let filePath = parts.slice(2).join('/')\n\n // Validate org and project are not empty\n if (!org || !project) {\n return null\n }\n\n // Sanitize path if requested\n if (sanitize && filePath) {\n if (!validatePath(filePath)) {\n filePath = sanitizePath(filePath)\n }\n }\n\n return {\n uri,\n org,\n project,\n path: filePath,\n }\n}\n\n/**\n * Build a codex URI from components\n *\n * @param org - Organization name\n * @param project - Project name\n * @param path - Optional file path\n * @returns The constructed URI\n */\nexport function buildUri(org: string, project: string, path?: string): string {\n const base = `${CODEX_URI_PREFIX}${org}/${project}`\n if (path) {\n // Ensure path doesn't start with /\n const cleanPath = path.startsWith('/') ? path.slice(1) : path\n return `${base}/${cleanPath}`\n }\n return base\n}\n\n/**\n * Extract the file extension from a URI\n *\n * @param uri - The URI to extract from\n * @returns The extension (without dot) or empty string\n */\nexport function getExtension(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastDot = parsed.path.lastIndexOf('.')\n if (lastDot === -1 || lastDot === parsed.path.length - 1) {\n return ''\n }\n\n return parsed.path.slice(lastDot + 1).toLowerCase()\n}\n\n/**\n * Get the filename from a URI\n *\n * @param uri - The URI to extract from\n * @returns The filename or empty string\n */\nexport function getFilename(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastSlash = parsed.path.lastIndexOf('/')\n if (lastSlash === -1) {\n return parsed.path\n }\n\n return parsed.path.slice(lastSlash + 1)\n}\n\n/**\n * Get the directory path from a URI\n *\n * @param uri - The URI to extract from\n * @returns The directory path or empty string\n */\nexport function getDirectory(uri: string): string {\n const parsed = parseReference(uri, { strict: false })\n if (!parsed || !parsed.path) {\n return ''\n }\n\n const lastSlash = parsed.path.lastIndexOf('/')\n if (lastSlash === -1) {\n return ''\n }\n\n return parsed.path.slice(0, lastSlash)\n}\n","/**\n * URI resolution for codex references\n *\n * Resolves codex:// URIs to filesystem paths, determining whether\n * the reference points to the current project (local file) or\n * needs to be fetched from cache/remote.\n */\n\nimport path from 'path'\nimport { execSync } from 'child_process'\nimport { parseReference, type ParsedReference } from './parser.js'\nimport type { StorageProviderType } from '../storage/provider.js'\n\n/**\n * Resolved reference with filesystem paths\n */\nexport interface ResolvedReference extends ParsedReference {\n /** Path in the cache directory */\n cachePath: string\n /** Whether this URI refers to the current project */\n isCurrentProject: boolean\n /** Local filesystem path if current project */\n localPath?: string\n /** Source type for storage routing */\n sourceType?: StorageProviderType\n /** File plugin source name if sourceType is 'file-plugin' */\n filePluginSource?: string\n}\n\n/**\n * Options for resolving references\n */\nexport interface ResolveOptions {\n /** Base directory for cache (default: .fractary/codex/cache) */\n cacheDir?: string\n /** Override current organization detection */\n currentOrg?: string\n /** Override current project detection */\n currentProject?: string\n /** Current working directory (for git detection) */\n cwd?: string\n /** Unified config for file plugin source resolution */\n config?: any // Type will be UnifiedConfig, using 'any' to avoid circular dependency\n}\n\n/**\n * Default cache directory (v4.0 standard)\n */\nexport const DEFAULT_CACHE_DIR = '.fractary/codex/cache'\n\n/**\n * Detect the current project from git remote\n *\n * @param cwd - Current working directory\n * @returns Object with org and project, or nulls if not detected\n */\nexport function detectCurrentProject(cwd?: string): { org: string | null; project: string | null } {\n try {\n const options = cwd ? { cwd, encoding: 'utf-8' as const } : { encoding: 'utf-8' as const }\n const stdout = execSync('git remote get-url origin', options)\n const url = stdout.toString().trim()\n\n // Parse GitHub URLs (SSH and HTTPS formats)\n // git@github.com:org/repo.git\n // https://github.com/org/repo.git\n // https://github.com/org/repo\n const patterns = [\n /github\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n /gitlab\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n /bitbucket\\.org[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n ]\n\n for (const pattern of patterns) {\n const match = url.match(pattern)\n if (match && match[1] && match[2]) {\n return { org: match[1], project: match[2] }\n }\n }\n } catch {\n // Git not available or not in a git repo\n }\n\n return { org: null, project: null }\n}\n\n/**\n * Get the current organization and project\n *\n * Priority:\n * 1. Explicit options\n * 2. Environment variables (CODEX_CURRENT_ORG, CODEX_CURRENT_PROJECT)\n * 3. Git remote detection\n *\n * @param options - Resolve options\n * @returns Object with org and project\n */\nexport function getCurrentContext(options: ResolveOptions = {}): {\n org: string | null\n project: string | null\n} {\n // Priority 1: Explicit options\n if (options.currentOrg && options.currentProject) {\n return { org: options.currentOrg, project: options.currentProject }\n }\n\n // Priority 2: Environment variables\n const envOrg = process.env.CODEX_CURRENT_ORG\n const envProject = process.env.CODEX_CURRENT_PROJECT\n if (envOrg && envProject) {\n return { org: envOrg, project: envProject }\n }\n\n // Priority 3: Git detection\n return detectCurrentProject(options.cwd)\n}\n\n/**\n * Calculate the cache path for a URI\n *\n * @param org - Organization\n * @param project - Project\n * @param filePath - File path within project\n * @param cacheDir - Base cache directory\n * @returns The cache file path\n */\nexport function calculateCachePath(\n org: string,\n project: string,\n filePath: string,\n cacheDir: string\n): string {\n // Cache structure: {cacheDir}/{org}/{project}/{path}\n return path.join(cacheDir, org, project, filePath)\n}\n\n/**\n * Resolve a codex URI to filesystem paths\n *\n * @param uri - The URI to resolve\n * @param options - Resolution options\n * @returns The resolved reference or null if invalid\n */\nexport function resolveReference(\n uri: string,\n options: ResolveOptions = {}\n): ResolvedReference | null {\n const parsed = parseReference(uri)\n if (!parsed) {\n return null\n }\n\n const cacheDir = options.cacheDir || DEFAULT_CACHE_DIR\n const currentContext = getCurrentContext(options)\n\n // Calculate cache path\n const cachePath = parsed.path\n ? calculateCachePath(parsed.org, parsed.project, parsed.path, cacheDir)\n : path.join(cacheDir, parsed.org, parsed.project)\n\n // Check if this is the current project\n const isCurrentProject =\n currentContext.org === parsed.org && currentContext.project === parsed.project\n\n // Build the resolved reference\n const resolved: ResolvedReference = {\n ...parsed,\n cachePath,\n isCurrentProject,\n }\n\n // If it's the current project and there's a path, provide the local path\n if (isCurrentProject && parsed.path) {\n resolved.localPath = parsed.path\n\n // Check if this path belongs to a file plugin source\n if (options.config) {\n const fileSource = detectFilePluginSource(parsed.path, options.config)\n if (fileSource) {\n resolved.sourceType = 'file-plugin'\n resolved.filePluginSource = fileSource.name\n resolved.localPath = fileSource.fullPath\n }\n }\n }\n\n return resolved\n}\n\n/**\n * Detect if a path belongs to a file plugin source\n *\n * @param filePath - The file path from the URI\n * @param config - Unified configuration\n * @returns Matching file source info or null\n */\nfunction detectFilePluginSource(\n filePath: string,\n config: any\n): { name: string; fullPath: string } | null {\n if (!config?.file?.sources) {\n return null\n }\n\n // Check each file source to see if the path matches\n for (const [sourceName, source] of Object.entries(config.file.sources) as [string, any][]) {\n const basePath = source.local?.base_path\n if (!basePath) {\n continue\n }\n\n // Normalize paths for comparison\n const normalizedPath = filePath.replace(/^\\.\\//, '').replace(/^\\//, '')\n const normalizedBasePath = basePath.replace(/^\\.\\//, '').replace(/^\\//, '').replace(/\\/$/, '')\n\n // Check if path starts with source's base_path\n // Examples:\n // filePath: \"specs/SPEC-001.md\"\n // basePath: \".fractary/specs\"\n // normalizedPath: \"specs/SPEC-001.md\"\n // normalizedBasePath: \".fractary/specs\"\n //\n // Or if path is already prefixed:\n // filePath: \".fractary/specs/SPEC-001.md\"\n // normalizedPath: \".fractary/specs/SPEC-001.md\"\n //\n // We need to check two scenarios:\n // 1. Path already includes base_path: \".fractary/specs/SPEC-001.md\" starts with \".fractary/specs\"\n // 2. Path is relative to base_path: \"specs/SPEC-001.md\" and base_path is \".fractary/specs\"\n // In this case, we extract the source name from base_path and check if path starts with it\n\n if (normalizedPath.startsWith(normalizedBasePath)) {\n // Scenario 1: Path already includes full base_path\n return {\n name: sourceName,\n fullPath: path.join(basePath, normalizedPath.substring(normalizedBasePath.length).replace(/^\\//, '')),\n }\n }\n\n // Scenario 2: Extract source name from base_path (e.g., \"specs\" from \".fractary/specs\")\n const sourceNameInPath = normalizedBasePath.split('/').pop()\n if (sourceNameInPath && normalizedPath.startsWith(sourceNameInPath + '/')) {\n // Path starts with source name (e.g., \"specs/SPEC-001.md\")\n // Strip the source name prefix to avoid duplication\n const pathWithoutSource = normalizedPath.substring(sourceNameInPath.length + 1)\n return {\n name: sourceName,\n fullPath: path.join(basePath, pathWithoutSource),\n }\n }\n }\n\n return null\n}\n\n/**\n * Resolve multiple URIs at once\n *\n * @param uris - Array of URIs to resolve\n * @param options - Resolution options\n * @returns Array of resolved references (nulls filtered out)\n */\nexport function resolveReferences(\n uris: string[],\n options: ResolveOptions = {}\n): ResolvedReference[] {\n return uris.map((uri) => resolveReference(uri, options)).filter((r): r is ResolvedReference => r !== null)\n}\n\n/**\n * Check if a URI refers to the current project\n *\n * @param uri - The URI to check\n * @param options - Resolution options\n * @returns true if the URI refers to the current project\n */\nexport function isCurrentProjectUri(uri: string, options: ResolveOptions = {}): boolean {\n const resolved = resolveReference(uri, options)\n return resolved?.isCurrentProject ?? false\n}\n\n/**\n * Get the relative cache path for a URI (without the cache directory prefix)\n *\n * @param uri - The URI\n * @returns The relative path or null if invalid\n */\nexport function getRelativeCachePath(uri: string): string | null {\n const parsed = parseReference(uri)\n if (!parsed) {\n return null\n }\n\n if (parsed.path) {\n return path.join(parsed.org, parsed.project, parsed.path)\n }\n return path.join(parsed.org, parsed.project)\n}\n","/**\n * References module - Universal reference system for codex\n *\n * Provides parsing, validation, and resolution of codex:// URIs\n * for addressing artifacts across projects and organizations.\n *\n * URI Format: codex://org/project/path/to/file.md\n *\n * @example\n * ```typescript\n * import { parseReference, resolveReference, isValidUri } from '@fractary/codex/references'\n *\n * // Parse a URI\n * const parsed = parseReference('codex://fractary/auth-service/docs/oauth.md')\n * // { uri: '...', org: 'fractary', project: 'auth-service', path: 'docs/oauth.md' }\n *\n * // Resolve to filesystem paths\n * const resolved = resolveReference('codex://fractary/auth-service/docs/oauth.md')\n * // { ...parsed, cachePath: '.fractary/.../docs/oauth.md', isCurrentProject: false }\n *\n * // Validate\n * isValidUri('codex://fractary/auth-service/docs/oauth.md') // true\n * isValidUri('codex://invalid/../path') // false\n * ```\n */\n\n// Parser exports\nexport {\n parseReference,\n buildUri,\n isValidUri,\n isLegacyReference,\n convertLegacyReference,\n getExtension,\n getFilename,\n getDirectory,\n CODEX_URI_PREFIX,\n LEGACY_REF_PREFIX,\n type ParsedReference,\n type ParseOptions,\n} from './parser.js'\n\n// Resolver exports\nexport {\n resolveReference,\n resolveReferences,\n detectCurrentProject,\n getCurrentContext,\n calculateCachePath,\n isCurrentProjectUri,\n getRelativeCachePath,\n DEFAULT_CACHE_DIR,\n type ResolvedReference,\n type ResolveOptions,\n} from './resolver.js'\n\n// Validator exports\nexport {\n validatePath,\n sanitizePath,\n validateOrg,\n validateProject,\n validateUri,\n} from './validator.js'\n","/**\n * Built-in artifact types for the Codex SDK\n *\n * These types define common artifact categories with default TTLs,\n * archival policies, and pattern matching rules.\n */\n\n/**\n * Artifact type definition\n */\nexport interface ArtifactType {\n /** Unique type name */\n name: string\n /** Human-readable description */\n description: string\n /** Glob patterns to match files of this type */\n patterns: string[]\n /** Default TTL in seconds for cached content */\n defaultTtl: number\n /** Days after which to archive (null = never) */\n archiveAfterDays: number | null\n /** Where to archive (null = don't archive) */\n archiveStorage: 'local' | 'cloud' | 'drive' | null\n /** Patterns for sync operations (optional override) */\n syncPatterns?: string[]\n /** Patterns to exclude from sync */\n excludePatterns?: string[]\n /** Default permissions (optional) */\n permissions?: {\n include: string[]\n exclude: string[]\n }\n}\n\n/**\n * TTL constants in seconds\n */\nexport const TTL = {\n ONE_HOUR: 3600,\n ONE_DAY: 86400,\n ONE_WEEK: 604800,\n TWO_WEEKS: 1209600,\n ONE_MONTH: 2592000,\n ONE_YEAR: 31536000,\n} as const\n\n/**\n * Built-in artifact types\n *\n * These cover common use cases and serve as defaults.\n * Users can override or extend these via configuration.\n */\nexport const BUILT_IN_TYPES: Record<string, ArtifactType> = {\n docs: {\n name: 'docs',\n description: 'Documentation files',\n patterns: ['docs/**', 'README.md', 'CLAUDE.md', '*.md'],\n defaultTtl: TTL.ONE_WEEK,\n archiveAfterDays: 365,\n archiveStorage: 'cloud',\n },\n\n specs: {\n name: 'specs',\n description: 'Technical specifications',\n patterns: ['specs/**', 'SPEC-*.md', '**/specs/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: null, // Never auto-archive specs\n archiveStorage: null,\n },\n\n logs: {\n name: 'logs',\n description: 'Session and workflow logs',\n patterns: ['.fractary/**/logs/**', 'logs/**', '*.log'],\n defaultTtl: TTL.ONE_DAY,\n archiveAfterDays: 30,\n archiveStorage: 'cloud',\n },\n\n standards: {\n name: 'standards',\n description: 'Organization standards and guides',\n patterns: ['standards/**', 'guides/**', '.fractary/standards/**'],\n defaultTtl: TTL.ONE_MONTH,\n archiveAfterDays: null, // Never auto-archive standards\n archiveStorage: null,\n },\n\n templates: {\n name: 'templates',\n description: 'Reusable templates',\n patterns: ['templates/**', '.templates/**', '.fractary/templates/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: 180,\n archiveStorage: 'cloud',\n },\n\n state: {\n name: 'state',\n description: 'Workflow state files',\n patterns: ['.fractary/**/state.json', '.fractary/**/state/**', '**/state.json'],\n defaultTtl: TTL.ONE_HOUR,\n archiveAfterDays: 7,\n archiveStorage: 'local',\n },\n\n config: {\n name: 'config',\n description: 'Configuration files',\n patterns: [\n '.fractary/**/*.json',\n '*.config.js',\n '*.config.ts',\n 'tsconfig.json',\n 'package.json',\n ],\n defaultTtl: TTL.ONE_DAY,\n archiveAfterDays: null,\n archiveStorage: null,\n },\n\n systems: {\n name: 'systems',\n description: 'System definitions',\n patterns: ['.fractary/systems/**', 'systems/**'],\n defaultTtl: TTL.TWO_WEEKS,\n archiveAfterDays: null,\n archiveStorage: null,\n },\n}\n\n/**\n * Default type to use when no pattern matches\n */\nexport const DEFAULT_TYPE: ArtifactType = {\n name: 'default',\n description: 'Default type for unmatched files',\n patterns: ['**/*'],\n defaultTtl: TTL.ONE_WEEK,\n archiveAfterDays: 90,\n archiveStorage: 'cloud',\n}\n\n/**\n * Get a built-in type by name\n *\n * @param name - Type name\n * @returns The type or undefined\n */\nexport function getBuiltInType(name: string): ArtifactType | undefined {\n return BUILT_IN_TYPES[name]\n}\n\n/**\n * Get all built-in type names\n *\n * @returns Array of type names\n */\nexport function getBuiltInTypeNames(): string[] {\n return Object.keys(BUILT_IN_TYPES)\n}\n\n/**\n * Check if a name is a built-in type\n *\n * @param name - Type name to check\n * @returns true if it's a built-in type\n */\nexport function isBuiltInType(name: string): boolean {\n return name in BUILT_IN_TYPES\n}\n","/**\n * Type registry for artifact types\n *\n * Manages both built-in and custom artifact types, providing\n * type detection, TTL lookup, and registration functionality.\n */\n\nimport micromatch from 'micromatch'\nimport {\n type ArtifactType,\n BUILT_IN_TYPES,\n DEFAULT_TYPE,\n isBuiltInType,\n} from './built-in.js'\n\n/**\n * Options for creating a TypeRegistry\n */\nexport interface TypeRegistryOptions {\n /** Whether to include built-in types (default: true) */\n includeBuiltIn?: boolean\n /** Custom types to register */\n customTypes?: Record<string, Partial<ArtifactType>>\n}\n\n/**\n * Type registry for managing artifact types\n */\nexport class TypeRegistry {\n private types: Map<string, ArtifactType> = new Map()\n private patternCache: Map<string, string> = new Map()\n\n constructor(options: TypeRegistryOptions = {}) {\n const { includeBuiltIn = true, customTypes = {} } = options\n\n // Load built-in types\n if (includeBuiltIn) {\n for (const [name, type] of Object.entries(BUILT_IN_TYPES)) {\n this.types.set(name, type)\n }\n }\n\n // Load custom types\n for (const [name, partialType] of Object.entries(customTypes)) {\n this.register({\n ...DEFAULT_TYPE,\n ...partialType,\n name,\n })\n }\n }\n\n /**\n * Get a type by name\n *\n * Custom types take precedence over built-in types with the same name.\n *\n * @param name - Type name\n * @returns The type or undefined\n */\n get(name: string): ArtifactType | undefined {\n return this.types.get(name)\n }\n\n /**\n * Register a custom type\n *\n * @param type - The type to register\n */\n register(type: ArtifactType): void {\n this.types.set(type.name, type)\n // Clear pattern cache when types change\n this.patternCache.clear()\n }\n\n /**\n * Unregister a type\n *\n * Note: Built-in types can be unregistered but this is not recommended.\n *\n * @param name - Type name to unregister\n * @returns true if the type was removed\n */\n unregister(name: string): boolean {\n const result = this.types.delete(name)\n if (result) {\n this.patternCache.clear()\n }\n return result\n }\n\n /**\n * Check if a type exists\n *\n * @param name - Type name\n * @returns true if the type exists\n */\n has(name: string): boolean {\n return this.types.has(name)\n }\n\n /**\n * List all registered types\n *\n * @returns Array of all types\n */\n list(): ArtifactType[] {\n return Array.from(this.types.values())\n }\n\n /**\n * List all type names\n *\n * @returns Array of type names\n */\n listNames(): string[] {\n return Array.from(this.types.keys())\n }\n\n /**\n * Detect the type of a file based on its path\n *\n * Types are checked in order of specificity (most specific patterns first).\n * Returns 'default' if no type matches.\n *\n * @param filePath - File path to check\n * @returns The detected type name\n */\n detectType(filePath: string): string {\n // Check cache first\n const cached = this.patternCache.get(filePath)\n if (cached) {\n return cached\n }\n\n // Normalize path separators\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n\n // Check each type's patterns\n // Sort by pattern specificity (longer patterns first)\n const sortedTypes = this.list().sort((a, b) => {\n const aMaxLen = Math.max(...a.patterns.map((p) => p.length))\n const bMaxLen = Math.max(...b.patterns.map((p) => p.length))\n return bMaxLen - aMaxLen\n })\n\n for (const type of sortedTypes) {\n if (type.name === 'default') continue\n\n for (const pattern of type.patterns) {\n if (micromatch.isMatch(normalizedPath, pattern)) {\n this.patternCache.set(filePath, type.name)\n return type.name\n }\n }\n }\n\n // No match, return default\n this.patternCache.set(filePath, 'default')\n return 'default'\n }\n\n /**\n * Get the TTL for a file based on its type\n *\n * @param filePath - File path\n * @param override - Optional TTL override\n * @returns TTL in seconds\n */\n getTtl(filePath: string, override?: number): number {\n if (override !== undefined) {\n return override\n }\n\n const typeName = this.detectType(filePath)\n const type = this.get(typeName) || DEFAULT_TYPE\n return type.defaultTtl\n }\n\n /**\n * Get archive configuration for a file\n *\n * @param filePath - File path\n * @returns Archive configuration or null if archiving is disabled\n */\n getArchiveConfig(filePath: string): {\n afterDays: number\n storage: 'local' | 'cloud' | 'drive'\n } | null {\n const typeName = this.detectType(filePath)\n const type = this.get(typeName) || DEFAULT_TYPE\n\n if (type.archiveAfterDays === null || type.archiveStorage === null) {\n return null\n }\n\n return {\n afterDays: type.archiveAfterDays,\n storage: type.archiveStorage,\n }\n }\n\n /**\n * Get all files that match a type's patterns\n *\n * @param typeName - Type name\n * @param files - Array of file paths to filter\n * @returns Filtered file paths\n */\n filterByType(typeName: string, files: string[]): string[] {\n const type = this.get(typeName)\n if (!type) {\n return []\n }\n\n return files.filter((file) => {\n const normalized = file.replace(/\\\\/g, '/')\n return type.patterns.some((pattern) => micromatch.isMatch(normalized, pattern))\n })\n }\n\n /**\n * Check if a type is a built-in type\n *\n * @param name - Type name\n * @returns true if it's a built-in type\n */\n isBuiltIn(name: string): boolean {\n return isBuiltInType(name)\n }\n\n /**\n * Get the number of registered types\n */\n get size(): number {\n return this.types.size\n }\n\n /**\n * Clear pattern cache\n *\n * Call this if you need to force re-detection of types.\n */\n clearCache(): void {\n this.patternCache.clear()\n }\n}\n\n/**\n * Create a default TypeRegistry with built-in types\n *\n * @returns A new TypeRegistry instance\n */\nexport function createDefaultRegistry(): TypeRegistry {\n return new TypeRegistry()\n}\n","/**\n * Custom type loading from configuration\n *\n * Loads user-defined artifact types from configuration files\n * and validates them against the type schema.\n */\n\nimport { z } from 'zod'\nimport type { ArtifactType } from './built-in.js'\nimport { DEFAULT_TYPE, TTL } from './built-in.js'\n\n/**\n * Schema for custom type definition in config\n */\nexport const CustomTypeSchema = z.object({\n description: z.string().optional(),\n patterns: z.array(z.string()).min(1),\n defaultTtl: z.number().positive().optional(),\n archiveAfterDays: z.number().positive().nullable().optional(),\n archiveStorage: z.enum(['local', 'cloud', 'drive']).nullable().optional(),\n syncPatterns: z.array(z.string()).optional(),\n excludePatterns: z.array(z.string()).optional(),\n permissions: z\n .object({\n include: z.array(z.string()),\n exclude: z.array(z.string()),\n })\n .optional(),\n})\n\nexport type CustomTypeConfig = z.infer<typeof CustomTypeSchema>\n\n/**\n * Schema for the types section of configuration\n */\nexport const TypesConfigSchema = z.object({\n custom: z.record(z.string(), CustomTypeSchema).optional(),\n})\n\nexport type TypesConfig = z.infer<typeof TypesConfigSchema>\n\n/**\n * Validation result for custom types\n */\nexport interface ValidationResult {\n valid: boolean\n errors: Array<{\n name: string\n field: string\n message: string\n }>\n}\n\n/**\n * Parse a TTL value from config (can be number or string like \"7d\", \"1w\")\n *\n * @param value - TTL value\n * @returns TTL in seconds\n */\nexport function parseTtl(value: string | number): number {\n if (typeof value === 'number') {\n return value\n }\n\n const match = value.match(/^(\\d+)(s|m|h|d|w)$/)\n if (!match || !match[1] || !match[2]) {\n return TTL.ONE_WEEK // Default fallback\n }\n\n const num = parseInt(match[1], 10)\n const unit = match[2]\n\n switch (unit) {\n case 's':\n return num\n case 'm':\n return num * 60\n case 'h':\n return num * 3600\n case 'd':\n return num * 86400\n case 'w':\n return num * 604800\n default:\n return TTL.ONE_WEEK\n }\n}\n\n/**\n * Validate custom types configuration\n *\n * @param config - Types configuration object\n * @returns Validation result\n */\nexport function validateCustomTypes(config: unknown): ValidationResult {\n const result: ValidationResult = {\n valid: true,\n errors: [],\n }\n\n if (!config || typeof config !== 'object') {\n return result // Empty config is valid\n }\n\n const typesConfig = config as Record<string, unknown>\n const customTypes = typesConfig.custom as Record<string, unknown> | undefined\n\n if (!customTypes) {\n return result\n }\n\n for (const [name, typeConfig] of Object.entries(customTypes)) {\n // Validate name\n if (!/^[a-z][a-z0-9_-]*$/.test(name)) {\n result.valid = false\n result.errors.push({\n name,\n field: 'name',\n message: 'Type name must start with a letter and contain only lowercase letters, numbers, hyphens, and underscores',\n })\n }\n\n // Validate config against schema\n const parseResult = CustomTypeSchema.safeParse(typeConfig)\n if (!parseResult.success) {\n result.valid = false\n for (const issue of parseResult.error.issues) {\n result.errors.push({\n name,\n field: issue.path.join('.'),\n message: issue.message,\n })\n }\n }\n }\n\n return result\n}\n\n/**\n * Load custom types from configuration\n *\n * @param config - Types configuration\n * @returns Map of type name to ArtifactType\n */\nexport function loadCustomTypes(config: TypesConfig): Map<string, ArtifactType> {\n const types = new Map<string, ArtifactType>()\n\n if (!config.custom) {\n return types\n }\n\n for (const [name, typeConfig] of Object.entries(config.custom)) {\n const type: ArtifactType = {\n name,\n description: typeConfig.description || `Custom type: ${name}`,\n patterns: typeConfig.patterns,\n defaultTtl: typeConfig.defaultTtl ?? DEFAULT_TYPE.defaultTtl,\n archiveAfterDays: typeConfig.archiveAfterDays ?? DEFAULT_TYPE.archiveAfterDays,\n archiveStorage: typeConfig.archiveStorage ?? DEFAULT_TYPE.archiveStorage,\n syncPatterns: typeConfig.syncPatterns,\n excludePatterns: typeConfig.excludePatterns,\n permissions: typeConfig.permissions,\n }\n\n types.set(name, type)\n }\n\n return types\n}\n\n/**\n * Merge custom types with built-in types\n *\n * Custom types override built-in types with the same name.\n *\n * @param builtIn - Built-in types\n * @param custom - Custom types\n * @returns Merged types\n */\nexport function mergeTypes(\n builtIn: Record<string, ArtifactType>,\n custom: Map<string, ArtifactType>\n): Map<string, ArtifactType> {\n const merged = new Map<string, ArtifactType>()\n\n // Add built-in types first\n for (const [name, type] of Object.entries(builtIn)) {\n merged.set(name, type)\n }\n\n // Override/add custom types\n for (const [name, type] of custom) {\n merged.set(name, type)\n }\n\n return merged\n}\n\n/**\n * Create a partial type definition for extending a built-in type\n *\n * @param baseName - Name of the built-in type to extend\n * @param overrides - Properties to override\n * @returns Partial type definition\n */\nexport function extendType(\n baseName: string,\n overrides: Partial<Omit<ArtifactType, 'name'>>\n): Partial<ArtifactType> {\n return {\n ...overrides,\n name: baseName,\n }\n}\n","/**\n * Types module - Extensible artifact type system\n *\n * Provides built-in artifact types (docs, specs, logs, etc.) and\n * support for user-defined custom types with TTL and archival policies.\n *\n * @example\n * ```typescript\n * import { TypeRegistry, BUILT_IN_TYPES } from '@fractary/codex/types'\n *\n * // Create a registry with built-in types\n * const registry = new TypeRegistry()\n *\n * // Detect type from file path\n * const type = registry.detectType('docs/oauth.md') // 'docs'\n * const ttl = registry.getTtl('docs/oauth.md') // 604800 (7 days)\n *\n * // Register a custom type\n * registry.register({\n * name: 'research',\n * description: 'Research notes',\n * patterns: ['research/**'],\n * defaultTtl: 604800,\n * archiveAfterDays: 90,\n * archiveStorage: 'cloud'\n * })\n * ```\n */\n\n// Built-in types\nexport {\n type ArtifactType,\n BUILT_IN_TYPES,\n DEFAULT_TYPE,\n TTL,\n getBuiltInType,\n getBuiltInTypeNames,\n isBuiltInType,\n} from './built-in.js'\n\n// Registry\nexport {\n TypeRegistry,\n createDefaultRegistry,\n type TypeRegistryOptions,\n} from './registry.js'\n\n// Custom types\nexport {\n CustomTypeSchema,\n TypesConfigSchema,\n type CustomTypeConfig,\n type TypesConfig,\n type ValidationResult,\n parseTtl,\n validateCustomTypes,\n loadCustomTypes,\n mergeTypes,\n extendType,\n} from './custom.js'\n","import micromatch from 'micromatch'\n\n/**\n * Match a pattern against a value using glob syntax\n *\n * Based on SPEC-00003: Pattern Matching\n *\n * @param pattern - Glob pattern (e.g., \"api-*\", \"core-*\")\n * @param value - Value to test (e.g., \"api-gateway\")\n * @returns true if pattern matches value\n */\nexport function matchPattern(pattern: string, value: string): boolean {\n // Special case: exact match\n if (pattern === value) return true\n\n // Use micromatch for glob pattern matching\n return micromatch.isMatch(value, pattern)\n}\n\n/**\n * Check if value matches any pattern in array\n *\n * @param patterns - Array of glob patterns\n * @param value - Value to test\n * @returns true if value matches any pattern\n */\nexport function matchAnyPattern(\n patterns: string[],\n value: string\n): boolean {\n // Special case: [*] matches everything\n if (patterns.length === 1 && patterns[0] === '*') {\n return true\n }\n\n // Empty array matches nothing\n if (patterns.length === 0) {\n return false\n }\n\n // Check each pattern\n return patterns.some(pattern => matchPattern(pattern, value))\n}\n\n/**\n * Filter values that match any pattern\n *\n * @param patterns - Array of glob patterns\n * @param values - Array of values to filter\n * @returns Values that match any pattern\n */\nexport function filterByPatterns(\n patterns: string[],\n values: string[]\n): string[] {\n return values.filter(value => matchAnyPattern(patterns, value))\n}\n\n/**\n * Evaluate include/exclude rules\n *\n * @param options - Evaluation options\n * @returns true if value should be included\n */\nexport function evaluatePatterns(options: {\n value: string\n include?: string[]\n exclude?: string[]\n}): boolean {\n const { value, include = [], exclude = [] } = options\n\n // Check exclusions first (exclusions take priority)\n if (exclude.length > 0 && matchAnyPattern(exclude, value)) {\n return false\n }\n\n // Check inclusions\n if (include.length === 0) {\n // No include patterns = include by default\n return true\n }\n\n return matchAnyPattern(include, value)\n}\n","/**\n * Storage provider interface and types\n *\n * Defines the contract for storage providers that can fetch\n * content from various sources (local, GitHub, HTTP, etc.)\n */\n\nimport type { ResolvedReference } from '../references/index.js'\n\n/**\n * Supported storage provider types\n */\nexport type StorageProviderType =\n | 'local'\n | 'github'\n | 'http'\n | 's3'\n | 's3-archive'\n | 'r2'\n | 'gcs'\n | 'drive'\n | 'file-plugin'\n\n/**\n * Result of a fetch operation\n */\nexport interface FetchResult {\n /** Fetched content as Buffer */\n content: Buffer\n /** Content type (MIME type) */\n contentType: string\n /** Content size in bytes */\n size: number\n /** Source identifier (e.g., 'github', 'local') */\n source: string\n /** Optional metadata */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Options for fetch operations\n */\nexport interface FetchOptions {\n /** Timeout in milliseconds */\n timeout?: number\n /** Maximum number of retries */\n maxRetries?: number\n /** Authentication token */\n token?: string\n /** Branch to fetch from (for git-based providers) */\n branch?: string\n /** Whether to follow redirects */\n followRedirects?: boolean\n /** Maximum content size in bytes */\n maxSize?: number\n}\n\n/**\n * Storage provider interface\n *\n * All storage providers must implement this interface.\n */\nexport interface StorageProvider {\n /** Provider name (e.g., 'github', 'local') */\n readonly name: string\n /** Provider type */\n readonly type: StorageProviderType\n\n /**\n * Fetch content for a resolved reference\n *\n * @param reference - The resolved reference to fetch\n * @param options - Fetch options\n * @returns The fetch result\n * @throws Error if fetch fails\n */\n fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult>\n\n /**\n * Check if content exists at the reference\n *\n * @param reference - The resolved reference to check\n * @param options - Fetch options\n * @returns true if content exists\n */\n exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean>\n\n /**\n * Check if this provider can handle the given reference\n *\n * @param reference - The resolved reference\n * @returns true if this provider can handle the reference\n */\n canHandle(reference: ResolvedReference): boolean\n}\n\n/**\n * Storage provider configuration\n */\nexport interface StorageProviderConfig {\n /** Provider type */\n type: StorageProviderType\n /** Provider-specific options */\n options?: Record<string, unknown>\n /** Default timeout */\n timeout?: number\n /** Default max retries */\n maxRetries?: number\n /** Authentication configuration */\n auth?: {\n /** Environment variable containing the token */\n tokenEnv?: string\n /** Static token (not recommended) */\n token?: string\n }\n}\n\n/**\n * Default fetch options\n */\nexport const DEFAULT_FETCH_OPTIONS: Required<FetchOptions> = {\n timeout: 30000, // 30 seconds\n maxRetries: 3,\n token: '',\n branch: 'main',\n followRedirects: true,\n maxSize: 10 * 1024 * 1024, // 10MB\n}\n\n/**\n * Merge fetch options with defaults\n *\n * @param options - User-provided options\n * @returns Merged options with defaults\n */\nexport function mergeFetchOptions(options?: FetchOptions): Required<FetchOptions> {\n return {\n ...DEFAULT_FETCH_OPTIONS,\n ...options,\n }\n}\n\n/**\n * Detect content type from file extension\n *\n * @param path - File path\n * @returns MIME type\n */\nexport function detectContentType(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase()\n\n const mimeTypes: Record<string, string> = {\n md: 'text/markdown',\n markdown: 'text/markdown',\n txt: 'text/plain',\n json: 'application/json',\n yaml: 'application/x-yaml',\n yml: 'application/x-yaml',\n xml: 'application/xml',\n html: 'text/html',\n htm: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n ts: 'application/typescript',\n py: 'text/x-python',\n rb: 'text/x-ruby',\n go: 'text/x-go',\n rs: 'text/x-rust',\n java: 'text/x-java',\n c: 'text/x-c',\n cpp: 'text/x-c++',\n h: 'text/x-c',\n hpp: 'text/x-c++',\n sh: 'application/x-sh',\n bash: 'application/x-sh',\n zsh: 'application/x-sh',\n pdf: 'application/pdf',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n }\n\n return mimeTypes[ext || ''] || 'application/octet-stream'\n}\n","/**\n * Local filesystem storage provider\n *\n * Fetches content from the local filesystem for current project references.\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating a LocalStorage provider\n */\nexport interface LocalStorageOptions {\n /** Base directory for resolving paths (default: process.cwd()) */\n baseDir?: string\n}\n\n/**\n * Local filesystem storage provider\n *\n * Handles fetching content from the local filesystem for references\n * that point to the current project.\n */\nexport class LocalStorage implements StorageProvider {\n readonly name = 'local'\n readonly type = 'local' as const\n\n private baseDir: string\n\n constructor(options: LocalStorageOptions = {}) {\n this.baseDir = options.baseDir || process.cwd()\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * Local provider handles references that are in the current project\n * and have a local path.\n */\n canHandle(reference: ResolvedReference): boolean {\n return reference.isCurrentProject && !!reference.localPath\n }\n\n /**\n * Fetch content from local filesystem\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n\n if (!reference.localPath) {\n throw new Error(`No local path for reference: ${reference.uri}`)\n }\n\n const fullPath = path.isAbsolute(reference.localPath)\n ? reference.localPath\n : path.join(this.baseDir, reference.localPath)\n\n // Check file exists\n try {\n await fs.access(fullPath)\n } catch {\n throw new Error(`File not found: ${fullPath}`)\n }\n\n // Check file size\n const stats = await fs.stat(fullPath)\n if (stats.size > opts.maxSize) {\n throw new Error(\n `File too large: ${stats.size} bytes (max: ${opts.maxSize} bytes)`\n )\n }\n\n // Read file content\n const content = await fs.readFile(fullPath)\n\n return {\n content,\n contentType: detectContentType(reference.localPath),\n size: content.length,\n source: 'local',\n metadata: {\n path: fullPath,\n mtime: stats.mtime.toISOString(),\n },\n }\n }\n\n /**\n * Check if file exists locally\n */\n async exists(reference: ResolvedReference): Promise<boolean> {\n if (!reference.localPath) {\n return false\n }\n\n const fullPath = path.isAbsolute(reference.localPath)\n ? reference.localPath\n : path.join(this.baseDir, reference.localPath)\n\n try {\n await fs.access(fullPath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Read file content as string\n */\n async readText(filePath: string): Promise<string> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n return fs.readFile(fullPath, 'utf-8')\n }\n\n /**\n * Write content to file\n */\n async write(filePath: string, content: string | Buffer): Promise<void> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(fullPath), { recursive: true })\n\n await fs.writeFile(fullPath, content)\n }\n\n /**\n * Delete a file\n */\n async delete(filePath: string): Promise<boolean> {\n const fullPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath)\n\n try {\n await fs.unlink(fullPath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * List files in a directory\n */\n async list(dirPath: string): Promise<string[]> {\n const fullPath = path.isAbsolute(dirPath)\n ? dirPath\n : path.join(this.baseDir, dirPath)\n\n try {\n const entries = await fs.readdir(fullPath, { withFileTypes: true })\n return entries\n .filter((e) => e.isFile())\n .map((e) => path.join(dirPath, e.name))\n } catch {\n return []\n }\n }\n}\n\n/**\n * Create a LocalStorage provider\n */\nexport function createLocalStorage(options?: LocalStorageOptions): LocalStorage {\n return new LocalStorage(options)\n}\n","/**\n * GitHub storage provider\n *\n * Fetches content from GitHub repositories using the GitHub API\n * or raw content URLs. Supports both public and private repos.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating a GitHub storage provider\n */\nexport interface GitHubStorageOptions {\n /** GitHub API token for authentication */\n token?: string\n /** Environment variable containing the token */\n tokenEnv?: string\n /** Base URL for GitHub API (default: https://api.github.com) */\n apiBaseUrl?: string\n /** Base URL for raw content (default: https://raw.githubusercontent.com) */\n rawBaseUrl?: string\n /** Default branch to use (default: main) */\n defaultBranch?: string\n}\n\n/**\n * GitHub API response for file content\n */\ninterface GitHubContentResponse {\n name: string\n path: string\n sha: string\n size: number\n type: 'file' | 'dir'\n content?: string\n encoding?: string\n download_url?: string\n}\n\n/**\n * GitHub storage provider\n *\n * Handles fetching content from GitHub repositories.\n * Uses raw.githubusercontent.com for public repos and\n * GitHub API for private repos (with authentication).\n */\nexport class GitHubStorage implements StorageProvider {\n readonly name = 'github'\n readonly type = 'github' as const\n\n private apiBaseUrl: string\n private rawBaseUrl: string\n private defaultBranch: string\n private token?: string\n\n constructor(options: GitHubStorageOptions = {}) {\n this.apiBaseUrl = options.apiBaseUrl || 'https://api.github.com'\n this.rawBaseUrl = options.rawBaseUrl || 'https://raw.githubusercontent.com'\n this.defaultBranch = options.defaultBranch || 'main'\n\n // Get token from options or environment\n this.token = options.token || (options.tokenEnv ? process.env[options.tokenEnv] : undefined)\n if (!this.token) {\n // Try common environment variables\n this.token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN\n }\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * GitHub provider handles references that are NOT in the current project\n * (those need to be fetched from GitHub).\n */\n canHandle(reference: ResolvedReference): boolean {\n return !reference.isCurrentProject\n }\n\n /**\n * Fetch content from GitHub\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const token = opts.token || this.token\n const branch = opts.branch || this.defaultBranch\n\n if (!reference.path) {\n throw new Error(`No path specified for reference: ${reference.uri}`)\n }\n\n // Try raw content first (faster, works for public repos)\n try {\n return await this.fetchRaw(reference, branch, opts, token)\n } catch (error) {\n // If raw fetch fails and we have a token, try API\n if (token) {\n return await this.fetchApi(reference, branch, opts, token)\n }\n throw error\n }\n }\n\n /**\n * Fetch using raw.githubusercontent.com\n */\n private async fetchRaw(\n reference: ResolvedReference,\n branch: string,\n opts: Required<FetchOptions>,\n token?: string\n ): Promise<FetchResult> {\n const url = `${this.rawBaseUrl}/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n }\n\n if (token) {\n headers['Authorization'] = `token ${token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), opts.timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n redirect: opts.followRedirects ? 'follow' : 'manual',\n })\n\n if (!response.ok) {\n throw new Error(`GitHub raw fetch failed: ${response.status} ${response.statusText}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const content = Buffer.from(arrayBuffer)\n\n if (content.length > opts.maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${opts.maxSize} bytes)`)\n }\n\n return {\n content,\n contentType: response.headers.get('content-type') || detectContentType(reference.path),\n size: content.length,\n source: 'github-raw',\n metadata: {\n url,\n branch,\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Fetch using GitHub API (for private repos)\n */\n private async fetchApi(\n reference: ResolvedReference,\n branch: string,\n opts: Required<FetchOptions>,\n token: string\n ): Promise<FetchResult> {\n const url = `${this.apiBaseUrl}/repos/${reference.org}/${reference.project}/contents/${reference.path}?ref=${branch}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n Accept: 'application/vnd.github.v3+json',\n Authorization: `token ${token}`,\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), opts.timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n throw new Error(`GitHub API fetch failed: ${response.status} ${response.statusText}`)\n }\n\n const data = (await response.json()) as GitHubContentResponse\n\n if (data.type !== 'file') {\n throw new Error(`Reference is not a file: ${reference.uri}`)\n }\n\n let content: Buffer\n\n if (data.content && data.encoding === 'base64') {\n // Content is base64 encoded in API response\n content = Buffer.from(data.content, 'base64')\n } else if (data.download_url) {\n // Fetch from download URL\n const downloadResponse = await fetch(data.download_url, {\n headers: { 'User-Agent': 'fractary-codex' },\n signal: controller.signal,\n })\n const arrayBuffer = await downloadResponse.arrayBuffer()\n content = Buffer.from(arrayBuffer)\n } else {\n throw new Error(`No content available for: ${reference.uri}`)\n }\n\n if (content.length > opts.maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${opts.maxSize} bytes)`)\n }\n\n return {\n content,\n contentType: detectContentType(reference.path),\n size: content.length,\n source: 'github-api',\n metadata: {\n sha: data.sha,\n url,\n branch,\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Check if file exists on GitHub\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const token = opts.token || this.token\n const branch = opts.branch || this.defaultBranch\n\n if (!reference.path) {\n return false\n }\n\n // Try HEAD request to raw URL\n const url = `${this.rawBaseUrl}/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n }\n\n if (token) {\n headers['Authorization'] = `token ${token}`\n }\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n })\n return response.ok\n } catch {\n return false\n }\n }\n\n /**\n * Get repository metadata\n */\n async getRepoInfo(\n org: string,\n project: string\n ): Promise<{\n defaultBranch: string\n private: boolean\n size: number\n } | null> {\n const url = `${this.apiBaseUrl}/repos/${org}/${project}`\n\n const headers: Record<string, string> = {\n 'User-Agent': 'fractary-codex',\n Accept: 'application/vnd.github.v3+json',\n }\n\n if (this.token) {\n headers['Authorization'] = `token ${this.token}`\n }\n\n try {\n const response = await fetch(url, { headers })\n if (!response.ok) {\n return null\n }\n\n const data = (await response.json()) as {\n default_branch: string\n private: boolean\n size: number\n }\n\n return {\n defaultBranch: data.default_branch,\n private: data.private,\n size: data.size,\n }\n } catch {\n return null\n }\n }\n}\n\n/**\n * Create a GitHub storage provider\n */\nexport function createGitHubStorage(options?: GitHubStorageOptions): GitHubStorage {\n return new GitHubStorage(options)\n}\n","/**\n * HTTP storage provider\n *\n * Fetches content from HTTP/HTTPS URLs. Used for external\n * documentation, APIs, and other web resources.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\n\n/**\n * Options for creating an HTTP storage provider\n */\nexport interface HttpStorageOptions {\n /** Default timeout in milliseconds */\n timeout?: number\n /** Maximum content size in bytes */\n maxSize?: number\n /** Custom headers to include in requests */\n headers?: Record<string, string>\n /** User agent string */\n userAgent?: string\n}\n\n/**\n * HTTP storage provider\n *\n * Generic provider for fetching content from HTTP/HTTPS URLs.\n * This is a fallback provider for external resources.\n */\nexport class HttpStorage implements StorageProvider {\n readonly name = 'http'\n readonly type = 'http' as const\n\n private defaultTimeout: number\n private defaultMaxSize: number\n private defaultHeaders: Record<string, string>\n\n constructor(options: HttpStorageOptions = {}) {\n this.defaultTimeout = options.timeout || 30000\n this.defaultMaxSize = options.maxSize || 10 * 1024 * 1024 // 10MB\n this.defaultHeaders = {\n 'User-Agent': options.userAgent || 'fractary-codex',\n ...options.headers,\n }\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * HTTP provider is a fallback - it can handle any reference\n * but should have lower priority than specialized providers.\n */\n canHandle(_reference: ResolvedReference): boolean {\n // HTTP provider is a fallback, so it can handle anything\n // but let other providers take precedence\n return true\n }\n\n /**\n * Fetch content from HTTP URL\n *\n * This method constructs a URL from the reference and fetches it.\n * The URL pattern is: https://raw.githubusercontent.com/{org}/{project}/{branch}/{path}\n *\n * For custom URL schemes, use the fetchUrl method directly.\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const branch = opts.branch || 'main'\n\n if (!reference.path) {\n throw new Error(`No path specified for reference: ${reference.uri}`)\n }\n\n // Construct URL (GitHub raw content as default)\n const url = `https://raw.githubusercontent.com/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n return this.fetchUrl(url, opts)\n }\n\n /**\n * Fetch content from any URL\n */\n async fetchUrl(url: string, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const timeout = opts.timeout || this.defaultTimeout\n const maxSize = opts.maxSize || this.defaultMaxSize\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n }\n\n if (opts.token) {\n headers['Authorization'] = `Bearer ${opts.token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n redirect: opts.followRedirects ? 'follow' : 'manual',\n })\n\n if (!response.ok) {\n throw new Error(`HTTP fetch failed: ${response.status} ${response.statusText}`)\n }\n\n // Check content length header first\n const contentLength = response.headers.get('content-length')\n if (contentLength && parseInt(contentLength, 10) > maxSize) {\n throw new Error(`Content too large: ${contentLength} bytes (max: ${maxSize} bytes)`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const content = Buffer.from(arrayBuffer)\n\n if (content.length > maxSize) {\n throw new Error(`Content too large: ${content.length} bytes (max: ${maxSize} bytes)`)\n }\n\n // Extract filename from URL for content type detection\n const pathname = new URL(url).pathname\n const filename = pathname.split('/').pop() || ''\n\n return {\n content,\n contentType: response.headers.get('content-type') || detectContentType(filename),\n size: content.length,\n source: 'http',\n metadata: {\n url,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n },\n }\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * Check if URL exists (HEAD request)\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const branch = opts.branch || 'main'\n\n if (!reference.path) {\n return false\n }\n\n const url = `https://raw.githubusercontent.com/${reference.org}/${reference.project}/${branch}/${reference.path}`\n\n return this.urlExists(url, opts)\n }\n\n /**\n * Check if any URL exists\n */\n async urlExists(url: string, options?: FetchOptions): Promise<boolean> {\n const opts = mergeFetchOptions(options)\n const timeout = opts.timeout || this.defaultTimeout\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n }\n\n if (opts.token) {\n headers['Authorization'] = `Bearer ${opts.token}`\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n signal: controller.signal,\n redirect: 'follow',\n })\n\n return response.ok\n } catch {\n return false\n } finally {\n clearTimeout(timeoutId)\n }\n }\n}\n\n/**\n * Create an HTTP storage provider\n */\nexport function createHttpStorage(options?: HttpStorageOptions): HttpStorage {\n return new HttpStorage(options)\n}\n","/**\n * File plugin source resolution\n *\n * Resolves file plugin sources from unified configuration and provides\n * utilities for matching paths to file sources.\n *\n * Based on SPEC-20260115: Codex-File Plugin Integration\n */\n\nimport type { UnifiedConfig, FileSource } from '../schemas/config.js'\n\n/**\n * Resolved file source with local and remote paths\n */\nexport interface ResolvedFileSource {\n /** Source name (e.g., \"specs\", \"logs\") */\n name: string\n /** Source type identifier */\n type: 'file-plugin'\n /** Local filesystem path */\n localPath: string\n /** Remote S3/R2/GCS path if configured */\n remotePath?: string\n /** Cloud storage bucket name */\n bucket?: string\n /** Cloud storage prefix */\n prefix?: string\n /** Always true for current project */\n isCurrentProject: boolean\n /** Raw file source configuration */\n config: FileSource\n}\n\n/**\n * File source resolver\n *\n * Parses file plugin sources from unified configuration and provides\n * utilities for resolving and matching file paths.\n */\nexport class FileSourceResolver {\n private sources: Map<string, ResolvedFileSource> = new Map()\n\n constructor(private config: UnifiedConfig) {\n this.initializeSources()\n }\n\n /**\n * Initialize sources from config\n */\n private initializeSources(): void {\n if (!this.config.file?.sources) {\n return\n }\n\n for (const [name, sourceConfig] of Object.entries(this.config.file.sources)) {\n const resolved: ResolvedFileSource = {\n name,\n type: 'file-plugin',\n localPath: sourceConfig.local.base_path,\n isCurrentProject: true,\n config: sourceConfig,\n }\n\n // Add remote path if cloud storage is configured\n if (sourceConfig.bucket && sourceConfig.type !== 'local') {\n resolved.bucket = sourceConfig.bucket\n resolved.prefix = sourceConfig.prefix\n resolved.remotePath = this.buildRemotePath(sourceConfig)\n }\n\n this.sources.set(name, resolved)\n }\n }\n\n /**\n * Build remote path from source config\n */\n private buildRemotePath(source: FileSource): string {\n const protocol = source.type === 's3' ? 's3://' : source.type === 'r2' ? 'r2://' : 'gcs://'\n const bucket = source.bucket\n const prefix = source.prefix ? `/${source.prefix}` : ''\n return `${protocol}${bucket}${prefix}`\n }\n\n /**\n * Get all available file plugin sources\n *\n * @returns Array of resolved file sources\n */\n getAvailableSources(): ResolvedFileSource[] {\n return Array.from(this.sources.values())\n }\n\n /**\n * Resolve a source by name\n *\n * @param name - Source name (e.g., \"specs\", \"logs\")\n * @returns Resolved source or null if not found\n */\n resolveSource(name: string): ResolvedFileSource | null {\n return this.sources.get(name) || null\n }\n\n /**\n * Check if a path belongs to any file plugin source\n *\n * @param path - File path to check\n * @returns True if path matches any source's base_path\n */\n isFilePluginPath(path: string): boolean {\n return this.getSourceForPath(path) !== null\n }\n\n /**\n * Get the source for a given path\n *\n * Matches path against all source base_paths and returns the matching source.\n * Uses longest-match strategy if multiple sources match.\n *\n * @param path - File path to match\n * @returns Matching source or null\n */\n getSourceForPath(path: string): ResolvedFileSource | null {\n let bestMatch: ResolvedFileSource | null = null\n let bestMatchLength = 0\n\n for (const source of this.sources.values()) {\n // Normalize paths for comparison\n const normalizedPath = this.normalizePath(path)\n const normalizedBasePath = this.normalizePath(source.localPath)\n\n // Check if path starts with source's base_path\n if (normalizedPath.startsWith(normalizedBasePath)) {\n const matchLength = normalizedBasePath.length\n\n // Use longest match strategy\n if (matchLength > bestMatchLength) {\n bestMatch = source\n bestMatchLength = matchLength\n }\n }\n }\n\n return bestMatch\n }\n\n /**\n * Normalize path for comparison\n * - Remove leading \"./\" or \"/\"\n * - Remove trailing \"/\"\n * - Convert to lowercase for case-insensitive comparison\n */\n private normalizePath(path: string): string {\n return path\n .replace(/^\\.\\//, '')\n .replace(/^\\//, '')\n .replace(/\\/$/, '')\n .toLowerCase()\n }\n\n /**\n * Get source names\n *\n * @returns Array of source names\n */\n getSourceNames(): string[] {\n return Array.from(this.sources.keys())\n }\n\n /**\n * Check if sources are configured\n *\n * @returns True if any file plugin sources are configured\n */\n hasSources(): boolean {\n return this.sources.size > 0\n }\n}\n","/**\n * File plugin integration module\n *\n * Provides utilities for integrating with the file plugin (Fractary Core)\n * including source resolution and storage provider implementation.\n */\n\nexport { FileSourceResolver, type ResolvedFileSource } from './source-resolver.js'\n","/**\n * Storage-related error classes\n */\n\n/**\n * Options for FilePluginFileNotFoundError\n */\nexport interface FilePluginFileNotFoundErrorOptions {\n /** Whether to include cloud storage suggestions (default: true) */\n includeCloudSuggestions?: boolean\n /** Cloud storage type (e.g., 's3', 'r2', 'gcs') */\n storageType?: string\n}\n\n/**\n * Error thrown when a file is not found in file plugin storage\n */\nexport class FilePluginFileNotFoundError extends Error {\n constructor(\n public readonly filePath: string,\n public readonly sourceName: string,\n options?: FilePluginFileNotFoundErrorOptions\n ) {\n const includeCloudSuggestions = options?.includeCloudSuggestions !== false\n const storageType = options?.storageType\n\n let message = `File not found: ${filePath}\\n\\n`\n\n if (includeCloudSuggestions) {\n if (storageType) {\n message += `This file may be in cloud storage (${storageType}).\\n\\n`\n } else {\n message += `This file may not have been synced from remote storage yet.\\n`\n }\n message += `To fetch from cloud storage, run:\\n`\n message += ` file pull ${sourceName}\\n\\n`\n message += `Or sync all sources:\\n`\n message += ` file sync`\n } else {\n message += `Please ensure the file exists locally or pull it from cloud storage.`\n }\n\n super(message)\n this.name = 'FilePluginFileNotFoundError'\n\n // Maintain proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FilePluginFileNotFoundError)\n }\n }\n}\n","/**\n * File plugin storage provider\n *\n * Provides storage integration with the file plugin (Fractary Core)\n * for current project artifact access. Reads directly from local filesystem\n * without caching for optimal freshness during active development.\n *\n * Based on SPEC-20260115: Codex-File Plugin Integration\n */\n\nimport * as fs from 'fs/promises'\nimport * as path from 'path'\nimport type { StorageProvider, FetchResult, FetchOptions } from './provider.js'\nimport type { ResolvedReference } from '../references/index.js'\nimport type { UnifiedConfig } from '../schemas/config.js'\nimport { FileSourceResolver, type ResolvedFileSource } from '../file-integration/index.js'\nimport { FilePluginFileNotFoundError } from './errors.js'\n\n/**\n * File plugin storage configuration\n */\nexport interface FilePluginStorageOptions {\n /** Unified configuration */\n config: UnifiedConfig\n /** Enable S3 fallback suggestions */\n enableS3Fallback?: boolean\n /** Base directory for resolving relative paths */\n baseDir?: string\n}\n\n/**\n * File plugin storage provider\n *\n * Handles file reads for current project file plugin sources.\n * Does NOT cache results - always reads fresh from disk.\n */\nexport class FilePluginStorage implements StorageProvider {\n readonly name = 'file-plugin'\n readonly type = 'local' as const // Reuse local type for compatibility\n\n private sourceResolver: FileSourceResolver\n private baseDir: string\n\n constructor(private options: FilePluginStorageOptions) {\n this.sourceResolver = new FileSourceResolver(options.config)\n this.baseDir = options.baseDir || process.cwd()\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * Only handles:\n * - Current project references\n * - With sourceType === 'file-plugin'\n *\n * @param reference - Resolved reference\n * @returns True if this provider can handle the reference\n */\n canHandle(reference: ResolvedReference): boolean {\n return reference.isCurrentProject && reference.sourceType === 'file-plugin'\n }\n\n /**\n * Fetch content for a reference\n *\n * Reads from local filesystem based on the resolved local path.\n * If file not found and S3 fallback is enabled, throws helpful error.\n *\n * @param reference - Resolved reference\n * @param options - Fetch options (unused for local reads)\n * @returns Fetch result with content\n */\n async fetch(reference: ResolvedReference, _options?: FetchOptions): Promise<FetchResult> {\n if (!reference.localPath) {\n throw new Error(`File plugin reference missing localPath: ${reference.uri}`)\n }\n\n if (!reference.filePluginSource) {\n throw new Error(`File plugin reference missing source name: ${reference.uri}`)\n }\n\n // Resolve absolute path and validate against path traversal\n const absolutePath = path.isAbsolute(reference.localPath)\n ? path.resolve(reference.localPath)\n : path.resolve(this.baseDir, reference.localPath)\n\n // Security: Validate that resolved path stays within allowed directory\n const source = this.sourceResolver.resolveSource(reference.filePluginSource)\n if (source) {\n const allowedDir = path.resolve(this.baseDir, source.localPath)\n if (!absolutePath.startsWith(allowedDir + path.sep) && absolutePath !== allowedDir) {\n throw new Error(\n `Path traversal detected: ${reference.localPath} resolves outside allowed directory ${source.localPath}`\n )\n }\n }\n\n try {\n // Read file content\n const content = await fs.readFile(absolutePath)\n\n // Detect content type from extension\n const contentType = this.detectContentType(absolutePath)\n\n return {\n content,\n contentType,\n size: content.length,\n source: 'file-plugin',\n metadata: {\n filePluginSource: reference.filePluginSource,\n localPath: absolutePath,\n },\n }\n } catch (error) {\n // File not found - provide helpful error message\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n const source = this.sourceResolver.resolveSource(reference.filePluginSource)\n throw this.createFileNotFoundError(reference, source)\n }\n\n // Other errors - rethrow\n throw error\n }\n }\n\n /**\n * Check if a reference exists\n *\n * @param reference - Resolved reference\n * @param options - Fetch options (unused)\n * @returns True if file exists\n */\n async exists(reference: ResolvedReference, _options?: FetchOptions): Promise<boolean> {\n if (!reference.localPath) {\n return false\n }\n\n // Resolve absolute path and validate against path traversal\n const absolutePath = path.isAbsolute(reference.localPath)\n ? path.resolve(reference.localPath)\n : path.resolve(this.baseDir, reference.localPath)\n\n // Security: Validate that resolved path stays within allowed directory\n if (reference.filePluginSource) {\n const source = this.sourceResolver.resolveSource(reference.filePluginSource)\n if (source) {\n const allowedDir = path.resolve(this.baseDir, source.localPath)\n if (!absolutePath.startsWith(allowedDir + path.sep) && absolutePath !== allowedDir) {\n return false // Path traversal attempt - file doesn't \"exist\" from our perspective\n }\n }\n }\n\n try {\n await fs.access(absolutePath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Detect content type from file extension\n */\n private detectContentType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase()\n\n const mimeTypes: Record<string, string> = {\n '.md': 'text/markdown',\n '.txt': 'text/plain',\n '.json': 'application/json',\n '.yaml': 'text/yaml',\n '.yml': 'text/yaml',\n '.html': 'text/html',\n '.xml': 'application/xml',\n '.log': 'text/plain',\n '.js': 'application/javascript',\n '.ts': 'application/typescript',\n '.py': 'text/x-python',\n '.sh': 'application/x-sh',\n }\n\n return mimeTypes[ext] || 'application/octet-stream'\n }\n\n /**\n * Create a helpful error message when file is not found\n */\n private createFileNotFoundError(\n reference: ResolvedReference,\n source: ResolvedFileSource | null\n ): FilePluginFileNotFoundError {\n // Use the custom error class which includes helpful messages\n const includeCloudSuggestions = this.options.enableS3Fallback !== false\n const storageType = source?.config.type\n\n return new FilePluginFileNotFoundError(\n reference.localPath || reference.path || '',\n reference.filePluginSource || '',\n {\n includeCloudSuggestions,\n storageType,\n }\n )\n }\n}\n","/**\n * Safe command execution utility\n *\n * Uses execFile instead of exec to prevent shell injection.\n * Provides structured output with stdout, stderr, and status.\n */\n\nimport { execFile } from 'child_process'\nimport { promisify } from 'util'\n\nconst execFileAsync = promisify(execFile)\n\nexport interface ExecResult {\n stdout: string\n stderr: string\n exitCode: number\n}\n\n/**\n * Execute a command safely using execFile\n *\n * @param command - Command to execute (NOT a shell string)\n * @param args - Array of arguments\n * @param options - Options for execFile\n * @returns Promise with stdout, stderr, and exit code\n */\nexport async function execFileNoThrow(\n command: string,\n args: string[] = [],\n options?: {\n cwd?: string\n timeout?: number\n maxBuffer?: number\n env?: NodeJS.ProcessEnv\n }\n): Promise<ExecResult> {\n try {\n const { stdout, stderr } = await execFileAsync(command, args, {\n ...options,\n maxBuffer: options?.maxBuffer || 1024 * 1024 * 10, // 10MB default\n })\n\n return {\n stdout: stdout || '',\n stderr: stderr || '',\n exitCode: 0,\n }\n } catch (error: any) {\n // execFile throws on non-zero exit codes\n // error.code is a string (e.g., 'ENOENT'), error.exitCode is the numeric exit code\n const exitCode = typeof error.exitCode === 'number' ? error.exitCode : 1\n\n return {\n stdout: error.stdout || '',\n stderr: error.stderr || error.message || '',\n exitCode,\n }\n }\n}\n","/**\n * S3 Archive storage provider\n *\n * Fetches archived content from S3 using fractary-file CLI.\n * Provides transparent fallback for documents that have been archived.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport {\n type StorageProvider,\n type FetchResult,\n type FetchOptions,\n detectContentType,\n mergeFetchOptions,\n} from './provider.js'\nimport { execFileNoThrow } from '../utils/execFileNoThrow.js'\n\n/**\n * Archive configuration for a project\n */\nexport interface ArchiveProjectConfig {\n enabled: boolean\n handler: 's3' | 'r2' | 'gcs' | 'local'\n bucket?: string\n prefix?: string\n patterns?: string[]\n}\n\n/**\n * Options for creating an S3ArchiveStorage provider\n */\nexport interface S3ArchiveStorageOptions {\n /** Archive configurations per project (key: \"org/project\") */\n projects?: Record<string, ArchiveProjectConfig>\n /** Path to fractary CLI (default: 'fractary') */\n fractaryCli?: string\n}\n\n/**\n * S3 Archive storage provider\n *\n * Handles fetching archived content from S3 via fractary-file CLI.\n * Only activates for current project files that match archive config.\n */\nexport class S3ArchiveStorage implements StorageProvider {\n readonly name = 's3-archive'\n readonly type = 's3-archive' as const\n\n private projects: Record<string, ArchiveProjectConfig>\n private fractaryCli: string\n\n constructor(options: S3ArchiveStorageOptions = {}) {\n this.projects = options.projects || {}\n this.fractaryCli = options.fractaryCli || 'fractary'\n }\n\n /**\n * Check if this provider can handle the reference\n *\n * S3 Archive provider handles references that:\n * 1. Are for the current project (same org/project)\n * 2. Have archive enabled in config\n * 3. Match configured patterns (if specified)\n */\n canHandle(reference: ResolvedReference): boolean {\n // Only handle current project files\n if (!reference.isCurrentProject) {\n return false\n }\n\n // Get archive config for this project\n const projectKey = `${reference.org}/${reference.project}`\n const config = this.projects[projectKey]\n\n // Check if archive is enabled\n if (!config || !config.enabled) {\n return false\n }\n\n // Check patterns if specified\n if (config.patterns && config.patterns.length > 0) {\n return this.matchesPatterns(reference.path, config.patterns)\n }\n\n // No patterns = handle all files\n return true\n }\n\n /**\n * Fetch content from S3 archive via fractary-file CLI\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n const opts = mergeFetchOptions(options)\n const projectKey = `${reference.org}/${reference.project}`\n const config = this.projects[projectKey]\n\n if (!config) {\n throw new Error(`No archive config for project: ${projectKey}`)\n }\n\n // Calculate archive path with project config\n const archivePath = this.calculateArchivePath(reference, config)\n\n // Call fractary-file CLI to read from archive\n try {\n const result = await execFileNoThrow(\n this.fractaryCli,\n [\n 'file',\n 'read',\n '--remote-path',\n archivePath,\n '--handler',\n config.handler,\n ...(config.bucket ? ['--bucket', config.bucket] : []),\n ],\n {\n timeout: opts.timeout,\n }\n )\n\n if (result.exitCode !== 0) {\n throw new Error(`fractary-file read failed: ${result.stderr}`)\n }\n\n const content = Buffer.from(result.stdout)\n\n return {\n content,\n contentType: detectContentType(reference.path),\n size: content.length,\n source: 's3-archive',\n metadata: {\n archivePath,\n bucket: config.bucket,\n handler: config.handler,\n },\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`Failed to fetch from archive: ${message}`)\n }\n }\n\n /**\n * Check if archived file exists\n *\n * Note: This currently downloads the file to check existence.\n * TODO: Optimize by using fractary-file 'stat' or 'head' command when available\n * to avoid downloading full file for existence checks.\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n const projectKey = `${reference.org}/${reference.project}`\n const config = this.projects[projectKey]\n\n if (!config) {\n return false\n }\n\n try {\n // Use fetch with minimal options for existence check\n // Note: This still downloads the file - requires fractary-file enhancement for true optimization\n await this.fetch(reference, { ...options, timeout: 5000 })\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Calculate archive path from reference\n *\n * Pattern: {prefix}/{type}/{org}/{project}/{original-path}\n *\n * Examples (with default prefix \"archive/\"):\n * specs/WORK-123.md → archive/specs/org/project/specs/WORK-123.md\n * docs/api.md → archive/docs/org/project/docs/api.md\n *\n * Examples (with custom prefix \"archived-docs/\"):\n * specs/WORK-123.md → archived-docs/specs/org/project/specs/WORK-123.md\n */\n private calculateArchivePath(reference: ResolvedReference, config: ArchiveProjectConfig): string {\n const type = this.detectType(reference.path)\n const prefix = config.prefix || 'archive/'\n\n // Validate prefix is not empty or whitespace-only\n const trimmedPrefix = prefix.trim()\n if (!trimmedPrefix) {\n throw new Error('Archive prefix cannot be empty or whitespace-only')\n }\n\n // Ensure prefix ends with / for consistent path construction\n const normalizedPrefix = trimmedPrefix.endsWith('/') ? trimmedPrefix : `${trimmedPrefix}/`\n\n return `${normalizedPrefix}${type}/${reference.org}/${reference.project}/${reference.path}`\n }\n\n /**\n * Detect artifact type from path\n *\n * Used to organize archives by type\n */\n private detectType(path: string): string {\n if (path.startsWith('specs/')) return 'specs'\n if (path.startsWith('docs/')) return 'docs'\n if (path.includes('/logs/')) return 'logs'\n return 'misc'\n }\n\n /**\n * Check if path matches any of the patterns\n *\n * Supports glob-style patterns:\n * - specs/** (all files in specs/)\n * - *.md (all markdown files)\n * - docs/*.md (markdown files in docs/)\n */\n private matchesPatterns(path: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n if (this.matchesPattern(path, pattern)) {\n return true\n }\n }\n return false\n }\n\n /**\n * Check if path matches a single pattern\n */\n private matchesPattern(path: string, pattern: string): boolean {\n // Convert glob pattern to regex using placeholder approach\n // to prevent ** replacement from being affected by * replacement\n\n // Step 1: Protect ** with placeholder\n const DOUBLE_STAR = '\\x00DOUBLE_STAR\\x00'\n let regexPattern = pattern.replace(/\\*\\*/g, DOUBLE_STAR)\n\n // Step 2: Escape regex special chars (except our placeholder and glob chars * ?)\n // Escape: . [ ] ( ) { } + ^ $ | \\\n regexPattern = regexPattern.replace(/[.[\\](){}+^$|\\\\]/g, '\\\\$&')\n\n // Step 3: Replace single * and ?\n regexPattern = regexPattern\n .replace(/\\*/g, '[^/]*')\n .replace(/\\?/g, '[^/]')\n\n // Step 4: Replace placeholder with final regex\n regexPattern = regexPattern.replace(new RegExp(DOUBLE_STAR, 'g'), '.*')\n\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(path)\n }\n}\n","/**\n * Storage manager\n *\n * Coordinates multiple storage providers and handles fallback logic.\n * The manager tries providers in priority order until one succeeds.\n */\n\nimport type { ResolvedReference } from '../references/index.js'\nimport { type StorageProvider, type FetchResult, type FetchOptions, type StorageProviderType } from './provider.js'\nimport { LocalStorage, type LocalStorageOptions } from './local.js'\nimport { GitHubStorage, type GitHubStorageOptions } from './github.js'\nimport { HttpStorage, type HttpStorageOptions } from './http.js'\nimport { S3ArchiveStorage, type S3ArchiveStorageOptions } from './s3-archive.js'\nimport { FilePluginStorage, type FilePluginStorageOptions } from './file-plugin.js'\nimport type { CodexConfig } from '../schemas/config.js'\n\n/**\n * Storage manager configuration\n */\nexport interface StorageManagerConfig {\n /** Local storage options */\n local?: LocalStorageOptions\n /** GitHub storage options */\n github?: GitHubStorageOptions\n /** HTTP storage options */\n http?: HttpStorageOptions\n /** S3 Archive storage options */\n s3Archive?: S3ArchiveStorageOptions\n /** File plugin storage options */\n filePlugin?: FilePluginStorageOptions\n /** Provider priority order */\n priority?: StorageProviderType[]\n /** Whether to enable caching (handled by cache layer, not storage) */\n enableCaching?: boolean\n /** Full codex configuration (for auth and remotes) */\n codexConfig?: CodexConfig\n}\n\n/**\n * Storage manager\n *\n * Manages multiple storage providers and routes fetch requests\n * to the appropriate provider based on reference type and availability.\n */\nexport class StorageManager {\n private providers: Map<StorageProviderType, StorageProvider> = new Map()\n private priority: StorageProviderType[]\n private codexConfig?: CodexConfig\n\n constructor(config: StorageManagerConfig = {}) {\n // Store codex config for auth resolution\n this.codexConfig = config.codexConfig\n\n // Initialize default providers\n this.providers.set('local', new LocalStorage(config.local))\n this.providers.set('github', new GitHubStorage(config.github))\n this.providers.set('http', new HttpStorage(config.http))\n\n // Initialize S3 Archive provider if configured\n if (config.s3Archive) {\n this.providers.set('s3-archive', new S3ArchiveStorage(config.s3Archive))\n }\n\n // Initialize File Plugin provider if configured\n if (config.filePlugin) {\n this.providers.set('file-plugin', new FilePluginStorage(config.filePlugin))\n }\n\n // Set priority order\n // file-plugin first (current project, no cache)\n // then local, s3-archive, github, http\n this.priority =\n config.priority ||\n (config.filePlugin && config.s3Archive\n ? ['file-plugin', 'local', 's3-archive', 'github', 'http']\n : config.filePlugin\n ? ['file-plugin', 'local', 'github', 'http']\n : config.s3Archive\n ? ['local', 's3-archive', 'github', 'http']\n : ['local', 'github', 'http'])\n }\n\n /**\n * Resolve a token value, expanding ${VAR} references to environment variables\n */\n private resolveTokenValue(token: string): string | undefined {\n // Check for ${VAR} syntax\n const envVarMatch = token.match(/^\\$\\{([^}]+)\\}$/)\n if (envVarMatch && envVarMatch[1]) {\n const envVarName = envVarMatch[1]\n return process.env[envVarName]\n }\n // Direct token value\n return token\n }\n\n /**\n * Resolve authentication token for a reference\n *\n * Looks up remote-specific authentication or falls back to default\n */\n private resolveToken(reference: ResolvedReference): string | undefined {\n if (!this.codexConfig) {\n return undefined\n }\n\n // Build remote key: org/project\n const remoteKey = `${reference.org}/${reference.project}`\n\n // Check for remote-specific auth\n if (this.codexConfig.remotes?.[remoteKey]?.token) {\n const token = this.resolveTokenValue(this.codexConfig.remotes[remoteKey].token)\n if (token) {\n return token\n }\n }\n\n // Fall back to default GitHub auth\n const defaultTokenEnv = this.codexConfig.auth?.github?.default_token_env || 'GITHUB_TOKEN'\n return process.env[defaultTokenEnv]\n }\n\n /**\n * Resolve fetch options with authentication\n *\n * Merges reference-specific authentication with provided options\n */\n private resolveFetchOptions(reference: ResolvedReference, options?: FetchOptions): FetchOptions {\n const token = this.resolveToken(reference)\n\n return {\n ...options,\n token: options?.token || token, // Explicit option overrides resolved token\n }\n }\n\n /**\n * Register a custom storage provider\n */\n registerProvider(provider: StorageProvider): void {\n this.providers.set(provider.type, provider)\n }\n\n /**\n * Remove a storage provider\n */\n removeProvider(type: StorageProviderType): boolean {\n return this.providers.delete(type)\n }\n\n /**\n * Get a provider by type\n */\n getProvider(type: StorageProviderType): StorageProvider | undefined {\n return this.providers.get(type)\n }\n\n /**\n * Get all registered providers\n */\n getProviders(): StorageProvider[] {\n return Array.from(this.providers.values())\n }\n\n /**\n * Find the best provider for a reference\n */\n findProvider(reference: ResolvedReference): StorageProvider | null {\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (provider && provider.canHandle(reference)) {\n return provider\n }\n }\n return null\n }\n\n /**\n * Fetch content for a reference\n *\n * Tries providers in priority order until one succeeds.\n * Automatically resolves authentication based on remote configuration.\n */\n async fetch(reference: ResolvedReference, options?: FetchOptions): Promise<FetchResult> {\n // Resolve authentication options\n const resolvedOptions = this.resolveFetchOptions(reference, options)\n const errors: Error[] = []\n\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (!provider || !provider.canHandle(reference)) {\n continue\n }\n\n try {\n return await provider.fetch(reference, resolvedOptions)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n // Continue to next provider\n }\n }\n\n // All providers failed\n if (errors.length === 0) {\n throw new Error(`No provider can handle reference: ${reference.uri}`)\n }\n\n // Throw the first error with context about other failures\n const firstError = errors[0]\n if (firstError) {\n if (errors.length > 1) {\n throw new Error(`All providers failed for ${reference.uri}. First error: ${firstError.message}`)\n }\n throw firstError\n }\n\n throw new Error(`Unknown error fetching ${reference.uri}`)\n }\n\n /**\n * Check if content exists for a reference\n *\n * Returns true if any provider reports the content exists.\n * Automatically resolves authentication based on remote configuration.\n */\n async exists(reference: ResolvedReference, options?: FetchOptions): Promise<boolean> {\n // Resolve authentication options\n const resolvedOptions = this.resolveFetchOptions(reference, options)\n\n for (const type of this.priority) {\n const provider = this.providers.get(type)\n if (!provider || !provider.canHandle(reference)) {\n continue\n }\n\n try {\n if (await provider.exists(reference, resolvedOptions)) {\n return true\n }\n } catch {\n // Continue to next provider\n }\n }\n\n return false\n }\n\n /**\n * Fetch content using a specific provider\n */\n async fetchWith(\n type: StorageProviderType,\n reference: ResolvedReference,\n options?: FetchOptions\n ): Promise<FetchResult> {\n const provider = this.providers.get(type)\n if (!provider) {\n throw new Error(`Provider not found: ${type}`)\n }\n\n return provider.fetch(reference, options)\n }\n\n /**\n * Fetch multiple references in parallel\n *\n * Automatically resolves authentication for each reference based on dependency configuration.\n */\n async fetchMany(\n references: ResolvedReference[],\n options?: FetchOptions\n ): Promise<Map<string, FetchResult | Error>> {\n const results = new Map<string, FetchResult | Error>()\n\n const promises = references.map(async (ref) => {\n try {\n // Each reference gets its own resolved options\n const result = await this.fetch(ref, options)\n results.set(ref.uri, result)\n } catch (error) {\n results.set(ref.uri, error instanceof Error ? error : new Error(String(error)))\n }\n })\n\n await Promise.all(promises)\n return results\n }\n\n /**\n * Get provider status (for diagnostics)\n */\n getStatus(): Array<{\n type: StorageProviderType\n name: string\n priority: number\n }> {\n return this.priority.map((type, index) => {\n const provider = this.providers.get(type)\n return {\n type,\n name: provider?.name || type,\n priority: index,\n }\n })\n }\n}\n\n/**\n * Create a storage manager with default configuration\n */\nexport function createStorageManager(config?: StorageManagerConfig): StorageManager {\n return new StorageManager(config)\n}\n\n/**\n * Default storage manager instance\n */\nlet defaultManager: StorageManager | null = null\n\n/**\n * Get the default storage manager\n */\nexport function getDefaultStorageManager(): StorageManager {\n if (!defaultManager) {\n defaultManager = createStorageManager()\n }\n return defaultManager\n}\n\n/**\n * Set the default storage manager\n */\nexport function setDefaultStorageManager(manager: StorageManager): void {\n defaultManager = manager\n}\n","/**\n * Storage module\n *\n * Provides storage providers for fetching content from various sources:\n * - Local filesystem (current project)\n * - GitHub repositories\n * - HTTP/HTTPS URLs\n *\n * The storage manager coordinates providers and handles fallback logic.\n *\n * @example\n * ```typescript\n * import { createStorageManager, resolveReference } from '@fractary/codex'\n *\n * const storage = createStorageManager({\n * github: { token: process.env.GITHUB_TOKEN }\n * })\n *\n * const ref = resolveReference('codex://org/project/docs/README.md')\n * if (ref) {\n * const result = await storage.fetch(ref)\n * console.log(result.content.toString())\n * }\n * ```\n */\n\n// Provider interface and types\nexport {\n type StorageProvider,\n type StorageProviderType,\n type StorageProviderConfig,\n type FetchResult,\n type FetchOptions,\n DEFAULT_FETCH_OPTIONS,\n mergeFetchOptions,\n detectContentType,\n} from './provider.js'\n\n// Local storage provider\nexport { LocalStorage, createLocalStorage, type LocalStorageOptions } from './local.js'\n\n// GitHub storage provider\nexport { GitHubStorage, createGitHubStorage, type GitHubStorageOptions } from './github.js'\n\n// HTTP storage provider\nexport { HttpStorage, createHttpStorage, type HttpStorageOptions } from './http.js'\n\n// File plugin storage provider\nexport { FilePluginStorage, type FilePluginStorageOptions } from './file-plugin.js'\n\n// Storage errors\nexport {\n FilePluginFileNotFoundError,\n type FilePluginFileNotFoundErrorOptions,\n} from './errors.js'\n\n// Storage manager\nexport {\n StorageManager,\n createStorageManager,\n getDefaultStorageManager,\n setDefaultStorageManager,\n type StorageManagerConfig,\n} from './manager.js'\n","/**\n * Cache entry types and utilities\n *\n * Defines the structure of cache entries with metadata for\n * TTL management, freshness checking, and content versioning.\n */\n\nimport type { FetchResult } from '../storage/provider.js'\n\n/**\n * Cache entry status\n */\nexport type CacheEntryStatus = 'fresh' | 'stale' | 'expired'\n\n/**\n * Cache entry metadata\n */\nexport interface CacheEntryMetadata {\n /** Original URI */\n uri: string\n /** When the entry was cached */\n cachedAt: number\n /** When the entry expires (timestamp) */\n expiresAt: number\n /** TTL in seconds */\n ttl: number\n /** ETag for conditional requests */\n etag?: string\n /** Last-Modified header value */\n lastModified?: string\n /** Content hash for change detection */\n contentHash: string\n /** Size in bytes */\n size: number\n /** Content type */\n contentType: string\n /** Source provider that fetched the content */\n source: string\n /** Number of times this entry has been accessed */\n accessCount: number\n /** Last access timestamp */\n lastAccessedAt: number\n /** Custom metadata from provider */\n providerMetadata?: Record<string, unknown>\n}\n\n/**\n * Cache entry with content and metadata\n */\nexport interface CacheEntry {\n /** Entry metadata */\n metadata: CacheEntryMetadata\n /** Cached content */\n content: Buffer\n}\n\n/**\n * Serializable cache entry for persistence\n */\nexport interface SerializedCacheEntry {\n /** Entry metadata */\n metadata: CacheEntryMetadata\n /** Content as base64 string */\n content: string\n}\n\n/**\n * Calculate a simple hash for content\n *\n * Uses a fast, non-cryptographic hash suitable for change detection.\n */\nexport function calculateContentHash(content: Buffer): string {\n // Simple FNV-1a hash for speed\n let hash = 2166136261\n for (let i = 0; i < content.length; i++) {\n hash ^= content[i] ?? 0\n hash = Math.imul(hash, 16777619)\n }\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n\n/**\n * Create a new cache entry from fetch result\n */\nexport function createCacheEntry(uri: string, result: FetchResult, ttl: number): CacheEntry {\n const now = Date.now()\n\n const metadata: CacheEntryMetadata = {\n uri,\n cachedAt: now,\n expiresAt: now + ttl * 1000,\n ttl,\n contentHash: calculateContentHash(result.content),\n size: result.size,\n contentType: result.contentType,\n source: result.source,\n accessCount: 1,\n lastAccessedAt: now,\n providerMetadata: result.metadata,\n }\n\n // Extract ETag and Last-Modified from provider metadata if available\n if (result.metadata?.etag && typeof result.metadata.etag === 'string') {\n metadata.etag = result.metadata.etag\n }\n if (result.metadata?.lastModified && typeof result.metadata.lastModified === 'string') {\n metadata.lastModified = result.metadata.lastModified\n }\n\n return {\n metadata,\n content: result.content,\n }\n}\n\n/**\n * Get the status of a cache entry\n */\nexport function getCacheEntryStatus(entry: CacheEntry): CacheEntryStatus {\n const now = Date.now()\n\n if (now < entry.metadata.expiresAt) {\n return 'fresh'\n }\n\n // Consider stale for up to 5 minutes past expiry\n const staleWindow = 5 * 60 * 1000\n if (now < entry.metadata.expiresAt + staleWindow) {\n return 'stale'\n }\n\n return 'expired'\n}\n\n/**\n * Check if entry is still valid (fresh or stale)\n */\nexport function isCacheEntryValid(entry: CacheEntry): boolean {\n const status = getCacheEntryStatus(entry)\n return status === 'fresh' || status === 'stale'\n}\n\n/**\n * Check if entry is fresh (not expired)\n */\nexport function isCacheEntryFresh(entry: CacheEntry): boolean {\n return getCacheEntryStatus(entry) === 'fresh'\n}\n\n/**\n * Update entry access statistics\n */\nexport function touchCacheEntry(entry: CacheEntry): void {\n entry.metadata.accessCount++\n entry.metadata.lastAccessedAt = Date.now()\n}\n\n/**\n * Serialize cache entry for persistence\n */\nexport function serializeCacheEntry(entry: CacheEntry): SerializedCacheEntry {\n return {\n metadata: entry.metadata,\n content: entry.content.toString('base64'),\n }\n}\n\n/**\n * Deserialize cache entry from persistence\n */\nexport function deserializeCacheEntry(serialized: SerializedCacheEntry): CacheEntry {\n return {\n metadata: serialized.metadata,\n content: Buffer.from(serialized.content, 'base64'),\n }\n}\n\n/**\n * Calculate remaining TTL in seconds\n */\nexport function getRemainingTtl(entry: CacheEntry): number {\n const remaining = entry.metadata.expiresAt - Date.now()\n return Math.max(0, Math.floor(remaining / 1000))\n}\n\n/**\n * Check if content has changed based on hash\n */\nexport function hasContentChanged(entry: CacheEntry, newContent: Buffer): boolean {\n return entry.metadata.contentHash !== calculateContentHash(newContent)\n}\n\n/**\n * Get entry age in seconds\n */\nexport function getCacheEntryAge(entry: CacheEntry): number {\n return Math.floor((Date.now() - entry.metadata.cachedAt) / 1000)\n}\n","/**\n * Cache persistence layer\n *\n * Handles reading and writing cache entries to disk with\n * atomic writes and corruption detection.\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { CacheEntry } from './entry.js'\n\n/**\n * Options for cache persistence\n */\nexport interface CachePersistenceOptions {\n /** Base directory for cache storage */\n cacheDir: string\n /** File extension for cache files */\n extension?: string\n /** Whether to use atomic writes */\n atomicWrites?: boolean\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n /** Total number of entries */\n entryCount: number\n /** Total size in bytes */\n totalSize: number\n /** Number of fresh entries */\n freshCount: number\n /** Number of stale entries */\n staleCount: number\n /** Number of expired entries */\n expiredCount: number\n}\n\n/**\n * Cache persistence layer\n *\n * Handles reading and writing cache entries to the filesystem.\n * Uses a directory structure: {cacheDir}/{org}/{project}/{path}.cache\n */\nexport class CachePersistence {\n private cacheDir: string\n private extension: string\n private atomicWrites: boolean\n\n constructor(options: CachePersistenceOptions) {\n this.cacheDir = options.cacheDir\n this.extension = options.extension || '.cache'\n this.atomicWrites = options.atomicWrites ?? true\n }\n\n /**\n * Get the cache file path for a URI\n */\n getCachePath(uri: string): string {\n // Parse the URI to extract org/project/path\n const match = uri.match(/^codex:\\/\\/([^/]+)\\/([^/]+)(?:\\/(.*))?$/)\n if (!match || !match[1] || !match[2]) {\n throw new Error(`Invalid codex URI: ${uri}`)\n }\n\n const [, org, project, filePath] = match\n const relativePath = filePath || 'index'\n\n return path.join(this.cacheDir, org, project, relativePath + this.extension)\n }\n\n /**\n * Get the metadata file path for a URI\n */\n getMetadataPath(uri: string): string {\n return this.getCachePath(uri).replace(this.extension, '.meta.json')\n }\n\n /**\n * Read a cache entry from disk\n */\n async read(uri: string): Promise<CacheEntry | null> {\n const cachePath = this.getCachePath(uri)\n const metadataPath = this.getMetadataPath(uri)\n\n try {\n // Read metadata and content in parallel\n const [metadataJson, content] = await Promise.all([\n fs.readFile(metadataPath, 'utf-8'),\n fs.readFile(cachePath),\n ])\n\n const metadata = JSON.parse(metadataJson)\n return {\n metadata,\n content,\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null\n }\n throw error\n }\n }\n\n /**\n * Write a cache entry to disk\n */\n async write(entry: CacheEntry): Promise<void> {\n const cachePath = this.getCachePath(entry.metadata.uri)\n const metadataPath = this.getMetadataPath(entry.metadata.uri)\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(cachePath), { recursive: true })\n\n if (this.atomicWrites) {\n // Write to temp files first, then rename\n const tempCachePath = cachePath + '.tmp'\n const tempMetadataPath = metadataPath + '.tmp'\n\n try {\n await Promise.all([\n fs.writeFile(tempCachePath, entry.content),\n fs.writeFile(tempMetadataPath, JSON.stringify(entry.metadata, null, 2)),\n ])\n\n await Promise.all([\n fs.rename(tempCachePath, cachePath),\n fs.rename(tempMetadataPath, metadataPath),\n ])\n } catch (error) {\n // Clean up temp files on error\n await Promise.all([\n fs.unlink(tempCachePath).catch(() => {}),\n fs.unlink(tempMetadataPath).catch(() => {}),\n ])\n throw error\n }\n } else {\n await Promise.all([\n fs.writeFile(cachePath, entry.content),\n fs.writeFile(metadataPath, JSON.stringify(entry.metadata, null, 2)),\n ])\n }\n }\n\n /**\n * Delete a cache entry\n */\n async delete(uri: string): Promise<boolean> {\n const cachePath = this.getCachePath(uri)\n const metadataPath = this.getMetadataPath(uri)\n\n try {\n await Promise.all([fs.unlink(cachePath), fs.unlink(metadataPath)])\n return true\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return false\n }\n throw error\n }\n }\n\n /**\n * Check if a cache entry exists\n */\n async exists(uri: string): Promise<boolean> {\n const cachePath = this.getCachePath(uri)\n\n try {\n await fs.access(cachePath)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * List all cached URIs\n */\n async list(): Promise<string[]> {\n const uris: string[] = []\n\n try {\n const orgs = await fs.readdir(this.cacheDir)\n\n for (const org of orgs) {\n const orgPath = path.join(this.cacheDir, org)\n const orgStat = await fs.stat(orgPath)\n if (!orgStat.isDirectory()) continue\n\n const projects = await fs.readdir(orgPath)\n\n for (const project of projects) {\n const projectPath = path.join(orgPath, project)\n const projectStat = await fs.stat(projectPath)\n if (!projectStat.isDirectory()) continue\n\n // Recursively find all cache files\n const files = await this.listFilesRecursive(projectPath)\n\n for (const file of files) {\n if (file.endsWith(this.extension)) {\n // Convert path back to URI\n const relativePath = path.relative(projectPath, file)\n const filePath = relativePath.slice(0, -this.extension.length)\n uris.push(`codex://${org}/${project}/${filePath}`)\n }\n }\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return []\n }\n throw error\n }\n\n return uris\n }\n\n /**\n * Recursively list files in a directory\n */\n private async listFilesRecursive(dir: string): Promise<string[]> {\n const files: string[] = []\n const entries = await fs.readdir(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n files.push(...(await this.listFilesRecursive(fullPath)))\n } else if (entry.isFile()) {\n files.push(fullPath)\n }\n }\n\n return files\n }\n\n /**\n * Clear all cache entries\n */\n async clear(): Promise<number> {\n let count = 0\n\n try {\n const orgs = await fs.readdir(this.cacheDir)\n\n for (const org of orgs) {\n const orgPath = path.join(this.cacheDir, org)\n const stat = await fs.stat(orgPath)\n if (stat.isDirectory()) {\n await fs.rm(orgPath, { recursive: true })\n count++\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error\n }\n }\n\n return count\n }\n\n /**\n * Clear expired entries\n */\n async clearExpired(): Promise<number> {\n const uris = await this.list()\n let cleared = 0\n\n for (const uri of uris) {\n const entry = await this.read(uri)\n if (entry && entry.metadata.expiresAt < Date.now()) {\n if (await this.delete(uri)) {\n cleared++\n }\n }\n }\n\n return cleared\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats> {\n const stats: CacheStats = {\n entryCount: 0,\n totalSize: 0,\n freshCount: 0,\n staleCount: 0,\n expiredCount: 0,\n }\n\n const uris = await this.list()\n const now = Date.now()\n const staleWindow = 5 * 60 * 1000\n\n for (const uri of uris) {\n const entry = await this.read(uri)\n if (entry) {\n stats.entryCount++\n stats.totalSize += entry.metadata.size\n\n if (now < entry.metadata.expiresAt) {\n stats.freshCount++\n } else if (now < entry.metadata.expiresAt + staleWindow) {\n stats.staleCount++\n } else {\n stats.expiredCount++\n }\n }\n }\n\n return stats\n }\n\n /**\n * Ensure cache directory exists\n */\n async ensureDir(): Promise<void> {\n await fs.mkdir(this.cacheDir, { recursive: true })\n }\n\n /**\n * Get cache directory path\n */\n getCacheDir(): string {\n return this.cacheDir\n }\n}\n\n/**\n * Create a cache persistence layer\n */\nexport function createCachePersistence(options: CachePersistenceOptions): CachePersistence {\n return new CachePersistence(options)\n}\n","/**\n * Cache manager\n *\n * Multi-tier cache manager that coordinates in-memory caching,\n * disk persistence, and storage providers for optimal performance.\n *\n * Memory Limitations:\n * - listEntries() loads all URIs into memory before processing\n * - Recommended for caches under 10,000 entries for optimal performance\n * - For very large caches, consider using listUris() with pagination logic\n */\n\n// ===== Constants =====\n\n/** Time window (ms) after expiry during which entries are considered stale vs expired */\nexport const STALE_WINDOW_MS = 5 * 60 * 1000 // 5 minutes\n\n/** Default batch size for parallel lookups */\nconst PARALLEL_LOOKUP_BATCH_SIZE = 50\n\nimport type { ResolvedReference } from '../references/index.js'\nimport type { StorageManager } from '../storage/manager.js'\nimport type { FetchOptions, FetchResult } from '../storage/provider.js'\nimport {\n type CacheEntry,\n type CacheEntryMetadata,\n createCacheEntry,\n getCacheEntryStatus,\n touchCacheEntry,\n isCacheEntryFresh,\n getRemainingTtl,\n} from './entry.js'\nimport { type CachePersistence, type CacheStats, createCachePersistence } from './persistence.js'\n\n/**\n * Cache manager configuration\n */\nexport interface CacheManagerConfig {\n /** Cache directory path */\n cacheDir: string\n /** Default TTL in seconds */\n defaultTtl?: number\n /** Maximum entries in memory cache */\n maxMemoryEntries?: number\n /** Maximum memory cache size in bytes */\n maxMemorySize?: number\n /** Whether to persist cache to disk */\n enablePersistence?: boolean\n /** Whether to use stale-while-revalidate pattern */\n staleWhileRevalidate?: boolean\n /** Background refresh threshold (seconds before expiry) */\n backgroundRefreshThreshold?: number\n}\n\n/**\n * Cache lookup result\n */\nexport interface CacheLookupResult {\n /** Cache entry if found */\n entry: CacheEntry | null\n /** Whether the entry was found */\n hit: boolean\n /** Whether the entry is fresh */\n fresh: boolean\n /** Source of the entry (memory, disk, network) */\n source: 'memory' | 'disk' | 'network' | 'none'\n}\n\n/**\n * Cache entry listing information\n */\nexport interface CacheEntryInfo {\n /** URI of the cached content */\n uri: string\n /** Content type (MIME type) */\n contentType: string\n /** Size in bytes */\n size: number\n /** Status: fresh, stale, or expired */\n status: 'fresh' | 'stale' | 'expired'\n /** When the entry was created */\n createdAt: number\n /** When the entry expires */\n expiresAt: number\n /** Remaining TTL in seconds (negative if expired) */\n remainingTtl: number\n /** Whether entry is in memory cache */\n inMemory: boolean\n}\n\n/**\n * Options for listing cache entries\n */\nexport interface ListEntriesOptions {\n /** Filter by status */\n status?: 'fresh' | 'stale' | 'expired' | 'all'\n /** Maximum number of entries to return */\n limit?: number\n /** Number of entries to skip (for pagination) */\n offset?: number\n /** Sort order */\n sortBy?: 'uri' | 'size' | 'createdAt' | 'expiresAt'\n /** Sort direction */\n sortDirection?: 'asc' | 'desc'\n}\n\n/**\n * Result of listing cache entries\n */\nexport interface ListEntriesResult {\n /** List of cache entries */\n entries: CacheEntryInfo[]\n /** Total number of entries (before pagination) */\n total: number\n /** Whether there are more entries */\n hasMore: boolean\n}\n\n/**\n * Cache manager\n *\n * Provides a multi-tier caching system with:\n * - L1: In-memory cache (fast, limited size)\n * - L2: Disk persistence (larger, survives restarts)\n * - L3: Storage providers (network fetch)\n */\nexport class CacheManager {\n private memoryCache: Map<string, CacheEntry> = new Map()\n private persistence: CachePersistence | null\n private storage: StorageManager | null = null\n private config: Required<CacheManagerConfig>\n\n // LRU tracking\n private accessOrder: string[] = []\n\n // Background refresh tracking\n private refreshPromises: Map<string, Promise<CacheEntry | null>> = new Map()\n\n constructor(config: CacheManagerConfig) {\n this.config = {\n cacheDir: config.cacheDir,\n defaultTtl: config.defaultTtl ?? 3600, // 1 hour default\n maxMemoryEntries: config.maxMemoryEntries ?? 1000,\n maxMemorySize: config.maxMemorySize ?? 50 * 1024 * 1024, // 50MB\n enablePersistence: config.enablePersistence ?? true,\n staleWhileRevalidate: config.staleWhileRevalidate ?? true,\n backgroundRefreshThreshold: config.backgroundRefreshThreshold ?? 60, // 1 minute\n }\n\n this.persistence = this.config.enablePersistence\n ? createCachePersistence({ cacheDir: this.config.cacheDir })\n : null\n }\n\n /**\n * Set the storage manager for fetching\n */\n setStorageManager(storage: StorageManager): void {\n this.storage = storage\n }\n\n /**\n * Get content for a reference\n *\n * Implements cache-first strategy with stale-while-revalidate.\n *\n * EXCEPTION: File plugin sources (current project files) bypass cache entirely.\n * They are always read fresh from disk for optimal development experience.\n */\n async get(\n reference: ResolvedReference,\n options?: FetchOptions & { ttl?: number }\n ): Promise<FetchResult> {\n // Bypass cache for current project file plugin sources\n // These are read directly from disk for freshness\n if (reference.isCurrentProject && reference.sourceType === 'file-plugin') {\n if (!this.storage) {\n throw new Error('Storage manager not set')\n }\n return await this.storage.fetch(reference, options)\n }\n\n const ttl = options?.ttl ?? this.config.defaultTtl\n\n // Check memory cache\n let entry = this.memoryCache.get(reference.uri)\n\n // Check disk cache if not in memory\n if (!entry && this.persistence) {\n entry = await this.persistence.read(reference.uri) ?? undefined\n if (entry) {\n // Promote to memory cache\n this.setMemoryEntry(reference.uri, entry)\n }\n }\n\n if (entry) {\n const status = getCacheEntryStatus(entry)\n\n if (status === 'fresh') {\n touchCacheEntry(entry)\n return this.entryToResult(entry)\n }\n\n if (status === 'stale' && this.config.staleWhileRevalidate) {\n // Return stale content immediately\n touchCacheEntry(entry)\n const result = this.entryToResult(entry)\n\n // Trigger background refresh\n this.backgroundRefresh(reference, ttl, options)\n\n return result\n }\n }\n\n // Fetch from storage\n return this.fetchAndCache(reference, ttl, options)\n }\n\n /**\n * Check if content is cached\n */\n async has(uri: string): Promise<boolean> {\n if (this.memoryCache.has(uri)) {\n return true\n }\n\n if (this.persistence) {\n return this.persistence.exists(uri)\n }\n\n return false\n }\n\n /**\n * Get cache entry without fetching\n */\n async lookup(uri: string): Promise<CacheLookupResult> {\n // Check memory cache\n let entry = this.memoryCache.get(uri)\n if (entry) {\n return {\n entry,\n hit: true,\n fresh: isCacheEntryFresh(entry),\n source: 'memory',\n }\n }\n\n // Check disk cache\n if (this.persistence) {\n entry = await this.persistence.read(uri) ?? undefined\n if (entry) {\n this.setMemoryEntry(uri, entry)\n return {\n entry,\n hit: true,\n fresh: isCacheEntryFresh(entry),\n source: 'disk',\n }\n }\n }\n\n return {\n entry: null,\n hit: false,\n fresh: false,\n source: 'none',\n }\n }\n\n /**\n * Store content in cache\n */\n async set(uri: string, result: FetchResult, ttl?: number): Promise<CacheEntry> {\n const actualTtl = ttl ?? this.config.defaultTtl\n const entry = createCacheEntry(uri, result, actualTtl)\n\n // Store in memory\n this.setMemoryEntry(uri, entry)\n\n // Persist to disk\n if (this.persistence) {\n await this.persistence.write(entry)\n }\n\n return entry\n }\n\n /**\n * Invalidate a cache entry\n */\n async invalidate(uri: string): Promise<boolean> {\n let removed = false\n\n if (this.memoryCache.has(uri)) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n removed = true\n }\n\n if (this.persistence) {\n const diskRemoved = await this.persistence.delete(uri)\n removed = removed || diskRemoved\n }\n\n return removed\n }\n\n /**\n * Invalidate all entries matching a pattern\n */\n async invalidatePattern(pattern: RegExp): Promise<number> {\n let count = 0\n\n // Memory cache\n for (const uri of this.memoryCache.keys()) {\n if (pattern.test(uri)) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n count++\n }\n }\n\n // Disk cache\n if (this.persistence) {\n const uris = await this.persistence.list()\n for (const uri of uris) {\n if (pattern.test(uri)) {\n await this.persistence.delete(uri)\n count++\n }\n }\n }\n\n return count\n }\n\n /**\n * Clear all cache entries\n */\n async clear(): Promise<void> {\n this.memoryCache.clear()\n this.accessOrder = []\n\n if (this.persistence) {\n await this.persistence.clear()\n }\n }\n\n /**\n * Clear expired entries\n */\n async clearExpired(): Promise<number> {\n let count = 0\n const now = Date.now()\n\n // Memory cache\n for (const [uri, entry] of this.memoryCache) {\n if (entry.metadata.expiresAt < now) {\n this.memoryCache.delete(uri)\n this.removeFromAccessOrder(uri)\n count++\n }\n }\n\n // Disk cache\n if (this.persistence) {\n count += await this.persistence.clearExpired()\n }\n\n return count\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats & { memoryEntries: number; memorySize: number }> {\n let diskStats: CacheStats = {\n entryCount: 0,\n totalSize: 0,\n freshCount: 0,\n staleCount: 0,\n expiredCount: 0,\n }\n\n if (this.persistence) {\n diskStats = await this.persistence.getStats()\n }\n\n // Calculate memory stats\n let memorySize = 0\n for (const entry of this.memoryCache.values()) {\n memorySize += entry.metadata.size\n }\n\n return {\n ...diskStats,\n memoryEntries: this.memoryCache.size,\n memorySize,\n }\n }\n\n /**\n * Preload content into cache\n */\n async preload(references: ResolvedReference[], options?: FetchOptions): Promise<void> {\n if (!this.storage) {\n throw new Error('Storage manager not set')\n }\n\n await Promise.all(\n references.map(async (ref) => {\n try {\n await this.get(ref, options)\n } catch {\n // Ignore preload errors\n }\n })\n )\n }\n\n /**\n * Get metadata for a cached entry\n */\n async getMetadata(uri: string): Promise<CacheEntryMetadata | null> {\n const result = await this.lookup(uri)\n return result.entry?.metadata ?? null\n }\n\n /**\n * Get remaining TTL for an entry\n */\n async getTtl(uri: string): Promise<number | null> {\n const result = await this.lookup(uri)\n if (result.entry) {\n return getRemainingTtl(result.entry)\n }\n return null\n }\n\n /**\n * List all cache entries with detailed information\n *\n * Provides comprehensive information about each cached entry\n * with support for filtering, pagination, and sorting.\n */\n async listEntries(options: ListEntriesOptions = {}): Promise<ListEntriesResult> {\n const {\n status = 'all',\n limit,\n offset = 0,\n sortBy = 'uri',\n sortDirection = 'asc',\n } = options\n\n const entries: CacheEntryInfo[] = []\n const now = Date.now()\n\n // Get all URIs from persistence\n const uris = this.persistence ? await this.persistence.list() : []\n\n // Also include memory-only entries\n const memoryOnlyUris = Array.from(this.memoryCache.keys()).filter(\n (uri) => !uris.includes(uri)\n )\n const allUris = [...uris, ...memoryOnlyUris]\n\n // Process entries in parallel batches for better performance\n // This is much faster than sequential processing for large caches\n for (let i = 0; i < allUris.length; i += PARALLEL_LOOKUP_BATCH_SIZE) {\n const batch = allUris.slice(i, i + PARALLEL_LOOKUP_BATCH_SIZE)\n const lookupPromises = batch.map((uri) => this.lookup(uri).then((result) => ({ uri, result })))\n const lookupResults = await Promise.all(lookupPromises)\n\n for (const { uri, result: lookupResult } of lookupResults) {\n if (!lookupResult.entry) continue\n\n const entry = lookupResult.entry\n const expiresAt = entry.metadata.expiresAt\n const remainingTtl = Math.floor((expiresAt - now) / 1000)\n\n let entryStatus: 'fresh' | 'stale' | 'expired'\n if (now < expiresAt) {\n entryStatus = 'fresh'\n } else if (now < expiresAt + STALE_WINDOW_MS) {\n entryStatus = 'stale'\n } else {\n entryStatus = 'expired'\n }\n\n // Filter by status\n if (status !== 'all' && entryStatus !== status) {\n continue\n }\n\n entries.push({\n uri,\n contentType: entry.metadata.contentType,\n size: entry.metadata.size,\n status: entryStatus,\n createdAt: entry.metadata.cachedAt,\n expiresAt,\n remainingTtl,\n inMemory: this.memoryCache.has(uri),\n })\n }\n }\n\n // Sort entries\n entries.sort((a, b) => {\n let comparison = 0\n switch (sortBy) {\n case 'uri':\n comparison = a.uri.localeCompare(b.uri)\n break\n case 'size':\n comparison = a.size - b.size\n break\n case 'createdAt':\n comparison = a.createdAt - b.createdAt\n break\n case 'expiresAt':\n comparison = a.expiresAt - b.expiresAt\n break\n }\n return sortDirection === 'asc' ? comparison : -comparison\n })\n\n const total = entries.length\n\n // Apply pagination\n const paginatedEntries = limit\n ? entries.slice(offset, offset + limit)\n : entries.slice(offset)\n\n return {\n entries: paginatedEntries,\n total,\n hasMore: limit ? offset + limit < total : false,\n }\n }\n\n /**\n * List all cached URIs\n *\n * Simple method to get just the URIs without detailed information.\n */\n async listUris(): Promise<string[]> {\n const uris = this.persistence ? await this.persistence.list() : []\n\n // Also include memory-only entries\n const memoryOnlyUris = Array.from(this.memoryCache.keys()).filter(\n (uri) => !uris.includes(uri)\n )\n\n return [...uris, ...memoryOnlyUris]\n }\n\n /**\n * Fetch content and store in cache\n *\n * EXCEPTION: File plugin sources are not cached (should not reach here,\n * but added as safety check).\n */\n private async fetchAndCache(\n reference: ResolvedReference,\n ttl: number,\n options?: FetchOptions\n ): Promise<FetchResult> {\n if (!this.storage) {\n throw new Error('Storage manager not set')\n }\n\n const result = await this.storage.fetch(reference, options)\n\n // Don't cache current project file plugin sources\n // They should always be read fresh from disk\n if (!(reference.isCurrentProject && reference.sourceType === 'file-plugin')) {\n await this.set(reference.uri, result, ttl)\n }\n\n return result\n }\n\n /**\n * Background refresh for stale-while-revalidate\n */\n private backgroundRefresh(\n reference: ResolvedReference,\n ttl: number,\n options?: FetchOptions\n ): void {\n const uri = reference.uri\n\n // Don't start multiple refreshes for the same URI\n if (this.refreshPromises.has(uri)) {\n return\n }\n\n const promise = this.fetchAndCache(reference, ttl, options)\n .then(() => {\n const entry = this.memoryCache.get(uri)\n return entry ?? null\n })\n .catch(() => null)\n .finally(() => {\n this.refreshPromises.delete(uri)\n })\n\n this.refreshPromises.set(uri, promise)\n }\n\n /**\n * Set entry in memory cache with LRU eviction\n */\n private setMemoryEntry(uri: string, entry: CacheEntry): void {\n // Remove from current position in access order\n this.removeFromAccessOrder(uri)\n\n // Add to end (most recently used)\n this.accessOrder.push(uri)\n this.memoryCache.set(uri, entry)\n\n // Evict if necessary\n this.evictIfNeeded()\n }\n\n /**\n * Evict entries if over limits\n */\n private evictIfNeeded(): void {\n // Check entry count\n while (this.memoryCache.size > this.config.maxMemoryEntries) {\n this.evictOldest()\n }\n\n // Check memory size\n let totalSize = 0\n for (const entry of this.memoryCache.values()) {\n totalSize += entry.metadata.size\n }\n\n while (totalSize > this.config.maxMemorySize && this.memoryCache.size > 0) {\n const evicted = this.evictOldest()\n if (evicted) {\n totalSize -= evicted.metadata.size\n } else {\n break\n }\n }\n }\n\n /**\n * Evict the oldest entry (LRU)\n */\n private evictOldest(): CacheEntry | null {\n if (this.accessOrder.length === 0) {\n return null\n }\n\n const oldest = this.accessOrder.shift()\n if (oldest) {\n const entry = this.memoryCache.get(oldest)\n this.memoryCache.delete(oldest)\n return entry ?? null\n }\n\n return null\n }\n\n /**\n * Remove URI from access order\n */\n private removeFromAccessOrder(uri: string): void {\n const index = this.accessOrder.indexOf(uri)\n if (index !== -1) {\n this.accessOrder.splice(index, 1)\n }\n }\n\n /**\n * Convert cache entry to fetch result\n */\n private entryToResult(entry: CacheEntry): FetchResult {\n return {\n content: entry.content,\n contentType: entry.metadata.contentType,\n size: entry.metadata.size,\n source: entry.metadata.source,\n metadata: entry.metadata.providerMetadata,\n }\n }\n}\n\n/**\n * Create a cache manager\n */\nexport function createCacheManager(config: CacheManagerConfig): CacheManager {\n return new CacheManager(config)\n}\n\n/**\n * Default cache manager instance\n */\nlet defaultCacheManager: CacheManager | null = null\n\n/**\n * Get the default cache manager\n */\nexport function getDefaultCacheManager(): CacheManager {\n if (!defaultCacheManager) {\n defaultCacheManager = createCacheManager({\n cacheDir: '.fractary/plugins/codex/cache',\n })\n }\n return defaultCacheManager\n}\n\n/**\n * Set the default cache manager\n */\nexport function setDefaultCacheManager(manager: CacheManager): void {\n defaultCacheManager = manager\n}\n","/**\n * Pattern matching for directional sync (to-codex / from-codex)\n *\n * Provides functions to evaluate if files should sync based on directional\n * sync configuration patterns.\n *\n * URI Format: codex://org/project/path\n * - org: Organization name (e.g., \"fractary\")\n * - project: Project name (e.g., \"etl.corthion.ai\")\n * - path: File path within project (e.g., \"docs/**\")\n *\n * Supported placeholders:\n * - {org}: Resolves to configured organization\n * - {project}: Resolves to target project name\n * - {codex_repo}: Resolves to codex repository name (e.g., \"codex.fractary.com\")\n */\n\nimport { matchPattern } from '../core/patterns/matcher.js'\n\n/** Codex URI prefix */\nconst CODEX_URI_PREFIX = 'codex://'\n\n/**\n * Check if a local file path matches to_codex patterns\n *\n * Used when syncing TO codex to determine which local files should be pushed.\n */\nexport function matchToCodexPattern(filePath: string, patterns: string[]): boolean {\n if (!patterns || patterns.length === 0) {\n return false\n }\n\n return patterns.some((pattern) => matchPattern(pattern, filePath))\n}\n\n/**\n * Options for from_codex pattern matching\n */\nexport interface FromCodexMatchOptions {\n /** Organization name for {org} placeholder */\n org?: string\n /** Codex repository name for {codex_repo} placeholder */\n codexRepo?: string\n}\n\n/**\n * Check if a codex file path matches from_codex patterns\n *\n * Used when syncing FROM codex to determine which codex files should be pulled.\n *\n * Supports four pattern formats:\n * 1. codex://org/project/path - Full codex URI (recommended)\n * 2. \"projects/project/path/pattern\" - Direct projects/ path match\n * 3. \"project-name/path/pattern\" - Legacy bare path format\n * 4. \"path/pattern\" - Legacy format, matches files from target project\n *\n * @param codexFilePath - File path in codex repo (e.g., \"projects/etl.corthion.ai/docs/file.md\")\n * @param patterns - Array of patterns to match against\n * @param targetProject - Target project name for implicit patterns\n * @param options - Optional org and codexRepo for placeholder expansion\n */\nexport function matchFromCodexPattern(\n codexFilePath: string,\n patterns: string[],\n targetProject: string,\n options?: FromCodexMatchOptions\n): boolean {\n if (!patterns || patterns.length === 0) {\n return false\n }\n\n return patterns.some((pattern) => {\n // Handle codex:// URI format (recommended)\n if (pattern.startsWith(CODEX_URI_PREFIX)) {\n return matchCodexUri(pattern, codexFilePath, targetProject, options)\n }\n\n // Legacy support: patterns starting with \"projects/\" match directly\n if (pattern.startsWith('projects/')) {\n return matchPattern(pattern, codexFilePath)\n }\n\n // Legacy support: bare path patterns\n // These patterns work with both flat and projects/ codex structures\n // Check if pattern includes a project prefix\n // Project names contain dots (e.g., \"etl.corthion.ai\")\n // Path segments don't (e.g., \"docs\")\n const projectSeparatorIndex = pattern.indexOf('/')\n\n if (projectSeparatorIndex === -1) {\n // No slash - pattern applies to target project only\n const fullPattern = `${targetProject}/${pattern}`\n return matchPattern(fullPattern, codexFilePath)\n }\n\n // Extract first segment before slash\n const firstSegment = pattern.substring(0, projectSeparatorIndex)\n\n // Check if first segment looks like a project name (contains dots)\n if (firstSegment.includes('.')) {\n // Has dots - likely a project name, match directly\n return matchPattern(pattern, codexFilePath)\n } else {\n // No dots - likely a path segment, prepend target project\n const fullPattern = `${targetProject}/${pattern}`\n return matchPattern(fullPattern, codexFilePath)\n }\n })\n}\n\n/**\n * Parse and match a codex:// URI pattern against a file path\n *\n * URI format: codex://org/project/path\n * Maps to codex repo structure: projects/{project}/path\n *\n * @param uriPattern - The codex:// URI pattern (e.g., \"codex://fractary/etl.corthion.ai/docs/**\")\n * @param codexFilePath - File path in codex repo (e.g., \"projects/etl.corthion.ai/docs/file.md\")\n * @param targetProject - Target project name for {project} placeholder\n * @param options - Optional org and codexRepo for placeholder expansion\n */\nfunction matchCodexUri(\n uriPattern: string,\n codexFilePath: string,\n targetProject: string,\n options?: FromCodexMatchOptions\n): boolean {\n // Parse: codex://org/project/path\n let withoutPrefix = uriPattern.slice(CODEX_URI_PREFIX.length)\n\n // Expand placeholders BEFORE parsing\n withoutPrefix = withoutPrefix\n .replace(/{org}/g, options?.org || '')\n .replace(/{project}/g, targetProject)\n .replace(/{codex_repo}/g, options?.codexRepo || '')\n\n const parts = withoutPrefix.split('/')\n\n // Need at least org and project\n if (parts.length < 2) {\n return false\n }\n\n // org is parts[0] - we don't use it for matching (org is for cache path namespacing)\n const project = parts[1]\n const pathPattern = parts.slice(2).join('/')\n\n // Skip if project is empty (e.g., placeholder wasn't expanded)\n if (!project) {\n return false\n }\n\n // Match against codex repo structure: projects/{project}/path\n const fullPattern = pathPattern\n ? `projects/${project}/${pathPattern}`\n : `projects/${project}/**`\n\n return matchPattern(fullPattern, codexFilePath)\n}\n\n/**\n * Extract project name from codex file path\n */\nexport function extractProjectFromCodexPath(codexFilePath: string): string | null {\n const firstSlashIndex = codexFilePath.indexOf('/')\n if (firstSlashIndex === -1) {\n return null\n }\n return codexFilePath.substring(0, firstSlashIndex)\n}\n\n/**\n * Get relative path within project from codex file path\n */\nexport function getRelativePath(codexFilePath: string): string | null {\n const firstSlashIndex = codexFilePath.indexOf('/')\n if (firstSlashIndex === -1) {\n return null\n }\n return codexFilePath.substring(firstSlashIndex + 1)\n}\n\n/**\n * Options for placeholder expansion\n */\nexport interface ExpandPlaceholderOptions {\n /** Organization name for {org} placeholder */\n org?: string\n /** Codex repository name for {codex_repo} placeholder */\n codexRepo?: string\n}\n\n/**\n * Expand placeholders in patterns\n *\n * Supported placeholders:\n * - {project}: Target project name\n * - {org}: Organization name\n * - {codex_repo}: Codex repository name\n *\n * @param patterns - Array of patterns to expand\n * @param targetProject - Target project name for {project} placeholder\n * @param options - Optional org and codexRepo for additional placeholders\n */\nexport function expandPlaceholders(\n patterns: string[] | undefined,\n targetProject: string,\n options?: ExpandPlaceholderOptions\n): string[] | undefined {\n if (!patterns) {\n return patterns\n }\n\n return patterns.map((pattern) => {\n let expanded = pattern.replace(/{project}/g, targetProject)\n\n if (options?.org) {\n expanded = expanded.replace(/{org}/g, options.org)\n }\n\n if (options?.codexRepo) {\n expanded = expanded.replace(/{codex_repo}/g, options.codexRepo)\n }\n\n return expanded\n })\n}\n","/**\n * Environment Variable Utilities\n *\n * Provides functions for expanding environment variables in configuration values.\n * Supports ${VAR_NAME} syntax.\n */\n\n/**\n * Options for environment variable expansion\n */\nexport interface ExpandEnvOptions {\n /**\n * Environment variables to use (default: process.env)\n */\n env?: Record<string, string | undefined>\n\n /**\n * Whether to warn about missing variables (default: false)\n */\n warnOnMissing?: boolean\n\n /**\n * Callback for missing variables\n */\n onMissing?: (varName: string) => void\n}\n\n/**\n * Expand environment variables in a string value\n *\n * Supports ${VAR_NAME} syntax. If a variable is not found,\n * the original placeholder is preserved.\n *\n * @example\n * ```typescript\n * expandEnvVars('Hello ${USER}')\n * // => 'Hello alice' (if USER=alice)\n *\n * expandEnvVars('Token: ${GITHUB_TOKEN}')\n * // => 'Token: ${GITHUB_TOKEN}' (if GITHUB_TOKEN not set)\n * ```\n */\nexport function expandEnvVars(\n value: string,\n options: ExpandEnvOptions = {}\n): string {\n const env = options.env ?? process.env\n\n return value.replace(/\\$\\{([^}]+)\\}/g, (match, varName: string) => {\n const envValue = env[varName]\n\n if (envValue === undefined) {\n if (options.warnOnMissing) {\n console.warn(`Warning: Environment variable ${varName} is not set`)\n }\n if (options.onMissing) {\n options.onMissing(varName)\n }\n // Keep original if not found\n return match\n }\n\n return envValue\n })\n}\n\n/**\n * Recursively expand environment variables in a configuration object\n *\n * Walks through all string values in the object and expands ${VAR_NAME}\n * placeholders using environment variables.\n *\n * @example\n * ```typescript\n * const config = {\n * token: '${GITHUB_TOKEN}',\n * nested: {\n * url: '${API_URL}/v1'\n * },\n * items: ['${ITEM_1}', '${ITEM_2}']\n * }\n *\n * expandEnvVarsInConfig(config)\n * // Expands all ${...} placeholders in string values\n * ```\n */\nexport function expandEnvVarsInConfig<T>(\n config: T,\n options: ExpandEnvOptions = {}\n): T {\n if (typeof config === 'string') {\n return expandEnvVars(config, options) as T\n }\n\n if (Array.isArray(config)) {\n return config.map((item) => expandEnvVarsInConfig(item, options)) as T\n }\n\n if (config !== null && typeof config === 'object') {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(config)) {\n result[key] = expandEnvVarsInConfig(value, options)\n }\n return result as T\n }\n\n return config\n}\n\n/**\n * Check if a string contains environment variable placeholders\n */\nexport function hasEnvVars(value: string): boolean {\n return /\\$\\{[^}]+\\}/.test(value)\n}\n\n/**\n * Extract environment variable names from a string\n *\n * @example\n * ```typescript\n * extractEnvVarNames('${USER}@${HOST}:${PORT}')\n * // => ['USER', 'HOST', 'PORT']\n * ```\n */\nexport function extractEnvVarNames(value: string): string[] {\n const matches = value.matchAll(/\\$\\{([^}]+)\\}/g)\n const names: string[] = []\n for (const match of matches) {\n if (match[1]) {\n names.push(match[1])\n }\n }\n return names\n}\n","/**\n * YAML Configuration Utilities\n *\n * Provides functions for reading and parsing YAML configuration files,\n * with support for the unified config format.\n */\n\nimport * as fs from 'fs/promises'\nimport * as yaml from 'js-yaml'\nimport { expandEnvVarsInConfig, type ExpandEnvOptions } from '../env/index.js'\n\n/**\n * Storage provider type\n */\nexport type StorageProviderType = 'local' | 'github' | 'http' | 's3'\n\n/**\n * Local filesystem storage configuration\n */\nexport interface LocalStorageConfig {\n type: 'local'\n basePath: string\n followSymlinks?: boolean\n priority?: number\n}\n\n/**\n * GitHub storage configuration\n */\nexport interface GitHubStorageConfig {\n type: 'github'\n token?: string\n apiBaseUrl?: string\n rawBaseUrl?: string\n branch?: string\n priority?: number\n}\n\n/**\n * HTTP storage configuration\n */\nexport interface HttpStorageConfig {\n type: 'http'\n baseUrl: string\n headers?: Record<string, string>\n timeout?: number\n priority?: number\n}\n\n/**\n * S3 storage configuration\n */\nexport interface S3StorageConfig {\n type: 's3'\n bucket: string\n region?: string\n accessKeyId?: string\n secretAccessKey?: string\n priority?: number\n}\n\n/**\n * Union type for all storage providers\n */\nexport type StorageProviderConfig =\n | LocalStorageConfig\n | GitHubStorageConfig\n | HttpStorageConfig\n | S3StorageConfig\n\n/**\n * Cache configuration\n *\n * Note: Both `directory` and `cacheDir` are supported for backward compatibility.\n * - `cacheDir` is the preferred field name (matches CLI and top-level config)\n * - `directory` is the legacy field name (used in older cache-specific configs)\n * When both are present, `cacheDir` takes precedence.\n */\nexport interface CacheConfig {\n /** @deprecated Use cacheDir instead. Legacy field for backward compatibility. */\n directory?: string\n /** Directory for storing cache files (preferred) */\n cacheDir?: string\n /** Default TTL in seconds for cached entries */\n defaultTtl?: number\n /** Maximum total size of cache in bytes */\n maxSize?: number\n /** Maximum number of entries in memory cache */\n maxMemoryEntries?: number\n /** Maximum size of memory cache in bytes */\n maxMemorySize?: number\n /** Whether to persist cache to disk */\n enablePersistence?: boolean\n}\n\n/**\n * Custom artifact type definition\n */\nexport interface CustomTypeConfig {\n description?: string\n patterns?: string[]\n defaultTtl?: number\n archiveAfterDays?: number | null\n archiveStorage?: 'local' | 'cloud' | 'drive' | null\n}\n\n/**\n * Types configuration\n */\nexport interface TypesConfig {\n custom?: Record<string, CustomTypeConfig>\n}\n\n/**\n * Permission level\n */\nexport type PermissionLevel = 'none' | 'read' | 'write' | 'admin'\n\n/**\n * Permission rule\n */\nexport interface PermissionRule {\n pattern: string\n permission: PermissionLevel\n users?: string[]\n}\n\n/**\n * Permissions configuration\n */\nexport interface PermissionsConfig {\n default?: PermissionLevel\n rules?: PermissionRule[]\n}\n\n/**\n * Directional sync configuration\n */\nexport interface DirectionalSyncConfig {\n include: string[]\n exclude?: string[]\n}\n\n/**\n * Sync rule\n */\nexport interface SyncRule {\n pattern: string\n direction?: 'to-codex' | 'from-codex' | 'bidirectional'\n}\n\n/**\n * Sync configuration\n */\nexport interface SyncConfig {\n bidirectional?: boolean\n conflictResolution?: 'prompt' | 'local' | 'remote' | 'newest' | 'skip'\n exclude?: string[]\n rules?: SyncRule[]\n to_codex?: DirectionalSyncConfig\n from_codex?: DirectionalSyncConfig\n default_to_codex?: string[]\n default_from_codex?: string[]\n environments?: Record<string, string>\n}\n\n/**\n * MCP server configuration\n */\nexport interface McpConfig {\n enabled?: boolean\n port?: number\n}\n\n/**\n * Project archive configuration\n */\nexport interface ProjectArchiveConfig {\n /** S3 bucket for archived files */\n bucket?: string\n /** S3 prefix/path for archived files */\n prefix?: string\n /** Storage class (STANDARD, GLACIER, etc.) */\n storageClass?: string\n}\n\n/**\n * Archive configuration\n *\n * Configures S3-based archival for project artifacts.\n */\nexport interface ArchiveConfig {\n /** Per-project archive settings */\n projects?: Record<string, ProjectArchiveConfig>\n}\n\n/**\n * File plugin configuration\n */\nexport interface FileConfig {\n sources?: Array<{\n name: string\n path: string\n type?: string\n }>\n}\n\n/**\n * Codex YAML configuration (unified format)\n *\n * This is the format for the codex: section in .fractary/config.yaml\n */\nexport interface CodexYamlConfig {\n organization: string\n project?: string\n codex_repo?: string\n cacheDir?: string\n cache?: CacheConfig\n storage?: StorageProviderConfig[]\n types?: TypesConfig\n permissions?: PermissionsConfig\n sync?: SyncConfig\n mcp?: McpConfig\n archive?: ArchiveConfig\n}\n\n/**\n * Unified configuration file format\n *\n * Contains codex section and optionally other sections (file, etc.)\n */\nexport interface UnifiedConfig {\n codex?: CodexYamlConfig\n file?: FileConfig\n [key: string]: unknown\n}\n\n/**\n * Options for reading configuration\n */\nexport interface ReadConfigOptions {\n /**\n * Whether to expand environment variables (default: true)\n */\n expandEnv?: boolean\n\n /**\n * Environment variables to use (default: process.env)\n */\n env?: Record<string, string | undefined>\n\n /**\n * Whether to warn about missing env vars (default: false)\n */\n warnOnMissingEnv?: boolean\n}\n\n/**\n * Read and parse a YAML configuration file\n *\n * Supports both unified config format (with `codex:` section)\n * and legacy flat format. Automatically expands environment variables.\n *\n * @example\n * ```typescript\n * // Unified format (recommended)\n * // config.yaml:\n * // codex:\n * // organization: myorg\n * // storage:\n * // - type: github\n * // token: ${GITHUB_TOKEN}\n *\n * const config = await readCodexConfig('.fractary/config.yaml')\n * // config.organization === 'myorg'\n * // config.storage[0].token === actual GITHUB_TOKEN value\n * ```\n */\nexport async function readCodexConfig(\n configPath: string,\n options: ReadConfigOptions = {}\n): Promise<CodexYamlConfig> {\n const content = await fs.readFile(configPath, 'utf-8')\n const rawConfig = yaml.load(content) as Record<string, unknown>\n\n // Handle unified config format (has `codex:` section)\n // Note: We use double cast (as unknown as T) because js-yaml returns\n // a generic object type that doesn't overlap with our strict interface.\n // The runtime check (rawConfig?.codex && typeof ...) ensures safety.\n let config: CodexYamlConfig\n if (rawConfig?.codex && typeof rawConfig.codex === 'object') {\n config = rawConfig.codex as unknown as CodexYamlConfig\n } else {\n // Legacy flat format - treat entire config as CodexYamlConfig\n config = rawConfig as unknown as CodexYamlConfig\n }\n\n if (!config.organization) {\n throw new Error('Invalid config: organization is required')\n }\n\n // Expand environment variables by default\n if (options.expandEnv !== false) {\n const envOptions: ExpandEnvOptions = {\n env: options.env,\n warnOnMissing: options.warnOnMissingEnv,\n }\n config = expandEnvVarsInConfig(config, envOptions)\n }\n\n return config\n}\n\n/**\n * Read the full unified configuration file\n *\n * Returns the complete config including non-codex sections (file, etc.)\n *\n * @example\n * ```typescript\n * const unified = await readUnifiedConfig('.fractary/config.yaml')\n * // unified.codex - Codex configuration\n * // unified.file - File plugin configuration\n * ```\n */\nexport async function readUnifiedConfig(\n configPath: string,\n options: ReadConfigOptions = {}\n): Promise<UnifiedConfig> {\n const content = await fs.readFile(configPath, 'utf-8')\n let config = yaml.load(content) as UnifiedConfig\n\n // Expand environment variables by default\n if (options.expandEnv !== false) {\n const envOptions: ExpandEnvOptions = {\n env: options.env,\n warnOnMissing: options.warnOnMissingEnv,\n }\n config = expandEnvVarsInConfig(config, envOptions)\n }\n\n return config\n}\n\n/**\n * Check if a config file uses the unified format\n */\nexport function isUnifiedConfig(config: unknown): config is UnifiedConfig {\n if (config === null || typeof config !== 'object') {\n return false\n }\n const maybeUnified = config as Record<string, unknown>\n // Check for codex section that is a non-null object\n // Note: typeof null === 'object' in JS, so we need explicit null check\n return (\n 'codex' in maybeUnified &&\n maybeUnified.codex !== null &&\n typeof maybeUnified.codex === 'object'\n )\n}\n","/**\n * Core Utilities\n *\n * Common utility functions for parsing durations, sizes, and other values.\n */\n\n/**\n * Duration unit multipliers in seconds\n */\nconst DURATION_MULTIPLIERS: Record<string, number> = {\n s: 1, // seconds\n m: 60, // minutes\n h: 3600, // hours\n d: 86400, // days\n w: 604800, // weeks (7 days)\n M: 2592000, // months (30 days)\n y: 31536000, // years (365 days)\n}\n\n/**\n * Size unit multipliers in bytes\n */\nconst SIZE_MULTIPLIERS: Record<string, number> = {\n B: 1,\n KB: 1024,\n MB: 1024 * 1024,\n GB: 1024 * 1024 * 1024,\n TB: 1024 * 1024 * 1024 * 1024,\n}\n\n/**\n * Parse a duration string to seconds\n *\n * Supports formats like: \"1h\", \"24h\", \"7d\", \"1w\", \"1M\", \"1y\"\n *\n * @example\n * ```typescript\n * parseDuration('30s') // => 30\n * parseDuration('5m') // => 300\n * parseDuration('2h') // => 7200\n * parseDuration('7d') // => 604800\n * parseDuration('1w') // => 604800\n * parseDuration('1M') // => 2592000\n * parseDuration('1y') // => 31536000\n * parseDuration(3600) // => 3600 (pass-through)\n * ```\n *\n * @param duration - Duration string or number\n * @returns Duration in seconds\n * @throws Error if the format is invalid\n */\nexport function parseDuration(duration: string | number): number {\n if (typeof duration === 'number') {\n return duration\n }\n\n const match = duration.match(/^(\\d+(?:\\.\\d+)?)\\s*([smhdwMy])$/)\n if (!match || !match[1] || !match[2]) {\n throw new Error(`Invalid duration format: ${duration}. Use format like \"1h\", \"7d\", \"1M\"`)\n }\n\n const valueStr = match[1]\n const unit = match[2]\n const value = parseFloat(valueStr)\n const multiplier = DURATION_MULTIPLIERS[unit]\n\n if (multiplier === undefined) {\n throw new Error(`Unknown duration unit: ${unit}`)\n }\n\n return Math.round(value * multiplier)\n}\n\n/**\n * Parse a size string to bytes\n *\n * Supports formats like: \"100B\", \"50KB\", \"100MB\", \"1GB\", \"1TB\"\n *\n * @example\n * ```typescript\n * parseSize('100B') // => 100\n * parseSize('50KB') // => 51200\n * parseSize('100MB') // => 104857600\n * parseSize('1GB') // => 1073741824\n * parseSize(1024) // => 1024 (pass-through)\n * ```\n *\n * @param size - Size string or number\n * @returns Size in bytes\n * @throws Error if the format is invalid\n */\nexport function parseSize(size: string | number): number {\n if (typeof size === 'number') {\n return size\n }\n\n const match = size.match(/^(\\d+(?:\\.\\d+)?)\\s*(B|KB|MB|GB|TB)$/i)\n if (!match || !match[1] || !match[2]) {\n throw new Error(`Invalid size format: ${size}. Use format like \"100MB\", \"1GB\"`)\n }\n\n const valueStr = match[1]\n const unit = match[2]\n const value = parseFloat(valueStr)\n const multiplier = SIZE_MULTIPLIERS[unit.toUpperCase()]\n\n if (multiplier === undefined) {\n throw new Error(`Unknown size unit: ${unit}`)\n }\n\n return Math.round(value * multiplier)\n}\n\n/**\n * Format bytes to human-readable size\n *\n * @example\n * ```typescript\n * formatBytes(100) // => '100 B'\n * formatBytes(1024) // => '1.0 KB'\n * formatBytes(1536) // => '1.5 KB'\n * formatBytes(1048576) // => '1.0 MB'\n * formatBytes(1073741824) // => '1.0 GB'\n * ```\n */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n *\n * @example\n * ```typescript\n * formatDuration(500) // => '500ms'\n * formatDuration(1500) // => '1.5s'\n * formatDuration(60000) // => '1.0m'\n * formatDuration(3600000) // => '1.0h'\n * ```\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`\n if (ms < 3600000) return `${(ms / 60000).toFixed(1)}m`\n return `${(ms / 3600000).toFixed(1)}h`\n}\n\n/**\n * Format seconds to human-readable duration string\n *\n * @example\n * ```typescript\n * formatSeconds(30) // => '30s'\n * formatSeconds(90) // => '1.5m'\n * formatSeconds(3600) // => '1.0h'\n * formatSeconds(86400) // => '1.0d'\n * ```\n */\nexport function formatSeconds(seconds: number): string {\n if (seconds < 60) return `${seconds}s`\n if (seconds < 3600) return `${(seconds / 60).toFixed(1)}m`\n if (seconds < 86400) return `${(seconds / 3600).toFixed(1)}h`\n return `${(seconds / 86400).toFixed(1)}d`\n}\n\n/**\n * Check if a value is a valid duration string\n */\nexport function isValidDuration(value: string): boolean {\n return /^\\d+(?:\\.\\d+)?\\s*[smhdwMy]$/.test(value)\n}\n\n/**\n * Check if a value is a valid size string\n */\nexport function isValidSize(value: string): boolean {\n return /^\\d+(?:\\.\\d+)?\\s*(B|KB|MB|GB|TB)$/i.test(value)\n}\n","/**\n * @fractary/codex - Core SDK for Fractary Codex\n *\n * Knowledge infrastructure for AI agents - providing universal references,\n * storage abstraction, caching, synchronization, and MCP integration.\n *\n * @example\n * ```typescript\n * import { parseReference, resolveReference, TypeRegistry } from '@fractary/codex'\n *\n * // Parse a codex URI\n * const parsed = parseReference('codex://org/project/docs/api.md')\n *\n * // Create a type registry\n * const types = new TypeRegistry()\n * const ttl = types.getTtl('docs/api.md')\n * ```\n */\n\n// Errors\nexport { CodexError, ConfigurationError, ValidationError } from './errors/index.js'\n\n// References - Universal reference system (codex:// URIs)\nexport {\n // Parser\n parseReference,\n buildUri,\n isValidUri,\n isLegacyReference,\n convertLegacyReference,\n getExtension,\n getFilename,\n getDirectory,\n CODEX_URI_PREFIX,\n LEGACY_REF_PREFIX,\n type ParsedReference,\n type ParseOptions,\n // Resolver\n resolveReference,\n resolveReferences,\n detectCurrentProject,\n getCurrentContext,\n calculateCachePath,\n isCurrentProjectUri,\n getRelativeCachePath,\n DEFAULT_CACHE_DIR,\n type ResolvedReference,\n type ResolveOptions,\n // Validator\n validatePath,\n sanitizePath,\n validateOrg,\n validateProject,\n validateUri,\n} from './references/index.js'\n\n// Types - Extensible artifact type system\nexport {\n // Built-in types\n type ArtifactType,\n BUILT_IN_TYPES,\n DEFAULT_TYPE,\n TTL,\n getBuiltInType,\n getBuiltInTypeNames,\n isBuiltInType,\n // Registry\n TypeRegistry,\n createDefaultRegistry,\n type TypeRegistryOptions,\n // Custom types\n CustomTypeSchema,\n TypesConfigSchema,\n type CustomTypeConfig,\n type TypesConfig,\n parseTtl,\n validateCustomTypes,\n loadCustomTypes,\n mergeTypes,\n extendType,\n} from './types/index.js'\n\n// Schemas\nexport {\n MetadataSchema,\n AutoSyncPatternSchema,\n SyncRulesSchema,\n CodexConfigSchema,\n type Metadata,\n type AutoSyncPattern,\n type SyncRules,\n type CodexConfig as SchemaCodexConfig,\n} from './schemas/index.js'\n\n// Metadata parsing\nexport {\n parseMetadata,\n hasFrontmatter,\n validateMetadata,\n extractRawFrontmatter,\n type ParseMetadataOptions,\n type ParseResult,\n} from './core/metadata/index.js'\n\n// Pattern matching\nexport {\n matchPattern,\n matchAnyPattern,\n filterByPatterns,\n evaluatePatterns,\n} from './core/patterns/index.js'\n\n// Configuration\nexport {\n loadConfig,\n resolveOrganization,\n extractOrgFromRepoName,\n getDefaultConfig,\n getDefaultDirectories,\n getDefaultRules,\n // Sync presets (centralized source of truth)\n CONFIG_SCHEMA_VERSION,\n SYNC_PATTERN_PRESETS,\n DEFAULT_GLOBAL_EXCLUDES,\n getSyncPreset,\n getSyncPresetNames,\n substitutePatternPlaceholders,\n generateSyncConfigFromPreset,\n // ConfigManager - centralized configuration management\n ConfigManager,\n createConfigManager,\n validateNameFormat,\n validateOrganizationName,\n validateRepositoryName,\n detectOrganizationFromGit,\n detectProjectName,\n discoverCodexRepo,\n STANDARD_DIRECTORIES,\n CODEX_DIRECTORIES,\n ensureDirectoryStructure,\n DEFAULT_FRACTARY_GITIGNORE,\n normalizeCachePath,\n ensureCachePathIgnored,\n installMcpServer,\n generateCodexSection,\n sanitizeForS3BucketName,\n generateUnifiedConfig,\n readUnifiedConfig,\n writeUnifiedConfig,\n mergeUnifiedConfigs,\n type LoadConfigOptions,\n type ResolveOrgOptions,\n type SyncPreset,\n type SyncPresetConfig,\n type GenerateSyncConfigOptions,\n type NameValidationResult,\n type DiscoverCodexRepoResult,\n type McpInstallResult,\n type DirectoryStructureResult,\n type GitignoreResult,\n type RemoteConfig,\n type CodexConfig,\n type FileSourceConfig,\n type FilePluginConfig,\n type UnifiedConfig,\n // New: config-init / config-update / config-validate types\n type CodexInitOptions,\n type CodexInitResult,\n type CodexUpdateOptions,\n type CodexUpdateResult,\n type ValidationIssue,\n type CodexValidateResult,\n // Deprecated\n type ConfigInitOptions,\n type ConfigInitResult,\n} from './core/config/index.js'\n\n// Routing\nexport {\n shouldSyncToRepo,\n getTargetRepos,\n type ShouldSyncOptions,\n} from './core/routing/index.js'\n\n// Custom sync destinations\nexport {\n parseCustomDestination,\n getCustomSyncDestinations,\n type CustomSyncDestination,\n} from './core/custom/index.js'\n\n// Storage - Multi-provider storage abstraction\nexport {\n // Provider interface\n type StorageProvider,\n type StorageProviderType,\n type StorageProviderConfig,\n type FetchResult,\n type FetchOptions,\n DEFAULT_FETCH_OPTIONS,\n mergeFetchOptions,\n detectContentType,\n // Local storage\n LocalStorage,\n createLocalStorage,\n type LocalStorageOptions,\n // GitHub storage\n GitHubStorage,\n createGitHubStorage,\n type GitHubStorageOptions,\n // HTTP storage\n HttpStorage,\n createHttpStorage,\n type HttpStorageOptions,\n // File plugin storage\n FilePluginStorage,\n type FilePluginStorageOptions,\n // Storage errors\n FilePluginFileNotFoundError,\n type FilePluginFileNotFoundErrorOptions,\n // Storage manager\n StorageManager,\n createStorageManager,\n getDefaultStorageManager,\n setDefaultStorageManager,\n type StorageManagerConfig,\n} from './storage/index.js'\n\n// Cache - Multi-tier caching with persistence\nexport {\n // Cache entry\n type CacheEntry,\n type CacheEntryMetadata,\n type CacheEntryStatus,\n type SerializedCacheEntry,\n createCacheEntry,\n getCacheEntryStatus,\n isCacheEntryValid,\n isCacheEntryFresh,\n touchCacheEntry,\n serializeCacheEntry,\n deserializeCacheEntry,\n getRemainingTtl,\n hasContentChanged,\n getCacheEntryAge,\n calculateContentHash,\n // Persistence\n CachePersistence,\n createCachePersistence,\n type CachePersistenceOptions,\n type CacheStats,\n // Cache manager\n CacheManager,\n createCacheManager,\n getDefaultCacheManager,\n setDefaultCacheManager,\n type CacheManagerConfig,\n type CacheLookupResult,\n // Cache entry listing\n type CacheEntryInfo,\n type ListEntriesOptions,\n type ListEntriesResult,\n} from './cache/index.js'\n\n// Sync - File synchronization\nexport {\n // Types\n type SyncDirection,\n type SyncOperation,\n type FileSyncStatus,\n type SyncManifestEntry,\n type SyncManifest,\n type SyncPlan,\n type SyncResult,\n type SyncOptions,\n type SyncRule,\n type SyncConfig,\n DEFAULT_SYNC_CONFIG,\n // Evaluator\n evaluatePath,\n evaluatePaths,\n filterSyncablePaths,\n createRulesFromPatterns,\n mergeRules,\n summarizeEvaluations,\n validateRules,\n type EvaluationResult,\n type EvaluationSummary,\n // Planner\n createSyncPlan,\n estimateSyncTime,\n createEmptySyncPlan,\n filterPlanOperations,\n getPlanStats,\n formatPlanSummary,\n type FileInfo,\n type PlanStats,\n // Manager\n SyncManager,\n createSyncManager,\n type SyncManagerConfig,\n} from './sync/index.js'\n\n// Permissions - Access control for codex operations\nexport {\n // Types\n type PermissionLevel,\n type PermissionScope,\n type PermissionAction,\n type PermissionRule,\n type PermissionContext,\n type PermissionResult,\n type PermissionConfig,\n DEFAULT_PERMISSION_CONFIG,\n PERMISSION_LEVEL_ORDER,\n levelGrants,\n maxLevel,\n minLevel,\n // Evaluator\n ruleMatchesContext,\n ruleMatchesPath,\n ruleMatchesAction,\n evaluatePermission,\n isAllowed as isPermissionAllowed,\n hasPermission as hasPermissionLevel,\n evaluatePermissions,\n filterByPermission,\n validateRules as validatePermissionRules,\n createRule,\n CommonRules,\n // Manager\n PermissionManager,\n PermissionDeniedError,\n createPermissionManager,\n getDefaultPermissionManager,\n setDefaultPermissionManager,\n type PermissionManagerConfig,\n} from './permissions/index.js'\n\n// Migration - v2.x to v3.0 configuration migration\nexport {\n // Types\n type LegacyCodexConfig,\n type LegacyAutoSyncPattern,\n type ModernCodexConfig,\n type ModernSyncPattern,\n type MigrationResult,\n type MigrationChange,\n type MigrationOptions,\n type VersionDetectionResult,\n type ReferenceConversionResult,\n type ConvertedReference,\n type ConversionOptions,\n // Detector\n detectVersion,\n isModernConfig,\n isLegacyConfig,\n needsMigration,\n getMigrationRequirements,\n // Migrator\n DEFAULT_MIGRATION_OPTIONS,\n migrateConfig,\n validateMigratedConfig,\n generateMigrationReport,\n createEmptyModernConfig,\n // References\n LEGACY_PATTERNS,\n convertLegacyReferences,\n convertToUri,\n findLegacyReferences,\n hasLegacyReferences,\n migrateFileReferences,\n generateReferenceMigrationSummary,\n} from './migration/index.js'\n\n// Environment variable utilities\nexport {\n expandEnvVars,\n expandEnvVarsInConfig,\n hasEnvVars,\n extractEnvVarNames,\n type ExpandEnvOptions,\n} from './core/env/index.js'\n\n// YAML configuration utilities\nexport {\n readCodexConfig,\n readUnifiedConfig as readYamlUnifiedConfig,\n isUnifiedConfig,\n type CodexYamlConfig,\n type UnifiedConfig as YamlUnifiedConfig,\n type ReadConfigOptions,\n type StorageProviderType as YamlStorageProviderType,\n type LocalStorageConfig as YamlLocalStorageConfig,\n type GitHubStorageConfig as YamlGitHubStorageConfig,\n type HttpStorageConfig as YamlHttpStorageConfig,\n type S3StorageConfig as YamlS3StorageConfig,\n type StorageProviderConfig as YamlStorageProviderConfig,\n type CacheConfig as YamlCacheConfig,\n type CustomTypeConfig as YamlCustomTypeConfig,\n type TypesConfig as YamlTypesConfig,\n type PermissionLevel as YamlPermissionLevel,\n type PermissionRule as YamlPermissionRule,\n type PermissionsConfig as YamlPermissionsConfig,\n type DirectionalSyncConfig,\n type SyncRule as YamlSyncRule,\n type SyncConfig as YamlSyncConfig,\n type McpConfig as YamlMcpConfig,\n type ArchiveConfig,\n type FileConfig,\n} from './core/yaml/index.js'\n\n// Core utilities (parsing, formatting)\nexport {\n parseDuration,\n parseSize,\n formatBytes,\n formatDuration,\n formatSeconds,\n isValidDuration,\n isValidSize,\n} from './core/utils/index.js'\n\n// Health checking\nexport {\n HealthChecker,\n createHealthChecker,\n type HealthStatus,\n type HealthCheck,\n type HealthSummary,\n type HealthResult,\n type StorageProviderInfo,\n type HealthConfig,\n type HealthCheckerOptions,\n} from './health/index.js'\n\n// Client - High-level facade\nexport {\n CodexClient,\n createCodexClient,\n type CodexClientOptions,\n type ClientFetchOptions,\n type ClientFetchResult,\n} from './client/codex-client.js'\n","import { z } from 'zod'\n\n/**\n * Schema for document frontmatter metadata\n *\n * Based on SPEC-00002: Metadata Parsing\n */\nexport const MetadataSchema = z\n .object({\n // Organizational\n org: z.string().optional(),\n system: z.string().optional(),\n\n // Sync rules\n codex_sync_include: z.array(z.string()).optional(),\n codex_sync_exclude: z.array(z.string()).optional(),\n codex_sync_custom: z.array(z.string()).optional(),\n\n // Metadata\n title: z.string().optional(),\n description: z.string().optional(),\n visibility: z.enum(['public', 'internal', 'private']).optional(),\n audience: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n\n // Timestamps\n created: z.string().optional(), // ISO 8601 date string\n updated: z.string().optional(),\n })\n .passthrough() // Allow additional fields for extensibility\n\nexport type Metadata = z.infer<typeof MetadataSchema>\n","import { z } from 'zod'\n\n/**\n * Schema for auto-sync patterns\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport const AutoSyncPatternSchema = z.object({\n pattern: z.string(),\n include: z.array(z.string()),\n exclude: z.array(z.string()).optional(),\n})\n\nexport type AutoSyncPattern = z.infer<typeof AutoSyncPatternSchema>\n\n/**\n * Schema for sync rules configuration\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport const SyncRulesSchema = z.object({\n autoSyncPatterns: z.array(AutoSyncPatternSchema).optional(),\n preventSelfSync: z.boolean().optional(),\n preventCodexSync: z.boolean().optional(),\n allowProjectOverrides: z.boolean().optional(),\n defaultInclude: z.array(z.string()).optional(),\n defaultExclude: z.array(z.string()).optional(),\n})\n\nexport type SyncRules = z.infer<typeof SyncRulesSchema>\n\n/**\n * Schema for directional sync config (v0.7.0+)\n *\n * Defines include/exclude patterns for a sync direction\n */\nexport const DirectionalSyncConfigSchema = z.object({\n /** Patterns to include (required) */\n include: z.array(z.string()),\n /** Patterns to exclude (optional) */\n exclude: z.array(z.string()).optional(),\n})\n\nexport type DirectionalSyncConfig = z.infer<typeof DirectionalSyncConfigSchema>\n\n/**\n * Schema for from_codex sync config with URI validation\n *\n * from_codex patterns MUST use codex:// URIs to specify which files\n * to pull from the codex repository. Plain paths are not valid.\n *\n * Valid patterns:\n * - \"codex://org/repo/docs/**\"\n * - \"codex://{org}/{codex_repo}/docs/**\" (with placeholders)\n *\n * Invalid patterns:\n * - \"docs/**\" (plain path - won't work)\n * - \"standards/**\" (plain path - won't work)\n */\nexport const FromCodexSyncConfigSchema = DirectionalSyncConfigSchema.refine(\n (config) => {\n // Validate that all include patterns use codex:// URI format\n const includeValid = config.include.every((pattern) =>\n pattern.startsWith('codex://')\n )\n // Validate exclude patterns too (if present)\n const excludeValid =\n !config.exclude ||\n config.exclude.every((pattern) => pattern.startsWith('codex://'))\n return includeValid && excludeValid\n },\n {\n message:\n 'from_codex patterns must use codex:// URI format (e.g., \"codex://{org}/{codex_repo}/docs/**\"). Plain paths like \"docs/**\" are not valid for from_codex.',\n }\n)\n\nexport type FromCodexSyncConfig = z.infer<typeof FromCodexSyncConfigSchema>\n\n/**\n * Schema for directional sync configuration\n *\n * Defines what files sync TO codex (push) and FROM codex (pull)\n */\nexport const DirectionalSyncSchema = z.object({\n // New format (v0.7.0+) - Recommended\n // Patterns for files to push from this project to codex (plain paths)\n to_codex: DirectionalSyncConfigSchema.optional(),\n\n // Patterns for files to pull from codex to this project (codex:// URIs required)\n from_codex: FromCodexSyncConfigSchema.optional(),\n\n // Global exclude patterns (applied to both directions)\n exclude: z.array(z.string()).optional(),\n\n // Legacy format (deprecated, backward compatible)\n // Org-level defaults (only in codex repository config)\n default_to_codex: z.array(z.string()).optional(),\n default_from_codex: z.array(z.string()).optional(),\n})\n\nexport type DirectionalSync = z.infer<typeof DirectionalSyncSchema>\n\n/**\n * Schema for archive configuration per project\n *\n * Based on SPEC-20260111: Codex Archive Awareness\n */\nexport const ArchiveProjectConfigSchema = z.object({\n enabled: z.boolean(),\n handler: z.enum(['s3', 'r2', 'gcs', 'local']),\n bucket: z.string().optional(),\n prefix: z.string().optional(),\n patterns: z.array(z.string()).optional(),\n})\n\nexport type ArchiveProjectConfig = z.infer<typeof ArchiveProjectConfigSchema>\n\n/**\n * Schema for archive configuration\n *\n * Maps project identifiers (org/project) to their archive config\n */\nexport const ArchiveConfigSchema = z.object({\n projects: z.record(ArchiveProjectConfigSchema),\n})\n\nexport type ArchiveConfig = z.infer<typeof ArchiveConfigSchema>\n\n/**\n * Schema for GitHub authentication configuration\n */\nexport const GitHubAuthConfigSchema = z.object({\n /** Default token environment variable name (default: GITHUB_TOKEN) */\n default_token_env: z.string().optional(),\n /** Fallback to public access if authentication fails */\n fallback_to_public: z.boolean().optional(),\n})\n\nexport type GitHubAuthConfig = z.infer<typeof GitHubAuthConfigSchema>\n\n/**\n * Schema for authentication configuration\n */\nexport const AuthConfigSchema = z.object({\n /** GitHub authentication configuration */\n github: GitHubAuthConfigSchema.optional(),\n})\n\nexport type AuthConfig = z.infer<typeof AuthConfigSchema>\n\n/**\n * Schema for remote repository configuration\n *\n * Configures authentication for external repositories referenced in from_codex patterns.\n * Token can be a direct value or an environment variable reference using ${VAR} syntax.\n *\n * Example:\n * remotes:\n * partner-org/their-docs:\n * token: ${PARTNER_TOKEN}\n */\nexport const RemoteConfigSchema = z.object({\n /** Authentication token - can be direct value or ${ENV_VAR} reference */\n token: z.string().optional(),\n})\n\nexport type RemoteConfig = z.infer<typeof RemoteConfigSchema>\n\n/**\n * Schema for Codex configuration\n *\n * Based on SPEC-00005: Configuration System\n */\nexport const CodexConfigSchema = z\n .object({\n organizationSlug: z.string(),\n\n /** Project name (optional) */\n project: z.string().optional(),\n\n directories: z\n .object({\n source: z.string().optional(),\n target: z.string().optional(),\n systems: z.string().optional(),\n })\n .optional(),\n\n rules: SyncRulesSchema.optional(),\n\n // Directional sync configuration\n sync: DirectionalSyncSchema.optional(),\n\n // Archive configuration\n archive: ArchiveConfigSchema.optional(),\n\n // Authentication configuration\n auth: AuthConfigSchema.optional(),\n\n // Remote repositories configuration (external projects)\n // Keys are org/project identifiers, values configure authentication\n remotes: z.record(RemoteConfigSchema).optional(),\n })\n .strict()\n\nexport type CodexConfig = z.infer<typeof CodexConfigSchema>\n\n/**\n * Schema for file plugin source configuration\n *\n * Based on SPEC-20260115: Codex-File Plugin Integration\n */\nexport const FileSourceSchema = z\n .object({\n type: z.enum(['s3', 'r2', 'gcs', 'local']),\n bucket: z.string().optional(),\n prefix: z.string().optional(),\n region: z.string().optional(),\n local: z.object({\n base_path: z.string(),\n }),\n push: z\n .object({\n compress: z.boolean().optional(),\n keep_local: z.boolean().optional(),\n })\n .optional(),\n auth: z\n .object({\n profile: z.string().optional(),\n })\n .optional(),\n })\n .refine(\n (data) => {\n // Bucket is required for cloud storage types (s3, r2, gcs)\n if (data.type !== 'local' && !data.bucket) {\n return false\n }\n return true\n },\n {\n message: \"Bucket is required for s3, r2, and gcs storage types\",\n path: ['bucket'],\n }\n )\n\nexport type FileSource = z.infer<typeof FileSourceSchema>\n\n/**\n * Schema for file plugin configuration\n *\n * Manages local project artifacts (specs, logs, assets) with push/pull to cloud storage\n */\nexport const FileConfigSchema = z.object({\n schema_version: z.string(),\n sources: z.record(FileSourceSchema),\n})\n\nexport type FileConfig = z.infer<typeof FileConfigSchema>\n\n/**\n * Schema for unified configuration\n *\n * Combines file plugin and codex plugin configuration in a single file\n * Location: .fractary/config.yaml\n */\nexport const UnifiedConfigSchema = z.object({\n file: FileConfigSchema.optional(),\n codex: CodexConfigSchema.optional(),\n})\n\nexport type UnifiedConfig = z.infer<typeof UnifiedConfigSchema>\n","import yaml from 'js-yaml'\nimport { MetadataSchema, type Metadata } from '../../schemas/metadata.js'\nimport { ValidationError } from '../../errors/index.js'\n\nexport interface ParseMetadataOptions {\n strict?: boolean // Throw on validation errors (default: true)\n normalize?: boolean // Normalize line endings (default: true)\n}\n\nexport interface ParseResult {\n metadata: Metadata\n content: string // Document content without frontmatter\n raw: string // Raw frontmatter block\n}\n\n/**\n * Extracts and parses YAML frontmatter from markdown content\n *\n * Based on SPEC-00002: Metadata Parsing\n *\n * @param content - Markdown file content\n * @param options - Parsing options\n * @returns Parsed metadata and content\n * @throws ValidationError if frontmatter is malformed (in strict mode)\n */\nexport function parseMetadata(\n content: string,\n options: ParseMetadataOptions = {}\n): ParseResult {\n const { strict = true, normalize = true } = options\n\n // Normalize line endings (CRLF → LF)\n const normalizedContent = normalize\n ? content.replace(/\\r\\n/g, '\\n')\n : content\n\n // Extract frontmatter block\n const frontmatterMatch = normalizedContent.match(\n /^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/\n )\n\n if (!frontmatterMatch) {\n // No frontmatter found\n return {\n metadata: {},\n content: normalizedContent,\n raw: '',\n }\n }\n\n const rawFrontmatter = frontmatterMatch[1]!\n const documentContent = frontmatterMatch[2]!\n\n try {\n // Parse YAML\n const parsed = yaml.load(rawFrontmatter) as Record<string, unknown>\n\n // Normalize legacy formats\n const normalized = normalizeLegacyMetadata(parsed)\n\n // Validate against schema\n const metadata = strict\n ? MetadataSchema.parse(normalized)\n : MetadataSchema.safeParse(normalized).data || {}\n\n return {\n metadata,\n content: documentContent,\n raw: rawFrontmatter,\n }\n } catch (error) {\n if (strict) {\n throw new ValidationError(\n `Invalid frontmatter: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error }\n )\n }\n\n // Non-strict mode: return empty metadata\n return {\n metadata: {},\n content: documentContent,\n raw: rawFrontmatter,\n }\n }\n}\n\n/**\n * Normalize legacy frontmatter formats to standard format\n *\n * Handles:\n * - Nested codex.includes → codex_sync_include\n * - Nested codex.excludes → codex_sync_exclude\n * - Flat plural codex_sync_includes → codex_sync_include\n * - Flat plural codex_sync_excludes → codex_sync_exclude\n */\nfunction normalizeLegacyMetadata(parsed: any): any {\n const normalized: any = { ...parsed }\n\n // Handle nested codex.includes → codex_sync_include\n if (parsed.codex?.includes && !parsed.codex_sync_include) {\n normalized.codex_sync_include = parsed.codex.includes\n }\n\n // Handle nested codex.excludes → codex_sync_exclude\n if (parsed.codex?.excludes && !parsed.codex_sync_exclude) {\n normalized.codex_sync_exclude = parsed.codex.excludes\n }\n\n // Handle flat plural codex_sync_includes → codex_sync_include\n if (parsed.codex_sync_includes && !normalized.codex_sync_include) {\n normalized.codex_sync_include = parsed.codex_sync_includes\n }\n\n // Handle flat plural codex_sync_excludes → codex_sync_exclude\n if (parsed.codex_sync_excludes && !normalized.codex_sync_exclude) {\n normalized.codex_sync_exclude = parsed.codex_sync_excludes\n }\n\n return normalized\n}\n\n/**\n * Check if content has frontmatter\n */\nexport function hasFrontmatter(content: string): boolean {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n return /^---\\n[\\s\\S]*?\\n---\\n/.test(normalized)\n}\n\n/**\n * Validate metadata without parsing content\n */\nexport function validateMetadata(\n metadata: unknown\n): { valid: boolean; errors?: string[] } {\n const result = MetadataSchema.safeParse(metadata)\n\n if (result.success) {\n return { valid: true }\n }\n\n return {\n valid: false,\n errors: result.error.issues.map(issue => issue.message),\n }\n}\n\n/**\n * Extract only frontmatter (no validation)\n */\nexport function extractRawFrontmatter(content: string): string | null {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n const match = normalized.match(/^---\\n([\\s\\S]*?)\\n---\\n/)\n return match && match[1] ? match[1] : null\n}\n","export {\n matchPattern,\n matchAnyPattern,\n filterByPatterns,\n evaluatePatterns,\n} from './matcher.js'\n","import { ConfigurationError } from '../../errors/index.js'\n\nexport interface ResolveOrgOptions {\n orgSlug?: string // Explicit org slug\n repoName?: string // Repo name for auto-detection\n autoDetect?: boolean // Enable auto-detection (default: true)\n}\n\n/**\n * Resolve organization slug from multiple sources\n *\n * Based on SPEC-00005: Configuration System\n *\n * Priority:\n * 1. Explicit orgSlug parameter\n * 2. Auto-detect from repoName (if enabled)\n * 3. Environment variable (ORGANIZATION_SLUG or CODEX_ORG_SLUG)\n * 4. Throw ConfigurationError if none found\n *\n * @param options - Resolution options\n * @returns Organization slug\n * @throws ConfigurationError if slug cannot be determined\n */\nexport function resolveOrganization(\n options: ResolveOrgOptions = {}\n): string {\n const { orgSlug, repoName, autoDetect = true } = options\n\n // 1. Explicit parameter\n if (orgSlug) {\n return orgSlug\n }\n\n // 2. Auto-detect from repo name\n if (autoDetect && repoName) {\n const detected = extractOrgFromRepoName(repoName)\n if (detected) {\n return detected\n }\n }\n\n // 3. Environment variables\n const envOrg =\n process.env['ORGANIZATION_SLUG'] || process.env['CODEX_ORG_SLUG']\n\n if (envOrg) {\n return envOrg\n }\n\n // 4. Fail - required parameter missing\n throw new ConfigurationError(\n 'Organization slug could not be determined. ' +\n 'Set ORGANIZATION_SLUG environment variable or pass orgSlug option.'\n )\n}\n\n/**\n * Extract org slug from repo name pattern\n *\n * Patterns:\n * - codex.fractary.com → \"fractary\"\n * - codex.acme.ai → \"acme\"\n * - codex.my-org.io → \"my-org\"\n *\n * @param repoName - Repository name\n * @returns Organization slug or null if pattern doesn't match\n */\nexport function extractOrgFromRepoName(repoName: string): string | null {\n // Pattern: codex.{org}.{tld}\n const match = repoName.match(/^codex\\.([^.]+)\\.[^.]+$/)\n\n if (match && match[1]) {\n return match[1]\n }\n\n return null\n}\n","import type { CodexConfig, SyncRules } from '../../schemas/config.js'\n\n/**\n * Get default directory structure\n *\n * Based on SPEC-00005: Configuration System\n */\nexport function getDefaultDirectories(orgSlug: string) {\n return {\n source: `.${orgSlug}`,\n target: `.${orgSlug}`,\n systems: `.${orgSlug}/systems`,\n }\n}\n\n/**\n * Get default sync rules\n *\n * Based on SPEC-00004: Routing & Distribution\n */\nexport function getDefaultRules(): SyncRules {\n return {\n autoSyncPatterns: [],\n preventSelfSync: true,\n preventCodexSync: true,\n allowProjectOverrides: true,\n defaultInclude: [],\n defaultExclude: [],\n }\n}\n\n/**\n * Get default archive configuration\n *\n * No archives enabled by default - must be explicitly configured per project\n */\nexport function getDefaultArchiveConfig() {\n return {\n projects: {},\n }\n}\n\n/**\n * Get default configuration\n *\n * @param orgSlug - Organization slug\n * @returns Default CodexConfig\n */\nexport function getDefaultConfig(orgSlug: string): CodexConfig {\n return {\n organizationSlug: orgSlug,\n directories: getDefaultDirectories(orgSlug),\n rules: getDefaultRules(),\n archive: getDefaultArchiveConfig(),\n }\n}\n","import {\n CodexConfigSchema,\n type CodexConfig,\n type SyncRules,\n} from '../../schemas/config.js'\nimport { resolveOrganization } from './organization.js'\nimport { getDefaultDirectories, getDefaultRules } from './defaults.js'\n\nexport interface LoadConfigOptions {\n organizationSlug?: string\n repoName?: string\n env?: Record<string, string | undefined> // Environment variables (default: process.env)\n}\n\n/**\n * Load and resolve configuration from all sources\n *\n * Based on SPEC-00005: Configuration System\n *\n * @param options - Loading options\n * @returns Fully resolved configuration\n */\nexport function loadConfig(options: LoadConfigOptions = {}): CodexConfig {\n // 1. Resolve organization slug\n const orgSlug = resolveOrganization({\n orgSlug: options.organizationSlug,\n repoName: options.repoName,\n })\n\n // 2. Build base config with defaults\n let config: Partial<CodexConfig> = {\n organizationSlug: orgSlug,\n directories: getDefaultDirectories(orgSlug),\n rules: getDefaultRules(),\n }\n\n // 3. Apply environment variable overrides\n const envConfig = loadConfigFromEnv(options.env || process.env)\n config = mergeConfigs(config, envConfig)\n\n // 4. Validate final configuration\n return CodexConfigSchema.parse(config)\n}\n\n/**\n * Load configuration from environment variables\n */\nfunction loadConfigFromEnv(\n env: Record<string, string | undefined>\n): Partial<CodexConfig> {\n const config: Partial<CodexConfig> = {}\n\n // Organization\n if (env['ORGANIZATION_SLUG'] || env['CODEX_ORG_SLUG']) {\n config.organizationSlug = env['ORGANIZATION_SLUG'] || env['CODEX_ORG_SLUG']\n }\n\n // Directories\n if (env['CODEX_SOURCE_DIR'] || env['CODEX_TARGET_DIR']) {\n config.directories = {\n source: env['CODEX_SOURCE_DIR'],\n target: env['CODEX_TARGET_DIR'],\n }\n }\n\n // Rules\n const rules: Partial<SyncRules> = {}\n\n if (env['CODEX_PREVENT_SELF_SYNC'] !== undefined) {\n rules.preventSelfSync = env['CODEX_PREVENT_SELF_SYNC'] === 'true'\n }\n\n if (env['CODEX_PREVENT_CODEX_SYNC'] !== undefined) {\n rules.preventCodexSync = env['CODEX_PREVENT_CODEX_SYNC'] === 'true'\n }\n\n if (env['CODEX_ALLOW_PROJECT_OVERRIDES'] !== undefined) {\n rules.allowProjectOverrides =\n env['CODEX_ALLOW_PROJECT_OVERRIDES'] === 'true'\n }\n\n if (Object.keys(rules).length > 0) {\n config.rules = rules\n }\n\n return config\n}\n\n/**\n * Deep merge two configuration objects\n * Later config overrides earlier config\n */\nfunction mergeConfigs(\n base: Partial<CodexConfig>,\n override: Partial<CodexConfig>\n): Partial<CodexConfig> {\n return {\n organizationSlug: override.organizationSlug ?? base.organizationSlug,\n\n directories: {\n ...base.directories,\n ...override.directories,\n },\n\n rules: {\n ...base.rules,\n ...override.rules,\n\n // Arrays are replaced, not merged\n autoSyncPatterns:\n override.rules?.autoSyncPatterns ?? base.rules?.autoSyncPatterns,\n defaultInclude:\n override.rules?.defaultInclude ?? base.rules?.defaultInclude,\n defaultExclude:\n override.rules?.defaultExclude ?? base.rules?.defaultExclude,\n },\n\n // Only include sync if either base or override has sync config\n ...(base.sync || override.sync\n ? {\n sync: {\n ...base.sync,\n ...override.sync,\n\n // Arrays are replaced, not merged\n to_codex: override.sync?.to_codex ?? base.sync?.to_codex,\n from_codex: override.sync?.from_codex ?? base.sync?.from_codex,\n default_to_codex:\n override.sync?.default_to_codex ?? base.sync?.default_to_codex,\n default_from_codex:\n override.sync?.default_from_codex ?? base.sync?.default_from_codex,\n },\n }\n : {}),\n }\n}\n","/**\n * Sync configuration presets\n *\n * Centralized source of truth for sync pattern presets used across:\n * - SDK (programmatic configuration)\n * - CLI (config init command)\n * - MCP Plugin (configurator agent via CLI)\n *\n * This is the SINGLE SOURCE OF TRUTH for sync presets.\n * The plugin's configurator agent delegates to the CLI, which uses these presets.\n */\n\nimport { ValidationError } from '../../errors/index.js'\n\n/**\n * Configuration schema version\n */\nexport const CONFIG_SCHEMA_VERSION = '2.0' as const\n\n/**\n * Directional sync configuration (mutable version for generated configs)\n */\nexport interface SyncPresetConfig {\n to_codex: {\n include: string[]\n exclude?: string[]\n }\n from_codex: {\n include: string[]\n exclude?: string[]\n }\n}\n\n/**\n * Sync preset definition (readonly for preset definitions)\n */\nexport interface SyncPreset {\n /** Preset identifier */\n readonly name: string\n /** Human-readable description */\n readonly description: string\n /** Sync configuration */\n readonly config: {\n readonly to_codex: {\n readonly include: readonly string[]\n readonly exclude?: readonly string[]\n }\n readonly from_codex: {\n readonly include: readonly string[]\n readonly exclude?: readonly string[]\n }\n }\n}\n\n/**\n * Sync pattern presets\n *\n * Available presets for common sync configurations.\n * The `from_codex` patterns use `{org}` and `{codex_repo}` placeholders\n * that must be substituted with actual values when generating config.\n */\nexport const SYNC_PATTERN_PRESETS: Record<string, SyncPreset> = {\n standard: {\n name: 'standard',\n description: 'Standard configuration with docs, README, and CLAUDE.md',\n config: {\n to_codex: {\n include: ['docs/**', 'README.md', 'CLAUDE.md'],\n exclude: ['*.tmp', '_archive/**'],\n },\n from_codex: {\n include: ['codex://{org}/{codex_repo}/docs/**'],\n exclude: ['_archive/**'],\n },\n },\n },\n minimal: {\n name: 'minimal',\n description: 'Minimal configuration with just docs and README',\n config: {\n to_codex: {\n include: ['docs/**', 'README.md'],\n },\n from_codex: {\n include: ['codex://{org}/{codex_repo}/docs/**'],\n },\n },\n },\n}\n\n/**\n * Default global exclude patterns\n *\n * Applied to all sync operations regardless of preset.\n * These patterns exclude common files that should never be synced.\n */\nexport const DEFAULT_GLOBAL_EXCLUDES = [\n '**/.git/**',\n '**/node_modules/**',\n '**/.env',\n '**/.env.*',\n '**/*.log',\n '**/dist/**',\n '**/build/**',\n '**/.DS_Store',\n '**/credentials.json',\n '**/*secret*',\n '**/*password*',\n] as const\n\n/**\n * Get a sync preset by name\n *\n * @param name - Preset name ('standard' or 'minimal')\n * @returns The preset or undefined if not found\n */\nexport function getSyncPreset(name: string): SyncPreset | undefined {\n return SYNC_PATTERN_PRESETS[name]\n}\n\n/**\n * Get all available preset names\n *\n * @returns Array of preset names\n */\nexport function getSyncPresetNames(): string[] {\n return Object.keys(SYNC_PATTERN_PRESETS)\n}\n\n/**\n * Substitute placeholders in sync patterns\n *\n * Replaces all occurrences of `{org}` and `{codex_repo}` with actual values.\n *\n * @param patterns - Patterns with placeholders\n * @param org - Organization name (must be non-empty)\n * @param codexRepo - Codex repository name (must be non-empty)\n * @returns Patterns with placeholders replaced\n * @throws ValidationError if org or codexRepo is empty\n */\nexport function substitutePatternPlaceholders(\n patterns: readonly string[],\n org: string,\n codexRepo: string\n): string[] {\n if (!org || typeof org !== 'string' || org.trim() === '') {\n throw new ValidationError('org must be a non-empty string')\n }\n if (!codexRepo || typeof codexRepo !== 'string' || codexRepo.trim() === '') {\n throw new ValidationError('codexRepo must be a non-empty string')\n }\n\n return patterns.map((pattern) =>\n pattern.replace(/\\{org\\}/g, org).replace(/\\{codex_repo\\}/g, codexRepo)\n )\n}\n\n/**\n * Options for generating sync config from preset\n */\nexport interface GenerateSyncConfigOptions {\n /**\n * Whether to include DEFAULT_GLOBAL_EXCLUDES in the generated config.\n * When true, global excludes are merged into to_codex.exclude.\n * @default false\n */\n includeGlobalExcludes?: boolean\n}\n\n/**\n * Generate a sync config from a preset with actual values\n *\n * @param presetName - Preset name\n * @param org - Organization name\n * @param codexRepo - Codex repository name\n * @param options - Generation options\n * @returns Sync config with placeholders substituted, or undefined if preset not found\n */\nexport function generateSyncConfigFromPreset(\n presetName: string,\n org: string,\n codexRepo: string,\n options?: GenerateSyncConfigOptions\n): SyncPresetConfig | undefined {\n const preset = getSyncPreset(presetName)\n if (!preset) {\n return undefined\n }\n\n // Build exclude list, optionally including global excludes\n let toCodexExclude: string[] | undefined\n if (options?.includeGlobalExcludes) {\n toCodexExclude = [\n ...(preset.config.to_codex.exclude || []),\n ...DEFAULT_GLOBAL_EXCLUDES,\n ]\n } else if (preset.config.to_codex.exclude) {\n toCodexExclude = [...preset.config.to_codex.exclude]\n }\n\n return {\n to_codex: {\n include: [...preset.config.to_codex.include],\n exclude: toCodexExclude,\n },\n from_codex: {\n include: substitutePatternPlaceholders(\n preset.config.from_codex.include,\n org,\n codexRepo\n ),\n exclude: preset.config.from_codex.exclude\n ? substitutePatternPlaceholders(\n preset.config.from_codex.exclude,\n org,\n codexRepo\n )\n : undefined,\n },\n }\n}\n","/**\n * ConfigManager - Centralized configuration management for Codex\n *\n * Provides three distinct configuration operations:\n * - initializeCodexSection: Add codex section to existing base config (created by @fractary/core)\n * - updateCodexSection: Update fields in existing codex section\n * - validateCodexConfig: Validate codex configuration (read-only)\n *\n * Shared infrastructure (config I/O, org detection, name validation, directory management)\n * is imported from @fractary/core. Codex-specific logic (repo discovery, MCP installation,\n * sync presets) lives here.\n */\n\nimport * as fs from 'fs/promises'\nimport * as path from 'path'\nimport { ValidationError } from '../../errors/index.js'\nimport { CONFIG_SCHEMA_VERSION, generateSyncConfigFromPreset, type SyncPresetConfig } from './sync-presets.js'\n\n// ===== Shared Infrastructure Types =====\n// These types are shared across plugins. They will migrate to @fractary/core\n// as core's config module matures. For now they remain here for compatibility.\n\n/**\n * Organization/repository name validation result\n */\nexport interface NameValidationResult {\n valid: boolean\n error?: string\n}\n\n/**\n * Directory structure creation result\n */\nexport interface DirectoryStructureResult {\n created: string[]\n alreadyExisted: string[]\n}\n\n/**\n * Gitignore update result\n */\nexport interface GitignoreResult {\n created: boolean\n updated: boolean\n alreadyIgnored: boolean\n path: string\n}\n\n/**\n * Remote repository configuration\n */\nexport interface RemoteConfig {\n token?: string\n}\n\n/**\n * File source configuration for file plugin\n */\nexport interface FileSourceConfig {\n type: 's3' | 'r2' | 'gcs' | 'local'\n bucket?: string\n prefix?: string\n region?: string\n local: {\n base_path: string\n }\n push?: {\n compress?: boolean\n keep_local?: boolean\n }\n auth?: {\n profile?: string\n }\n}\n\n/**\n * File plugin configuration section\n */\nexport interface FilePluginConfig {\n schema_version: string\n sources: Record<string, FileSourceConfig>\n}\n\n/**\n * Unified configuration structure (base type - owned by @fractary/core)\n */\nexport interface UnifiedConfig {\n file?: FilePluginConfig\n codex?: CodexConfig\n [section: string]: unknown\n}\n\n// ===== Codex-Specific Types =====\n\n/**\n * Codex plugin configuration section\n */\nexport interface CodexConfig {\n schema_version: string\n organization: string\n project: string\n codex_repo: string\n sync?: SyncPresetConfig\n remotes?: Record<string, RemoteConfig>\n}\n\n/**\n * Result of codex repository discovery\n */\nexport interface DiscoverCodexRepoResult {\n repo: string | null\n error?: 'gh_not_installed' | 'auth_failed' | 'org_not_found' | 'no_repos_found' | 'unknown'\n message?: string\n}\n\n/**\n * MCP server installation result\n */\nexport interface McpInstallResult {\n installed: boolean\n migrated: boolean\n alreadyInstalled: boolean\n backupPath?: string\n}\n\n// ===== Codex Config Initialize =====\n\n/**\n * Options for initializing the codex section in an existing config\n */\nexport interface CodexInitOptions {\n /** Organization name */\n organization: string\n /** Project name */\n project: string\n /** Codex repository name (e.g., codex.fractary.com) */\n codexRepo: string\n /** Sync preset name ('standard', 'minimal') */\n syncPreset?: string\n /** Force overwrite existing codex section */\n force?: boolean\n /** Skip MCP server installation */\n skipMcp?: boolean\n}\n\n/**\n * Result of codex section initialization\n */\nexport interface CodexInitResult {\n configPath: string\n codexSectionCreated: boolean\n directories: DirectoryStructureResult\n gitignore: GitignoreResult\n mcp?: McpInstallResult\n}\n\n// ===== Codex Config Update =====\n\n/**\n * Options for updating the codex section (all fields optional - only specified fields are updated)\n */\nexport interface CodexUpdateOptions {\n /** Organization name */\n organization?: string\n /** Project name */\n project?: string\n /** Codex repository name */\n codexRepo?: string\n /** Sync preset name */\n syncPreset?: string\n /** Skip MCP server update */\n skipMcp?: boolean\n}\n\n/**\n * Result of codex section update\n */\nexport interface CodexUpdateResult {\n configPath: string\n fieldsUpdated: string[]\n mcp?: McpInstallResult\n}\n\n// ===== Codex Config Validate =====\n\n/**\n * A single validation issue\n */\nexport interface ValidationIssue {\n field: string\n message: string\n severity: 'error' | 'warning'\n}\n\n/**\n * Result of codex configuration validation\n */\nexport interface CodexValidateResult {\n valid: boolean\n configPath: string\n errors: ValidationIssue[]\n warnings: ValidationIssue[]\n}\n\n// ===== Deprecated Types (backward compatibility) =====\n\n/**\n * @deprecated Use CodexInitOptions instead\n */\nexport interface ConfigInitOptions {\n organization: string\n project: string\n codexRepo: string\n syncPreset?: string\n force?: boolean\n skipMcp?: boolean\n includeFilePlugin?: boolean\n}\n\n/**\n * @deprecated Use CodexInitResult instead\n */\nexport interface ConfigInitResult {\n configPath: string\n configCreated: boolean\n configMerged: boolean\n directories: DirectoryStructureResult\n gitignore: GitignoreResult\n mcp?: McpInstallResult\n}\n\n// ===== Shared Infrastructure Functions =====\n// These will migrate to @fractary/core. Codex SDK re-exports them for compatibility.\n\n/**\n * Validate organization or repository name format\n */\nexport function validateNameFormat(name: string, type: 'organization' | 'repository'): NameValidationResult {\n if (!name || typeof name !== 'string') {\n return { valid: false, error: `${type} name is required` }\n }\n\n if (name.length > 100) {\n return { valid: false, error: `${type} name too long (max 100 characters)` }\n }\n\n const safePattern = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/\n if (!safePattern.test(name)) {\n return {\n valid: false,\n error: `Invalid ${type} name format: \"${name}\". Must start with alphanumeric and contain only: a-z, A-Z, 0-9, ., -, _`,\n }\n }\n\n return { valid: true }\n}\n\nexport function validateOrganizationName(name: string): void {\n const result = validateNameFormat(name, 'organization')\n if (!result.valid) {\n throw new ValidationError(result.error!)\n }\n}\n\nexport function validateRepositoryName(name: string): void {\n const result = validateNameFormat(name, 'repository')\n if (!result.valid) {\n throw new ValidationError(result.error!)\n }\n}\n\nexport async function detectOrganizationFromGit(projectRoot: string): Promise<string | null> {\n try {\n const { spawnSync } = await import('child_process')\n const result = spawnSync('git', ['remote', 'get-url', 'origin'], {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: 'pipe',\n })\n\n if (result.error || result.status !== 0) {\n return null\n }\n\n const remote = (result.stdout || '').trim()\n const sshMatch = remote.match(/git@github\\.com:([^/]+)\\//)\n const httpsMatch = remote.match(/github\\.com\\/([^/]+)\\//)\n const org = sshMatch?.[1] || httpsMatch?.[1] || null\n\n if (org) {\n const validation = validateNameFormat(org, 'organization')\n if (!validation.valid) {\n return null\n }\n }\n\n return org\n } catch {\n return null\n }\n}\n\nexport function detectProjectName(projectRoot: string): string {\n return path.basename(projectRoot)\n}\n\n// ===== Directory Structure =====\n\n/**\n * Standard directories created by @fractary/core\n */\nexport const STANDARD_DIRECTORIES = [\n '.fractary',\n '.fractary/specs',\n '.fractary/logs',\n '.fractary/codex',\n '.fractary/codex/cache',\n] as const\n\n/**\n * Codex-specific directories (subset of STANDARD_DIRECTORIES)\n */\nexport const CODEX_DIRECTORIES = [\n '.fractary/codex',\n '.fractary/codex/cache',\n] as const\n\nexport async function ensureDirectoryStructure(\n projectRoot: string,\n directories: readonly string[] = STANDARD_DIRECTORIES\n): Promise<DirectoryStructureResult> {\n const created: string[] = []\n const alreadyExisted: string[] = []\n\n for (const dir of directories) {\n const fullPath = path.join(projectRoot, dir)\n try {\n await fs.access(fullPath)\n alreadyExisted.push(dir)\n } catch {\n await fs.mkdir(fullPath, { recursive: true })\n created.push(dir)\n }\n }\n\n return { created, alreadyExisted }\n}\n\n// ===== Gitignore Management =====\n\nexport const DEFAULT_FRACTARY_GITIGNORE = `# .fractary/.gitignore\n# This file is managed by multiple plugins - each plugin manages its own section\n\n# ===== fractary-codex (managed) =====\ncodex/cache/\n# ===== end fractary-codex =====\n`\n\nexport function normalizeCachePath(cachePath: string): string {\n let normalized = cachePath.replace(/\\\\/g, '/')\n normalized = normalized.replace(/^\\.fractary\\//, '')\n if (!normalized.endsWith('/')) {\n normalized += '/'\n }\n return normalized\n}\n\nexport async function ensureCachePathIgnored(\n projectRoot: string,\n cachePath: string = '.fractary/codex/cache'\n): Promise<GitignoreResult> {\n const gitignorePath = path.join(projectRoot, '.fractary', '.gitignore')\n\n let relativeCachePath = cachePath\n if (path.isAbsolute(cachePath)) {\n relativeCachePath = path.relative(path.join(projectRoot, '.fractary'), cachePath)\n }\n\n const normalizedForValidation = path.normalize(relativeCachePath)\n if (normalizedForValidation.startsWith('..') || path.isAbsolute(normalizedForValidation)) {\n throw new ValidationError('Cache path must be within .fractary directory')\n }\n\n relativeCachePath = normalizeCachePath(relativeCachePath)\n\n let content: string | null = null\n try {\n content = await fs.readFile(gitignorePath, 'utf-8')\n } catch (error: any) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n if (content === null) {\n await fs.mkdir(path.join(projectRoot, '.fractary'), { recursive: true })\n await fs.writeFile(gitignorePath, DEFAULT_FRACTARY_GITIGNORE, 'utf-8')\n return {\n created: true,\n updated: false,\n alreadyIgnored: false,\n path: gitignorePath,\n }\n }\n\n const lines = content.split('\\n').map((l) => l.trim())\n const isIgnored = lines.some((line) => {\n if (line.startsWith('#') || line === '') return false\n let normalizedLine = line.replace(/\\\\/g, '/')\n if (!normalizedLine.endsWith('/')) {\n normalizedLine += '/'\n }\n return normalizedLine === relativeCachePath\n })\n\n if (isIgnored) {\n return {\n created: false,\n updated: false,\n alreadyIgnored: true,\n path: gitignorePath,\n }\n }\n\n const newContent = content.trimEnd() + `\\n${relativeCachePath}\\n`\n await fs.writeFile(gitignorePath, newContent, 'utf-8')\n\n return {\n created: false,\n updated: true,\n alreadyIgnored: false,\n path: gitignorePath,\n }\n}\n\n// ===== Codex-Specific: MCP Server Installation =====\n\nexport async function installMcpServer(\n projectRoot: string,\n configPath: string = '.fractary/config.yaml',\n options: { backup?: boolean } = {}\n): Promise<McpInstallResult> {\n const mcpJsonPath = path.join(projectRoot, '.mcp.json')\n const { backup = false } = options\n\n let existingConfig: Record<string, unknown> = { mcpServers: {} }\n let backupPath: string | undefined\n let migrated = false\n\n try {\n const content = await fs.readFile(mcpJsonPath, 'utf-8')\n existingConfig = JSON.parse(content)\n\n if (backup) {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '').slice(0, 18)\n const suffix = Math.random().toString(36).substring(2, 6)\n backupPath = `${mcpJsonPath}.backup.${timestamp}-${suffix}`\n await fs.writeFile(backupPath, content)\n }\n } catch (error: any) {\n if (error.code !== 'ENOENT') {\n existingConfig = { mcpServers: {} }\n }\n }\n\n const mcpServers = (existingConfig.mcpServers || {}) as Record<string, { command?: string; args?: string[] }>\n\n const existing = mcpServers['fractary-codex']\n if (existing) {\n const existingCommand = existing.command\n const existingArgs = existing.args || []\n\n if (existingCommand === 'npx' && existingArgs.includes('@fractary/codex-mcp')) {\n return {\n installed: false,\n migrated: false,\n alreadyInstalled: true,\n backupPath,\n }\n }\n\n if (existingCommand === 'node' || existingArgs.includes('@fractary/codex')) {\n migrated = true\n }\n }\n\n mcpServers['fractary-codex'] = {\n command: 'npx',\n args: ['-y', '@fractary/codex-mcp', '--config', configPath],\n }\n\n existingConfig.mcpServers = mcpServers\n\n await fs.writeFile(mcpJsonPath, JSON.stringify(existingConfig, null, 2) + '\\n')\n\n return {\n installed: true,\n migrated,\n alreadyInstalled: false,\n backupPath,\n }\n}\n\n// ===== Codex-Specific: Codex Repository Discovery =====\n\nexport async function discoverCodexRepo(org: string): Promise<DiscoverCodexRepoResult> {\n const validation = validateNameFormat(org, 'organization')\n if (!validation.valid) {\n return { repo: null, error: 'unknown', message: validation.error }\n }\n\n try {\n const { spawnSync } = await import('child_process')\n\n const ghVersion = spawnSync('gh', ['--version'], { encoding: 'utf-8', stdio: 'pipe' })\n if (ghVersion.error || ghVersion.status !== 0) {\n return {\n repo: null,\n error: 'gh_not_installed',\n message: 'GitHub CLI (gh) is not installed. Install from https://cli.github.com/',\n }\n }\n\n const authStatus = spawnSync('gh', ['auth', 'status'], { encoding: 'utf-8', stdio: 'pipe' })\n if (authStatus.error || authStatus.status !== 0) {\n return {\n repo: null,\n error: 'auth_failed',\n message: 'GitHub CLI not authenticated. Run: gh auth login',\n }\n }\n\n const listResult = spawnSync(\n 'gh',\n ['repo', 'list', org, '--json', 'name', '--jq', '.[].name | select(startswith(\"codex.\"))'],\n { encoding: 'utf-8', stdio: 'pipe' }\n )\n\n if (listResult.error) {\n return {\n repo: null,\n error: 'unknown',\n message: listResult.error.message,\n }\n }\n\n const output = (listResult.stdout || '').trim()\n const stderr = (listResult.stderr || '').trim()\n\n if (stderr.includes('Could not resolve to an Organization') || stderr.includes('Not Found')) {\n return {\n repo: null,\n error: 'org_not_found',\n message: `Organization '${org}' not found on GitHub`,\n }\n }\n\n const repos = output.split('\\n').filter(Boolean)\n if (repos.length === 0) {\n return {\n repo: null,\n error: 'no_repos_found',\n message: `No codex.* repositories found in organization '${org}'`,\n }\n }\n\n return { repo: repos[0] ?? null }\n } catch (error: any) {\n return {\n repo: null,\n error: 'unknown',\n message: error.message || 'Unknown error during discovery',\n }\n }\n}\n\n// ===== Codex-Specific: Configuration Generation =====\n\nexport function sanitizeForS3BucketName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/^-+|-+$/g, '')\n .replace(/-+/g, '-')\n .substring(0, 63)\n}\n\n/**\n * Generate just the codex section of the unified config\n */\nexport function generateCodexSection(\n organization: string,\n project: string,\n codexRepo: string,\n options?: { syncPreset?: string }\n): CodexConfig {\n const syncPreset = options?.syncPreset || 'standard'\n\n const codexConfig: CodexConfig = {\n schema_version: CONFIG_SCHEMA_VERSION,\n organization,\n project,\n codex_repo: codexRepo,\n remotes: {\n [`${organization}/${codexRepo}`]: {\n token: '${GITHUB_TOKEN}',\n },\n },\n }\n\n const syncConfig = generateSyncConfigFromPreset(syncPreset, organization, codexRepo)\n if (syncConfig) {\n codexConfig.sync = syncConfig\n }\n\n return codexConfig\n}\n\n/**\n * @deprecated Use generateCodexSection() for codex-only config generation.\n * Base config creation should be handled by @fractary/core.\n */\nexport function generateUnifiedConfig(\n organization: string,\n project: string,\n codexRepo: string,\n options?: {\n syncPreset?: string\n includeFilePlugin?: boolean\n }\n): UnifiedConfig {\n const sanitizedProject = sanitizeForS3BucketName(project)\n const config: UnifiedConfig = {}\n\n if (options?.includeFilePlugin !== false) {\n config.file = {\n schema_version: CONFIG_SCHEMA_VERSION,\n sources: {\n specs: {\n type: 's3',\n bucket: `${sanitizedProject}-files`,\n prefix: 'specs/',\n region: 'us-east-1',\n local: { base_path: '.fractary/specs' },\n push: { compress: false, keep_local: true },\n auth: { profile: 'default' },\n },\n logs: {\n type: 's3',\n bucket: `${sanitizedProject}-files`,\n prefix: 'logs/',\n region: 'us-east-1',\n local: { base_path: '.fractary/logs' },\n push: { compress: true, keep_local: true },\n auth: { profile: 'default' },\n },\n },\n }\n }\n\n config.codex = generateCodexSection(organization, project, codexRepo, {\n syncPreset: options?.syncPreset,\n })\n\n return config\n}\n\n// ===== Config I/O =====\n// These are shared infrastructure that will migrate to @fractary/core.\n\nexport async function readUnifiedConfig(configPath: string): Promise<UnifiedConfig | null> {\n try {\n const content = await fs.readFile(configPath, 'utf-8')\n const yaml = await import('js-yaml')\n return yaml.load(content) as UnifiedConfig\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return null\n }\n throw error\n }\n}\n\nexport async function writeUnifiedConfig(config: UnifiedConfig, outputPath: string): Promise<void> {\n const dir = path.dirname(outputPath)\n await fs.mkdir(dir, { recursive: true })\n\n const yaml = await import('js-yaml')\n\n const yamlContent = yaml.dump(config, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n sortKeys: false,\n })\n\n await fs.writeFile(outputPath, yamlContent, 'utf-8')\n}\n\nexport function mergeUnifiedConfigs(existing: UnifiedConfig, updates: UnifiedConfig): UnifiedConfig {\n const merged: UnifiedConfig = {}\n\n if (updates.file || existing.file) {\n merged.file = {\n schema_version: updates.file?.schema_version || existing.file?.schema_version || CONFIG_SCHEMA_VERSION,\n sources: {\n ...(existing.file?.sources || {}),\n ...(updates.file?.sources || {}),\n },\n }\n }\n\n if (updates.codex || existing.codex) {\n merged.codex = {\n schema_version: updates.codex?.schema_version || existing.codex?.schema_version || CONFIG_SCHEMA_VERSION,\n organization: updates.codex?.organization || existing.codex?.organization || 'default',\n project: updates.codex?.project || existing.codex?.project || 'default',\n codex_repo: updates.codex?.codex_repo || existing.codex?.codex_repo || '',\n sync: updates.codex?.sync || existing.codex?.sync,\n remotes: {\n ...(existing.codex?.remotes || {}),\n ...(updates.codex?.remotes || {}),\n },\n }\n }\n\n return merged\n}\n\n// ===== Main ConfigManager Class =====\n\n/**\n * ConfigManager - Codex configuration management\n *\n * Three distinct operations:\n * - initializeCodexSection(): Add codex section to base config (requires config created by @fractary/core)\n * - updateCodexSection(): Update existing codex section fields\n * - validateCodexConfig(): Validate codex configuration (read-only)\n */\nexport class ConfigManager {\n private projectRoot: string\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot\n }\n\n getProjectRoot(): string {\n return this.projectRoot\n }\n\n getConfigPath(): string {\n return path.join(this.projectRoot, '.fractary', 'config.yaml')\n }\n\n async detectOrganization(): Promise<string | null> {\n return detectOrganizationFromGit(this.projectRoot)\n }\n\n detectProject(): string {\n return detectProjectName(this.projectRoot)\n }\n\n async discoverCodexRepo(org: string): Promise<DiscoverCodexRepoResult> {\n return discoverCodexRepo(org)\n }\n\n async readConfig(): Promise<UnifiedConfig | null> {\n return readUnifiedConfig(this.getConfigPath())\n }\n\n async writeConfig(config: UnifiedConfig): Promise<void> {\n return writeUnifiedConfig(config, this.getConfigPath())\n }\n\n async configExists(): Promise<boolean> {\n try {\n await fs.access(this.getConfigPath())\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Check if the codex section exists in the current config\n */\n async codexSectionExists(): Promise<boolean> {\n const config = await this.readConfig()\n return config !== null && config.codex !== undefined\n }\n\n // ===== Initialize: Add codex section to existing base config =====\n\n /**\n * Initialize the codex section in an existing unified config.\n *\n * Requires .fractary/config.yaml to already exist (created by @fractary/core's config-init).\n * Creates codex-specific directories, gitignore entries, and MCP server configuration.\n *\n * @param options - Initialization options\n * @returns Initialization result\n * @throws ValidationError if base config doesn't exist or codex section already exists (without --force)\n */\n async initializeCodexSection(options: CodexInitOptions): Promise<CodexInitResult> {\n validateOrganizationName(options.organization)\n validateRepositoryName(options.codexRepo)\n\n const configPath = this.getConfigPath()\n const existingConfig = await readUnifiedConfig(configPath)\n\n if (!existingConfig) {\n throw new ValidationError(\n 'Base configuration not found at .fractary/config.yaml. ' +\n 'Run fractary config-initialize first to create the base configuration.'\n )\n }\n\n if (existingConfig.codex && !options.force) {\n throw new ValidationError(\n 'Codex section already exists in .fractary/config.yaml. ' +\n 'Use --force to overwrite, or use config-update to modify specific fields.'\n )\n }\n\n // Create codex-specific directories only\n const directories = await ensureDirectoryStructure(this.projectRoot, CODEX_DIRECTORIES)\n\n // Setup gitignore for codex cache\n const gitignore = await ensureCachePathIgnored(this.projectRoot)\n\n // Generate and add codex section\n const codexSection = generateCodexSection(\n options.organization,\n options.project,\n options.codexRepo,\n { syncPreset: options.syncPreset }\n )\n\n const updatedConfig = { ...existingConfig, codex: codexSection }\n await writeUnifiedConfig(updatedConfig, configPath)\n\n // Install MCP server\n let mcp: McpInstallResult | undefined\n if (!options.skipMcp) {\n mcp = await installMcpServer(this.projectRoot, '.fractary/config.yaml')\n }\n\n return {\n configPath,\n codexSectionCreated: true,\n directories,\n gitignore,\n mcp,\n }\n }\n\n // ===== Update: Modify existing codex section =====\n\n /**\n * Update specific fields in the existing codex section.\n *\n * Requires codex section to already exist. Only updates the fields that are provided.\n *\n * @param options - Fields to update (only non-undefined fields are applied)\n * @returns Update result with list of updated fields\n * @throws ValidationError if config or codex section doesn't exist\n */\n async updateCodexSection(options: CodexUpdateOptions): Promise<CodexUpdateResult> {\n const configPath = this.getConfigPath()\n const existingConfig = await readUnifiedConfig(configPath)\n\n if (!existingConfig) {\n throw new ValidationError(\n 'Configuration not found at .fractary/config.yaml. ' +\n 'Run config-init first.'\n )\n }\n\n if (!existingConfig.codex) {\n throw new ValidationError(\n 'Codex section not found in .fractary/config.yaml. ' +\n 'Run config-init first to create the codex configuration.'\n )\n }\n\n const codex = { ...existingConfig.codex }\n const fieldsUpdated: string[] = []\n\n if (options.organization !== undefined) {\n validateOrganizationName(options.organization)\n codex.organization = options.organization\n fieldsUpdated.push('organization')\n }\n\n if (options.project !== undefined) {\n codex.project = options.project\n fieldsUpdated.push('project')\n }\n\n if (options.codexRepo !== undefined) {\n validateRepositoryName(options.codexRepo)\n codex.codex_repo = options.codexRepo\n fieldsUpdated.push('codex_repo')\n }\n\n if (options.syncPreset !== undefined) {\n const syncConfig = generateSyncConfigFromPreset(\n options.syncPreset,\n codex.organization,\n codex.codex_repo\n )\n if (syncConfig) {\n codex.sync = syncConfig\n fieldsUpdated.push('sync')\n }\n }\n\n // Rebuild remotes if org or repo changed\n if (options.organization !== undefined || options.codexRepo !== undefined) {\n codex.remotes = {\n [`${codex.organization}/${codex.codex_repo}`]: {\n token: '${GITHUB_TOKEN}',\n },\n }\n if (!fieldsUpdated.includes('remotes')) {\n fieldsUpdated.push('remotes')\n }\n }\n\n const updatedConfig = { ...existingConfig, codex }\n await writeUnifiedConfig(updatedConfig, configPath)\n\n // Update MCP server if needed\n let mcp: McpInstallResult | undefined\n if (!options.skipMcp) {\n mcp = await installMcpServer(this.projectRoot, '.fractary/config.yaml')\n }\n\n return {\n configPath,\n fieldsUpdated,\n mcp,\n }\n }\n\n // ===== Validate: Check codex configuration (read-only) =====\n\n /**\n * Validate the codex configuration.\n *\n * Read-only operation that checks config structure, field formats,\n * directory existence, and MCP server configuration.\n *\n * @returns Validation result with errors and warnings\n */\n async validateCodexConfig(): Promise<CodexValidateResult> {\n const configPath = this.getConfigPath()\n const errors: ValidationIssue[] = []\n const warnings: ValidationIssue[] = []\n\n // Check base config exists\n const config = await readUnifiedConfig(configPath)\n if (!config) {\n errors.push({\n field: 'config',\n message: 'Configuration file not found at .fractary/config.yaml',\n severity: 'error',\n })\n return { valid: false, configPath, errors, warnings }\n }\n\n // Check codex section exists\n if (!config.codex) {\n errors.push({\n field: 'codex',\n message: 'Codex section not found in configuration',\n severity: 'error',\n })\n return { valid: false, configPath, errors, warnings }\n }\n\n const codex = config.codex\n\n // Validate schema version\n if (!codex.schema_version) {\n warnings.push({\n field: 'codex.schema_version',\n message: 'Missing schema_version field',\n severity: 'warning',\n })\n }\n\n // Validate organization\n if (!codex.organization) {\n errors.push({\n field: 'codex.organization',\n message: 'Organization is required',\n severity: 'error',\n })\n } else {\n const orgValidation = validateNameFormat(codex.organization, 'organization')\n if (!orgValidation.valid) {\n errors.push({\n field: 'codex.organization',\n message: orgValidation.error!,\n severity: 'error',\n })\n }\n }\n\n // Validate project\n if (!codex.project) {\n errors.push({\n field: 'codex.project',\n message: 'Project name is required',\n severity: 'error',\n })\n }\n\n // Validate codex_repo\n if (!codex.codex_repo) {\n errors.push({\n field: 'codex.codex_repo',\n message: 'Codex repository name is required',\n severity: 'error',\n })\n } else {\n const repoValidation = validateNameFormat(codex.codex_repo, 'repository')\n if (!repoValidation.valid) {\n errors.push({\n field: 'codex.codex_repo',\n message: repoValidation.error!,\n severity: 'error',\n })\n }\n }\n\n // Validate sync preset names\n if (codex.sync) {\n if (!codex.sync.to_codex?.include?.length) {\n warnings.push({\n field: 'codex.sync.to_codex.include',\n message: 'No to_codex include patterns configured',\n severity: 'warning',\n })\n }\n if (!codex.sync.from_codex?.include?.length) {\n warnings.push({\n field: 'codex.sync.from_codex.include',\n message: 'No from_codex include patterns configured',\n severity: 'warning',\n })\n }\n } else {\n warnings.push({\n field: 'codex.sync',\n message: 'No sync configuration found',\n severity: 'warning',\n })\n }\n\n // Check codex directories exist\n for (const dir of CODEX_DIRECTORIES) {\n const fullPath = path.join(this.projectRoot, dir)\n try {\n await fs.access(fullPath)\n } catch {\n warnings.push({\n field: `directory:${dir}`,\n message: `Directory ${dir} does not exist`,\n severity: 'warning',\n })\n }\n }\n\n // Check MCP server configuration\n const mcpJsonPath = path.join(this.projectRoot, '.mcp.json')\n try {\n const mcpContent = await fs.readFile(mcpJsonPath, 'utf-8')\n const mcpConfig = JSON.parse(mcpContent)\n const mcpServers = mcpConfig.mcpServers || {}\n if (!mcpServers['fractary-codex']) {\n warnings.push({\n field: 'mcp',\n message: 'MCP server fractary-codex not configured in .mcp.json',\n severity: 'warning',\n })\n }\n } catch {\n warnings.push({\n field: 'mcp',\n message: '.mcp.json not found or invalid',\n severity: 'warning',\n })\n }\n\n // Check gitignore\n const gitignorePath = path.join(this.projectRoot, '.fractary', '.gitignore')\n try {\n const gitignoreContent = await fs.readFile(gitignorePath, 'utf-8')\n if (!gitignoreContent.includes('codex/cache')) {\n warnings.push({\n field: 'gitignore',\n message: 'Codex cache directory not in .fractary/.gitignore',\n severity: 'warning',\n })\n }\n } catch {\n warnings.push({\n field: 'gitignore',\n message: '.fractary/.gitignore not found',\n severity: 'warning',\n })\n }\n\n return {\n valid: errors.length === 0,\n configPath,\n errors,\n warnings,\n }\n }\n\n // ===== Deprecated: Old monolithic initialize =====\n\n /**\n * @deprecated Use initializeCodexSection() instead. This method handles both\n * initialization and update in a single call, which conflates two distinct operations.\n */\n async initialize(options: ConfigInitOptions): Promise<ConfigInitResult> {\n validateOrganizationName(options.organization)\n validateRepositoryName(options.codexRepo)\n\n const configPath = this.getConfigPath()\n const directories = await ensureDirectoryStructure(this.projectRoot)\n const gitignore = await ensureCachePathIgnored(this.projectRoot)\n const existingConfig = await readUnifiedConfig(configPath)\n\n let configCreated = false\n let configMerged = false\n\n if (existingConfig && !options.force) {\n const newConfig = generateUnifiedConfig(options.organization, options.project, options.codexRepo, {\n syncPreset: options.syncPreset,\n includeFilePlugin: options.includeFilePlugin,\n })\n const merged = mergeUnifiedConfigs(existingConfig, newConfig)\n await writeUnifiedConfig(merged, configPath)\n configMerged = true\n } else {\n const config = generateUnifiedConfig(options.organization, options.project, options.codexRepo, {\n syncPreset: options.syncPreset,\n includeFilePlugin: options.includeFilePlugin,\n })\n await writeUnifiedConfig(config, configPath)\n configCreated = true\n }\n\n let mcp: McpInstallResult | undefined\n if (!options.skipMcp) {\n mcp = await installMcpServer(this.projectRoot, '.fractary/config.yaml')\n }\n\n return {\n configPath,\n configCreated,\n configMerged,\n directories,\n gitignore,\n mcp,\n }\n }\n}\n\nexport function createConfigManager(projectRoot: string = process.cwd()): ConfigManager {\n return new ConfigManager(projectRoot)\n}\n","import type { Metadata } from '../../schemas/metadata.js'\nimport type { SyncRules, AutoSyncPattern } from '../../schemas/config.js'\nimport { matchPattern, evaluatePatterns } from '../patterns/matcher.js'\nimport { getDefaultRules } from '../config/defaults.js'\n\nexport interface ShouldSyncOptions {\n filePath: string // Path to file being evaluated\n fileMetadata: Metadata // Parsed frontmatter from file\n targetRepo: string // Repository to sync to\n sourceRepo: string // Repository file is from\n rules?: SyncRules // Optional routing rules (defaults applied)\n}\n\n/**\n * Determine if a file should be synced to a target repository\n *\n * Based on SPEC-00004: Routing & Distribution\n *\n * @param options - Evaluation options\n * @returns true if file should sync to targetRepo\n */\nexport function shouldSyncToRepo(options: ShouldSyncOptions): boolean {\n const {\n filePath,\n fileMetadata,\n targetRepo,\n sourceRepo,\n rules = getDefaultRules(),\n } = options\n\n // 1. Check special rules first\n const specialRuleResult = evaluateSpecialRules({\n filePath,\n targetRepo,\n sourceRepo,\n rules,\n })\n\n if (specialRuleResult !== null) {\n return specialRuleResult\n }\n\n // 2. Evaluate frontmatter rules\n return evaluateFrontmatterRules({\n metadata: fileMetadata,\n targetRepo,\n allowOverrides: rules.allowProjectOverrides ?? true,\n })\n}\n\n/**\n * Evaluate special routing rules\n *\n * Returns true/false if a special rule matches, null otherwise\n */\nfunction evaluateSpecialRules(options: {\n filePath: string\n targetRepo: string\n sourceRepo: string\n rules: SyncRules\n}): boolean | null {\n const { filePath, targetRepo, sourceRepo, rules } = options\n\n // Rule 1: Auto-sync patterns (highest priority)\n if (rules.autoSyncPatterns?.length) {\n const autoSyncResult = evaluateAutoSyncPatterns(\n filePath,\n targetRepo,\n rules.autoSyncPatterns\n )\n\n if (autoSyncResult !== null) {\n return autoSyncResult\n }\n }\n\n // Rule 2: Prevent self-sync\n if (rules.preventSelfSync) {\n const selfSyncResult = preventSelfSync(filePath, targetRepo, sourceRepo)\n\n if (selfSyncResult !== null) {\n return selfSyncResult\n }\n }\n\n // Rule 3: Prevent codex sync\n if (rules.preventCodexSync) {\n const codexSyncResult = preventCodexSync(targetRepo, sourceRepo)\n\n if (codexSyncResult !== null) {\n return codexSyncResult\n }\n }\n\n // No special rule applies\n return null\n}\n\n/**\n * Evaluate auto-sync patterns\n */\nfunction evaluateAutoSyncPatterns(\n filePath: string,\n targetRepo: string,\n patterns: AutoSyncPattern[]\n): boolean | null {\n for (const autoPattern of patterns) {\n // Check if file matches auto-sync pattern\n if (matchPattern(autoPattern.pattern, filePath)) {\n // File matches - evaluate repo include/exclude\n return evaluatePatterns({\n value: targetRepo,\n include: autoPattern.include,\n ...(autoPattern.exclude && { exclude: autoPattern.exclude }),\n })\n }\n }\n\n // No auto-sync pattern matched\n return null\n}\n\n/**\n * Prevent system files from syncing to their own repository\n */\nfunction preventSelfSync(\n filePath: string,\n targetRepo: string,\n _sourceRepo: string\n): boolean | null {\n // Extract system name from file path\n // Example: \".fractary/systems/api-gateway/docs/README.md\" → \"api-gateway\"\n const systemMatch = filePath.match(/systems\\/([^/]+)\\//)\n\n if (systemMatch && systemMatch[1]) {\n const systemName = systemMatch[1]\n\n if (systemName === targetRepo) {\n // Prevent: Don't sync system files to their own repo\n return false\n }\n }\n\n // Not a system file, or different system\n return null\n}\n\n/**\n * Prevent files from syncing back to the codex repository\n */\nfunction preventCodexSync(\n targetRepo: string,\n sourceRepo: string\n): boolean | null {\n // Detect if target is the codex repo\n const isCodexRepo =\n targetRepo === sourceRepo || targetRepo.startsWith('codex.')\n\n if (isCodexRepo) {\n return false\n }\n\n return null\n}\n\n/**\n * Evaluate frontmatter sync rules\n */\nfunction evaluateFrontmatterRules(options: {\n metadata: Metadata\n targetRepo: string\n allowOverrides: boolean\n}): boolean {\n const { metadata, targetRepo, allowOverrides } = options\n\n // If project overrides disabled, return false (no sync by default)\n if (!allowOverrides) {\n return false\n }\n\n const include = metadata.codex_sync_include || []\n const exclude = metadata.codex_sync_exclude || []\n\n // If no include rules, don't sync (must be explicit)\n if (include.length === 0) {\n return false\n }\n\n // Evaluate include/exclude patterns\n return evaluatePatterns({\n value: targetRepo,\n include,\n exclude,\n })\n}\n\n/**\n * Determine all repos that should receive a file\n *\n * @param options - Evaluation options\n * @returns Array of repository names that should receive this file\n */\nexport function getTargetRepos(options: {\n filePath: string\n fileMetadata: Metadata\n sourceRepo: string\n allRepos: string[]\n rules?: SyncRules\n}): string[] {\n const { filePath, fileMetadata, sourceRepo, allRepos, rules } = options\n\n return allRepos.filter(targetRepo =>\n shouldSyncToRepo({\n filePath,\n fileMetadata,\n targetRepo,\n sourceRepo,\n ...(rules && { rules }),\n })\n )\n}\n","import type { Metadata } from '../../schemas/metadata.js'\nimport { ValidationError } from '../../errors/ValidationError.js'\n\n/**\n * Represents a custom sync destination with repository and path\n */\nexport interface CustomSyncDestination {\n repo: string // Repository identifier (e.g., \"developers.fractary.com\")\n path: string // Target path within repository (e.g., \"src/content/docs/forge/\")\n}\n\n/**\n * Parse a custom destination string in format \"repo:path\"\n *\n * @param value - Custom destination string (e.g., \"developers.fractary.com:src/content/docs/forge/\")\n * @returns Parsed destination object\n * @throws ValidationError if format is invalid\n *\n * @example\n * ```typescript\n * const dest = parseCustomDestination('developers.fractary.com:src/content/docs/forge/')\n * // { repo: 'developers.fractary.com', path: 'src/content/docs/forge/' }\n * ```\n */\nexport function parseCustomDestination(value: string): CustomSyncDestination {\n if (typeof value !== 'string' || !value) {\n throw new ValidationError('Custom destination must be a non-empty string')\n }\n\n const colonIndex = value.indexOf(':')\n\n if (colonIndex === -1) {\n throw new ValidationError(\n `Invalid custom destination format: \"${value}\". Expected format: \"repo:path\"`\n )\n }\n\n const repo = value.substring(0, colonIndex).trim()\n const path = value.substring(colonIndex + 1).trim()\n\n if (!repo) {\n throw new ValidationError(\n `Invalid custom destination: repository name cannot be empty in \"${value}\"`\n )\n }\n\n if (!path) {\n throw new ValidationError(\n `Invalid custom destination: path cannot be empty in \"${value}\"`\n )\n }\n\n return { repo, path }\n}\n\n/**\n * Extract all custom sync destinations from metadata\n *\n * @param metadata - Parsed frontmatter metadata\n * @returns Array of custom sync destinations\n *\n * @example\n * ```typescript\n * const metadata = {\n * codex_sync_custom: [\n * 'developers.fractary.com:src/content/docs/forge/',\n * 'docs.example.com:api/'\n * ]\n * }\n *\n * const destinations = getCustomSyncDestinations(metadata)\n * // [\n * // { repo: 'developers.fractary.com', path: 'src/content/docs/forge/' },\n * // { repo: 'docs.example.com', path: 'api/' }\n * // ]\n * ```\n */\nexport function getCustomSyncDestinations(\n metadata: Metadata\n): CustomSyncDestination[] {\n const customDestinations = metadata.codex_sync_custom\n\n if (!customDestinations || !Array.isArray(customDestinations)) {\n return []\n }\n\n const results: CustomSyncDestination[] = []\n\n for (const destination of customDestinations) {\n try {\n const parsed = parseCustomDestination(destination)\n results.push(parsed)\n } catch (_error) {\n // Skip invalid destinations but preserve valid ones\n // Consumers can validate metadata if they want strict validation\n continue\n }\n }\n\n return results\n}\n","/**\n * Cache module\n *\n * Provides multi-tier caching with in-memory and disk persistence.\n * Implements stale-while-revalidate pattern for optimal performance.\n *\n * @example\n * ```typescript\n * import { createCacheManager, createStorageManager } from '@fractary/codex'\n *\n * const cache = createCacheManager({\n * cacheDir: '.fractary/plugins/codex/cache',\n * defaultTtl: 3600, // 1 hour\n * })\n *\n * const storage = createStorageManager()\n * cache.setStorageManager(storage)\n *\n * // Fetch with caching\n * const ref = resolveReference('codex://org/project/docs/api.md')\n * const result = await cache.get(ref)\n * ```\n */\n\n// Cache entry types and utilities\nexport {\n type CacheEntry,\n type CacheEntryMetadata,\n type CacheEntryStatus,\n type SerializedCacheEntry,\n createCacheEntry,\n getCacheEntryStatus,\n isCacheEntryValid,\n isCacheEntryFresh,\n touchCacheEntry,\n serializeCacheEntry,\n deserializeCacheEntry,\n getRemainingTtl,\n hasContentChanged,\n getCacheEntryAge,\n calculateContentHash,\n} from './entry.js'\n\n// Cache persistence layer\nexport {\n CachePersistence,\n createCachePersistence,\n type CachePersistenceOptions,\n type CacheStats,\n} from './persistence.js'\n\n// Cache manager\nexport {\n CacheManager,\n createCacheManager,\n getDefaultCacheManager,\n setDefaultCacheManager,\n STALE_WINDOW_MS,\n type CacheManagerConfig,\n type CacheLookupResult,\n type CacheEntryInfo,\n type ListEntriesOptions,\n type ListEntriesResult,\n} from './manager.js'\n","/**\n * Sync types\n *\n * Type definitions for the synchronization system.\n */\n\n/**\n * Sync direction\n */\nexport type SyncDirection = 'to-codex' | 'from-codex' | 'bidirectional'\n\n/**\n * Sync operation type\n */\nexport type SyncOperation = 'create' | 'update' | 'delete' | 'skip' | 'conflict'\n\n/**\n * File sync status\n */\nexport interface FileSyncStatus {\n /** File path relative to project root */\n path: string\n /** Operation to perform */\n operation: SyncOperation\n /** Size in bytes */\n size?: number\n /** Last modified timestamp */\n mtime?: number\n /** Content hash */\n hash?: string\n /** Reason for skip or conflict */\n reason?: string\n}\n\n/**\n * Sync manifest entry\n */\nexport interface SyncManifestEntry {\n /** File path */\n path: string\n /** Content hash */\n hash: string\n /** File size */\n size: number\n /** Last synced timestamp */\n syncedAt: number\n /** Source of last sync */\n source: 'local' | 'remote'\n}\n\n/**\n * Sync manifest\n *\n * Tracks the state of synced files.\n */\nexport interface SyncManifest {\n /** Manifest version */\n version: number\n /** Organization */\n org: string\n /** Project */\n project: string\n /** Last full sync timestamp */\n lastSync: number\n /** File entries */\n entries: Record<string, SyncManifestEntry>\n}\n\n/**\n * Sync plan\n *\n * A plan of operations to perform during sync.\n */\nexport interface SyncPlan {\n /** Direction of sync */\n direction: SyncDirection\n /** Source location */\n source: string\n /** Target location */\n target: string\n /** Files to sync */\n files: FileSyncStatus[]\n /** Total files to process */\n totalFiles: number\n /** Total bytes to transfer */\n totalBytes: number\n /** Estimated time in ms */\n estimatedTime?: number\n /** Conflicts that need resolution */\n conflicts: FileSyncStatus[]\n /** Files that will be skipped */\n skipped: FileSyncStatus[]\n}\n\n/**\n * Sync result\n */\nexport interface SyncResult {\n /** Whether sync completed successfully */\n success: boolean\n /** Plan that was executed */\n plan: SyncPlan\n /** Number of files synced */\n synced: number\n /** Number of files failed */\n failed: number\n /** Number of files skipped */\n skipped: number\n /** Errors encountered */\n errors: Array<{ path: string; error: string }>\n /** Duration in ms */\n duration: number\n /** Timestamp */\n timestamp: number\n}\n\n/**\n * Sync options\n */\nexport interface SyncOptions {\n /** Sync direction */\n direction?: SyncDirection\n /** Whether to perform a dry run */\n dryRun?: boolean\n /** Force overwrite on conflicts */\n force?: boolean\n /** Delete files not in source */\n delete?: boolean\n /** Patterns to include */\n include?: string[]\n /** Patterns to exclude */\n exclude?: string[]\n /** Maximum files to sync */\n maxFiles?: number\n /** Timeout in ms */\n timeout?: number\n /** Progress callback */\n onProgress?: (current: number, total: number, file: string) => void\n /**\n * Pre-matched source files (bypasses internal file scanning).\n * When provided, createPlan will use these files instead of scanning the sourceDir.\n * Useful when the caller has already performed glob matching.\n */\n sourceFiles?: Array<{ path: string; size: number; mtime: number; hash?: string }>\n}\n\n/**\n * Sync rule\n */\nexport interface SyncRule {\n /** Pattern to match */\n pattern: string\n /** Whether to include (true) or exclude (false) */\n include: boolean\n /** Priority (higher = evaluated first) */\n priority?: number\n /** Sync direction this rule applies to */\n direction?: SyncDirection\n}\n\n/**\n * Directional sync configuration (v0.7.0+)\n *\n * Provides explicit include/exclude patterns for a sync direction.\n */\nexport interface DirectionalSyncConfig {\n /** Patterns to include (required) */\n include: string[]\n /** Patterns to exclude (optional) */\n exclude?: string[]\n}\n\n/**\n * Routing configuration\n */\nexport interface RoutingConfig {\n /** Whether to use frontmatter-based routing (default: false in v0.7.0+) */\n use_frontmatter?: boolean\n}\n\n/**\n * Sync configuration\n */\nexport interface SyncConfig {\n /** Default sync direction */\n defaultDirection: SyncDirection\n /** Sync rules */\n rules: SyncRule[]\n /** Default patterns to exclude */\n defaultExcludes: string[]\n /** Whether to delete orphaned files */\n deleteOrphans: boolean\n /** Conflict resolution strategy */\n conflictStrategy: 'newest' | 'local' | 'remote' | 'manual'\n\n // New format (v0.7.0+) - Recommended\n /** Configuration for pulling from codex (new format) */\n from_codex?: DirectionalSyncConfig\n /** Configuration for pushing to codex (new format) */\n to_codex?: DirectionalSyncConfig\n /** Routing configuration */\n routing?: RoutingConfig\n\n // Legacy format (deprecated, backward compatible)\n /** @deprecated Use from_codex.include instead. Org-level defaults for pulling from codex */\n default_from_codex?: string[]\n /** @deprecated Use to_codex.include instead. Org-level defaults for pushing to codex */\n default_to_codex?: string[]\n /** @deprecated Use from_codex.exclude or to_codex.exclude instead. Global exclude patterns */\n exclude?: string[]\n}\n\n/**\n * Default sync configuration\n */\nexport const DEFAULT_SYNC_CONFIG: SyncConfig = {\n defaultDirection: 'to-codex',\n rules: [],\n defaultExcludes: [\n '**/node_modules/**',\n '**/.git/**',\n '**/.DS_Store',\n '**/Thumbs.db',\n '**/*.log',\n '**/.env*',\n '**/dist/**',\n '**/build/**',\n '**/coverage/**',\n ],\n deleteOrphans: false,\n conflictStrategy: 'newest',\n}\n","/**\n * Sync rule evaluator\n *\n * Evaluates sync rules to determine which files should be synced.\n */\n\nimport micromatch from 'micromatch'\nimport type { SyncRule, SyncDirection } from './types.js'\n\n/**\n * Evaluation result for a single file\n */\nexport interface EvaluationResult {\n /** File path */\n path: string\n /** Whether the file should be synced */\n shouldSync: boolean\n /** Matching rule (if any) */\n matchedRule?: SyncRule\n /** Reason for the decision */\n reason: string\n}\n\n/**\n * Evaluate a file path against sync rules\n *\n * @param path - File path to evaluate\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Evaluation result\n */\nexport function evaluatePath(\n path: string,\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): EvaluationResult {\n // First check default excludes\n for (const pattern of defaultExcludes) {\n if (micromatch.isMatch(path, pattern)) {\n return {\n path,\n shouldSync: false,\n reason: `Excluded by default pattern: ${pattern}`,\n }\n }\n }\n\n // Sort rules by priority (higher first)\n const sortedRules = [...rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n\n // Find first matching rule\n for (const rule of sortedRules) {\n // Skip rules that don't apply to this direction\n if (rule.direction && rule.direction !== direction) {\n continue\n }\n\n if (micromatch.isMatch(path, rule.pattern)) {\n return {\n path,\n shouldSync: rule.include,\n matchedRule: rule,\n reason: rule.include\n ? `Included by rule: ${rule.pattern}`\n : `Excluded by rule: ${rule.pattern}`,\n }\n }\n }\n\n // Default: include if no rule matches\n return {\n path,\n shouldSync: true,\n reason: 'No matching rule, included by default',\n }\n}\n\n/**\n * Evaluate multiple paths against sync rules\n *\n * @param paths - Array of file paths\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Map of path to evaluation result\n */\nexport function evaluatePaths(\n paths: string[],\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): Map<string, EvaluationResult> {\n const results = new Map<string, EvaluationResult>()\n\n for (const path of paths) {\n results.set(path, evaluatePath(path, rules, direction, defaultExcludes))\n }\n\n return results\n}\n\n/**\n * Filter paths to get only syncable files\n *\n * @param paths - Array of file paths\n * @param rules - Array of sync rules\n * @param direction - Current sync direction\n * @param defaultExcludes - Default exclude patterns\n * @returns Array of paths that should be synced\n */\nexport function filterSyncablePaths(\n paths: string[],\n rules: SyncRule[],\n direction: SyncDirection,\n defaultExcludes: string[] = []\n): string[] {\n return paths.filter(\n (path) => evaluatePath(path, rules, direction, defaultExcludes).shouldSync\n )\n}\n\n/**\n * Create sync rules from patterns\n *\n * @param include - Patterns to include\n * @param exclude - Patterns to exclude\n * @returns Array of sync rules\n */\nexport function createRulesFromPatterns(\n include: string[] = [],\n exclude: string[] = []\n): SyncRule[] {\n const rules: SyncRule[] = []\n\n // Add exclude rules with higher priority\n for (const pattern of exclude) {\n rules.push({\n pattern,\n include: false,\n priority: 100,\n })\n }\n\n // Add include rules\n for (const pattern of include) {\n rules.push({\n pattern,\n include: true,\n priority: 50,\n })\n }\n\n return rules\n}\n\n/**\n * Merge multiple sets of rules\n *\n * @param ruleSets - Arrays of rules to merge\n * @returns Merged rules array\n */\nexport function mergeRules(...ruleSets: SyncRule[][]): SyncRule[] {\n return ruleSets.flat()\n}\n\n/**\n * Get summary of evaluation results\n */\nexport interface EvaluationSummary {\n total: number\n included: number\n excluded: number\n byReason: Record<string, number>\n}\n\n/**\n * Summarize evaluation results\n *\n * @param results - Evaluation results map\n * @returns Summary of results\n */\nexport function summarizeEvaluations(\n results: Map<string, EvaluationResult>\n): EvaluationSummary {\n const summary: EvaluationSummary = {\n total: results.size,\n included: 0,\n excluded: 0,\n byReason: {},\n }\n\n for (const result of results.values()) {\n if (result.shouldSync) {\n summary.included++\n } else {\n summary.excluded++\n }\n\n summary.byReason[result.reason] = (summary.byReason[result.reason] ?? 0) + 1\n }\n\n return summary\n}\n\n/**\n * Validate sync rules\n *\n * @param rules - Rules to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateRules(rules: SyncRule[]): string[] {\n const errors: string[] = []\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i]\n if (!rule) continue\n\n // Check pattern is valid\n if (!rule.pattern || rule.pattern.trim() === '') {\n errors.push(`Rule ${i}: pattern is empty`)\n continue\n }\n\n // Check pattern is valid glob\n try {\n micromatch.isMatch('test', rule.pattern)\n } catch {\n errors.push(`Rule ${i}: invalid pattern \"${rule.pattern}\"`)\n }\n\n // Check direction is valid\n if (rule.direction && !['to-codex', 'from-codex', 'bidirectional'].includes(rule.direction)) {\n errors.push(`Rule ${i}: invalid direction \"${rule.direction}\"`)\n }\n }\n\n return errors\n}\n","/**\n * Sync planner\n *\n * Creates sync plans by comparing source and target file states.\n */\n\nimport type {\n SyncPlan,\n SyncOptions,\n SyncDirection,\n FileSyncStatus,\n SyncConfig,\n} from './types.js'\nimport { evaluatePath } from './evaluator.js'\n\n/**\n * File info for comparison\n */\nexport interface FileInfo {\n path: string\n size: number\n mtime: number\n hash?: string\n}\n\n/**\n * Create a sync plan by comparing source and target files\n *\n * @param sourceFiles - Files in the source\n * @param targetFiles - Files in the target\n * @param options - Sync options\n * @param config - Sync configuration\n * @returns Sync plan\n */\nexport function createSyncPlan(\n sourceFiles: FileInfo[],\n targetFiles: FileInfo[],\n options: SyncOptions,\n config: SyncConfig\n): SyncPlan {\n const direction = options.direction ?? config.defaultDirection\n const targetMap = new Map(targetFiles.map((f) => [f.path, f]))\n const sourceMap = new Map(sourceFiles.map((f) => [f.path, f]))\n\n const files: FileSyncStatus[] = []\n const conflicts: FileSyncStatus[] = []\n const skipped: FileSyncStatus[] = []\n\n // Build include/exclude rules\n const rules = [\n ...config.rules,\n ...(options.include ?? []).map((p) => ({ pattern: p, include: true, priority: 200 })),\n ...(options.exclude ?? []).map((p) => ({ pattern: p, include: false, priority: 200 })),\n ]\n\n const excludes = [...config.defaultExcludes]\n\n // Process source files\n for (const sourceFile of sourceFiles) {\n // Evaluate if file should be synced\n const evaluation = evaluatePath(sourceFile.path, rules, direction, excludes)\n\n if (!evaluation.shouldSync) {\n skipped.push({\n path: sourceFile.path,\n operation: 'skip',\n size: sourceFile.size,\n reason: evaluation.reason,\n })\n continue\n }\n\n const targetFile = targetMap.get(sourceFile.path)\n\n if (!targetFile) {\n // File doesn't exist in target - create it\n files.push({\n path: sourceFile.path,\n operation: 'create',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n } else {\n // File exists in both - check for changes\n const isDifferent = sourceFile.hash !== targetFile.hash\n\n if (isDifferent) {\n if (options.force) {\n // Force overwrite\n files.push({\n path: sourceFile.path,\n operation: 'update',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n } else if (targetFile.mtime > sourceFile.mtime) {\n // Target is newer - conflict\n conflicts.push({\n path: sourceFile.path,\n operation: 'conflict',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n reason: 'Target file is newer than source',\n })\n } else {\n // Source is newer - update\n files.push({\n path: sourceFile.path,\n operation: 'update',\n size: sourceFile.size,\n mtime: sourceFile.mtime,\n hash: sourceFile.hash,\n })\n }\n } else {\n // Files are identical - skip\n skipped.push({\n path: sourceFile.path,\n operation: 'skip',\n size: sourceFile.size,\n reason: 'Files are identical',\n })\n }\n }\n }\n\n // Handle deletions if enabled\n if (options.delete) {\n for (const targetFile of targetFiles) {\n if (!sourceMap.has(targetFile.path)) {\n // File in target but not in source\n const evaluation = evaluatePath(targetFile.path, rules, direction, excludes)\n\n if (evaluation.shouldSync) {\n files.push({\n path: targetFile.path,\n operation: 'delete',\n size: targetFile.size,\n })\n }\n }\n }\n }\n\n // Apply max files limit\n let limitedFiles = files\n if (options.maxFiles && files.length > options.maxFiles) {\n limitedFiles = files.slice(0, options.maxFiles)\n for (const file of files.slice(options.maxFiles)) {\n skipped.push({\n ...file,\n operation: 'skip',\n reason: 'Exceeded max files limit',\n })\n }\n }\n\n // Calculate totals\n const totalBytes = limitedFiles.reduce((sum, f) => sum + (f.size ?? 0), 0)\n\n return {\n direction,\n source: direction === 'from-codex' ? 'codex' : 'local',\n target: direction === 'from-codex' ? 'local' : 'codex',\n files: limitedFiles,\n totalFiles: limitedFiles.length,\n totalBytes,\n conflicts,\n skipped,\n }\n}\n\n/**\n * Estimate sync time based on file sizes\n *\n * @param plan - Sync plan\n * @param bytesPerSecond - Estimated transfer speed (default: 1MB/s)\n * @returns Estimated time in milliseconds\n */\nexport function estimateSyncTime(plan: SyncPlan, bytesPerSecond = 1024 * 1024): number {\n const transferTime = (plan.totalBytes / bytesPerSecond) * 1000\n const overheadPerFile = 50 // ms per file\n const overhead = plan.totalFiles * overheadPerFile\n\n return Math.ceil(transferTime + overhead)\n}\n\n/**\n * Create an empty sync plan\n */\nexport function createEmptySyncPlan(direction: SyncDirection = 'to-codex'): SyncPlan {\n return {\n direction,\n source: direction === 'from-codex' ? 'codex' : 'local',\n target: direction === 'from-codex' ? 'local' : 'codex',\n files: [],\n totalFiles: 0,\n totalBytes: 0,\n conflicts: [],\n skipped: [],\n }\n}\n\n/**\n * Filter plan to only include specific operations\n */\nexport function filterPlanOperations(\n plan: SyncPlan,\n operations: Array<'create' | 'update' | 'delete'>\n): SyncPlan {\n const filtered = plan.files.filter((f) =>\n operations.includes(f.operation as 'create' | 'update' | 'delete')\n )\n\n return {\n ...plan,\n files: filtered,\n totalFiles: filtered.length,\n totalBytes: filtered.reduce((sum, f) => sum + (f.size ?? 0), 0),\n }\n}\n\n/**\n * Get plan statistics\n */\nexport interface PlanStats {\n creates: number\n updates: number\n deletes: number\n skips: number\n conflicts: number\n totalBytes: number\n}\n\n/**\n * Get statistics from a sync plan\n */\nexport function getPlanStats(plan: SyncPlan): PlanStats {\n return {\n creates: plan.files.filter((f) => f.operation === 'create').length,\n updates: plan.files.filter((f) => f.operation === 'update').length,\n deletes: plan.files.filter((f) => f.operation === 'delete').length,\n skips: plan.skipped.length,\n conflicts: plan.conflicts.length,\n totalBytes: plan.totalBytes,\n }\n}\n\n/**\n * Format plan as human-readable summary\n */\nexport function formatPlanSummary(plan: SyncPlan): string {\n const stats = getPlanStats(plan)\n\n const lines = [\n `Sync Plan: ${plan.source} → ${plan.target}`,\n `Direction: ${plan.direction}`,\n '',\n `Operations:`,\n ` Create: ${stats.creates} files`,\n ` Update: ${stats.updates} files`,\n ` Delete: ${stats.deletes} files`,\n ` Skip: ${stats.skips} files`,\n '',\n ]\n\n if (stats.conflicts > 0) {\n lines.push(`⚠️ Conflicts: ${stats.conflicts} files`)\n lines.push('')\n }\n\n lines.push(`Total: ${plan.totalFiles} files (${formatBytes(stats.totalBytes)})`)\n\n return lines.join('\\n')\n}\n\n/**\n * Format bytes as human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n}\n","/**\n * Sync manager\n *\n * Coordinates sync operations between local files and codex repository.\n */\n\nimport type { LocalStorage } from '../storage/local.js'\nimport type {\n SyncPlan,\n SyncResult,\n SyncOptions,\n SyncConfig,\n SyncManifest,\n SyncManifestEntry,\n FileSyncStatus,\n} from './types.js'\nimport { DEFAULT_SYNC_CONFIG } from './types.js'\nimport { createSyncPlan, estimateSyncTime, type FileInfo } from './planner.js'\nimport { calculateContentHash } from '../cache/entry.js'\nimport { scanCodexWithRouting, type RoutingScanResult } from './routing-scanner.js'\n\n/**\n * Sync manager configuration\n */\nexport interface SyncManagerConfig {\n /** Local storage provider */\n localStorage: LocalStorage\n /** Sync configuration */\n config?: Partial<SyncConfig>\n /** Manifest file path */\n manifestPath?: string\n}\n\n/**\n * Sync manager\n *\n * Manages synchronization between local files and the codex repository.\n */\nexport class SyncManager {\n private localStorage: LocalStorage\n private config: SyncConfig\n private manifestPath: string\n private manifest: SyncManifest | null = null\n\n constructor(options: SyncManagerConfig) {\n this.localStorage = options.localStorage\n this.config = {\n ...DEFAULT_SYNC_CONFIG,\n ...options.config,\n }\n this.manifestPath = options.manifestPath ?? '.fractary/codex-sync-manifest.json'\n }\n\n /**\n * Resolve from_codex include patterns (v0.7.0+)\n *\n * Supports both new format (from_codex.include) and legacy format (default_from_codex).\n * New format takes precedence.\n */\n private resolveFromCodexPatterns(): string[] {\n // New format takes precedence\n if (this.config.from_codex?.include) {\n return this.config.from_codex.include\n }\n\n // Fall back to legacy format\n return this.config.default_from_codex || []\n }\n\n /**\n * Resolve to_codex include patterns (v0.7.0+)\n *\n * Supports both new format (to_codex.include) and legacy format (default_to_codex).\n * New format takes precedence.\n */\n private resolveToCodexPatterns(): string[] {\n // New format takes precedence\n if (this.config.to_codex?.include) {\n return this.config.to_codex.include\n }\n\n // Fall back to legacy format\n return this.config.default_to_codex || []\n }\n\n /**\n * Get resolved to-codex include patterns (public accessor)\n *\n * Returns the resolved patterns from config, handling both new format\n * (to_codex.include) and legacy format (default_to_codex).\n */\n public getToCodexPatterns(): string[] {\n return this.resolveToCodexPatterns()\n }\n\n /**\n * Get resolved from-codex include patterns (public accessor)\n *\n * Returns the resolved patterns from config, handling both new format\n * (from_codex.include) and legacy format (default_from_codex).\n */\n public getFromCodexPatterns(): string[] {\n return this.resolveFromCodexPatterns()\n }\n\n /**\n * Load the sync manifest\n */\n async loadManifest(): Promise<SyncManifest | null> {\n try {\n const content = await this.localStorage.readText(this.manifestPath)\n this.manifest = JSON.parse(content)\n return this.manifest\n } catch {\n return null\n }\n }\n\n /**\n * Save the sync manifest\n */\n async saveManifest(manifest: SyncManifest): Promise<void> {\n this.manifest = manifest\n await this.localStorage.write(this.manifestPath, JSON.stringify(manifest, null, 2))\n }\n\n /**\n * Get or create manifest\n */\n async getOrCreateManifest(org: string, project: string): Promise<SyncManifest> {\n let manifest = await this.loadManifest()\n\n if (!manifest || manifest.org !== org || manifest.project !== project) {\n manifest = {\n version: 1,\n org,\n project,\n lastSync: 0,\n entries: {},\n }\n }\n\n return manifest\n }\n\n /**\n * List local files\n */\n async listLocalFiles(directory: string): Promise<FileInfo[]> {\n const files = await this.localStorage.list(directory)\n const fileInfos: FileInfo[] = []\n\n for (const file of files) {\n try {\n const content = await this.localStorage.readText(file)\n const buffer = Buffer.from(content)\n fileInfos.push({\n path: file,\n size: buffer.length,\n mtime: Date.now(), // Would need fs.stat for real mtime\n hash: calculateContentHash(buffer),\n })\n } catch {\n // Skip files that can't be read\n }\n }\n\n return fileInfos\n }\n\n /**\n * Create a sync plan\n *\n * @param _org - Organization (reserved for future use)\n * @param _project - Project (reserved for future use)\n * @param sourceDir - Source directory to sync from\n * @param targetFiles - Files currently in the target\n * @param options - Sync options\n */\n async createPlan(\n _org: string,\n _project: string,\n sourceDir: string,\n targetFiles: FileInfo[],\n options?: SyncOptions\n ): Promise<SyncPlan> {\n let sourceFiles: FileInfo[]\n\n // Use pre-matched sourceFiles if provided (bypasses internal scanning)\n if (options?.sourceFiles && options.sourceFiles.length > 0) {\n sourceFiles = options.sourceFiles\n } else {\n // Fall back to internal file scanning\n sourceFiles = await this.listLocalFiles(sourceDir)\n\n // For to-codex direction, filter files based on to_codex config patterns\n if (options?.direction === 'to-codex') {\n const toCodexPatterns = this.resolveToCodexPatterns()\n\n if (toCodexPatterns.length > 0) {\n const { matchToCodexPattern } = await import('./directional-patterns.js')\n\n sourceFiles = sourceFiles.filter((file) =>\n matchToCodexPattern(file.path, toCodexPatterns)\n )\n }\n }\n }\n\n const plan = createSyncPlan(\n sourceFiles,\n targetFiles,\n options ?? {},\n this.config\n )\n\n plan.estimatedTime = estimateSyncTime(plan)\n\n return plan\n }\n\n /**\n * Create a routing-aware sync plan\n *\n * Scans entire codex repository and evaluates routing rules to find all files\n * that should sync to the target project based on codex_sync_include patterns.\n *\n * This enables cross-project knowledge sharing where files from multiple\n * projects can be synced to the target based on their frontmatter metadata.\n *\n * @param org - Organization name (e.g., \"corthosai\")\n * @param project - Target project name (e.g., \"lake.corthonomy.ai\")\n * @param codexDir - Path to codex repository directory\n * @param options - Sync options\n * @returns Sync plan with routing metadata\n *\n * @example\n * ```typescript\n * const plan = await manager.createRoutingAwarePlan(\n * 'corthosai',\n * 'lake.corthonomy.ai',\n * '/path/to/codex.corthos.ai',\n * { direction: 'from-codex' }\n * )\n *\n * console.log(`Found ${plan.totalFiles} files from ${plan.metadata.scannedProjects.length} projects`)\n * ```\n */\n async createRoutingAwarePlan(\n org: string,\n project: string,\n codexDir: string,\n options?: SyncOptions & { codexRepo?: string }\n ): Promise<SyncPlan & { routingScan?: RoutingScanResult }> {\n // Step 1: Scan entire codex with routing evaluation\n // Resolve patterns using new helper functions (supports both new and legacy formats)\n const fromCodexPatterns = this.resolveFromCodexPatterns()\n\n const routingScan = await scanCodexWithRouting({\n codexDir,\n targetProject: project,\n org,\n codexRepo: options?.codexRepo, // For codex:// URI {codex_repo} placeholder\n rules: undefined, // Use default routing rules (preventSelfSync, preventCodexSync, etc.)\n storage: this.localStorage,\n fromCodexPatterns: fromCodexPatterns.length > 0 ? fromCodexPatterns : undefined,\n routing: this.config.routing, // Pass routing config for frontmatter control\n })\n\n // Step 2: Convert routed files to FileInfo format expected by planner\n const sourceFiles: FileInfo[] = routingScan.files.map((rf) => ({\n path: rf.path,\n size: rf.size,\n mtime: rf.mtime,\n hash: rf.hash,\n }))\n\n // Step 3: Get current local files for comparison\n const targetFiles = await this.listLocalFiles(process.cwd())\n\n // Step 4: Create sync plan using existing planner logic\n // IMPORTANT: Strip include/exclude patterns from options because routing scanner\n // has already filtered files based on routing rules (codex_sync_include frontmatter).\n // We only keep execution options (force, dryRun) to avoid double filtering.\n const planOptions: SyncOptions = {\n direction: options?.direction,\n force: options?.force,\n dryRun: options?.dryRun,\n // Explicitly exclude include/exclude to prevent double filtering\n // include: undefined,\n // exclude: undefined,\n }\n const plan = createSyncPlan(sourceFiles, targetFiles, planOptions, this.config)\n\n plan.estimatedTime = estimateSyncTime(plan)\n\n // Override source/target paths for from-codex routing-aware sync\n // Files should be copied from codex to cache directory preserving full paths\n plan.source = codexDir\n plan.target = '.fractary/codex/cache'\n\n // Step 5: Enhance plan with routing metadata\n return {\n ...plan,\n routingScan,\n }\n }\n\n /**\n * Execute a sync plan\n *\n * Copies files from source to target based on the plan.\n * For from-codex syncs, files are copied to .fractary/codex/cache/ preserving full paths.\n * For to-codex syncs, files are copied to the codex repository.\n */\n async executePlan(plan: SyncPlan, options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now()\n const errors: Array<{ path: string; error: string }> = []\n let synced = 0\n let failed = 0\n\n if (options?.dryRun) {\n // Dry run - count actual operations (not totalFiles which may include all plan entries)\n const actualChanges = plan.files.filter(\n f => f.operation === 'create' || f.operation === 'update' || f.operation === 'delete'\n ).length\n return {\n success: true,\n plan,\n synced: actualChanges,\n failed: 0,\n skipped: plan.skipped.length,\n errors: [],\n duration: Date.now() - startTime,\n timestamp: Date.now(),\n }\n }\n\n // Execute operations\n for (let i = 0; i < plan.files.length; i++) {\n const file = plan.files[i]\n if (!file) continue\n\n try {\n // Report progress\n if (options?.onProgress) {\n options.onProgress(i + 1, plan.totalFiles, file.path)\n }\n\n // Execute the sync operation\n if (file.operation === 'create' || file.operation === 'update') {\n // Copy file from source to target\n const sourcePath = `${plan.source}/${file.path}`\n const targetPath = `${plan.target}/${file.path}`\n\n // Ensure target directory exists\n const fs = await import('fs/promises')\n const path = await import('path')\n const targetDir = path.dirname(targetPath)\n await fs.mkdir(targetDir, { recursive: true })\n\n // Copy the file\n await fs.copyFile(sourcePath, targetPath)\n synced++\n } else if (file.operation === 'delete') {\n // Delete file from target\n const targetPath = `${plan.target}/${file.path}`\n const fs = await import('fs/promises')\n try {\n await fs.unlink(targetPath)\n synced++\n } catch (error: any) {\n // Ignore if file doesn't exist\n if (error.code !== 'ENOENT') {\n throw error\n }\n synced++\n }\n } else {\n // Skip operation\n synced++\n }\n } catch (error) {\n failed++\n errors.push({\n path: file.path,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n return {\n success: failed === 0,\n plan,\n synced,\n failed,\n skipped: plan.skipped.length,\n errors,\n duration: Date.now() - startTime,\n timestamp: Date.now(),\n }\n }\n\n /**\n * Update manifest after sync\n */\n async updateManifest(\n org: string,\n project: string,\n syncedFiles: FileSyncStatus[]\n ): Promise<void> {\n const manifest = await this.getOrCreateManifest(org, project)\n const now = Date.now()\n\n for (const file of syncedFiles) {\n if (file.operation === 'delete') {\n delete manifest.entries[file.path]\n } else if (file.operation === 'create' || file.operation === 'update') {\n manifest.entries[file.path] = {\n path: file.path,\n hash: file.hash ?? '',\n size: file.size ?? 0,\n syncedAt: now,\n source: 'local',\n }\n }\n }\n\n manifest.lastSync = now\n await this.saveManifest(manifest)\n }\n\n /**\n * Get sync status for a file\n */\n async getFileStatus(path: string): Promise<SyncManifestEntry | null> {\n const manifest = await this.loadManifest()\n return manifest?.entries[path] ?? null\n }\n\n /**\n * Check if a file is synced\n */\n async isFileSynced(path: string): Promise<boolean> {\n const status = await this.getFileStatus(path)\n return status !== null\n }\n\n /**\n * Get last sync timestamp\n */\n async getLastSyncTime(): Promise<number | null> {\n const manifest = await this.loadManifest()\n return manifest?.lastSync ?? null\n }\n\n /**\n * Clear sync manifest\n */\n async clearManifest(): Promise<void> {\n try {\n await this.localStorage.delete(this.manifestPath)\n this.manifest = null\n } catch {\n // Ignore if manifest doesn't exist\n }\n }\n\n /**\n * Get sync configuration\n */\n getConfig(): SyncConfig {\n return { ...this.config }\n }\n\n /**\n * Update sync configuration\n */\n updateConfig(updates: Partial<SyncConfig>): void {\n this.config = {\n ...this.config,\n ...updates,\n }\n }\n}\n\n/**\n * Create a sync manager\n */\nexport function createSyncManager(config: SyncManagerConfig): SyncManager {\n return new SyncManager(config)\n}\n","/**\n * Routing-aware codex scanner\n *\n * Scans entire codex repository and evaluates routing rules to determine\n * which files should sync to a target project based on frontmatter metadata.\n *\n * Based on SPEC-20260105: Routing-Aware Sync Implementation\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { Metadata } from '../schemas/metadata.js'\nimport type { SyncRules } from '../schemas/config.js'\nimport { shouldSyncToRepo } from '../core/routing/evaluator.js'\nimport { parseMetadata } from '../core/metadata/parser.js'\nimport { calculateContentHash } from '../cache/entry.js'\nimport type { LocalStorage } from '../storage/local.js'\n\n/**\n * File information with routing metadata\n */\nexport interface RoutedFileInfo {\n /** File path relative to codex root */\n path: string\n /** File size in bytes */\n size: number\n /** Last modified timestamp */\n mtime: number\n /** Content hash for change detection */\n hash: string\n /** Parsed frontmatter metadata */\n metadata: Metadata\n /** Source project in codex (e.g., \"etl.corthion.ai\") */\n sourceProject: string\n}\n\n/**\n * Options for routing-aware scan\n */\nexport interface RoutingScanOptions {\n /** Path to codex repository directory */\n codexDir: string\n /** Target project to sync to (e.g., \"lake.corthonomy.ai\") */\n targetProject: string\n /** Organization name (e.g., \"corthosai\") */\n org: string\n /** Codex repository name (e.g., \"codex.fractary.com\") for {codex_repo} placeholder */\n codexRepo?: string\n /** Routing rules configuration (optional, uses defaults if not provided) */\n rules?: SyncRules\n /** Storage provider for reading files */\n storage: LocalStorage\n /** Skip files without frontmatter (default: true) */\n skipNoFrontmatter?: boolean\n /** Maximum file size to process in bytes (default: 10MB) */\n maxFileSize?: number\n /** Directional from_codex patterns (takes precedence over frontmatter routing) */\n fromCodexPatterns?: string[]\n /** Routing configuration (controls frontmatter parsing) */\n routing?: { use_frontmatter?: boolean }\n}\n\n/**\n * Statistics from a routing scan\n */\nexport interface RoutingScanStats {\n /** Total files scanned */\n totalScanned: number\n /** Files that matched routing rules */\n totalMatched: number\n /** Files skipped (no frontmatter, errors, etc.) */\n totalSkipped: number\n /** Unique source projects found */\n sourceProjects: string[]\n /** Duration of scan in milliseconds */\n durationMs: number\n /** Errors encountered (non-fatal) */\n errors: Array<{ path: string; error: string }>\n}\n\n/**\n * Result from routing-aware scan\n */\nexport interface RoutingScanResult {\n /** Files that should sync to target project */\n files: RoutedFileInfo[]\n /** Scan statistics */\n stats: RoutingScanStats\n}\n\n/**\n * Scan entire codex repository and return files that route to target project\n *\n * This is the core function that enables cross-project knowledge sharing by:\n * 1. Listing ALL files in the entire codex repository (not just target project)\n * 2. Parsing frontmatter metadata from each file\n * 3. Evaluating codex_sync_include patterns against target project\n * 4. Returning only files that match routing rules\n *\n * @example\n * ```typescript\n * const result = await scanCodexWithRouting({\n * codexDir: '/path/to/codex.corthos.ai',\n * targetProject: 'lake.corthonomy.ai',\n * org: 'corthosai',\n * storage: localStorage\n * })\n *\n * console.log(`Found ${result.files.length} files routing to lake.corthonomy.ai`)\n * console.log(`From ${result.stats.sourceProjects.length} projects`)\n * ```\n *\n * @param options - Scan options\n * @returns Files that should sync to target project with scan statistics\n */\nexport async function scanCodexWithRouting(\n options: RoutingScanOptions\n): Promise<RoutingScanResult> {\n const {\n codexDir,\n targetProject,\n org,\n codexRepo,\n rules,\n storage,\n skipNoFrontmatter = false,\n maxFileSize = 10 * 1024 * 1024, // 10MB default\n fromCodexPatterns,\n } = options\n\n const startTime = Date.now()\n const routedFiles: RoutedFileInfo[] = []\n const sourceProjectsSet = new Set<string>()\n const errors: Array<{ path: string; error: string }> = []\n let totalScanned = 0\n let totalSkipped = 0\n\n // Import directional pattern matcher and expand placeholders if using from_codex patterns\n let expandedFromCodexPatterns = fromCodexPatterns\n let matchFromCodexPattern: ((\n filePath: string,\n patterns: string[],\n targetProject: string,\n options?: { org?: string; codexRepo?: string }\n ) => boolean) | null = null\n\n if (fromCodexPatterns && fromCodexPatterns.length > 0) {\n const module = await import('./directional-patterns.js')\n matchFromCodexPattern = module.matchFromCodexPattern\n // Expand placeholders in patterns ({project}, {org}, {codex_repo})\n expandedFromCodexPatterns = module.expandPlaceholders(fromCodexPatterns, targetProject, {\n org,\n codexRepo,\n })\n }\n\n // Step 1: List ALL files recursively in entire codex repository\n const allFiles = await listAllFilesRecursive(codexDir)\n\n // Step 2: For each file, evaluate routing\n for (const filePath of allFiles) {\n totalScanned++\n\n try {\n // Check all file types for frontmatter (not just markdown)\n // This enables syncing of JSON schemas, YAML configs, and other files with routing metadata\n\n // Get full path for reading\n const fullPath = path.join(codexDir, filePath)\n\n // Check file size before reading\n const stats = await fs.stat(fullPath)\n if (stats.size > maxFileSize) {\n totalSkipped++\n errors.push({\n path: filePath,\n error: `File too large (${stats.size} bytes, max: ${maxFileSize})`,\n })\n continue\n }\n\n // Read file content\n const content = await storage.readText(fullPath)\n\n // Extract source project from path (needed for both pattern matching and routing)\n const sourceProject = extractProjectFromPath(filePath, org)\n\n // Determine if file should sync using either directional patterns or frontmatter routing\n let shouldSync = false\n let parseResult: ReturnType<typeof parseMetadata> | null = null\n\n // Check if we should use frontmatter routing (v0.7.0+)\n // Default is FALSE - frontmatter routing is deprecated\n const useFrontmatter = options.routing?.use_frontmatter === true\n\n if (matchFromCodexPattern && expandedFromCodexPatterns && expandedFromCodexPatterns.length > 0) {\n // Use directional from_codex patterns (takes precedence, no frontmatter needed)\n shouldSync = matchFromCodexPattern(filePath, expandedFromCodexPatterns, targetProject, {\n org,\n codexRepo,\n })\n\n // Still parse metadata for the file info, but don't use for routing\n parseResult = parseMetadata(content, { strict: false })\n } else if (useFrontmatter) {\n // Parse frontmatter for routing (legacy behavior, deprecated)\n parseResult = parseMetadata(content, { strict: false })\n\n // Add deprecation warning if frontmatter routing is detected\n if (parseResult.metadata.codex_sync_include) {\n console.warn(\n `[DEPRECATION] File ${filePath} uses codex_sync_include frontmatter. ` +\n `This feature will be removed in v1.0. Use config.yaml patterns instead.`\n )\n }\n\n // Skip files without frontmatter if configured\n if (skipNoFrontmatter && Object.keys(parseResult.metadata).length === 0) {\n totalSkipped++\n continue\n }\n\n // Fall back to frontmatter-based routing\n shouldSync = shouldSyncToRepo({\n filePath,\n fileMetadata: parseResult.metadata,\n targetRepo: targetProject,\n sourceRepo: sourceProject,\n rules,\n })\n } else {\n // Neither config patterns nor frontmatter routing enabled - skip\n totalSkipped++\n continue\n }\n\n if (shouldSync) {\n // Calculate file metadata\n const buffer = Buffer.from(content)\n const hash = calculateContentHash(buffer)\n\n routedFiles.push({\n path: filePath,\n size: buffer.length,\n mtime: stats.mtimeMs,\n hash,\n metadata: parseResult?.metadata ?? {},\n sourceProject,\n })\n\n sourceProjectsSet.add(sourceProject)\n } else {\n totalSkipped++\n }\n } catch (error) {\n // Log error but continue processing other files\n totalSkipped++\n errors.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n const durationMs = Date.now() - startTime\n\n return {\n files: routedFiles,\n stats: {\n totalScanned,\n totalMatched: routedFiles.length,\n totalSkipped,\n sourceProjects: Array.from(sourceProjectsSet).sort(),\n durationMs,\n errors,\n },\n }\n}\n\n/**\n * Extract project name from codex file path\n *\n * Supports two codex structures:\n * 1. Flat: {org}/{project}/{path/to/file.md}\n * Example: \"corthosai/etl.corthion.ai/docs/api.md\" → \"etl.corthion.ai\"\n * 2. Projects dir: projects/{project}/{path/to/file.md}\n * Example: \"projects/etl.corthion.ai/docs/api.md\" → \"etl.corthion.ai\"\n *\n * @param filePath - File path like \"corthosai/etl.corthion.ai/docs/api.md\" or \"projects/etl.corthion.ai/docs/api.md\"\n * @param org - Organization name like \"corthosai\"\n * @returns Project name like \"etl.corthion.ai\"\n */\nexport function extractProjectFromPath(filePath: string, org: string): string {\n // Normalize path separators\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n\n // Remove leading org directory if present\n const withoutOrg = normalizedPath.startsWith(`${org}/`)\n ? normalizedPath.slice(org.length + 1)\n : normalizedPath\n\n // Check if using projects/ subdirectory structure\n if (withoutOrg.startsWith('projects/')) {\n // Extract project name from projects/{project}/...\n const afterProjects = withoutOrg.slice('projects/'.length)\n const firstSlash = afterProjects.indexOf('/')\n if (firstSlash === -1) {\n // No further path segments, use entire remainder as project\n return afterProjects\n }\n return afterProjects.slice(0, firstSlash)\n }\n\n // Flat structure: extract first path segment as project name\n const firstSlash = withoutOrg.indexOf('/')\n if (firstSlash === -1) {\n // File is at root level, use entire path as project\n return withoutOrg\n }\n\n return withoutOrg.slice(0, firstSlash)\n}\n\n/**\n * Recursively list all files in directory\n *\n * @param dirPath - Directory to scan\n * @returns Array of relative file paths\n */\nexport async function listAllFilesRecursive(dirPath: string): Promise<string[]> {\n const files: string[] = []\n\n async function scanDirectory(currentPath: string, relativePath: string = ''): Promise<void> {\n try {\n const entries = await fs.readdir(currentPath, { withFileTypes: true })\n\n for (const entry of entries) {\n const entryPath = path.join(currentPath, entry.name)\n const entryRelativePath = relativePath\n ? path.join(relativePath, entry.name)\n : entry.name\n\n if (entry.isDirectory()) {\n // Skip hidden directories and common ignore patterns\n if (\n entry.name.startsWith('.') ||\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === 'build'\n ) {\n continue\n }\n\n // Recursively scan subdirectory\n await scanDirectory(entryPath, entryRelativePath)\n } else if (entry.isFile()) {\n // Add file to list\n files.push(entryRelativePath)\n }\n }\n } catch {\n // Ignore directories we can't read (permissions, etc.)\n // Silently skip - this is expected for permission issues\n }\n }\n\n await scanDirectory(dirPath)\n\n return files\n}\n\n/**\n * Group routed files by source project\n *\n * Utility function for displaying results grouped by project.\n *\n * @param files - Files from routing scan\n * @returns Map of project name to files from that project\n */\nexport function groupFilesByProject(\n files: RoutedFileInfo[]\n): Map<string, RoutedFileInfo[]> {\n const grouped = new Map<string, RoutedFileInfo[]>()\n\n for (const file of files) {\n const existing = grouped.get(file.sourceProject) || []\n existing.push(file)\n grouped.set(file.sourceProject, existing)\n }\n\n return grouped\n}\n\n/**\n * Calculate total size of routed files\n *\n * @param files - Files from routing scan\n * @returns Total size in bytes\n */\nexport function calculateTotalSize(files: RoutedFileInfo[]): number {\n return files.reduce((total, file) => total + file.size, 0)\n}\n\n/**\n * Format scan statistics for display\n *\n * @param stats - Scan statistics\n * @returns Human-readable statistics string\n */\nexport function formatScanStats(stats: RoutingScanStats): string {\n const lines: string[] = []\n\n lines.push(`Scanned: ${stats.totalScanned} files`)\n lines.push(`Matched: ${stats.totalMatched} files`)\n lines.push(`Skipped: ${stats.totalSkipped} files`)\n lines.push(`Source projects: ${stats.sourceProjects.length}`)\n lines.push(` ${stats.sourceProjects.join(', ')}`)\n lines.push(`Duration: ${stats.durationMs}ms`)\n\n if (stats.errors.length > 0) {\n lines.push(`Errors: ${stats.errors.length}`)\n stats.errors.slice(0, 5).forEach((err) => {\n lines.push(` ${err.path}: ${err.error}`)\n })\n if (stats.errors.length > 5) {\n lines.push(` ... and ${stats.errors.length - 5} more`)\n }\n }\n\n return lines.join('\\n')\n}\n","/**\n * Permission types\n *\n * Type definitions for the permissions system.\n */\n\n/**\n * Permission levels\n */\nexport type PermissionLevel = 'none' | 'read' | 'write' | 'admin'\n\n/**\n * Permission scope\n */\nexport type PermissionScope = 'global' | 'org' | 'project' | 'path'\n\n/**\n * Permission action\n */\nexport type PermissionAction = 'fetch' | 'cache' | 'sync' | 'invalidate' | 'manage'\n\n/**\n * Permission rule\n */\nexport interface PermissionRule {\n /** Rule ID */\n id?: string\n /** Pattern to match (glob) */\n pattern: string\n /** Actions this rule applies to */\n actions: PermissionAction[]\n /** Permission level granted */\n level: PermissionLevel\n /** Scope of the rule */\n scope: PermissionScope\n /** Organization filter (for org scope) */\n org?: string\n /** Project filter (for project scope) */\n project?: string\n /** Priority (higher = evaluated first) */\n priority?: number\n /** Description of the rule */\n description?: string\n /** Whether rule is active */\n enabled?: boolean\n}\n\n/**\n * Permission context\n *\n * Context for evaluating permissions.\n */\nexport interface PermissionContext {\n /** Current organization */\n org?: string\n /** Current project */\n project?: string\n /** Current environment */\n environment?: string\n /** User/agent identity */\n identity?: string\n /** Additional context data */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Permission check result\n */\nexport interface PermissionResult {\n /** Whether the action is allowed */\n allowed: boolean\n /** Permission level granted */\n level: PermissionLevel\n /** Matching rule (if any) */\n matchedRule?: PermissionRule\n /** Reason for the decision */\n reason: string\n}\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n /** Default permission level */\n defaultLevel: PermissionLevel\n /** Whether to allow by default when no rules match */\n defaultAllow: boolean\n /** Global permission rules */\n rules: PermissionRule[]\n /** Whether permissions are enforced */\n enforced: boolean\n}\n\n/**\n * Default permission configuration\n */\nexport const DEFAULT_PERMISSION_CONFIG: PermissionConfig = {\n defaultLevel: 'read',\n defaultAllow: true,\n rules: [],\n enforced: false,\n}\n\n/**\n * Permission levels ordered by access\n */\nexport const PERMISSION_LEVEL_ORDER: PermissionLevel[] = ['none', 'read', 'write', 'admin']\n\n/**\n * Check if a level grants another level\n */\nexport function levelGrants(granted: PermissionLevel, required: PermissionLevel): boolean {\n const grantedIndex = PERMISSION_LEVEL_ORDER.indexOf(granted)\n const requiredIndex = PERMISSION_LEVEL_ORDER.indexOf(required)\n return grantedIndex >= requiredIndex\n}\n\n/**\n * Get the higher of two permission levels\n */\nexport function maxLevel(a: PermissionLevel, b: PermissionLevel): PermissionLevel {\n const aIndex = PERMISSION_LEVEL_ORDER.indexOf(a)\n const bIndex = PERMISSION_LEVEL_ORDER.indexOf(b)\n return PERMISSION_LEVEL_ORDER[Math.max(aIndex, bIndex)] ?? 'none'\n}\n\n/**\n * Get the lower of two permission levels\n */\nexport function minLevel(a: PermissionLevel, b: PermissionLevel): PermissionLevel {\n const aIndex = PERMISSION_LEVEL_ORDER.indexOf(a)\n const bIndex = PERMISSION_LEVEL_ORDER.indexOf(b)\n return PERMISSION_LEVEL_ORDER[Math.min(aIndex, bIndex)] ?? 'none'\n}\n","/**\n * Permission evaluator\n *\n * Evaluates permission rules to determine access levels.\n */\n\nimport micromatch from 'micromatch'\nimport type {\n PermissionRule,\n PermissionContext,\n PermissionResult,\n PermissionConfig,\n PermissionLevel,\n PermissionAction,\n} from './types.js'\nimport { levelGrants } from './types.js'\n\n/**\n * Check if a rule matches the given context\n */\nexport function ruleMatchesContext(rule: PermissionRule, context: PermissionContext): boolean {\n // Check if rule is enabled\n if (rule.enabled === false) {\n return false\n }\n\n // Check scope constraints\n switch (rule.scope) {\n case 'org':\n if (rule.org && context.org !== rule.org) {\n return false\n }\n break\n case 'project':\n if (rule.org && context.org !== rule.org) {\n return false\n }\n if (rule.project && context.project !== rule.project) {\n return false\n }\n break\n }\n\n return true\n}\n\n/**\n * Check if a rule matches a path\n */\nexport function ruleMatchesPath(rule: PermissionRule, path: string): boolean {\n return micromatch.isMatch(path, rule.pattern)\n}\n\n/**\n * Check if a rule matches an action\n */\nexport function ruleMatchesAction(rule: PermissionRule, action: PermissionAction): boolean {\n return rule.actions.includes(action)\n}\n\n/**\n * Evaluate permission for a path and action\n */\nexport function evaluatePermission(\n path: string,\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): PermissionResult {\n // Sort rules by priority (higher first)\n const sortedRules = [...config.rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n\n // Find first matching rule\n for (const rule of sortedRules) {\n if (!ruleMatchesContext(rule, context)) {\n continue\n }\n\n if (!ruleMatchesPath(rule, path)) {\n continue\n }\n\n if (!ruleMatchesAction(rule, action)) {\n continue\n }\n\n // Rule matches\n return {\n allowed: rule.level !== 'none',\n level: rule.level,\n matchedRule: rule,\n reason: `Matched rule: ${rule.description ?? rule.pattern}`,\n }\n }\n\n // No rule matched - use default\n return {\n allowed: config.defaultAllow,\n level: config.defaultLevel,\n reason: config.defaultAllow ? 'Allowed by default' : 'Denied by default',\n }\n}\n\n/**\n * Check if an action is allowed for a path\n */\nexport function isAllowed(\n path: string,\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): boolean {\n const result = evaluatePermission(path, action, context, config)\n return result.allowed\n}\n\n/**\n * Check if a specific permission level is granted\n */\nexport function hasPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel,\n context: PermissionContext,\n config: PermissionConfig\n): boolean {\n const result = evaluatePermission(path, action, context, config)\n return levelGrants(result.level, requiredLevel)\n}\n\n/**\n * Evaluate permissions for multiple paths\n */\nexport function evaluatePermissions(\n paths: string[],\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig\n): Map<string, PermissionResult> {\n const results = new Map<string, PermissionResult>()\n\n for (const path of paths) {\n results.set(path, evaluatePermission(path, action, context, config))\n }\n\n return results\n}\n\n/**\n * Filter paths by permission\n */\nexport function filterByPermission(\n paths: string[],\n action: PermissionAction,\n context: PermissionContext,\n config: PermissionConfig,\n requiredLevel: PermissionLevel = 'read'\n): string[] {\n return paths.filter((path) => {\n const result = evaluatePermission(path, action, context, config)\n return levelGrants(result.level, requiredLevel)\n })\n}\n\n/**\n * Validate permission rules\n */\nexport function validateRules(rules: PermissionRule[]): string[] {\n const errors: string[] = []\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i]\n if (!rule) continue\n\n // Check pattern\n if (!rule.pattern || rule.pattern.trim() === '') {\n errors.push(`Rule ${i}: pattern is empty`)\n continue\n }\n\n // Validate pattern\n try {\n micromatch.isMatch('test', rule.pattern)\n } catch {\n errors.push(`Rule ${i}: invalid pattern \"${rule.pattern}\"`)\n }\n\n // Check actions\n if (!rule.actions || rule.actions.length === 0) {\n errors.push(`Rule ${i}: actions are empty`)\n }\n\n // Validate scope constraints\n if (rule.scope === 'org' && !rule.org) {\n errors.push(`Rule ${i}: org scope requires org field`)\n }\n\n if (rule.scope === 'project' && !rule.project) {\n errors.push(`Rule ${i}: project scope requires project field`)\n }\n }\n\n return errors\n}\n\n/**\n * Create a permission rule\n */\nexport function createRule(options: {\n pattern: string\n actions: PermissionAction[]\n level: PermissionLevel\n scope?: PermissionRule['scope']\n org?: string\n project?: string\n priority?: number\n description?: string\n}): PermissionRule {\n return {\n pattern: options.pattern,\n actions: options.actions,\n level: options.level,\n scope: options.scope ?? 'global',\n org: options.org,\n project: options.project,\n priority: options.priority ?? 0,\n description: options.description,\n enabled: true,\n }\n}\n\n/**\n * Create common permission rules\n */\nexport const CommonRules = {\n /** Allow all actions for docs */\n allowDocs: (): PermissionRule =>\n createRule({\n pattern: 'docs/**',\n actions: ['fetch', 'cache', 'sync'],\n level: 'read',\n description: 'Allow read access to docs',\n }),\n\n /** Deny access to private files */\n denyPrivate: (): PermissionRule =>\n createRule({\n pattern: '**/.private/**',\n actions: ['fetch', 'cache', 'sync'],\n level: 'none',\n priority: 100,\n description: 'Deny access to private files',\n }),\n\n /** Read-only access to specs */\n readOnlySpecs: (): PermissionRule =>\n createRule({\n pattern: 'specs/**',\n actions: ['fetch', 'cache'],\n level: 'read',\n description: 'Read-only access to specs',\n }),\n\n /** Admin access for management */\n adminManage: (): PermissionRule =>\n createRule({\n pattern: '**',\n actions: ['manage', 'invalidate'],\n level: 'admin',\n description: 'Admin access for management operations',\n }),\n}\n","/**\n * Permission manager\n *\n * Manages permission rules and provides a high-level API\n * for permission checks.\n */\n\nimport type {\n PermissionRule,\n PermissionContext,\n PermissionResult,\n PermissionConfig,\n PermissionLevel,\n PermissionAction,\n} from './types.js'\nimport { DEFAULT_PERMISSION_CONFIG, levelGrants } from './types.js'\nimport { evaluatePermission, validateRules, filterByPermission } from './evaluator.js'\n\n/**\n * Permission manager configuration\n */\nexport interface PermissionManagerConfig {\n /** Initial configuration */\n config?: Partial<PermissionConfig>\n /** Default context */\n defaultContext?: PermissionContext\n}\n\n/**\n * Permission manager\n *\n * Provides a centralized API for managing and checking permissions.\n */\nexport class PermissionManager {\n private config: PermissionConfig\n private defaultContext: PermissionContext\n\n constructor(options: PermissionManagerConfig = {}) {\n this.config = {\n ...DEFAULT_PERMISSION_CONFIG,\n ...options.config,\n // Create a new rules array to avoid shared state\n rules: options.config?.rules ? [...options.config.rules] : [],\n }\n this.defaultContext = options.defaultContext ?? {}\n }\n\n /**\n * Check if an action is allowed for a path\n */\n isAllowed(\n path: string,\n action: PermissionAction,\n context?: PermissionContext\n ): boolean {\n const result = this.evaluate(path, action, context)\n return result.allowed\n }\n\n /**\n * Check if a permission level is granted\n */\n hasPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel,\n context?: PermissionContext\n ): boolean {\n const result = this.evaluate(path, action, context)\n return levelGrants(result.level, requiredLevel)\n }\n\n /**\n * Evaluate permission for a path and action\n */\n evaluate(\n path: string,\n action: PermissionAction,\n context?: PermissionContext\n ): PermissionResult {\n const mergedContext = { ...this.defaultContext, ...context }\n\n // If permissions are not enforced, allow everything\n if (!this.config.enforced) {\n return {\n allowed: true,\n level: 'admin',\n reason: 'Permissions not enforced',\n }\n }\n\n return evaluatePermission(path, action, mergedContext, this.config)\n }\n\n /**\n * Filter paths by permission\n */\n filterAllowed(\n paths: string[],\n action: PermissionAction,\n context?: PermissionContext,\n requiredLevel: PermissionLevel = 'read'\n ): string[] {\n const mergedContext = { ...this.defaultContext, ...context }\n\n if (!this.config.enforced) {\n return paths\n }\n\n return filterByPermission(paths, action, mergedContext, this.config, requiredLevel)\n }\n\n /**\n * Add a permission rule\n */\n addRule(rule: PermissionRule): void {\n const errors = validateRules([rule])\n if (errors.length > 0) {\n throw new Error(`Invalid rule: ${errors.join(', ')}`)\n }\n\n this.config.rules.push(rule)\n }\n\n /**\n * Remove a permission rule by ID\n */\n removeRule(id: string): boolean {\n const index = this.config.rules.findIndex((r) => r.id === id)\n if (index === -1) {\n return false\n }\n\n this.config.rules.splice(index, 1)\n return true\n }\n\n /**\n * Get all rules\n */\n getRules(): PermissionRule[] {\n return [...this.config.rules]\n }\n\n /**\n * Clear all rules\n */\n clearRules(): void {\n this.config.rules = []\n }\n\n /**\n * Set rules (replace all)\n */\n setRules(rules: PermissionRule[]): void {\n const errors = validateRules(rules)\n if (errors.length > 0) {\n throw new Error(`Invalid rules: ${errors.join(', ')}`)\n }\n\n this.config.rules = [...rules]\n }\n\n /**\n * Get configuration\n */\n getConfig(): PermissionConfig {\n return { ...this.config, rules: [...this.config.rules] }\n }\n\n /**\n * Update configuration\n */\n updateConfig(updates: Partial<Omit<PermissionConfig, 'rules'>>): void {\n this.config = {\n ...this.config,\n ...updates,\n }\n }\n\n /**\n * Set default context\n */\n setDefaultContext(context: PermissionContext): void {\n this.defaultContext = { ...context }\n }\n\n /**\n * Get default context\n */\n getDefaultContext(): PermissionContext {\n return { ...this.defaultContext }\n }\n\n /**\n * Enable permission enforcement\n */\n enable(): void {\n this.config.enforced = true\n }\n\n /**\n * Disable permission enforcement\n */\n disable(): void {\n this.config.enforced = false\n }\n\n /**\n * Check if permissions are enforced\n */\n isEnforced(): boolean {\n return this.config.enforced\n }\n\n /**\n * Assert permission (throws if denied)\n */\n assertPermission(\n path: string,\n action: PermissionAction,\n requiredLevel: PermissionLevel = 'read',\n context?: PermissionContext\n ): void {\n const result = this.evaluate(path, action, context)\n\n if (!levelGrants(result.level, requiredLevel)) {\n throw new PermissionDeniedError(\n `Permission denied for ${action} on ${path}: ${result.reason}`,\n path,\n action,\n result\n )\n }\n }\n}\n\n/**\n * Permission denied error\n */\nexport class PermissionDeniedError extends Error {\n constructor(\n message: string,\n public readonly path: string,\n public readonly action: PermissionAction,\n public readonly result: PermissionResult\n ) {\n super(message)\n this.name = 'PermissionDeniedError'\n }\n}\n\n/**\n * Create a permission manager\n */\nexport function createPermissionManager(config?: PermissionManagerConfig): PermissionManager {\n return new PermissionManager(config)\n}\n\n/**\n * Default permission manager instance\n */\nlet defaultManager: PermissionManager | null = null\n\n/**\n * Get the default permission manager\n */\nexport function getDefaultPermissionManager(): PermissionManager {\n if (!defaultManager) {\n defaultManager = createPermissionManager()\n }\n return defaultManager\n}\n\n/**\n * Set the default permission manager\n */\nexport function setDefaultPermissionManager(manager: PermissionManager): void {\n defaultManager = manager\n}\n","/**\n * Version detection\n *\n * Detects configuration version for migration.\n */\n\nimport type {\n LegacyCodexConfig,\n ModernCodexConfig,\n VersionDetectionResult,\n} from './types.js'\n\n/**\n * Detect configuration version\n */\nexport function detectVersion(config: unknown): VersionDetectionResult {\n if (!config || typeof config !== 'object') {\n return {\n version: 'unknown',\n confidence: 'high',\n reason: 'Invalid configuration object',\n }\n }\n\n const obj = config as Record<string, unknown>\n\n // Check for explicit version field (v3.0)\n if (obj.version === '3.0') {\n return {\n version: '3.0',\n confidence: 'high',\n reason: 'Explicit version field found',\n }\n }\n\n // Check for v3.0 structure markers\n if (isModernConfig(config)) {\n return {\n version: '3.0',\n confidence: 'medium',\n reason: 'Modern structure detected (organization object, sync.patterns)',\n }\n }\n\n // Check for v2.x markers\n if (isLegacyConfig(config)) {\n return {\n version: '2.x',\n confidence: 'high',\n reason: 'Legacy structure detected (org/defaultOrg/codexRepo at top level)',\n }\n }\n\n // Ambiguous - check for any recognizable fields\n const knownFields = [\n 'org',\n 'defaultOrg',\n 'codexRepo',\n 'autoSync',\n 'syncRules',\n 'organization',\n 'sync',\n 'cache',\n ]\n\n const hasKnownFields = knownFields.some((field) => field in obj)\n\n if (hasKnownFields) {\n return {\n version: '2.x',\n confidence: 'low',\n reason: 'Some known fields found, assuming v2.x',\n }\n }\n\n return {\n version: 'unknown',\n confidence: 'high',\n reason: 'No recognizable configuration structure',\n }\n}\n\n/**\n * Check if config matches modern v3.0 structure\n */\nexport function isModernConfig(config: unknown): config is ModernCodexConfig {\n if (!config || typeof config !== 'object') {\n return false\n }\n\n const obj = config as Record<string, unknown>\n\n // Must have organization object with name and codexRepo\n if (!obj.organization || typeof obj.organization !== 'object') {\n return false\n }\n\n const org = obj.organization as Record<string, unknown>\n if (typeof org.name !== 'string' || typeof org.codexRepo !== 'string') {\n return false\n }\n\n // Must have sync object with patterns array\n if (!obj.sync || typeof obj.sync !== 'object') {\n return false\n }\n\n const sync = obj.sync as Record<string, unknown>\n if (!Array.isArray(sync.patterns)) {\n return false\n }\n\n return true\n}\n\n/**\n * Check if config matches legacy v2.x structure\n */\nexport function isLegacyConfig(config: unknown): config is LegacyCodexConfig {\n if (!config || typeof config !== 'object') {\n return false\n }\n\n const obj = config as Record<string, unknown>\n\n // Look for v2.x markers\n const legacyMarkers = ['org', 'defaultOrg', 'codexRepo', 'codexPath']\n const hasLegacyMarker = legacyMarkers.some(\n (marker) => marker in obj && typeof obj[marker] === 'string'\n )\n\n if (hasLegacyMarker) {\n return true\n }\n\n // Check for legacy autoSync array\n if (Array.isArray(obj.autoSync)) {\n return true\n }\n\n // Check for legacy syncRules object\n if (obj.syncRules && typeof obj.syncRules === 'object') {\n const syncRules = obj.syncRules as Record<string, unknown>\n if (Array.isArray(syncRules.include) || Array.isArray(syncRules.exclude)) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Check if migration is needed\n */\nexport function needsMigration(config: unknown): boolean {\n const detection = detectVersion(config)\n return detection.version === '2.x'\n}\n\n/**\n * Get migration requirements\n */\nexport function getMigrationRequirements(config: unknown): string[] {\n const requirements: string[] = []\n\n if (!config || typeof config !== 'object') {\n requirements.push('Valid configuration object required')\n return requirements\n }\n\n const obj = config as Record<string, unknown>\n\n // Check org\n if (!obj.org && !obj.defaultOrg) {\n requirements.push('Organization name is required (org or defaultOrg)')\n }\n\n // Check codex repo\n if (!obj.codexRepo && !obj.codexPath) {\n requirements.push('Codex repository name is required (codexRepo or codexPath)')\n }\n\n return requirements\n}\n","/**\n * Configuration migrator\n *\n * Migrates v2.x configurations to v3.0 format.\n */\n\nimport type {\n LegacyCodexConfig,\n LegacyAutoSyncPattern,\n ModernCodexConfig,\n ModernSyncPattern,\n MigrationResult,\n MigrationOptions,\n} from './types.js'\nimport { detectVersion, isLegacyConfig, isModernConfig } from './detector.js'\n\n/**\n * Default migration options\n */\nexport const DEFAULT_MIGRATION_OPTIONS: MigrationOptions = {\n preserveUnknown: false,\n strict: false,\n defaultOrg: 'organization',\n defaultCodexRepo: 'codex',\n}\n\n/**\n * Migrate configuration from v2.x to v3.0\n */\nexport function migrateConfig(\n config: unknown,\n options: MigrationOptions = {}\n): MigrationResult {\n const mergedOptions = { ...DEFAULT_MIGRATION_OPTIONS, ...options }\n const result: MigrationResult = {\n success: false,\n warnings: [],\n errors: [],\n changes: [],\n }\n\n // Detect version\n const detection = detectVersion(config)\n\n if (detection.version === '3.0') {\n if (isModernConfig(config)) {\n result.success = true\n result.config = config\n result.warnings.push('Configuration is already v3.0, no migration needed')\n return result\n }\n }\n\n if (detection.version === 'unknown') {\n result.errors.push(`Cannot migrate: ${detection.reason}`)\n return result\n }\n\n if (!isLegacyConfig(config)) {\n result.errors.push('Configuration does not match expected v2.x format')\n return result\n }\n\n try {\n const migrated = performMigration(config, mergedOptions, result)\n result.config = migrated\n result.success = true\n } catch (error) {\n result.errors.push(\n `Migration failed: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n\n return result\n}\n\n/**\n * Perform the actual migration\n */\nfunction performMigration(\n legacy: LegacyCodexConfig,\n options: MigrationOptions,\n result: MigrationResult\n): ModernCodexConfig {\n // Extract org name\n const orgName = legacy.org || legacy.defaultOrg || options.defaultOrg!\n\n if (legacy.org && legacy.defaultOrg && legacy.org !== legacy.defaultOrg) {\n result.warnings.push(\n `Both 'org' and 'defaultOrg' specified with different values. Using 'org': ${legacy.org}`\n )\n }\n\n if (!legacy.org && !legacy.defaultOrg) {\n result.changes.push({\n type: 'added',\n path: 'organization.name',\n newValue: orgName,\n description: `Added default organization name: ${orgName}`,\n })\n } else {\n const fieldUsed = legacy.org ? 'org' : 'defaultOrg'\n result.changes.push({\n type: 'renamed',\n path: 'organization.name',\n oldValue: fieldUsed,\n newValue: 'organization.name',\n description: `Renamed '${fieldUsed}' to 'organization.name'`,\n })\n }\n\n // Extract codex repo\n const codexRepo = legacy.codexRepo || legacy.codexPath || options.defaultCodexRepo!\n\n if (legacy.codexRepo && legacy.codexPath && legacy.codexRepo !== legacy.codexPath) {\n result.warnings.push(\n `Both 'codexRepo' and 'codexPath' specified with different values. Using 'codexRepo': ${legacy.codexRepo}`\n )\n }\n\n if (!legacy.codexRepo && !legacy.codexPath) {\n result.changes.push({\n type: 'added',\n path: 'organization.codexRepo',\n newValue: codexRepo,\n description: `Added default codex repository: ${codexRepo}`,\n })\n } else {\n const fieldUsed = legacy.codexRepo ? 'codexRepo' : 'codexPath'\n result.changes.push({\n type: 'renamed',\n path: 'organization.codexRepo',\n oldValue: fieldUsed,\n newValue: 'organization.codexRepo',\n description: `Renamed '${fieldUsed}' to 'organization.codexRepo'`,\n })\n }\n\n // Migrate auto-sync patterns\n const patterns: ModernSyncPattern[] = []\n\n if (legacy.autoSync && legacy.autoSync.length > 0) {\n for (const legacyPattern of legacy.autoSync) {\n const modernPattern = migrateSyncPattern(legacyPattern, result)\n patterns.push(modernPattern)\n }\n\n result.changes.push({\n type: 'transformed',\n path: 'sync.patterns',\n oldValue: 'autoSync',\n newValue: 'sync.patterns',\n description: `Converted ${legacy.autoSync.length} auto-sync pattern(s) to modern format`,\n })\n }\n\n // Migrate sync rules\n const include: string[] = []\n const exclude: string[] = []\n\n if (legacy.syncRules) {\n if (legacy.syncRules.include) {\n include.push(...legacy.syncRules.include)\n result.changes.push({\n type: 'renamed',\n path: 'sync.include',\n oldValue: 'syncRules.include',\n newValue: 'sync.include',\n description: 'Moved syncRules.include to sync.include',\n })\n }\n\n if (legacy.syncRules.exclude) {\n exclude.push(...legacy.syncRules.exclude)\n result.changes.push({\n type: 'renamed',\n path: 'sync.exclude',\n oldValue: 'syncRules.exclude',\n newValue: 'sync.exclude',\n description: 'Moved syncRules.exclude to sync.exclude',\n })\n }\n }\n\n // Build modern config\n const modern: ModernCodexConfig = {\n version: '3.0',\n organization: {\n name: orgName,\n codexRepo,\n },\n sync: {\n patterns,\n include,\n exclude,\n defaultDirection: 'to-codex',\n },\n }\n\n // Migrate environments\n if (legacy.environments) {\n modern.environments = {}\n\n for (const [envName, envConfig] of Object.entries(legacy.environments)) {\n const envResult: MigrationResult = {\n success: false,\n warnings: [],\n errors: [],\n changes: [],\n }\n\n try {\n const migratedEnv = performMigration(\n { ...legacy, ...envConfig } as LegacyCodexConfig,\n { ...options },\n envResult\n )\n\n // Extract only the overrides\n modern.environments[envName] = {\n organization: migratedEnv.organization,\n sync: migratedEnv.sync,\n }\n\n result.changes.push({\n type: 'transformed',\n path: `environments.${envName}`,\n description: `Migrated environment '${envName}'`,\n })\n\n result.warnings.push(...envResult.warnings.map((w) => `[${envName}] ${w}`))\n } catch {\n result.warnings.push(`Failed to migrate environment '${envName}', skipping`)\n }\n }\n }\n\n result.changes.push({\n type: 'added',\n path: 'version',\n newValue: '3.0',\n description: 'Added version field',\n })\n\n return modern\n}\n\n/**\n * Migrate a single sync pattern\n */\nfunction migrateSyncPattern(\n legacy: LegacyAutoSyncPattern,\n result: MigrationResult\n): ModernSyncPattern {\n const modern: ModernSyncPattern = {\n pattern: legacy.pattern,\n }\n\n if (legacy.destination) {\n modern.target = legacy.destination\n }\n\n if (legacy.bidirectional) {\n modern.direction = 'bidirectional'\n }\n\n if (legacy.targets && legacy.targets.length > 0) {\n result.warnings.push(\n `Pattern '${legacy.pattern}' had multiple targets (${legacy.targets.join(', ')}). ` +\n 'In v3.0, each target should be a separate pattern.'\n )\n\n // Use first target\n if (!modern.target && legacy.targets[0]) {\n modern.target = legacy.targets[0]\n }\n }\n\n return modern\n}\n\n/**\n * Validate migrated configuration\n */\nexport function validateMigratedConfig(config: ModernCodexConfig): string[] {\n const errors: string[] = []\n\n if (config.version !== '3.0') {\n errors.push(`Invalid version: ${config.version}, expected '3.0'`)\n }\n\n if (!config.organization) {\n errors.push('Missing organization configuration')\n } else {\n if (!config.organization.name) {\n errors.push('Missing organization.name')\n }\n if (!config.organization.codexRepo) {\n errors.push('Missing organization.codexRepo')\n }\n }\n\n if (!config.sync) {\n errors.push('Missing sync configuration')\n } else {\n if (!Array.isArray(config.sync.patterns)) {\n errors.push('sync.patterns must be an array')\n }\n if (!Array.isArray(config.sync.include)) {\n errors.push('sync.include must be an array')\n }\n if (!Array.isArray(config.sync.exclude)) {\n errors.push('sync.exclude must be an array')\n }\n }\n\n return errors\n}\n\n/**\n * Generate migration report\n */\nexport function generateMigrationReport(result: MigrationResult): string {\n const lines: string[] = ['# Migration Report', '']\n\n if (result.success) {\n lines.push('Status: SUCCESS')\n } else {\n lines.push('Status: FAILED')\n }\n\n lines.push('')\n\n if (result.changes.length > 0) {\n lines.push('## Changes', '')\n\n for (const change of result.changes) {\n lines.push(`- [${change.type.toUpperCase()}] ${change.path}: ${change.description}`)\n }\n\n lines.push('')\n }\n\n if (result.warnings.length > 0) {\n lines.push('## Warnings', '')\n\n for (const warning of result.warnings) {\n lines.push(`- ${warning}`)\n }\n\n lines.push('')\n }\n\n if (result.errors.length > 0) {\n lines.push('## Errors', '')\n\n for (const error of result.errors) {\n lines.push(`- ${error}`)\n }\n\n lines.push('')\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Create empty modern config\n */\nexport function createEmptyModernConfig(\n org: string,\n codexRepo: string\n): ModernCodexConfig {\n return {\n version: '3.0',\n organization: {\n name: org,\n codexRepo,\n },\n sync: {\n patterns: [],\n include: ['**/*.md', 'CLAUDE.md'],\n exclude: ['**/node_modules/**', '**/.git/**'],\n defaultDirection: 'to-codex',\n },\n }\n}\n","/**\n * Legacy reference migration\n *\n * Converts legacy reference formats to modern codex:// URIs.\n */\n\n/**\n * Legacy reference patterns\n */\nexport const LEGACY_PATTERNS = {\n /** @codex: style references */\n CODEX_TAG: /@codex:\\s*([^\\s\\]]+)/g,\n /** [codex:...] style references */\n CODEX_BRACKET: /\\[codex:\\s*([^\\]]+)\\]/g,\n /** {{codex:...}} style references */\n CODEX_MUSTACHE: /\\{\\{codex:\\s*([^}]+)\\}\\}/g,\n /** Simple path references in specific contexts */\n SIMPLE_PATH: /codex\\/([a-zA-Z0-9_-]+\\/[a-zA-Z0-9_\\-/.]+)/g,\n}\n\n/**\n * Reference conversion result\n */\nexport interface ReferenceConversionResult {\n /** Original text */\n original: string\n /** Converted text */\n converted: string\n /** References found and converted */\n references: ConvertedReference[]\n /** Whether any changes were made */\n modified: boolean\n}\n\n/**\n * Converted reference\n */\nexport interface ConvertedReference {\n /** Original reference text */\n original: string\n /** Converted URI */\n uri: string\n /** Position in original text */\n position: number\n /** Format detected */\n format: 'codex-tag' | 'codex-bracket' | 'codex-mustache' | 'simple-path'\n}\n\n/**\n * Conversion options\n */\nexport interface ConversionOptions {\n /** Default organization */\n defaultOrg?: string\n /** Default project */\n defaultProject?: string\n /** Whether to preserve original format wrapper */\n preserveWrapper?: boolean\n}\n\n/**\n * Convert legacy references in text\n */\nexport function convertLegacyReferences(\n text: string,\n options: ConversionOptions = {}\n): ReferenceConversionResult {\n const result: ReferenceConversionResult = {\n original: text,\n converted: text,\n references: [],\n modified: false,\n }\n\n // Process each pattern type\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_TAG,\n 'codex-tag',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_BRACKET,\n 'codex-bracket',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.CODEX_MUSTACHE,\n 'codex-mustache',\n options,\n result.references\n )\n\n result.converted = processPattern(\n result.converted,\n LEGACY_PATTERNS.SIMPLE_PATH,\n 'simple-path',\n options,\n result.references\n )\n\n result.modified = result.original !== result.converted\n\n return result\n}\n\n/**\n * Process a single pattern type\n */\nfunction processPattern(\n text: string,\n pattern: RegExp,\n format: ConvertedReference['format'],\n options: ConversionOptions,\n references: ConvertedReference[]\n): string {\n // Reset pattern lastIndex\n pattern.lastIndex = 0\n\n return text.replace(pattern, (match, captured: string, offset: number) => {\n const uri = convertToUri(captured.trim(), options)\n\n references.push({\n original: match,\n uri,\n position: offset,\n format,\n })\n\n // Return the appropriate format\n if (options.preserveWrapper) {\n switch (format) {\n case 'codex-tag':\n return `@codex: ${uri}`\n case 'codex-bracket':\n return `[${uri}]`\n case 'codex-mustache':\n return `{{${uri}}}`\n case 'simple-path':\n return uri\n }\n }\n\n return uri\n })\n}\n\n/**\n * Convert a path/reference to codex:// URI\n */\nexport function convertToUri(reference: string, options: ConversionOptions = {}): string {\n const trimmed = reference.trim()\n\n // Already a codex:// URI\n if (trimmed.startsWith('codex://')) {\n return trimmed\n }\n\n // Parse the reference to extract components\n const parts = parseReference(trimmed)\n\n // Build URI\n const org = parts.org || options.defaultOrg || '_'\n const project = parts.project || options.defaultProject || '_'\n const path = parts.path\n\n return `codex://${org}/${project}/${path}`\n}\n\n/**\n * Parse reference components\n */\ninterface ParsedReferenceComponents {\n org?: string\n project?: string\n path: string\n}\n\nfunction parseReference(reference: string): ParsedReferenceComponents {\n // Handle various formats:\n // - org/project/path\n // - project/path (org inferred)\n // - path (org and project inferred)\n // - ./path (relative)\n // - ../path (relative)\n\n const trimmed = reference.trim()\n\n // Handle relative paths\n if (trimmed.startsWith('./') || trimmed.startsWith('../')) {\n return { path: trimmed }\n }\n\n // Split by /\n const parts = trimmed.split('/')\n\n if (parts.length >= 3) {\n // Assume org/project/path format\n const [org, project, ...rest] = parts\n return {\n org: org || undefined,\n project: project || undefined,\n path: rest.join('/'),\n }\n }\n\n if (parts.length === 2) {\n // For legacy reference migration, treat 2-part paths as file paths\n // Common directory names like docs, src, specs should not be inferred as projects\n // Only explicit org/project/path format (3+ parts) will extract org/project\n\n return { path: trimmed }\n }\n\n // Single part - just the path\n return { path: trimmed }\n}\n\n/**\n * Find all legacy references in text (without converting)\n */\nexport function findLegacyReferences(text: string): ConvertedReference[] {\n const references: ConvertedReference[] = []\n\n for (const [name, pattern] of Object.entries(LEGACY_PATTERNS)) {\n pattern.lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = pattern.exec(text)) !== null) {\n const format = name\n .toLowerCase()\n .replace('_', '-') as ConvertedReference['format']\n\n references.push({\n original: match[0],\n uri: match[1] || '',\n position: match.index,\n format,\n })\n }\n }\n\n // Sort by position\n references.sort((a, b) => a.position - b.position)\n\n return references\n}\n\n/**\n * Check if text contains legacy references\n */\nexport function hasLegacyReferences(text: string): boolean {\n for (const pattern of Object.values(LEGACY_PATTERNS)) {\n pattern.lastIndex = 0\n if (pattern.test(text)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Migrate all references in a file content\n */\nexport function migrateFileReferences(\n content: string,\n options: ConversionOptions = {}\n): ReferenceConversionResult {\n return convertLegacyReferences(content, options)\n}\n\n/**\n * Generate reference migration summary\n */\nexport function generateReferenceMigrationSummary(\n results: ReferenceConversionResult[]\n): string {\n const lines: string[] = ['# Reference Migration Summary', '']\n\n let totalRefs = 0\n let modifiedFiles = 0\n\n for (const result of results) {\n if (result.modified) {\n modifiedFiles++\n }\n totalRefs += result.references.length\n }\n\n lines.push(`- Total files processed: ${results.length}`)\n lines.push(`- Files with changes: ${modifiedFiles}`)\n lines.push(`- Total references converted: ${totalRefs}`)\n lines.push('')\n\n // Group by format\n const byFormat = new Map<string, number>()\n\n for (const result of results) {\n for (const ref of result.references) {\n byFormat.set(ref.format, (byFormat.get(ref.format) || 0) + 1)\n }\n }\n\n if (byFormat.size > 0) {\n lines.push('## References by Format', '')\n\n for (const [format, count] of byFormat.entries()) {\n lines.push(`- ${format}: ${count}`)\n }\n }\n\n return lines.join('\\n')\n}\n","/**\n * HealthChecker - Comprehensive diagnostics for Codex SDK\n *\n * Provides health checks for:\n * - Configuration validation\n * - Cache health\n * - Storage provider connectivity\n * - Type registry validation\n *\n * This centralizes health check logic that was previously in CLI.\n */\n\nimport * as fs from 'fs/promises'\nimport * as path from 'path'\nimport { CacheManager, type CacheStats } from '../cache/index.js'\nimport { TypeRegistry } from '../types/index.js'\nimport { formatBytes } from '../core/utils/index.js'\n\n// ===== Constants =====\n\n/**\n * Minimum percentage of fresh cache entries for healthy status.\n * Below this threshold, cache health is considered degraded.\n */\nexport const CACHE_HEALTH_THRESHOLD_PERCENT = 50\n\n// ===== Types =====\n\n/**\n * Health check status\n */\nexport type HealthStatus = 'pass' | 'warn' | 'fail'\n\n/**\n * Individual health check result\n */\nexport interface HealthCheck {\n /** Name of the check */\n name: string\n /** Status: pass, warn, or fail */\n status: HealthStatus\n /** Human-readable message */\n message: string\n /** Additional details */\n details?: string\n}\n\n/**\n * Health check summary\n */\nexport interface HealthSummary {\n /** Total number of checks */\n total: number\n /** Number of passed checks */\n passed: number\n /** Number of warning checks */\n warned: number\n /** Number of failed checks */\n failed: number\n /** Overall health status */\n healthy: boolean\n /** Overall status string */\n status: 'healthy' | 'degraded' | 'unhealthy'\n}\n\n/**\n * Complete health check result\n */\nexport interface HealthResult {\n /** Summary of all checks */\n summary: HealthSummary\n /** Individual check results */\n checks: HealthCheck[]\n}\n\n/**\n * Storage provider configuration for health checks\n */\nexport interface StorageProviderInfo {\n type: string\n [key: string]: unknown\n}\n\n/**\n * Configuration for health checks\n */\nexport interface HealthConfig {\n /** Organization name */\n organization?: string\n /** Storage providers */\n storage?: StorageProviderInfo[]\n /** Codex configuration section */\n codex?: {\n organization?: string\n codex_repo?: string\n }\n}\n\n/**\n * Options for HealthChecker\n */\nexport interface HealthCheckerOptions {\n /** Project root directory */\n projectRoot?: string\n /** Cache manager instance */\n cacheManager?: CacheManager\n /** Type registry instance */\n typeRegistry?: TypeRegistry\n /** Pre-loaded configuration */\n config?: HealthConfig\n}\n\n// ===== Helper Functions =====\n\n/**\n * Check if file exists\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Read and parse YAML config\n */\nasync function readYamlConfig(configPath: string): Promise<HealthConfig | null> {\n try {\n const content = await fs.readFile(configPath, 'utf-8')\n const yaml = await import('js-yaml')\n return yaml.load(content) as HealthConfig\n } catch {\n return null\n }\n}\n\n// ===== HealthChecker Class =====\n\n/**\n * HealthChecker - Runs comprehensive diagnostics\n */\nexport class HealthChecker {\n private projectRoot: string\n private cacheManager?: CacheManager\n private typeRegistry?: TypeRegistry\n private config?: HealthConfig\n\n constructor(options: HealthCheckerOptions = {}) {\n this.projectRoot = options.projectRoot || process.cwd()\n this.cacheManager = options.cacheManager\n this.typeRegistry = options.typeRegistry\n this.config = options.config\n }\n\n /**\n * Get configuration path\n */\n getConfigPath(): string {\n return path.join(this.projectRoot, '.fractary', 'config.yaml')\n }\n\n /**\n * Get legacy configuration path\n */\n getLegacyConfigPath(): string {\n return path.join(this.projectRoot, '.fractary', 'plugins', 'codex', 'config.json')\n }\n\n /**\n * Check configuration health\n */\n async checkConfiguration(): Promise<HealthCheck> {\n const configPath = this.getConfigPath()\n const legacyConfigPath = this.getLegacyConfigPath()\n\n try {\n // Check for YAML config\n if (!(await fileExists(configPath))) {\n // Check for legacy config\n if (await fileExists(legacyConfigPath)) {\n return {\n name: 'Configuration',\n status: 'warn',\n message: 'Legacy JSON configuration detected',\n details: 'Migration from legacy JSON format may be required',\n }\n }\n\n return {\n name: 'Configuration',\n status: 'fail',\n message: 'No configuration found',\n details: 'Run \"fractary-codex configure\" to create configuration',\n }\n }\n\n // Load config if not pre-loaded\n const config = this.config || (await readYamlConfig(configPath))\n\n if (!config) {\n return {\n name: 'Configuration',\n status: 'fail',\n message: 'Invalid configuration',\n details: 'Could not parse YAML configuration',\n }\n }\n\n // Check organization (support both root-level and codex section)\n const organization = config.organization || config.codex?.organization\n\n if (!organization) {\n return {\n name: 'Configuration',\n status: 'warn',\n message: 'No organization configured',\n details: 'Organization slug is required',\n }\n }\n\n // Check storage providers\n const providerCount = config.storage?.length || 0\n if (providerCount === 0) {\n return {\n name: 'Configuration',\n status: 'warn',\n message: 'No storage providers configured',\n details: 'At least one storage provider is recommended',\n }\n }\n\n return {\n name: 'Configuration',\n status: 'pass',\n message: 'Valid YAML configuration',\n details: `Organization: ${organization}, ${providerCount} storage provider(s)`,\n }\n } catch (error: any) {\n return {\n name: 'Configuration',\n status: 'fail',\n message: 'Invalid configuration',\n details: error.message,\n }\n }\n }\n\n /**\n * Check cache health\n */\n async checkCache(): Promise<HealthCheck> {\n try {\n if (!this.cacheManager) {\n return {\n name: 'Cache',\n status: 'warn',\n message: 'No cache manager available',\n details: 'Cache manager not initialized',\n }\n }\n\n const stats = await this.cacheManager.getStats()\n\n if (stats.entryCount === 0) {\n return {\n name: 'Cache',\n status: 'warn',\n message: 'Cache is empty',\n details: 'Fetch some documents to populate cache',\n }\n }\n\n const healthPercent = stats.entryCount > 0 ? (stats.freshCount / stats.entryCount) * 100 : 100\n\n if (healthPercent < CACHE_HEALTH_THRESHOLD_PERCENT) {\n return {\n name: 'Cache',\n status: 'warn',\n message: `${stats.entryCount} entries (${healthPercent.toFixed(0)}% fresh)`,\n details: `${stats.expiredCount} expired, ${stats.staleCount} stale`,\n }\n }\n\n return {\n name: 'Cache',\n status: 'pass',\n message: `${stats.entryCount} entries (${healthPercent.toFixed(0)}% fresh)`,\n details: `${formatBytes(stats.totalSize)} total`,\n }\n } catch (error: any) {\n return {\n name: 'Cache',\n status: 'fail',\n message: 'Cache check failed',\n details: error.message,\n }\n }\n }\n\n /**\n * Check cache health from stats (for use with CodexClient)\n */\n checkCacheFromStats(stats: CacheStats): HealthCheck {\n if (stats.entryCount === 0) {\n return {\n name: 'Cache',\n status: 'warn',\n message: 'Cache is empty',\n details: 'Fetch some documents to populate cache',\n }\n }\n\n const healthPercent = stats.entryCount > 0 ? (stats.freshCount / stats.entryCount) * 100 : 100\n\n if (healthPercent < CACHE_HEALTH_THRESHOLD_PERCENT) {\n return {\n name: 'Cache',\n status: 'warn',\n message: `${stats.entryCount} entries (${healthPercent.toFixed(0)}% fresh)`,\n details: `${stats.expiredCount} expired, ${stats.staleCount} stale`,\n }\n }\n\n return {\n name: 'Cache',\n status: 'pass',\n message: `${stats.entryCount} entries (${healthPercent.toFixed(0)}% fresh)`,\n details: `${formatBytes(stats.totalSize)} total`,\n }\n }\n\n /**\n * Check storage providers\n */\n async checkStorage(): Promise<HealthCheck> {\n const configPath = this.getConfigPath()\n\n try {\n const config = this.config || (await readYamlConfig(configPath))\n\n if (!config) {\n return {\n name: 'Storage',\n status: 'fail',\n message: 'Configuration not available',\n details: 'Could not read configuration',\n }\n }\n\n const providers = config.storage || []\n\n if (providers.length === 0) {\n return {\n name: 'Storage',\n status: 'warn',\n message: 'No storage providers configured',\n details: 'Configure at least one provider in .fractary/config.yaml',\n }\n }\n\n const providerTypes = providers.map((p) => p.type).join(', ')\n const hasGitHub = providers.some((p) => p.type === 'github')\n\n if (hasGitHub && !process.env.GITHUB_TOKEN) {\n return {\n name: 'Storage',\n status: 'warn',\n message: `${providers.length} provider(s): ${providerTypes}`,\n details: 'GITHUB_TOKEN not set (required for GitHub provider)',\n }\n }\n\n return {\n name: 'Storage',\n status: 'pass',\n message: `${providers.length} provider(s): ${providerTypes}`,\n details: 'All configured providers available',\n }\n } catch (error: any) {\n return {\n name: 'Storage',\n status: 'fail',\n message: 'Storage check failed',\n details: error.message,\n }\n }\n }\n\n /**\n * Check type registry\n */\n checkTypes(): HealthCheck {\n try {\n if (!this.typeRegistry) {\n return {\n name: 'Type Registry',\n status: 'warn',\n message: 'No type registry available',\n details: 'Type registry not initialized',\n }\n }\n\n const allTypes = this.typeRegistry.list()\n const builtinCount = allTypes.filter((t) => this.typeRegistry!.isBuiltIn(t.name)).length\n const customCount = allTypes.length - builtinCount\n\n return {\n name: 'Type Registry',\n status: 'pass',\n message: `${allTypes.length} types registered`,\n details: `${builtinCount} built-in, ${customCount} custom`,\n }\n } catch (error: any) {\n return {\n name: 'Type Registry',\n status: 'fail',\n message: 'Type registry check failed',\n details: error.message,\n }\n }\n }\n\n /**\n * Check type registry from registry instance\n */\n checkTypesFromRegistry(registry: TypeRegistry): HealthCheck {\n try {\n const allTypes = registry.list()\n const builtinCount = allTypes.filter((t) => registry.isBuiltIn(t.name)).length\n const customCount = allTypes.length - builtinCount\n\n return {\n name: 'Type Registry',\n status: 'pass',\n message: `${allTypes.length} types registered`,\n details: `${builtinCount} built-in, ${customCount} custom`,\n }\n } catch (error: any) {\n return {\n name: 'Type Registry',\n status: 'fail',\n message: 'Type registry check failed',\n details: error.message,\n }\n }\n }\n\n /**\n * Run all health checks\n */\n async runAll(): Promise<HealthResult> {\n const checks: HealthCheck[] = []\n\n checks.push(await this.checkConfiguration())\n checks.push(await this.checkCache())\n checks.push(await this.checkStorage())\n checks.push(this.checkTypes())\n\n return this.summarize(checks)\n }\n\n /**\n * Run specified health checks\n */\n async run(checkNames: string[]): Promise<HealthResult> {\n const checks: HealthCheck[] = []\n\n for (const name of checkNames) {\n switch (name.toLowerCase()) {\n case 'configuration':\n case 'config':\n checks.push(await this.checkConfiguration())\n break\n case 'cache':\n checks.push(await this.checkCache())\n break\n case 'storage':\n checks.push(await this.checkStorage())\n break\n case 'types':\n case 'typeregistry':\n case 'type-registry':\n checks.push(this.checkTypes())\n break\n }\n }\n\n return this.summarize(checks)\n }\n\n /**\n * Create summary from checks\n */\n summarize(checks: HealthCheck[]): HealthResult {\n const passed = checks.filter((c) => c.status === 'pass').length\n const warned = checks.filter((c) => c.status === 'warn').length\n const failed = checks.filter((c) => c.status === 'fail').length\n\n let status: 'healthy' | 'degraded' | 'unhealthy'\n if (failed > 0) {\n status = 'unhealthy'\n } else if (warned > 0) {\n status = 'degraded'\n } else {\n status = 'healthy'\n }\n\n return {\n summary: {\n total: checks.length,\n passed,\n warned,\n failed,\n healthy: failed === 0,\n status,\n },\n checks,\n }\n }\n}\n\n/**\n * Create a HealthChecker instance\n *\n * @param options - HealthChecker options\n * @returns HealthChecker instance\n */\nexport function createHealthChecker(options: HealthCheckerOptions = {}): HealthChecker {\n return new HealthChecker(options)\n}\n","/**\n * CodexClient - High-level facade for Codex SDK\n *\n * Provides a unified interface for document fetching, cache management,\n * and type registry access. Used by both CLI and MCP server.\n */\n\nimport type { CacheManager, CacheStats, ListEntriesOptions, ListEntriesResult } from '../cache/index.js'\nimport type { StorageManager } from '../storage/index.js'\nimport type { TypeRegistry } from '../types/index.js'\nimport type { UnifiedConfig, CodexYamlConfig } from '../core/yaml/index.js'\nimport type { HealthCheck } from '../health/index.js'\n\n/**\n * Options for creating CodexClient\n */\nexport interface CodexClientOptions {\n /** Path to config file (default: .fractary/config.yaml) */\n configPath?: string\n /** Override cache directory */\n cacheDir?: string\n /** Override organization slug */\n organizationSlug?: string\n}\n\n/**\n * Options for fetch operations\n */\nexport interface ClientFetchOptions {\n /** Bypass cache and fetch fresh content */\n bypassCache?: boolean\n /** Override TTL for this fetch */\n ttl?: number\n /** Git branch to fetch from */\n branch?: string\n}\n\n/**\n * Result from fetch operation\n */\nexport interface ClientFetchResult {\n content: Buffer\n fromCache: boolean\n contentType?: string\n metadata?: {\n fetchedAt?: string\n expiresAt?: string\n contentLength?: number\n }\n}\n\n/**\n * Unified Codex client\n *\n * Provides high-level operations for:\n * - Document fetching with integrated caching\n * - Cache management and invalidation\n * - Type registry access\n * - Health diagnostics\n */\nexport class CodexClient {\n private cache: CacheManager\n private storage: StorageManager\n private types: TypeRegistry\n private organization: string\n private unifiedConfig: UnifiedConfig | null\n\n /**\n * Private constructor - use CodexClient.create() instead\n */\n private constructor(\n cache: CacheManager,\n storage: StorageManager,\n types: TypeRegistry,\n organization: string,\n unifiedConfig: UnifiedConfig | null = null\n ) {\n this.cache = cache\n this.storage = storage\n this.types = types\n this.organization = organization\n this.unifiedConfig = unifiedConfig\n }\n\n /**\n * Create a new CodexClient instance\n *\n * Loads configuration, initializes storage/cache/type managers.\n *\n * @param options - Optional configuration\n * @returns Promise resolving to CodexClient instance\n */\n static async create(options?: CodexClientOptions): Promise<CodexClient> {\n const { readUnifiedConfig } = await import('../core/yaml/index.js')\n const { createStorageManager } = await import('../storage/index.js')\n const { CacheManager } = await import('../cache/manager.js')\n const { createDefaultRegistry } = await import('../types/index.js')\n const { CodexError, ConfigurationError } = await import('../errors/index.js')\n\n const configPath = options?.configPath || '.fractary/config.yaml'\n let unifiedConfig: UnifiedConfig = {}\n let codexConfig: CodexYamlConfig | undefined\n\n try {\n unifiedConfig = await readUnifiedConfig(configPath, { expandEnv: true })\n codexConfig = unifiedConfig.codex\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n // Non-default config was explicitly requested but failed to load\n if (options?.configPath) {\n throw new ConfigurationError(\n `Failed to load configuration from ${configPath}: ${errorMessage}`\n )\n }\n // Default config - missing is fine, parse errors should surface\n if (!errorMessage.includes('ENOENT')) {\n throw new ConfigurationError(\n `Config file exists but could not be parsed: ${errorMessage}`\n )\n }\n }\n\n try {\n const organization = options?.organizationSlug || codexConfig?.organization || ''\n const cacheDir = options?.cacheDir || codexConfig?.cacheDir || codexConfig?.cache?.cacheDir || '.fractary/codex/cache'\n\n // Build storage manager config\n const storageConfig: Record<string, unknown> = {}\n\n if (codexConfig?.storage && Array.isArray(codexConfig.storage)) {\n for (const provider of codexConfig.storage) {\n if (provider.type === 'github') {\n storageConfig.github = {\n token: provider.token || process.env.GITHUB_TOKEN,\n apiBaseUrl: provider.apiBaseUrl || 'https://api.github.com',\n branch: provider.branch || 'main',\n }\n } else if (provider.type === 'http') {\n storageConfig.http = {\n baseUrl: provider.baseUrl,\n headers: provider.headers,\n timeout: provider.timeout || 30000,\n }\n } else if (provider.type === 'local') {\n storageConfig.local = {\n basePath: provider.basePath || './knowledge',\n followSymlinks: provider.followSymlinks || false,\n }\n }\n }\n }\n\n // Add archive config if present\n if (codexConfig?.archive) {\n storageConfig.s3Archive = {\n projects: codexConfig.archive.projects || {},\n fractaryCli: process.env.FRACTARY_CLI || 'fractary',\n }\n }\n\n // Add file plugin config if present\n if (unifiedConfig.file) {\n storageConfig.filePlugin = {\n config: unifiedConfig,\n }\n }\n\n const storage = createStorageManager(storageConfig as any)\n\n // Initialize cache manager\n const cache = new CacheManager({\n cacheDir,\n defaultTtl: codexConfig?.cache?.defaultTtl || 86400,\n maxMemoryEntries: codexConfig?.cache?.maxMemoryEntries || 100,\n maxMemorySize: codexConfig?.cache?.maxMemorySize || 50 * 1024 * 1024,\n enablePersistence: codexConfig?.cache?.enablePersistence !== false,\n })\n\n // Connect storage to cache\n cache.setStorageManager(storage)\n\n // Initialize type registry with built-in types\n const types = createDefaultRegistry()\n\n // Load and register custom types from config\n if (codexConfig?.types?.custom) {\n for (const [name, customType] of Object.entries(codexConfig.types.custom)) {\n const ct = customType as any\n types.register({\n name,\n description: ct.description || `Custom type: ${name}`,\n patterns: ct.patterns || [],\n defaultTtl: ct.defaultTtl || 86400,\n archiveAfterDays: ct.archiveAfterDays !== undefined ? ct.archiveAfterDays : null,\n archiveStorage: ct.archiveStorage || null,\n })\n }\n }\n\n return new CodexClient(cache, storage, types, organization, unifiedConfig)\n } catch (error) {\n if (error instanceof CodexError) {\n throw error\n }\n throw new CodexError(\n `Failed to initialize CodexClient: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n }\n\n /**\n * Fetch a document by codex:// URI\n */\n async fetch(uri: string, options?: ClientFetchOptions): Promise<ClientFetchResult> {\n const { validateUri, resolveReference } = await import('../references/index.js')\n const { CodexError } = await import('../errors/index.js')\n\n if (!validateUri(uri)) {\n throw new CodexError(`Invalid codex URI: ${uri}`)\n }\n\n const resolved = resolveReference(uri)\n if (!resolved) {\n throw new CodexError(`Failed to resolve URI: ${uri}`)\n }\n\n try {\n const isFilePlugin = resolved.isCurrentProject && resolved.sourceType === 'file-plugin'\n\n if (options?.bypassCache) {\n const result = await this.storage.fetch(resolved, { branch: options.branch })\n if (!isFilePlugin) {\n await this.cache.set(uri, result)\n }\n return {\n content: result.content,\n fromCache: false,\n contentType: result.contentType,\n metadata: {\n fetchedAt: new Date().toISOString(),\n contentLength: result.size,\n },\n }\n }\n\n const result = await this.cache.get(resolved, {\n ttl: options?.ttl,\n branch: options?.branch,\n })\n\n return {\n content: result.content,\n fromCache: true,\n contentType: result.contentType,\n metadata: {\n contentLength: result.size,\n },\n }\n } catch (error) {\n throw new CodexError(\n `Failed to fetch ${uri}: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n }\n\n /**\n * Invalidate cache entries\n */\n async invalidateCache(pattern?: string): Promise<void> {\n if (pattern) {\n await this.cache.invalidate(pattern)\n } else {\n await this.cache.clear()\n }\n }\n\n /**\n * Invalidate cache entries matching a regex pattern\n * @returns Number of entries cleared\n */\n async invalidateCachePattern(regex: RegExp): Promise<number> {\n return this.cache.invalidatePattern(regex)\n }\n\n /**\n * Get cache statistics\n */\n async getCacheStats(): Promise<CacheStats & { memoryEntries: number; memorySize: number }> {\n return this.cache.getStats()\n }\n\n /**\n * List cache entries with filtering, sorting, and pagination\n */\n async listCacheEntries(options?: ListEntriesOptions): Promise<ListEntriesResult> {\n return this.cache.listEntries(options)\n }\n\n /**\n * Run health checks\n */\n async getHealthChecks(): Promise<HealthCheck[]> {\n const checks: HealthCheck[] = []\n\n // Check cache\n try {\n const stats = await this.cache.getStats()\n if (stats.entryCount === 0) {\n checks.push({\n name: 'Cache',\n status: 'warn',\n message: 'Cache is empty',\n details: 'Fetch some documents to populate cache',\n })\n } else {\n const healthPercent = (stats.freshCount / stats.entryCount) * 100\n if (healthPercent < 50) {\n checks.push({\n name: 'Cache',\n status: 'warn',\n message: `${stats.entryCount} entries (${healthPercent.toFixed(0)}% fresh)`,\n details: `${stats.expiredCount} expired, ${stats.staleCount} stale`,\n })\n } else {\n const { formatBytes } = await import('../core/utils/index.js')\n checks.push({\n name: 'Cache',\n status: 'pass',\n message: `${stats.entryCount} entries (${healthPercent.toFixed(0)}% fresh)`,\n details: `${formatBytes(stats.totalSize)} total`,\n })\n }\n }\n } catch (error: any) {\n checks.push({\n name: 'Cache',\n status: 'fail',\n message: 'Cache check failed',\n details: error.message,\n })\n }\n\n // Check storage\n try {\n const filePluginProvider = this.storage.getProvider('file-plugin')\n const providers = this.storage.getProviders()\n checks.push({\n name: 'Storage',\n status: 'pass',\n message: `${providers.length} provider(s) available`,\n details: filePluginProvider ? 'File plugin active' : undefined,\n })\n } catch (error: any) {\n checks.push({\n name: 'Storage',\n status: 'fail',\n message: 'Storage check failed',\n details: error.message,\n })\n }\n\n // Check type registry\n try {\n const allTypes = this.types.list()\n const builtinCount = allTypes.filter(t => this.types.isBuiltIn(t.name)).length\n const customCount = allTypes.length - builtinCount\n checks.push({\n name: 'Type Registry',\n status: 'pass',\n message: `${allTypes.length} types registered`,\n details: `${builtinCount} built-in, ${customCount} custom`,\n })\n } catch (error: any) {\n checks.push({\n name: 'Type Registry',\n status: 'fail',\n message: 'Type registry check failed',\n details: error.message,\n })\n }\n\n return checks\n }\n\n /**\n * Get the type registry\n */\n getTypeRegistry(): TypeRegistry {\n return this.types\n }\n\n /**\n * Get the cache manager (for advanced operations)\n */\n getCacheManager(): CacheManager {\n return this.cache\n }\n\n /**\n * Get the storage manager (for advanced operations)\n */\n getStorageManager(): StorageManager {\n return this.storage\n }\n\n /**\n * Get the organization slug\n */\n getOrganization(): string {\n return this.organization\n }\n\n /**\n * Get the unified config (for file sources list, etc.)\n */\n getUnifiedConfig(): UnifiedConfig | null {\n return this.unifiedConfig\n }\n}\n\n/**\n * Create a CodexClient instance (factory function)\n */\nexport async function createCodexClient(options?: CodexClientOptions): Promise<CodexClient> {\n return CodexClient.create(options)\n}\n"],"mappings":"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","names":["exports","type","node","exports","module","exports","module","exports","module","max","str","exports","module","util","isObject","exports","module","exports","module","exports","module","exports","module","CHAR_COMMA","CHAR_LEFT_SQUARE_BRACKET","CHAR_RIGHT_SQUARE_BRACKET","CHAR_DOUBLE_QUOTE","CHAR_SINGLE_QUOTE","type","index","exports","module","require_constants","exports","module","require_utils","exports","str","exports","module","CHAR_ASTERISK","CHAR_COMMA","CHAR_LEFT_SQUARE_BRACKET","CHAR_RIGHT_SQUARE_BRACKET","str","require_parse","exports","module","type","opts","value","rest","str","source","exports","module","isObject","str","state","require_picomatch","exports","module","exports","module","util","str","exception","map","schema","type","str","string","extend","util","objectUtil","json","map","map","pairs","errorUtil","errorMap","ctx","result","schema","pairs","issues","type","elements","processed","type","result","r","ZodFirstPartyTypeKind","__esm","__export","path","type","micromatch","custom","__esm","path","fs","init_errors","source","fs3","type","__export","__esm","path","fs","__export","init_manager","CODEX_URI_PREFIX","__esm","__export","readUnifiedConfig","formatBytes","z","init_manager"]}
|