@uwmd/core 1.1.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 (214) hide show
  1. package/README.md +79 -0
  2. package/dist/agents/bancroft.d.ts +32 -0
  3. package/dist/agents/bancroft.d.ts.map +1 -0
  4. package/dist/agents/bancroft.js +292 -0
  5. package/dist/agents/bancroft.js.map +1 -0
  6. package/dist/agents/schemas.d.ts +13 -0
  7. package/dist/agents/schemas.d.ts.map +1 -0
  8. package/dist/agents/schemas.js +74 -0
  9. package/dist/agents/schemas.js.map +1 -0
  10. package/dist/bindings.d.ts +85 -0
  11. package/dist/bindings.d.ts.map +1 -0
  12. package/dist/bindings.js +293 -0
  13. package/dist/bindings.js.map +1 -0
  14. package/dist/browser.d.ts +66 -0
  15. package/dist/browser.d.ts.map +1 -0
  16. package/dist/browser.js +53 -0
  17. package/dist/browser.js.map +1 -0
  18. package/dist/calc/builtins.d.ts +4 -0
  19. package/dist/calc/builtins.d.ts.map +1 -0
  20. package/dist/calc/builtins.js +329 -0
  21. package/dist/calc/builtins.js.map +1 -0
  22. package/dist/calc/dependencies.d.ts +34 -0
  23. package/dist/calc/dependencies.d.ts.map +1 -0
  24. package/dist/calc/dependencies.js +101 -0
  25. package/dist/calc/dependencies.js.map +1 -0
  26. package/dist/calc/errors.d.ts +8 -0
  27. package/dist/calc/errors.d.ts.map +1 -0
  28. package/dist/calc/errors.js +18 -0
  29. package/dist/calc/errors.js.map +1 -0
  30. package/dist/calc/evaluator.d.ts +5 -0
  31. package/dist/calc/evaluator.d.ts.map +1 -0
  32. package/dist/calc/evaluator.js +184 -0
  33. package/dist/calc/evaluator.js.map +1 -0
  34. package/dist/calc/index.d.ts +14 -0
  35. package/dist/calc/index.d.ts.map +1 -0
  36. package/dist/calc/index.js +56 -0
  37. package/dist/calc/index.js.map +1 -0
  38. package/dist/calc/parser.d.ts +32 -0
  39. package/dist/calc/parser.d.ts.map +1 -0
  40. package/dist/calc/parser.js +361 -0
  41. package/dist/calc/parser.js.map +1 -0
  42. package/dist/cascade.d.ts +85 -0
  43. package/dist/cascade.d.ts.map +1 -0
  44. package/dist/cascade.js +172 -0
  45. package/dist/cascade.js.map +1 -0
  46. package/dist/cli.d.ts +3 -0
  47. package/dist/cli.d.ts.map +1 -0
  48. package/dist/cli.js +843 -0
  49. package/dist/cli.js.map +1 -0
  50. package/dist/codec.d.ts +25 -0
  51. package/dist/codec.d.ts.map +1 -0
  52. package/dist/codec.js +62 -0
  53. package/dist/codec.js.map +1 -0
  54. package/dist/codecs.d.ts +6 -0
  55. package/dist/codecs.d.ts.map +1 -0
  56. package/dist/codecs.js +12 -0
  57. package/dist/codecs.js.map +1 -0
  58. package/dist/compactor.d.ts +11 -0
  59. package/dist/compactor.d.ts.map +1 -0
  60. package/dist/compactor.js +84 -0
  61. package/dist/compactor.js.map +1 -0
  62. package/dist/context-profiles.d.ts +30 -0
  63. package/dist/context-profiles.d.ts.map +1 -0
  64. package/dist/context-profiles.js +225 -0
  65. package/dist/context-profiles.js.map +1 -0
  66. package/dist/context.d.ts +55 -0
  67. package/dist/context.d.ts.map +1 -0
  68. package/dist/context.js +288 -0
  69. package/dist/context.js.map +1 -0
  70. package/dist/dcf.d.ts +9 -0
  71. package/dist/dcf.d.ts.map +1 -0
  72. package/dist/dcf.js +75 -0
  73. package/dist/dcf.js.map +1 -0
  74. package/dist/debt.d.ts +11 -0
  75. package/dist/debt.d.ts.map +1 -0
  76. package/dist/debt.js +85 -0
  77. package/dist/debt.js.map +1 -0
  78. package/dist/defaults.d.ts +104 -0
  79. package/dist/defaults.d.ts.map +1 -0
  80. package/dist/defaults.js +622 -0
  81. package/dist/defaults.js.map +1 -0
  82. package/dist/derived.d.ts +17 -0
  83. package/dist/derived.d.ts.map +1 -0
  84. package/dist/derived.js +29 -0
  85. package/dist/derived.js.map +1 -0
  86. package/dist/editor.d.ts +76 -0
  87. package/dist/editor.d.ts.map +1 -0
  88. package/dist/editor.js +502 -0
  89. package/dist/editor.js.map +1 -0
  90. package/dist/envelope.d.ts +51 -0
  91. package/dist/envelope.d.ts.map +1 -0
  92. package/dist/envelope.js +213 -0
  93. package/dist/envelope.js.map +1 -0
  94. package/dist/format.d.ts +60 -0
  95. package/dist/format.d.ts.map +1 -0
  96. package/dist/format.js +115 -0
  97. package/dist/format.js.map +1 -0
  98. package/dist/gaps.d.ts +62 -0
  99. package/dist/gaps.d.ts.map +1 -0
  100. package/dist/gaps.js +272 -0
  101. package/dist/gaps.js.map +1 -0
  102. package/dist/index.d.ts +75 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +47 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/init.d.ts +15 -0
  107. package/dist/init.d.ts.map +1 -0
  108. package/dist/init.js +169 -0
  109. package/dist/init.js.map +1 -0
  110. package/dist/integrity-canonical.d.ts +17 -0
  111. package/dist/integrity-canonical.d.ts.map +1 -0
  112. package/dist/integrity-canonical.js +124 -0
  113. package/dist/integrity-canonical.js.map +1 -0
  114. package/dist/integrity.d.ts +54 -0
  115. package/dist/integrity.d.ts.map +1 -0
  116. package/dist/integrity.js +244 -0
  117. package/dist/integrity.js.map +1 -0
  118. package/dist/modules.d.ts +24 -0
  119. package/dist/modules.d.ts.map +1 -0
  120. package/dist/modules.js +322 -0
  121. package/dist/modules.js.map +1 -0
  122. package/dist/negotiation.d.ts +19 -0
  123. package/dist/negotiation.d.ts.map +1 -0
  124. package/dist/negotiation.js +70 -0
  125. package/dist/negotiation.js.map +1 -0
  126. package/dist/opstatement.d.ts +9 -0
  127. package/dist/opstatement.d.ts.map +1 -0
  128. package/dist/opstatement.js +80 -0
  129. package/dist/opstatement.js.map +1 -0
  130. package/dist/packs/excel-emit.d.ts +21 -0
  131. package/dist/packs/excel-emit.d.ts.map +1 -0
  132. package/dist/packs/excel-emit.js +135 -0
  133. package/dist/packs/excel-emit.js.map +1 -0
  134. package/dist/packs/index.d.ts +13 -0
  135. package/dist/packs/index.d.ts.map +1 -0
  136. package/dist/packs/index.js +37 -0
  137. package/dist/packs/index.js.map +1 -0
  138. package/dist/packs/industrial.d.ts +3 -0
  139. package/dist/packs/industrial.d.ts.map +1 -0
  140. package/dist/packs/industrial.js +115 -0
  141. package/dist/packs/industrial.js.map +1 -0
  142. package/dist/packs/multifamily.d.ts +3 -0
  143. package/dist/packs/multifamily.d.ts.map +1 -0
  144. package/dist/packs/multifamily.js +82 -0
  145. package/dist/packs/multifamily.js.map +1 -0
  146. package/dist/packs/office.d.ts +3 -0
  147. package/dist/packs/office.d.ts.map +1 -0
  148. package/dist/packs/office.js +108 -0
  149. package/dist/packs/office.js.map +1 -0
  150. package/dist/packs/retail.d.ts +3 -0
  151. package/dist/packs/retail.d.ts.map +1 -0
  152. package/dist/packs/retail.js +115 -0
  153. package/dist/packs/retail.js.map +1 -0
  154. package/dist/packs/self-storage.d.ts +3 -0
  155. package/dist/packs/self-storage.d.ts.map +1 -0
  156. package/dist/packs/self-storage.js +105 -0
  157. package/dist/packs/self-storage.js.map +1 -0
  158. package/dist/parser.d.ts +15 -0
  159. package/dist/parser.d.ts.map +1 -0
  160. package/dist/parser.js +430 -0
  161. package/dist/parser.js.map +1 -0
  162. package/dist/protocol.d.ts +389 -0
  163. package/dist/protocol.d.ts.map +1 -0
  164. package/dist/protocol.js +714 -0
  165. package/dist/protocol.js.map +1 -0
  166. package/dist/refinement.d.ts +63 -0
  167. package/dist/refinement.d.ts.map +1 -0
  168. package/dist/refinement.js +242 -0
  169. package/dist/refinement.js.map +1 -0
  170. package/dist/renderer.d.ts +22 -0
  171. package/dist/renderer.d.ts.map +1 -0
  172. package/dist/renderer.js +478 -0
  173. package/dist/renderer.js.map +1 -0
  174. package/dist/rentroll.d.ts +21 -0
  175. package/dist/rentroll.d.ts.map +1 -0
  176. package/dist/rentroll.js +256 -0
  177. package/dist/rentroll.js.map +1 -0
  178. package/dist/report.d.ts +29 -0
  179. package/dist/report.d.ts.map +1 -0
  180. package/dist/report.js +924 -0
  181. package/dist/report.js.map +1 -0
  182. package/dist/runner.d.ts +43 -0
  183. package/dist/runner.d.ts.map +1 -0
  184. package/dist/runner.js +288 -0
  185. package/dist/runner.js.map +1 -0
  186. package/dist/sourcesuses.d.ts +14 -0
  187. package/dist/sourcesuses.d.ts.map +1 -0
  188. package/dist/sourcesuses.js +63 -0
  189. package/dist/sourcesuses.js.map +1 -0
  190. package/dist/types.d.ts +248 -0
  191. package/dist/types.d.ts.map +1 -0
  192. package/dist/types.js +15 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/uwcsv.d.ts +23 -0
  195. package/dist/uwcsv.d.ts.map +1 -0
  196. package/dist/uwcsv.js +877 -0
  197. package/dist/uwcsv.js.map +1 -0
  198. package/dist/uwjson.d.ts +19 -0
  199. package/dist/uwjson.d.ts.map +1 -0
  200. package/dist/uwjson.js +61 -0
  201. package/dist/uwjson.js.map +1 -0
  202. package/dist/uwxml.d.ts +18 -0
  203. package/dist/uwxml.d.ts.map +1 -0
  204. package/dist/uwxml.js +297 -0
  205. package/dist/uwxml.js.map +1 -0
  206. package/dist/validator.d.ts +35 -0
  207. package/dist/validator.d.ts.map +1 -0
  208. package/dist/validator.js +553 -0
  209. package/dist/validator.js.map +1 -0
  210. package/dist/valuation.d.ts +9 -0
  211. package/dist/valuation.d.ts.map +1 -0
  212. package/dist/valuation.js +34 -0
  213. package/dist/valuation.js.map +1 -0
  214. package/package.json +58 -0
