{"_id":"@kontourai/traverse","_rev":"37-4dc4214b08e0e1950705ae0b829dc2ad","name":"@kontourai/traverse","dist-tags":{"latest":"4.1.0"},"versions":{"0.1.0":{"name":"@kontourai/traverse","version":"0.1.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.1.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"6b44d2d8532a4d7e016dba2f02695adaeb4e8daf","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.1.0.tgz","fileCount":13,"integrity":"sha512-+BCHtvGxBySqbVySV0u15G6Sx5rcyJDu1C2vQ4uevvSokUwXYdCy0aqggMeBMM5NYNSJIRjg5XacijL8JM1Vhw==","signatures":[{"sig":"MEQCIDFXJVTeD/5Sbv2AAiCHDLm6mCIfvppWTe+fpoUOVPkAAiAdTMcAyzA7c4noVnWqB6js4EEgLb+K6jv0QxtLqy0eag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60242},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"3ea1b4098b30750c7437bf9c3ca5951dfcbc0fa1","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.1.0_1783022732747_0.31051836419424017","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@kontourai/traverse","version":"0.2.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.2.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"4e8176d5c5ac19b4b2093fce42dcca2de519ec6a","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.2.0.tgz","fileCount":13,"integrity":"sha512-VrWwg+XGH8IqvYNH5WUMLGdghg3RE/AVmfIGo4PX+PjzQ9EUKQh8Z5946+SZlqZ3yS1dj8XKaST8YAkvgTpPag==","signatures":[{"sig":"MEQCIDSIcM+//DalEfgclM127MB7dKmdIlFZwkxtvRCDhSB6AiAfHKX7RYsPOtBDSvgDmAybOgscRsSCInnLGZUyxD0Yxg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":64453},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"26f121efd86819df20c3d70f306b4ea52b23062f","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.2.0_1783025434737_0.8611684704550706","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@kontourai/traverse","version":"0.3.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.3.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"74865a4becf7ab147f7fab057c79e490331b6c5d","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.3.0.tgz","fileCount":25,"integrity":"sha512-cM/2dZzMY34HTIl0/fiETbbexqAbT1+bCO2Whk+die5z1q3HsEzRwiod4yUHJVv0H3bkL7G4jVBx6K/oOSitFA==","signatures":[{"sig":"MEQCIGMF+EUkByILZ1x8uc9ZwLkiY871Mju/xjFH+8ck6ruYAiA8tw2KyMZb52+GozpLaPJGqm66MaXJUyrzdmiBjC7TAQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":118422},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"4cb9a639a55233bbf500e1b3e656f94ce106cb2f","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.3.0_1783035802330_0.9419449376972557","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@kontourai/traverse","version":"0.4.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.4.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"8184a26373b551a4cc6f9039c48e386b983b344a","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.4.0.tgz","fileCount":25,"integrity":"sha512-8KxBxBbW8GdBw8xSuCw6WyOa7owmy4S/bZtqIfT4gFbAvfUCQ2DgsK/RBk/pTBiiXyV0nmLPhewmEd/aa7RpIw==","signatures":[{"sig":"MEYCIQCQTpJr9xZvmVYVqL76dMXp399K6pS4DjVdEJNTQpHoEQIhAPVNd7MbuNSiBQjyccZgU+adE0VrvZN+KeCuhNY4rrHi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":124941},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"a5e4ef378c9e706da6b9689ff96bd8b7d27982de","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.4.0_1783040770253_0.12092904641314495","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@kontourai/traverse","version":"0.5.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.5.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"b2ce6fa96d3de87b9f279919ec7a1c88c593ffbe","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.5.0.tgz","fileCount":27,"integrity":"sha512-tMKiRaj/rXK5LCf3i/OB3jWce+Gori9yJptfxj+JFXUoZoEpOoAduczSa9SIEnboEODG989q1CzVtDAHKANXWA==","signatures":[{"sig":"MEQCIGV0ItYpH9j060WGq/B+MXU+teF1yiFqoJ7bfmsiEKMcAiBVxFp2FoBHW5d8URopVQZihOaiTTT7c979eAyn+7cU4w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":157558},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"545067421a19516736163152887043e261543fa3","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.5.0_1783043142515_0.560416464457109","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@kontourai/traverse","version":"0.5.1","license":"Apache-2.0","_id":"@kontourai/traverse@0.5.1","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"eaff33fae396b5c592b3bfa6c03f23e788a1141e","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.5.1.tgz","fileCount":27,"integrity":"sha512-6ABb6Jr02XrOroVV3cqaQo9Sb52Zq7I4++HYSPhzZL4QwY+qQ3OrX3Ab16UUN7ZrAdC4d3F0ECEPV6vLPc4XRg==","signatures":[{"sig":"MEQCIGsIc//fOU+BQJ3/AYEkQGKeaHW6GjIIdPkeO8KVK80kAiA1ATaEJD/4c6h0hMjfijPZXlnwk+QXKXj8hAh3yTfg3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":159020},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"cfbb6aa3f0909a142f368c518c9f3a6be57c14a2","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.5.1_1783043837445_0.9166102857290614","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@kontourai/traverse","version":"0.6.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.6.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"da38cc4c53567db9e3c969fb612e9dacee2ac0c6","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.6.0.tgz","fileCount":29,"integrity":"sha512-zpCcnkmVgEktdI3+jg9f2rtUUPEM6yXZLPN6PfIn5oBo/UbnqD6tH3y56w3WOHJEsRogQuxQw6yH/depZzNspQ==","signatures":[{"sig":"MEYCIQC7BHX2D6RwEKYF4rzoRZ38AjUZW8oxpyzBn6YKtuRvVwIhANmSA2wo3c/Zg0c28Yq4u3IgUZU1jSu7Cvmx9nWZyzSe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":190322},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"39406ffa89acece3c8804b99fddaff3281d1d8fc","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.6.0_1783048446425_0.847069739960657","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@kontourai/traverse","version":"0.7.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.7.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"22b21676e7d934ae9c2c2ca811929fd6cdd84aac","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.7.0.tgz","fileCount":29,"integrity":"sha512-nEgP0EYjMd9UlPW2KvkdjAuevlY1mm0B51FLCNRbHIZnDDLKl1kc7Y+GqcezCJKSola3V7fzzE2lMjfLnwFYbQ==","signatures":[{"sig":"MEQCIGhfB+XqS2QJlEnWiIgNgb7dreq6GbwqBgENXjMZ4G8uAiBZpXxcJOGoxsv5GUPYKu48sIro5AESF+a6hQpP6WOVug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":190538},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"d5a599badbf1d912b28049d42a643e80b9b2b97f","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.7.0_1783056350366_0.512326535427394","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@kontourai/traverse","version":"0.8.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.8.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"cdab5c52f77bd79a64f02e8b0fcc18f0133b9dc3","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.8.0.tgz","fileCount":29,"integrity":"sha512-/35XZxbvo6cCcjFVhVE2pnDe7bj53+5IhsKuLqtONSIKi4L8+i0uK50ngic8sTXsazLJ+UJ7wuP8eo5rR3tsqA==","signatures":[{"sig":"MEUCIQDnSp20g4hxTdw+n551W0JlopuAIQW/i4Pu5MkbAQRGqwIgCZdMWtQN0wkCDvUhcWGcMwRXiuNPdGAkN81blVKf6+A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":201366},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"e113af7cd04ba5f9a915bc09f487b1f0b40beb6b","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.8.0_1783110044913_0.42896232740723694","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@kontourai/traverse","version":"0.9.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.9.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"d35af1c50fe82ba7d97d9cc7c570eefdd327c753","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.9.0.tgz","fileCount":29,"integrity":"sha512-C2WL6tTk9zLYLWm6S/CKki4iOXVLyiX0ZFSBE9xdjj49zlBLYlMKPfL7mW/KJgiUL40WS2eX+bnuJucQXE+TYg==","signatures":[{"sig":"MEUCIQDWuKvA8AyewJiy5nC1yB39rKVJrXrAHlaE1RUTkfcydAIgQL5NiJCtcXoAOrQrxYymP0FT6Zk9VMpy12Yv5X42NSk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":222961},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"b9b298c561ef9a810a7564d1bf5aaee8b8025269","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.9.0_1783351657964_0.6090068369359529","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@kontourai/traverse","version":"0.10.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.10.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"346f4582e4031fc0e7df15de1d358bd3be3efa12","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.10.0.tgz","fileCount":31,"integrity":"sha512-UU+EeY7tJ/qpdsM7nv3P3UHzg6DJ1ooD/GytYBXOjBhRcpbX135lT5URTPThRvfGcOr0zs7lJNwxbRlHibPIvQ==","signatures":[{"sig":"MEQCIHULfh/Ooyo4rNKgE4idGPN8MYcFj+OMHvHPChV04DylAiAJ48dyBCq6tigJoWYqcMMN9I4GhA5lbUVKkzu5HTXx6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":261603},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"e166a4d42de46e26ec87912b8ef09d31e1173add","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.10.0_1783359982642_0.757995269847517","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@kontourai/traverse","version":"0.10.1","license":"Apache-2.0","_id":"@kontourai/traverse@0.10.1","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"100be2d1e9037735db788f693cabe5d92b100b7f","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.10.1.tgz","fileCount":31,"integrity":"sha512-JAsSmocmf9Ad7uKml2cfYdIBdmhrZVXZE7HyK4+LFx7S5e/+TJFKT7+ASPXdzUxA2nAwlAE5POPe9RyKcwBByA==","signatures":[{"sig":"MEYCIQD+n9lbwdpPNLrLnmKuWtDMAoM31YiimJ8dgoupNRzmwwIhAO01z/8UsCsp7ba/5FlivRnqIRwJpyH8re8Hj+w/PUgF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.10.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":262669},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"5c0ffde88688849662cdf44e97f3cf156062c34a","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.10.1_1783365457385_0.21662987134392897","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@kontourai/traverse","version":"0.11.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.11.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"8cbbb71665d6ec0cfbc4fe73b04159b860f7687a","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.11.0.tgz","fileCount":33,"integrity":"sha512-cowRXVZtJe3blOSQkQnaA99iU7BsMY/ejXFnIUa6kFZH1NJ9D0pXxI0h+gS4R2fek9MoBZf367gSVZ/6o5JnPQ==","signatures":[{"sig":"MEUCIFCgcou/x/BwjHirH5tTIYe9F91+uDfcVN9o1jk0TO8XAiEA/5j4ZehPaT/d+Md9OeVV8Xd0VxmVscWqRPBzTP4Ks9s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":281976},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"002014b2f20ed85c10d5447873a8d5a72675c57c","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.11.0_1783380535882_0.43189837573294154","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@kontourai/traverse","version":"0.12.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.12.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"cef2a9628400a91f7d0aa3e055c737ed37037b13","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.12.0.tgz","fileCount":33,"integrity":"sha512-Hwq50kGfHX2UKrotkVMf9BHx6CXOmmzfxtrxZFAxPEv2dytcWRU7CbjQfEY1BjVpb8bOTPO0TnVXNGFkjDfRFg==","signatures":[{"sig":"MEUCIQCA8RHxBZdTNDPoYWNNg9tOLHoI/LEkFgOkpnZrw7baqAIgZ4EFBt20+US6oax9As9vi9dRpuPG99+WNP4oaYBSS7o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":287182},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"ecb1a4a13b7c4b970dfcf142d4002051d3ee2884","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.12.0_1783426605181_0.7079855842539351","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@kontourai/traverse","version":"0.13.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.13.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"e24c98f535a5547d79450a9c507a1f9a745ba387","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.13.0.tgz","fileCount":33,"integrity":"sha512-HO1PgdSS7Z2Xkdh6hucQxO7o6qsZeTk0bRe7lkkXSFGgehpMF3zGkV3KeTfN5D4axToXcsR+cYidOQ1oVDInow==","signatures":[{"sig":"MEQCIEt+n9Rdqux5qrxd8JKelj1TcWg09N6cx2o772ert82/AiBHxGeBHht7u4OO1k2/2tUf+z87u2mAaNg7agiyHP68TA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":299092},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"4e860a0f28025b8b031e76b6a78cc48e51914ce9","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.13.0_1783432207863_0.5945570942149874","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@kontourai/traverse","version":"0.14.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.14.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"8946db0bf344159089637926155b6487dc8a5221","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.14.0.tgz","fileCount":33,"integrity":"sha512-R5KA4vLjviff4d8sBTuzVpQMswlqgU2drbB0bQWmgs61xo3gSpFh7pYONrulOKXnFDllxoXAwB4i1XZR8qi64g==","signatures":[{"sig":"MEUCIQCQTePVrFCgIhCVqFBdQVWu+zFRCFQdCyKIWCQpDVzc9gIgLrFdJoPoaaaISVIWL7PO8jO7/bOX0M2u0hpYwNubo3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":306655},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"10cf1ddc7759ead81dc5e9d7894ef88ad007ece0","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.14.0_1783464789665_0.5471403364132197","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"name":"@kontourai/traverse","version":"0.14.1","license":"Apache-2.0","_id":"@kontourai/traverse@0.14.1","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"b7f6f280e3b39960e8185c11275e00c877df7c50","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.14.1.tgz","fileCount":33,"integrity":"sha512-vyuD5rklHZtxrBzrm4398yvt+R9fCOZdY1ORIrGXmbCpnbRkhnQ/g4/9bKUVxQlJHfJviLvknVm+stGFVO+WHA==","signatures":[{"sig":"MEUCIQCRio2U/du9ytlfb5AviZhMa1jEMe30wUJsS0RTzwielQIgOmpGl6GjyTkgPoHtnM1d41NWnugLKcnfxBItXMn8lz8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.14.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":308836},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"b5abe0a66dbe4674bc6cd11a0c7fd95e92175835","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.14.1_1783690285445_0.2175518323395711","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@kontourai/traverse","version":"0.15.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.15.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"38112e2517a972ca606e37f874c05d353e3ae0a2","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.15.0.tgz","fileCount":33,"integrity":"sha512-x4BglUhniRifFpy2iDmyVstlyQ+7y32PjaH//rYXH475KmhcuQhBUfG7OL/APe/1kz0Ru7GveNdDNj2KnBw5Pg==","signatures":[{"sig":"MEYCIQDR4rNRaLM5YseOU7EWuCxqgEOqRq/JziXRw18tjJeqzwIhAPaTaoKgfXSv690XonLGAJH7JhbJA0id8jrotG/DziPV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.15.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":315361},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"d54c170a08524fbea40a65552d89f736c377bbb7","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.15.0_1783871580740_0.7969246942749624","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@kontourai/traverse","version":"0.16.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.16.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"a0c84f3e5540e1aa7e6b4de09ce21d91ba11cdbb","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.16.0.tgz","fileCount":35,"integrity":"sha512-B7Yjk+n8WmJ+ZtJLbWDhqZMuYixzzx5fKr0FyubZ1V9HF7Y0RjOCvIuFtHt6A7UV5w/LBbY0XN7wVYGd9xQAjA==","signatures":[{"sig":"MEUCIQCODPqtr5sPz18MmIO/l96UE1g5BaT5y/dwanV+tl4X9gIgGC6BzoUTdVJLJGUby0C1dVb3jLDFjjif3lGly1zAYjM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.16.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":323481},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"879b5d3068a917dff8cefc74127fe7f5e8d5c05b","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.16.0_1784053552995_0.4330688981915074","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@kontourai/traverse","version":"0.17.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.17.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"8b21d7c70d3686fbd09ab103193d39c19a9992e7","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.17.0.tgz","fileCount":35,"integrity":"sha512-7EHGNw2BD4xfdXZTFi6vQlBES6fptCWcLxXRetz+jhdP/K/otp/lGY9ajA5PwboZhkG8zcQO7WqbgBFxYaqnGg==","signatures":[{"sig":"MEYCIQCak1SmcVcHP01+rAoNK3aCWvkeSHIaon1EbFxOW+disQIhAPb/bTeuzjYEujCVpbx5+TEptBEudS8jRsvdZDK8v6cF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":327576},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"82ef8e1838d7229ee495a4661359e50c36bbcdae","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"typescript":">=5.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.17.0_1784121388695_0.32467455253400757","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@kontourai/traverse","version":"0.18.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.18.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"bab04c622bf475640f3878eac10a92621c6cdefc","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.18.0.tgz","fileCount":47,"integrity":"sha512-B7E5LfPcVNEOV0U4VDgf94C/sB/3DepJmld+rSYDOdaxB525wBKA8hmnX8Cfh2ML2/u07T+8T6IWy8PLj83wvw==","signatures":[{"sig":"MEQCICh/YOiELmwt2k5NBdvsl2sYxssWAP0l4CKSuYvsjIG2AiBOZCLEE7E0bHogU/OGWsSgg2//5CZOtDShOqgI1QejOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.18.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":387093},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"ca523e2d64d043b0d77463651185f96aba3f956e","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.18.0_1784560379105_0.29112323308359955","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"@kontourai/traverse","version":"0.19.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.19.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"0cfa6d35d9c1c72be57bd4c40627256b1c10d4bb","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.19.0.tgz","fileCount":49,"integrity":"sha512-zHc9fqT99DByO9GL3wXBLfDbwa1xWkbfJspG/lrXxMkPfo5NKaYAOQFpYpELDDbRYorpTsbJrJJ4Db6RaKNr1Q==","signatures":[{"sig":"MEYCIQDL72Db/kFFP328StlTnDzJ92mnY5t6X1RUZtOwsu+ATwIhAJSg9B+71fVqCf/Kd/lCGWLZqbtU8prOxduh1KpzGJIz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.19.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":430738},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"7314b9ffd79ce01924c18dbb6c68a412da20189d","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.19.0_1784563604790_0.824812263310845","host":"s3://npm-registry-packages-npm-production"}},"0.19.1":{"name":"@kontourai/traverse","version":"0.19.1","license":"Apache-2.0","_id":"@kontourai/traverse@0.19.1","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"7b9044d0ac6f74ab1181e763146f65930014d980","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.19.1.tgz","fileCount":49,"integrity":"sha512-8o6UZAyn5UmFZdkamqQBVTanCzu2cesRVuzmMOb0GGrrKXCIUxFwCLnPOKZpeu3Sxh6w/JuJis/oLfKdbJszCQ==","signatures":[{"sig":"MEQCIGPMBrWfvs1exVEhyUoNbhBBXD1A9lksXhcTzKQRiBGBAiBjsv3RFYS+BbLYY1vdSsUpPxklv7Gix3F+WNLbkiyyGQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.19.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":434151},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"33c883d34092b145ae47e4e98d266780c467bec9","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.19.1_1784737335007_0.8909439920193187","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"@kontourai/traverse","version":"0.20.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.20.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"6fbd27d7d81eccbabe13f314e848dd5249924f65","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.20.0.tgz","fileCount":51,"integrity":"sha512-T48WnfGkcr/ctEl/2unQ37syt2d4XFYr8f8KKYzTaBra8DCnFLYzJWoeBsmnRqdDyBGMvpXeOiiB8OC9gg2GwA==","signatures":[{"sig":"MEUCIQCor4pnOYlRmKxQS4LfTuR66W8fTdMEPkS5I+w5WVeuDwIgCaSPUVfxVIR96bGN3INSBLsZZ7Twco5KZKeqItHsNm4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.20.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":437896},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"42dfd31aaa227eed3c41417da633c3fe11d7ef48","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@kontourai/relay":"^0.1.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.20.0_1784754247697_0.29254986578382103","host":"s3://npm-registry-packages-npm-production"}},"0.20.1":{"name":"@kontourai/traverse","version":"0.20.1","license":"Apache-2.0","_id":"@kontourai/traverse@0.20.1","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"c529788b915a38c1eed652da2da8f9a133923f4d","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.20.1.tgz","fileCount":51,"integrity":"sha512-2UGKWcZgKETiX84ppu0JMKOoXNM0N2R1Nkvzt5DpJmqVB+L7nOGXtpyD1jSGLVb9XWbx/gpr+czgiGH4DJaDrw==","signatures":[{"sig":"MEUCIFwCN7DFbbUxRNwcpBWY+ZcQvpBp5FzoZMkId/cg82kCAiEAg11LHG9VW0xCQqnes1kSAjQSW8WQAGn0428ueBDyVMk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.20.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":440663},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"dd66b0022bad5b10d4e2e1d382e590db78b22268","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@kontourai/relay":"^0.1.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.20.1_1784758709094_0.32631616058659674","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"@kontourai/traverse","version":"0.21.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.21.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"951dd6799c109809117aa427e22c6ca52107189b","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.21.0.tgz","fileCount":51,"integrity":"sha512-cgypqnuRQLA5JbdxuLFX0raQY23cbJPEXmdOIbazZ785qhFytV+P/sH80FKJSCKvHU2tutFeFafRo15TR53dCQ==","signatures":[{"sig":"MEUCIQCNgTnHJwzD1wKMSB89yDWMVmuUFtfA/fUt2HLTsjhNNwIgPmRmM5UojmAf9m9nlsfmKZb65z5lFfxdPzo1Lar85Kg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.21.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":454426},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"fe97ca85e5f0c430160a3fe9f95aa1db539b2389","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@kontourai/relay":"^0.1.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.21.0_1784780118997_0.15298778980631256","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"@kontourai/traverse","version":"0.22.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.22.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"c8d4174028000302953e37aded43d92684d13e38","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.22.0.tgz","fileCount":53,"integrity":"sha512-tEFDOFXwBHnzArjTu+Fn7NgQBvcdmSm6XjYl1yHrADCo4okjD19qBB0JlO3cCHAUeeQm8sR8W5CdzHEvnbx+UQ==","signatures":[{"sig":"MEYCIQCNOBi7Eaesd+XThSOJ09N8qlurvbKEqao/Ipwj8lx6lQIhAJItG50XX94qtEBpcOGdGp/axJtR9muoskwix0lG4YvW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.22.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":457351},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"28f673fd94544f4aa3252c44cb347954101ea1cf","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@kontourai/relay":"^0.1.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.22.0_1784780928587_0.4064103088031785","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"@kontourai/traverse","version":"0.23.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.23.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"cf48defd43f8f8f24d88ad6fc080dcc4ee4834a8","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.23.0.tgz","fileCount":53,"integrity":"sha512-MwEUVrrX50SycL7Eq9SCD/3OgQwNR58jhWZEAn0/zYTkG7uba5Bu3KfRIG6F1Yc8CJPf+Gcn5FUbJayFKnCcsA==","signatures":[{"sig":"MEUCIQDXkJY99ShxdKdCQKGkqmydO0CEWELe3tS8mS0jxlxTxAIgKX03r5dM2MuRWc+m9EMLz2UFeByKvLUMX5ygsTd8iSo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.23.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":461165},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"5848945d70cc5a9c778305ab8902be8b9469ab0c","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js tests/*.test.mjs","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node --test tests/content-boundary-script.test.cjs && node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs","eval:multipass-context:live":"npm run build --silent && node evals/grounded-extraction/live-multipass-context.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@kontourai/relay":"^0.6.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.23.0_1784858474220_0.6035861227790895","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"@kontourai/traverse","version":"0.24.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.24.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"92799f37e297aed77b3291cda8b3eb1493eedcfe","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.24.0.tgz","fileCount":55,"integrity":"sha512-TUjb3q6uvbeOC5FhJPsnpKk/jx6zlAqhIOam5Wh6Hy1op3b5qudwaj6QMQayZ2hoe54/DCo4f2MSjlV00kT/9g==","signatures":[{"sig":"MEUCIEc5jOf3l+Tp5ROfNHySyoJ7rjIgOBvvj9h1H4mo8ZyoAiEAjCV3woymqIYLEn1xxs8CXIt8zM9NyMbZHbLbAusvHIY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.24.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":466732},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"2110620769a3d2b615d8875f08da348407907a4d","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js tests/*.test.mjs","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node --test tests/content-boundary-script.test.cjs && node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs","eval:multipass-context:live":"npm run build --silent && node evals/grounded-extraction/live-multipass-context.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@kontourai/relay":"^0.6.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.24.0_1785163508901_0.7583635156535142","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"@kontourai/traverse","version":"0.25.0","license":"Apache-2.0","_id":"@kontourai/traverse@0.25.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"562ac0e3446dd87d302bff6610a77c37a4d2cbac","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.25.0.tgz","fileCount":55,"integrity":"sha512-ZbfM9wQhADZCRN4d9zrlPk9L7mQwCbRVQBirUapdc1gabpzyWKYwAE2pt894qHU6IWnGGQDeSJ2A2dcopKb9BQ==","signatures":[{"sig":"MEQCIHg9GK63NuLh8/YLYLob6McM6x6y1FXo/zsBHiMUexKLAiAuaH9p9nQsyQvY5raCPW5GuwBfZlTXK5ITJouqG6nf1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.25.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":471461},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"f8a22103c4927c913caa7ab1eccabf0abb230aad","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js tests/*.test.mjs","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node --test tests/content-boundary-script.test.cjs && node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs","eval:multipass-context:live":"npm run build --silent && node evals/grounded-extraction/live-multipass-context.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^25.6.0","@types/turndown":"^5.0.6","@kontourai/relay":"^0.6.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^1.2.1"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.25.0_1785168448580_0.14081362954687648","host":"s3://npm-registry-packages-npm-production"}},"0.25.1":{"name":"@kontourai/traverse","version":"0.25.1","license":"Apache-2.0","_id":"@kontourai/traverse@0.25.1","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"19293bbe286fe0d4068253030a6a53603803f989","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-0.25.1.tgz","fileCount":55,"integrity":"sha512-WuDQpWid/GbUxBrcvC+rx8e9/3j+B94QOBACYae58mEtTPr8sOGJRwX/GDWQriTmmRQoyhyWFM4LfcFaSF74PA==","signatures":[{"sig":"MEQCIEIlWHAjfFLeDFqcCelDBauJ8ekiQ3gkmuOP2Dv5jCVAAiB4b3+Ipm2I0mkQhKtrNdD/AFTkt9xDgPySPkU+CosnRA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@0.25.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":472626},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"ea38470a66c7e5ae979a204021e1014bdc201580","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js tests/*.test.mjs","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","workflow:sidecar":"flow-agents-workflow-sidecar","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node --test tests/content-boundary-script.test.cjs && node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs","eval:multipass-context:live":"npm run build --silent && node evals/grounded-extraction/live-multipass-context.mjs","workflow:validate-artifacts":"flow-agents-validate-artifacts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.16.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^26.1.2","@types/turndown":"^5.0.6","@kontourai/relay":"^0.6.0","@anthropic-ai/sdk":"^0.54.0","@kontourai/survey":"^2.3.0","@kontourai/flow-agents":"5.5.0"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_0.25.1_1785294842267_0.3251172169733918","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@kontourai/traverse","version":"1.0.0","license":"Apache-2.0","_id":"@kontourai/traverse@1.0.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"89ffec10cc45557d468289260b020460a8158456","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-1.0.0.tgz","fileCount":57,"integrity":"sha512-3MJcUY+M39tHGeTEm4UiEVdnslkdPYflGPF5DGYERqK4HZ4opnaTW5ZWaH6ZnT3UoaAEbpL/PIZ8IYTEyY2FqQ==","signatures":[{"sig":"MEUCIQDxtQGGk7u8JbJ6dU/7kRbYnwhy8+l8TUleIpcjpy0NjwIgBfdtRXvpsNmiHBdeoxnuZ8CrvyB2dWnSbPQcFSQeM0o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDvEK1D3oXTRKZ1qmGB1TT1uWY2fKaQGAjNKNJmIro6JAiAHczM9JzDRQY9e+gRTJdM4iTauJd4ylE0XcKJHZkgRAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":510955},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"edba9ab3d0c9846c8ae7276e3109ec8633b2786c","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js tests/*.test.mjs","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","workflow:sidecar":"flow-agents-workflow-sidecar","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node --test tests/content-boundary-script.test.cjs && node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs","eval:multipass-context:live":"npm run build --silent && node evals/grounded-extraction/live-multipass-context.mjs","workflow:validate-artifacts":"flow-agents-validate-artifacts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.19.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"openai":"^6.49.0","typescript":"^7.0.2","@types/node":"^26.1.2","@types/turndown":"^5.0.6","@kontourai/relay":"^0.6.0","@anthropic-ai/sdk":"^0.116.0","@kontourai/survey":"^3.0.0","@kontourai/flow-agents":"5.10.0"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_1.0.0_1790568627435_0.21941033863522996","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@kontourai/traverse","version":"2.0.0","license":"Apache-2.0","_id":"@kontourai/traverse@2.0.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"0ddc425e51c547d0a0de6214a2b9cf48d04d0e2c","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-2.0.0.tgz","fileCount":57,"integrity":"sha512-XrgHW13WpWuD4CZydaaTZjtKZbQm6MhCmI1r5ncmoejICFzoE3DIM21Okp7xP3BQ2IRFJFxm07dlGp5/EOXfDw==","signatures":[{"sig":"MEUCIQDC6NjVcCcmVKzK5T8mXzgUgq2vB7sDhtrs2oPTfX+JGQIgcHlrAQMfFuoSDnP0CjBtC2AlS+I7hdAMGMRqIIcUcWU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDzCQi59NKoIMBAaf1DWuBVI8X7r3AMSTMJFzS6m8qmiwIgOzIF5OaPEQ+DhnzGEW5+VP6lKROGyHePE+TxOshoVto=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":542666},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"e85600aaabd9e6c94b245afe3f149c5d50748693","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js tests/*.test.mjs","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","workflow:sidecar":"flow-agents-workflow-sidecar","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node --test tests/content-boundary-script.test.cjs && node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs","eval:multipass-context:live":"npm run build --silent && node evals/grounded-extraction/live-multipass-context.mjs","workflow:validate-artifacts":"flow-agents-validate-artifacts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.19.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"openai":"^6.49.0","typescript":"^7.0.2","@types/node":"^26.1.2","@types/turndown":"^5.0.6","@kontourai/relay":"^0.6.0","@anthropic-ai/sdk":"^0.116.0","@kontourai/survey":"^3.0.0","@kontourai/flow-agents":"5.10.0"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_2.0.0_1790613447661_0.15681453550015778","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@kontourai/traverse","version":"3.0.0","license":"Apache-2.0","_id":"@kontourai/traverse@3.0.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"234b138f8c90efff190082f433e8188afeb62243","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-3.0.0.tgz","fileCount":59,"integrity":"sha512-TdHdkO3cjLU8gmDG4n1vin950DjBvNqap7bbw90PtpwV4DPs0jhLX341qg+MZUW2+ly9Eb67XK0yao3igRU4KQ==","signatures":[{"sig":"MEUCICHVReIceFezFry795aAN5/6V+9ZiNE0DilRuuaOXxM6AiEA4S29IM04TFjG71eFYRtaK5Hk3YShYntWMudDdS+Feps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBc15w9mf6qEYZBsXhAQehjdAzOrMMjqyVT+u56xajsgAiA5G3JEZbv54JHmRYq+lmfA4SpyTR2hfFWskf1eKsP9fg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":567610},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"72a7c7d9242728a27760b219e9fac320aecc34be","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js tests/*.test.mjs","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","workflow:sidecar":"flow-agents-workflow-sidecar","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node --test tests/content-boundary-script.test.cjs && node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs","eval:multipass-context:live":"npm run build --silent && node evals/grounded-extraction/live-multipass-context.mjs","workflow:validate-artifacts":"flow-agents-validate-artifacts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.19.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"openai":"^6.49.0","typescript":"^7.0.2","@types/node":"^26.1.2","@types/turndown":"^5.0.6","@kontourai/relay":"^0.6.0","@anthropic-ai/sdk":"^0.116.0","@kontourai/survey":"^6.0.0","@kontourai/flow-agents":"5.10.0"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_3.0.0_1790632666142_0.6258694459902163","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@kontourai/traverse","version":"3.0.1","license":"Apache-2.0","_id":"@kontourai/traverse@3.0.1","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"4b109f26bf7b3ae5e334ecace972d586ec488c74","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-3.0.1.tgz","fileCount":59,"integrity":"sha512-jXgp+ZNuAPpEZ1ArBAhEtF4I2MmCKvc+4ztrcQfPsjcWMiAmk25iRWe0h88jx9pOjeeNiBJPC8LhbtCES+u/Wg==","signatures":[{"sig":"MEUCIQDs/i43I/oJRUSYaY/xSDacgZ+E2Y8Wq0rC1QFYukKCCwIgDhUFpZo37Gt1GppLVH6NNvxEFf8VaIa/kafYOXlr648=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD2VUJJsMPJWEWhkGIhGYJZtdaZ3aUAKa7dOWn47+axngIhAKF2eU39G/KK0naaY9Uf98+sbvnBEGJB4A8v2Z6Dcf3+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":568478},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"d29e814da9fd624d9de697a81840285e818a311b","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js tests/*.test.mjs","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","workflow:sidecar":"flow-agents-workflow-sidecar","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node --test tests/content-boundary-script.test.cjs && node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs","eval:multipass-context:live":"npm run build --silent && node evals/grounded-extraction/live-multipass-context.mjs","workflow:validate-artifacts":"flow-agents-validate-artifacts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.19.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"openai":"^6.49.0","typescript":"^7.0.2","@types/node":"^26.1.2","@types/turndown":"^5.0.6","@kontourai/relay":"^0.6.0","@anthropic-ai/sdk":"^0.116.0","@kontourai/survey":"^6.0.0","@kontourai/flow-agents":"5.10.0"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_3.0.1_1790644382552_0.779302425852622","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@kontourai/traverse","version":"4.0.0","license":"Apache-2.0","_id":"@kontourai/traverse@4.0.0","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"homepage":"https://github.com/kontourai/traverse#readme","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"522accfb165a442b0c9aa32fd096ed4ec04b1f94","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-4.0.0.tgz","fileCount":59,"integrity":"sha512-yQHRIczN05POHFJhLqE/jvypW75p3i+VhMgnAoauL1PBFEHkK9j0Upy4O4H8oDIlO1L5Cv98XmDpiQnEEzw/ww==","signatures":[{"sig":"MEQCIHrftfFIBuSsnu6+w2rzZtMOjraaxHseUuSLAxsxYVd3AiAkVFjK5GyM+YFCE8yZzrzyCvrDXCIGWePt/123DiSwpw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDgEZdNKNEli5a5a07pDWba2A3l3ZZ40GJ64HrnaNRmeAiEAm9QOSPQqKsuT4UIhP9I+nrQc+1bX+3PiOZZZcGC4gX8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":569304},"type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"d73c889e5919428a8d45e137bf935096dff5605c","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js tests/*.test.mjs","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","workflow:sidecar":"flow-agents-workflow-sidecar","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node --test tests/content-boundary-script.test.cjs && node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs","eval:multipass-context:live":"npm run build --silent && node evals/grounded-extraction/live-multipass-context.mjs","workflow:validate-artifacts":"flow-agents-validate-artifacts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"f3ac2add-c099-4ae2-aafd-dff074774115"}},"repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.19.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"openai":"^6.49.0","typescript":"^7.0.2","@types/node":"^26.1.2","@types/turndown":"^5.0.6","@kontourai/relay":"^0.7.0","@anthropic-ai/sdk":"^0.116.0","@kontourai/survey":"^8.0.0","@kontourai/flow-agents":"5.10.0"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/traverse_4.0.0_1790722624222_0.4542590385340446","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"_id":"@kontourai/traverse@4.1.0","bugs":{"url":"https://github.com/kontourai/traverse/issues"},"dist":{"shasum":"bc05aad8c7e1f419b301c39c90b3a4d7d5237ec5","tarball":"https://registry.npmjs.org/@kontourai/traverse/-/traverse-4.1.0.tgz","fileCount":61,"integrity":"sha512-Edijk8TDOFNCesaoBS0FG6zN1fZZUFz3Wv4Djn9Eis2Gg3/N/8DSH3Cuo6V8Ddp482kKhe0nPVqyy63YyfETuA==","signatures":[{"sig":"MEQCIHOsthGZUH4/16W8PFv0BdmKl0PPbLKgn7MewIUMM66uAiAfa8d3cce4OWZFGqYLQSG3LPTC514nS06qJfA18ayvww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDsUEwLtsA7HBDKKIm+5tgEiSS5ecgoEdchJCjQYrsmzAiEA3GYqdD10Oj4LO76AaiCY2gR43y0gSnYGU9ocUgI2E5U="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kontourai%2ftraverse@4.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":589157},"name":"@kontourai/traverse","type":"module","engines":{"node":">=22"},"exports":{".":"./dist/src/index.js","./fetch":{"types":"./dist/src/fetch/index.d.ts","default":"./dist/src/fetch/index.js"},"./relay":{"types":"./dist/src/relay.d.ts","default":"./dist/src/relay.js"},"./gemini":{"types":"./dist/src/gemini.d.ts","default":"./dist/src/gemini.js"},"./openai":{"types":"./dist/src/openai.d.ts","default":"./dist/src/openai.js"},"./anthropic":{"types":"./dist/src/anthropic.d.ts","default":"./dist/src/anthropic.js"}},"gitHead":"ad40756ac132ffe8c91024e1e2ee1f0517bf71c3","license":"Apache-2.0","private":false,"scripts":{"test":"npm run build && node --test dist/tests/*.test.js tests/*.test.mjs","build":"rm -rf dist && tsc","verify":"npm run check:content-boundary && npm run check:decisions && npm run typecheck && npm test && npm run check:pack","prepare":"npm run build","typecheck":"tsc --noEmit","check:pack":"node scripts/check-package-contents.mjs","freeze:adrs":"node scripts/freeze-adrs.mjs","eval:grounded":"npm run build --silent && node evals/grounded-extraction/run.mjs","check:decisions":"node scripts/check-decisions.cjs check","workflow:sidecar":"flow-agents-workflow-sidecar","gen:decisions-index":"node scripts/check-decisions.cjs gen-index","check:content-boundary":"node --test tests/content-boundary-script.test.cjs && node scripts/check-content-boundary.cjs","eval:multipass-context":"npm run build --silent && node evals/grounded-extraction/multipass-context.mjs","eval:multipass-context:live":"npm run build --silent && node evals/grounded-extraction/live-multipass-context.mjs","workflow:validate-artifacts":"flow-agents-validate-artifacts"},"version":"4.1.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"f3ac2add-c099-4ae2-aafd-dff074774115"}},"homepage":"https://github.com/kontourai/traverse#readme","repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"_npmVersion":"11.19.0","description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","directories":{},"maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"linkedom":"^0.18.12","turndown":"^7.2.4","@kontourai/forage":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"openai":"^6.49.0","typescript":"^7.0.2","@types/node":"^26.1.2","@types/turndown":"^5.0.6","@kontourai/relay":"^0.7.0","@anthropic-ai/sdk":"^0.116.0","@kontourai/survey":"^8.0.0","@kontourai/flow-agents":"5.10.0"},"peerDependencies":{"openai":">=4.0.0","typescript":">=5.0.0","@google/genai":">=1.0.0","@kontourai/relay":">=0.1.0 <1","@anthropic-ai/sdk":">=0.20.0"},"peerDependenciesMeta":{"openai":{"optional":true},"typescript":{"optional":true},"@google/genai":{"optional":true},"@kontourai/relay":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/traverse_4.1.0_1790833202412_0.2460725778936521"}}},"time":{"created":"2026-07-02T20:05:32.571Z","modified":"2026-10-01T05:40:02.879Z","0.1.0":"2026-07-02T20:05:32.911Z","0.2.0":"2026-07-02T20:50:34.877Z","0.3.0":"2026-07-02T23:43:22.481Z","0.4.0":"2026-07-03T01:06:10.495Z","0.5.0":"2026-07-03T01:45:42.691Z","0.5.1":"2026-07-03T01:57:17.599Z","0.6.0":"2026-07-03T03:14:06.568Z","0.7.0":"2026-07-03T05:25:50.488Z","0.8.0":"2026-07-03T20:20:45.050Z","0.9.0":"2026-07-06T15:27:38.117Z","0.10.0":"2026-07-06T17:46:22.784Z","0.10.1":"2026-07-06T19:17:37.540Z","0.11.0":"2026-07-06T23:28:56.041Z","0.12.0":"2026-07-07T12:16:45.322Z","0.13.0":"2026-07-07T13:50:08.025Z","0.14.0":"2026-07-07T22:53:09.860Z","0.14.1":"2026-07-10T13:31:25.644Z","0.15.0":"2026-07-12T15:53:00.938Z","0.16.0":"2026-07-14T18:25:53.164Z","0.17.0":"2026-07-15T13:16:28.826Z","0.18.0":"2026-07-20T15:12:59.263Z","0.19.0":"2026-07-20T16:06:44.959Z","0.19.1":"2026-07-22T16:22:15.148Z","0.20.0":"2026-07-22T21:04:07.864Z","0.20.1":"2026-07-22T22:18:29.235Z","0.21.0":"2026-07-23T04:15:19.142Z","0.22.0":"2026-07-23T04:28:48.783Z","0.23.0":"2026-07-24T02:01:14.415Z","0.24.0":"2026-07-27T14:45:09.074Z","0.25.0":"2026-07-27T16:07:28.762Z","0.25.1":"2026-07-29T03:14:02.481Z","1.0.0":"2026-09-28T04:10:27.529Z","2.0.0":"2026-09-28T16:37:27.754Z","3.0.0":"2026-09-28T21:57:46.258Z","3.0.1":"2026-09-29T01:13:02.640Z","4.0.0":"2026-09-29T22:57:04.329Z","4.1.0":"2026-10-01T05:40:02.515Z"},"bugs":{"url":"https://github.com/kontourai/traverse/issues"},"license":"Apache-2.0","homepage":"https://github.com/kontourai/traverse#readme","repository":{"url":"git+https://github.com/kontourai/traverse.git","type":"git"},"description":"Schema-directed content extraction that produces provenance-bearing, review-ready extraction proposals in Survey's shape.","maintainers":[{"name":"briananderson1222","email":"brian.anderson1222@gmail.com"}],"readme":"# @kontourai/traverse\n\nSchema-directed content extraction that produces **provenance-bearing,\nreview-ready extraction proposals** in Survey's shape.\n\nTraverse takes prepared content (HTML or text) plus a caller-supplied list of\ntarget fields, asks a pluggable extraction provider to propose field values,\nand normalizes those into `ExtractionProposal[]` — each one a reviewable record\ncarrying a verbatim `excerpt` and a `locator`. Traverse's extraction core is a\n**proposer only**: it never resolves a value, never ranks, and never owns\nreview policy (the opt-in `@kontourai/traverse/fetch` subpath's `crawlSource`\noffers a bounded same-host crawl — see \"Fetching & snapshots\" below — but\nextraction itself still never crawls). See\n[`docs/adr/0001-proposals-only.md`](docs/adr/0001-proposals-only.md).\n\n## Install\n\n```sh\nnpm install @kontourai/traverse\n```\n\nThe Anthropic adapter needs the SDK as an optional peer dependency — install it\nonly if you use that adapter:\n\n```sh\nnpm install @anthropic-ai/sdk\n```\n\nTraverse has **zero AI-provider runtime dependencies** — no LLM SDK is bundled\nor required; `@anthropic-ai/sdk`, `openai`, and `@google/genai` are optional\npeer dependencies you only install for the adapter you use. It does declare\nreal runtime dependencies for content handling: `linkedom` and `turndown`\n(HTML→DOM parsing and Markdown conversion in content-prep, used by `extract()`\nitself) and `@kontourai/forage` (SSRF-guarded egress and crawling, used by the\n`@kontourai/traverse/fetch` subpath — see \"Fetching & snapshots\" below).\n\n## The provenance contract\n\nEvery `ExtractionProposal` carries required `provenance`, and `extract()`\n**enforces** it — not just requires its presence:\n\n- **`excerpt`** — a verbatim quote against the **CONTENT-PREPARED text**\n  `extract()` hands to the provider — **not** the caller's raw HTML/source\n  document. Since 0.5.0 HTML is prepared as **Markdown** by default (links,\n  headings, and lists survive; see [Large pages & chunking](#large-pages--chunking));\n  pass `prep: \"text\"` for the legacy flat-text strip. A proposal without an\n  excerpt is not something Traverse emits.\n- **Occurrence is enumerated, not assumed.** `extract()` verifies an excerpt\n  against the chunk the provider saw, enumerates every exact match in both that\n  visible slice and the full prepared text, and records the selected span in\n  `provenance.occurrence`. A provider may supply an untrusted 1-based\n  `occurrenceHint`; only an integer in bounds for the visible slice can select\n  a match, which is then mapped to its global occurrence metadata. Otherwise\n  source-order allocation selects a visible exact match. A proposal\n  whose excerpt cannot be found is **dropped** with the warning `\"excerpt not\n  found in prepared content\"` — paraphrases, translations, reformats, and\n  hallucinations receive no approximate offset.\n- **`locator`** — a fixed, defined scheme: `\"chars:<start>-<end>\"`, where\n  `<start>`/`<end>` are 0-based UTF-16 code-unit offsets of the selected exact\n  occurrence. `extract()` always derives/overwrites `locator` itself from that\n  verified span — a provider/adapter-supplied `locator` is never trusted as-is.\n  `provenance.occurrence` exposes resolver version, exact count, selected span,\n  selection mode, hint use, and ambiguity; ambiguity is evidence to review, not\n  a certainty claim.\n\nBecause the excerpt and the offsets it implies are anchored to the\n**prepared** text and not the caller's original document, a consumer that\nwants to highlight/locate an excerpt in the raw source must re-run the same\ncontent-prep step (or an equivalent) to reproduce the text those offsets refer\nto, or map prepared-text offsets back to raw-document offsets itself. Traverse\ndoes not do that mapping.\n\nBecause provenance is required on the type itself AND enforced by\nnormalization, the whole package is structurally a provenance-bearing-proposal\nproducer — this is its identity, not a convention.\n\n### Resolving exact prepared text\n\nAn `ExtractionResult` carries `preparedArtifact`: a compact, versioned\nidentity for the complete prepared text behind every `chars:<start>-<end>`\nlocator. The result intentionally does **not** embed that text. To retain and\nlater verify exact text, inject a caller-owned store and resolve the artifact:\n\n```ts\nimport {\n  createInMemoryPreparedArtifactStore,\n  extract,\n  resolvePreparedArtifact,\n} from \"@kontourai/traverse\";\n\nconst preparedStore = createInMemoryPreparedArtifactStore();\nconst result = await extract({\n  content,\n  contentType: \"html\",\n  sourceRef: \"caller-owned-ref\",\n  targetSchema,\n  provider,\n  preparedArtifact: {\n    store: preparedStore,\n    preparationVersion: \"your-preparation-v1\",\n  },\n});\n\nconst resolved = await resolvePreparedArtifact(result.preparedArtifact!, preparedStore);\n// resolved.status is \"available\", \"unavailable\", \"storage-error\",\n// \"invalid-artifact\", \"identity-mismatch\", or \"digest-mismatch\".\n// Only \"available\" includes text; slice it with the proposal locator offsets.\n```\n\nThe artifact's SHA-256 digest binds exact prepared text; its versioned reference\nalso binds the preparation mode/version and optional source snapshot reference.\nThis makes a changed preparation implementation visibly produce a new identity.\nUnless the caller supplies one, `preparationVersion` is Traverse's preparation\nbase version (`PREPARED_ARTIFACT_PREPARATION_VERSION`), and for HTML Markdown\npreparation it also names the installed `linkedom` and `turndown` versions, e.g.\n`3+linkedom@0.18.13+turndown@7.2.4`. The library versions are read through\nstatic JSON imports, and a version that cannot be resolved throws rather than\nproducing a shared placeholder. `preparationVersionFor(mode)` returns the same\nvalue before preparing, for keying a cache.\nPlain-text callers need no migration: `extract()` assigns the deterministic\ninline identity automatically, but retains no text unless a store is supplied.\nArtifact creation rejects ill-formed Unicode rather than allowing UTF-8\nreplacement characters to collapse distinct JavaScript strings. Resolution\nvalidates every metadata field and recomputes the canonical reference before\ncalling a store; store exceptions are returned as redacted `storage-error`\noutcomes. `preparationMode` reports the path actually used, including\n`\"transcript\"` cleanup and `\"text\"` when HTML markdown preparation falls back.\n\n`fetchAndExtract()` accepts `preparedArtifactStore` and `preparationVersion`.\nThe Forage-backed `crawlAndExtract()` composition accepts the same options and\nbinds each page artifact to that page's existing `sourceRef`, so byte-stable\nForage replay produces the same prepared-artifact identity and resolution.\n\n### Portable extraction-result envelopes\n\nTraverse owns a versioned, canonical JSON envelope for moving a completed\nresult across process or product boundaries:\n\n```ts\nimport {\n  deserializePortableExtractionResult,\n  serializePortableExtractionResult,\n  validatePortableExtractionResultEnvelope,\n} from \"@kontourai/traverse\";\n\nconst bytes = serializePortableExtractionResult(result);\nconst envelope = deserializePortableExtractionResult(bytes);\nconst validation = validatePortableExtractionResultEnvelope(JSON.parse(bytes));\n```\n\n`extract()` assigns every result a top-level `provider` and opaque `runId`, even\nfor a successful run with zero proposals. The envelope retains those identities,\nmodel and usage counters, source/snapshot and prepared-artifact identity, exact\nlocator/occurrence metadata, task/example digests, partial state, and typed\nprovider/artifact failures. A typed `outcome` distinguishes empty success,\npartial work, invalid configuration/task, preparation, provider, and unexpected\nfailure; warning strings become non-sensitive category/code records. A run that\ndid not read and answer all of its prepared text is never a `success`: a failed\nchunk, a chunk cut at `maxContentChars`, an answer stopped at the output cap,\nor a missing tool call makes it `partial` (`provider-failure`,\n`content-truncated`, `output-truncated`), and a partial envelope carries\n`result.coverage`, one `{ chunk, start, end, status, reason? }` entry per\nprepared-text range. A run that read everything serializes without\n`coverage`, exactly as before. Provider,\nmodel, failure-provider, and proposal-extractor identities use a strict,\ncredential-free grammar. Canonical key ordering makes a validated\ndeserialize/re-serialize byte-stable.\n\nThe default export is deliberately diagnostic-safe: it omits `raw.response`,\n`ExtractionResult.error`, warning strings, provider-failure messages/native\nobjects, embedded raw-source sidecars, prepared text, stores, and authorization configuration. Source refs\nwith URL credentials or credential-shaped query parameters are rejected. Keep\nthe full in-process `ExtractionResult` inside its original trust boundary when\nraw diagnostics are required; Traverse does not provide a diagnostic-rich wire\nexport. Candidate values and grounding excerpts are intentional result data and\nstill require the caller's domain-specific disclosure policy.\n\n## Explicit vs. inferred fields (`inferenceType`)\n\nEvery `ExtractionProposal` above is grounded by a verbatim `excerpt` — but\nthat only tells you the EXCERPT is real; it doesn't tell you whether the\nproposed VALUE itself is a verbatim copy of the source text or something a\nprovider derived, normalized, or classified from it. `TargetFieldSchema`\ncarries an optional tag for exactly that distinction:\n\n```ts\nconst targetSchema: TargetFieldSchema[] = [\n  // \"explicit\": the value should appear verbatim in the source. Traverse\n  // (and the Anthropic adapter) treat this as a hint that offset-verifying\n  // the VALUE itself, not just the excerpt, would be meaningful.\n  { path: \"zip\", type: \"string\", inferenceType: \"explicit\" },\n  // \"inferred\": the value is derived/normalized/classified from the\n  // source (e.g. a computed total, a reworded summary, a classified\n  // category) — the excerpt still grounds the proposal, but the value\n  // itself can never be offset-verified against the source text.\n  { path: \"category\", type: \"enum\", enumValues: [\"a\", \"b\"], inferenceType: \"inferred\" },\n];\n```\n\n`inferenceType` is **100% optional and additive**: a field that never sets\nit behaves exactly as before — no shape change, no new warning, no new drop\nbehavior for you or for any existing caller. When set, `extract()` carries\nthe tag through unchanged onto `ExtractionProposal.inferenceType` (present\nonly when the matched schema field declared it, mirroring the `pathIndices`\nconditional-attach idiom used for indexed array paths), so a review UI can\nrender an honest \"offset-grounded value\" vs. \"derived value, excerpt-grounded\nonly\" distinction. This slice adds **no stricter verification** — an\n`\"explicit\"` field whose returned value doesn't literally match the excerpt\nis proposed exactly as it would be without the tag, reviewed by the caller,\nnot gated by Traverse (see\n[`docs/decisions/extraction-proposals.md`](docs/decisions/extraction-proposals.md)\nfor the full rationale and the deferred stricter-verification follow-up).\n\n## Typed values travel onto the proposal (`valueType` / `enumValues`)\n\nYour `TargetFieldSchema` already declares each field's `type` (and, for an\n`enum`, its `enumValues`). By the same conditional-attach idiom as\n`inferenceType`, `extract()` echoes those constraints onto every matched\nproposal as `ExtractionProposal.valueType` and (when declared)\n`ExtractionProposal.enumValues`:\n\n```ts\n// schema: { path: \"difficulty\", type: \"enum\", enumValues: [\"beginner\", \"advanced\"] }\n// proposal: { fieldPath: \"difficulty\", candidateValue: \"beginner\",\n//             valueType: \"enum\", enumValues: [\"beginner\", \"advanced\"], ... }\n```\n\nThis lets a downstream review UI render and validate the candidate against its\ndeclared shape — a `date` picker, a `number` field, an `enum` select that\nrejects an out-of-set value — **without still holding the original\n`targetSchema` in scope**, exactly the decoupling `inferenceType` and\n`pathIndices` provide. It is the schema's *declared* type, not an assertion\nabout `candidateValue`'s runtime `typeof`: a provider can still return a\nmalformed value, which is precisely what a typed reviewer checks. `extract()`\nitself adds **no new drop behavior** — constraint metadata only. Additive and\noptional: a consumer that ignores these fields sees no change. `enumValues` is\na defensive copy, so mutating it never reaches the caller's schema.\n\n## Evidence annotations (`evidenceMatch`)\n\nEvery proposal `extract()` returns carries deterministic facts about its value:\n\n```ts\n// schema: { path: \"price\", type: \"number\", inferenceType: \"explicit\" }\n// proposal: { fieldPath: \"price\", candidateValue: 999,\n//             provenance: { excerpt: \"Price: $10 per session.\", ... },\n//             evidenceMatch: { checkerVersion: \"evidence-match-v4\", schema: \"ok\",\n//                              valueInExcerpt: \"mismatch\", tokenBoundary: true }, ... }\n```\n\n`schema` is an exact check of the value against the declared type, enum and\n(for `date`) ISO-8601 format. `valueInExcerpt` checks, for fields declared\n`inferenceType: \"explicit\"`, whether the value appears in its excerpt after a\nfixed format-aware normalization (`45` matches `\"$45.00\"`, `\"303.555.1234\"`\nmatches `\"(303) 555-1234\"`). Anything doubtful is `not-evaluated`: a form it\ncannot read, a difference only in meaningful punctuation or sign (`\"A+\"` vs\n`\"A-\"`), a negation before the value (`\"not open\"`), or a number at another\nscale (`45%`, `$4.2 million`). **`match` means the value was found in the\nexcerpt, not that the excerpt supports it.** Known false matches remain,\nsuch as negation far from or after the value, `\"formerly open\"`,\n`\"excludes C\"`, and a number in another currency; the decision record lists\nthem.\n\n`evidenceMatch` describes the value the proposal carries. `extract()` rewrites\na provider's value into its field's declared type in two lossless cases only:\nthe canonical decimal spelling of a number for a `number` field (`\"2.1\"`\nbecomes `2.1`; `\"2.10\"` and `\"1.000\"` are refused) and a written English date\nfor a `date` field (`\"21 March 2013\"` becomes `\"2013-03-21\"`). Each rewrite is\nrecorded as `valueNormalization: { kind, from }` on the in-process proposal\nand as a warning naming the field and the original; a proposal without it\ncarries exactly what the provider returned. Anything else (`\"1,234\"`,\n`\"03/04/2013\"`) is left as written and reported by `schema`. The portable\nenvelope does not carry `valueNormalization`; there a rewrite is the\n`normalization`/`proposal-normalization` warning classification.\n\nOne field can have several proposals: the prompt asks for one per distinct\nvalue the content states, so two conflicting values both reach review. When\ncomparing proposals between runs, compare `provenance.occurrence` with\n`sameResolvedOccurrence(a, b)`: its `selection` and `hintUsed` say how the\noccurrence was reached and can differ between runs that resolved the same span.\n`tokenBoundary` is false when the excerpt was cut from inside a word. These are\nannotations, not verdicts: nothing is dropped because of them, and your review\npolicy decides what blocks. The rules and a recommended policy are in\n[`docs/decisions/extraction-proposals.md`](docs/decisions/extraction-proposals.md).\n\n## Quickstart\n\n```ts\nimport { extract } from \"@kontourai/traverse\";\nimport type { ExtractionProvider, TargetFieldSchema } from \"@kontourai/traverse\";\n\nconst targetSchema: TargetFieldSchema[] = [\n  { path: \"title\", type: \"string\", required: true, description: \"The activity name.\" },\n  { path: \"priceAmount\", type: \"number\", description: \"Drop-in price in whole units.\" },\n];\n\n// Any provider works — here a trivial mock. See the Anthropic adapter below for\n// a real one.\nconst provider: ExtractionProvider = {\n  name: \"mock\",\n  async extract() {\n    return {\n      proposals: [\n        {\n          fieldPath: \"title\",\n          candidateValue: \"Beginner Bouldering Session\",\n          confidence: 0.9,\n          // A provider-supplied `locator` is provisional — extract() overwrites\n          // it with the verified \"chars:<start>-<end>\" scheme below.\n          provenance: { excerpt: \"Beginner Bouldering Session\", locator: \"provisional\" },\n          extractor: \"mock\",\n        },\n      ],\n      raw: { response: \"{}\", model: \"mock-model\" },\n    };\n  },\n};\n\nconst result = await extract({\n  content: \"<p>Beginner Bouldering Session</p>\",\n  contentType: \"html\",\n  sourceRef: \"https://example.test/schedule\",\n  targetSchema,\n  provider,\n});\n\n// result.proposals[0].provenance.locator === \"chars:0-27\" — extract() verified\n// the excerpt against the prepared text (\"Beginner Bouldering Session\", the\n// <p> converted to Markdown text) and derived the offset itself.\n// result.proposals      — normalized, provenance-bearing proposals\n// result.raw            — the provider's raw response, for audit\n// result.error          — set (never thrown) if a stage failed\n// result.warnings       — merged provider + normalization notes (dropped/adjusted proposals)\n// result.providerCalls  — physical provider operations issued this run, always populated\n// result.totalTokensUsed — accumulated raw.tokensUsed from successful calls, always populated\n// see \"Cost guards\" below for the maxProviderCalls/maxTotalTokens options that bound these\n```\n\n`extract()` **never throws** for provider, parse, or content-prep failure. Any\nstage error surfaces as `result.error` with an empty `proposals` array.\n\n## Normalization semantics\n\n`extract()` runs content-prep, calls `provider.extract()`, then strictly\nnormalizes proposals. A proposal survives only if ALL of the following hold:\n\n- `fieldPath` is a non-empty string present in your `targetSchema` (otherwise\n  dropped, with a warning),\n- `extractor` is a non-empty string (otherwise dropped),\n- it carries a provenance `excerpt` (otherwise dropped, with a warning),\n- that `excerpt` **occurs verbatim in the prepared content** handed to the\n  provider — checked via `indexOf`, not merely assumed (a miss is dropped with\n  `\"excerpt not found in prepared content\"`; a hit derives/overwrites\n  `provenance.locator` as `\"chars:<start>-<end>\"` — see \"The provenance\n  contract\" above),\n- `confidence` is **optional** and never drops a proposal: missing or `null`\n  is omitted silently, a non-numeric value is omitted with a warning, and an\n  out-of-range number is **clamped** into `0..1` with a warning. The bundled\n  adapters pass finite out-of-range values through to this clamp.\n\n`result.warnings` merges BOTH of the above normalization notes AND any\n`warnings` the provider itself returned (e.g. the Anthropic adapter's\nmalformed-tool-item or maxTokens-truncation notes) — nothing either stage\nnotices is silent.\n\n`confidence` is an optional provider self-report, not a calibrated\nprobability and not cross-provider provenance. Traverse carries it, when the\nprovider reported one, beside the stable `extractor` identity and does not\npretend that `0.8` from two different models means the same thing. Calibrated\nconfidence comes from a downstream calibrator that learns from reviewed\noutcomes; Traverse never converts confidence into truth or acceptance, and\ncross-chunk dedup keeps the first-seen duplicate rather than the one reporting\nthe higher score.\n\n### Indexed field paths against array schemas\n\nSome providers echo back an **indexed** path for an array field — e.g.\n`\"schedules[0].startDate\"` — instead of the un-indexed declared form your\n`targetSchema` uses, e.g. `\"schedules[].startDate\"`. This mapping is\nunambiguous, so `extract()` **normalizes it rather than dropping it**:\n\n- Every `[n]` (integer) segment in `fieldPath` is stripped to `[]`,\n  consistently at every level — `\"a[2].b[0].c\"` normalizes to `\"a[].b[].c\"`.\n- If the normalized path matches a declared `targetSchema` path, the proposal\n  is accepted: `fieldPath` is rewritten to the declared (normalized) form, and\n  the stripped index/indices survive on the new\n  `ExtractionProposal.pathIndices?: number[]` field, in left-to-right\n  (outermost-first) source order — `\"a[2].b[0].c\"` yields `pathIndices: [2, 0]`.\n  This is silent on the happy path (no warning) — it is supported input, not a\n  defect.\n- Use `pathIndices` to regroup proposals that came from the same source array\n  item, e.g. multiple `\"schedules[].*\"` proposals that all carry\n  `pathIndices: [0]` came from the same `schedules[0]` entry.\n- If the **normalized** path still doesn't match anything in `targetSchema`,\n  the proposal is dropped with the same `\"unknown fieldPath\"` warning as any\n  other unrecognized path — normalization recovers one specific, unambiguous\n  shape; it does not loosen fieldPath membership in general.\n- Every other normalization rule (extractor identity, verified excerpt,\n  finite/clamped confidence) still runs unchanged against the normalized\n  proposal.\n\nSee [`docs/adr/0003-indexed-path-normalization.md`](docs/adr/0003-indexed-path-normalization.md)\nfor why this is accept-and-normalize rather than reject.\n\n## Large pages & chunking\n\nSince 0.5.0 Traverse prepares and extracts **large listing pages** without\nlosing records or link URLs. See\n[`docs/adr/0004-large-page-chunking.md`](docs/adr/0004-large-page-chunking.md).\n\n**Structure-preserving prep.** HTML is converted to **Markdown** by default\n(via Turndown), so `[text](href)` links, headings, and lists survive and the\nprepared text is far denser than the old flat-text strip. Pass `prep: \"text\"`\nfor the legacy regex strip:\n\n```ts\nawait extract({ content: html, contentType: \"html\", sourceRef, targetSchema, provider }); // markdown (default)\nawait extract({ content: html, contentType: \"html\", sourceRef, targetSchema, provider, prep: \"text\" }); // legacy flat text\n```\n\n> **Behavior change (0.5.0):** HTML now prepares as Markdown by default, so\n> `provenance.excerpt`/`locator` are anchored to Markdown, not flat text. If you\n> pinned to the old output, pass `prep: \"text\"`.\n\n**Structural chunking.** For a page larger than one chunk, Traverse parses the\nDOM (via linkedom), prunes chrome (`script`/`style`/`nav`/`footer`/…), and\ndetects the repeated-sibling \"card\" container of a listing, cutting chunk\nboundaries **on card boundaries** so a card is never split. Page text outside\nthe card container (a title, an intro, a detail page's own paragraphs beside a\nshort repeated list) is kept too, after a second chrome pass that removes ARIA\nnavigation landmarks and link-dense blocks such as `div` navbars and\nmega-menus. A landmark inside `article`/`main` is kept, `tel:`/`mailto:`/`sms:`\nlinks do not count as navigation, and every block the pass removes is quoted\nin a warning (`structural prep pruned …`). The first chrome pass follows the\nsame rule for Markdown prep (structural or not): `header`, `footer` and `aside`\ninside an `article` are the article's own and are kept; everywhere else,\nincluding inside `main`, they are removed, as are every `nav`, `form` and\n`noscript`, and each removal is quoted in a `markdown prep pruned …`\nwarning. So Markdown prep never drops page text silently; the legacy\n`prep: \"text\"` regex strip is unchanged. Short outside text rides along with the first or last card chunk;\nlonger outside text gets its own chunks, which are dispatched after every card\nchunk, so `maxChunks`, `maxProviderCalls`, and `maxTotalTokens` reach the cards\nfirst. Outside text left out by `maxChunks` is named in a warning. When no\nrepeated structure is found (or for `text` / `prep: \"text\"`), it falls back to a\ncharacter window with overlap so a value straddling a boundary is not lost.\nChunks dispatch in bounded waves. `concurrency` and `batchSize` both default to\n`1`, so existing callers and providers keep the historical sequential behavior.\nWhen a provider implements optional `extractBatch()`, Traverse can put up to\n`batchSize` chunks into one physical provider call; declared provider limits\n(`maxConcurrency`, `maxBatchSize`) always cap caller settings. The batch\nreturns one positional fulfilled/rejected outcome per chunk, so an item-local\nfailure remains typed without discarding successful siblings. Concurrent\nsingle-item calls must not be presented as physical batching.\n\n**Offset-correct provenance across chunks.** Each chunk is an exact contiguous\nsubstring of one `fullText`. A proposal's `excerpt` is verified against the\nchunk the provider saw, then resolved from an enumeration of exact full-text\noccurrences, bounded to that chunk's visible matches, before\n`locator = \"chars:<start>-<end>\"` is trusted — the `\"chars:\"`\nscheme still means \"offsets into the full prepared text.\" Resolution is folded\nin original chunk/proposal order, so batching and concurrency cannot change it.\nOnly identical `fieldPath` + `pathIndices` + canonical value + selected span\nare **deduped**; shared spans for different fields and repeated values at\ndistinct visible spans remain separate proposals. Overlap never allocates an\nunseen later occurrence merely because an earlier span was already selected.\n\n**Options** (all optional, on `extract()`):\n\n| Option | Default | Meaning |\n| --- | --- | --- |\n| `prep` | `\"markdown\"` for html, else `\"text\"` | structure-preserving prep vs. legacy flat text |\n| `chunkSize` | `12_000` | target max characters per chunk |\n| `chunkOverlap` | `200` | character-window overlap (fallback path) |\n| `maxChunks` | `40` | cap on chunks; extras dropped with a warning |\n| `maxContentChars` | `32_000` | **per-chunk** provider content budget (each chunk truncated to it) |\n| `concurrency` | `1` | maximum physical provider calls in flight; capped by a declared provider limit |\n| `batchSize` | `1` | logical chunks per optional physical `extractBatch()` call; capped by a declared provider limit |\n| `signal` | unset | stops dispatching new waves while retaining the completed wave's results |\n\nThese bound CONTENT (how much is prepared/chunked). To bound provider SPEND\n(how many calls / how many tokens one run issues), see\n[Cost guards](#cost-guards) below — an independent, composable set of options.\n\n`result.warnings` aggregates per-run chunking notes: the chunk count and\ndetection mode, cards detected, any `maxChunks` truncation, dropped duplicates,\nand any per-chunk provider failure. A provider error on **one** chunk is a\nwarning and the other chunks still run; only if **every** chunk's call fails\ndoes `result.error` get set. The same holds when no dispatched chunk was\nanswered at all (each threw, returned no tool call, or returned an unusable\nanswer): the run fails (`no dispatched chunk returned a usable answer` when\nnone threw, envelope code `no-usable-answer`), keeping its coverage and\nwarnings. `result.coverage` records which prepared-text\nrange each chunk read and answered, and any loss (a failed call, an answer\ncore cannot use (no proposals array, every tool item malformed, or no output\nobject), a cut at `maxContentChars`, an output cap, a missing tool\ncall, a chunk never dispatched) also sets `result.partial`. Coverage describes\nthe prepared text only: a structural segment that `maxChunks` dropped whole\nnever enters the prepared text, so only `partial.reason: \"max-chunks\"` (and its\nwarning) records that loss. A provider signals an output cap, a missing tool\ncall or an unusable answer with `ProviderExtractionOutput.truncated` /\n`missingToolCall` / `unusable` (the bundled adapters set all three); a provider that sets neither is judged by a warning that\nstarts with `response truncated at maxTokens` or `provider returned no\nextraction tool call`. Coverage ranges of adjacent chunks may\noverlap by `chunkOverlap`.\n\n> Why not `@mozilla/readability`? It extracts the one main article and strips\n> repeated sibling blocks as boilerplate — which is exactly what listing cards\n> are. It solves the opposite problem and would discard the content we need.\n\n## Cost guards\n\n`extract()` takes two optional per-run ceilings to bound provider spend on a\nlarge or many-chunk page:\n\n| Option | Default | Meaning |\n| --- | --- | --- |\n| `maxProviderCalls` | unset (unbounded) | cap on physical `extract()`/`extractBatch()` operations issued in ONE run |\n| `maxTotalTokens` | unset (unbounded) | cap on accumulated `raw.tokensUsed`, summed across every SUCCESSFUL call in that run |\n\n```ts\nconst result = await extract({\n  content: html,\n  contentType: \"html\",\n  sourceRef,\n  targetSchema,\n  provider,\n  maxProviderCalls: 5,\n  maxTotalTokens: 20_000,\n});\n```\n\n**Stop-issuing, never mid-call, never throws.** Once a configured ceiling is\nreached, `extract()` stops issuing further physical provider operations (it\nnever aborts a call already in flight), keeps whatever proposals were\nalready collected from calls that did run, and appends a warning to\n`result.warnings` naming the ceiling and how much was consumed, e.g.:\n\n```\nstopped after 5 provider call(s): maxProviderCalls (5) reached; 3 chunk(s) not processed\nstopped after 3 provider call(s): maxTotalTokens (20000) reached (21500 tokens used); 4 chunk(s) not processed\n```\n\nThis mirrors the existing `maxChunks` truncation warning shape. The very\nfirst provider call is always attempted, regardless of how small a valid\nceiling is configured — a single-chunk page always gets exactly one real\nattempt. If both ceilings are set, `maxProviderCalls` is checked first;\nwhichever one is actually reached first is the only one to emit a warning\nfor that stop. **Invalid config never throws either**: a non-positive,\nnon-integer, or non-finite ceiling surfaces as `result.error` (a plain\nstring) with zero provider calls issued, exactly like any other stage\nerror.\n\n**Not a hard spend cap.** `maxTotalTokens` can only be checked using tokens\nalready spent by calls that have already *completed* — a call's cost is\nunknown until it returns. With concurrent work, Traverse checks between bounded\nwaves, so actual total can exceed the ceiling by the completed wave's usage.\nThat overshoot is reported as `result.partial.tokenOvershoot`; no subsequent\nwave starts. Treat it as \"stop issuing further calls once this much has been\nspent,\" not \"never cross this number.\"\n\n**Typed partial progress.** A call ceiling, token ceiling, or an aborted\n`signal` sets `result.partial` with a machine-readable reason plus completed\nand undispatched chunk counts. An early stop keeps its own reason even when a\ndispatched chunk was also lost; `result.coverage` lists every range. Already-dispatched calls are allowed to finish\nand their normalized proposals remain in the result; cancellation never\nsilently looks like a complete extraction.\n\n**Independent of `maxChunks`.** `maxChunks` (see\n[Large pages & chunking](#large-pages--chunking)) truncates how many chunks\n*exist* before the loop even starts; `maxProviderCalls`/`maxTotalTokens`\nindependently bound how many of those already-capped chunks the loop\nactually *processes*. Both can fire in the same run, and both warnings can\nappear together in `result.warnings`.\n\n**Not the same as the Anthropic adapter's `maxTokens`.** These are per-RUN\nceilings enforced by `extract()` itself across every chunk. They are a\ndifferent option, on a different interface, from\n`AnthropicAdapterOptions.maxTokens` (default `2048`) — that one is a\nper-CALL cap on a single model response's OUTPUT tokens, passed straight to\nthe provider. Setting `maxTotalTokens` does not change what any individual\ncall is allowed to generate; setting the adapter's `maxTokens` does not\nbound how many calls a run issues.\n\n**Usage is always observable, ceiling or not.** `ExtractionResult` carries\ntwo REQUIRED fields, `providerCalls` and `totalTokensUsed`, populated on\nevery return path — a plain success, a ceiling-stopped partial run,\ninvalid-config, a deferred PDF, or an all-chunks-failed run — so spend is\nvisible even when no ceiling is configured at all.\n\n**Graceful degrade without `tokensUsed`.** A provider that never sets\n`raw.tokensUsed` on its response still gets full, correct protection from\n`maxProviderCalls` (call counting is provider-independent). `maxTotalTokens`\nsimply never fires for such a provider (`totalTokensUsed` stays `0`) — this\nis not treated as an error, just a ceiling that has nothing to measure\nagainst.\n\nSee [`docs/decisions/extraction-cost-guard.md`](docs/decisions/extraction-cost-guard.md)\nfor the full decision record.\n\n## SPA / JS-rendered pages\n\nMany sites ship an almost-empty HTML shell and hydrate the real content in the\nbrowser. Traverse **core** still ships no rendering and no browser dependency,\nbut the fetch subpath now offers an OPT-IN `renderImpl` seam a caller can plug\na renderer into (see \"Rendered fetch\" below) — and, whether or not you use\nthat seam, the prep layer does two more things so JS-heavy sources are still\nuseful:\n\n### 1. Embedded-state sidecar\n\nBefore prep strips `<script>` blocks, Traverse harvests any machine-readable\nstate the page carries and returns it, parsed and size-capped, as a structured\nsidecar on the result — `ExtractionResult.embedded` and\n`prepareContent().embedded`:\n\n```ts\nconst result = await extract({ content: html, contentType: \"html\", /* … */ });\n\nresult.embedded?.jsonLd;      // parsed <script type=\"application/ld+json\"> blocks\nresult.embedded?.nextData;    // parsed Next.js <script id=\"__NEXT_DATA__\">\nresult.embedded?.initialState;// parsed window.__INITIAL_STATE__ / __PRELOADED_STATE__\n```\n\n`jsonLd` covers schema.org markup (Event / Course / Product are common for\nactivity listings) and is near-perfect precision with no LLM cost. The sidecar\nis harvested **once** per page (never duplicated across chunks) and is attached\neven if every provider call fails — a shell page with rich `__NEXT_DATA__` is\nextractable from the sidecar alone.\n\nThis is a **sidecar, not proposals**: proposals carry `chars:<start>-<end>`\nprovenance into the prepared text, and embedded state is not in the prepared\ntext (it lives in stripped scripts). Mapping the sidecar onto your field names is\nyour job — Traverse owns zero field vocabulary. See\n[`docs/adr/0005-embedded-state-sidecar.md`](docs/adr/0005-embedded-state-sidecar.md).\n\n### 2. JS-shell warning (render upstream, then retry)\n\nWhen the prepared text is suspiciously small relative to the HTML **and** the\npage is script-dominated or has an empty client-render mount (`#root` / `#__next`\n/ `#app`), Traverse emits a machine-actionable warning through `result.warnings`.\nThe warning starts with a stable code and carries the ratio numbers:\n\n- `js-shell-suspected: …` — likely an un-rendered shell with no usable embedded\n  state. Render the page upstream (e.g. a headless browser) and retry.\n- `js-shell-suspected-embedded-state-available: …` — same shell shape, but usable\n  embedded state was harvested, so **prefer the sidecar and skip the render**.\n\nEvery warning is `\"<code>: <details>\"`, so match on the code with `startsWith`:\n\n```ts\nconst warnings = result.warnings ?? [];\n// Coarse check — true for either shell variant:\nconst looksLikeShell = warnings.some((w) => w.startsWith(\"js-shell-suspected\"));\n// Only render when there is NO usable embedded state to fall back on:\nconst needsRender = warnings.some((w) => w.startsWith(\"js-shell-suspected:\"));\n```\n\nA content-rich page is never flagged, even with heavy analytics/framework\nscripts: the heuristic gates on an absolute prepared-text floor, not a bare\nratio (a real 2.7MB listing prepares to ~23k chars — a 0.85% ratio — and is\ncorrectly left alone).\n\n## Anthropic adapter\n\nThe Anthropic adapter is exported from the `@kontourai/traverse/anthropic`\nsubpath — it is **not** re-exported from the main entry point, so consumers\nwho do not use it (and do not install `@anthropic-ai/sdk`) pay nothing.\n\n```ts\nimport { extract } from \"@kontourai/traverse\";\nimport { createAnthropicExtractionProvider } from \"@kontourai/traverse/anthropic\";\n\nconst provider = createAnthropicExtractionProvider({\n  // apiKey defaults to process.env.ANTHROPIC_API_KEY\n  // model defaults to \"claude-sonnet-4-6\" — override per call site:\n  model: \"claude-sonnet-4-6\",\n});\n\nconst result = await extract({\n  content: htmlString,\n  contentType: \"html\",\n  sourceRef: url,\n  targetSchema,\n  provider,\n});\n```\n\nThe adapter builds a forced tool-use schema **dynamically** from your\n`targetSchema` and instructs the model to return a verbatim `excerpt` per field\n— that is how provenance gets populated. Tool output is parsed defensively:\nmalformed items (no excerpt, missing field, missing value) are dropped, never\nsilently accepted (a missing or `null` confidence is not malformed: the field\nis simply omitted) — each drop is reported in\n`ProviderExtractionOutput.warnings`, which `extract()` merges into\n`result.warnings`. The adapter also warns (rather than staying silent) when\nthe model's response is truncated: `stop_reason === \"max_tokens\"` adds\n`\"response truncated at maxTokens; proposals may be incomplete\"` to\n`warnings`, so a truncated proposal set is never mistaken for a complete one.\nA response with no tool call at all adds\n`\"provider returned no extraction tool call\"`, as the OpenAI and Gemini\nadapters already did.\n\n`extract()` locates every loss of prepared text on its chunk: a failed chunk\ncall, a chunk cut at `maxContentChars` before dispatch, an output-cap\ntruncation and a missing tool call each produce a warning naming the chunk\n(`chunk <i>/<n>`) and the prepared-text range (`chars:<start>-<end>`) that was\nnot read or not fully answered. In the portable envelope each keeps its own\nwarning code — `chunk-provider-failure`, `content-truncated-at-dispatch`,\n`output-truncated`, `missing-tool-call` — though the range itself does not\ntravel and the outcome stays `success`. Chunks dropped by the `maxChunks` cap\nclassify as `limit`/`max-chunks`, matching the partial reason;\n`content-truncated` names only the `maxContentChars` cut.\nFor tests, inject a client: `createAnthropicExtractionProvider({ client })`.\n\n## Provider conformance and additional adapters\n\nBundled adapters declare the same discoverable capability contract and pass one\ndeterministic conformance suite. Unsupported declared capabilities fail before\na provider call. Provider failures expose normalized retryability while keeping\nthe original native diagnostic on `ExtractionResult.providerFailures`. When the\nupstream error carries a credential-free `code` (for example an authorization\nledger's `AUTHORIZATION_PERSISTENCE_FAILED`), the failure keeps it as `code`,\nexactly as raised. The portable envelope carries it too when it is at most 128\ncharacters.\n\nEach proposal records the model that served its own provider call as\n`producedBy: { model, modelSource, requestDigest }`, so a run whose chunks were\nserved by different models (for example after a routed fallback) stays\nattributable per value; `result.raw.model` names the last chunk's model only.\n`modelSource` is `provider-reported` when the provider response named the model\nand `configured` when the adapter fell back to the configured id; a Relay\nruntime that does not report `modelSource` leaves it unset, and such a proposal\ncarries no `producedBy` in the portable envelope. Relay requests carry\n`metadata: { chunkIndex, runId }` for correlation with a router's receipts.\n\nThe Anthropic and OpenAI adapters build their SDK clients with `maxRetries: 0`\nby default, so one counted provider call is exactly one provider request and\n`maxProviderCalls`, `maxTotalTokens`, and any router's receipts describe what\nwas sent. Pass `maxRetries` to opt into SDK retries. An injected `client` is\nused as given.\n\nOpenAI and Gemini are optional subpath adapters, following the same injected\nclient and dynamic optional-peer pattern as the Anthropic adapter:\n\n```ts\nimport { createOpenAIExtractionProvider } from \"@kontourai/traverse/openai\";\nimport { createGeminiExtractionProvider } from \"@kontourai/traverse/gemini\";\n\nconst openaiProvider = createOpenAIExtractionProvider({ model: \"gpt-4.1-mini\" });\nconst geminiProvider = createGeminiExtractionProvider({ model: \"gemini-2.5-flash\" });\n```\n\nThe optional Relay adapter accepts any `ModelRuntime`, including direct SDK,\nlocal, hosted, replay, or host-routed implementations. Traverse still owns the\nextraction prompt, tool schema, proposal parsing, and provenance behavior:\n\n```ts\nimport { createRelayExtractionProvider } from \"@kontourai/traverse/relay\";\n\nconst provider = createRelayExtractionProvider({ runtime });\n```\n\nRelay supplies invocation portability only. Applications that need routing,\nbudgets, fallbacks, or execution receipts can provide a runtime implementing\nthose policies without coupling Traverse to an orchestration product.\nThe adapter exposes `extractBatch()` only when the runtime declares Relay's\nbounded physical-batch capability and implements its native batch operation.\nCurrent single-invocation SDK and local harness runtimes therefore remain\nsingle-call providers; no batching claim is synthesized for them.\n\nTraverse does not choose a default provider. See the\n[provider conformance decision](docs/decisions/provider-conformance.md).\n\nThe adapter's own synthesized/provided `locator` on each proposal is\n**provisional** — `extract()`'s normalization step is the sole owner of the\nfinal `locator` value, which it derives from a verified excerpt offset (see\n\"The provenance contract\" above). This applies to any provider, not just the\nAnthropic adapter: `extract()` re-derives every proposal's locator itself.\n\nA field's `inferenceType` (see \"Explicit vs. inferred fields\" above), when\ndeclared, turns into one extra guidance sentence in the tool's `description`\nfor that field — a verbatim-copy instruction for `\"explicit\"`, a\nderived/normalized-value instruction for `\"inferred\"` — with **zero prompt\nchange** for untagged fields. This only affects the natural-language tool\ndescription the model reads; the `input_schema` it must respond against is\nunchanged either way.\n\n### Model override\n\n`opts.model` overrides the default alias (`claude-sonnet-4-6`) without any API\nchange, and is reflected in `provider.name`\n(`anthropic-extraction-provider:<model>`).\n\n### Anthropic-compatible endpoints (Z.AI, proxies)\n\n`opts.baseUrl` targets any Anthropic-compatible endpoint — Z.AI's\nAnthropic-compatible API, an internal proxy, etc. — instead of\n`api.anthropic.com`. It is passed straight through as the `@anthropic-ai/sdk`\nconstructor's `baseURL` option; when unset, this adapter does not read any env\nvar itself, so the SDK's own `ANTHROPIC_BASE_URL` fallback still applies. When\n`opts.baseUrl` is set, `provider.name` gets an `@<host>` suffix\n(e.g. `anthropic-extraction-provider:glm-4.6@api.z.ai`), so parity reports show\nwhich backend produced a given set of proposals.\n\n**Env-only recipe** (no code change — the SDK reads both vars itself):\n\n```sh\nexport ANTHROPIC_BASE_URL=\"https://api.z.ai/api/anthropic\"\nexport ANTHROPIC_API_KEY=\"$ZAI_API_KEY\"   # your Z.AI key, from your own secret store\n```\n\n```ts\nconst provider = createAnthropicExtractionProvider();\n```\n\n**Explicit opts recipe:**\n\n```ts\nconst provider = createAnthropicExtractionProvider({\n  baseUrl: \"https://api.z.ai/api/anthropic\",\n  apiKey: process.env.ZAI_API_KEY, // your Z.AI key, from your own secret store\n  model: \"glm-4.6\",\n});\n```\n\nEither way, **pass an explicit `model` your backend actually serves** — the\ndefault alias (`claude-sonnet-4-6`) is an Anthropic model ID and is not\nguaranteed to resolve on a third-party endpoint. Z.AI's Anthropic-compatible\nendpoint maps Claude model names to GLM equivalents rather than erroring, which\ncan silently swap the model actually used, so pin `model` explicitly (e.g.\n`glm-4.6`) rather than relying on that mapping.\n\n## Fetching & snapshots (`@kontourai/traverse/fetch`)\n\nTraverse's **fetch side** is a standalone-first capability: configurable\nsingle-page fetching with **snapshot capture** so a fetch can be **replayed**\noffline (CI never needs the network). It is exported from the\n`@kontourai/traverse/fetch` subpath — mirroring the `/anthropic` discipline, the\npackage root stays focused on extraction and re-exports none of it. Like\n`extract()`, `fetchSource()` **never throws**: timeouts, retries, robots denial,\nHTTP errors, and bad config surface as a typed `FetchError` on the result. It\nhas no HTTP-client dependency of its own — it's built on global `fetch` plus\n`node:crypto`/`node:fs` — but it does depend on `@kontourai/forage`:\n`fetchSource`/`crawlSource`/`replaySource` route egress through forage's\nSSRF-guarded `createGuardedFetch` (`@kontourai/forage/egress`) by default\n(callers can still inject their own `opts.fetch` to bypass it), and\n`crawlAndExtract` (below) additionally composes forage's own frontier\n`crawl()` (`@kontourai/forage`) for multi-page traversal.\n\nHeadless-browser rendering now has an OPT-IN seam — see \"Rendered fetch\"\nbelow. Out of scope for this layer (see\n[`docs/slice-3-candidates.md`](docs/slice-3-candidates.md)): scheduling.\nMulti-page link-following now has a bounded, same-host-only crawl frontier\n(`crawlSource`, below) — cross-host crawling is still out of scope.\n\n### Standalone fetch\n\n```ts\nimport { fetchSource } from \"@kontourai/traverse/fetch\";\n\nconst result = await fetchSource({\n  id: \"listing-1\",\n  url: \"https://example.com/listing\",\n  // politeness, timeout, and bounded jittered retries all have sane defaults:\n  minDelayMs: 1000, // per-host min gap between requests (default 1000)\n  timeoutMs: 15000, // per-request timeout (default 15000)\n  retries: 2,       // retryable failures only (network/timeout/429/5xx), capped at 5\n  respectRobots: true, // default — fetch & honor /robots.txt for our User-Agent\n  // Identify honestly. The default UA is an honest bot string with a CONTACT\n  // PLACEHOLDER — override it with a real contact when hitting real sites:\n  userAgent: \"my-crawler/1.0 (+https://example.com/bot; contact: ops@example.com)\",\n});\n\nif (result.error) {\n  // typed, never thrown: \"timeout\" | \"network\" | \"http-error\" | \"robots-denied\"\n  //   | \"too-many-redirects\" | \"invalid-url\" | \"invalid-config\" | \"no-snapshot\"\n  //   | \"dependency-missing\" | \"adapter-error\"  (YouTube adapter — see below)\n  console.error(result.error.kind, result.error.message);\n} else {\n  const s = result.snapshot!;\n  // s.url (final, post-redirect), s.status, s.contentType, s.body,\n  // s.bodyHash (sha256), s.redirects?, s.fetchedAt\n  // Binary content (today: \"pdf\" only) sets s.bodyBytes (raw bytes) instead\n  // of s.body (which stays \"\"); EXACTLY ONE of body / bodyBytes is ever\n  // populated. bodyHash's hash domain follows suit: sha256 of the raw bytes\n  // for a binary snapshot, sha256 of utf8-body otherwise.\n}\n```\n\n**Robots & politeness.** With `respectRobots` (default `true`), `/robots.txt` is\nfetched for your `User-Agent` before the request and any redirect hop; a\ndisallowed path returns `kind: \"robots-denied\"` and the page is never fetched.\nIf `/robots.txt` is itself unreachable or 5xx, the fetch **fails open** with a\nwarning (a single-page fetch should not be blocked by robots *infra* problems —\nsee [`docs/adr/0002`](docs/adr/0002-fetch-snapshot-slice2.md)). Politeness is a\nper-host minimum delay, enforced in-process.\n\n### Bounded same-host crawl\n\n`crawlSource(seed, opts)` is a thin BFS driver on top of `fetchSource()` /\n`replaySource()`: it follows same-host links discovered in each fetched page's\nHTML, bounded by `maxPages` and `maxDepth`, and never throws. It reuses the\nsame robots/politeness/replay guarantees as a single `fetchSource()` call —\nsee [`docs/decisions/crawl-frontier.md`](docs/decisions/crawl-frontier.md) for\nthe query-handling, replay, and same-host-boundary decisions.\n\n```ts\nimport { crawlSource } from \"@kontourai/traverse/fetch\";\n\nconst manifest = await crawlSource(\n  { id: \"listing-1\", url: \"https://example.com/listing\" },\n  { maxPages: 20, maxDepth: 2 },\n);\n\n// manifest.seed              — { id, url } the crawl started from\n// manifest.pages             — CrawlPageOutcome[] in BFS discovery order,\n//                               each { url, depth, fetch: FetchResult, sourceRef? }\n// manifest.warnings          — per-page warnings plus a cap-reached note when truncated\n// manifest.truncated         — true if maxPages stopped the crawl before the\n//                               frontier was exhausted\n```\n\nCross-host links are never followed (a page whose own fetch redirects\noff-host is still recorded, but its links stop the frontier there);\nscheduling remains out of scope for this layer. Headless rendering now has\nan opt-in seam a crawl seed can enable (see \"Rendered fetch\" below) —\n`crawlSource` itself still implements no rendering of its own.\n\n### Rendered fetch (opt-in `renderImpl` seam)\n\nFor an SPA/JS-rendered page whose real content only exists after client-side\nJavaScript runs, plug in ANY renderer (Playwright, Puppeteer, a remote\nrendering service, a test stub) via `FetchSourceOptions.renderImpl` and opt\nthe source in with `SourceConfig.render: true`. Traverse core takes no new\nruntime dependency for this — you own the renderer.\n\n```ts\nimport { fetchSource } from \"@kontourai/traverse/fetch\";\nimport type { RenderImpl } from \"@kontourai/traverse/fetch\";\n\n// A minimal stub renderer — swap in Playwright/Puppeteer/a remote service.\nconst renderImpl: RenderImpl = async (url, { timeoutMs }) => {\n  // ... navigate, wait for hydration, read the DOM ...\n  return { html: \"<html>...</html>\" };\n};\n\nconst result = await fetchSource(\n  { id: \"spa-page\", url: \"https://example.com/app\", render: true },\n  { renderImpl },\n);\n\nif (!result.error) {\n  result.snapshot!.rendered; // true — the honest wire-vs-rendered marker\n}\n```\n\n`render: true` with no `renderImpl` configured is a typed `invalid-config`\nerror, never a silent normal fetch. `robots.txt` is checked once against the\nrequested URL before `renderImpl` is ever invoked (renderImpl owns any\nfurther client-side navigation itself). HTTP validators\n(`etag`/`lastModified`/conditional GET) are skipped for a rendered fetch;\nsetting `revalidate: true` alongside `render: true` adds an explicit warning\nrather than silently doing nothing. A `renderImpl` throw maps to\n`kind: \"adapter-error\"`; a reported non-2xx `status` maps to\n`kind: \"http-error\"` — no new `FetchErrorKind` is introduced. See\n[`docs/decisions/rendered-fetch.md`](docs/decisions/rendered-fetch.md) for\nthe full rationale, including the `timeoutMs`-is-a-hint and\nrobots-per-hop-limit accepted scope limits.\n\n### Capture & replay\n\nSnapshots persist to a `SnapshotStore` (a filesystem implementation is bundled;\ninject any other). `replaySource()` returns the latest snapshot as the **same**\n`FetchResult` shape a live call returns, so downstream code is identical live vs.\nreplay:\n\n```ts\nimport {\n  fetchSource,\n  createFilesystemSnapshotStore,\n  replaySource,\n} from \"@kontourai/traverse/fetch\";\n\nconst store = createFilesystemSnapshotStore({ root: \".snapshots\" });\n\n// Capture once (e.g. in a maintainer run):\nconst live = await fetchSource({ id: \"listing-1\", url: \"https://example.com/listing\" });\nif (live.snapshot) await store.put(live.snapshot);\n\n// Replay anywhere (e.g. in CI) — no network:\nconst replayed = await replaySource(store, \"listing-1\");\n// replayed.snapshot!.fromCache === true; byte-identical body & bodyHash.\n```\n\n### One-call composition with provenance continuity\n\n`fetchAndExtract()` wires fetch → content-prep → `extract()` in one call, and\nthreads a **snapshot-anchored `sourceRef`** into the extraction so every proposal\nis traceable back to the exact bytes it came from:\n\n```ts\nimport { fetchAndExtract, parseSnapshotSourceRef } from \"@kontourai/traverse/fetch\";\n\nconst result = await fetchAndExtract(\n  { id: \"listing-1\", url: \"https://example.com/listing\" },\n  {\n    targetSchema,\n    provider,                    // any ExtractionProvider (mock/Anthropic/...)\n    store,                       // required for \"replay\" / \"live-with-capture\"\n    mode: \"live-with-capture\",   // \"live\" | \"replay\" | \"live-with-capture\"\n    pdfTextExtractor,            // optional — forwarded to extract() for a \"pdf\" snapshot; see PDF content-prep below\n  },\n);\n\n// result.fetch       — the FetchResult (snapshot or typed error)\n// result.extraction  — the ExtractionResult (absent if the fetch failed)\n// result.sourceRef   — \"traverse-snapshot:<id>?url=...&sha256=<bodyHash>&fetchedAt=<iso>\"\n\nconst ref = parseSnapshotSourceRef(result.sourceRef!);      // { sourceId, url, bodyHash, fetchedAt }\nconst exactBytes = await store.get(ref!.sourceId, ref!.bodyHash); // the snapshot the proposals came from\n```\n\nUse `mode: \"replay\"` to run the identical extraction against a stored snapshot\nwith no network — the CI path. The bundled `createInMemorySnapshotStore()` is a\nhandy non-persistent store for tests and single-process capture-then-replay.\n\n### Crawl + extract in one call\n\n`crawlAndExtract(seed, opts)` is the multi-page analogue of `fetchAndExtract`:\nit drives a **forage** crawl (`@kontourai/forage`'s frontier — same-host\ndiscovery, sitemap, rendering, and SSRF-guarded egress all live there, not in\ntraverse) and runs `extract()` against every page the crawl returns, threading\neach page's own `sourceRef` into its extraction result:\n\n```ts\nimport { crawlAndExtract } from \"@kontourai/traverse/fetch\";\n\nconst result = await crawlAndExtract(\n  { url: \"https://example.com/listing\" },        // forage Seed\n  {\n    targetSchema,\n    provider,                                     // any ExtractionProvider (mock/Anthropic/...)\n    policy: { maxPages: 20, maxDepth: 2 },        // forage CrawlPolicy — discovery, render, egress, replay store, ...\n  },\n);\n\n// result.manifest        — forage's full CrawlManifest (pages, truncated, warnings)\n// result.pages           — one { page, sourceRef, extraction } per crawled page, in manifest order\nfor (const p of result.pages) {\n  p.sourceRef;             // forage's own citable snapshot pointer (forage-snapshot:...)\n  p.extraction.proposals;  // that page's ExtractionProposal[], provenance-checked as usual\n}\n```\n\nBudgets (`maxProviderCalls`/`maxTotalTokens`) apply **per page** as forwarded\nto `extract()`; to bound the whole crawl, cap the frontier itself via\n`policy.maxPages`. Like `fetchSource`/`crawlSource`, this never throws for an\noperational failure — a bad page degrades to a warning in the manifest, and a\npage whose extraction fails still appears in `pages` with that typed result\nattached. For tests, inject `crawlImpl` to drive a deterministic manifest with\nno network, mirroring `fetchOptions` on `fetchAndExtract`.\n\n### Conditional GET (ETag / Last-Modified)\n\nA snapshot stores the response `ETag` and `Last-Modified` validators when the\nserver sends them. Opt in to a **conditional GET** on a re-fetch (via a\n`revalidate` flag plus a `store`) so an unchanged source comes back as a bodyless\n`304` instead of re-downloading — completing the \"URL recheck\" story\n([`docs/decisions/http-validators.md`](docs/decisions/http-validators.md)):\n\n```ts\nimport { fetchSource, createFilesystemSnapshotStore } from \"@kontourai/traverse/fetch\";\n\nconst store = createFilesystemSnapshotStore({ root: \".snapshots\" });\n\n// First fetch captures whatever validators the server offers onto the snapshot.\nconst first = await fetchSource({ id: \"listing-1\", url });\nif (first.snapshot) await store.put(first.snapshot); // s.etag / s.lastModified stored\n\n// Later re-check: send If-None-Match / If-Modified-Since from the prior snapshot.\nconst again = await fetchSource({ id: \"listing-1\", url, revalidate: true }, { store });\nif (again.snapshot?.notModified) {\n  // 304 — the prior snapshot re-served (fromCache + notModified), zero body transfer.\n  // Record a cheap \"checked, still current\" freshness event and move on.\n  // Do NOT `store.put()` this snapshot: it is byte-identical to the prior one\n  // (same fetchedAt + bodyHash) and a filesystem store would just overwrite the\n  // original file in place. A 304 is a freshness signal, not a new capture.\n}\n```\n\nValidators only make the **unchanged** case cheap; when a server offers none (or\nthere is no prior snapshot) the fetch proceeds normally and the existing\n`bodyHash` (sha256) compare stays the drift signal. Check MECHANICS live here;\nrecheck ORCHESTRATION (when to check, recording drift) is the caller's.\n\n### YouTube / transcript acquisition\n\n`fetchYouTube` acquires a video's captions + metadata and returns them\n**traverse-shaped** — a `Snapshot` carrying the RAW WebVTT\n(`contentType: \"transcript\"`) plus a `metadata` sidecar — so `extract()` and a\nknowledge kit's `ingest-source` consume it unchanged. content-prep's `vttToText`\ncleans the VTT to plain transcript text (cue timings / headers / inline tags\nstripped, overlapping auto-caption lines rolling-window-deduped, `en` preferred\nover `en-orig`), so a proposal's `chars:<start>-<end>` locator anchors to the\nCLEANED transcript exactly the way an html page's anchors to its Markdown. See\n[`docs/decisions/transcript-content-type.md`](docs/decisions/transcript-content-type.md).\n\n```ts\nimport { fetchYouTube } from \"@kontourai/traverse/fetch\";\nimport { prepareContent } from \"@kontourai/traverse\";\n\nconst result = await fetchYouTube({ id: \"talk-1\", url: \"https://youtu.be/VIDEOID?si=track&t=42\" });\nif (result.error?.kind === \"dependency-missing\") {\n  // yt-dlp not installed — an OPTIONAL binary dependency (like @anthropic-ai/sdk).\n} else if (result.snapshot) {\n  result.metadata;            // { videoId, url, title?, channel?, durationSeconds?, uploadDate?, timestampSeconds?, captionLang? }\n  const { text } = prepareContent(result.snapshot.body, \"transcript\"); // cleaned transcript\n}\n```\n\n`yt-dlp` is an **optional external binary**, detected at call time — a consumer\nwho never fetches transcripts pays nothing. Like `fetchSource`, `fetchYouTube`\n**never throws**: a missing binary (`dependency-missing`), a tool failure\n(`adapter-error`), or an unparseable URL (`invalid-url`) surface as typed\n`FetchError`s. The **video id is the canonical identity** (`si=`/`is=` tracking\nstripped, `t=` surfaced as metadata); politeness is **delegated to `yt-dlp`**\nrather than double-governed by traverse's robots/per-host machinery. Inject a\nfake `YtDlp` (`{ available, metadata, captions }`) for network-free tests.\n\n## PDF content-prep (opt-in seam, no bundled parser)\n\n`ContentType` includes `\"pdf\"`, but Traverse ships **no default PDF parser**\nand takes **no new dependency** (hard or optional peer) for it — bundling one\nwould duplicate a parser a real regulated-document consumer already owns and\nkeeps in parity, rather than absorbing genuinely duplicated logic (the reason\nthis package absorbed HTML stripping in the first place). Instead, a caller\nsupplies a small `PdfTextExtractor` that wraps whatever PDF parser it already\nhas:\n\n```ts\nimport { extract } from \"@kontourai/traverse\";\nimport type { PdfExtractedText, PdfTextExtractor } from \"@kontourai/traverse\";\n\nconst myExtractor: PdfTextExtractor = {\n  // May be sync or return a Promise; extract() awaits either.\n  async extract(bytes: Uint8Array): Promise<PdfExtractedText> {\n    // Wrap your own parser here (e.g. one built on pdfjs-dist). Return the\n    // WHOLE document's text plus optional page starts and layout. Every\n    // layout element/table cell range uses offsets into this exact text.\n    const { text, pageOffsets, layout } = await myOwnPdfParser(bytes);\n    return { text, pageOffsets, layout };\n  },\n};\n\nconst result = await extract({\n  content: pdfBytes, // Uint8Array — e.g. Buffer.from(fs.readFileSync(path))\n  contentType: \"pdf\",\n  pdfTextExtractor: myExtractor,\n  sourceRef: \"upload:my-document.pdf\",\n  targetSchema,\n  provider,\n});\n```\n\nWith `pdfTextExtractor` supplied, `extract()` runs it and hands the resulting\ntext into the **existing, unmodified** character-window chunker\n(`prepareAndChunk(text, \"text\", ...)`) — PDF content-prep reuses 100% of the\nalready-tested chunking and `chars:<start>-<end>` provenance-verification\nmachinery HTML/text already use, with zero new chunking or locator code.\nProposals come back in the exact same `ExtractionResult` shape as HTML/text\nextraction, with verified `chars:<start>-<end>` locators into the PDF's\nprepared text.\n\n**With no `pdfTextExtractor` supplied, behavior is completely unchanged**:\n`contentType: \"pdf\"` still returns the pre-existing typed not-implemented\nerror, `proposals: []`, `providerCalls: 0`, `totalTokensUsed: 0` — every\nexisting caller is unaffected by this option's mere existence.\n\n### `pdfPageOffsets` / `resolvePdfPage()`\n\nWhen your extractor reports `pageOffsets` (each page's 0-based start offset\ninto the extracted text), `extract()` validates and attaches them as a\nstructured sidecar — `ExtractionResult.pdfPageOffsets` — mirroring the\n`embedded` sidecar precedent\n([ADR 0005](docs/adr/0005-embedded-state-sidecar.md)). Use `resolvePdfPage()`\nto turn a proposal's verified locator start offset into a 1-based page\nnumber:\n\n```ts\nimport { resolvePdfPage } from \"@kontourai/traverse\";\n\nconst [, start] = result.proposals[0].provenance.locator.match(/^chars:(\\d+)-/)!;\nconst page = resolvePdfPage(result.pdfPageOffsets, Number(start)); // e.g. 2\n```\n\nThis is **not** a new locator scheme — `chars:<start>-<end>` still means\n\"offsets into the prepared text,\" exactly as it does for HTML/text\n([ADR 0001 §4](docs/adr/0001-proposals-only.md)). `pdfPageOffsets` is an\nadditive sidecar on top of it. Full page/region locators (a distinct locator\nscheme) are intentionally not added. Note also that `pageOffsets` is\n**trust-not-verify**: unlike `excerpt`, Traverse cannot independently confirm\npage numbers against real PDF structure — it only checks the array is\nwell-formed (ascending, in-range) and drops it, with a warning, if not.\n\n### `pdfLayout`: geometry, elements, and structured tables\n\nAn extractor may additionally return `layout` with optional page geometry,\ntyped text elements, and tables whose cells retain row/column structure. Each\nelement and cell carries an exact `{ start, end }` UTF-16 range into the same\n`text` used by proposal locators. `preparePdfText()` validates those mappings,\npage references, coordinate bounds, spans, and cell identities; sorts them\ninto deterministic source order; and defensively copies the whole sidecar.\nAny malformed member drops the entire layout with a warning.\n\nThe validated sidecar is available as `ExtractionResult.pdfLayout` and survives\nthe portable extraction-result envelope. A review surface can intersect a\nproposal's `chars:<start>-<end>` span with element/cell ranges for two-way\nhighlighting. `resolvePdfLayoutSpan(pdfLayout, locator)` provides the canonical\nexclusive-end intersection behavior and returns typed `invalid-locator`,\n`not-found`, or `matched` results. Matched table cells retain their page,\ntable index, row, column, and spans. Traverse never infers geometry from\nflattened text, and tables remain cells rather than plausible-looking prose.\n\nPage geometry declares its coordinate unit (`points`, `pixels`, or\n`normalized`), dimensions, and optional rotation. `providerType` can retain a\nparser-native label while the portable `kind` describes the broad layout role.\nThis metadata enriches the exact prepared-text locator; it does not claim raw\nPDF byte offsets or introduce a second proposal locator.\n\n### Known asymmetry\n\nOnly `extract()` and the standalone `preparePdfText()` support the extractor\nseam. `prepareContent(bytes, \"pdf\")` still always returns the typed\nnot-implemented error, even with an extractor available elsewhere in your\ncode — `prepareContent`'s signature was deliberately not changed to accept an\nextractor, to avoid a sync-to-async breaking change to a widely-called\nfunction. See [`docs/decisions/content-preparation.md`](docs/decisions/content-preparation.md)\nfor the full rationale and out-of-scope list.\n\nCalled standalone (not through `extract()`), `preparePdfText(bytes, extractor)`\ndefaults `maxChars` to 32,000 (the same default every other content-prep\nfunction uses) — much smaller than the 5,000,000-char cap `extract()` passes\ninternally when it calls `preparePdfText` on your behalf, so a direct caller\nwho wants the whole document should pass `maxChars` explicitly.\n\n## Image content-prep (opt-in OCR seam, no bundled OCR)\n\n`ContentType` also includes `\"png\"` and `\"jpeg\"`. Traverse ships **no default\nOCR implementation** and takes **no OCR/vision dependency** for these image\ntypes. A caller supplies an `ImageTextExtractor` that wraps the OCR system it\nalready owns:\n\n```ts\nimport { extract } from \"@kontourai/traverse\";\nimport type { ImageTextExtractor } from \"@kontourai/traverse\";\n\nconst myImageExtractor: ImageTextExtractor = {\n  async extract(bytes: Uint8Array) {\n    const text = await myOwnOcr(bytes);\n    return { text, warnings: [\"OCR output should be reviewed\"] };\n  },\n};\n\nconst result = await extract({\n  content: imageBytes, // Uint8Array\n  contentType: \"png\",\n  imageTextExtractor: myImageExtractor,\n  sourceRef: \"upload:document-image.png\",\n  targetSchema,\n  provider,\n});\n```\n\nWith `imageTextExtractor` supplied, `extract()` hands the image bytes to the\nOCR seam, then sends the returned text through the **existing text chunking and\nproposal-normalization pipeline**. Excerpts still verify with the normal\n`indexOf` mechanism and locators are still `chars:<start>-<end>` offsets into\nthe prepared OCR text. Because OCR text is lossier than parsed text, successful\nOCR-derived results carry `ExtractionResult.ocrDerived === true` as an\nadditive presence marker, mirroring `Snapshot.rendered`.\n\nWith no `imageTextExtractor` supplied, image bytes return the normal typed\nbinary-content error with zero provider calls. Fetched PNG/JPEG snapshots are\nc","readmeFilename":"README.md"}