typebulb 0.39.2 → 0.39.3
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/dist/agents/pi/matchu-patchu.ts +133 -60
- package/dist/index.js +1 -1
- package/package.json +2 -2
|
@@ -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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
183
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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.
|
|
2360
|
+
var BUILD_TAG = true ? "matchu-patchu-pi 0.3.3, built 2026-07-25 21:21:48" : "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
|
|
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
|
|
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:
|
|
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
|
|
2328
|
-
|
|
2329
|
-
|
|
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
|
-
|
|
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
|
}
|
package/dist/index.js
CHANGED
|
@@ -2007,5 +2007,5 @@ ${vO}
|
|
|
2007
2007
|
`);let c=0,l=Promise.resolve();Ct({target:r,onChange:()=>{let f=++c;l=l.then(async()=>{if(f===c)try{console.log("Re-running..."),await a()}catch(u){console.error("Error:",u)}})}})}}xt();Me();import{Console as AO}from"node:console";je();async function vb(r,e,t,n,s){_O();try{let p=Nr(await Q(),r)[0];p&&(Zi(p.pid,Be(p.pid).offset),console.error(`note: 'call' boots a fresh server.ts instance; the running server (${p.url}) is not contacted \u2014 state shared with it must live on disk.`))}catch{}let i=Se(t),{bulb:o,config:a}=await Ne(r);o.server||us("This bulb has no **server.ts** block; nothing to call."),kt(i,r,o.server),s&&await Or(r,s);let c;try{c=await Un(o.server,r,n,a.dependencies,s)}catch(p){us(p instanceof Error?p.message:String(p))}let l=Vo(c,e.fn);if(!l){let p=[...Object.keys(c).filter(y=>typeof c[y]=="function"),...Object.keys(Yo)];us(`Function '${e.fn}' not found. Available: ${p.length?p.join(", "):"(none)"}.`)}let f=await TO(e);if(Go(l)){try{for await(let p of l(...f))await wb(JSON.stringify(p,Sb)+`
|
|
2008
2008
|
`)}catch(p){us(p instanceof Error?p.stack??p.message:String(p))}return bb(0)}let u;try{u=await l(...f)}catch(p){us(p instanceof Error?p.stack??p.message:String(p))}let d=CO(u);d!==void 0&&await wb(d+`
|
|
2009
2009
|
`),bb(0)}function bb(r){process.exitCode=r,setTimeout(()=>process.exit(r),2e3).unref?.()}async function TO(r){if(r.hasArgsFlag){let e=r.argsJson??"";return e==="-"&&(e=await RO()),OO(e)}return PO(r.positional)}function PO(r){return r.map(e=>{try{return JSON.parse(e)}catch{return e}})}function OO(r){let e;try{e=JSON.parse(r)}catch(t){throw new Error(`--args must be a JSON array: ${t instanceof Error?t.message:String(t)}`)}if(!Array.isArray(e))throw new Error(`--args must be a JSON array, got ${e===null?"null":typeof e}`);return e}function CO(r){if(r!==void 0)return JSON.stringify(r,Sb,2)}function Sb(r,e){return typeof e=="bigint"?e.toString():e}function us(r){process.stderr.write(r+`
|
|
2010
|
-
`),process.exit(1)}function _O(){let r=new AO(process.stderr,process.stderr);console.log=r.log.bind(r),console.info=r.info.bind(r),console.debug=r.debug.bind(r),console.dir=r.dir.bind(r)}function wb(r){return new Promise((e,t)=>{process.stdout.write(r,n=>n?t(n):e())})}async function RO(){let r=[];for await(let e of process.stdin)r.push(e);return Buffer.concat(r).toString("utf-8")}var ju="0.39.
|
|
2010
|
+
`),process.exit(1)}function _O(){let r=new AO(process.stderr,process.stderr);console.log=r.log.bind(r),console.info=r.info.bind(r),console.debug=r.debug.bind(r),console.dir=r.dir.bind(r)}function wb(r){return new Promise((e,t)=>{process.stdout.write(r,n=>n?t(n):e())})}async function RO(){let r=[];for await(let e of process.stdin)r.push(e);return Buffer.concat(r).toString("utf-8")}var ju="0.39.3";function kb(r,e){r||(console.error(`This bulb runs server-side Node code (server.ts), which --trust must authorize:
|
|
2011
2011
|
${e}`),process.exit(1))}async function NO(){let r=gm(process.argv.slice(2));if(r.version&&(console.log(`typebulb ${ju}`),process.exit(0)),r.help&&(ym(),process.exit(0)),Ly(),r.subcommand==="logs"){await Hy(r.file||void 0,{follow:r.follow,clear:r.clear,run:r.run,lines:r.lines});return}if(r.subcommand==="wait"){await Wy(r.file||void 0,{match:r.match,timeoutSec:r.timeoutSec});return}if(r.subcommand==="stop"){r.stopScope?await Vy(r.stopScope):await Yy(r.file||void 0);return}if(r.subcommand==="send"){await zy(r.file,r.sendMessage,r.sendWaitMs??0);return}if(r.subcommand==="skill"){await Uy(ju);return}if(r.subcommand==="models"){await Fy(r.mode);return}if(r.subcommand==="pull"){await Fh(r.file||void 0,{force:r.force,mode:r.mode});return}if(r.subcommand==="push"){await Uh(r.file||void 0,{force:r.force,mode:r.mode});return}if(r.subcommand==="agent"){await(r.agentTarget?hb(r):jy(ju));return}if(r.subcommand==="trust"||r.subcommand==="untrust"){await $y(r.file||void 0,r.subcommand==="trust");return}let e;if(!r.file||r.file==="."){let c=await oh(process.cwd());c||(console.error("No .bulb.md file found in current directory"),process.exit(1)),e=c}else e=rr.resolve(r.file);if(await xb.access(e).then(()=>!0,()=>!1)||(qr().includes(r.file)&&(console.error(`To open the ${r.file} agent mirror, run: npx typebulb agent:${r.file}`),process.exit(1)),console.error(`File not found: ${e}`),process.exit(1)),e.endsWith(".bulb.md")||(console.error("File must have .bulb.md extension"),process.exit(1)),r.subcommand==="get"){await Qy(e,r.blockKind);return}if(r.subcommand==="put"){await tb(e,r.blockPairs);return}let n=r.file&&r.file!=="."?r.file:rr.relative(process.cwd(),e)||rr.basename(e),s=`npx typebulb --trust ${n.includes(" ")?`"${n}"`:n}`;if(r.subcommand==="predict"){await Iy(e,s);return}let i=!r.noTrust&&Yt(e);i&&!r.trust&&console.error("trust: granted from memory (run `typebulb untrust` to revoke)"),r.trust=r.noTrust?!1:r.trust||i;let o;try{o=await Ne(e)}catch{}let a;if(r.local){o&&!(r.local.name in(o.config.dependencies??{}))&&(console.error(`--replace: '${r.local.name}' is not a dependency in this bulb's config.json; nothing to replace.`),process.exit(1)),o&&r.subcommand!=="call"&&(!o.bulb.code||r.server)&&console.warn("warning: --replace has no effect in server mode (the override is client-only).");try{a=await Xu(r.local)}catch(c){console.error(c instanceof Error?c.message:String(c)),process.exit(1)}console.error(`replace: ${a.name} \u2192 ${rr.relative(process.cwd(),a.dir)||"."}`)}if(r.subcommand==="check"){await Ny(e,a);return}if(r.subcommand==="call"){kb(r.trust,s),await vb(e,{fn:r.fn,positional:r.callArgs,argsJson:r.argsJson,hasArgsFlag:r.hasArgsFlag},r.mode,a,r.batch);return}if(o&&o.bulb.server&&(hi(o.bulb)||r.server)){kb(r.trust,s),await yb(e,r.watch,r.mode,a,r.batch);return}await db(e,r,s,a)}NO().catch(r=>{console.error("Error:",r.message),process.exit(1)});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "typebulb",
|
|
3
|
-
"version": "0.39.
|
|
3
|
+
"version": "0.39.3",
|
|
4
4
|
"description": "Typebulb CLI to run single-file markdown apps called bulbs, either as standalone web apps or embedded in agent responses.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"highlight.js": "^11.10.0",
|
|
94
94
|
"katex": "^0.16.22",
|
|
95
95
|
"markdown-it": "^14.1.0",
|
|
96
|
-
"matchu-patchu": "^0.3.
|
|
96
|
+
"matchu-patchu": "^0.3.3",
|
|
97
97
|
"playwright": "^1.60.0",
|
|
98
98
|
"rimraf": "^6.0.1",
|
|
99
99
|
"typebox": "^1.3.4",
|