@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.
- package/README.md +79 -0
- package/dist/agents/bancroft.d.ts +32 -0
- package/dist/agents/bancroft.d.ts.map +1 -0
- package/dist/agents/bancroft.js +292 -0
- package/dist/agents/bancroft.js.map +1 -0
- package/dist/agents/schemas.d.ts +13 -0
- package/dist/agents/schemas.d.ts.map +1 -0
- package/dist/agents/schemas.js +74 -0
- package/dist/agents/schemas.js.map +1 -0
- package/dist/bindings.d.ts +85 -0
- package/dist/bindings.d.ts.map +1 -0
- package/dist/bindings.js +293 -0
- package/dist/bindings.js.map +1 -0
- package/dist/browser.d.ts +66 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +53 -0
- package/dist/browser.js.map +1 -0
- package/dist/calc/builtins.d.ts +4 -0
- package/dist/calc/builtins.d.ts.map +1 -0
- package/dist/calc/builtins.js +329 -0
- package/dist/calc/builtins.js.map +1 -0
- package/dist/calc/dependencies.d.ts +34 -0
- package/dist/calc/dependencies.d.ts.map +1 -0
- package/dist/calc/dependencies.js +101 -0
- package/dist/calc/dependencies.js.map +1 -0
- package/dist/calc/errors.d.ts +8 -0
- package/dist/calc/errors.d.ts.map +1 -0
- package/dist/calc/errors.js +18 -0
- package/dist/calc/errors.js.map +1 -0
- package/dist/calc/evaluator.d.ts +5 -0
- package/dist/calc/evaluator.d.ts.map +1 -0
- package/dist/calc/evaluator.js +184 -0
- package/dist/calc/evaluator.js.map +1 -0
- package/dist/calc/index.d.ts +14 -0
- package/dist/calc/index.d.ts.map +1 -0
- package/dist/calc/index.js +56 -0
- package/dist/calc/index.js.map +1 -0
- package/dist/calc/parser.d.ts +32 -0
- package/dist/calc/parser.d.ts.map +1 -0
- package/dist/calc/parser.js +361 -0
- package/dist/calc/parser.js.map +1 -0
- package/dist/cascade.d.ts +85 -0
- package/dist/cascade.d.ts.map +1 -0
- package/dist/cascade.js +172 -0
- package/dist/cascade.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +843 -0
- package/dist/cli.js.map +1 -0
- package/dist/codec.d.ts +25 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +62 -0
- package/dist/codec.js.map +1 -0
- package/dist/codecs.d.ts +6 -0
- package/dist/codecs.d.ts.map +1 -0
- package/dist/codecs.js +12 -0
- package/dist/codecs.js.map +1 -0
- package/dist/compactor.d.ts +11 -0
- package/dist/compactor.d.ts.map +1 -0
- package/dist/compactor.js +84 -0
- package/dist/compactor.js.map +1 -0
- package/dist/context-profiles.d.ts +30 -0
- package/dist/context-profiles.d.ts.map +1 -0
- package/dist/context-profiles.js +225 -0
- package/dist/context-profiles.js.map +1 -0
- package/dist/context.d.ts +55 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +288 -0
- package/dist/context.js.map +1 -0
- package/dist/dcf.d.ts +9 -0
- package/dist/dcf.d.ts.map +1 -0
- package/dist/dcf.js +75 -0
- package/dist/dcf.js.map +1 -0
- package/dist/debt.d.ts +11 -0
- package/dist/debt.d.ts.map +1 -0
- package/dist/debt.js +85 -0
- package/dist/debt.js.map +1 -0
- package/dist/defaults.d.ts +104 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +622 -0
- package/dist/defaults.js.map +1 -0
- package/dist/derived.d.ts +17 -0
- package/dist/derived.d.ts.map +1 -0
- package/dist/derived.js +29 -0
- package/dist/derived.js.map +1 -0
- package/dist/editor.d.ts +76 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +502 -0
- package/dist/editor.js.map +1 -0
- package/dist/envelope.d.ts +51 -0
- package/dist/envelope.d.ts.map +1 -0
- package/dist/envelope.js +213 -0
- package/dist/envelope.js.map +1 -0
- package/dist/format.d.ts +60 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +115 -0
- package/dist/format.js.map +1 -0
- package/dist/gaps.d.ts +62 -0
- package/dist/gaps.d.ts.map +1 -0
- package/dist/gaps.js +272 -0
- package/dist/gaps.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +15 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +169 -0
- package/dist/init.js.map +1 -0
- package/dist/integrity-canonical.d.ts +17 -0
- package/dist/integrity-canonical.d.ts.map +1 -0
- package/dist/integrity-canonical.js +124 -0
- package/dist/integrity-canonical.js.map +1 -0
- package/dist/integrity.d.ts +54 -0
- package/dist/integrity.d.ts.map +1 -0
- package/dist/integrity.js +244 -0
- package/dist/integrity.js.map +1 -0
- package/dist/modules.d.ts +24 -0
- package/dist/modules.d.ts.map +1 -0
- package/dist/modules.js +322 -0
- package/dist/modules.js.map +1 -0
- package/dist/negotiation.d.ts +19 -0
- package/dist/negotiation.d.ts.map +1 -0
- package/dist/negotiation.js +70 -0
- package/dist/negotiation.js.map +1 -0
- package/dist/opstatement.d.ts +9 -0
- package/dist/opstatement.d.ts.map +1 -0
- package/dist/opstatement.js +80 -0
- package/dist/opstatement.js.map +1 -0
- package/dist/packs/excel-emit.d.ts +21 -0
- package/dist/packs/excel-emit.d.ts.map +1 -0
- package/dist/packs/excel-emit.js +135 -0
- package/dist/packs/excel-emit.js.map +1 -0
- package/dist/packs/index.d.ts +13 -0
- package/dist/packs/index.d.ts.map +1 -0
- package/dist/packs/index.js +37 -0
- package/dist/packs/index.js.map +1 -0
- package/dist/packs/industrial.d.ts +3 -0
- package/dist/packs/industrial.d.ts.map +1 -0
- package/dist/packs/industrial.js +115 -0
- package/dist/packs/industrial.js.map +1 -0
- package/dist/packs/multifamily.d.ts +3 -0
- package/dist/packs/multifamily.d.ts.map +1 -0
- package/dist/packs/multifamily.js +82 -0
- package/dist/packs/multifamily.js.map +1 -0
- package/dist/packs/office.d.ts +3 -0
- package/dist/packs/office.d.ts.map +1 -0
- package/dist/packs/office.js +108 -0
- package/dist/packs/office.js.map +1 -0
- package/dist/packs/retail.d.ts +3 -0
- package/dist/packs/retail.d.ts.map +1 -0
- package/dist/packs/retail.js +115 -0
- package/dist/packs/retail.js.map +1 -0
- package/dist/packs/self-storage.d.ts +3 -0
- package/dist/packs/self-storage.d.ts.map +1 -0
- package/dist/packs/self-storage.js +105 -0
- package/dist/packs/self-storage.js.map +1 -0
- package/dist/parser.d.ts +15 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +430 -0
- package/dist/parser.js.map +1 -0
- package/dist/protocol.d.ts +389 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +714 -0
- package/dist/protocol.js.map +1 -0
- package/dist/refinement.d.ts +63 -0
- package/dist/refinement.d.ts.map +1 -0
- package/dist/refinement.js +242 -0
- package/dist/refinement.js.map +1 -0
- package/dist/renderer.d.ts +22 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +478 -0
- package/dist/renderer.js.map +1 -0
- package/dist/rentroll.d.ts +21 -0
- package/dist/rentroll.d.ts.map +1 -0
- package/dist/rentroll.js +256 -0
- package/dist/rentroll.js.map +1 -0
- package/dist/report.d.ts +29 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +924 -0
- package/dist/report.js.map +1 -0
- package/dist/runner.d.ts +43 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +288 -0
- package/dist/runner.js.map +1 -0
- package/dist/sourcesuses.d.ts +14 -0
- package/dist/sourcesuses.d.ts.map +1 -0
- package/dist/sourcesuses.js +63 -0
- package/dist/sourcesuses.js.map +1 -0
- package/dist/types.d.ts +248 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/dist/uwcsv.d.ts +23 -0
- package/dist/uwcsv.d.ts.map +1 -0
- package/dist/uwcsv.js +877 -0
- package/dist/uwcsv.js.map +1 -0
- package/dist/uwjson.d.ts +19 -0
- package/dist/uwjson.d.ts.map +1 -0
- package/dist/uwjson.js +61 -0
- package/dist/uwjson.js.map +1 -0
- package/dist/uwxml.d.ts +18 -0
- package/dist/uwxml.d.ts.map +1 -0
- package/dist/uwxml.js +297 -0
- package/dist/uwxml.js.map +1 -0
- package/dist/validator.d.ts +35 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +553 -0
- package/dist/validator.js.map +1 -0
- package/dist/valuation.d.ts +9 -0
- package/dist/valuation.d.ts.map +1 -0
- package/dist/valuation.js +34 -0
- package/dist/valuation.js.map +1 -0
- package/package.json +58 -0
package/dist/derived.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Shared plumbing for deterministic "footing" of a section's stored totals from
|
|
2
|
+
// its line-item inputs. Used by rentroll.ts and opstatement.ts (and any future
|
|
3
|
+
// section model). A DerivedField is one footed total: where it is stored, how to
|
|
4
|
+
// label/format it, and its computed value.
|
|
5
|
+
//
|
|
6
|
+
// This is plain arithmetic over inputs — the same deterministic spirit as the
|
|
7
|
+
// calc packs, never AI math.
|
|
8
|
+
export function roundByKind(value, kind) {
|
|
9
|
+
if (kind === 'rate')
|
|
10
|
+
return Math.round(value * 1e4) / 1e4;
|
|
11
|
+
if (kind === 'psf')
|
|
12
|
+
return Math.round(value * 100) / 100;
|
|
13
|
+
return Math.round(value); // currency, count
|
|
14
|
+
}
|
|
15
|
+
/** Accumulates DerivedFields, silently dropping any non-finite result so partial
|
|
16
|
+
* data never writes NaN into the file. */
|
|
17
|
+
export function collector() {
|
|
18
|
+
const fields = [];
|
|
19
|
+
return {
|
|
20
|
+
fields,
|
|
21
|
+
add(path, label, kind, value) {
|
|
22
|
+
if (value == null || !Number.isFinite(value))
|
|
23
|
+
return;
|
|
24
|
+
fields.push({ path, label, kind, value: roundByKind(value, kind) });
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export const numOrNull = (v) => typeof v === 'number' && Number.isFinite(v) ? v : null;
|
|
29
|
+
//# sourceMappingURL=derived.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derived.js","sourceRoot":"","sources":["../src/derived.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AACjF,2CAA2C;AAC3C,EAAE;AACF,8EAA8E;AAC9E,6BAA6B;AAY7B,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,IAAiB;IAC1D,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAC1D,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB;AAC9C,CAAC;AAED;2CAC2C;AAC3C,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,OAAO;QACL,MAAM;QACN,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,IAAiB,EAAE,KAAoB;YACtE,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO;YACrD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAU,EAAiB,EAAE,CACrD,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC"}
|
package/dist/editor.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { ParsedUWFile } from './types.js';
|
|
2
|
+
import type { EditOperation, EditPolicy, ProtocolError } from './protocol.js';
|
|
3
|
+
/**
|
|
4
|
+
* Identity of the actor performing the edit. The dispatcher uses `source` to
|
|
5
|
+
* resolve an EditPolicy and to stamp `_meta.source` on the new block.
|
|
6
|
+
*/
|
|
7
|
+
export interface EditContext {
|
|
8
|
+
/** Human name, system identifier, or agent ID. Stamped on `_meta.actor`. */
|
|
9
|
+
actor: string;
|
|
10
|
+
/** Provenance pattern. Examples: "manual", "agent/L6", "document/rent_roll", "system/init", "institution/abc-bank". */
|
|
11
|
+
source: string;
|
|
12
|
+
/** Agent identifier when source begins with "agent/". */
|
|
13
|
+
agentId?: string | null;
|
|
14
|
+
/** Agent semver. */
|
|
15
|
+
agentVersion?: string | null;
|
|
16
|
+
/** Confidence to stamp on new blocks. Defaults to 'medium'. */
|
|
17
|
+
confidence?: 'high' | 'medium' | 'low';
|
|
18
|
+
/** Free-form `_meta.notes` for the new block. */
|
|
19
|
+
notes?: string;
|
|
20
|
+
/**
|
|
21
|
+
* SHA-256 content_hash of the section's current head, captured at read time.
|
|
22
|
+
* Required when the head carries `_meta.content_hash` AND the caller is
|
|
23
|
+
* editing through `applyEditAsync` with `integrity: true`. A mismatch with
|
|
24
|
+
* the live head triggers INT-02 (concurrent write detected).
|
|
25
|
+
*/
|
|
26
|
+
parentHash?: string | null;
|
|
27
|
+
}
|
|
28
|
+
export interface EditResult {
|
|
29
|
+
ok: boolean;
|
|
30
|
+
/** New file content if the edit applied. Undefined on failure. */
|
|
31
|
+
content?: string;
|
|
32
|
+
/** Protocol error if the edit was rejected. */
|
|
33
|
+
error?: ProtocolError;
|
|
34
|
+
/** Version assigned to the new block (section_* ops). */
|
|
35
|
+
newVersion?: number;
|
|
36
|
+
/** True if a prior block was marked superseded. */
|
|
37
|
+
supersededPriorBlock?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Optional behaviors that layer on top of the base edit. Currently:
|
|
41
|
+
* - `maintainGaps`: after a successful section or frontmatter edit, re-parse
|
|
42
|
+
* the file, recompute gaps via inferGaps(mergeWithExisting=true), and
|
|
43
|
+
* write the result back as the `gaps` section. The maintenance write is
|
|
44
|
+
* stamped with source='system/gaps-maintainer' so it can be filtered.
|
|
45
|
+
* Default: false. See FORMAT_SPEC §4.22.
|
|
46
|
+
*/
|
|
47
|
+
export interface EditOptions {
|
|
48
|
+
maintainGaps?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Enable content_hash chain enforcement (UW_PROTOCOL_v1.md §V.10):
|
|
51
|
+
* - If the section's current head has `_meta.content_hash`, the caller's
|
|
52
|
+
* `EditContext.parentHash` MUST equal it (else INT-02).
|
|
53
|
+
* - The new block is stamped with `parent_hash = prior.content_hash`.
|
|
54
|
+
* - The new block's `content_hash` is computed and stamped.
|
|
55
|
+
* No effect when the prior head carries no content_hash (chain stays opt-out).
|
|
56
|
+
*
|
|
57
|
+
* Only honored by `applyEditAsync` (hashing requires async crypto APIs).
|
|
58
|
+
*/
|
|
59
|
+
integrity?: boolean;
|
|
60
|
+
}
|
|
61
|
+
export declare function applyEdit(fileContent: string, parsed: ParsedUWFile, op: EditOperation, ctx: EditContext, policies?: readonly EditPolicy[], options?: EditOptions): EditResult;
|
|
62
|
+
/**
|
|
63
|
+
* Async wrapper around `applyEdit` that adds content_hash chain stamping when
|
|
64
|
+
* `options.integrity` is set AND the section's prior head carried a
|
|
65
|
+
* `content_hash`. Otherwise behaves identically to `applyEdit`.
|
|
66
|
+
*
|
|
67
|
+
* Hashing is async because Web Crypto's SHA-256 is async; this preserves the
|
|
68
|
+
* sync `applyEdit` API surface for callers that don't need integrity.
|
|
69
|
+
*/
|
|
70
|
+
export declare function applyEditAsync(fileContent: string, parsed: ParsedUWFile, op: EditOperation, ctx: EditContext, policies?: readonly EditPolicy[], options?: EditOptions): Promise<EditResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Resolve the most-specific policy for a given source string. Specificity is
|
|
73
|
+
* "longer pattern wins"; an exact (non-glob) match always wins.
|
|
74
|
+
*/
|
|
75
|
+
export declare function resolvePolicy(source: string, policies?: readonly EditPolicy[]): EditPolicy | null;
|
|
76
|
+
//# sourceMappingURL=editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAEV,aAAa,EACb,UAAU,EACV,aAAa,EACd,MAAM,eAAe,CAAC;AASvB;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,uHAAuH;IACvH,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvC,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAaD;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,YAAY,EACpB,EAAE,EAAE,aAAa,EACjB,GAAG,EAAE,WAAW,EAChB,QAAQ,GAAE,SAAS,UAAU,EAA0B,EACvD,OAAO,GAAE,WAAgB,GACxB,UAAU,CA8BZ;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,YAAY,EACpB,EAAE,EAAE,aAAa,EACjB,GAAG,EAAE,WAAW,EAChB,QAAQ,GAAE,SAAS,UAAU,EAA0B,EACvD,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAoBrB;AAgXD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,SAAS,UAAU,EAA0B,GACtD,UAAU,GAAG,IAAI,CAQnB"}
|
package/dist/editor.js
ADDED
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
// Tier-2 Editor — applyEdit() dispatcher for the four EditOperation kinds
|
|
2
|
+
// defined in protocol.ts (UW_PROTOCOL_v1.md §V.2):
|
|
3
|
+
//
|
|
4
|
+
// - frontmatter_set
|
|
5
|
+
// - section_replace
|
|
6
|
+
// - section_supersede
|
|
7
|
+
// - pipeline_log_append
|
|
8
|
+
//
|
|
9
|
+
// Honors BUILTIN_EDIT_POLICIES authority + supersede_on_edit semantics
|
|
10
|
+
// (UW_PROTOCOL_v1.md §V.3) and protects the immutable frontmatter fields
|
|
11
|
+
// from §V.6 (uw_version, deal_id, created).
|
|
12
|
+
//
|
|
13
|
+
// Pure: no I/O. The runner consumes the returned content string and the
|
|
14
|
+
// caller writes it back to disk.
|
|
15
|
+
import { BUILTIN_EDIT_POLICIES } from './protocol.js';
|
|
16
|
+
import { getSection, getSectionVariant, parseUWFile } from './parser.js';
|
|
17
|
+
import { buildMeta } from './runner.js';
|
|
18
|
+
import { inferGaps, summarizeGaps } from './gaps.js';
|
|
19
|
+
import { computeBlockHash } from './integrity.js';
|
|
20
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
21
|
+
/** Frontmatter fields that MUST NOT be modified post-init (UW_PROTOCOL_v1.md §V.6). */
|
|
22
|
+
const IMMUTABLE_FRONTMATTER_FIELDS = [
|
|
23
|
+
'uw_version',
|
|
24
|
+
'deal_id',
|
|
25
|
+
'created',
|
|
26
|
+
];
|
|
27
|
+
export function applyEdit(fileContent, parsed, op, ctx, policies = BUILTIN_EDIT_POLICIES, options = {}) {
|
|
28
|
+
// INT-02: stale parent hash detection (sync portion). When the section head
|
|
29
|
+
// carries content_hash, ctx.parentHash must match it. The async stamping of
|
|
30
|
+
// the new block's content_hash happens in applyEditAsync.
|
|
31
|
+
if ((op.kind === 'section_replace' || op.kind === 'section_supersede')) {
|
|
32
|
+
const head = lookupSection(parsed, op.section_id, op.variant);
|
|
33
|
+
const headHash = head?.meta?.content_hash;
|
|
34
|
+
if (headHash && ctx.parentHash != null && ctx.parentHash !== headHash) {
|
|
35
|
+
return {
|
|
36
|
+
ok: false,
|
|
37
|
+
error: protoError('INT-02', `Stale parent_hash for '${op.section_id}': caller-supplied '${ctx.parentHash}' does not match current head '${headHash}'. Re-read and retry.`, op.section_id),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const result = dispatchEdit(fileContent, parsed, op, ctx, policies);
|
|
42
|
+
if (!result.ok || !result.content)
|
|
43
|
+
return result;
|
|
44
|
+
// Skip gap maintenance when this very edit is itself the gaps maintenance
|
|
45
|
+
// write — prevents infinite recursion.
|
|
46
|
+
const isGapsWrite = (op.kind === 'section_replace' || op.kind === 'section_supersede') &&
|
|
47
|
+
op.section_id === 'gaps';
|
|
48
|
+
if (!options.maintainGaps || isGapsWrite)
|
|
49
|
+
return result;
|
|
50
|
+
return maintainGapsAfterEdit(result, policies);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Async wrapper around `applyEdit` that adds content_hash chain stamping when
|
|
54
|
+
* `options.integrity` is set AND the section's prior head carried a
|
|
55
|
+
* `content_hash`. Otherwise behaves identically to `applyEdit`.
|
|
56
|
+
*
|
|
57
|
+
* Hashing is async because Web Crypto's SHA-256 is async; this preserves the
|
|
58
|
+
* sync `applyEdit` API surface for callers that don't need integrity.
|
|
59
|
+
*/
|
|
60
|
+
export async function applyEditAsync(fileContent, parsed, op, ctx, policies = BUILTIN_EDIT_POLICIES, options = {}) {
|
|
61
|
+
const result = applyEdit(fileContent, parsed, op, ctx, policies, options);
|
|
62
|
+
if (!result.ok || !result.content || !options.integrity)
|
|
63
|
+
return result;
|
|
64
|
+
if (op.kind !== 'section_replace' && op.kind !== 'section_supersede')
|
|
65
|
+
return result;
|
|
66
|
+
const priorHead = lookupSection(parsed, op.section_id, op.variant);
|
|
67
|
+
const priorHash = priorHead?.meta?.content_hash;
|
|
68
|
+
if (!priorHash)
|
|
69
|
+
return result; // chain stays opt-out when prior is unhashed
|
|
70
|
+
const reparsed = parseUWFile(result.content);
|
|
71
|
+
const newHead = lookupSection(reparsed, op.section_id, op.variant);
|
|
72
|
+
if (!newHead)
|
|
73
|
+
return result;
|
|
74
|
+
// Stamp parent_hash + content_hash on the new head.
|
|
75
|
+
newHead.meta.parent_hash = priorHash;
|
|
76
|
+
// Compute over the block (canonicalizer strips content_hash itself).
|
|
77
|
+
newHead.meta.content_hash = await computeBlockHash(newHead);
|
|
78
|
+
const stamped = restampBlockMeta(result.content, newHead);
|
|
79
|
+
return { ...result, content: stamped };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Re-emit a single block in `content` with a fresh _meta payload. Locates the
|
|
83
|
+
* block by lineStart/lineEnd from the parsed AST and rewrites only that range.
|
|
84
|
+
*/
|
|
85
|
+
function restampBlockMeta(content, block) {
|
|
86
|
+
const lines = content.split('\n');
|
|
87
|
+
const fence = lines[block.lineStart - 1] ?? '';
|
|
88
|
+
const closing = lines[block.lineEnd - 1] ?? '```';
|
|
89
|
+
const updatedContent = { ...block.content, _meta: block.meta };
|
|
90
|
+
const json = JSON.stringify(updatedContent, null, 2);
|
|
91
|
+
const before = lines.slice(0, block.lineStart - 1);
|
|
92
|
+
const after = lines.slice(block.lineEnd);
|
|
93
|
+
return [...before, fence, ...json.split('\n'), closing, ...after].join('\n');
|
|
94
|
+
}
|
|
95
|
+
function dispatchEdit(fileContent, parsed, op, ctx, policies) {
|
|
96
|
+
switch (op.kind) {
|
|
97
|
+
case 'frontmatter_set':
|
|
98
|
+
return applyFrontmatterSet(fileContent, op, ctx);
|
|
99
|
+
case 'section_replace':
|
|
100
|
+
return applySectionReplace(fileContent, parsed, op, ctx, policies);
|
|
101
|
+
case 'section_supersede':
|
|
102
|
+
return applySectionSupersede(fileContent, parsed, op, ctx, policies);
|
|
103
|
+
case 'pipeline_log_append':
|
|
104
|
+
return applyPipelineLogAppend(fileContent, parsed, op);
|
|
105
|
+
default: {
|
|
106
|
+
// Exhaustive check — TS will flag a new EditOperation kind that isn't routed.
|
|
107
|
+
const _exhaustive = op;
|
|
108
|
+
void _exhaustive;
|
|
109
|
+
return {
|
|
110
|
+
ok: false,
|
|
111
|
+
error: protoError('PROTO-EDIT-007', `Unknown EditOperation kind: ${op.kind}`),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function maintainGapsAfterEdit(prior, policies) {
|
|
117
|
+
if (!prior.content)
|
|
118
|
+
return prior;
|
|
119
|
+
let reparsed;
|
|
120
|
+
try {
|
|
121
|
+
reparsed = parseUWFile(prior.content);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// If the edit produced unparseable output, surface the original result.
|
|
125
|
+
// The caller is expected to validate before persisting anyway.
|
|
126
|
+
return prior;
|
|
127
|
+
}
|
|
128
|
+
const stage = reparsed.frontmatter.deal_stage ?? 'scope';
|
|
129
|
+
const items = inferGaps(reparsed, { mergeWithExisting: true, stage });
|
|
130
|
+
const summary = summarizeGaps(items, stage);
|
|
131
|
+
const gapsContent = { items, summary };
|
|
132
|
+
const existing = getSection(reparsed, 'gaps');
|
|
133
|
+
const ctx = {
|
|
134
|
+
actor: 'system/gaps-maintainer',
|
|
135
|
+
source: 'system/gaps-maintainer',
|
|
136
|
+
confidence: 'high',
|
|
137
|
+
notes: 'Auto-maintained by editor; see FORMAT_SPEC §4.22.',
|
|
138
|
+
};
|
|
139
|
+
const op = existing
|
|
140
|
+
? {
|
|
141
|
+
kind: 'section_replace',
|
|
142
|
+
section_id: 'gaps',
|
|
143
|
+
content: gapsContent,
|
|
144
|
+
meta: { confidence: 'high' },
|
|
145
|
+
}
|
|
146
|
+
: {
|
|
147
|
+
kind: 'section_supersede',
|
|
148
|
+
section_id: 'gaps',
|
|
149
|
+
content: gapsContent,
|
|
150
|
+
meta: { confidence: 'high' },
|
|
151
|
+
};
|
|
152
|
+
const after = dispatchEdit(prior.content, reparsed, op, ctx, policies);
|
|
153
|
+
if (!after.ok)
|
|
154
|
+
return prior; // best-effort: if maintenance fails, keep the prior result
|
|
155
|
+
return { ...prior, content: after.content };
|
|
156
|
+
}
|
|
157
|
+
// ─── frontmatter_set ──────────────────────────────────────────────────────────
|
|
158
|
+
function applyFrontmatterSet(fileContent, op, _ctx) {
|
|
159
|
+
const { path, value } = op;
|
|
160
|
+
const top = path.split('.')[0];
|
|
161
|
+
if (IMMUTABLE_FRONTMATTER_FIELDS.includes(top)) {
|
|
162
|
+
return {
|
|
163
|
+
ok: false,
|
|
164
|
+
error: protoError('PROTO-EDIT-002', `Frontmatter field '${top}' is immutable post-init (UW_PROTOCOL_v1.md §V.6).`, path),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const segments = path.split('.');
|
|
168
|
+
if (segments.length > 2) {
|
|
169
|
+
return {
|
|
170
|
+
ok: false,
|
|
171
|
+
error: protoError('PROTO-EDIT-003', `Frontmatter dot-paths deeper than 2 levels are not supported in v1; got '${path}'.`, path),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const now = new Date().toISOString();
|
|
175
|
+
const yamlValue = serializeYamlScalar(value);
|
|
176
|
+
if (yamlValue === null) {
|
|
177
|
+
return {
|
|
178
|
+
ok: false,
|
|
179
|
+
error: protoError('PROTO-EDIT-008', `Cannot serialize value for path '${path}'; only scalars and arrays of scalars are supported in v1.`, path),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
let updated;
|
|
183
|
+
if (segments.length === 1) {
|
|
184
|
+
const next = setFrontmatterTopLevel(fileContent, segments[0], yamlValue);
|
|
185
|
+
if (next === null) {
|
|
186
|
+
return {
|
|
187
|
+
ok: false,
|
|
188
|
+
error: protoError('PROTO-EDIT-009', `Frontmatter key '${segments[0]}' not found.`, path),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
updated = next;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
const next = setFrontmatterNested(fileContent, segments[0], segments[1], yamlValue);
|
|
195
|
+
if (next === null) {
|
|
196
|
+
return {
|
|
197
|
+
ok: false,
|
|
198
|
+
error: protoError('PROTO-EDIT-009', `Frontmatter path '${path}' not found.`, path),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
updated = next;
|
|
202
|
+
}
|
|
203
|
+
// last_modified always bumped (§V.6) — unless the edit *was* last_modified.
|
|
204
|
+
if (top !== 'last_modified') {
|
|
205
|
+
const stamped = setFrontmatterTopLevel(updated, 'last_modified', `"${now}"`);
|
|
206
|
+
if (stamped !== null)
|
|
207
|
+
updated = stamped;
|
|
208
|
+
}
|
|
209
|
+
return { ok: true, content: updated };
|
|
210
|
+
}
|
|
211
|
+
// ─── section_replace ──────────────────────────────────────────────────────────
|
|
212
|
+
function applySectionReplace(fileContent, parsed, op, ctx, policies) {
|
|
213
|
+
const existing = lookupSection(parsed, op.section_id, op.variant);
|
|
214
|
+
if (!existing) {
|
|
215
|
+
return {
|
|
216
|
+
ok: false,
|
|
217
|
+
error: protoError('PROTO-EDIT-005', `Cannot section_replace '${op.section_id}'${op.variant ? ` variant=${op.variant}` : ''}: section not found. Use section_supersede or write a new section.`, op.section_id),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const existingSource = existing.meta?.source ?? 'manual';
|
|
221
|
+
const policy = resolvePolicy(existingSource, policies);
|
|
222
|
+
const auth = checkAuthority(ctx.source, policy);
|
|
223
|
+
if (!auth.ok) {
|
|
224
|
+
return {
|
|
225
|
+
ok: false,
|
|
226
|
+
error: protoError('PROTO-EDIT-001', auth.message, op.section_id),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
if (policy?.supersede_on_edit) {
|
|
230
|
+
return {
|
|
231
|
+
ok: false,
|
|
232
|
+
error: protoError('PROTO-EDIT-004', `Source '${existingSource}' requires supersede_on_edit; use section_supersede for '${op.section_id}'.`, op.section_id),
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const newVersion = (existing.meta?.version ?? 0) + 1;
|
|
236
|
+
const now = new Date().toISOString();
|
|
237
|
+
const meta = buildMeta(op.section_id, newVersion, {
|
|
238
|
+
source: ctx.source,
|
|
239
|
+
agentId: ctx.agentId ?? undefined,
|
|
240
|
+
agentVersion: ctx.agentVersion ?? undefined,
|
|
241
|
+
actor: ctx.actor,
|
|
242
|
+
confidence: ctx.confidence ?? 'medium',
|
|
243
|
+
notes: ctx.notes,
|
|
244
|
+
});
|
|
245
|
+
// buildMeta uses Date.now() — pin to the timestamp that frontmatter is also bumped to.
|
|
246
|
+
meta.timestamp = now;
|
|
247
|
+
// Allow the operation's `meta` partial to override scalar fields (e.g. flags, confidence).
|
|
248
|
+
const finalMeta = { ...meta, ...op.meta, version: newVersion, superseded: false };
|
|
249
|
+
const blockContent = stripReservedKeys(op.content);
|
|
250
|
+
blockContent['_meta'] = finalMeta;
|
|
251
|
+
const annotation = buildFenceAnnotation(op.section_id, op.variant, ctx.source, now, newVersion, finalMeta.confidence);
|
|
252
|
+
const blockJson = JSON.stringify(blockContent, null, 2);
|
|
253
|
+
const newBlockText = `${annotation}\n${blockJson}\n\`\`\``;
|
|
254
|
+
const lines = fileContent.split('\n');
|
|
255
|
+
const before = lines.slice(0, existing.lineStart - 1);
|
|
256
|
+
const after = lines.slice(existing.lineEnd);
|
|
257
|
+
const replaced = [...before, ...newBlockText.split('\n'), ...after].join('\n');
|
|
258
|
+
const stamped = setFrontmatterTopLevel(replaced, 'last_modified', `"${now}"`) ?? replaced;
|
|
259
|
+
return { ok: true, content: stamped, newVersion, supersededPriorBlock: false };
|
|
260
|
+
}
|
|
261
|
+
// ─── section_supersede ────────────────────────────────────────────────────────
|
|
262
|
+
function applySectionSupersede(fileContent, parsed, op, ctx, policies) {
|
|
263
|
+
const existing = lookupSection(parsed, op.section_id, op.variant);
|
|
264
|
+
if (existing) {
|
|
265
|
+
const existingSource = existing.meta?.source ?? 'manual';
|
|
266
|
+
const policy = resolvePolicy(existingSource, policies);
|
|
267
|
+
const auth = checkAuthority(ctx.source, policy);
|
|
268
|
+
if (!auth.ok) {
|
|
269
|
+
return {
|
|
270
|
+
ok: false,
|
|
271
|
+
error: protoError('PROTO-EDIT-001', auth.message, op.section_id),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// No existing block → new section. Allowed regardless of policy.
|
|
276
|
+
const newVersion = (existing?.meta?.version ?? 0) + 1;
|
|
277
|
+
const now = new Date().toISOString();
|
|
278
|
+
const meta = buildMeta(op.section_id, newVersion, {
|
|
279
|
+
source: ctx.source,
|
|
280
|
+
agentId: ctx.agentId ?? undefined,
|
|
281
|
+
agentVersion: ctx.agentVersion ?? undefined,
|
|
282
|
+
actor: ctx.actor,
|
|
283
|
+
confidence: ctx.confidence ?? 'medium',
|
|
284
|
+
notes: ctx.notes,
|
|
285
|
+
});
|
|
286
|
+
meta.timestamp = now;
|
|
287
|
+
const finalMeta = { ...meta, ...op.meta, version: newVersion, superseded: false };
|
|
288
|
+
const blockContent = stripReservedKeys(op.content);
|
|
289
|
+
blockContent['_meta'] = finalMeta;
|
|
290
|
+
let lines = fileContent.split('\n');
|
|
291
|
+
let supersededPriorBlock = false;
|
|
292
|
+
if (existing && !existing.meta?.superseded) {
|
|
293
|
+
lines = markBlockSuperseded(lines, existing);
|
|
294
|
+
supersededPriorBlock = true;
|
|
295
|
+
}
|
|
296
|
+
const annotation = buildFenceAnnotation(op.section_id, op.variant, ctx.source, now, newVersion, finalMeta.confidence);
|
|
297
|
+
const blockJson = JSON.stringify(blockContent, null, 2);
|
|
298
|
+
const newBlockText = `${annotation}\n${blockJson}\n\`\`\``;
|
|
299
|
+
// Re-parse after marking superseded so insertion point math is current.
|
|
300
|
+
const reparsedAfterMark = parseUWFile(lines.join('\n'));
|
|
301
|
+
const insertAt = findInsertionPoint(lines, reparsedAfterMark);
|
|
302
|
+
lines.splice(insertAt, 0, '', newBlockText, '');
|
|
303
|
+
const stamped = setFrontmatterTopLevel(lines.join('\n'), 'last_modified', `"${now}"`) ?? lines.join('\n');
|
|
304
|
+
return { ok: true, content: stamped, newVersion, supersededPriorBlock };
|
|
305
|
+
}
|
|
306
|
+
// ─── pipeline_log_append ──────────────────────────────────────────────────────
|
|
307
|
+
function applyPipelineLogAppend(fileContent, parsed, op) {
|
|
308
|
+
if (parsed.pipeline_log.length === 0) {
|
|
309
|
+
return {
|
|
310
|
+
ok: false,
|
|
311
|
+
error: protoError('PROTO-EDIT-006', 'No pipeline_log block exists to append to. Initialize one via the runner or create the section first.', 'pipeline_log'),
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
const lastLogBlock = parsed.pipeline_log[parsed.pipeline_log.length - 1];
|
|
315
|
+
let blockContent;
|
|
316
|
+
try {
|
|
317
|
+
blockContent = JSON.parse(lastLogBlock.rawJson);
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return {
|
|
321
|
+
ok: false,
|
|
322
|
+
error: protoError('PROTO-EDIT-006', 'pipeline_log block JSON is malformed; cannot append entry.', 'pipeline_log'),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
const entries = blockContent['entries'] ?? [];
|
|
326
|
+
entries.push(op.entry);
|
|
327
|
+
blockContent['entries'] = entries;
|
|
328
|
+
const now = new Date().toISOString();
|
|
329
|
+
const meta = blockContent['_meta'] ?? {};
|
|
330
|
+
meta['version'] = (meta['version'] ?? 1) + 1;
|
|
331
|
+
meta['timestamp'] = now;
|
|
332
|
+
blockContent['_meta'] = meta;
|
|
333
|
+
const updatedJson = JSON.stringify(blockContent, null, 2);
|
|
334
|
+
const lines = fileContent.split('\n');
|
|
335
|
+
const newAnnotation = (lines[lastLogBlock.lineStart - 1] ?? '')
|
|
336
|
+
.replace(/\bv=\d+/, `v=${meta['version']}`)
|
|
337
|
+
.replace(/\bts=\S+/, `ts=${now}`);
|
|
338
|
+
lines.splice(lastLogBlock.lineStart - 1, lastLogBlock.lineEnd - lastLogBlock.lineStart + 1, newAnnotation, updatedJson, '```');
|
|
339
|
+
const stamped = setFrontmatterTopLevel(lines.join('\n'), 'last_modified', `"${now}"`) ?? lines.join('\n');
|
|
340
|
+
return { ok: true, content: stamped };
|
|
341
|
+
}
|
|
342
|
+
// ─── Policy + authority resolution ────────────────────────────────────────────
|
|
343
|
+
/**
|
|
344
|
+
* Resolve the most-specific policy for a given source string. Specificity is
|
|
345
|
+
* "longer pattern wins"; an exact (non-glob) match always wins.
|
|
346
|
+
*/
|
|
347
|
+
export function resolvePolicy(source, policies = BUILTIN_EDIT_POLICIES) {
|
|
348
|
+
let best = null;
|
|
349
|
+
for (const policy of policies) {
|
|
350
|
+
const m = matchSource(source, policy.source_pattern);
|
|
351
|
+
if (!m.matched)
|
|
352
|
+
continue;
|
|
353
|
+
if (!best || m.score > best.score)
|
|
354
|
+
best = { policy, score: m.score };
|
|
355
|
+
}
|
|
356
|
+
return best ? best.policy : null;
|
|
357
|
+
}
|
|
358
|
+
function matchSource(source, pattern) {
|
|
359
|
+
if (pattern === source)
|
|
360
|
+
return { matched: true, score: 1_000_000 };
|
|
361
|
+
if (!pattern.includes('*'))
|
|
362
|
+
return { matched: false, score: 0 };
|
|
363
|
+
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
|
|
364
|
+
const re = new RegExp(`^${escaped}$`);
|
|
365
|
+
if (re.test(source))
|
|
366
|
+
return { matched: true, score: pattern.length };
|
|
367
|
+
return { matched: false, score: 0 };
|
|
368
|
+
}
|
|
369
|
+
function checkAuthority(actorSource, policy) {
|
|
370
|
+
if (!policy)
|
|
371
|
+
return { ok: true };
|
|
372
|
+
const isSystem = actorSource.startsWith('system/') || actorSource.startsWith('institution/');
|
|
373
|
+
const isAgent = actorSource.startsWith('agent/');
|
|
374
|
+
const isHuman = !isSystem && !isAgent;
|
|
375
|
+
const allowed = (auth) => {
|
|
376
|
+
switch (auth) {
|
|
377
|
+
case 'either':
|
|
378
|
+
return true;
|
|
379
|
+
case 'system_only':
|
|
380
|
+
return isSystem;
|
|
381
|
+
case 'agent_only':
|
|
382
|
+
return isAgent;
|
|
383
|
+
case 'human_only':
|
|
384
|
+
return isHuman;
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
if (allowed(policy.authority))
|
|
388
|
+
return { ok: true };
|
|
389
|
+
return {
|
|
390
|
+
ok: false,
|
|
391
|
+
message: `Actor source '${actorSource}' is not permitted under policy authority '${policy.authority}' for source pattern '${policy.source_pattern}'.`,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
395
|
+
function lookupSection(parsed, sectionId, variant) {
|
|
396
|
+
return variant
|
|
397
|
+
? getSectionVariant(parsed, sectionId, variant)
|
|
398
|
+
: getSection(parsed, sectionId);
|
|
399
|
+
}
|
|
400
|
+
function buildFenceAnnotation(sectionId, variant, source, ts, version, confidence) {
|
|
401
|
+
const variantPart = variant ? ` variant=${variant}` : '';
|
|
402
|
+
return `\`\`\`json uw:section=${sectionId}${variantPart} source=${source} ts=${ts} v=${version} confidence=${confidence}`;
|
|
403
|
+
}
|
|
404
|
+
function stripReservedKeys(content) {
|
|
405
|
+
// The dispatcher constructs canonical _meta. Drop any caller-supplied _meta
|
|
406
|
+
// or _notes from `content` to mirror Tier-4's _meta substitution rule
|
|
407
|
+
// (UW_PROTOCOL_v1.md §IX.4) — same logic, applied at Tier-2.
|
|
408
|
+
const { _meta: _drop1, _notes: _drop2, ...rest } = content;
|
|
409
|
+
void _drop1;
|
|
410
|
+
void _drop2;
|
|
411
|
+
return { ...rest };
|
|
412
|
+
}
|
|
413
|
+
function markBlockSuperseded(lines, block) {
|
|
414
|
+
const result = [...lines];
|
|
415
|
+
const fenceIdx = block.lineStart - 1;
|
|
416
|
+
if (fenceIdx >= 0 && fenceIdx < result.length) {
|
|
417
|
+
const fenceLine = result[fenceIdx];
|
|
418
|
+
if (fenceLine && !fenceLine.includes('superseded=true')) {
|
|
419
|
+
result[fenceIdx] = fenceLine.replace(/^(```json\s+uw:section=\S+(?:\s+variant=\S+)?)/, '$1 superseded=true');
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
for (let i = block.lineStart; i < block.lineEnd - 1; i++) {
|
|
423
|
+
const line = result[i];
|
|
424
|
+
if (line?.includes('"superseded": false')) {
|
|
425
|
+
result[i] = line.replace('"superseded": false', '"superseded": true');
|
|
426
|
+
break;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return result;
|
|
430
|
+
}
|
|
431
|
+
function findInsertionPoint(lines, parsed) {
|
|
432
|
+
if (parsed.pipeline_log.length > 0) {
|
|
433
|
+
const firstLogBlock = parsed.pipeline_log[0];
|
|
434
|
+
let idx = firstLogBlock.lineStart - 2;
|
|
435
|
+
while (idx > 0 && lines[idx]?.trim() === '')
|
|
436
|
+
idx--;
|
|
437
|
+
if (lines[idx]?.trim().startsWith('##'))
|
|
438
|
+
idx--;
|
|
439
|
+
while (idx > 0 && lines[idx - 1]?.trim() === '')
|
|
440
|
+
idx--;
|
|
441
|
+
return idx + 1;
|
|
442
|
+
}
|
|
443
|
+
return lines.length;
|
|
444
|
+
}
|
|
445
|
+
// ─── Frontmatter setters ──────────────────────────────────────────────────────
|
|
446
|
+
function setFrontmatterTopLevel(content, key, yamlValue) {
|
|
447
|
+
const fmEnd = content.indexOf('\n---', 4);
|
|
448
|
+
if (fmEnd === -1)
|
|
449
|
+
return null;
|
|
450
|
+
const fm = content.slice(0, fmEnd);
|
|
451
|
+
const rest = content.slice(fmEnd);
|
|
452
|
+
const pattern = new RegExp(`^(${escapeRegex(key)}:\\s*)(.+)$`, 'm');
|
|
453
|
+
if (!pattern.test(fm))
|
|
454
|
+
return null;
|
|
455
|
+
return fm.replace(pattern, `$1${yamlValue}`) + rest;
|
|
456
|
+
}
|
|
457
|
+
function setFrontmatterNested(content, parentKey, childKey, yamlValue) {
|
|
458
|
+
const fmEnd = content.indexOf('\n---', 4);
|
|
459
|
+
if (fmEnd === -1)
|
|
460
|
+
return null;
|
|
461
|
+
const fm = content.slice(0, fmEnd);
|
|
462
|
+
const rest = content.slice(fmEnd);
|
|
463
|
+
const parentIdx = fm.indexOf(`\n${parentKey}:`);
|
|
464
|
+
if (parentIdx === -1)
|
|
465
|
+
return null;
|
|
466
|
+
const pattern = new RegExp(`(\\n${escapeRegex(parentKey)}:[^\\n]*(?:\\n [^\\n]+)*\\n ${escapeRegex(childKey)}:\\s*)([^\\n]+)`);
|
|
467
|
+
if (!pattern.test(fm))
|
|
468
|
+
return null;
|
|
469
|
+
return fm.replace(pattern, `$1${yamlValue}`) + rest;
|
|
470
|
+
}
|
|
471
|
+
function escapeRegex(str) {
|
|
472
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Serialize a JS scalar/array into its YAML literal form for inline frontmatter
|
|
476
|
+
* substitution. Returns null if the value is too complex for v1 (objects).
|
|
477
|
+
*/
|
|
478
|
+
function serializeYamlScalar(value) {
|
|
479
|
+
if (value === null || value === undefined)
|
|
480
|
+
return 'null';
|
|
481
|
+
if (typeof value === 'string')
|
|
482
|
+
return JSON.stringify(value); // double-quoted
|
|
483
|
+
if (typeof value === 'number')
|
|
484
|
+
return Number.isFinite(value) ? String(value) : 'null';
|
|
485
|
+
if (typeof value === 'boolean')
|
|
486
|
+
return value ? 'true' : 'false';
|
|
487
|
+
if (Array.isArray(value)) {
|
|
488
|
+
const parts = [];
|
|
489
|
+
for (const el of value) {
|
|
490
|
+
const s = serializeYamlScalar(el);
|
|
491
|
+
if (s === null)
|
|
492
|
+
return null;
|
|
493
|
+
parts.push(s);
|
|
494
|
+
}
|
|
495
|
+
return `[${parts.join(', ')}]`;
|
|
496
|
+
}
|
|
497
|
+
return null; // objects unsupported in v1
|
|
498
|
+
}
|
|
499
|
+
function protoError(code, message, pointer) {
|
|
500
|
+
return { category: 'edit', code, message, ...(pointer ? { pointer } : {}) };
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"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"}
|