@mailwoman/corpus 8.0.0 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/src/adapter.d.ts +15 -5
- package/out/src/adapter.d.ts.map +1 -1
- package/out/src/adapter.js +11 -9
- package/out/src/adapter.js.map +1 -1
- package/out/src/adapters/ban/adapter.d.ts +7 -0
- package/out/src/adapters/ban/adapter.d.ts.map +1 -1
- package/out/src/adapters/ban/adapter.js +9 -2
- package/out/src/adapters/ban/adapter.js.map +1 -1
- package/out/src/adapters/ban/street-decompose.d.ts.map +1 -1
- package/out/src/adapters/ban/street-decompose.js +5 -1
- package/out/src/adapters/ban/street-decompose.js.map +1 -1
- package/out/src/adapters/fcc-bdc/adapter.d.ts +14 -1
- package/out/src/adapters/fcc-bdc/adapter.d.ts.map +1 -1
- package/out/src/adapters/fcc-bdc/adapter.js +15 -2
- package/out/src/adapters/fcc-bdc/adapter.js.map +1 -1
- package/out/src/adapters/geonames/adapter.d.ts +11 -0
- package/out/src/adapters/geonames/adapter.d.ts.map +1 -1
- package/out/src/adapters/geonames/adapter.js +24 -5
- package/out/src/adapters/geonames/adapter.js.map +1 -1
- package/out/src/adapters/geonames-postal/adapter.d.ts +11 -0
- package/out/src/adapters/geonames-postal/adapter.d.ts.map +1 -1
- package/out/src/adapters/geonames-postal/adapter.js +14 -1
- package/out/src/adapters/geonames-postal/adapter.js.map +1 -1
- package/out/src/adapters/gnaf/adapter.d.ts +10 -1
- package/out/src/adapters/gnaf/adapter.d.ts.map +1 -1
- package/out/src/adapters/gnaf/adapter.js +11 -2
- package/out/src/adapters/gnaf/adapter.js.map +1 -1
- package/out/src/adapters/gnaf/assemble.d.ts +18 -6
- package/out/src/adapters/gnaf/assemble.d.ts.map +1 -1
- package/out/src/adapters/gnaf/assemble.js +16 -6
- package/out/src/adapters/gnaf/assemble.js.map +1 -1
- package/out/src/adapters/index.d.ts.map +1 -1
- package/out/src/adapters/index.js.map +1 -1
- package/out/src/adapters/openaddresses/adapter.d.ts +11 -0
- package/out/src/adapters/openaddresses/adapter.d.ts.map +1 -1
- package/out/src/adapters/openaddresses/adapter.js +18 -3
- package/out/src/adapters/openaddresses/adapter.js.map +1 -1
- package/out/src/adapters/overture/adapter.d.ts +11 -0
- package/out/src/adapters/overture/adapter.d.ts.map +1 -1
- package/out/src/adapters/overture/adapter.js +12 -1
- package/out/src/adapters/overture/adapter.js.map +1 -1
- package/out/src/adapters/state-hi-schools/adapter.d.ts +11 -0
- package/out/src/adapters/state-hi-schools/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-hi-schools/adapter.js +11 -0
- package/out/src/adapters/state-hi-schools/adapter.js.map +1 -1
- package/out/src/adapters/state-ia-contractors/adapter.d.ts +11 -0
- package/out/src/adapters/state-ia-contractors/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-ia-contractors/adapter.js +11 -0
- package/out/src/adapters/state-ia-contractors/adapter.js.map +1 -1
- package/out/src/adapters/state-ny-notaries/adapter.d.ts +11 -0
- package/out/src/adapters/state-ny-notaries/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-ny-notaries/adapter.js +11 -0
- package/out/src/adapters/state-ny-notaries/adapter.js.map +1 -1
- package/out/src/adapters/state-tx-notaries/adapter.d.ts +11 -0
- package/out/src/adapters/state-tx-notaries/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-tx-notaries/adapter.js +15 -2
- package/out/src/adapters/state-tx-notaries/adapter.js.map +1 -1
- package/out/src/adapters/synth-po-box/adapter.d.ts +11 -0
- package/out/src/adapters/synth-po-box/adapter.d.ts.map +1 -1
- package/out/src/adapters/synth-po-box/adapter.js +13 -2
- package/out/src/adapters/synth-po-box/adapter.js.map +1 -1
- package/out/src/adapters/tiger/adapter.d.ts +14 -1
- package/out/src/adapters/tiger/adapter.d.ts.map +1 -1
- package/out/src/adapters/tiger/adapter.js +19 -4
- package/out/src/adapters/tiger/adapter.js.map +1 -1
- package/out/src/adapters/tiger/street-decompose.d.ts.map +1 -1
- package/out/src/adapters/tiger/street-decompose.js.map +1 -1
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.js +12 -1
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.js.map +1 -1
- package/out/src/adapters/usgov-imls-pls/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-imls-pls/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-imls-pls/adapter.js +11 -0
- package/out/src/adapters/usgov-imls-pls/adapter.js.map +1 -1
- package/out/src/adapters/usgov-irs-bmf/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-irs-bmf/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-irs-bmf/adapter.js +17 -2
- package/out/src/adapters/usgov-irs-bmf/adapter.js.map +1 -1
- package/out/src/adapters/usgov-nad/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-nad/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-nad/adapter.js +12 -1
- package/out/src/adapters/usgov-nad/adapter.js.map +1 -1
- package/out/src/adapters/usgov-nppes/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-nppes/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-nppes/adapter.js +11 -0
- package/out/src/adapters/usgov-nppes/adapter.js.map +1 -1
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts +11 -0
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js +15 -2
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js.map +1 -1
- package/out/src/adapters/wof-admin-jp/adapter.d.ts +7 -0
- package/out/src/adapters/wof-admin-jp/adapter.d.ts.map +1 -1
- package/out/src/adapters/wof-admin-jp/adapter.js +18 -3
- package/out/src/adapters/wof-admin-jp/adapter.js.map +1 -1
- package/out/src/adapters/wof-admin-json/adapter.d.ts +13 -3
- package/out/src/adapters/wof-admin-json/adapter.d.ts.map +1 -1
- package/out/src/adapters/wof-admin-json/adapter.js +15 -5
- package/out/src/adapters/wof-admin-json/adapter.js.map +1 -1
- package/out/src/adapters/wof-postalcode-json/adapter.d.ts +7 -0
- package/out/src/adapters/wof-postalcode-json/adapter.d.ts.map +1 -1
- package/out/src/adapters/wof-postalcode-json/adapter.js +9 -2
- package/out/src/adapters/wof-postalcode-json/adapter.js.map +1 -1
- package/out/src/align.d.ts +12 -4
- package/out/src/align.d.ts.map +1 -1
- package/out/src/align.js +9 -5
- package/out/src/align.js.map +1 -1
- package/out/src/build.d.ts +24 -8
- package/out/src/build.d.ts.map +1 -1
- package/out/src/build.js +3 -3
- package/out/src/build.js.map +1 -1
- package/out/src/codex/us-fips-state.d.ts +6 -2
- package/out/src/codex/us-fips-state.d.ts.map +1 -1
- package/out/src/codex/us-fips-state.js +3 -1
- package/out/src/codex/us-fips-state.js.map +1 -1
- package/out/src/golden.d.ts +21 -7
- package/out/src/golden.d.ts.map +1 -1
- package/out/src/golden.js +18 -10
- package/out/src/golden.js.map +1 -1
- package/out/src/license.d.ts +3 -1
- package/out/src/license.d.ts.map +1 -1
- package/out/src/license.js +4 -2
- package/out/src/license.js.map +1 -1
- package/out/src/parquet-wrapper/reader.d.ts +4 -2
- package/out/src/parquet-wrapper/reader.d.ts.map +1 -1
- package/out/src/parquet-wrapper/reader.js +5 -4
- package/out/src/parquet-wrapper/reader.js.map +1 -1
- package/out/src/parquet-wrapper/schema.d.ts +14 -10
- package/out/src/parquet-wrapper/schema.d.ts.map +1 -1
- package/out/src/parquet-wrapper/schema.js +6 -2
- package/out/src/parquet-wrapper/schema.js.map +1 -1
- package/out/src/parquet-wrapper/writer.d.ts +12 -4
- package/out/src/parquet-wrapper/writer.d.ts.map +1 -1
- package/out/src/parquet-wrapper/writer.js +12 -4
- package/out/src/parquet-wrapper/writer.js.map +1 -1
- package/out/src/parquet.d.ts +21 -7
- package/out/src/parquet.d.ts.map +1 -1
- package/out/src/parquet.js +15 -4
- package/out/src/parquet.js.map +1 -1
- package/out/src/runner.d.ts +39 -13
- package/out/src/runner.d.ts.map +1 -1
- package/out/src/runner.js +7 -3
- package/out/src/runner.js.map +1 -1
- package/out/src/shard-recipes/anchor-absorption.d.ts +4 -0
- package/out/src/shard-recipes/anchor-absorption.d.ts.map +1 -1
- package/out/src/shard-recipes/anchor-absorption.js +14 -5
- package/out/src/shard-recipes/anchor-absorption.js.map +1 -1
- package/out/src/shard-recipes/boundary-stress.d.ts +4 -0
- package/out/src/shard-recipes/boundary-stress.d.ts.map +1 -1
- package/out/src/shard-recipes/boundary-stress.js +13 -7
- package/out/src/shard-recipes/boundary-stress.js.map +1 -1
- package/out/src/shard-recipes/country-balanced.d.ts +4 -0
- package/out/src/shard-recipes/country-balanced.d.ts.map +1 -1
- package/out/src/shard-recipes/country-balanced.js +39 -11
- package/out/src/shard-recipes/country-balanced.js.map +1 -1
- package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts +4 -0
- package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts.map +1 -1
- package/out/src/shard-recipes/cz-pcfirst-preposition.js +4 -0
- package/out/src/shard-recipes/cz-pcfirst-preposition.js.map +1 -1
- package/out/src/shard-recipes/fr-admin-split.d.ts +4 -0
- package/out/src/shard-recipes/fr-admin-split.d.ts.map +1 -1
- package/out/src/shard-recipes/fr-admin-split.js +14 -3
- package/out/src/shard-recipes/fr-admin-split.js.map +1 -1
- package/out/src/shard-recipes/fr-bare-street.d.ts +4 -0
- package/out/src/shard-recipes/fr-bare-street.d.ts.map +1 -1
- package/out/src/shard-recipes/fr-bare-street.js +4 -0
- package/out/src/shard-recipes/fr-bare-street.js.map +1 -1
- package/out/src/shard-recipes/fr-fragment.d.ts +4 -0
- package/out/src/shard-recipes/fr-fragment.d.ts.map +1 -1
- package/out/src/shard-recipes/fr-fragment.js +25 -8
- package/out/src/shard-recipes/fr-fragment.js.map +1 -1
- package/out/src/shard-recipes/fr-lieudit.d.ts +4 -0
- package/out/src/shard-recipes/fr-lieudit.d.ts.map +1 -1
- package/out/src/shard-recipes/fr-lieudit.js +21 -8
- package/out/src/shard-recipes/fr-lieudit.js.map +1 -1
- package/out/src/shard-recipes/fr-order.d.ts +4 -0
- package/out/src/shard-recipes/fr-order.d.ts.map +1 -1
- package/out/src/shard-recipes/fr-order.js +27 -8
- package/out/src/shard-recipes/fr-order.js.map +1 -1
- package/out/src/shard-recipes/german.d.ts +4 -0
- package/out/src/shard-recipes/german.d.ts.map +1 -1
- package/out/src/shard-recipes/german.js +16 -6
- package/out/src/shard-recipes/german.js.map +1 -1
- package/out/src/shard-recipes/house-venue.d.ts +4 -0
- package/out/src/shard-recipes/house-venue.d.ts.map +1 -1
- package/out/src/shard-recipes/house-venue.js +4 -0
- package/out/src/shard-recipes/house-venue.js.map +1 -1
- package/out/src/shard-recipes/index.d.ts +9 -3
- package/out/src/shard-recipes/index.d.ts.map +1 -1
- package/out/src/shard-recipes/index.js +12 -4
- package/out/src/shard-recipes/index.js.map +1 -1
- package/out/src/shard-recipes/intersection.d.ts +4 -0
- package/out/src/shard-recipes/intersection.d.ts.map +1 -1
- package/out/src/shard-recipes/intersection.js +27 -13
- package/out/src/shard-recipes/intersection.js.map +1 -1
- package/out/src/shard-recipes/locale.d.ts +4 -0
- package/out/src/shard-recipes/locale.d.ts.map +1 -1
- package/out/src/shard-recipes/locale.js +9 -4
- package/out/src/shard-recipes/locale.js.map +1 -1
- package/out/src/shard-recipes/nl-postcode.d.ts +4 -0
- package/out/src/shard-recipes/nl-postcode.d.ts.map +1 -1
- package/out/src/shard-recipes/nl-postcode.js +8 -2
- package/out/src/shard-recipes/nl-postcode.js.map +1 -1
- package/out/src/shard-recipes/no-fragment.d.ts +4 -0
- package/out/src/shard-recipes/no-fragment.d.ts.map +1 -1
- package/out/src/shard-recipes/no-fragment.js +8 -2
- package/out/src/shard-recipes/no-fragment.js.map +1 -1
- package/out/src/shard-recipes/no-street-led.d.ts +4 -0
- package/out/src/shard-recipes/no-street-led.d.ts.map +1 -1
- package/out/src/shard-recipes/no-street-led.js +5 -1
- package/out/src/shard-recipes/no-street-led.js.map +1 -1
- package/out/src/shard-recipes/no-street.d.ts +4 -0
- package/out/src/shard-recipes/no-street.d.ts.map +1 -1
- package/out/src/shard-recipes/no-street.js +4 -0
- package/out/src/shard-recipes/no-street.js.map +1 -1
- package/out/src/shard-recipes/po-box-cedex.d.ts +4 -0
- package/out/src/shard-recipes/po-box-cedex.d.ts.map +1 -1
- package/out/src/shard-recipes/po-box-cedex.js +99 -43
- package/out/src/shard-recipes/po-box-cedex.js.map +1 -1
- package/out/src/shard-recipes/po-box.d.ts +4 -0
- package/out/src/shard-recipes/po-box.d.ts.map +1 -1
- package/out/src/shard-recipes/po-box.js +4 -0
- package/out/src/shard-recipes/po-box.js.map +1 -1
- package/out/src/shard-recipes/scaffold.d.ts +48 -16
- package/out/src/shard-recipes/scaffold.d.ts.map +1 -1
- package/out/src/shard-recipes/scaffold.js +10 -6
- package/out/src/shard-recipes/scaffold.js.map +1 -1
- package/out/src/shard-recipes/si-bare-village.d.ts +4 -0
- package/out/src/shard-recipes/si-bare-village.d.ts.map +1 -1
- package/out/src/shard-recipes/si-bare-village.js +4 -0
- package/out/src/shard-recipes/si-bare-village.js.map +1 -1
- package/out/src/shard-recipes/street-affix.d.ts +4 -0
- package/out/src/shard-recipes/street-affix.d.ts.map +1 -1
- package/out/src/shard-recipes/street-affix.js +29 -10
- package/out/src/shard-recipes/street-affix.js.map +1 -1
- package/out/src/shard-recipes/street-bare.d.ts +4 -0
- package/out/src/shard-recipes/street-bare.d.ts.map +1 -1
- package/out/src/shard-recipes/street-bare.js +4 -0
- package/out/src/shard-recipes/street-bare.js.map +1 -1
- package/out/src/shard-recipes/street.d.ts +4 -0
- package/out/src/shard-recipes/street.d.ts.map +1 -1
- package/out/src/shard-recipes/street.js +4 -0
- package/out/src/shard-recipes/street.js.map +1 -1
- package/out/src/shard-recipes/unit.d.ts +4 -0
- package/out/src/shard-recipes/unit.d.ts.map +1 -1
- package/out/src/shard-recipes/unit.js +45 -14
- package/out/src/shard-recipes/unit.js.map +1 -1
- package/out/src/split.d.ts +18 -6
- package/out/src/split.d.ts.map +1 -1
- package/out/src/split.js +4 -2
- package/out/src/split.js.map +1 -1
- package/out/src/synthesize-anchor-absorption.d.ts +7 -1
- package/out/src/synthesize-anchor-absorption.d.ts.map +1 -1
- package/out/src/synthesize-anchor-absorption.js +28 -14
- package/out/src/synthesize-anchor-absorption.js.map +1 -1
- package/out/src/synthesize-boundary-stress.d.ts +3 -1
- package/out/src/synthesize-boundary-stress.d.ts.map +1 -1
- package/out/src/synthesize-boundary-stress.js +35 -28
- package/out/src/synthesize-boundary-stress.js.map +1 -1
- package/out/src/synthesize-german.d.ts +15 -5
- package/out/src/synthesize-german.d.ts.map +1 -1
- package/out/src/synthesize-german.js +9 -3
- package/out/src/synthesize-german.js.map +1 -1
- package/out/src/synthesize-house-venue.d.ts.map +1 -1
- package/out/src/synthesize-house-venue.js +15 -15
- package/out/src/synthesize-house-venue.js.map +1 -1
- package/out/src/synthesize-intersection.d.ts +9 -3
- package/out/src/synthesize-intersection.d.ts.map +1 -1
- package/out/src/synthesize-intersection.js +25 -6
- package/out/src/synthesize-intersection.js.map +1 -1
- package/out/src/synthesize-no-street.d.ts +3 -1
- package/out/src/synthesize-no-street.d.ts.map +1 -1
- package/out/src/synthesize-no-street.js +5 -6
- package/out/src/synthesize-no-street.js.map +1 -1
- package/out/src/synthesize-po-box.d.ts +15 -5
- package/out/src/synthesize-po-box.d.ts.map +1 -1
- package/out/src/synthesize-po-box.js +21 -7
- package/out/src/synthesize-po-box.js.map +1 -1
- package/out/src/synthesize-street.d.ts +3 -1
- package/out/src/synthesize-street.d.ts.map +1 -1
- package/out/src/synthesize-street.js +6 -1
- package/out/src/synthesize-street.js.map +1 -1
- package/out/src/synthesize.d.ts +39 -13
- package/out/src/synthesize.d.ts.map +1 -1
- package/out/src/synthesize.js +66 -36
- package/out/src/synthesize.js.map +1 -1
- package/out/src/tokenize.d.ts +15 -5
- package/out/src/tokenize.d.ts.map +1 -1
- package/out/src/tokenize.js.map +1 -1
- package/out/src/tools/align-shard.d.ts.map +1 -1
- package/out/src/tools/align-shard.js +3 -1
- package/out/src/tools/align-shard.js.map +1 -1
- package/out/src/tools/audit.d.ts.map +1 -1
- package/out/src/tools/audit.js +20 -8
- package/out/src/tools/audit.js.map +1 -1
- package/out/src/tools/corpus-stats.d.ts.map +1 -1
- package/out/src/tools/corpus-stats.js.map +1 -1
- package/out/src/tools/fetch/ban.d.ts.map +1 -1
- package/out/src/tools/fetch/ban.js +17 -10
- package/out/src/tools/fetch/ban.js.map +1 -1
- package/out/src/tools/fetch/download.d.ts +30 -10
- package/out/src/tools/fetch/download.d.ts.map +1 -1
- package/out/src/tools/fetch/download.js +26 -6
- package/out/src/tools/fetch/download.js.map +1 -1
- package/out/src/tools/fetch/hrsa.d.ts.map +1 -1
- package/out/src/tools/fetch/hrsa.js.map +1 -1
- package/out/src/tools/fetch/imls-pls.d.ts.map +1 -1
- package/out/src/tools/fetch/imls-pls.js +18 -18
- package/out/src/tools/fetch/imls-pls.js.map +1 -1
- package/out/src/tools/fetch/index.d.ts +3 -1
- package/out/src/tools/fetch/index.d.ts.map +1 -1
- package/out/src/tools/fetch/index.js +3 -1
- package/out/src/tools/fetch/index.js.map +1 -1
- package/out/src/tools/fetch/nad.d.ts +21 -7
- package/out/src/tools/fetch/nad.d.ts.map +1 -1
- package/out/src/tools/fetch/nad.js +5 -5
- package/out/src/tools/fetch/nad.js.map +1 -1
- package/out/src/tools/fetch/nppes.d.ts.map +1 -1
- package/out/src/tools/fetch/nppes.js +9 -15
- package/out/src/tools/fetch/nppes.js.map +1 -1
- package/out/src/tools/fetch/openaddresses.d.ts +3 -1
- package/out/src/tools/fetch/openaddresses.d.ts.map +1 -1
- package/out/src/tools/fetch/openaddresses.js +32 -23
- package/out/src/tools/fetch/openaddresses.js.map +1 -1
- package/out/src/tools/fetch/ppd.d.ts +3 -1
- package/out/src/tools/fetch/ppd.d.ts.map +1 -1
- package/out/src/tools/fetch/ppd.js +14 -3
- package/out/src/tools/fetch/ppd.js.map +1 -1
- package/out/src/tools/fetch/state-hi-schools.d.ts.map +1 -1
- package/out/src/tools/fetch/state-hi-schools.js +13 -6
- package/out/src/tools/fetch/state-hi-schools.js.map +1 -1
- package/out/src/tools/fetch/state-sources.d.ts.map +1 -1
- package/out/src/tools/fetch/state-sources.js +8 -3
- package/out/src/tools/fetch/state-sources.js.map +1 -1
- package/out/src/tools/fetch/tiger-full.d.ts +9 -3
- package/out/src/tools/fetch/tiger-full.d.ts.map +1 -1
- package/out/src/tools/fetch/tiger-full.js +35 -20
- package/out/src/tools/fetch/tiger-full.js.map +1 -1
- package/out/src/tools/gb-title-case.d.ts.map +1 -1
- package/out/src/tools/gb-title-case.js.map +1 -1
- package/out/src/tools/golden-expand.d.ts +24 -8
- package/out/src/tools/golden-expand.d.ts.map +1 -1
- package/out/src/tools/golden-expand.js +20 -12
- package/out/src/tools/golden-expand.js.map +1 -1
- package/out/src/tools/golden-promote.d.ts +18 -6
- package/out/src/tools/golden-promote.d.ts.map +1 -1
- package/out/src/tools/golden-promote.js +22 -7
- package/out/src/tools/golden-promote.js.map +1 -1
- package/out/src/tools/ingest-csv.d.ts +3 -1
- package/out/src/tools/ingest-csv.d.ts.map +1 -1
- package/out/src/tools/ingest-csv.js +17 -19
- package/out/src/tools/ingest-csv.js.map +1 -1
- package/out/src/tools/jsonl-to-parquet.d.ts +18 -6
- package/out/src/tools/jsonl-to-parquet.d.ts.map +1 -1
- package/out/src/tools/jsonl-to-parquet.js +11 -5
- package/out/src/tools/jsonl-to-parquet.js.map +1 -1
- package/out/src/tools/lint-shard-vocab.d.ts +36 -12
- package/out/src/tools/lint-shard-vocab.d.ts.map +1 -1
- package/out/src/tools/lint-shard-vocab.js +25 -11
- package/out/src/tools/lint-shard-vocab.js.map +1 -1
- package/out/src/tools/lint-shard.d.ts +30 -10
- package/out/src/tools/lint-shard.d.ts.map +1 -1
- package/out/src/tools/lint-shard.js +33 -20
- package/out/src/tools/lint-shard.js.map +1 -1
- package/out/src/tools/overlay-manifest.d.ts.map +1 -1
- package/out/src/tools/overlay-manifest.js +6 -4
- package/out/src/tools/overlay-manifest.js.map +1 -1
- package/out/src/tools/shard-kryptonite.d.ts +6 -2
- package/out/src/tools/shard-kryptonite.d.ts.map +1 -1
- package/out/src/tools/shard-kryptonite.js +1 -1
- package/out/src/tools/shard-kryptonite.js.map +1 -1
- package/out/src/tools/shard-translit.d.ts +9 -3
- package/out/src/tools/shard-translit.d.ts.map +1 -1
- package/out/src/tools/shard-translit.js +2 -2
- package/out/src/tools/shard-translit.js.map +1 -1
- package/out/src/types.d.ts +51 -17
- package/out/src/types.d.ts.map +1 -1
- package/out/src/wof-json.d.ts +9 -3
- package/out/src/wof-json.d.ts.map +1 -1
- package/out/src/wof-json.js +6 -4
- package/out/src/wof-json.js.map +1 -1
- package/package.json +7 -6
- package/src/adapter.ts +24 -13
- package/src/adapters/ban/adapter.ts +12 -2
- package/src/adapters/ban/street-decompose.ts +7 -1
- package/src/adapters/fcc-bdc/adapter.ts +19 -3
- package/src/adapters/geonames/adapter.ts +28 -5
- package/src/adapters/geonames-postal/adapter.ts +17 -1
- package/src/adapters/gnaf/adapter.ts +15 -2
- package/src/adapters/gnaf/assemble.ts +40 -10
- package/src/adapters/index.ts +13 -0
- package/src/adapters/openaddresses/adapter.ts +22 -3
- package/src/adapters/overture/adapter.ts +18 -2
- package/src/adapters/state-hi-schools/adapter.ts +15 -0
- package/src/adapters/state-ia-contractors/adapter.ts +15 -0
- package/src/adapters/state-ny-notaries/adapter.ts +15 -0
- package/src/adapters/state-tx-notaries/adapter.ts +18 -2
- package/src/adapters/synth-po-box/adapter.ts +19 -2
- package/src/adapters/tiger/adapter.ts +23 -4
- package/src/adapters/tiger/street-decompose.ts +1 -0
- package/src/adapters/usgov-hrsa-fqhc/adapter.ts +18 -2
- package/src/adapters/usgov-imls-pls/adapter.ts +15 -0
- package/src/adapters/usgov-irs-bmf/adapter.ts +19 -2
- package/src/adapters/usgov-nad/adapter.ts +14 -1
- package/src/adapters/usgov-nppes/adapter.ts +13 -0
- package/src/adapters/usgov-samhsa-treatment-locator/adapter.ts +21 -3
- package/src/adapters/wof-admin-jp/adapter.ts +20 -3
- package/src/adapters/wof-admin-json/adapter.ts +22 -7
- package/src/adapters/wof-postalcode-json/adapter.ts +10 -2
- package/src/align.ts +21 -8
- package/src/build.ts +48 -11
- package/src/codex/us-fips-state.ts +6 -2
- package/src/golden.ts +28 -13
- package/src/license.ts +4 -2
- package/src/parquet-wrapper/reader.ts +6 -4
- package/src/parquet-wrapper/schema.ts +14 -10
- package/src/parquet-wrapper/writer.ts +12 -4
- package/src/parquet.ts +39 -8
- package/src/runner.ts +49 -15
- package/src/shard-recipes/anchor-absorption.ts +21 -5
- package/src/shard-recipes/boundary-stress.ts +20 -7
- package/src/shard-recipes/country-balanced.ts +78 -13
- package/src/shard-recipes/cz-pcfirst-preposition.ts +9 -0
- package/src/shard-recipes/fr-admin-split.ts +30 -5
- package/src/shard-recipes/fr-bare-street.ts +10 -0
- package/src/shard-recipes/fr-fragment.ts +33 -8
- package/src/shard-recipes/fr-lieudit.ts +35 -9
- package/src/shard-recipes/fr-order.ts +47 -9
- package/src/shard-recipes/german.ts +32 -6
- package/src/shard-recipes/house-venue.ts +7 -0
- package/src/shard-recipes/index.ts +12 -4
- package/src/shard-recipes/intersection.ts +63 -14
- package/src/shard-recipes/locale.ts +37 -4
- package/src/shard-recipes/nl-postcode.ts +12 -2
- package/src/shard-recipes/no-fragment.ts +12 -2
- package/src/shard-recipes/no-street-led.ts +11 -1
- package/src/shard-recipes/no-street.ts +7 -0
- package/src/shard-recipes/po-box-cedex.ts +145 -45
- package/src/shard-recipes/po-box.ts +7 -0
- package/src/shard-recipes/scaffold.ts +52 -20
- package/src/shard-recipes/si-bare-village.ts +9 -0
- package/src/shard-recipes/street-affix.ts +88 -13
- package/src/shard-recipes/street-bare.ts +10 -0
- package/src/shard-recipes/street.ts +7 -0
- package/src/shard-recipes/unit.ts +79 -16
- package/src/split.ts +28 -7
- package/src/synthesize-anchor-absorption.ts +41 -14
- package/src/synthesize-boundary-stress.ts +57 -30
- package/src/synthesize-german.ts +30 -7
- package/src/synthesize-house-venue.ts +22 -16
- package/src/synthesize-intersection.ts +34 -7
- package/src/synthesize-no-street.ts +18 -10
- package/src/synthesize-po-box.ts +42 -10
- package/src/synthesize-street.ts +10 -2
- package/src/synthesize.ts +81 -38
- package/src/tokenize.ts +15 -5
- package/src/tools/align-shard.ts +6 -1
- package/src/tools/audit.ts +57 -11
- package/src/tools/corpus-stats.ts +9 -0
- package/src/tools/fetch/ban.ts +32 -10
- package/src/tools/fetch/download.ts +49 -12
- package/src/tools/fetch/hrsa.ts +3 -0
- package/src/tools/fetch/imls-pls.ts +28 -18
- package/src/tools/fetch/index.ts +3 -1
- package/src/tools/fetch/nad.ts +39 -12
- package/src/tools/fetch/nppes.ts +17 -15
- package/src/tools/fetch/openaddresses.ts +52 -24
- package/src/tools/fetch/ppd.ts +22 -3
- package/src/tools/fetch/state-hi-schools.ts +17 -6
- package/src/tools/fetch/state-sources.ts +16 -3
- package/src/tools/fetch/tiger-full.ts +66 -23
- package/src/tools/gb-title-case.ts +1 -0
- package/src/tools/golden-expand.ts +64 -20
- package/src/tools/golden-promote.ts +53 -13
- package/src/tools/ingest-csv.ts +41 -26
- package/src/tools/jsonl-to-parquet.ts +30 -10
- package/src/tools/lint-shard-vocab.ts +75 -24
- package/src/tools/lint-shard.ts +75 -31
- package/src/tools/overlay-manifest.ts +7 -4
- package/src/tools/shard-kryptonite.ts +11 -3
- package/src/tools/shard-translit.ts +20 -5
- package/src/types.ts +51 -17
- package/src/wof-json.ts +18 -7
|
@@ -19,6 +19,9 @@
|
|
|
19
19
|
* county ZIP to disk (no curl subprocess).
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
+
/* oxlint-disable sister-software/prefer-region-over-marks -- these markers label steps inside one
|
|
23
|
+
procedure, not sections of declarations. A region there folds nothing a reader wants folded. */
|
|
24
|
+
|
|
22
25
|
import { createWriteStream, existsSync, mkdirSync, rmSync, statSync } from "node:fs"
|
|
23
26
|
import { basename, join } from "node:path"
|
|
24
27
|
import { Readable } from "node:stream"
|
|
@@ -30,6 +33,22 @@ import { sha256File } from "@mailwoman/core/utils"
|
|
|
30
33
|
import type { BaseFetchOptions, FetchSummary } from "./download.ts"
|
|
31
34
|
import { isTransientStatus, readManifest, writeManifest } from "./download.ts"
|
|
32
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Bytes per KiB — the divisor for human-readable sizes, and the floor below which a "download" is an error page rather
|
|
38
|
+
* than data.
|
|
39
|
+
*/
|
|
40
|
+
/**
|
|
41
|
+
* Lowest 2xx status; anything below is informational.
|
|
42
|
+
*/
|
|
43
|
+
const HTTP_OK = 200
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Lowest 3xx status; at or above it the response is a redirect or an error, not a body.
|
|
47
|
+
*/
|
|
48
|
+
const HTTP_REDIRECT = 300
|
|
49
|
+
|
|
50
|
+
const BYTES_PER_KIB = 1024
|
|
51
|
+
|
|
33
52
|
const TIGER_BASE_URL = "https://www2.census.gov/geo/tiger/TIGER2024/ADDRFEAT"
|
|
34
53
|
|
|
35
54
|
export interface FetchTigerFullOptions extends BaseFetchOptions {
|
|
@@ -38,11 +57,17 @@ export interface FetchTigerFullOptions extends BaseFetchOptions {
|
|
|
38
57
|
* v0.1.1.
|
|
39
58
|
*/
|
|
40
59
|
skipStateFips?: string
|
|
41
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Seconds to sleep between downloads. Default `0.2`.
|
|
62
|
+
*/
|
|
42
63
|
rateSleep?: number
|
|
43
|
-
/**
|
|
64
|
+
/**
|
|
65
|
+
* Max concurrent download workers per state. Default `4`.
|
|
66
|
+
*/
|
|
44
67
|
maxParallel?: number
|
|
45
|
-
/**
|
|
68
|
+
/**
|
|
69
|
+
* Print planned downloads without fetching. Default `false`.
|
|
70
|
+
*/
|
|
46
71
|
dryRun?: boolean
|
|
47
72
|
}
|
|
48
73
|
|
|
@@ -57,8 +82,9 @@ function humanBytes(bytes: number): string {
|
|
|
57
82
|
let value = bytes
|
|
58
83
|
let unit = 0
|
|
59
84
|
|
|
60
|
-
while (value >=
|
|
85
|
+
while (value >= BYTES_PER_KIB && unit < units.length - 1) {
|
|
61
86
|
value /= 1024
|
|
87
|
+
|
|
62
88
|
unit++
|
|
63
89
|
}
|
|
64
90
|
|
|
@@ -89,6 +115,7 @@ async function streamDownload(
|
|
|
89
115
|
|
|
90
116
|
if (attempt < opts.retries && isTransientStatus(res.status)) {
|
|
91
117
|
await sleep(opts.retryDelayMs)
|
|
118
|
+
|
|
92
119
|
continue
|
|
93
120
|
}
|
|
94
121
|
|
|
@@ -96,6 +123,7 @@ async function streamDownload(
|
|
|
96
123
|
} catch {
|
|
97
124
|
if (attempt < opts.retries) {
|
|
98
125
|
await sleep(opts.retryDelayMs)
|
|
126
|
+
|
|
99
127
|
continue
|
|
100
128
|
}
|
|
101
129
|
|
|
@@ -106,7 +134,9 @@ async function streamDownload(
|
|
|
106
134
|
return 0
|
|
107
135
|
}
|
|
108
136
|
|
|
109
|
-
/**
|
|
137
|
+
/**
|
|
138
|
+
* Read a per-state MANIFEST.json into a filename → entry map.
|
|
139
|
+
*/
|
|
110
140
|
async function readCountyManifest(manifestPath: string): Promise<Map<string, CountyEntry>> {
|
|
111
141
|
const map = new Map<string, CountyEntry>()
|
|
112
142
|
const parsed = await readManifest<{ counties?: CountyEntry[] }>(manifestPath)
|
|
@@ -120,7 +150,9 @@ async function readCountyManifest(manifestPath: string): Promise<Map<string, Cou
|
|
|
120
150
|
return map
|
|
121
151
|
}
|
|
122
152
|
|
|
123
|
-
/**
|
|
153
|
+
/**
|
|
154
|
+
* Check whether a file already matches a recorded sha256 and byte count.
|
|
155
|
+
*/
|
|
124
156
|
async function fileMatchesSha(path: string, expectedSha: string, expectedBytes: number): Promise<boolean> {
|
|
125
157
|
if (!existsSync(path)) return false
|
|
126
158
|
|
|
@@ -133,18 +165,20 @@ type CountyResult =
|
|
|
133
165
|
| { ok: true; filename: string; sha256: string; bytes: number }
|
|
134
166
|
| { ok: false; filename: string; reason: string }
|
|
135
167
|
|
|
136
|
-
/**
|
|
168
|
+
/**
|
|
169
|
+
* Download one county ZIP (size sanity check + sha256).
|
|
170
|
+
*/
|
|
137
171
|
async function downloadCounty(url: string, dest: string): Promise<CountyResult> {
|
|
138
172
|
const filename = basename(dest)
|
|
139
|
-
const status = await streamDownload(url, dest, { timeoutMs: 600_000, retries: 3, retryDelayMs:
|
|
173
|
+
const status = await streamDownload(url, dest, { timeoutMs: 600_000, retries: 3, retryDelayMs: 5000 })
|
|
140
174
|
|
|
141
|
-
if (status <
|
|
175
|
+
if (status < HTTP_OK || status >= HTTP_REDIRECT) {
|
|
142
176
|
return { ok: false, filename, reason: `HTTP ${status}` }
|
|
143
177
|
}
|
|
144
178
|
|
|
145
179
|
const bytes = statSync(dest).size
|
|
146
180
|
|
|
147
|
-
if (bytes <
|
|
181
|
+
if (bytes < BYTES_PER_KIB) {
|
|
148
182
|
rmSync(dest, { force: true })
|
|
149
183
|
|
|
150
184
|
return { ok: false, filename, reason: `too small (${bytes} bytes)` }
|
|
@@ -167,10 +201,10 @@ export async function fetchTigerFull(
|
|
|
167
201
|
const addrfeatDir = join(options.outRoot, "tiger", "addrfeat")
|
|
168
202
|
mkdirSync(addrfeatDir, { recursive: true })
|
|
169
203
|
|
|
170
|
-
//
|
|
171
|
-
|
|
172
|
-
// -------------------------------------------------------------------------
|
|
204
|
+
// MARK: Step 1 — discover the county file list
|
|
205
|
+
|
|
173
206
|
report?.(`=== Fetching TIGER 2024 ADDRFEAT directory listing...`)
|
|
207
|
+
|
|
174
208
|
const listingRes = await fetch(`${TIGER_BASE_URL}/`, {
|
|
175
209
|
headers: { "Accept-Encoding": "gzip, br" },
|
|
176
210
|
signal: AbortSignal.timeout(60_000),
|
|
@@ -178,7 +212,7 @@ export async function fetchTigerFull(
|
|
|
178
212
|
|
|
179
213
|
if (!listingRes.ok) throw new Error(`Failed to fetch TIGER directory listing: HTTP ${listingRes.status}`)
|
|
180
214
|
const html = await listingRes.text()
|
|
181
|
-
const allZips = [...new Set(html.match(/tl_2024_[0-9]{5}_addrfeat\.zip/g)
|
|
215
|
+
const allZips = [...new Set(html.match(/tl_2024_[0-9]{5}_addrfeat\.zip/g))].toSorted()
|
|
182
216
|
const totalCounties = allZips.length
|
|
183
217
|
report?.(` Found ${totalCounties} county ZIPs in the TIGER 2024 ADDRFEAT index.`)
|
|
184
218
|
|
|
@@ -195,9 +229,8 @@ export async function fetchTigerFull(
|
|
|
195
229
|
|
|
196
230
|
report?.(` Spans ${stateFiles.size} state/territory FIPS codes.`)
|
|
197
231
|
|
|
198
|
-
//
|
|
199
|
-
|
|
200
|
-
// -------------------------------------------------------------------------
|
|
232
|
+
// MARK: Step 2 — download the county ZIPs
|
|
233
|
+
|
|
201
234
|
let totalFetched = 0
|
|
202
235
|
let totalSkipped = 0
|
|
203
236
|
let totalSkippedState = 0
|
|
@@ -206,7 +239,7 @@ export async function fetchTigerFull(
|
|
|
206
239
|
const failedCodes: string[] = []
|
|
207
240
|
|
|
208
241
|
// Process states in sorted FIPS order for predictable output.
|
|
209
|
-
const sortedStates = [...stateFiles.keys()].
|
|
242
|
+
const sortedStates = [...stateFiles.keys()].toSorted()
|
|
210
243
|
|
|
211
244
|
for (const stateFips of sortedStates) {
|
|
212
245
|
const countyFiles = stateFiles.get(stateFips) ?? []
|
|
@@ -215,6 +248,7 @@ export async function fetchTigerFull(
|
|
|
215
248
|
if (skipStateFips.includes(stateFips)) {
|
|
216
249
|
report?.(`--- State ${stateFips} — SKIPPED (in --skip-state-fips, ${countyFiles.length} counties)`)
|
|
217
250
|
totalSkippedState += countyFiles.length
|
|
251
|
+
|
|
218
252
|
continue
|
|
219
253
|
}
|
|
220
254
|
|
|
@@ -238,13 +272,17 @@ export async function fetchTigerFull(
|
|
|
238
272
|
// Skip if already verified via MANIFEST.
|
|
239
273
|
if (known && (await fileMatchesSha(dest, known.sha256, known.bytes))) {
|
|
240
274
|
report?.(` skip (verified) ${fname}`)
|
|
275
|
+
|
|
241
276
|
totalSkipped++
|
|
277
|
+
|
|
242
278
|
continue
|
|
243
279
|
}
|
|
244
280
|
|
|
245
281
|
if (dryRun) {
|
|
246
282
|
report?.(` would fetch: ${url}`)
|
|
283
|
+
|
|
247
284
|
totalFetched++
|
|
285
|
+
|
|
248
286
|
continue
|
|
249
287
|
}
|
|
250
288
|
|
|
@@ -253,11 +291,12 @@ export async function fetchTigerFull(
|
|
|
253
291
|
|
|
254
292
|
if (dryRun) continue
|
|
255
293
|
|
|
256
|
-
if (pending.length
|
|
294
|
+
if (!pending.length) continue
|
|
257
295
|
|
|
258
296
|
// --- Download pending files with bounded parallelism + rate-limit spacing ---
|
|
259
297
|
const results: CountyResult[] = new Array(pending.length)
|
|
260
298
|
let cursor = 0
|
|
299
|
+
|
|
261
300
|
const workers = Array.from({ length: Math.min(maxParallel, pending.length) }, async () => {
|
|
262
301
|
while (true) {
|
|
263
302
|
const i = cursor++
|
|
@@ -269,6 +308,7 @@ export async function fetchTigerFull(
|
|
|
269
308
|
results[i] = await downloadCounty(item.url, item.dest)
|
|
270
309
|
}
|
|
271
310
|
})
|
|
311
|
+
|
|
272
312
|
await Promise.all(workers)
|
|
273
313
|
|
|
274
314
|
// Collect results from this state.
|
|
@@ -276,29 +316,32 @@ export async function fetchTigerFull(
|
|
|
276
316
|
if (result.ok) {
|
|
277
317
|
report?.(` ok ${result.filename} ${humanBytes(result.bytes)} sha256=${result.sha256.slice(0, 12)}...`)
|
|
278
318
|
manifest.set(result.filename, { filename: result.filename, sha256: result.sha256, bytes: result.bytes })
|
|
319
|
+
|
|
279
320
|
totalFetched++
|
|
280
321
|
totalBytesFetched += result.bytes
|
|
281
322
|
} else {
|
|
282
323
|
report?.(` FAIL ${result.filename} -- ${result.reason}`)
|
|
324
|
+
|
|
283
325
|
totalFailed++
|
|
284
326
|
failedCodes.push(result.filename)
|
|
285
327
|
}
|
|
286
328
|
}
|
|
287
329
|
|
|
288
330
|
// Rewrite per-state MANIFEST.json with all known-good counties (sorted for determinism).
|
|
289
|
-
const counties = [...manifest.values()].
|
|
331
|
+
const counties = [...manifest.values()].toSorted((a, b) => a.filename.localeCompare(b.filename))
|
|
332
|
+
|
|
290
333
|
const manifestDoc = {
|
|
291
334
|
state_fips: stateFips,
|
|
292
335
|
updated_at: new Date().toISOString().replace(/\.\d{3}Z$/, "Z"),
|
|
293
336
|
tiger_base_url: TIGER_BASE_URL,
|
|
294
337
|
counties,
|
|
295
338
|
}
|
|
339
|
+
|
|
296
340
|
await writeManifest(manifestPath, manifestDoc)
|
|
297
341
|
}
|
|
298
342
|
|
|
299
|
-
//
|
|
300
|
-
|
|
301
|
-
// -------------------------------------------------------------------------
|
|
343
|
+
// MARK: Summary
|
|
344
|
+
|
|
302
345
|
report?.(`=== Summary ===`)
|
|
303
346
|
report?.(` Total counties in index : ${totalCounties}`)
|
|
304
347
|
report?.(` State(s) fully skipped : ${totalSkippedState} (--skip-state-fips "${skipStateFips.join(" ")}")`)
|
|
@@ -55,6 +55,11 @@ import { dataRootPath, writeJSONL } from "@mailwoman/core/utils"
|
|
|
55
55
|
|
|
56
56
|
// ── Types ─────────────────────────────────────────────────────────────────
|
|
57
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Longest raw line still plausibly a single address rather than a concatenated record.
|
|
60
|
+
*/
|
|
61
|
+
const MAX_CANDIDATE_LENGTH = 500
|
|
62
|
+
|
|
58
63
|
interface CorpusRow {
|
|
59
64
|
raw: string
|
|
60
65
|
tokens: string[]
|
|
@@ -90,21 +95,37 @@ interface GoldenCandidate {
|
|
|
90
95
|
}
|
|
91
96
|
|
|
92
97
|
export interface ExpandGoldenOptions {
|
|
93
|
-
/**
|
|
98
|
+
/**
|
|
99
|
+
* Corpus test shard path(s), comma-separated. Default: the v0.2.0 test shard under the data root.
|
|
100
|
+
*/
|
|
94
101
|
corpus?: string
|
|
95
|
-
/**
|
|
102
|
+
/**
|
|
103
|
+
* Total seeds to process. Default `100` (pilot).
|
|
104
|
+
*/
|
|
96
105
|
count?: number
|
|
97
|
-
/**
|
|
106
|
+
/**
|
|
107
|
+
* Variants requested per seed. Default `5`.
|
|
108
|
+
*/
|
|
98
109
|
variants?: number
|
|
99
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
* JSONL output path. Default `data/eval/golden/candidates/expand-<ts>.jsonl`.
|
|
112
|
+
*/
|
|
100
113
|
output?: string
|
|
101
|
-
/**
|
|
114
|
+
/**
|
|
115
|
+
* LLM provider. Default `deepseek`.
|
|
116
|
+
*/
|
|
102
117
|
provider?: "deepseek" | "anthropic"
|
|
103
|
-
/**
|
|
118
|
+
/**
|
|
119
|
+
* Model id. Default depends on provider.
|
|
120
|
+
*/
|
|
104
121
|
model?: string
|
|
105
|
-
/**
|
|
122
|
+
/**
|
|
123
|
+
* Parallel LLM calls. Default `4`.
|
|
124
|
+
*/
|
|
106
125
|
concurrency?: number
|
|
107
|
-
/**
|
|
126
|
+
/**
|
|
127
|
+
* Comma-separated source allow-list.
|
|
128
|
+
*/
|
|
108
129
|
includeSources?: string
|
|
109
130
|
}
|
|
110
131
|
|
|
@@ -127,10 +148,12 @@ function decodeComponents(tokens: string[], labels: string[]): Record<string, st
|
|
|
127
148
|
const out: Record<string, string> = {}
|
|
128
149
|
let currentTag: string | null = null
|
|
129
150
|
let currentTokens: string[] = []
|
|
151
|
+
|
|
130
152
|
const flush = () => {
|
|
131
|
-
if (currentTag && currentTokens.length
|
|
153
|
+
if (currentTag && currentTokens.length && !(currentTag in out)) {
|
|
132
154
|
out[currentTag] = currentTokens.join(" ").trim()
|
|
133
155
|
}
|
|
156
|
+
|
|
134
157
|
currentTag = null
|
|
135
158
|
currentTokens = []
|
|
136
159
|
}
|
|
@@ -141,8 +164,10 @@ function decodeComponents(tokens: string[], labels: string[]): Record<string, st
|
|
|
141
164
|
|
|
142
165
|
if (label === "O") {
|
|
143
166
|
flush()
|
|
167
|
+
|
|
144
168
|
continue
|
|
145
169
|
}
|
|
170
|
+
|
|
146
171
|
const [prefix, tag] = label.split("-", 2)
|
|
147
172
|
|
|
148
173
|
if (prefix === "B" || currentTag !== tag) {
|
|
@@ -153,6 +178,7 @@ function decodeComponents(tokens: string[], labels: string[]): Record<string, st
|
|
|
153
178
|
currentTokens.push(tok)
|
|
154
179
|
}
|
|
155
180
|
}
|
|
181
|
+
|
|
156
182
|
flush()
|
|
157
183
|
|
|
158
184
|
return out
|
|
@@ -168,6 +194,7 @@ async function loadSeeds(
|
|
|
168
194
|
.split(",")
|
|
169
195
|
.map((p) => p.trim())
|
|
170
196
|
.filter(Boolean)
|
|
197
|
+
|
|
171
198
|
report?.(`reading seeds from ${paths.length} shard(s) (target: ${count}, stratified)`)
|
|
172
199
|
|
|
173
200
|
if (includeSources) {
|
|
@@ -190,6 +217,7 @@ async function loadSeeds(
|
|
|
190
217
|
const row = (await cursor.next()) as CorpusRow | null
|
|
191
218
|
|
|
192
219
|
if (!row) break
|
|
220
|
+
|
|
193
221
|
scanned++
|
|
194
222
|
|
|
195
223
|
// Source allow-list (--include-sources) — applied early to skip parsing rows we won't use
|
|
@@ -199,8 +227,10 @@ async function loadSeeds(
|
|
|
199
227
|
// Skip rows with too few components — single-name wof-admin entries don't make useful seeds
|
|
200
228
|
if (Object.keys(components).length < 2) {
|
|
201
229
|
skippedThinComponents++
|
|
230
|
+
|
|
202
231
|
continue
|
|
203
232
|
}
|
|
233
|
+
|
|
204
234
|
const seed: Seed = {
|
|
205
235
|
raw: row.raw,
|
|
206
236
|
components,
|
|
@@ -208,6 +238,7 @@ async function loadSeeds(
|
|
|
208
238
|
source: row.source,
|
|
209
239
|
source_id: row.source_id,
|
|
210
240
|
}
|
|
241
|
+
|
|
211
242
|
let bucket = bySource.get(row.source)
|
|
212
243
|
|
|
213
244
|
if (!bucket) {
|
|
@@ -219,12 +250,14 @@ async function loadSeeds(
|
|
|
219
250
|
bucket.push(seed)
|
|
220
251
|
}
|
|
221
252
|
}
|
|
253
|
+
|
|
222
254
|
await reader.close()
|
|
223
255
|
}
|
|
224
256
|
|
|
225
257
|
report?.(
|
|
226
258
|
` scanned ${scanned} rows across ${paths.length} shard(s); thin-components dropped: ${skippedThinComponents}`
|
|
227
259
|
)
|
|
260
|
+
|
|
228
261
|
report?.(` per-source pool sizes:`)
|
|
229
262
|
|
|
230
263
|
for (const [src, pool] of bySource) {
|
|
@@ -233,7 +266,7 @@ async function loadSeeds(
|
|
|
233
266
|
|
|
234
267
|
// Round-robin sample. Each source gives floor(count / nSources) seeds; rounding goes
|
|
235
268
|
// to sources in alphabetical order. If a pool is smaller than its target, take all of it.
|
|
236
|
-
const sources = Array.from(bySource.keys()).
|
|
269
|
+
const sources = Array.from(bySource.keys()).toSorted()
|
|
237
270
|
const perSource = Math.floor(count / sources.length)
|
|
238
271
|
const remainder = count - perSource * sources.length
|
|
239
272
|
const picked: Seed[] = []
|
|
@@ -248,6 +281,7 @@ async function loadSeeds(
|
|
|
248
281
|
const k = Math.floor(Math.random() * (j + 1))
|
|
249
282
|
;[pool[j], pool[k]] = [pool[k]!, pool[j]!]
|
|
250
283
|
}
|
|
284
|
+
|
|
251
285
|
const take = Math.min(target, pool.length)
|
|
252
286
|
picked.push(...pool.slice(0, take))
|
|
253
287
|
|
|
@@ -255,6 +289,7 @@ async function loadSeeds(
|
|
|
255
289
|
report?.(` ⚠ ${src}: requested ${target}, pool had ${pool.length}`)
|
|
256
290
|
}
|
|
257
291
|
}
|
|
292
|
+
|
|
258
293
|
report?.(` → loaded ${picked.length} seeds across ${sources.length} sources`)
|
|
259
294
|
|
|
260
295
|
return picked
|
|
@@ -369,7 +404,7 @@ function makeAnthropicProvider(model: string): LlmProvider {
|
|
|
369
404
|
|
|
370
405
|
function parseCandidates(text: string): Candidate[] {
|
|
371
406
|
// Strip markdown fences the model sometimes wraps around JSON
|
|
372
|
-
const cleaned = text.
|
|
407
|
+
const cleaned = text.replaceAll(/^```(?:json)?\n?|\n?```$/g, "").trim()
|
|
373
408
|
|
|
374
409
|
try {
|
|
375
410
|
const parsed = JSON.parse(cleaned) as unknown
|
|
@@ -394,20 +429,22 @@ function parseCandidates(text: string): Candidate[] {
|
|
|
394
429
|
// ── Validator ─────────────────────────────────────────────────────────────
|
|
395
430
|
|
|
396
431
|
function normalize(s: string): string {
|
|
397
|
-
return s.toLowerCase().
|
|
432
|
+
return s.toLowerCase().replaceAll(/\s+/g, " ").trim()
|
|
398
433
|
}
|
|
399
434
|
|
|
400
|
-
|
|
435
|
+
/**
|
|
436
|
+
* Components that are NEVER allowed to be dropped — keeps degenerate single-token candidates out.
|
|
437
|
+
*/
|
|
401
438
|
const REQUIRED_COMPONENT_TAGS = new Set(["locality", "region", "street", "house_number", "venue"])
|
|
402
439
|
|
|
403
440
|
function validate(seed: Seed, candidate: Candidate): boolean {
|
|
404
441
|
if (!candidate.raw || typeof candidate.raw !== "string") return false
|
|
405
442
|
|
|
406
|
-
if (candidate.raw.length >
|
|
443
|
+
if (candidate.raw.length > MAX_CANDIDATE_LENGTH) return false
|
|
407
444
|
|
|
408
445
|
if (/```|<\/?\w+>|^\s*\{/.test(candidate.raw)) return false
|
|
409
446
|
const normRaw = normalize(candidate.raw)
|
|
410
|
-
const dropped = new Set(candidate.dropped
|
|
447
|
+
const dropped = new Set(candidate.dropped)
|
|
411
448
|
|
|
412
449
|
// LLM cannot drop required components present in the seed.
|
|
413
450
|
for (const tag of dropped) {
|
|
@@ -423,6 +460,7 @@ function validate(seed: Seed, candidate: Candidate): boolean {
|
|
|
423
460
|
if (!value) continue
|
|
424
461
|
|
|
425
462
|
if (!normRaw.includes(normalize(value))) return false
|
|
463
|
+
|
|
426
464
|
keptCount++
|
|
427
465
|
}
|
|
428
466
|
|
|
@@ -440,13 +478,14 @@ export async function expandGolden(
|
|
|
440
478
|
): Promise<ExpandGoldenSummary> {
|
|
441
479
|
const corpusPath =
|
|
442
480
|
options.corpus ?? dataRootPath("corpus", "versioned", "v0.2.0", "corpus-v0.2.0", "test", "part-0000.parquet")
|
|
481
|
+
|
|
443
482
|
const count = options.count ?? 100
|
|
444
483
|
const variants = options.variants ?? 5
|
|
445
484
|
const providerName = options.provider ?? "deepseek"
|
|
446
485
|
const model = options.model ?? (providerName === "anthropic" ? "claude-haiku-4-5-20251001" : "deepseek-chat")
|
|
447
486
|
const concurrencyLimit = options.concurrency ?? 4
|
|
448
487
|
const includeSources = options.includeSources ? new Set(options.includeSources.split(",").map((s) => s.trim())) : null
|
|
449
|
-
const ts = new Date().toISOString().
|
|
488
|
+
const ts = new Date().toISOString().replaceAll(/[:.]/g, "-").slice(0, 19)
|
|
450
489
|
const outputPath = options.output ?? `data/eval/golden/candidates/expand-${ts}.jsonl`
|
|
451
490
|
|
|
452
491
|
const provider = providerName === "anthropic" ? makeAnthropicProvider(model) : makeDeepseekProvider(model)
|
|
@@ -454,7 +493,7 @@ export async function expandGolden(
|
|
|
454
493
|
|
|
455
494
|
const seeds = await loadSeeds(corpusPath, count, includeSources, report)
|
|
456
495
|
|
|
457
|
-
if (seeds.length
|
|
496
|
+
if (!seeds.length) {
|
|
458
497
|
throw new Error("no seeds loaded — corpus path or filter is wrong")
|
|
459
498
|
}
|
|
460
499
|
|
|
@@ -466,6 +505,7 @@ export async function expandGolden(
|
|
|
466
505
|
|
|
467
506
|
// Bounded-concurrency worker pool
|
|
468
507
|
let cursor = 0
|
|
508
|
+
|
|
469
509
|
const workers = Array.from({ length: Math.min(concurrencyLimit, seeds.length) }, async () => {
|
|
470
510
|
while (true) {
|
|
471
511
|
const i = cursor++
|
|
@@ -491,17 +531,20 @@ export async function expandGolden(
|
|
|
491
531
|
|
|
492
532
|
// Remove dropped components from the components map
|
|
493
533
|
for (const tag of goldenCandidate.dropped_components) {
|
|
534
|
+
// oxlint-disable-next-line typescript/no-dynamic-delete -- removing one key from a plain record; the object is not on a hot path
|
|
494
535
|
delete goldenCandidate.components[tag]
|
|
495
536
|
}
|
|
537
|
+
|
|
496
538
|
outRows.push(goldenCandidate)
|
|
539
|
+
|
|
497
540
|
kept++
|
|
498
541
|
} else {
|
|
499
542
|
dropped++
|
|
500
543
|
}
|
|
501
544
|
}
|
|
502
|
-
} catch (
|
|
545
|
+
} catch (error) {
|
|
503
546
|
errored++
|
|
504
|
-
report?.(` ✗ seed ${seed.source_id}: ${(
|
|
547
|
+
report?.(` ✗ seed ${seed.source_id}: ${(error as Error).message}`)
|
|
505
548
|
}
|
|
506
549
|
|
|
507
550
|
if ((i + 1) % 10 === 0) {
|
|
@@ -509,6 +552,7 @@ export async function expandGolden(
|
|
|
509
552
|
}
|
|
510
553
|
}
|
|
511
554
|
})
|
|
555
|
+
|
|
512
556
|
await Promise.all(workers)
|
|
513
557
|
|
|
514
558
|
writeJSONL(outputPath, outRows)
|
|
@@ -517,7 +561,7 @@ export async function expandGolden(
|
|
|
517
561
|
report?.(`candidates kept: ${kept}`)
|
|
518
562
|
report?.(`candidates dropped (validator): ${dropped}`)
|
|
519
563
|
report?.(`seeds with errors: ${errored}`)
|
|
520
|
-
report?.(`yield: ${seeds.length
|
|
564
|
+
report?.(`yield: ${seeds.length ? ((kept / (seeds.length * variants)) * 100).toFixed(1) : "0"}%`)
|
|
521
565
|
report?.(`output: ${outputPath}`)
|
|
522
566
|
|
|
523
567
|
return { seedsProcessed: seeds.length, kept, dropped, errored, outputPath }
|