typebulb 0.39.2 → 0.40.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.
@@ -5,7 +5,7 @@ import { existsSync, readFileSync, writeFileSync } from "node:fs";
5
5
  import { resolve } from "node:path";
6
6
  import { Type } from "typebox";
7
7
 
8
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/utils/textUtils.js
8
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/utils/textUtils.js
9
9
  var TextUtils = class _TextUtils {
10
10
  static NormalizeToLf(text) {
11
11
  return (text ?? "").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
@@ -89,6 +89,36 @@ var TextUtils = class _TextUtils {
89
89
  return false;
90
90
  return cp < 32 || cp >= 127 && cp <= 159 || cp === 173 || cp === 1564 || cp === 6158 || cp >= 8203 && cp <= 8207 || cp >= 8234 && cp <= 8238 || cp >= 8288 && cp <= 8292 || cp >= 8294 && cp <= 8297 || cp === 65279;
91
91
  }
92
+ // En/em dashes are exempt from the audit: this authoring stack emits them in all
93
+ // comment prose, so warning on them fires on nearly every apply and trains readers
94
+ // to skip the audit (warning-blindness). They stay in the homoglyph table, so match
95
+ // tolerance is unchanged. Curly quotes still warn: the motivating mangle was a quote
96
+ // lookalike inside code, and prose here uses straight quotes — a curly quote is more
97
+ // likely damage than intent.
98
+ static IsIntentionalTypography(c) {
99
+ const cp = c.codePointAt(0);
100
+ return cp === 8211 || cp === 8212;
101
+ }
102
+ /// <summary>Names the invisible/lookalike code points in the given lines, or null if
103
+ /// there are none. Escape mangling at a tool-call boundary writes unintended bytes
104
+ /// silently; intent is unrecoverable afterwards, so the audit states the facts (which
105
+ /// code point, what it resembles, how many) and leaves the judgment to the caller.
106
+ /// </summary>
107
+ static DescribeSuspectCodePoints(lines) {
108
+ const counts = /* @__PURE__ */ new Map();
109
+ for (const line of lines)
110
+ for (const c of line)
111
+ if (_TextUtils.IsInvisible(c) || _TextUtils.MapHomoglyph(c) !== c && !_TextUtils.IsIntentionalTypography(c))
112
+ counts.set(c, (counts.get(c) ?? 0) + 1);
113
+ if (counts.size === 0)
114
+ return null;
115
+ return [...counts.entries()].sort((a, b) => a[0].codePointAt(0) - b[0].codePointAt(0)).map(([c, n]) => {
116
+ const mapped = _TextUtils.MapHomoglyph(c);
117
+ const what = _TextUtils.IsInvisible(c) ? "invisible" : mapped === " " ? "looks like a space" : `looks like ${mapped}`;
118
+ const hex = c.codePointAt(0).toString(16).toUpperCase().padStart(4, "0");
119
+ return `U+${hex} (${what}) x${n}`;
120
+ }).join(", ");
121
+ }
92
122
  /// <summary>Round-trip variant that accepts updated LF lines.</summary>
93
123
  static RoundTripWhitespace(originalSnapshot, updatedLines) {
94
124
  const joined = updatedLines.join("\n");
@@ -103,7 +133,7 @@ var TextUtils = class _TextUtils {
103
133
  }
104
134
  };
105
135
 
106
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/utils/arrayUtils.js
136
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/utils/arrayUtils.js
107
137
  var ArrayUtils = class {
108
138
  /// <summary>
109
139
  /// Groups items by key, preserving first-seen key order (like LINQ's GroupBy).
@@ -141,7 +171,7 @@ var ArrayUtils = class {
141
171
  }
142
172
  };
143
173
 
144
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/models.js
174
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/models.js
145
175
  var PatchInputFile = class {
146
176
  Key;
147
177
  InputFullText;
@@ -179,10 +209,8 @@ var PatchOutputFile = class {
179
209
  OutputFullText;
180
210
  Errors;
181
211
  AlreadyAppliedCount;
182
- CollapsedMarkerLines;
183
- TruncationSuspected;
184
- ControlCharsSuspected;
185
- constructor(Key, Fuzz, Edits, InputSelectedText, InputFullText, OutputFullText, Errors, AlreadyAppliedCount = 0, CollapsedMarkerLines = [], TruncationSuspected = false, ControlCharsSuspected = false) {
212
+ Notices;
213
+ constructor(Key, Fuzz, Edits, InputSelectedText, InputFullText, OutputFullText, Errors, AlreadyAppliedCount = 0, Notices = []) {
186
214
  this.Key = Key;
187
215
  this.Fuzz = Fuzz;
188
216
  this.Edits = Edits;
@@ -191,9 +219,7 @@ var PatchOutputFile = class {
191
219
  this.OutputFullText = OutputFullText;
192
220
  this.Errors = Errors;
193
221
  this.AlreadyAppliedCount = AlreadyAppliedCount;
194
- this.CollapsedMarkerLines = CollapsedMarkerLines;
195
- this.TruncationSuspected = TruncationSuspected;
196
- this.ControlCharsSuspected = ControlCharsSuspected;
222
+ this.Notices = Notices;
197
223
  }
198
224
  };
199
225
  var PatchOutput = class {
@@ -295,9 +321,11 @@ var DiffLocation = class {
295
321
  var FileHunkGroup = class {
296
322
  Key;
297
323
  Hunks;
298
- constructor(Key, Hunks) {
324
+ ContextOnlyHunkLines;
325
+ constructor(Key, Hunks, ContextOnlyHunkLines = []) {
299
326
  this.Key = Key;
300
327
  this.Hunks = Hunks;
328
+ this.ContextOnlyHunkLines = ContextOnlyHunkLines;
301
329
  }
302
330
  };
303
331
  var Chunk = class _Chunk {
@@ -369,7 +397,7 @@ var UniqueMatch = class _UniqueMatch {
369
397
  }
370
398
  };
371
399
 
372
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/utils/yaml.js
400
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/utils/yaml.js
373
401
  var Yaml = class _Yaml {
374
402
  _sb = [];
375
403
  // -------- Public API --------
@@ -426,7 +454,7 @@ var Yaml = class _Yaml {
426
454
  }
427
455
  };
428
456
 
429
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/exceptions.js
457
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/exceptions.js
430
458
  var PatchException = class extends Error {
431
459
  Error;
432
460
  constructor(error) {
@@ -488,7 +516,7 @@ ${this.SuggestedFixYaml}`;
488
516
  }
489
517
  };
490
518
 
491
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/applier/guards.js
519
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/applier/guards.js
492
520
  var DuplicateGuard = class _DuplicateGuard {
493
521
  // Two chunks that resolve to the same anchor with the same deletes and inserts are
494
522
  // provably the same edit (an LLM re-emitting a hunk). Applying it once is
@@ -538,7 +566,7 @@ var OverlapGuard = class {
538
566
  }
539
567
  };
540
568
 
541
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/applier/editMinimizer.js
569
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/applier/editMinimizer.js
542
570
  var EditMinimizer = class _EditMinimizer {
543
571
  static Same(a, b) {
544
572
  return a === b;
@@ -572,7 +600,7 @@ var EditMinimizer = class _EditMinimizer {
572
600
  }
573
601
  };
574
602
 
575
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/applier/indenter.js
603
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/applier/indenter.js
576
604
  var Anchor = class {
577
605
  BaseIndent;
578
606
  Shift;
@@ -663,7 +691,7 @@ var Indenter = class _Indenter {
663
691
  }
664
692
  };
665
693
 
666
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/applier/matchHint.js
694
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/applier/matchHint.js
667
695
  var MatchHint = class _MatchHint {
668
696
  // A quoted line inside exactly one longer file line is the prose line-model
669
697
  // mistake: the author's "line" (a sentence of an unwrapped paragraph, or a
@@ -696,7 +724,7 @@ var MatchHint = class _MatchHint {
696
724
  static MinHintLineContent = 12;
697
725
  };
698
726
 
699
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/applier/chunkApplier.js
727
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/applier/chunkApplier.js
700
728
  var InputChunks = class {
701
729
  InputFullText;
702
730
  Chunks;
@@ -765,7 +793,7 @@ var ChunkApplier = class _ChunkApplier {
765
793
  }
766
794
  };
767
795
 
768
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/heuristics.js
796
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/heuristics.js
769
797
  var DiffContentHeuristics = class _DiffContentHeuristics {
770
798
  /**
771
799
  * Checks if a line starts with a doubled marker (++ or --)
@@ -990,7 +1018,7 @@ var DiffContentHeuristics = class _DiffContentHeuristics {
990
1018
  }
991
1019
  };
992
1020
 
993
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/hunkBuilder.js
1021
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/hunkBuilder.js
994
1022
  var Header = class _Header {
995
1023
  Path;
996
1024
  OldStart;
@@ -1033,12 +1061,25 @@ var HunkBuilder = class _HunkBuilder {
1033
1061
  ClearTruncation() {
1034
1062
  this.LastHunkTruncated = false;
1035
1063
  }
1064
+ // Diff line of the first @@-headed body with real content but no change lines.
1065
+ // Such a hunk can never be intentional (its '+'/'-' markers were lost, and the
1066
+ // loss is ambiguous — adds or deletes?), so the parser rejects the whole diff
1067
+ // instead of silently dropping it. Bodies outside any hunk (prose before or
1068
+ // after a diff) and blank-only bodies keep flowing through silently.
1069
+ // Diff line of each @@-headed body that had real content but no change lines. Such a
1070
+ // hunk states no change, so it is skipped and its siblings apply — but the lines are
1071
+ // surfaced so the caller can name the skip rather than report a clean success. Bodies
1072
+ // outside any hunk (prose before or after a diff) and blank-only bodies are not hunks
1073
+ // at all and are never recorded.
1074
+ ContextOnlyHunkLines = [];
1036
1075
  CommitIfAny(hdr, body, fileLines) {
1037
1076
  if (body.length == 0)
1038
1077
  return;
1039
1078
  const blankContextDeletion = _HunkBuilder.IsBlankContextDeletion(hdr.OldCount, hdr.NewCount, body);
1040
1079
  if (!blankContextDeletion && !body.some((l) => l.length > 0 && (l[0] == "-" || l[0] == "+"))) {
1041
1080
  this.LastHunkTruncated = false;
1081
+ if (hdr.DiffBodyStartLine >= 0 && body.some((l) => l.trim().length > 0))
1082
+ this.ContextOnlyHunkLines.push(hdr.DiffBodyStartLine);
1042
1083
  body.length = 0;
1043
1084
  return;
1044
1085
  }
@@ -1198,7 +1239,7 @@ ${h.NewText}`;
1198
1239
  }
1199
1240
  };
1200
1241
 
1201
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/unifiedDiffParser.js
1242
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/unifiedDiffParser.js
1202
1243
  var UnifiedDiffParser = class _UnifiedDiffParser {
1203
1244
  /**
1204
1245
  * Parse a unified diff into structured hunks.
@@ -1208,21 +1249,25 @@ var UnifiedDiffParser = class _UnifiedDiffParser {
1208
1249
  * @param controlChars - Verdict for raw control characters in insert lines
1209
1250
  */
1210
1251
  static Parse(diff, files, truncation = "warn", controlChars = "error") {
1211
- const hunks = diff == null || diff.trim().length == 0 ? [] : _UnifiedDiffParser.ParseHunks(diff, files, truncation, controlChars);
1252
+ const parsed = diff == null || diff.trim().length == 0 ? { Hunks: [], ContextOnlyLines: [] } : _UnifiedDiffParser.ParseHunks(diff, files, truncation, controlChars);
1253
+ const hunks = parsed.Hunks;
1254
+ const ctxOnly = parsed.ContextOnlyLines;
1212
1255
  const fileKeySet = new Set(files.keys());
1213
1256
  const headerless = hunks.filter((h) => h.Key == null || h.Key == "");
1214
1257
  const explicitKnown = hunks.filter((h) => h.Key != null && h.Key != "" && fileKeySet.has(h.Key));
1215
1258
  const explicitFallback = hunks.filter((h) => h.Key != null && h.Key != "" && !fileKeySet.has(h.Key));
1216
1259
  const groups = [];
1217
1260
  if (headerless.length > 0)
1218
- groups.push(new FileHunkGroup("", headerless));
1261
+ groups.push(new FileHunkGroup("", headerless, ctxOnly));
1219
1262
  if (explicitKnown.length > 0)
1220
- ArrayUtils.GroupBy(explicitKnown, (h) => h.Key).map((g) => new FileHunkGroup(g.key, g.values)).forEach((x) => groups.push(x));
1263
+ ArrayUtils.GroupBy(explicitKnown, (h) => h.Key).map((g) => new FileHunkGroup(g.key, g.values, ctxOnly)).forEach((x) => groups.push(x));
1221
1264
  const treatAsSingleFile = fileKeySet.size == 1 && fileKeySet.has("") && explicitKnown.length == 0 && headerless.length == 0 && Array.from(new Set(explicitFallback.map((h) => h.Key))).length == 1;
1222
1265
  if (treatAsSingleFile && explicitFallback.length > 0)
1223
- groups.push(new FileHunkGroup("", explicitFallback));
1266
+ groups.push(new FileHunkGroup("", explicitFallback, ctxOnly));
1224
1267
  else if (explicitFallback.length > 0)
1225
- ArrayUtils.GroupBy(explicitFallback, (h) => h.Key).map((g) => new FileHunkGroup(g.key, g.values)).forEach((x) => groups.push(x));
1268
+ ArrayUtils.GroupBy(explicitFallback, (h) => h.Key).map((g) => new FileHunkGroup(g.key, g.values, ctxOnly)).forEach((x) => groups.push(x));
1269
+ if (groups.length == 0 && ctxOnly.length > 0)
1270
+ groups.push(new FileHunkGroup("", [], ctxOnly));
1226
1271
  return groups;
1227
1272
  }
1228
1273
  static ParseHunks(diff, fileContents, truncation = "warn", controlChars = "error") {
@@ -1252,6 +1297,7 @@ var UnifiedDiffParser = class _UnifiedDiffParser {
1252
1297
  if (inFence && line.startsWith("```")) {
1253
1298
  hunkBuilder.CommitIfAny(header, body, currentFileLines);
1254
1299
  hunkBuilder.ClearTruncation();
1300
+ header.DiffBodyStartLine = -1;
1255
1301
  inFence = false;
1256
1302
  inHunkBody = false;
1257
1303
  continue;
@@ -1294,7 +1340,7 @@ var UnifiedDiffParser = class _UnifiedDiffParser {
1294
1340
  hunk.ControlCharsSuspected = true;
1295
1341
  }
1296
1342
  }
1297
- return hunks;
1343
+ return { Hunks: hunks, ContextOnlyLines: hunkBuilder.ContextOnlyHunkLines };
1298
1344
  }
1299
1345
  static IsSuspectControlChar(c) {
1300
1346
  const cp = c.charCodeAt(0);
@@ -1437,7 +1483,7 @@ var UnifiedDiffParser = class _UnifiedDiffParser {
1437
1483
  }
1438
1484
  };
1439
1485
 
1440
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/anchorer/hunkSlicer.js
1486
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/anchorer/hunkSlicer.js
1441
1487
  var Block = class {
1442
1488
  StartIndex;
1443
1489
  EndIndex;
@@ -1490,7 +1536,7 @@ var HunkSlicer = class _HunkSlicer {
1490
1536
  }
1491
1537
  };
1492
1538
 
1493
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/anchorer/search.js
1539
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/anchorer/search.js
1494
1540
  var Match = class {
1495
1541
  LineIndex;
1496
1542
  Fuzz;
@@ -1628,7 +1674,7 @@ var Search = class _Search {
1628
1674
  }
1629
1675
  };
1630
1676
 
1631
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/anchorer/blockAnchorer.js
1677
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/anchorer/blockAnchorer.js
1632
1678
  var BlockAnchorer = class _BlockAnchorer {
1633
1679
  static AnchorBlocks(hunk, blocks, lines, options) {
1634
1680
  return blocks.map((focus, index) => {
@@ -1746,7 +1792,7 @@ var BlockAnchorer = class _BlockAnchorer {
1746
1792
  }
1747
1793
  };
1748
1794
 
1749
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/anchorer/hunkAnchorer.js
1795
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/anchorer/hunkAnchorer.js
1750
1796
  var AnchorOutcome = class {
1751
1797
  Chunks;
1752
1798
  AlreadyAppliedCount;
@@ -1762,7 +1808,7 @@ var HunkAnchorer = class _HunkAnchorer {
1762
1808
  const chunks = [];
1763
1809
  for (const sliced of slicedHunks)
1764
1810
  for (const chunk of BlockAnchorer.AnchorBlocks(sliced.Hunk, sliced.Blocks, lines, options))
1765
- chunks.push(_HunkAnchorer.UseFallbackAnchorIfNecessary(sliced.Hunk, chunk, lines.length));
1811
+ chunks.push(_HunkAnchorer.UseFallbackAnchorIfNecessary(sliced.Hunk, chunk, lines, slicedHunks.length == 1));
1766
1812
  const deleteCounts = /* @__PURE__ */ new Map();
1767
1813
  for (const l of chunks.flatMap((c) => c.DeleteLines))
1768
1814
  if (l.trim().length > 0)
@@ -1771,8 +1817,12 @@ var HunkAnchorer = class _HunkAnchorer {
1771
1817
  const kept = chunks.filter((c) => !_HunkAnchorer.AppliedAtAnchor(lines, c) && (c.InsertLines.some((l) => movedFromElsewhere(c, l)) || !_HunkAnchorer.AlreadyApplied(lines, c))).map((c) => _HunkAnchorer.TrySubLineSplice(c, lines));
1772
1818
  return new AnchorOutcome(kept, chunks.length - kept.length);
1773
1819
  }
1774
- static UseFallbackAnchorIfNecessary(hunk, chunk, lineCount) {
1820
+ static UseFallbackAnchorIfNecessary(hunk, chunk, lines, soleHunk) {
1821
+ const lineCount = lines.length;
1775
1822
  if (chunk.Match.IsNotFound && hunk.Lines.length == chunk.InsertLines.length) {
1823
+ const targetIsEmpty = lineCount == 0 || lineCount == 1 && lines[0].length == 0;
1824
+ if (hunk.OldStart < 0 && !soleHunk && !targetIsEmpty)
1825
+ return chunk;
1776
1826
  const anchorLine = hunk.OldStart <= 1 ? 0 : hunk.OldStart;
1777
1827
  if (anchorLine > lineCount)
1778
1828
  return chunk;
@@ -1914,7 +1964,7 @@ var HunkAnchorer = class _HunkAnchorer {
1914
1964
  }
1915
1965
  };
1916
1966
 
1917
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/selectionTarget.js
1967
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/selectionTarget.js
1918
1968
  var SelectionTarget = class {
1919
1969
  FullText;
1920
1970
  SelectedText;
@@ -1946,7 +1996,7 @@ var SelectionTarget = class {
1946
1996
  }
1947
1997
  };
1948
1998
 
1949
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/sanitizers/shared.js
1999
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/sanitizers/shared.js
1950
2000
  function isDiffMarker(line) {
1951
2001
  return line.startsWith("--- ") || line.startsWith("+++ ") || line.startsWith("@@") || line.startsWith("diff --git");
1952
2002
  }
@@ -2003,7 +2053,7 @@ function isLikelyFileHeader(trimmed) {
2003
2053
  return trimmed.startsWith("diff --git") || (trimmed.startsWith("--- ") || trimmed.startsWith("+++ ")) && (trimmed.includes(".") || trimmed.includes("/") || trimmed.includes("\\"));
2004
2054
  }
2005
2055
 
2006
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/sanitizers/customFormatSanitizer.js
2056
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/sanitizers/customFormatSanitizer.js
2007
2057
  var CustomFormatSanitizer = class _CustomFormatSanitizer {
2008
2058
  static OPERATIONS = [
2009
2059
  { header: /^\s*\*\*\* Update File: (.+)$/i, fromPath: (p) => `a/${p}`, toPath: (p) => `b/${p}` },
@@ -2028,7 +2078,7 @@ var CustomFormatSanitizer = class _CustomFormatSanitizer {
2028
2078
  }
2029
2079
  };
2030
2080
 
2031
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/sanitizers/decoratedHeaderSanitizer.js
2081
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/sanitizers/decoratedHeaderSanitizer.js
2032
2082
  var DecoratedHeaderSanitizer = class _DecoratedHeaderSanitizer {
2033
2083
  static DECORATED_HEADER_REGEX = /^(---|\+\+\+)\s+(.+?)\s+(---|\+\+\+)+\s*$/;
2034
2084
  static process(text) {
@@ -2041,7 +2091,7 @@ var DecoratedHeaderSanitizer = class _DecoratedHeaderSanitizer {
2041
2091
  }
2042
2092
  };
2043
2093
 
2044
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/sanitizers/decorativeMarkerSanitizer.js
2094
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/sanitizers/decorativeMarkerSanitizer.js
2045
2095
  var DecorativeMarkerSanitizer = class _DecorativeMarkerSanitizer {
2046
2096
  static process(text) {
2047
2097
  return transformOutsideHunkBodies(text, (line) => _DecorativeMarkerSanitizer.isDecorativeMarker(line.trim()) ? null : line);
@@ -2062,14 +2112,14 @@ var DecorativeMarkerSanitizer = class _DecorativeMarkerSanitizer {
2062
2112
  }
2063
2113
  };
2064
2114
 
2065
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/sanitizers/backtickSanitizer.js
2115
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/sanitizers/backtickSanitizer.js
2066
2116
  var BacktickSanitizer = class {
2067
2117
  static process(text) {
2068
2118
  return text.replace(/^```+\s*diff\b/gmi, "```diff").replace(/^```+$/gm, "```");
2069
2119
  }
2070
2120
  };
2071
2121
 
2072
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/sanitizers/diffBlockReunifier.js
2122
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/sanitizers/diffBlockReunifier.js
2073
2123
  var DiffBlockReunifier = class {
2074
2124
  static process(text) {
2075
2125
  const lines = text.split("\n");
@@ -2105,7 +2155,7 @@ var DiffBlockReunifier = class {
2105
2155
  }
2106
2156
  };
2107
2157
 
2108
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/sanitizers/devNullSanitizer.js
2158
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/sanitizers/devNullSanitizer.js
2109
2159
  var DevNullSanitizer = class {
2110
2160
  static process(text, fileKeys) {
2111
2161
  if (!fileKeys?.length)
@@ -2148,7 +2198,7 @@ var DevNullSanitizer = class {
2148
2198
  }
2149
2199
  };
2150
2200
 
2151
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/sanitizers/prefixInjector.js
2201
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/sanitizers/prefixInjector.js
2152
2202
  var PrefixInjector = class {
2153
2203
  static process(text) {
2154
2204
  const lines = text.split("\n");
@@ -2207,7 +2257,7 @@ var PrefixInjector = class {
2207
2257
  }
2208
2258
  };
2209
2259
 
2210
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/parser/diffSanitizer.js
2260
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/parser/diffSanitizer.js
2211
2261
  var DiffSanitizer = class {
2212
2262
  static Process(diff, fileKeys) {
2213
2263
  if (!diff?.trim())
@@ -2223,7 +2273,7 @@ var DiffSanitizer = class {
2223
2273
  }
2224
2274
  };
2225
2275
 
2226
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/headerlessRouter.js
2276
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/headerlessRouter.js
2227
2277
  var HeaderlessRouter = class {
2228
2278
  static Route(fileHunks, files, options) {
2229
2279
  const group = fileHunks.find((g) => g.Key == "");
@@ -2248,7 +2298,31 @@ var HeaderlessRouter = class {
2248
2298
  }
2249
2299
  };
2250
2300
 
2251
- // ../node_modules/.pnpm/matchu-patchu@0.3.1/node_modules/matchu-patchu/dist/patcher.js
2301
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/patchNotices.js
2302
+ var PatchNotices = class {
2303
+ static For(hunks, file, contextOnlyHunkLines) {
2304
+ const notices = [];
2305
+ if (file.Edits.length === 0)
2306
+ notices.push(file.AlreadyAppliedCount > 0 ? `Note: no edits were applied because the file already contains this change (${file.AlreadyAppliedCount} chunk(s) detected as already applied).` : "Note: no edits were applied \u2014 the diff parsed but expressed no change for this file.");
2307
+ if (file.Fuzz > 0)
2308
+ notices.push(`Note: applied with fuzz factor ${file.Fuzz} \u2014 the diff did not match exactly, so confirm the edits landed where you intended.`);
2309
+ const suspects = TextUtils.DescribeSuspectCodePoints(file.Edits.flatMap((e) => e.InsertLines));
2310
+ if (suspects)
2311
+ notices.push(`Warning: written lines contain invisible or lookalike characters: ${suspects}. If these were authored as \\uXXXX escapes or plain ASCII, the tool-call layer may have mangled them; verify the file content.`);
2312
+ const collapsed = hunks.flatMap((h) => h.Lines).filter((l) => l.CollapsedFrom != null).map((l) => l.CollapsedFrom);
2313
+ if (collapsed.length > 0)
2314
+ notices.push(`Note: ${collapsed.length} body line(s) starting '++' were read as sloppy doubled insert markers and written without the leading '+' (first: "${collapsed[0]}"). If the inserted content was meant to keep a '+' prefix (diff-shaped payload), verify the file.`);
2315
+ if (hunks.some((h) => h.TruncationSuspected))
2316
+ notices.push("Note: the diff's final hunk looks truncated (its header declares more lines than the body delivered). The delivered lines were applied; verify the tail of that change landed.");
2317
+ if (hunks.some((h) => h.ControlCharsSuspected))
2318
+ notices.push("Note: insert lines contained raw control characters and were written verbatim. That is usually transport damage rather than intended content; verify the written bytes.");
2319
+ if (contextOnlyHunkLines.length > 0)
2320
+ notices.push(`Note: the hunk${contextOnlyHunkLines.length === 1 ? "" : "s"} at diff line ${contextOnlyHunkLines.join(", ")} stated no change (context only), so nothing was applied there while the other edits landed. If an edit was intended, its '+'/'-' lines were lost \u2014 re-send that hunk and verify.`);
2321
+ return notices;
2322
+ }
2323
+ };
2324
+
2325
+ // ../node_modules/.pnpm/matchu-patchu@0.3.3/node_modules/matchu-patchu/dist/patcher.js
2252
2326
  var Patcher = class {
2253
2327
  static Apply(diff, files, options) {
2254
2328
  options = options ?? new PatchOptions();
@@ -2269,10 +2343,13 @@ var Patcher = class {
2269
2343
  const patchOutputFiles = files.map((f) => {
2270
2344
  const targetSelection = new SelectionTarget(f.InputFullText, f.InputSelectedText);
2271
2345
  const targetText = targetSelection.TargetText;
2272
- const hunks = fileHunks.find((h) => h.Key == f.Key)?.Hunks ?? [];
2346
+ const group = fileHunks.find((h) => h.Key == f.Key);
2347
+ const hunks = group?.Hunks ?? [];
2273
2348
  const anchored = HunkAnchorer.Anchor(targetText, hunks, options);
2274
2349
  const outputEdits = ChunkApplier.Apply(targetText, anchored.Chunks, options);
2275
- return new PatchOutputFile(f.Key, outputEdits.Edits.map((h) => h.Fuzz).reduce((a, b) => a + b, 0), outputEdits.Edits.map((e) => e.Shift(targetSelection.LineOffset)), f.InputSelectedText, f.InputFullText, targetSelection.Replace(outputEdits.OutputText), [...outputEdits.Errors], anchored.AlreadyAppliedCount, hunks.flatMap((h) => h.Lines).filter((l) => l.CollapsedFrom != null).map((l) => l.CollapsedFrom), hunks.some((h) => h.TruncationSuspected), hunks.some((h) => h.ControlCharsSuspected));
2350
+ const file = new PatchOutputFile(f.Key, outputEdits.Edits.map((h) => h.Fuzz).reduce((a, b) => a + b, 0), outputEdits.Edits.map((e) => e.Shift(targetSelection.LineOffset)), f.InputSelectedText, f.InputFullText, targetSelection.Replace(outputEdits.OutputText), [...outputEdits.Errors], anchored.AlreadyAppliedCount);
2351
+ file.Notices = PatchNotices.For(hunks, file, group?.ContextOnlyHunkLines ?? []);
2352
+ return file;
2276
2353
  });
2277
2354
  return new PatchOutput([...patchOutputFiles, ...reportFiles]);
2278
2355
  }
@@ -2280,14 +2357,13 @@ var Patcher = class {
2280
2357
 
2281
2358
  // cli/agents/pi/server/piPatcherExtension.ts
2282
2359
  var DESCRIPTION = true ? "Apply unified diffs to files \u2014 tolerant of form, strict about intent. Repairs sloppy AI-generated diffs (mangled headers, whitespace drift, missing prefixes; line numbers can be wrong or absent \u2014 hunks anchor by fuzzy-matched context lines) and applies all hunks atomically when the intent is unambiguous; fails with a precise, typed error when it isn't. Use for multi-hunk edits in one step, or when exact string-replacement editing fails on whitespace or invisible characters." : "Apply unified diffs to files.";
2283
- var BUILD_TAG = true ? "matchu-patchu-pi 0.3.1, built 2026-07-25 03:11:48" : "matchu-patchu-pi dev";
2360
+ var BUILD_TAG = true ? "matchu-patchu-pi 0.3.3, built 2026-07-26 13:14:27" : "matchu-patchu-pi dev";
2284
2361
  var errorBlocks = (errors) => {
2285
2362
  const parts = [`Patch failed with ${errors.length} error(s):`];
2286
2363
  for (const e of errors) parts.push("", e.toString());
2287
2364
  return parts.join("\n");
2288
2365
  };
2289
- var noOpMessage = (target, alreadyApplied) => alreadyApplied > 0 ? `Applied 0 edit(s) to ${target}: the file already contains this change (${alreadyApplied} chunk(s) detected as already applied). File left unmodified.` : `Applied 0 edit(s) to ${target}: the patch parsed but produced no changes for this file. File left unmodified.`;
2290
- var fuzzNote = (fuzz) => fuzz > 0 ? ` (applied with fuzz factor ${fuzz})` : "";
2366
+ var outcomeMessage = (target, out) => `Applied ${out.Edits.length} edit(s) to ${target}.` + (out.Edits.length > 0 ? "" : " File left unmodified.") + out.Notices.map((n) => " " + n).join("");
2291
2367
  function discoverDiffKeys(diff) {
2292
2368
  const keys = [];
2293
2369
  for (const f of Patcher.Apply(diff, []).Files) {
@@ -2300,11 +2376,10 @@ function applySingle(cwd, filePath, diff, dryRun) {
2300
2376
  if (!existsSync(abs)) return { ok: false, message: `Error: file not found: ${filePath}` };
2301
2377
  const out = Patcher.Apply(diff, [new PatchInputFile("", readFileSync(abs, "utf-8"))]).Files[0];
2302
2378
  if (out.Errors.length > 0) return { ok: false, message: errorBlocks(out.Errors) };
2303
- if (out.Edits.length === 0) return { ok: true, message: noOpMessage(filePath, out.AlreadyAppliedCount) };
2304
- if (!dryRun) writeFileSync(abs, out.OutputFullText);
2379
+ if (out.Edits.length > 0 && !dryRun) writeFileSync(abs, out.OutputFullText);
2305
2380
  return {
2306
2381
  ok: true,
2307
- message: `Successfully applied ${out.Edits.length} edit(s) to ${filePath}${fuzzNote(out.Fuzz)}.` + (dryRun ? `
2382
+ message: outcomeMessage(filePath, out) + (dryRun ? `
2308
2383
 
2309
2384
  --- patched output ---
2310
2385
  ${out.OutputFullText}` : "")
@@ -2324,14 +2399,12 @@ function applyMulti(cwd, diff, dryRun) {
2324
2399
  const lines = [];
2325
2400
  const dryOutputs = [];
2326
2401
  for (const out of result.Files) {
2327
- if (out.Edits.length === 0) {
2328
- lines.push(noOpMessage(out.Key, out.AlreadyAppliedCount));
2329
- continue;
2330
- }
2331
- if (!dryRun) writeFileSync(resolve(cwd, out.Key), out.OutputFullText);
2332
- else dryOutputs.push(`--- patched output: ${out.Key} ---
2402
+ if (out.Edits.length > 0) {
2403
+ if (!dryRun) writeFileSync(resolve(cwd, out.Key), out.OutputFullText);
2404
+ else dryOutputs.push(`--- patched output: ${out.Key} ---
2333
2405
  ${out.OutputFullText}`);
2334
- lines.push(`Successfully applied ${out.Edits.length} edit(s) to ${out.Key}${fuzzNote(out.Fuzz)}.`);
2406
+ }
2407
+ lines.push(outcomeMessage(out.Key, out));
2335
2408
  }
2336
2409
  return { ok: true, message: [lines.join("\n"), ...dryOutputs].join("\n\n") };
2337
2410
  }
@@ -118,21 +118,27 @@ body {
118
118
  gap: .4rem;
119
119
  align-items: center;
120
120
  }
121
- /* Chip shape shared by EVERY word-label control — the status-bar pills (interactive and
122
- passive) AND the floating overlay pills (copy, breakout, code⇄run). One rule = one source
123
- of vertical alignment; when these drift apart it reads as amateurish.
124
- THE CENTERING RECIPE (don't re-tweak per button — fix it here or nowhere): Segoe UI's font
121
+ /* THE CENTERING RECIPE for EVERY word-label control on any surface — the status-bar pills and
122
+ floating overlay pills below, and the launcher row's trust switch + B scope chip. One rule = one
123
+ source of vertical alignment; when these drift apart it reads as amateurish, so a new word
124
+ control joins this selector rather than centering itself (don't re-tweak per button — fix it
125
+ here or nowhere). Icon buttons opt back out, keeping flex (see .pill.glyph). Segoe UI's font
125
126
  ascent (~1.08em) dwarfs its descent (~0.25em), so anything that centers the LINE BOX —
126
127
  flex, line-height, padding — parks the glyphs ~2px low at pill sizes. `text-box` trims the
127
128
  line box to the glyphs (cap→baseline) so centering centers the letters themselves. It only
128
129
  applies to block containers (not flex), hence inline-block + align-content, not inline-flex
129
- + align-items. Browsers without text-box (Firefox) fall back to plain line-box centering.
130
- Opaque so pills read cleanly over the message text the transparent strip lets through. */
131
- .pill, .token, .overlay-pill {
130
+ + align-items. Browsers without text-box (Firefox) fall back to plain line-box centering. */
131
+ .pill, .token, .overlay-pill, .trust-toggle, .batch-b {
132
132
  display: inline-block;
133
133
  align-content: center;
134
134
  text-align: center;
135
135
  text-box: trim-both cap alphabetic;
136
+ }
137
+ /* Chip shape shared by the status-bar pills (interactive and passive) AND the floating overlay
138
+ pills (copy, breakout, code⇄run) — opaque, so they read cleanly over the message text the
139
+ transparent strip lets through. The launcher row's pills take only the recipe above; their
140
+ shape is the row's (.trust-toggle, .batch-b). */
141
+ .pill, .token, .overlay-pill {
136
142
  height: var(--pill-h);
137
143
  padding: 0 .7rem;
138
144
  border-radius: 7px;
@@ -821,9 +827,10 @@ a.server-port:hover { text-decoration: underline; }
821
827
  row's snippet line bleeds under the next row as overlapping text. max-content tracks never
822
828
  compress; the list scrolls, rows keep their content height. */
823
829
  .bulb-list { display: grid; grid-template-columns: auto 1fr auto auto auto auto; grid-auto-rows: max-content; column-gap: .6rem; row-gap: .15rem; align-items: center; align-content: start; padding-right: 4px; flex: 1; min-height: 0; overflow-y: auto; }
824
- /* The scope column (TB-Batch.md Invariant 7): a seventh track between name and the control
825
- cluster, present only while some row carries a scope (bulbsPill.ts anyScope — rows emit a
826
- matching cell, spacer included). The B affordance keeps it ~1.3rem wide. */
830
+ /* The scope column (TB-Batch.md Invariant 7): a seventh track heading the control cluster (before
831
+ trust — a launch scope is an execution concern, like a trust tier), present only while some row
832
+ carries a scope (bulbsPill.ts anyScope — rows emit a matching cell, spacer included). The B
833
+ affordance keeps it one --pill-h square. */
827
834
  .bulb-list.has-scope { grid-template-columns: auto 1fr auto auto auto auto auto; }
828
835
  /* A stopped bulb's name isn't a link (no running URL), so it stays plain foreground. */
829
836
  .server-name.stopped { color: var(--fg); }
@@ -839,7 +846,11 @@ a.server-port:hover { text-decoration: underline; }
839
846
  the row shows THAT a scope applies, the tooltip and click-menu name it. Dim = batches exist but
840
847
  launch is unscoped; lit (.on) = play launches scoped (newest default) or running scoped.
841
848
  Static (running) keeps the lit look without the hand cursor. */
842
- .batch-b { font-size: .72rem; font-family: ui-monospace, monospace; line-height: 1; color: var(--muted); background: transparent; border: 1px solid var(--border); border-radius: 4px; width: 1.3rem; height: 1.15rem; padding: 0; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
849
+ /* Square (its one glyph has no text pill's width to earn) and otherwise typography-free: the shared
850
+ pill box, font and trim, so its B is the same size and sits on the same baseline as the trust
851
+ switch beside it. Its own font-family was the bug — a monospace cap is a different size from a
852
+ Segoe cap at one font-size, which reads as two badly-aligned widgets. */
853
+ .batch-b { font-size: var(--pill-font); color: var(--muted); background: transparent; border: 1px solid var(--border); border-radius: 5px; width: var(--pill-h); height: var(--pill-h); padding: 0; cursor: pointer; }
843
854
  .batch-b.on { color: var(--accent); border-color: var(--accent); }
844
855
  .batch-b.static { cursor: default; }
845
856
  /* The B's menu rides the composer popup register (.at-popup/.at-row/.dlg-catcher — one mini-menu
@@ -876,18 +887,21 @@ a.server-port:hover { text-decoration: underline; }
876
887
  .bulb-list .picker-snippet { grid-column: 2 / -1; margin: 0 .4rem .2rem 0; }
877
888
  .bulb-time { color: var(--muted); font-size: .72rem; font-variant-numeric: tabular-nums; text-align: right; margin-right: .4rem; }
878
889
  /* The row's chrome buttons share one reset; sizing + colour differ below. Play/stop are round icon
879
- buttons (friendlier, space-economic); the trust switch is text. Logs is a link, not a button
880
- (see .server-logs above), so it's not in this group. */
890
+ buttons (friendlier, space-economic) and stay flex — a replaced SVG mis-seats under the
891
+ word-pill trim, the .pill.glyph case; the trust switch is a word, so it seats via the shared
892
+ recipe. Logs is a link, not a button (see .server-logs above), so it's not in this group. */
881
893
  .server-stop, .bulb-launch, .trust-toggle {
882
894
  font: inherit; appearance: none; margin: 0; cursor: pointer; box-sizing: border-box;
883
895
  background: transparent; border: 1px solid var(--border); border-radius: 5px;
884
- height: 1.7rem; display: inline-flex; align-items: center; justify-content: center;
896
+ height: 1.7rem;
885
897
  }
886
898
  /* Shorter than the icon buttons: a bordered text pill at full row height reads as cramped, where
887
- the round play/stop icons are meant to fill it. */
888
- .trust-toggle { font-size: .76rem; height: 1.45rem; padding: 0 .5rem; color: var(--muted); justify-self: center; }
899
+ the round play/stop icons are meant to fill it. The shared pill box + font, not a bespoke pair —
900
+ its own .76rem/1.45rem seated the word a full 1px below every statusbar pill, which is exactly how
901
+ this drifts (measured: a per-control size is a per-control seating). */
902
+ .trust-toggle { font-size: var(--pill-font); height: var(--pill-h); padding: 0 .5rem; color: var(--muted); justify-self: center; }
889
903
  .trust-toggle:hover, .trust-toggle.on { color: var(--accent); border-color: var(--accent); }
890
- .server-stop, .bulb-launch { width: 1.7rem; padding: 0; border-radius: 50%; margin-left: .4rem; }
904
+ .server-stop, .bulb-launch { display: inline-flex; align-items: center; justify-content: center; width: 1.7rem; padding: 0; border-radius: 50%; margin-left: .4rem; }
891
905
  .btn-icon { width: 16px; height: 16px; }
892
906
  /* A stopped bulb's play button is dormant — the title is the primary launch target — so it's
893
907
  hidden until the row is hovered or keyboard-selected. visibility (not display) reserves its slot,
@@ -895,9 +909,10 @@ a.server-port:hover { text-decoration: underline; }
895
909
  :port link: green is the live-app axis (play to launch → :port to open it), distinct from the
896
910
  blue source/name. The green even travels left→right as a bulb goes stopped→running. */
897
911
  .bulb-launch { color: var(--fold-marker); visibility: hidden; }
898
- /* A right triangle's visual mass sits left of its bounding box, so geometric centring reads
899
- too-far-left in a round button — shift the play glyph. */
900
- .bulb-launch .icon svg { transform: translateX(1px); }
912
+ /* No optical nudge on the play glyph, deliberately: Material's play_arrow already carries one (its
913
+ path spans 320→760 in a 0→960 frame — ~1px right at icon size, compensating a right triangle's
914
+ left-leaning mass). Our own translateX(1px) stacked a second correction and measured 2px right of
915
+ the button's centre. Any glyph that reads off-centre here is the frame's business, not the app's. */
901
916
  .server-row:hover .bulb-launch, .server-row.active .bulb-launch { visibility: visible; }
902
917
  .bulb-launch:hover { border-color: var(--fold-marker); background: color-mix(in srgb, var(--fold-marker) 12%, transparent); }
903
918
  /* Launching: stays visible (hover-independent) and shimmers until the row flips to a stop button,
@@ -11,6 +11,13 @@ export interface ParsedBulb {
11
11
  frontmatter: BulbFrontmatter;
12
12
  /** Block contents keyed by filename (e.g. `code.tsx`). */
13
13
  files: Map<string, string>;
14
+ /**
15
+ * 1-based line number, in the `.bulb.md`, of each block's FIRST content line (the line after its
16
+ * opening fence), keyed by filename. A bulb is a container: every tool inside it — tsc, lint, a
17
+ * browser stack trace — reports block coordinates, while the only file the user can open and link
18
+ * to is the bulb. This is the offset that maps one to the other (TB-CLI.md, One coordinate space).
19
+ */
20
+ starts: Map<string, number>;
14
21
  /** Structural defects tolerated during parse (an unterminated fence); empty when well-formed. */
15
22
  warnings: string[];
16
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../format/src/parse.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,OAAO,EAAE,KAAK,aAAa,EAAsC,MAAM,eAAe,CAAA;AAOtF,eAAO,MAAM,aAAa,QAAsB,CAAA;AAGhD,wGAAwG;AACxG,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,MAAsC,CAAA;AAEnF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,eAAe,CAAA;IAC5B,0DAA0D;IAC1D,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1B,iGAAiG;IACjG,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,mDAAmD;AACnD,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AAEvE,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAqE5D;AA6CD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAED;;sGAEsG;AACtG,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAkBjE;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAKvD"}
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../format/src/parse.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,OAAO,EAAE,KAAK,aAAa,EAAsC,MAAM,eAAe,CAAA;AAOtF,eAAO,MAAM,aAAa,QAAsB,CAAA;AAGhD,wGAAwG;AACxG,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,MAAsC,CAAA;AAEnF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,eAAe,CAAA;IAC5B,0DAA0D;IAC1D,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1B;;;;;OAKG;IACH,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3B,iGAAiG;IACjG,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,mDAAmD;AACnD,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AAEvE,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAwE5D;AA6CD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAED;;sGAEsG;AACtG,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAkBjE;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAKvD"}