package/dist/parser.js ADDED
@@ -0,0 +1,430 @@
1
+ // .uw.md parser — extracts frontmatter, section blocks, prose, and pipeline log
2
+ // Spec: UW_FORMAT_SPEC_v1.md §2.4 (annotation syntax), §2.7 (update semantics), §2.8 (multi-variant)
3
+ // ─── Regex patterns ───────────────────────────────────────────────────────────
4
+ // Opening fence: ```json uw:section=<id> [key=value ...]
5
+ const FENCE_OPEN_RE = /^```json\s+uw:section=(\S+)(.*)?$/;
6
+ // Closing fence: ``` (alone on line, optional trailing whitespace)
7
+ const FENCE_CLOSE_RE = /^```\s*$/;
8
+ // YAML frontmatter delimiter
9
+ const FRONTMATTER_RE = /^---\s*$/;
10
+ // Key=value pairs in fence annotation (value is any non-whitespace run)
11
+ const KV_RE = /(\w+)=([^\s]+)/g;
12
+ // ─── YAML frontmatter parser ──────────────────────────────────────────────────
13
+ // Deliberately implements a strict YAML SUBSET — see UW_FORMAT_SPEC_v1.md
14
+ // Appendix A "YAML subset" for the full grammar. The supported surface:
15
+ //
16
+ // - Scalars: string (bare or single/double-quoted), number, boolean, null, ~
17
+ // - Mappings: `key: value` and one-level nested `key:` + indented children
18
+ // - Sequences: `- item` lines under a key
19
+ // - Comments: `#` to end of line
20
+ // - Empty inline arrays: `[]`
21
+ //
22
+ // Explicitly REJECTED with UNSUPPORTED_YAML_FEATURE so authors are not lulled
23
+ // into thinking these work:
24
+ //
25
+ // - Anchors and aliases (`&name`, `*name`)
26
+ // - Explicit tags (`!!str`, `!!int`, `!Custom`)
27
+ // - Multi-line literal/folded scalars (`|`, `>`)
28
+ // - Flow-style mappings or sequences (`{a: 1}`, `[1, 2, 3]` other than `[]`)
29
+ // - Complex keys (`?` indicator)
30
+ // - YAML directives (`%YAML`, `%TAG`)
31
+ //
32
+ // Detection runs as a pre-pass on the frontmatter lines so we can point at the
33
+ // exact line that broke the contract.
34
+ const UNSUPPORTED_YAML_PATTERNS = [
35
+ // Anchor / alias indicators: `key: &name value` or `key: *name`. Must follow
36
+ // the colon (or appear at line start as a sequence-item alias).
37
+ { pattern: /:\s*&\w/, feature: 'YAML anchor (&name)' },
38
+ { pattern: /:\s*\*\w/, feature: 'YAML alias (*name)' },
39
+ { pattern: /^\s*-\s*&\w/, feature: 'YAML anchor (&name) on sequence item' },
40
+ { pattern: /^\s*-\s*\*\w/, feature: 'YAML alias (*name) on sequence item' },
41
+ // Explicit tags: `!!str`, `!!int`, `!Custom`. `!=` and `!==` are valid in
42
+ // strings, so require the next char to be a letter or another `!`.
43
+ { pattern: /:\s*!!?[A-Za-z]/, feature: 'YAML explicit tag (!! / !)' },
44
+ // Multi-line literal/folded block scalars at end of a `key:` line.
45
+ { pattern: /:\s*[|>][+-]?\s*(#.*)?$/, feature: 'YAML block scalar (| or >)' },
46
+ // Complex key indicator at start of a line.
47
+ { pattern: /^\s*\?\s/, feature: 'YAML complex key (?)' },
48
+ // YAML directives.
49
+ { pattern: /^%(YAML|TAG)\b/, feature: 'YAML directive (%YAML / %TAG)' },
50
+ ];
51
+ export class UWMDParseError extends Error {
52
+ code;
53
+ line;
54
+ feature;
55
+ constructor(code, message, opts = {}) {
56
+ super(`[${code}] ${message}`);
57
+ this.name = 'UWMDParseError';
58
+ this.code = code;
59
+ this.line = opts.line;
60
+ this.feature = opts.feature;
61
+ }
62
+ }
63
+ function rejectUnsupportedYaml(lines) {
64
+ for (let n = 0; n < lines.length; n++) {
65
+ const line = lines[n];
66
+ // Strip trailing comment so `# anchor` text doesn't false-positive.
67
+ const codePart = stripYamlComment(line);
68
+ for (const { pattern, feature } of UNSUPPORTED_YAML_PATTERNS) {
69
+ if (pattern.test(codePart)) {
70
+ throw new UWMDParseError('UNSUPPORTED_YAML_FEATURE', `Frontmatter line ${n + 1} uses ${feature}, which is not part of the .uw.md YAML subset (see UW_FORMAT_SPEC_v1.md Appendix A).`, { line: n + 1, feature });
71
+ }
72
+ }
73
+ }
74
+ }
75
+ function stripYamlComment(line) {
76
+ // Conservative: only strip `#` that follows whitespace AND is not inside
77
+ // a quoted string. Good enough for a frontmatter-rejection pre-pass.
78
+ let inSingle = false;
79
+ let inDouble = false;
80
+ for (let i = 0; i < line.length; i++) {
81
+ const c = line[i];
82
+ if (c === "'" && !inDouble)
83
+ inSingle = !inSingle;
84
+ else if (c === '"' && !inSingle)
85
+ inDouble = !inDouble;
86
+ else if (c === '#' && !inSingle && !inDouble && (i === 0 || /\s/.test(line[i - 1]))) {
87
+ return line.slice(0, i);
88
+ }
89
+ }
90
+ return line;
91
+ }
92
+ function parseYamlFrontmatter(text) {
93
+ const result = {};
94
+ const lines = text.split('\n');
95
+ let i = 0;
96
+ while (i < lines.length) {
97
+ const line = lines[i];
98
+ const colonIdx = line.indexOf(':');
99
+ if (colonIdx === -1) {
100
+ i++;
101
+ continue;
102
+ }
103
+ const key = line.slice(0, colonIdx).trim();
104
+ const rawVal = line.slice(colonIdx + 1).trim();
105
+ if (!key || key.startsWith('#')) {
106
+ i++;
107
+ continue;
108
+ }
109
+ // Array: next lines are " - value" items (check BEFORE nested object)
110
+ if (rawVal === '' && i + 1 < lines.length && lines[i + 1].trim().startsWith('- ')) {
111
+ const arr = [];
112
+ i++;
113
+ while (i < lines.length && lines[i].trim().startsWith('- ')) {
114
+ arr.push(parseScalar(lines[i].trim().slice(2)));
115
+ i++;
116
+ }
117
+ result[key] = arr;
118
+ }
119
+ else if (rawVal === '' && i + 1 < lines.length && lines[i + 1].startsWith(' ') && !lines[i + 1].trim().startsWith('- ')) {
120
+ // Nested object: next lines are indented key: value pairs (not array items)
121
+ const nested = {};
122
+ i++;
123
+ while (i < lines.length && (lines[i].startsWith(' ') || lines[i].trim() === '')) {
124
+ const nLine = lines[i];
125
+ if (nLine.trim() === '' || nLine.trim().startsWith('#')) {
126
+ i++;
127
+ continue;
128
+ }
129
+ if (nLine.trim().startsWith('- ')) {
130
+ i++;
131
+ continue;
132
+ } // skip list items in nested context
133
+ const nColon = nLine.indexOf(':');
134
+ if (nColon === -1) {
135
+ i++;
136
+ continue;
137
+ }
138
+ const nKey = nLine.slice(0, nColon).trim();
139
+ const nRaw = nLine.slice(nColon + 1).trim();
140
+ nested[nKey] = parseScalar(nRaw);
141
+ i++;
142
+ }
143
+ result[key] = nested;
144
+ }
145
+ else {
146
+ result[key] = parseScalar(rawVal);
147
+ i++;
148
+ }
149
+ }
150
+ return result;
151
+ }
152
+ function parseScalar(raw) {
153
+ if (raw === '' || raw === 'null' || raw === '~')
154
+ return null;
155
+ if (raw === 'true')
156
+ return true;
157
+ if (raw === 'false')
158
+ return false;
159
+ if (raw === '[]')
160
+ return [];
161
+ // Quoted string
162
+ if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
163
+ return raw.slice(1, -1);
164
+ }
165
+ // Number
166
+ const num = Number(raw);
167
+ if (!Number.isNaN(num) && raw !== '')
168
+ return num;
169
+ return raw;
170
+ }
171
+ // ─── Fence annotation parser ──────────────────────────────────────────────────
172
+ function parseFenceAnnotation(sectionId, rest) {
173
+ const annotation = { section: sectionId };
174
+ KV_RE.lastIndex = 0;
175
+ let match = KV_RE.exec(rest);
176
+ while (match !== null) {
177
+ const key = match[1];
178
+ const value = match[2];
179
+ switch (key) {
180
+ case 'v':
181
+ annotation.v = Number.parseInt(value, 10);
182
+ break;
183
+ case 'superseded':
184
+ annotation.superseded = value === 'true';
185
+ break;
186
+ case 'confidence':
187
+ annotation.confidence = value;
188
+ break;
189
+ default:
190
+ annotation[key] = value;
191
+ }
192
+ match = KV_RE.exec(rest);
193
+ }
194
+ return annotation;
195
+ }
196
+ // ─── Multi-variant section IDs ────────────────────────────────────────────────
197
+ // These sections store parallel variants (not superseded — genuinely concurrent).
198
+ const MULTI_VARIANT_SECTIONS = new Set([
199
+ 'operating_statement',
200
+ 'stress_tests',
201
+ 'due_diligence',
202
+ ]);
203
+ // Sections routed to dedicated collections rather than the main sections map
204
+ const _RESERVED_SECTION_IDS = new Set([
205
+ 'pipeline_log',
206
+ 'custom_calculations',
207
+ 'custom_scenarios',
208
+ ]);
209
+ // ─── Main parse function ──────────────────────────────────────────────────────
210
+ export function parseUWFile(content, options = {}) {
211
+ const { strict = false } = options;
212
+ // `.uw.md` is a portable text format. Strip the CR component of Windows
213
+ // CRLF endings while parsing, but retain `result.raw` byte-for-byte so Tier-2
214
+ // editors can still preserve untouched regions of the source document.
215
+ const lines = content.split(/\r?\n/);
216
+ const result = {
217
+ frontmatter: {},
218
+ sections: {},
219
+ prose: {},
220
+ pipeline_log: [],
221
+ custom_calculations: [],
222
+ custom_scenarios: [],
223
+ extensions: {},
224
+ superseded: {},
225
+ raw: content,
226
+ };
227
+ let i = 0;
228
+ // ── 1. YAML Frontmatter ──────────────────────────────────────────────────────
229
+ if (lines[0]?.trim() === '---') {
230
+ i = 1;
231
+ const yamlLines = [];
232
+ while (i < lines.length && !FRONTMATTER_RE.test(lines[i])) {
233
+ yamlLines.push(lines[i]);
234
+ i++;
235
+ }
236
+ i++; // move past closing ---
237
+ try {
238
+ // Hard reject unsupported YAML features (anchors, tags, block scalars,
239
+ // etc.) regardless of strict mode — these silently produced wrong data
240
+ // before, which is worse than a clean error.
241
+ rejectUnsupportedYaml(yamlLines);
242
+ result.frontmatter = parseYamlFrontmatter(yamlLines.join('\n'));
243
+ }
244
+ catch (err) {
245
+ if (err instanceof UWMDParseError)
246
+ throw err;
247
+ if (strict)
248
+ throw new Error(`Frontmatter parse error: ${err}`);
249
+ result.frontmatter._parse_error = String(err);
250
+ }
251
+ }
252
+ // ── 2. Body scan ─────────────────────────────────────────────────────────────
253
+ // Collect prose lines between blocks; route each block to the right collection.
254
+ let proseLines = [];
255
+ while (i < lines.length) {
256
+ const line = lines[i];
257
+ const fenceMatch = FENCE_OPEN_RE.exec(line);
258
+ if (!fenceMatch) {
259
+ proseLines.push(line);
260
+ i++;
261
+ continue;
262
+ }
263
+ // ── We hit a section block ─────────────────────────────────────────────────
264
+ const sectionId = fenceMatch[1];
265
+ const restAnnotation = fenceMatch[2] ?? '';
266
+ const annotation = parseFenceAnnotation(sectionId, restAnnotation);
267
+ const lineStart = i + 1; // 1-indexed
268
+ const capturedProse = proseLines.join('\n').trim();
269
+ proseLines = [];
270
+ // Collect JSON lines until closing ```
271
+ i++;
272
+ const jsonLines = [];
273
+ while (i < lines.length && !FENCE_CLOSE_RE.test(lines[i])) {
274
+ jsonLines.push(lines[i]);
275
+ i++;
276
+ }
277
+ // A recognized UW section fence must be closed. Treating the remainder of
278
+ // the document as malformed JSON in non-strict mode can silently swallow
279
+ // every following section, which is unsafe for an underwriting record.
280
+ if (i >= lines.length) {
281
+ throw new UWMDParseError('UNCLOSED_SECTION_FENCE', `Section '${sectionId}' opened at line ${lineStart} has no closing fence.`, { line: lineStart });
282
+ }
283
+ const lineEnd = i + 1; // 1-indexed, closing ```
284
+ i++; // move past closing ```
285
+ const rawJson = jsonLines.join('\n');
286
+ let parsed;
287
+ try {
288
+ parsed = JSON.parse(rawJson);
289
+ }
290
+ catch (err) {
291
+ if (strict) {
292
+ throw new Error(`JSON parse error in section ${sectionId} at line ${lineStart}: ${err}`);
293
+ }
294
+ parsed = { _parse_error: String(err), _raw: rawJson };
295
+ }
296
+ const meta = parsed['_meta'] ?? {};
297
+ const block = {
298
+ annotation,
299
+ meta,
300
+ content: parsed,
301
+ prose: capturedProse,
302
+ rawJson,
303
+ lineStart,
304
+ lineEnd,
305
+ };
306
+ routeBlock(result, block, sectionId, annotation, capturedProse);
307
+ }
308
+ return result;
309
+ }
310
+ // ─── Block routing ────────────────────────────────────────────────────────────
311
+ function routeBlock(result, block, sectionId, annotation, prose) {
312
+ // Pipeline log — always append
313
+ if (sectionId === 'pipeline_log') {
314
+ result.pipeline_log.push(block);
315
+ return;
316
+ }
317
+ // Custom sections — always append (order matters; last is newest)
318
+ if (sectionId === 'custom_calculations') {
319
+ result.custom_calculations.push(block);
320
+ return;
321
+ }
322
+ if (sectionId === 'custom_scenarios') {
323
+ result.custom_scenarios.push(block);
324
+ return;
325
+ }
326
+ // Extension sections (x_ prefix)
327
+ if (sectionId.startsWith('x_')) {
328
+ result.extensions[sectionId] = block;
329
+ return;
330
+ }
331
+ // Explicitly superseded block — goes to superseded archive, not current sections
332
+ if (annotation.superseded === true || block.meta?.superseded === true) {
333
+ if (!result.superseded[sectionId])
334
+ result.superseded[sectionId] = [];
335
+ result.superseded[sectionId].push(block);
336
+ return;
337
+ }
338
+ // Multi-variant sections — keyed by variant, multiple concurrent instances allowed
339
+ if (MULTI_VARIANT_SECTIONS.has(sectionId)) {
340
+ const variant = annotation.variant ?? 'default';
341
+ const existing = result.sections[sectionId];
342
+ if (!existing || !isMultiVariantMap(existing)) {
343
+ result.sections[sectionId] = { [variant]: block };
344
+ }
345
+ else {
346
+ const variantMap = existing;
347
+ const current = variantMap[variant];
348
+ if (!current) {
349
+ variantMap[variant] = block;
350
+ }
351
+ else {
352
+ // Replace if newer version
353
+ const currentV = current.annotation.v ?? current.meta?.version ?? 1;
354
+ const newV = annotation.v ?? block.meta?.version ?? 1;
355
+ if (newV > currentV) {
356
+ if (!result.superseded[sectionId])
357
+ result.superseded[sectionId] = [];
358
+ result.superseded[sectionId].push(current);
359
+ variantMap[variant] = block;
360
+ }
361
+ else {
362
+ if (!result.superseded[sectionId])
363
+ result.superseded[sectionId] = [];
364
+ result.superseded[sectionId].push(block);
365
+ }
366
+ }
367
+ }
368
+ if (!result.prose[sectionId])
369
+ result.prose[sectionId] = prose;
370
+ return;
371
+ }
372
+ // Standard single-variant section
373
+ const existing = result.sections[sectionId];
374
+ if (!existing) {
375
+ result.sections[sectionId] = block;
376
+ result.prose[sectionId] = prose;
377
+ return;
378
+ }
379
+ // Resolve version conflict: keep higher version as current
380
+ const existingBlock = existing;
381
+ const existingV = existingBlock.annotation.v ?? existingBlock.meta?.version ?? 1;
382
+ const newV = annotation.v ?? block.meta?.version ?? 1;
383
+ if (newV > existingV) {
384
+ if (!result.superseded[sectionId])
385
+ result.superseded[sectionId] = [];
386
+ result.superseded[sectionId].push(existingBlock);
387
+ result.sections[sectionId] = block;
388
+ result.prose[sectionId] = prose;
389
+ }
390
+ else {
391
+ if (!result.superseded[sectionId])
392
+ result.superseded[sectionId] = [];
393
+ result.superseded[sectionId].push(block);
394
+ }
395
+ }
396
+ function isMultiVariantMap(val) {
397
+ if (typeof val !== 'object' || val === null)
398
+ return false;
399
+ // A UWBlock has annotation, meta, content — a variant map has string keys pointing to blocks
400
+ return !('annotation' in val);
401
+ }
402
+ // ─── Convenience: get current block for a section ─────────────────────────────
403
+ export function getSection(parsed, sectionId) {
404
+ const entry = parsed.sections[sectionId];
405
+ if (!entry)
406
+ return null;
407
+ if (isMultiVariantMap(entry))
408
+ return null; // use getSectionVariant for multi-variant
409
+ return entry;
410
+ }
411
+ export function getSectionVariant(parsed, sectionId, variant) {
412
+ const entry = parsed.sections[sectionId];
413
+ if (!entry || !isMultiVariantMap(entry))
414
+ return null;
415
+ return entry[variant] ?? null;
416
+ }
417
+ // ─── Deep get utility (for cross-section checks) ─────────────────────────────
418
+ // Resolves dot-path notation: "noi_model.net_operating_income"
419
+ // Array indices: "dcf.annual_cash_flows[0].net_cash_flow_levered"
420
+ export function deepGet(obj, path) {
421
+ const parts = path.replace(/\[(\d+)\]/g, '.$1').split('.');
422
+ let current = obj;
423
+ for (const part of parts) {
424
+ if (current === null || current === undefined)
425
+ return undefined;
426
+ current = current[part];
427
+ }
428
+ return current;
429
+ }
430
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}