@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
@@ -0,0 +1,51 @@
1
+ import type { ParsedUWFile, UWFenceAnnotation, UWFrontmatter } from './types.js';
2
+ export declare const UW_ENVELOPE_VERSION: "1.0";
3
+ export interface UWEnvelopeBlock {
4
+ annotation: UWFenceAnnotation;
5
+ /** Complete fenced JSON object. `_meta` appears here exactly once. */
6
+ content: Record<string, unknown>;
7
+ /** Markdown immediately preceding this exact block. */
8
+ prose?: string;
9
+ }
10
+ export type UWEnvelopeSectionEntry = UWEnvelopeBlock | Record<string, UWEnvelopeBlock>;
11
+ export interface UWDocumentEnvelope {
12
+ envelope_version: typeof UW_ENVELOPE_VERSION;
13
+ format_version: string;
14
+ generated_at?: string;
15
+ generator?: string;
16
+ semantic_digest?: string;
17
+ frontmatter: UWFrontmatter;
18
+ sections: Record<string, UWEnvelopeSectionEntry>;
19
+ pipeline_log: UWEnvelopeBlock[];
20
+ custom_calculations: UWEnvelopeBlock[];
21
+ custom_scenarios: UWEnvelopeBlock[];
22
+ extensions: Record<string, UWEnvelopeBlock>;
23
+ superseded: Record<string, UWEnvelopeBlock[]>;
24
+ [key: string]: unknown;
25
+ }
26
+ export interface ToEnvelopeOptions {
27
+ /** Default true. False intentionally emits a compacted, model-lossy archive. */
28
+ includeSuperseded?: boolean;
29
+ generatedAt?: string;
30
+ generator?: string;
31
+ }
32
+ export interface EnvelopeDigestVerification {
33
+ valid: boolean;
34
+ expected: string;
35
+ actual?: string;
36
+ }
37
+ export declare class UWEnvelopeError extends Error {
38
+ readonly code: string;
39
+ constructor(code: string, message: string);
40
+ }
41
+ export declare function toUWEnvelope(parsed: ParsedUWFile, options?: ToEnvelopeOptions): UWDocumentEnvelope;
42
+ export declare function fromUWEnvelope(envelope: UWDocumentEnvelope): ParsedUWFile;
43
+ /** Canonical semantic input. Volatile serialization fields are excluded. */
44
+ export declare function envelopeSemanticValue(envelope: UWDocumentEnvelope): Omit<UWDocumentEnvelope, 'generated_at' | 'generator' | 'semantic_digest'>;
45
+ export declare function canonicalizeUWEnvelope(envelope: UWDocumentEnvelope): string;
46
+ export declare function computeEnvelopeDigest(envelope: UWDocumentEnvelope): Promise<string>;
47
+ export declare function stampEnvelopeDigest(envelope: UWDocumentEnvelope): Promise<UWDocumentEnvelope>;
48
+ export declare function verifyEnvelopeDigest(envelope: UWDocumentEnvelope): Promise<EnvelopeDigestVerification>;
49
+ export declare function areEnvelopesEquivalent(left: UWDocumentEnvelope, right: UWDocumentEnvelope): boolean;
50
+ export declare function assertUWEnvelope(value: unknown): asserts value is UWDocumentEnvelope;
51
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,YAAY,EAEZ,iBAAiB,EACjB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,mBAAmB,EAAG,KAAc,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,sBAAsB,GAC9B,eAAe,GACf,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,OAAO,mBAAmB,CAAC;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,aAAa,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACjD,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,mBAAmB,EAAE,eAAe,EAAE,CAAC;IACvC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IAC9C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,iBAAsB,GAC9B,kBAAkB,CAqCpB;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,YAAY,CAoDzE;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,GAC3B,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,WAAW,GAAG,iBAAiB,CAAC,CAI5E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAE3E;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEzF;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAE7B;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,0BAA0B,CAAC,CAOrC;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,kBAAkB,EACxB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAET;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,kBAAkB,CAoEpF"}
@@ -0,0 +1,213 @@
1
+ // UW Document Envelope — format-neutral semantic model shared by machine codecs.
2
+ import { canonicalizeExact } from './integrity-canonical.js';
3
+ import { sha256TextHex } from './integrity.js';
4
+ export const UW_ENVELOPE_VERSION = '1.0';
5
+ export class UWEnvelopeError extends Error {
6
+ code;
7
+ constructor(code, message) {
8
+ super(`[${code}] ${message}`);
9
+ this.name = 'UWEnvelopeError';
10
+ this.code = code;
11
+ }
12
+ }
13
+ export function toUWEnvelope(parsed, options = {}) {
14
+ const sections = {};
15
+ for (const [sectionId, entry] of Object.entries(parsed.sections)) {
16
+ if (isVariantMap(entry)) {
17
+ sections[sectionId] = Object.fromEntries(Object.entries(entry).map(([variant, block]) => [
18
+ variant,
19
+ toEnvelopeBlock(block),
20
+ ]));
21
+ }
22
+ else {
23
+ sections[sectionId] = toEnvelopeBlock(entry);
24
+ }
25
+ }
26
+ const superseded = {};
27
+ if (options.includeSuperseded ?? true) {
28
+ for (const [sectionId, blocks] of Object.entries(parsed.superseded)) {
29
+ superseded[sectionId] = blocks.map(toEnvelopeBlock);
30
+ }
31
+ }
32
+ return {
33
+ envelope_version: UW_ENVELOPE_VERSION,
34
+ format_version: parsed.frontmatter.uw_version ?? '1.1',
35
+ generated_at: options.generatedAt ?? new Date().toISOString(),
36
+ generator: options.generator ?? '@uwmd/core',
37
+ frontmatter: parsed.frontmatter,
38
+ sections,
39
+ pipeline_log: parsed.pipeline_log.map(toEnvelopeBlock),
40
+ custom_calculations: parsed.custom_calculations.map(toEnvelopeBlock),
41
+ custom_scenarios: parsed.custom_scenarios.map(toEnvelopeBlock),
42
+ extensions: Object.fromEntries(Object.entries(parsed.extensions).map(([id, block]) => [id, toEnvelopeBlock(block)])),
43
+ superseded,
44
+ };
45
+ }
46
+ export function fromUWEnvelope(envelope) {
47
+ assertUWEnvelope(envelope);
48
+ const sections = {};
49
+ const prose = {};
50
+ for (const [sectionId, entry] of Object.entries(envelope.sections)) {
51
+ if (isVariantMap(entry)) {
52
+ const variants = Object.fromEntries(Object.entries(entry).map(([variant, block]) => [
53
+ variant,
54
+ fromEnvelopeBlock(block, `${sectionId}.${variant}`),
55
+ ]));
56
+ sections[sectionId] = variants;
57
+ const firstProse = Object.values(variants).find((block) => block.prose.length > 0)?.prose;
58
+ if (firstProse)
59
+ prose[sectionId] = firstProse;
60
+ }
61
+ else {
62
+ const block = fromEnvelopeBlock(entry, sectionId);
63
+ sections[sectionId] = block;
64
+ if (block.prose.length > 0)
65
+ prose[sectionId] = block.prose;
66
+ }
67
+ }
68
+ return {
69
+ frontmatter: envelope.frontmatter,
70
+ sections,
71
+ prose,
72
+ pipeline_log: envelope.pipeline_log.map((block, index) => fromEnvelopeBlock(block, `pipeline_log[${index}]`)),
73
+ custom_calculations: envelope.custom_calculations.map((block, index) => fromEnvelopeBlock(block, `custom_calculations[${index}]`)),
74
+ custom_scenarios: envelope.custom_scenarios.map((block, index) => fromEnvelopeBlock(block, `custom_scenarios[${index}]`)),
75
+ extensions: Object.fromEntries(Object.entries(envelope.extensions).map(([id, block]) => [
76
+ id,
77
+ fromEnvelopeBlock(block, `extensions.${id}`),
78
+ ])),
79
+ superseded: Object.fromEntries(Object.entries(envelope.superseded).map(([sectionId, blocks]) => [
80
+ sectionId,
81
+ blocks.map((block, index) => fromEnvelopeBlock(block, `superseded.${sectionId}[${index}]`)),
82
+ ])),
83
+ raw: '',
84
+ };
85
+ }
86
+ /** Canonical semantic input. Volatile serialization fields are excluded. */
87
+ export function envelopeSemanticValue(envelope) {
88
+ const { generated_at: _generatedAt, generator: _generator, semantic_digest: _digest, ...semantic } = envelope;
89
+ return semantic;
90
+ }
91
+ export function canonicalizeUWEnvelope(envelope) {
92
+ return canonicalizeExact(envelopeSemanticValue(envelope));
93
+ }
94
+ export async function computeEnvelopeDigest(envelope) {
95
+ return `sha256:${await sha256TextHex(canonicalizeUWEnvelope(envelope))}`;
96
+ }
97
+ export async function stampEnvelopeDigest(envelope) {
98
+ return { ...envelope, semantic_digest: await computeEnvelopeDigest(envelope) };
99
+ }
100
+ export async function verifyEnvelopeDigest(envelope) {
101
+ const expected = await computeEnvelopeDigest(envelope);
102
+ return {
103
+ valid: envelope.semantic_digest === expected,
104
+ expected,
105
+ actual: envelope.semantic_digest,
106
+ };
107
+ }
108
+ export function areEnvelopesEquivalent(left, right) {
109
+ return canonicalizeUWEnvelope(left) === canonicalizeUWEnvelope(right);
110
+ }
111
+ export function assertUWEnvelope(value) {
112
+ if (!isRecord(value)) {
113
+ throw new UWEnvelopeError('ENVELOPE_NOT_OBJECT', 'Document root must be an object.');
114
+ }
115
+ if (value['envelope_version'] !== UW_ENVELOPE_VERSION) {
116
+ throw new UWEnvelopeError('ENVELOPE_UNSUPPORTED_VERSION', `Expected envelope_version "${UW_ENVELOPE_VERSION}".`);
117
+ }
118
+ if (typeof value['format_version'] !== 'string') {
119
+ throw new UWEnvelopeError('ENVELOPE_MISSING_FORMAT_VERSION', 'format_version must be a string.');
120
+ }
121
+ if (!isRecord(value['frontmatter'])) {
122
+ throw new UWEnvelopeError('ENVELOPE_MISSING_FRONTMATTER', 'frontmatter must be an object.');
123
+ }
124
+ if (!isRecord(value['sections'])) {
125
+ throw new UWEnvelopeError('ENVELOPE_MISSING_SECTIONS', 'sections must be an object.');
126
+ }
127
+ for (const [sectionId, entry] of Object.entries(value['sections'])) {
128
+ if (isRecord(entry) && 'annotation' in entry) {
129
+ assertEnvelopeBlock(entry, `sections.${sectionId}`);
130
+ continue;
131
+ }
132
+ if (!isRecord(entry) || Object.keys(entry).length === 0) {
133
+ throw new UWEnvelopeError('ENVELOPE_INVALID_VARIANTS', `sections.${sectionId} must be a block or non-empty variant map.`);
134
+ }
135
+ for (const [variant, block] of Object.entries(entry)) {
136
+ assertEnvelopeBlock(block, `sections.${sectionId}.${variant}`);
137
+ }
138
+ }
139
+ for (const key of ['pipeline_log', 'custom_calculations', 'custom_scenarios']) {
140
+ const collection = value[key];
141
+ if (!Array.isArray(collection)) {
142
+ throw new UWEnvelopeError('ENVELOPE_MISSING_COLLECTION', `${key} must be an array.`);
143
+ }
144
+ collection.forEach((block, index) => assertEnvelopeBlock(block, `${key}[${index}]`));
145
+ }
146
+ if (!isRecord(value['extensions'])) {
147
+ throw new UWEnvelopeError('ENVELOPE_MISSING_COLLECTION', 'extensions must be an object.');
148
+ }
149
+ for (const [id, block] of Object.entries(value['extensions'])) {
150
+ assertEnvelopeBlock(block, `extensions.${id}`);
151
+ }
152
+ if (!isRecord(value['superseded'])) {
153
+ throw new UWEnvelopeError('ENVELOPE_MISSING_COLLECTION', 'superseded must be an object.');
154
+ }
155
+ for (const [sectionId, blocks] of Object.entries(value['superseded'])) {
156
+ if (!Array.isArray(blocks)) {
157
+ throw new UWEnvelopeError('ENVELOPE_INVALID_SUPERSEDED', `superseded.${sectionId} must be an array.`);
158
+ }
159
+ blocks.forEach((block, index) => assertEnvelopeBlock(block, `superseded.${sectionId}[${index}]`));
160
+ }
161
+ const digest = value['semantic_digest'];
162
+ if (digest !== undefined && (typeof digest !== 'string' || !/^sha256:[0-9a-f]{64}$/.test(digest))) {
163
+ throw new UWEnvelopeError('ENVELOPE_INVALID_DIGEST', 'semantic_digest must be sha256 followed by 64 lowercase hex characters.');
164
+ }
165
+ }
166
+ function assertEnvelopeBlock(value, pointer) {
167
+ if (!isRecord(value) || !isRecord(value['annotation']) || !isRecord(value['content'])) {
168
+ throw new UWEnvelopeError('ENVELOPE_INVALID_BLOCK', `${pointer} is not a valid block.`);
169
+ }
170
+ if (typeof value['annotation']['section'] !== 'string') {
171
+ throw new UWEnvelopeError('ENVELOPE_INVALID_ANNOTATION', `${pointer}.annotation.section must be a string.`);
172
+ }
173
+ if (!isRecord(value['content']['_meta'])) {
174
+ throw new UWEnvelopeError('ENVELOPE_MISSING_META', `${pointer}.content._meta must be an object.`);
175
+ }
176
+ if (value['prose'] !== undefined && typeof value['prose'] !== 'string') {
177
+ throw new UWEnvelopeError('ENVELOPE_INVALID_PROSE', `${pointer}.prose must be a string.`);
178
+ }
179
+ }
180
+ function toEnvelopeBlock(block) {
181
+ const output = {
182
+ annotation: block.annotation,
183
+ content: block.content,
184
+ };
185
+ if (block.prose.length > 0)
186
+ output.prose = block.prose;
187
+ return output;
188
+ }
189
+ function fromEnvelopeBlock(block, pointer) {
190
+ if (!isRecord(block) || !isRecord(block.annotation) || !isRecord(block.content)) {
191
+ throw new UWEnvelopeError('ENVELOPE_INVALID_BLOCK', `${pointer} is not a valid block.`);
192
+ }
193
+ const meta = block.content['_meta'];
194
+ if (!isRecord(meta)) {
195
+ throw new UWEnvelopeError('ENVELOPE_MISSING_META', `${pointer}.content._meta must be an object.`);
196
+ }
197
+ return {
198
+ annotation: block.annotation,
199
+ meta: meta,
200
+ content: block.content,
201
+ prose: typeof block.prose === 'string' ? block.prose : '',
202
+ rawJson: JSON.stringify(block.content),
203
+ lineStart: 0,
204
+ lineEnd: 0,
205
+ };
206
+ }
207
+ function isVariantMap(entry) {
208
+ return isRecord(entry) && !('annotation' in entry);
209
+ }
210
+ function isRecord(value) {
211
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
212
+ }
213
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ export interface CurrencyOptions {
2
+ decimals?: number;
3
+ symbol?: string;
4
+ nullDisplay?: string;
5
+ }
6
+ export interface PercentOptions {
7
+ decimals?: number;
8
+ multiplier?: number;
9
+ suffix?: string;
10
+ nullDisplay?: string;
11
+ }
12
+ export interface RatioOptions {
13
+ decimals?: number;
14
+ suffix?: string;
15
+ nullDisplay?: string;
16
+ }
17
+ export interface CountOptions {
18
+ nullDisplay?: string;
19
+ }
20
+ export interface DateOptions {
21
+ style?: 'iso' | 'short' | 'medium' | 'long';
22
+ nullDisplay?: string;
23
+ locale?: string;
24
+ }
25
+ export interface NullOptions {
26
+ nullDisplay?: string;
27
+ }
28
+ /**
29
+ * Format a currency value. Default: $1,234,567 (no fractional digits).
30
+ * Pass `decimals: 2` for $1,234,567.00.
31
+ */
32
+ export declare function formatCurrency(value: unknown, opts?: CurrencyOptions): string;
33
+ /**
34
+ * Format a percentage. Default: input is a decimal (0.0551), output is "5.51%".
35
+ * Pass `multiplier: 1` if the input is already in percentage units.
36
+ */
37
+ export declare function formatPercent(value: unknown, opts?: PercentOptions): string;
38
+ /**
39
+ * Format a ratio/multiple. Default: 3 decimals + 'x' suffix → "1.109x".
40
+ * Pass `suffix: ''` for a plain decimal string with no suffix.
41
+ */
42
+ export declare function formatRatio(value: unknown, opts?: RatioOptions): string;
43
+ /**
44
+ * Format an integer count. No locale separators by default.
45
+ */
46
+ export declare function formatCount(value: unknown, opts?: CountOptions): string;
47
+ /**
48
+ * Format an ISO-8601 date string. Default style 'iso' returns the input unchanged.
49
+ * Other styles convert to a locale-formatted date.
50
+ */
51
+ export declare function formatDate(value: unknown, opts?: DateOptions): string;
52
+ /** Returns the configured null-display string. */
53
+ export declare function formatNull(opts?: NullOptions): string;
54
+ /** Format a percent for CSV: raw decimal × 100 with N digits, empty on null. */
55
+ export declare function formatPercentCsv(value: unknown, decimals?: number): string;
56
+ /** Format a number for CSV: raw value, empty on null. */
57
+ export declare function formatNumberCsv(value: unknown): string;
58
+ /** Coerce any value to a display string with null fallback. */
59
+ export declare function formatValue(value: unknown, opts?: NullOptions): string;
60
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAUD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,MAAM,CAW7E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,MAAM,CAO3E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAMvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAIvE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,CAarE;AAED,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,CAErD;AAMD,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAI,GAAG,MAAM,CAIrE;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAItD;AAID,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,CAGtE"}
package/dist/format.js ADDED
@@ -0,0 +1,115 @@
1
+ // Canonical display-formatting helpers for the .uw.md format.
2
+ // Pure functions, no I/O. The single source of truth referenced by the renderer
3
+ // and by Part III of UW_PROTOCOL_v1.md (Display Conventions).
4
+ //
5
+ // Conformance rationale: the protocol freezes 'en-US' as the v1 locale and
6
+ // fixes default precision per kind so any conforming implementer renders the
7
+ // same string for the same value.
8
+ const DEFAULT_NULL = 'n/a';
9
+ function toFiniteNumber(value) {
10
+ if (value == null)
11
+ return null;
12
+ const n = typeof value === 'number' ? value : Number(value);
13
+ return Number.isFinite(n) ? n : null;
14
+ }
15
+ /**
16
+ * Format a currency value. Default: $1,234,567 (no fractional digits).
17
+ * Pass `decimals: 2` for $1,234,567.00.
18
+ */
19
+ export function formatCurrency(value, opts) {
20
+ const n = toFiniteNumber(value);
21
+ if (n === null)
22
+ return opts?.nullDisplay ?? DEFAULT_NULL;
23
+ const symbol = opts?.symbol ?? '$';
24
+ if (opts?.decimals != null) {
25
+ return `${symbol}${n.toLocaleString('en-US', {
26
+ minimumFractionDigits: opts.decimals,
27
+ maximumFractionDigits: opts.decimals,
28
+ })}`;
29
+ }
30
+ return `${symbol}${n.toLocaleString('en-US')}`;
31
+ }
32
+ /**
33
+ * Format a percentage. Default: input is a decimal (0.0551), output is "5.51%".
34
+ * Pass `multiplier: 1` if the input is already in percentage units.
35
+ */
36
+ export function formatPercent(value, opts) {
37
+ const n = toFiniteNumber(value);
38
+ if (n === null)
39
+ return opts?.nullDisplay ?? DEFAULT_NULL;
40
+ const multiplier = opts?.multiplier ?? 100;
41
+ const decimals = opts?.decimals ?? 2;
42
+ const suffix = opts?.suffix ?? '%';
43
+ return `${(n * multiplier).toFixed(decimals)}${suffix}`;
44
+ }
45
+ /**
46
+ * Format a ratio/multiple. Default: 3 decimals + 'x' suffix → "1.109x".
47
+ * Pass `suffix: ''` for a plain decimal string with no suffix.
48
+ */
49
+ export function formatRatio(value, opts) {
50
+ const n = toFiniteNumber(value);
51
+ if (n === null)
52
+ return opts?.nullDisplay ?? DEFAULT_NULL;
53
+ const decimals = opts?.decimals ?? 3;
54
+ const suffix = opts?.suffix ?? 'x';
55
+ return `${n.toFixed(decimals)}${suffix}`;
56
+ }
57
+ /**
58
+ * Format an integer count. No locale separators by default.
59
+ */
60
+ export function formatCount(value, opts) {
61
+ const n = toFiniteNumber(value);
62
+ if (n === null)
63
+ return opts?.nullDisplay ?? DEFAULT_NULL;
64
+ return String(Math.trunc(n));
65
+ }
66
+ /**
67
+ * Format an ISO-8601 date string. Default style 'iso' returns the input unchanged.
68
+ * Other styles convert to a locale-formatted date.
69
+ */
70
+ export function formatDate(value, opts) {
71
+ if (value == null)
72
+ return opts?.nullDisplay ?? DEFAULT_NULL;
73
+ if (typeof value !== 'string')
74
+ return opts?.nullDisplay ?? DEFAULT_NULL;
75
+ const style = opts?.style ?? 'iso';
76
+ if (style === 'iso')
77
+ return value;
78
+ const d = new Date(value);
79
+ if (!Number.isFinite(d.getTime()))
80
+ return value;
81
+ const locale = opts?.locale ?? 'en-US';
82
+ const dtfOpts = style === 'short' ? { dateStyle: 'short' } :
83
+ style === 'medium' ? { dateStyle: 'medium' } :
84
+ { dateStyle: 'long' };
85
+ return d.toLocaleDateString(locale, dtfOpts);
86
+ }
87
+ /** Returns the configured null-display string. */
88
+ export function formatNull(opts) {
89
+ return opts?.nullDisplay ?? DEFAULT_NULL;
90
+ }
91
+ // ─── CSV-mode helpers ────────────────────────────────────────────────────────
92
+ // CSV cells use empty strings for null (not 'n/a') and emit raw numbers
93
+ // without currency symbols, percent signs, or ratio suffixes.
94
+ /** Format a percent for CSV: raw decimal × 100 with N digits, empty on null. */
95
+ export function formatPercentCsv(value, decimals = 4) {
96
+ const n = toFiniteNumber(value);
97
+ if (n === null)
98
+ return '';
99
+ return (n * 100).toFixed(decimals);
100
+ }
101
+ /** Format a number for CSV: raw value, empty on null. */
102
+ export function formatNumberCsv(value) {
103
+ const n = toFiniteNumber(value);
104
+ if (n === null)
105
+ return '';
106
+ return String(n);
107
+ }
108
+ // ─── Generic value coercion ──────────────────────────────────────────────────
109
+ /** Coerce any value to a display string with null fallback. */
110
+ export function formatValue(value, opts) {
111
+ if (value == null)
112
+ return opts?.nullDisplay ?? DEFAULT_NULL;
113
+ return String(value);
114
+ }
115
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
package/dist/gaps.d.ts ADDED
@@ -0,0 +1,62 @@
1
+ import type { DealStage, ParsedUWFile } from './types.js';
2
+ export type GapReason = 'missing' | 'illegible' | 'out_of_scope' | 'deferred' | 'blocked_by_dependency' | 'awaiting_external';
3
+ export interface GapItem {
4
+ section: string;
5
+ field_path?: string;
6
+ reason: GapReason;
7
+ blocks_stage?: DealStage;
8
+ first_seen?: string;
9
+ last_checked?: string;
10
+ owner?: string;
11
+ note?: string;
12
+ }
13
+ export interface GapSummary {
14
+ total_open: number;
15
+ blocking_current_stage: number;
16
+ blocking_next_stage: number;
17
+ }
18
+ export interface GapsContent {
19
+ items: GapItem[];
20
+ summary?: GapSummary;
21
+ }
22
+ export interface InferGapsOptions {
23
+ /** Stage to evaluate readiness against. Defaults to file's deal_stage,
24
+ * falling back to 'scope'. */
25
+ stage?: DealStage;
26
+ /** When true, merge with the existing `gaps` section instead of returning
27
+ * inferred items only. Dedup key = `(section, field_path ?? '')`. */
28
+ mergeWithExisting?: boolean;
29
+ /** Timestamp to stamp on `first_seen` / `last_checked` for newly inferred
30
+ * items. Defaults to `new Date().toISOString()`. */
31
+ now?: string;
32
+ /** When true, the item's `owner` is left undefined; when false (default),
33
+ * inferred items are assigned `agent/gaps-inferrer` as a provenance hint. */
34
+ unattributed?: boolean;
35
+ }
36
+ /**
37
+ * Walk the parsed file and produce a normalized list of GapItems by inspecting:
38
+ * - STAGE_REQUIREMENTS: required sections / field paths missing at the
39
+ * evaluated stage produce reason='missing'.
40
+ * - `_meta.provisional`: produces reason='deferred' (placeholder block).
41
+ * - `_meta.partial`: produces reason='missing' for the section as a whole,
42
+ * unless `field_overrides` enumerate specific paths (then one item per
43
+ * override with `reason='illegible'` for illegible, else 'missing').
44
+ * - `_meta.field_overrides[]` with reason='missing'|'illegible': one
45
+ * GapItem per entry.
46
+ *
47
+ * When `mergeWithExisting` is set, the existing `gaps` section is read and
48
+ * merged. Existing items win on dedup (their `first_seen`, `owner`, `note`
49
+ * are preserved); the inferrer only refreshes `last_checked`.
50
+ */
51
+ export declare function inferGaps(parsed: ParsedUWFile, opts?: InferGapsOptions): GapItem[];
52
+ /**
53
+ * Aggregate counts for fast pipeline routing. Mirrors the `summary` object in
54
+ * the gaps section schema (spec/schemas/section-gaps.schema.json).
55
+ */
56
+ export declare function summarizeGaps(items: readonly GapItem[], currentStage: DealStage): GapSummary;
57
+ /**
58
+ * Pull the typed content out of the file's `gaps` section. Returns null when
59
+ * the section is absent or malformed.
60
+ */
61
+ export declare function readGapsContent(parsed: ParsedUWFile): GapsContent | null;
62
+ //# sourceMappingURL=gaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gaps.d.ts","sourceRoot":"","sources":["../src/gaps.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAW,MAAM,YAAY,CAAC;AAEnE,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,WAAW,GACX,cAAc,GACd,UAAU,GACV,uBAAuB,GACvB,mBAAmB,CAAC;AAExB,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AA6BD,MAAM,WAAW,gBAAgB;IAC/B;mCAC+B;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;0EACsE;IACtE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;yDACqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;kFAC8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAmCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,EAAE,CA4JtF;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,UAAU,CAa5F;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,IAAI,CAMxE"}