@mailwoman/core 2.1.0 → 2.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.
Files changed (168) hide show
  1. package/out/api/APIClient.d.ts +57 -0
  2. package/out/api/APIClient.d.ts.map +1 -0
  3. package/out/api/APIClient.js +108 -0
  4. package/out/api/APIClient.js.map +1 -0
  5. package/out/api/headless.d.ts +17 -0
  6. package/out/api/headless.d.ts.map +1 -0
  7. package/out/api/headless.js +18 -0
  8. package/out/api/headless.js.map +1 -0
  9. package/out/api/index.d.ts +11 -0
  10. package/out/api/index.d.ts.map +1 -0
  11. package/out/api/index.js +11 -0
  12. package/out/api/index.js.map +1 -0
  13. package/out/api/responses.d.ts +48 -0
  14. package/out/api/responses.d.ts.map +1 -0
  15. package/out/api/responses.js +68 -0
  16. package/out/api/responses.js.map +1 -0
  17. package/out/collections.d.ts +66 -0
  18. package/out/collections.d.ts.map +1 -0
  19. package/out/collections.js +97 -0
  20. package/out/collections.js.map +1 -0
  21. package/out/db/schema.d.ts +21 -0
  22. package/out/db/schema.d.ts.map +1 -0
  23. package/out/db/schema.js +16 -0
  24. package/out/db/schema.js.map +1 -0
  25. package/out/decoder/build-tree.d.ts +14 -1
  26. package/out/decoder/build-tree.d.ts.map +1 -1
  27. package/out/decoder/build-tree.js +37 -9
  28. package/out/decoder/build-tree.js.map +1 -1
  29. package/out/decoder/proposals-to-tree.d.ts.map +1 -1
  30. package/out/decoder/proposals-to-tree.js +2 -0
  31. package/out/decoder/proposals-to-tree.js.map +1 -1
  32. package/out/decoder/serialize-xml.d.ts +22 -1
  33. package/out/decoder/serialize-xml.d.ts.map +1 -1
  34. package/out/decoder/serialize-xml.js +64 -4
  35. package/out/decoder/serialize-xml.js.map +1 -1
  36. package/out/decoder/types.d.ts +45 -0
  37. package/out/decoder/types.d.ts.map +1 -1
  38. package/out/decoder/types.js +6 -0
  39. package/out/decoder/types.js.map +1 -1
  40. package/out/errors/index.d.ts +9 -0
  41. package/out/errors/index.d.ts.map +1 -0
  42. package/out/errors/index.js +9 -0
  43. package/out/errors/index.js.map +1 -0
  44. package/out/errors/schema.d.ts +69 -0
  45. package/out/errors/schema.d.ts.map +1 -0
  46. package/out/errors/schema.js +102 -0
  47. package/out/errors/schema.js.map +1 -0
  48. package/out/identifiers.d.ts +18 -0
  49. package/out/identifiers.d.ts.map +1 -0
  50. package/out/identifiers.js +49 -0
  51. package/out/identifiers.js.map +1 -0
  52. package/out/index.d.ts +3 -0
  53. package/out/index.d.ts.map +1 -1
  54. package/out/index.js +3 -4
  55. package/out/index.js.map +1 -1
  56. package/out/kysley/adapter.d.ts +13 -0
  57. package/out/kysley/adapter.d.ts.map +1 -0
  58. package/out/kysley/adapter.js +25 -0
  59. package/out/kysley/adapter.js.map +1 -0
  60. package/out/kysley/client.d.ts +16 -0
  61. package/out/kysley/client.d.ts.map +1 -0
  62. package/out/kysley/client.js +22 -0
  63. package/out/kysley/client.js.map +1 -0
  64. package/out/kysley/dialect-config.d.ts +27 -0
  65. package/out/kysley/dialect-config.d.ts.map +1 -0
  66. package/out/kysley/dialect-config.js +7 -0
  67. package/out/kysley/dialect-config.js.map +1 -0
  68. package/out/kysley/dialect.d.ts +39 -0
  69. package/out/kysley/dialect.d.ts.map +1 -0
  70. package/out/kysley/dialect.js +49 -0
  71. package/out/kysley/dialect.js.map +1 -0
  72. package/out/kysley/driver.d.ts +22 -0
  73. package/out/kysley/driver.d.ts.map +1 -0
  74. package/out/kysley/driver.js +114 -0
  75. package/out/kysley/driver.js.map +1 -0
  76. package/out/lifecycle/ServiceSymbol.d.ts +59 -0
  77. package/out/lifecycle/ServiceSymbol.d.ts.map +1 -0
  78. package/out/lifecycle/ServiceSymbol.js +62 -0
  79. package/out/lifecycle/ServiceSymbol.js.map +1 -0
  80. package/out/lifecycle/index.d.ts +11 -0
  81. package/out/lifecycle/index.d.ts.map +1 -0
  82. package/out/lifecycle/index.js +11 -0
  83. package/out/lifecycle/index.js.map +1 -0
  84. package/out/lifecycle/lru-cache.d.ts +22 -0
  85. package/out/lifecycle/lru-cache.d.ts.map +1 -0
  86. package/out/lifecycle/lru-cache.js +31 -0
  87. package/out/lifecycle/lru-cache.js.map +1 -0
  88. package/out/lifecycle/services.d.ts +145 -0
  89. package/out/lifecycle/services.d.ts.map +1 -0
  90. package/out/lifecycle/services.js +190 -0
  91. package/out/lifecycle/services.js.map +1 -0
  92. package/out/logging/index.d.ts +7 -0
  93. package/out/logging/index.d.ts.map +1 -0
  94. package/out/logging/index.js +7 -0
  95. package/out/logging/index.js.map +1 -0
  96. package/out/logging/shared.d.ts +60 -0
  97. package/out/logging/shared.d.ts.map +1 -0
  98. package/out/logging/shared.js +100 -0
  99. package/out/logging/shared.js.map +1 -0
  100. package/out/logging/tables.d.ts +7 -0
  101. package/out/logging/tables.d.ts.map +1 -0
  102. package/out/logging/tables.js +75 -0
  103. package/out/logging/tables.js.map +1 -0
  104. package/out/objects.d.ts +96 -0
  105. package/out/objects.d.ts.map +1 -0
  106. package/out/objects.js +96 -0
  107. package/out/objects.js.map +1 -0
  108. package/out/parser/proposal-pipeline.d.ts.map +1 -1
  109. package/out/parser/proposal-pipeline.js +0 -1
  110. package/out/parser/proposal-pipeline.js.map +1 -1
  111. package/out/pipeline/index.d.ts +14 -0
  112. package/out/pipeline/index.d.ts.map +1 -0
  113. package/out/pipeline/index.js +11 -0
  114. package/out/pipeline/index.js.map +1 -0
  115. package/out/pipeline/reconcile.d.ts +135 -0
  116. package/out/pipeline/reconcile.d.ts.map +1 -0
  117. package/out/pipeline/reconcile.js +355 -0
  118. package/out/pipeline/reconcile.js.map +1 -0
  119. package/out/pipeline/runtime-pipeline.d.ts +29 -0
  120. package/out/pipeline/runtime-pipeline.d.ts.map +1 -0
  121. package/out/pipeline/runtime-pipeline.js +288 -0
  122. package/out/pipeline/runtime-pipeline.js.map +1 -0
  123. package/out/pipeline/span-logit-aggregation.d.ts +57 -0
  124. package/out/pipeline/span-logit-aggregation.d.ts.map +1 -0
  125. package/out/pipeline/span-logit-aggregation.js +105 -0
  126. package/out/pipeline/span-logit-aggregation.js.map +1 -0
  127. package/out/pipeline/types.d.ts +189 -0
  128. package/out/pipeline/types.d.ts.map +1 -0
  129. package/out/pipeline/types.js +16 -0
  130. package/out/pipeline/types.js.map +1 -0
  131. package/out/resolver/index.d.ts +9 -0
  132. package/out/resolver/index.d.ts.map +1 -0
  133. package/out/resolver/index.js +8 -0
  134. package/out/resolver/index.js.map +1 -0
  135. package/out/resolver/resolve.d.ts +21 -0
  136. package/out/resolver/resolve.d.ts.map +1 -0
  137. package/out/resolver/resolve.js +118 -0
  138. package/out/resolver/resolve.js.map +1 -0
  139. package/out/resolver/types.d.ts +118 -0
  140. package/out/resolver/types.d.ts.map +1 -0
  141. package/out/resolver/types.js +24 -0
  142. package/out/resolver/types.js.map +1 -0
  143. package/out/resources/git.d.ts +1 -1
  144. package/out/resources/index.d.ts +0 -1
  145. package/out/resources/index.d.ts.map +1 -1
  146. package/out/resources/index.js +0 -1
  147. package/out/resources/index.js.map +1 -1
  148. package/out/resources/whosonfirst/DataSourceCache.d.ts +0 -1
  149. package/out/resources/whosonfirst/DataSourceCache.d.ts.map +1 -1
  150. package/out/resources/whosonfirst/DataSourceCache.js +0 -1
  151. package/out/resources/whosonfirst/DataSourceCache.js.map +1 -1
  152. package/out/resources/whosonfirst/PlacetypeDataSource.d.ts +2 -2
  153. package/out/resources/whosonfirst/PlacetypeDataSource.d.ts.map +1 -1
  154. package/out/resources/whosonfirst/PlacetypeDataSource.js +9 -6
  155. package/out/resources/whosonfirst/PlacetypeDataSource.js.map +1 -1
  156. package/out/routing/index.d.ts +67 -0
  157. package/out/routing/index.d.ts.map +1 -0
  158. package/out/routing/index.js +114 -0
  159. package/out/routing/index.js.map +1 -0
  160. package/out/sets.d.ts +2 -0
  161. package/out/sets.d.ts.map +1 -0
  162. package/out/sets.js +2 -0
  163. package/out/sets.js.map +1 -0
  164. package/package.json +28 -2
  165. package/out/resources/db/index.d.ts +0 -57
  166. package/out/resources/db/index.d.ts.map +0 -1
  167. package/out/resources/db/index.js +0 -57
  168. package/out/resources/db/index.js.map +0 -1
