mailwoman 4.7.0 → 4.8.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/commands/geocode.d.ts.map +1 -1
- package/out/commands/geocode.js +25 -18
- package/out/commands/geocode.js.map +1 -1
- package/out/commands/reverse.d.ts.map +1 -1
- package/out/commands/reverse.js +4 -3
- package/out/commands/reverse.js.map +1 -1
- package/out/data-release.d.ts.map +1 -1
- package/out/data-release.js +6 -7
- package/out/data-release.js.map +1 -1
- package/out/geocode-core.d.ts.map +1 -1
- package/out/geocode-core.js +27 -17
- package/out/geocode-core.js.map +1 -1
- package/out/interp-calibration.d.ts.map +1 -0
- package/out/interp-calibration.js +50 -0
- package/out/interp-calibration.js.map +1 -0
- package/out/server/GeocodeRouter.d.ts.map +1 -1
- package/out/server/GeocodeRouter.js +31 -17
- package/out/server/GeocodeRouter.js.map +1 -1
- package/out/server/HealthRouter.d.ts.map +1 -1
- package/out/server/HealthRouter.js +10 -5
- package/out/server/HealthRouter.js.map +1 -1
- package/out/server/metrics.js +3 -3
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geocode.d.ts","sourceRoot":"","sources":["../../commands/geocode.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"geocode.d.ts","sourceRoot":"","sources":["../../commands/geocode.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAQH,OAAO,GAAG,MAAM,KAAK,CAAA;AAGrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAOrD,QAAA,MAAM,eAAe,6BAA4E,CAAA;AACjG,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,aAAa,IAAI,OAAO,EAAE,CAAA;AAE5D,QAAA,MAAM,aAAa;;;;;;;;;;;;qBAuDjB,CAAA;AAqHF,QAAA,MAAM,cAAc,EAAE,gBAAgB,CAAC,OAAO,aAAa,EAAE,OAAO,eAAe,CAgClF,CAAA;AAED,eAAe,cAAc,CAAA"}
|
package/out/commands/geocode.js
CHANGED
|
@@ -7,21 +7,24 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
7
7
|
* `mailwoman geocode "<address>" [flags]` — end-to-end street-level geocoder.
|
|
8
8
|
*
|
|
9
9
|
* Pipeline:
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
10
|
+
*
|
|
11
|
+
* 1. Parse the address with the neural classifier (same path as `parse` command).
|
|
12
|
+
* 2. Resolve admin hierarchy via `createWofResolver(WofSqlitePlaceLookup)`.
|
|
13
|
+
* 3. Augment with per-state address-point (situs) + interpolation shards, selected from the resolved
|
|
14
|
+
* region. Both are optional — absent shards degrade gracefully to admin-only.
|
|
15
|
+
* 4. Extract the best available coordinate + resolution tier from the resolved tree and emit a flat
|
|
16
|
+
* geocode result object.
|
|
16
17
|
*
|
|
17
18
|
* Resolution tiers (best → worst):
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
19
|
+
*
|
|
20
|
+
* - `address_point` — exact situs coordinate from the address-points shard
|
|
21
|
+
* - `interpolated` — house-number estimate from the interpolation shard
|
|
22
|
+
* - `admin` — admin centroid from the WOF gazetteer
|
|
21
23
|
*
|
|
22
24
|
* Exit-code contract:
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
+
*
|
|
26
|
+
* - 0 successful geocode (including admin-only degradation when shards are absent)
|
|
27
|
+
* - 1 bad arguments, missing required DB, or fatal parse/resolve error
|
|
25
28
|
*/
|
|
26
29
|
import { Spinner } from "@inkjs/ui";
|
|
27
30
|
import { createWofResolver } from "@mailwoman/core/resolver";
|
|
@@ -30,7 +33,8 @@ import { Text } from "ink";
|
|
|
30
33
|
import { setImmediate } from "node:timers/promises";
|
|
31
34
|
import { useEffect, useState } from "react";
|
|
32
35
|
import zod from "zod";
|
|
33
|
-
import { geocodeAddress, ShardProvider
|
|
36
|
+
import { geocodeAddress, ShardProvider } from "../geocode-core.js";
|
|
37
|
+
import { INTERP_RADIUS_CALIBRATION } from "../interp-calibration.js";
|
|
34
38
|
import { resolverDefaultCountry } from "./parse.js";
|
|
35
39
|
// ---------------------------------------------------------------------------
|
|
36
40
|
// CLI contract — args + options
|
|
@@ -73,10 +77,10 @@ const OptionsSchema = zod.object({
|
|
|
73
77
|
interpCalibration: zod
|
|
74
78
|
.number()
|
|
75
79
|
.optional()
|
|
76
|
-
.default(1.7)
|
|
77
80
|
.describe("Conformal calibration multiplier for the interpolation tier's reported uncertainty_m (#374). " +
|
|
78
|
-
"The raw half-segment radius covers only ~72% of true errors
|
|
79
|
-
"
|
|
81
|
+
"The raw half-segment radius covers only ~72% of true errors. Default (unset): the per-region " +
|
|
82
|
+
"table (#584) selects by parsed region — 1.44 (DC) … 3.12 (AZ), 1.95 for unmeasured states — " +
|
|
83
|
+
"for a ~90% bound. Pass an explicit number to force a single multiplier everywhere (1 = raw)."),
|
|
80
84
|
format: zod
|
|
81
85
|
.enum(["json", "text"])
|
|
82
86
|
.optional()
|
|
@@ -124,7 +128,9 @@ async function runGeocode(input, options) {
|
|
|
124
128
|
// Explicit --address-points-db / --interpolation-db flags override per-state selection (testing a
|
|
125
129
|
// specific file); an unset tier still falls back to the region-derived per-state shard.
|
|
126
130
|
const explicitAp = options.addressPointsDb ? new mod.AddressPointSqliteLookup(options.addressPointsDb) : undefined;
|
|
127
|
-
const explicitIp = options.interpolationDb
|
|
131
|
+
const explicitIp = options.interpolationDb
|
|
132
|
+
? new mod.StreetInterpolator({ dbPath: options.interpolationDb })
|
|
133
|
+
: undefined;
|
|
128
134
|
const shards = explicitAp || explicitIp
|
|
129
135
|
? (slug) => {
|
|
130
136
|
const base = explicitAp && explicitIp ? {} : shardProvider.for(slug);
|
|
@@ -138,7 +144,8 @@ async function runGeocode(input, options) {
|
|
|
138
144
|
resolver,
|
|
139
145
|
shards,
|
|
140
146
|
defaultCountry: resolverDefaultCountry(options) || undefined,
|
|
141
|
-
|
|
147
|
+
// Explicit --interp-calibration forces a single multiplier; unset → the per-region table (#584).
|
|
148
|
+
interpCalibration: options.interpCalibration ?? INTERP_RADIUS_CALIBRATION,
|
|
142
149
|
});
|
|
143
150
|
return options.format === "text" ? formatText(result) : JSON.stringify(result, null, 2);
|
|
144
151
|
}
|
|
@@ -195,7 +202,7 @@ const GeocodeCommand = ({ args, options }) => {
|
|
|
195
202
|
useEffect(() => {
|
|
196
203
|
const input = args[0];
|
|
197
204
|
if (!input || input.trim().length === 0) {
|
|
198
|
-
setError(
|
|
205
|
+
setError('geocode requires a positional address argument (e.g. mailwoman geocode "350 5th Ave, New York, NY")');
|
|
199
206
|
return;
|
|
200
207
|
}
|
|
201
208
|
runGeocode(input.trim(), options)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geocode.js","sourceRoot":"","sources":["../../commands/geocode.tsx"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"geocode.js","sourceRoot":"","sources":["../../commands/geocode.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reverse.d.ts","sourceRoot":"","sources":["../../commands/reverse.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"reverse.d.ts","sourceRoot":"","sources":["../../commands/reverse.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,QAAA,MAAM,eAAe,6BAEuE,CAAA;AAE5F,QAAA,MAAM,aAAa;;;;;;;qBAqBjB,CAAA;AAEF,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,aAAa,IAAI,OAAO,EAAE,CAAA;AA0E5D,QAAA,MAAM,cAAc,EAAE,gBAAgB,CAAC,OAAO,aAAa,EAAE,OAAO,eAAe,CA6ClF,CAAA;AAED,eAAe,cAAc,CAAA"}
|
package/out/commands/reverse.js
CHANGED
|
@@ -8,12 +8,13 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
8
8
|
* via the WofReverseGeocoder (#484).
|
|
9
9
|
*
|
|
10
10
|
* Falls back to the MAILWOMAN_WOF_ADMIN_DB / MAILWOMAN_WOF_POLYGONS_DB env vars when the
|
|
11
|
-
* corresponding flags are absent.
|
|
11
|
+
* corresponding flags are absent. Prints a JSON object with the resolved hierarchy and the
|
|
12
12
|
* containment kind (polygon | approximate) so callers can gauge result quality.
|
|
13
13
|
*
|
|
14
14
|
* Exit-code contract:
|
|
15
|
-
*
|
|
16
|
-
* -
|
|
15
|
+
*
|
|
16
|
+
* - 0 successful reverse-geocode (including "open ocean" empty-hierarchy)
|
|
17
|
+
* - 1 bad arguments or DB path missing / wrong
|
|
17
18
|
*/
|
|
18
19
|
import { Spinner } from "@inkjs/ui";
|
|
19
20
|
import { Text } from "ink";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reverse.js","sourceRoot":"","sources":["../../commands/reverse.tsx"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"reverse.js","sourceRoot":"","sources":["../../commands/reverse.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-release.d.ts","sourceRoot":"","sources":["../data-release.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"data-release.d.ts","sourceRoot":"","sources":["../data-release.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,iGAAiG;AACjG,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAExD,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAYhF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAClC,MAAM,GAAG,IAAI,CAQf"}
|
package/out/data-release.js
CHANGED
|
@@ -5,15 +5,14 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Versioned data-artifact addressing + atomic switchover (#485 piece 4). Shard DBs are addressed as
|
|
7
7
|
* `<family>/<family>-us-<slug>-<version>.db`, with a `releases.json` manifest at the data root
|
|
8
|
-
* pinning each family to its current version. So a new build publishes ALONGSIDE the old,
|
|
9
|
-
* the manifest (one atomic file write) cuts traffic over, and the build provenance (the
|
|
10
|
-
* travels in the filename — "what data is deployed" is a read of one JSON.
|
|
8
|
+
* pinning each family to its current version. So a new build publishes ALONGSIDE the old,
|
|
9
|
+
* flipping the manifest (one atomic file write) cuts traffic over, and the build provenance (the
|
|
10
|
+
* version) travels in the filename — "what data is deployed" is a read of one JSON.
|
|
11
11
|
*
|
|
12
12
|
* Back-compat: with no manifest (or a family unlisted) resolution falls back to the legacy
|
|
13
13
|
* unversioned `<family>-us-<slug>.db`, so the current national build output works unchanged.
|
|
14
14
|
*
|
|
15
|
-
* Example `releases.json`:
|
|
16
|
-
* { "address-points": "2026-05-20.0", "interpolation": "TIGER2023" }
|
|
15
|
+
* Example `releases.json`: { "address-points": "2026-05-20.0", "interpolation": "TIGER2023" }
|
|
17
16
|
*/
|
|
18
17
|
import { existsSync, readFileSync } from "node:fs";
|
|
19
18
|
/** Read `<dataRoot>/releases.json`. Returns null (legacy mode) when absent or malformed. */
|
|
@@ -34,8 +33,8 @@ export function readReleaseManifest(dataRoot) {
|
|
|
34
33
|
}
|
|
35
34
|
}
|
|
36
35
|
/**
|
|
37
|
-
* Resolve a shard's on-disk path: the manifest-pinned `<family>-us-<slug>-<version>.db` when
|
|
38
|
-
* else the legacy unversioned `<family>-us-<slug>.db`, else null if neither exists.
|
|
36
|
+
* Resolve a shard's on-disk path: the manifest-pinned `<family>-us-<slug>-<version>.db` when
|
|
37
|
+
* present, else the legacy unversioned `<family>-us-<slug>.db`, else null if neither exists.
|
|
39
38
|
*/
|
|
40
39
|
export function resolveShardPath(dataRoot, family, slug, manifest) {
|
|
41
40
|
const version = manifest?.[family];
|
package/out/data-release.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-release.js","sourceRoot":"","sources":["../data-release.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"data-release.js","sourceRoot":"","sources":["../data-release.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAKlD,4FAA4F;AAC5F,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IACnD,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,QAAQ,gBAAgB,EAAE,MAAM,CAAC,CAAY,CAAA;QACpF,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QAChD,MAAM,GAAG,GAAwB,EAAE,CAAA;QACnC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;YAChF,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO;gBAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAA;QAClE,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IAChD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC/B,QAAgB,EAChB,MAAc,EACd,IAAY,EACZ,QAAoC;IAEpC,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAA;IAClC,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,MAAM,IAAI,MAAM,OAAO,IAAI,IAAI,OAAO,KAAK,CAAA;QAC5E,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;IAC5C,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,QAAQ,IAAI,MAAM,IAAI,MAAM,OAAO,IAAI,KAAK,CAAA;IAC9D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geocode-core.d.ts","sourceRoot":"","sources":["../geocode-core.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"geocode-core.d.ts","sourceRoot":"","sources":["../geocode-core.ts"],"names":[],"mappings":"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"}
|
package/out/geocode-core.js
CHANGED
|
@@ -4,23 +4,26 @@
|
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
6
|
* Shared street-level geocode cascade — the reusable core behind the `geocode` CLI command AND the
|
|
7
|
-
* server's `/api/geocode` + `/api/batch` endpoints (#485). One implementation of the cascade, so
|
|
8
|
-
* CLI and the service never drift.
|
|
7
|
+
* server's `/api/geocode` + `/api/batch` endpoints (#485). One implementation of the cascade, so
|
|
8
|
+
* the CLI and the service never drift.
|
|
9
9
|
*
|
|
10
10
|
* Cascade (the eval-validated path — 98.8% within 100m on the non-circular Travis holdout):
|
|
11
|
-
* 1. RAW neural parse (`classifier.parse`, postcodeRepair). NOT the runtime pipeline — its
|
|
12
|
-
* reconcile stage merges street INTO house_number, dropping the street node the coordinate
|
|
13
|
-
* tiers need (#566).
|
|
14
|
-
* 2. Read the parsed region → pick the per-state situs + interpolation shards.
|
|
15
|
-
* 3. `resolveTree` with the coordinate tiers wired (additive; admin-only when shards absent).
|
|
16
|
-
* 4. Extract the best coordinate + resolution tier (address_point > interpolated > admin).
|
|
17
11
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
12
|
+
* 1. RAW neural parse (`classifier.parse`, postcodeRepair). NOT the runtime pipeline — its reconcile
|
|
13
|
+
* stage merges street INTO house_number, dropping the street node the coordinate tiers need
|
|
14
|
+
* (#566).
|
|
15
|
+
* 2. Read the parsed region → pick the per-state situs + interpolation shards.
|
|
16
|
+
* 3. `resolveTree` with the coordinate tiers wired (additive; admin-only when shards absent).
|
|
17
|
+
* 4. Extract the best coordinate + resolution tier (address_point > interpolated > admin).
|
|
18
|
+
*
|
|
19
|
+
* The cascade depends on a {@link ShardResolver} — a `(stateSlug) => { addressPoints?,
|
|
20
|
+
* interpolation? }` function — so the CLI (honoring its explicit `--address-points-db` flags) and
|
|
21
|
+
* the server (a cached {@link ShardProvider}) supply shards their own way without the core knowing
|
|
22
|
+
* how.
|
|
21
23
|
*/
|
|
22
24
|
import { existsSync } from "node:fs";
|
|
23
25
|
import { readReleaseManifest, resolveShardPath } from "./data-release.js";
|
|
26
|
+
import { interpCalibrationForRegion } from "./interp-calibration.js";
|
|
24
27
|
/** Lowercase 2-letter state slug from a parsed region value / resolver name, else null. */
|
|
25
28
|
export function regionToStateSlug(regionValue, resolverName) {
|
|
26
29
|
for (const candidate of [regionValue, resolverName]) {
|
|
@@ -32,7 +35,8 @@ export function regionToStateSlug(regionValue, resolverName) {
|
|
|
32
35
|
}
|
|
33
36
|
return null;
|
|
34
37
|
}
|
|
35
|
-
/** Walk a (parsed or resolved) tree for its region → the per-state shard slug (e.g. `"tx"`), else
|
|
38
|
+
/** Walk a (parsed or resolved) tree for its region → the per-state shard slug (e.g. `"tx"`), else
|
|
39
|
+
null. */
|
|
36
40
|
export function regionSlugFromTree(tree) {
|
|
37
41
|
let regionValue = null;
|
|
38
42
|
let regionResolverName = null;
|
|
@@ -47,7 +51,8 @@ export function regionSlugFromTree(tree) {
|
|
|
47
51
|
}
|
|
48
52
|
return regionToStateSlug(regionValue, regionResolverName);
|
|
49
53
|
}
|
|
50
|
-
/** Per-state situs shard path under `<dataRoot>/address-points/`, or null if the slug/file is
|
|
54
|
+
/** Per-state situs shard path under `<dataRoot>/address-points/`, or null if the slug/file is
|
|
55
|
+
absent. */
|
|
51
56
|
export function selectAddressPointsDb(dataRoot, stateSlug) {
|
|
52
57
|
if (!stateSlug)
|
|
53
58
|
return null;
|
|
@@ -138,8 +143,8 @@ export class ShardProvider {
|
|
|
138
143
|
}
|
|
139
144
|
/**
|
|
140
145
|
* Run the full street-level cascade on one address and return the structured geocode result. Always
|
|
141
|
-
* returns a result (admin tier even with no coordinate shards). Throws only on a fatal
|
|
142
|
-
* error — callers doing batch work should catch per-row.
|
|
146
|
+
* returns a result (admin tier even with no coordinate shards). Throws only on a fatal
|
|
147
|
+
* parse/resolve error — callers doing batch work should catch per-row.
|
|
143
148
|
*/
|
|
144
149
|
export async function geocodeAddress(input, deps) {
|
|
145
150
|
const tree = await deps.classifier.parse(input, { postcodeRepair: true });
|
|
@@ -152,8 +157,13 @@ export async function geocodeAddress(input, deps) {
|
|
|
152
157
|
opts.addressPoints = addressPoints;
|
|
153
158
|
if (interpolation) {
|
|
154
159
|
opts.interpolation = interpolation;
|
|
155
|
-
|
|
156
|
-
|
|
160
|
+
// Resolve to a single multiplier: a per-region table selects by the parsed region (`stateSlug`);
|
|
161
|
+
// a bare number is used as-is (legacy single-factor / explicit caller override).
|
|
162
|
+
const calibration = typeof deps.interpCalibration === "object"
|
|
163
|
+
? interpCalibrationForRegion(deps.interpCalibration, stateSlug)
|
|
164
|
+
: deps.interpCalibration;
|
|
165
|
+
if (calibration && calibration !== 1) {
|
|
166
|
+
opts.interpolationRadiusCalibration = calibration;
|
|
157
167
|
}
|
|
158
168
|
}
|
|
159
169
|
const resolved = await deps.resolver.resolveTree(tree, opts);
|
package/out/geocode-core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geocode-core.js","sourceRoot":"","sources":["../geocode-core.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"geocode-core.js","sourceRoot":"","sources":["../geocode-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAA4B,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACnG,OAAO,EAA+B,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAyDjG,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAChC,WAAsC,EACtC,YAAuC;IAEvC,KAAK,MAAM,SAAS,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,SAAS;YAAE,SAAQ;QACxB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QAChC,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC,WAAW,EAAE,CAAA;IAChE,CAAC;IACD,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;QACQ;AACR,MAAM,UAAU,kBAAkB,CAAC,IAAiB;IACnD,IAAI,WAAW,GAAkB,IAAI,CAAA;IACrC,IAAI,kBAAkB,GAAkB,IAAI,CAAA;IAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACzB,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,CAAA;YACvC,kBAAkB,GAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAwB,IAAI,IAAI,CAAA;QACtF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,iBAAiB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAA;AAC1D,CAAC;AAED;UACU;AACV,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,SAAwB;IAC/E,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAC3B,MAAM,SAAS,GAAG,GAAG,QAAQ,qCAAqC,SAAS,KAAK,CAAA;IAChF,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;AAChD,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,SAAwB;IAC/E,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAC3B,MAAM,SAAS,GAAG,GAAG,QAAQ,mCAAmC,SAAS,KAAK,CAAA;IAC9E,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;AAChD,CAAC;AAgBD;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IAChB,QAAQ,CAAoB;IAC5B,SAAS,CAAQ;IACjB,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAA;IACpD,sGAAsG;IACtG,QAAQ,GAA6B,EAAE,CAAA;IACvC,SAAS,CAA4B;IAErC,YAAY,OAA2B,EAAE,QAAgB;QACxD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,SAAiB;QACtB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAC5F,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3F,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAClF,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACxF,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAClF,CAAC;IAEQ,GAAG,GAAkB,CAAC,SAAS,EAAE,EAAE;QAC3C,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAA;QACzB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAA;IAClF,CAAC,CAAA;IAED,+FAA+F;IAC/F,QAAQ;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IACrD,CAAC;IAED;;;;;OAKG;IACH,MAAM;QACL,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,CAAC,CAAC,KAAK,EAAE,CAAA;QACxC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACpD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACvF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACtF,IAAI,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,CAAC,MAAM;gBAAE,SAAQ,CAAC,mCAAmC;YAChG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YACvC,IAAI,GAAG,CAAC,GAAG;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACxC,IAAI,GAAG,CAAC,GAAG;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACzC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;IACvB,CAAC;IAED,KAAK;QACJ,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAA;YACd,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAA;QACf,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,CAAC,CAAC,KAAK,EAAE,CAAA;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;IACnB,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa,EAAE,IAAiB;IACpE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IAEvE,MAAM,IAAI,GAAgB,EAAE,CAAA;IAC5B,IAAI,IAAI,CAAC,cAAc;QAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;IAClE,IAAI,aAAa;QAAE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACrD,IAAI,aAAa,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,iGAAiG;QACjG,iFAAiF;QACjF,MAAM,WAAW,GAChB,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ;YACzC,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC;YAC/D,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAA;QAC1B,IAAI,WAAW,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,8BAA8B,GAAG,WAAW,CAAA;QAClD,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC5D,OAAO,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,IAAiB;IACpE,MAAM,QAAQ,GAAkB,EAAE,CAAA;IAClC,MAAM,OAAO,GAAG,CAAC,KAA6B,EAAE,EAAE;QACjD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QACpB,CAAC;IACF,CAAC,CAAA;IACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAEnB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAA;IAE3D,IAAI,GAAG,GAAkB,IAAI,CAAA;IAC7B,IAAI,GAAG,GAAkB,IAAI,CAAA;IAC7B,IAAI,IAAI,GAAmB,OAAO,CAAA;IAClC,IAAI,YAAY,GAAkB,IAAI,CAAA;IAEtC,IAAI,UAAU,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,KAAK,eAAe,EAAE,CAAC;QACnE,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAA6C,CAAA;QAC3F,IAAI,EAAE,EAAE,CAAC;YACR,GAAG,GAAG,EAAE,CAAC,GAAG,CAAA;YACZ,GAAG,GAAG,EAAE,CAAC,GAAG,CAAA;YACZ,IAAI,GAAG,eAAe,CAAA;YACtB,YAAY,GAAG,CAAC,CAAA,CAAC,2CAA2C;QAC7D,CAAC;IACF,CAAC;IAED,IAAI,IAAI,KAAK,eAAe,IAAI,UAAU,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,KAAK,cAAc,EAAE,CAAC;QAC9F,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,oBAAoB,CAA6C,CAAA;QAChG,IAAI,EAAE,EAAE,CAAC;YACR,GAAG,GAAG,EAAE,CAAC,GAAG,CAAA;YACZ,GAAG,GAAG,EAAE,CAAC,GAAG,CAAA;YACZ,IAAI,GAAG,cAAc,CAAA;YACrB,YAAY,GAAI,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAwB,IAAI,IAAI,CAAA;QACpF,CAAC;IACF,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACtB,MAAM,aAAa,GAA0B,CAAC,UAAU,EAAE,oBAAoB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;QACpG,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;YAClF,IAAI,IAAI,EAAE,CAAC;gBACV,GAAG,GAAG,IAAI,CAAC,GAAI,CAAA;gBACf,GAAG,GAAG,IAAI,CAAC,GAAI,CAAA;gBACf,MAAK;YACN,CAAC;QACF,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,UAAU,IAAI,CAAC,CAAC,GAAG,KAAK,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;IACpH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;IAC9E,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;IAElF,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,oBAAoB,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC3F,MAAM,SAAS,GAAG,QAAQ;SACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;SAC7E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC7E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACZ,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;QACrB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC,CAAA;IAEJ,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;AACtH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interp-calibration.d.ts","sourceRoot":"","sources":["../interp-calibration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,sBAAsB;IACtC,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,sBAgBvC,CAAA;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGtH"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Per-region split-conformal multipliers for the interpolation tier's `uncertainty_m` radius (#374).
|
|
7
|
+
* Multiply the raw claimed radius (half the matched TIGER segment length) by the region's factor to
|
|
8
|
+
* get a calibrated ~90%-coverage interval.
|
|
9
|
+
*
|
|
10
|
+
* #569 shipped a single 1.70 measured on Texas; the multi-region recalibration (#584) found the
|
|
11
|
+
* factor is regional — Q̂ rises monotonically with rurality, 1.44 (DC, densest) → 3.12 (AZ, sprawl).
|
|
12
|
+
* This wires the per-region selection the seed table anticipated.
|
|
13
|
+
*
|
|
14
|
+
* SOURCE OF RECORD: `data/calibration/interp-radius-conformal.json` (the eval artifact + rationale,
|
|
15
|
+
* `docs/articles/evals/2026-06-14-interp-multiregion-recalibration.md`). Embedded here as a constant
|
|
16
|
+
* so the published package + the server ship it without a runtime data-file dependency. **Keep the
|
|
17
|
+
* two in sync** — when the full 50-state sweep (followups in the JSON) fills in, update both.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Measured 12-state seed table (a partial sweep; the full 50 was abandoned at the >85 °C heat ceiling).
|
|
21
|
+
* Mirrors `data/calibration/interp-radius-conformal.json` (#584).
|
|
22
|
+
*/
|
|
23
|
+
export const INTERP_RADIUS_CALIBRATION = {
|
|
24
|
+
byRegion: {
|
|
25
|
+
DC: 1.44,
|
|
26
|
+
NY: 1.53,
|
|
27
|
+
TX: 1.7,
|
|
28
|
+
AK: 1.72,
|
|
29
|
+
CA: 1.87,
|
|
30
|
+
CT: 1.91,
|
|
31
|
+
MI: 1.93,
|
|
32
|
+
AR: 2.24,
|
|
33
|
+
CO: 2.29,
|
|
34
|
+
AL: 2.79,
|
|
35
|
+
MT: 2.85,
|
|
36
|
+
AZ: 3.12,
|
|
37
|
+
},
|
|
38
|
+
default: 1.95,
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* The conformal multiplier for a parsed region. `stateSlug` is the lowercase 2-letter slug from
|
|
42
|
+
* {@link regionToStateSlug} (e.g. `"tx"`); falls back to the table's conservative `default` for an
|
|
43
|
+
* unmeasured or absent region.
|
|
44
|
+
*/
|
|
45
|
+
export function interpCalibrationForRegion(table, stateSlug) {
|
|
46
|
+
if (!stateSlug)
|
|
47
|
+
return table.default;
|
|
48
|
+
return table.byRegion[stateSlug.toUpperCase()] ?? table.default;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=interp-calibration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interp-calibration.js","sourceRoot":"","sources":["../interp-calibration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAYH;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAA2B;IAChE,QAAQ,EAAE;QACT,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,GAAG;QACP,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;KACR;IACD,OAAO,EAAE,IAAI;CACb,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAA6B,EAAE,SAAoC;IAC7G,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC,OAAO,CAAA;IACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAA;AAChE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeocodeRouter.d.ts","sourceRoot":"","sources":["../../server/GeocodeRouter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"GeocodeRouter.d.ts","sourceRoot":"","sources":["../../server/GeocodeRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAuB,MAAM,EAAE,MAAM,SAAS,CAAA;AAsOrD,eAAO,MAAM,aAAa,EAAE,MAAiB,CAAA"}
|
|
@@ -4,9 +4,11 @@
|
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
6
|
* Street-level geocoding endpoints (#485, piece 1):
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
*
|
|
8
|
+
* - `POST /api/geocode` — `{ address }` → one {@link GeocodeResult} (parse → situs → interp → admin).
|
|
9
|
+
* - `POST /api/batch` — `{ addresses: string[] }` → results in input order, BOUNDED concurrency,
|
|
10
|
+
* PER-ROW error isolation (one bad address never fails the batch — it gets an `{ error }`
|
|
11
|
+
* slot).
|
|
10
12
|
*
|
|
11
13
|
* Runs the SAME cascade as the `geocode` CLI (`mailwoman/geocode-core.ts`), so the service and the
|
|
12
14
|
* CLI never drift. Deps (classifier + resolver + a cached {@link ShardProvider}) are lazy-loaded
|
|
@@ -17,10 +19,10 @@ import { createWofResolver } from "@mailwoman/core/resolver";
|
|
|
17
19
|
import { Router } from "express";
|
|
18
20
|
import { existsSync } from "node:fs";
|
|
19
21
|
import { geocodeAddress, regionSlugFromTree, ShardProvider, } from "../geocode-core.js";
|
|
22
|
+
import { INTERP_RADIUS_CALIBRATION, interpCalibrationForRegion } from "../interp-calibration.js";
|
|
20
23
|
import { recordGeocode } from "./metrics.js";
|
|
21
24
|
/** Default per-state shard root + interp calibration — mirror the CLI defaults. */
|
|
22
25
|
const DATA_ROOT = process.env["MAILWOMAN_DATA_ROOT"] ?? "/mnt/playpen/mailwoman-data";
|
|
23
|
-
const INTERP_CALIBRATION = 1.7;
|
|
24
26
|
/** Bounded concurrency for `/api/batch`. Override with MAILWOMAN_BATCH_CONCURRENCY. */
|
|
25
27
|
const BATCH_CONCURRENCY = Math.max(1, Number(process.env["MAILWOMAN_BATCH_CONCURRENCY"] ?? "8"));
|
|
26
28
|
/** Hard cap on batch size — a guardrail against unbounded request bodies. */
|
|
@@ -28,8 +30,14 @@ const BATCH_MAX = Math.max(1, Number(process.env["MAILWOMAN_BATCH_MAX"] ?? "1000
|
|
|
28
30
|
function wofPaths() {
|
|
29
31
|
const env = process.env["MAILWOMAN_WOF_DB"];
|
|
30
32
|
if (env)
|
|
31
|
-
return env
|
|
32
|
-
|
|
33
|
+
return env
|
|
34
|
+
.split(",")
|
|
35
|
+
.map((p) => p.trim())
|
|
36
|
+
.filter(Boolean);
|
|
37
|
+
return [
|
|
38
|
+
"/mnt/playpen/mailwoman-data/wof/admin-global-priority.db",
|
|
39
|
+
"/mnt/playpen/mailwoman-data/wof/postalcode-us.db",
|
|
40
|
+
].filter((p) => existsSync(p));
|
|
33
41
|
}
|
|
34
42
|
let depsPromise = null;
|
|
35
43
|
async function getDeps() {
|
|
@@ -65,7 +73,7 @@ function oneGeocode(deps, address) {
|
|
|
65
73
|
resolver: deps.resolver,
|
|
66
74
|
shards: deps.shards.for,
|
|
67
75
|
defaultCountry: deps.defaultCountry,
|
|
68
|
-
interpCalibration:
|
|
76
|
+
interpCalibration: INTERP_RADIUS_CALIBRATION,
|
|
69
77
|
});
|
|
70
78
|
}
|
|
71
79
|
const DEPS_UNAVAILABLE = {
|
|
@@ -136,10 +144,10 @@ const batchHandler = async (req, res) => {
|
|
|
136
144
|
res.status(200).json({ results });
|
|
137
145
|
};
|
|
138
146
|
/**
|
|
139
|
-
* `POST /api/resolve-tree` — the resolver-service endpoint that `RemoteResolver` (core) calls.
|
|
140
|
-
* an already-parsed `{ tree, opts? }`, selects this region's situs/interpolation shards
|
|
141
|
-
* here, not on the caller), runs the FULL cascade, and returns `{ tree }`. This is
|
|
142
|
-
* stateless parser node geocode at street level against a shared resolver service.
|
|
147
|
+
* `POST /api/resolve-tree` — the resolver-service endpoint that `RemoteResolver` (core) calls.
|
|
148
|
+
* Accepts an already-parsed `{ tree, opts? }`, selects this region's situs/interpolation shards
|
|
149
|
+
* (the data lives here, not on the caller), runs the FULL cascade, and returns `{ tree }`. This is
|
|
150
|
+
* what lets a stateless parser node geocode at street level against a shared resolver service.
|
|
143
151
|
*/
|
|
144
152
|
const resolveTreeHandler = async (req, res) => {
|
|
145
153
|
const tree = req.body?.tree;
|
|
@@ -155,13 +163,18 @@ const resolveTreeHandler = async (req, res) => {
|
|
|
155
163
|
}
|
|
156
164
|
const t0 = performance.now();
|
|
157
165
|
try {
|
|
158
|
-
const
|
|
166
|
+
const slug = regionSlugFromTree(tree);
|
|
167
|
+
const { addressPoints, interpolation } = deps.shards.for(slug);
|
|
159
168
|
const opts = {
|
|
160
169
|
...incomingOpts,
|
|
161
170
|
defaultCountry: incomingOpts.defaultCountry ?? deps.defaultCountry,
|
|
162
171
|
...(addressPoints ? { addressPoints } : {}),
|
|
163
172
|
...(interpolation
|
|
164
|
-
? {
|
|
173
|
+
? {
|
|
174
|
+
interpolation,
|
|
175
|
+
interpolationRadiusCalibration: incomingOpts.interpolationRadiusCalibration ??
|
|
176
|
+
interpCalibrationForRegion(INTERP_RADIUS_CALIBRATION, slug),
|
|
177
|
+
}
|
|
165
178
|
: {}),
|
|
166
179
|
};
|
|
167
180
|
const resolved = await deps.resolver.resolveTree(tree, opts);
|
|
@@ -188,10 +201,11 @@ function collectStreetTier(node) {
|
|
|
188
201
|
return out;
|
|
189
202
|
}
|
|
190
203
|
/**
|
|
191
|
-
* `POST /api/reload` — versioned data switchover (#485). Re-reads `releases.json` and atomically
|
|
192
|
-
* any per-state shard whose pinned version changed (zero-downtime, one-generation grace on
|
|
193
|
-
* handles). Call this after publishing a new shard build to cut traffic over without a
|
|
194
|
-
* the new version map. (Deploy-only; gate it behind your ingress — no auth here by
|
|
204
|
+
* `POST /api/reload` — versioned data switchover (#485). Re-reads `releases.json` and atomically
|
|
205
|
+
* swaps any per-state shard whose pinned version changed (zero-downtime, one-generation grace on
|
|
206
|
+
* the old handles). Call this after publishing a new shard build to cut traffic over without a
|
|
207
|
+
* restart. Returns the new version map. (Deploy-only; gate it behind your ingress — no auth here by
|
|
208
|
+
* design, per #485.)
|
|
195
209
|
*/
|
|
196
210
|
const reloadHandler = async (_req, res) => {
|
|
197
211
|
const deps = await getDeps();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeocodeRouter.js","sourceRoot":"","sources":["../../server/GeocodeRouter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"GeocodeRouter.js","sourceRoot":"","sources":["../../server/GeocodeRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HealthRouter.d.ts","sourceRoot":"","sources":["../../server/HealthRouter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"HealthRouter.d.ts","sourceRoot":"","sources":["../../server/HealthRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAuB,MAAM,EAAE,MAAM,SAAS,CAAA;AAgFrD,eAAO,MAAM,YAAY,EAAE,MAAiB,CAAA"}
|
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
6
|
* Operational endpoints (#485 observability):
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
*
|
|
8
|
+
* - `GET /health` — "what's deployed, in one curl": model-card name/version/locale + which WOF
|
|
9
|
+
* gazetteer and how many per-state situs/interpolation shards are on disk. LIGHTWEIGHT —
|
|
10
|
+
* reads JSON + counts files, never loads the model, never throws (health must answer even
|
|
11
|
+
* when broken).
|
|
12
|
+
* - `GET /metrics` — the live geocode metrics snapshot (latency percentiles + per-tier counts).
|
|
11
13
|
*/
|
|
12
14
|
import { Router } from "express";
|
|
13
15
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
@@ -52,7 +54,10 @@ function countShards(subdir, prefix) {
|
|
|
52
54
|
function wofPaths() {
|
|
53
55
|
const env = process.env["MAILWOMAN_WOF_DB"];
|
|
54
56
|
const paths = env
|
|
55
|
-
? env
|
|
57
|
+
? env
|
|
58
|
+
.split(",")
|
|
59
|
+
.map((p) => p.trim())
|
|
60
|
+
.filter(Boolean)
|
|
56
61
|
: ["/mnt/playpen/mailwoman-data/wof/admin-global-priority.db", "/mnt/playpen/mailwoman-data/wof/postalcode-us.db"];
|
|
57
62
|
return paths.filter((p) => existsSync(p));
|
|
58
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HealthRouter.js","sourceRoot":"","sources":["../../server/HealthRouter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"HealthRouter.js","sourceRoot":"","sources":["../../server/HealthRouter.ts"],"names":[],"mappings":"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"}
|
package/out/server/metrics.js
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
*
|
|
6
6
|
* In-process geocode metrics (#485 observability). Dependency-free: monotonic counters per
|
|
7
7
|
* resolution tier + a bounded reservoir of recent latencies for percentile estimation. The issue
|
|
8
|
-
* asks to MEASURE the SLO targets (p99 ≤ 100ms admin, ≤ 250ms with situs) rather than invent them
|
|
9
|
-
* this is the instrument. Surfaced by `GET /metrics`; reset on process restart (no persistence
|
|
10
|
-
* scrape it).
|
|
8
|
+
* asks to MEASURE the SLO targets (p99 ≤ 100ms admin, ≤ 250ms with situs) rather than invent them
|
|
9
|
+
* — this is the instrument. Surfaced by `GET /metrics`; reset on process restart (no persistence
|
|
10
|
+
* — scrape it).
|
|
11
11
|
*/
|
|
12
12
|
/** Recent-latency reservoir size. ~2k samples gives stable p99 without unbounded memory. */
|
|
13
13
|
const MAX_SAMPLES = 2048;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mailwoman",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.8.0",
|
|
4
4
|
"description": "Utilities for working with contacts for email, phone, and postal addresses.",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"contributors": [
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@fragaria/address-formatter": "^6.7.1",
|
|
35
35
|
"@inkjs/ui": "^2.0.0",
|
|
36
|
-
"@mailwoman/classifiers": "4.
|
|
37
|
-
"@mailwoman/core": "4.
|
|
38
|
-
"@mailwoman/kind-classifier": "4.
|
|
39
|
-
"@mailwoman/locale-gate": "4.
|
|
40
|
-
"@mailwoman/normalize": "4.
|
|
41
|
-
"@mailwoman/phrase-grouper": "4.
|
|
42
|
-
"@mailwoman/query-shape": "4.
|
|
36
|
+
"@mailwoman/classifiers": "4.8.0",
|
|
37
|
+
"@mailwoman/core": "4.8.0",
|
|
38
|
+
"@mailwoman/kind-classifier": "4.8.0",
|
|
39
|
+
"@mailwoman/locale-gate": "4.8.0",
|
|
40
|
+
"@mailwoman/normalize": "4.8.0",
|
|
41
|
+
"@mailwoman/phrase-grouper": "4.8.0",
|
|
42
|
+
"@mailwoman/query-shape": "4.8.0",
|
|
43
43
|
"change-case": "^5.4.4",
|
|
44
44
|
"express": "^5.2.1",
|
|
45
45
|
"geojson": "^0.5.0",
|