@@ -0,0 +1,355 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * `reconcileSpans` — Stage 5 joint-decoding path.
7
+ *
8
+ * Today's runtime Stage 5 (in `runtime-pipeline.ts`) just keeps the classifier-emitted spans in
9
+ * start order. That fallback covers callers who don't yet have top-k inputs from Stages 2.7 / 3 /
10
+ * 6. This file is the **opt-in** joint-decoding path that turns Stage 5 from a sort into a
11
+ * reconciler: pick the parse tree that maximizes
12
+ *
13
+ * ```
14
+ * ∏ phrase_grouper_confidence
15
+ * × classifier_confidence
16
+ * × resolver_score
17
+ * × concordance_bonus(parent_id chain)
18
+ * ```
19
+ *
20
+ * Closes the kryptonite catalogue (`NY-NY Steakhouse, Houston, TX`, `Paris, Texas`, `Saint
21
+ * Petersburg, FL`, `Buffalo Buffalo`) where today's argmax-per-stage produces internally-
22
+ * inconsistent parses that the layer above can't repair.
23
+ *
24
+ * The implementation is a beam search over candidate slots — each slot is one `(phrase_span,
25
+ * classifier_tag, resolver_place)` triple. Three knobs prune the cross product: `kSpan` (de-duped
26
+ * phrase span proposals), `kTag` (classifier tag interpretations per span), and `kResolver`
27
+ * (resolver candidates per `(span, tag)`). Concordance scoring is incremental — when a slot is
28
+ * added, we check the new place's `parent_id` chain against the running admin assignment and
29
+ * adjust the running score before pruning.
30
+ *
31
+ * The Thread C-s classifier top-k contract is mocked locally for v0.5.0 (see `ClassifierCandidate`
32
+ * below). The real classifier output adapter ships with `@mailwoman/neural` once Thread C-s
33
+ * lands; the existing `ResolvedPlace` shape from `@mailwoman/core/resolver` is what backs the
34
+ * resolver-candidates axis (parent_id chains live there).
35
+ *
36
+ * See `docs/articles/plan/phases/PHASE_8_v0_5_0_fresh_slate.md` § D for the v0.5.0 context and
37
+ * `docs/articles/concepts/the-knowledge-ladder.md` § Reconcile for the design rationale.
38
+ */
39
+ const DEFAULTS = {
40
+ kSpan: 3,
41
+ kTag: 3,
42
+ kResolver: 5,
43
+ concordanceWeight: 1.0,
44
+ beamWidth: 16,
45
+ runnersUp: 3,
46
+ };
47
+ /**
48
+ * Log-space bonus per accepted slot. Counterweight for the multiplicative penalty inherent in
49
+ * "score = ∏ confidences": each factor in [0, 1] strictly lowers the running score, which would
50
+ * otherwise make the empty parse always win. log(2.5) — a slot whose product of factors exceeds
51
+ * 1/2.5 = 0.4 is worth including; below that, the search prefers to skip.
52
+ *
53
+ * The choice of 2.5 is a tuning constant, not a free parameter we expose — exposing it would invite
54
+ * callers to disable inclusion entirely (defeating the purpose of the reconciler) and the sensible
55
+ * range is narrow. Lives here rather than `ReconcileOpts` for that reason.
56
+ */
57
+ const INCLUSION_LOG_BONUS = Math.log(2.5);
58
+ /**
59
+ * Admin levels from coarse to fine. Concordance scoring walks pairs (parent_level, child_level) and
60
+ * checks the child's parent_id chain for the parent's place id.
61
+ */
62
+ const ADMIN_LEVELS = ["country", "region", "locality", "dependent_locality"];
63
+ const ADMIN_LEVEL_SET = new Set(ADMIN_LEVELS);
64
+ /**
65
+ * Joint-decode the best parse tree from Stage 2.7 phrase proposals, Stage 3 classifier top-k, and
66
+ * Stage 6 resolver candidates. See file header for the scoring formula.
67
+ *
68
+ * The result tree's roots are the winning `(span, tag, place)` triples in source order. Each node's
69
+ * `placeId`, `lat`, `lon` come from the chosen resolver candidate; `confidence` reflects the per-
70
+ * factor score for that slot. `runnersUp` are the next-best parses for caller inspection.
71
+ *
72
+ * Empty `classifierTopK` short-circuits to an empty tree at confidence 0 — no joint decode is
73
+ * possible without tag interpretations. Callers without top-k should use the runtime-pipeline
74
+ * fallback (which keeps classifier-emitted spans sorted by start).
75
+ */
76
+ export function reconcileSpans(inputs) {
77
+ const opts = { ...DEFAULTS, ...inputs.opts };
78
+ const slots = buildSlots(inputs, opts);
79
+ if (slots.length === 0) {
80
+ return emptyParseTree(inputs.raw);
81
+ }
82
+ // Beam search over left-to-right slot inclusion. Each slot is either accepted (if non-
83
+ // overlapping with the beam's claimed range) or skipped. Beam pruning keeps the top
84
+ // `beamWidth` by running log-score.
85
+ const slotsByStart = slots.slice().sort((a, b) => a.span.start - b.span.start);
86
+ let beams = [{ assignments: [], logScore: 0, lastEnd: -1 }];
87
+ for (const slot of slotsByStart) {
88
+ const next = [];
89
+ for (const beam of beams) {
90
+ next.push(beam);
91
+ if (slot.span.start >= beam.lastEnd) {
92
+ const concordanceDelta = concordanceDeltaFor(beam.assignments, slot, inputs, opts);
93
+ if (concordanceDelta === Number.NEGATIVE_INFINITY)
94
+ continue;
95
+ const slotLog = logSafe(slot.phraseConf) +
96
+ logSafe(slot.classifierScore) +
97
+ logSafe(slot.resolverScore) +
98
+ concordanceDelta +
99
+ INCLUSION_LOG_BONUS;
100
+ next.push({
101
+ assignments: [...beam.assignments, slot],
102
+ logScore: beam.logScore + slotLog,
103
+ lastEnd: slot.span.end,
104
+ });
105
+ }
106
+ }
107
+ next.sort((a, b) => b.logScore - a.logScore);
108
+ beams = next.slice(0, opts.beamWidth);
109
+ }
110
+ beams.sort((a, b) => b.logScore - a.logScore);
111
+ // Drop the empty beam if there's at least one non-empty competitor (the empty beam scores 0,
112
+ // which would otherwise dominate when all real candidates have very low log-scores).
113
+ const populated = beams.filter((b) => b.assignments.length > 0);
114
+ const ordered = populated.length > 0 ? populated : beams;
115
+ const top = ordered[0];
116
+ const runners = ordered.slice(1, 1 + opts.runnersUp);
117
+ const trees = ordered.map((b) => buildTree(b, inputs.raw));
118
+ const confidences = softmax(ordered.map((b) => b.logScore));
119
+ return {
120
+ tree: trees[0],
121
+ confidence: confidences[0],
122
+ runnersUp: runners.map((_, i) => trees[i + 1]),
123
+ scoreBreakdown: breakdownFor(top, inputs, opts),
124
+ };
125
+ }
126
+ /**
127
+ * Build the candidate slot set: dedupe phrase proposals by (start, end), join with classifier top-k
128
+ * tag candidates, join with resolver places per (span, tag).
129
+ *
130
+ * Spans with no classifier candidate are dropped — the reconciler cannot tag them. Spans with no
131
+ * resolver candidate still survive; the resolver score defaults to 1 (neutral) and the slot's place
132
+ * is null (won't contribute to concordance).
133
+ */
134
+ function buildSlots(inputs, opts) {
135
+ const bySpanKey = new Map();
136
+ for (const p of inputs.phraseProposals) {
137
+ const k = spanKey(p.span.start, p.span.end);
138
+ const cur = bySpanKey.get(k);
139
+ if (!cur || p.confidence > cur.confidence) {
140
+ bySpanKey.set(k, p);
141
+ }
142
+ }
143
+ // `kSpan` limits the number of overlapping proposals anchored at each start position — NOT a
144
+ // global cap on phrase proposals. Two phrases at different starts (e.g. `Houston` at 18 +
145
+ // `TX` at 27) are independent candidates and both must survive `kSpan = 3`. Without this per-
146
+ // start grouping, a low-confidence-but-correct proposal (e.g. `Houston` @ 0.65) is dropped
147
+ // just because the input has many higher-confidence proposals elsewhere.
148
+ const byStart = new Map();
149
+ for (const p of bySpanKey.values()) {
150
+ const arr = byStart.get(p.span.start) ?? [];
151
+ arr.push(p);
152
+ byStart.set(p.span.start, arr);
153
+ }
154
+ const spans = [];
155
+ for (const arr of byStart.values()) {
156
+ spans.push(...topN(arr, opts.kSpan, (p) => p.confidence));
157
+ }
158
+ const tagsBySpan = new Map();
159
+ for (const c of inputs.classifierTopK) {
160
+ const k = spanKey(c.span.start, c.span.end);
161
+ const arr = tagsBySpan.get(k) ?? [];
162
+ arr.push(c);
163
+ tagsBySpan.set(k, arr);
164
+ }
165
+ const slots = [];
166
+ for (const phrase of spans) {
167
+ const key = spanKey(phrase.span.start, phrase.span.end);
168
+ const tagCandidates = topN(tagsBySpan.get(key) ?? [], opts.kTag, (c) => c.score);
169
+ for (const tagC of tagCandidates) {
170
+ const places = inputs.resolverCandidates
171
+ ? inputs.resolverCandidates.candidatesFor(tagC.span, tagC.tag).slice(0, opts.kResolver)
172
+ : [];
173
+ if (places.length === 0) {
174
+ slots.push({
175
+ span: phrase.span,
176
+ phraseConf: phrase.confidence,
177
+ tag: tagC.tag,
178
+ classifierScore: tagC.score,
179
+ place: null,
180
+ resolverScore: 1,
181
+ });
182
+ continue;
183
+ }
184
+ for (const place of places) {
185
+ slots.push({
186
+ span: phrase.span,
187
+ phraseConf: phrase.confidence,
188
+ tag: tagC.tag,
189
+ classifierScore: tagC.score,
190
+ place,
191
+ resolverScore: normalizeResolverScore(place.score),
192
+ });
193
+ }
194
+ }
195
+ }
196
+ return slots;
197
+ }
198
+ /**
199
+ * Concordance delta for adding `slot` to an existing beam. Returns the log-space contribution to
200
+ * add to the beam's running score, or `-Infinity` if the slot introduces a hard contradiction
201
+ * (would be admissible into the beam's admin chain but explicitly disagrees).
202
+ *
203
+ * Behavior at the boundaries:
204
+ *
205
+ * - Slot has no place or is non-admin → 0 (no chain contribution).
206
+ * - No admin neighbors yet → 0 (nothing to agree with).
207
+ * - Admin chain agrees → `+ concordanceWeight × log(1 + match_ratio)`.
208
+ * - Some admin pairs cannot be verified (missing parents) → 0 contribution per neutral pair.
209
+ * - Admin chain has any explicit contradiction → `-Infinity` (hard veto).
210
+ */
211
+ function concordanceDeltaFor(existing, candidate, inputs, opts) {
212
+ if (!candidate.place || !ADMIN_LEVEL_SET.has(candidate.tag))
213
+ return 0;
214
+ const chainOf = inputs.parentChain;
215
+ if (!chainOf)
216
+ return 0;
217
+ const candIdx = ADMIN_LEVELS.indexOf(candidate.tag);
218
+ let matches = 0;
219
+ let neutrals = 0;
220
+ let pairs = 0;
221
+ for (const prior of existing) {
222
+ if (!prior.place || !ADMIN_LEVEL_SET.has(prior.tag))
223
+ continue;
224
+ const priorIdx = ADMIN_LEVELS.indexOf(prior.tag);
225
+ const child = priorIdx > candIdx ? prior : candidate;
226
+ const parent = priorIdx > candIdx ? candidate : prior;
227
+ if (child === parent)
228
+ continue;
229
+ const chain = chainOf.parentsOf(child.place);
230
+ pairs++;
231
+ if (chain.length === 0) {
232
+ neutrals++;
233
+ continue;
234
+ }
235
+ const hit = chain.some((p) => idsEqual(p.id, parent.place.id));
236
+ if (hit) {
237
+ matches++;
238
+ }
239
+ else {
240
+ return Number.NEGATIVE_INFINITY;
241
+ }
242
+ }
243
+ if (pairs === 0)
244
+ return 0;
245
+ const matchRatio = matches / pairs;
246
+ // Linear in matchRatio so a fully-consistent chain contributes exactly `+concordanceWeight`
247
+ // log-space — the briefing's "+1 for fully consistent" reading. Matches contribute
248
+ // proportionally; neutrals (no chain data) don't penalize.
249
+ return opts.concordanceWeight * matchRatio;
250
+ }
251
+ function idsEqual(a, b) {
252
+ return String(a) === String(b);
253
+ }
254
+ /**
255
+ * Compute the per-factor breakdown for the winning beam. Independently of the search's `logScore`
256
+ * (which carries the inclusion-bonus prior), the breakdown surfaces the bare `phrase × classifier ×
257
+ * resolver × concordance` product so callers can introspect why a tree won.
258
+ */
259
+ function breakdownFor(beam, inputs, opts) {
260
+ let phrase = 1;
261
+ let classifier = 1;
262
+ let resolver = 1;
263
+ for (const a of beam.assignments) {
264
+ phrase *= Math.max(a.phraseConf, 0);
265
+ classifier *= Math.max(a.classifierScore, 0);
266
+ resolver *= Math.max(a.resolverScore, 0);
267
+ }
268
+ const concordanceLog = totalConcordanceLog(beam.assignments, inputs, opts);
269
+ const concordance = Math.exp(concordanceLog);
270
+ const total = phrase * classifier * resolver * concordance;
271
+ return { phrase, classifier, resolver, concordance, total };
272
+ }
273
+ /**
274
+ * Recompute the joint concordance contribution for the entire assignment list (vs the incremental
275
+ * `concordanceDeltaFor` used during search). Used by the breakdown.
276
+ */
277
+ function totalConcordanceLog(assignments, inputs, opts) {
278
+ if (!inputs.parentChain)
279
+ return 0;
280
+ let acc = 0;
281
+ for (let i = 0; i < assignments.length; i++) {
282
+ const delta = concordanceDeltaFor(assignments.slice(0, i), assignments[i], inputs, opts);
283
+ if (delta === Number.NEGATIVE_INFINITY)
284
+ return Number.NEGATIVE_INFINITY;
285
+ acc += delta;
286
+ }
287
+ return acc;
288
+ }
289
+ function buildTree(beam, raw) {
290
+ const roots = beam.assignments
291
+ .slice()
292
+ .sort((a, b) => a.span.start - b.span.start)
293
+ .map((slot) => ({
294
+ tag: slot.tag,
295
+ value: raw.slice(slot.span.start, slot.span.end),
296
+ start: slot.span.start,
297
+ end: slot.span.end,
298
+ confidence: slot.classifierScore * slot.phraseConf,
299
+ children: [],
300
+ source: "reconcile",
301
+ sourceId: "reconcile:stage-5-joint",
302
+ ...(slot.place
303
+ ? {
304
+ lat: slot.place.lat,
305
+ lon: slot.place.lon,
306
+ placeId: `${placeIdPrefix(slot.place)}:${slot.place.id}`,
307
+ }
308
+ : {}),
309
+ }));
310
+ return { raw, roots };
311
+ }
312
+ function emptyParseTree(raw) {
313
+ return {
314
+ tree: { raw, roots: [] },
315
+ confidence: 0,
316
+ runnersUp: [],
317
+ scoreBreakdown: { phrase: 0, classifier: 0, resolver: 0, concordance: 1, total: 0 },
318
+ };
319
+ }
320
+ function placeIdPrefix(place) {
321
+ // Mirror the convention used by @mailwoman/resolver-wof-sqlite (`wof:<id>`). Resolver
322
+ // backends that don't carry an implicit vendor in `id` get a neutral `place:` prefix.
323
+ return typeof place.id === "number" ? "wof" : "place";
324
+ }
325
+ function spanKey(start, end) {
326
+ return `${start}:${end}`;
327
+ }
328
+ function topN(items, n, key) {
329
+ return items
330
+ .slice()
331
+ .sort((a, b) => key(b) - key(a))
332
+ .slice(0, n);
333
+ }
334
+ function logSafe(x) {
335
+ return x > 0 ? Math.log(x) : -50;
336
+ }
337
+ function normalizeResolverScore(score) {
338
+ // Resolver score scale is implementation-defined; clamp to (0, 1] for the multiplicative
339
+ // combiner. A backend that returns 0 still counts as a candidate (e.g. a partial match) but
340
+ // contributes a tiny log-factor.
341
+ if (!Number.isFinite(score) || score <= 0)
342
+ return 0.01;
343
+ if (score > 1)
344
+ return 1;
345
+ return score;
346
+ }
347
+ function softmax(scores) {
348
+ if (scores.length === 0)
349
+ return [];
350
+ const max = Math.max(...scores);
351
+ const exps = scores.map((s) => Math.exp(s - max));
352
+ const sum = exps.reduce((a, b) => a + b, 0);
353
+ return exps.map((e) => e / sum);
354
+ }
355
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../pipeline/reconcile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * `runPipeline` — the runtime coordinator that composes all six stages.
7
+ *
8
+ * Generic over stage implementations (see `types.ts::RuntimePipelineStages`). Each stage is
9
+ * injected; the coordinator handles composition, timing, fast-path routing, and graceful
10
+ * degradation when stages are absent.
11
+ *
12
+ * Implementation contract per `docs/articles/plan/reference/STAGES.md`.
13
+ */
14
+ import type { PipelineOpts, PipelineResult, RuntimePipelineStages } from "./types.js";
15
+ /**
16
+ * Run the runtime pipeline.
17
+ *
18
+ * Composition order (per STAGES.md):
19
+ *
20
+ * 1. Normalize (or identity)
21
+ * 2. Compute QueryShape (or empty)
22
+ * 3. Locale gate (or caller-trust)
23
+ * 4. Kind classifier (or default structured_address)
24
+ * 5. Branch: fast-path → resolver; full → classifier → resolver
25
+ *
26
+ * Per-stage timing recorded on `result.timing`. Fast-path stages are absent from the timing map.
27
+ */
28
+ export declare function runPipeline(raw: string, stages: RuntimePipelineStages, opts?: PipelineOpts): Promise<PipelineResult>;
29
+ //# sourceMappingURL=runtime-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-pipeline.d.ts","sourceRoot":"","sources":["../../pipeline/runtime-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAMX,YAAY,EACZ,cAAc,EAGd,qBAAqB,EACrB,MAAM,YAAY,CAAA;AA6HnB;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAChC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,qBAAqB,EAC7B,IAAI,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CA8IzB"}