webmux 0.29.0 → 0.31.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/backend/dist/server.js +499 -177
- package/bin/webmux.js +1430 -989
- package/frontend/dist/assets/{DiffDialog-1-WiuIC4.js → DiffDialog-AFwqV11h.js} +1 -1
- package/frontend/dist/assets/index-CDyziN6b.js +33 -0
- package/frontend/dist/assets/index-yjEx8o8T.css +1 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-CqUU8MH2.css +0 -1
- package/frontend/dist/assets/index-D4JuH244.js +0 -33
package/backend/dist/server.js
CHANGED
|
@@ -16,7 +16,7 @@ var __export = (target, all) => {
|
|
|
16
16
|
};
|
|
17
17
|
var __require = import.meta.require;
|
|
18
18
|
|
|
19
|
-
// node_modules/.bun/yaml@2.
|
|
19
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js
|
|
20
20
|
var require_identity = __commonJS((exports) => {
|
|
21
21
|
var ALIAS = Symbol.for("yaml.alias");
|
|
22
22
|
var DOC = Symbol.for("yaml.document");
|
|
@@ -70,7 +70,7 @@ var require_identity = __commonJS((exports) => {
|
|
|
70
70
|
exports.isSeq = isSeq;
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
-
// node_modules/.bun/yaml@2.
|
|
73
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/visit.js
|
|
74
74
|
var require_visit = __commonJS((exports) => {
|
|
75
75
|
var identity = require_identity();
|
|
76
76
|
var BREAK = Symbol("break visit");
|
|
@@ -225,7 +225,7 @@ var require_visit = __commonJS((exports) => {
|
|
|
225
225
|
exports.visitAsync = visitAsync;
|
|
226
226
|
});
|
|
227
227
|
|
|
228
|
-
// node_modules/.bun/yaml@2.
|
|
228
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/directives.js
|
|
229
229
|
var require_directives = __commonJS((exports) => {
|
|
230
230
|
var identity = require_identity();
|
|
231
231
|
var visit = require_visit();
|
|
@@ -377,7 +377,7 @@ var require_directives = __commonJS((exports) => {
|
|
|
377
377
|
exports.Directives = Directives;
|
|
378
378
|
});
|
|
379
379
|
|
|
380
|
-
// node_modules/.bun/yaml@2.
|
|
380
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/anchors.js
|
|
381
381
|
var require_anchors = __commonJS((exports) => {
|
|
382
382
|
var identity = require_identity();
|
|
383
383
|
var visit = require_visit();
|
|
@@ -439,7 +439,7 @@ var require_anchors = __commonJS((exports) => {
|
|
|
439
439
|
exports.findNewAnchor = findNewAnchor;
|
|
440
440
|
});
|
|
441
441
|
|
|
442
|
-
// node_modules/.bun/yaml@2.
|
|
442
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/applyReviver.js
|
|
443
443
|
var require_applyReviver = __commonJS((exports) => {
|
|
444
444
|
function applyReviver(reviver, obj, key, val) {
|
|
445
445
|
if (val && typeof val === "object") {
|
|
@@ -486,7 +486,7 @@ var require_applyReviver = __commonJS((exports) => {
|
|
|
486
486
|
exports.applyReviver = applyReviver;
|
|
487
487
|
});
|
|
488
488
|
|
|
489
|
-
// node_modules/.bun/yaml@2.
|
|
489
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/toJS.js
|
|
490
490
|
var require_toJS = __commonJS((exports) => {
|
|
491
491
|
var identity = require_identity();
|
|
492
492
|
function toJS(value, arg, ctx) {
|
|
@@ -513,7 +513,7 @@ var require_toJS = __commonJS((exports) => {
|
|
|
513
513
|
exports.toJS = toJS;
|
|
514
514
|
});
|
|
515
515
|
|
|
516
|
-
// node_modules/.bun/yaml@2.
|
|
516
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Node.js
|
|
517
517
|
var require_Node = __commonJS((exports) => {
|
|
518
518
|
var applyReviver = require_applyReviver();
|
|
519
519
|
var identity = require_identity();
|
|
@@ -550,7 +550,7 @@ var require_Node = __commonJS((exports) => {
|
|
|
550
550
|
exports.NodeBase = NodeBase;
|
|
551
551
|
});
|
|
552
552
|
|
|
553
|
-
// node_modules/.bun/yaml@2.
|
|
553
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Alias.js
|
|
554
554
|
var require_Alias = __commonJS((exports) => {
|
|
555
555
|
var anchors = require_anchors();
|
|
556
556
|
var visit = require_visit();
|
|
@@ -569,6 +569,8 @@ var require_Alias = __commonJS((exports) => {
|
|
|
569
569
|
});
|
|
570
570
|
}
|
|
571
571
|
resolve(doc, ctx) {
|
|
572
|
+
if (ctx?.maxAliasCount === 0)
|
|
573
|
+
throw new ReferenceError("Alias resolution is disabled");
|
|
572
574
|
let nodes;
|
|
573
575
|
if (ctx?.aliasResolveCache) {
|
|
574
576
|
nodes = ctx.aliasResolveCache;
|
|
@@ -658,7 +660,7 @@ var require_Alias = __commonJS((exports) => {
|
|
|
658
660
|
exports.Alias = Alias;
|
|
659
661
|
});
|
|
660
662
|
|
|
661
|
-
// node_modules/.bun/yaml@2.
|
|
663
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Scalar.js
|
|
662
664
|
var require_Scalar = __commonJS((exports) => {
|
|
663
665
|
var identity = require_identity();
|
|
664
666
|
var Node = require_Node();
|
|
@@ -686,7 +688,7 @@ var require_Scalar = __commonJS((exports) => {
|
|
|
686
688
|
exports.isScalarValue = isScalarValue;
|
|
687
689
|
});
|
|
688
690
|
|
|
689
|
-
// node_modules/.bun/yaml@2.
|
|
691
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/createNode.js
|
|
690
692
|
var require_createNode = __commonJS((exports) => {
|
|
691
693
|
var Alias = require_Alias();
|
|
692
694
|
var identity = require_identity();
|
|
@@ -758,7 +760,7 @@ var require_createNode = __commonJS((exports) => {
|
|
|
758
760
|
exports.createNode = createNode;
|
|
759
761
|
});
|
|
760
762
|
|
|
761
|
-
// node_modules/.bun/yaml@2.
|
|
763
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Collection.js
|
|
762
764
|
var require_Collection = __commonJS((exports) => {
|
|
763
765
|
var createNode = require_createNode();
|
|
764
766
|
var identity = require_identity();
|
|
@@ -873,7 +875,7 @@ var require_Collection = __commonJS((exports) => {
|
|
|
873
875
|
exports.isEmptyPath = isEmptyPath;
|
|
874
876
|
});
|
|
875
877
|
|
|
876
|
-
// node_modules/.bun/yaml@2.
|
|
878
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyComment.js
|
|
877
879
|
var require_stringifyComment = __commonJS((exports) => {
|
|
878
880
|
var stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#");
|
|
879
881
|
function indentComment(comment, indent) {
|
|
@@ -890,7 +892,7 @@ var require_stringifyComment = __commonJS((exports) => {
|
|
|
890
892
|
exports.stringifyComment = stringifyComment;
|
|
891
893
|
});
|
|
892
894
|
|
|
893
|
-
// node_modules/.bun/yaml@2.
|
|
895
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/foldFlowLines.js
|
|
894
896
|
var require_foldFlowLines = __commonJS((exports) => {
|
|
895
897
|
var FOLD_FLOW = "flow";
|
|
896
898
|
var FOLD_BLOCK = "block";
|
|
@@ -1027,7 +1029,7 @@ ${indent}${text.slice(fold + 1, end2)}`;
|
|
|
1027
1029
|
exports.foldFlowLines = foldFlowLines;
|
|
1028
1030
|
});
|
|
1029
1031
|
|
|
1030
|
-
// node_modules/.bun/yaml@2.
|
|
1032
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyString.js
|
|
1031
1033
|
var require_stringifyString = __commonJS((exports) => {
|
|
1032
1034
|
var Scalar = require_Scalar();
|
|
1033
1035
|
var foldFlowLines = require_foldFlowLines();
|
|
@@ -1325,7 +1327,7 @@ ${indent}`);
|
|
|
1325
1327
|
exports.stringifyString = stringifyString;
|
|
1326
1328
|
});
|
|
1327
1329
|
|
|
1328
|
-
// node_modules/.bun/yaml@2.
|
|
1330
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringify.js
|
|
1329
1331
|
var require_stringify = __commonJS((exports) => {
|
|
1330
1332
|
var anchors = require_anchors();
|
|
1331
1333
|
var identity = require_identity();
|
|
@@ -1446,7 +1448,7 @@ ${ctx.indent}${str}`;
|
|
|
1446
1448
|
exports.stringify = stringify;
|
|
1447
1449
|
});
|
|
1448
1450
|
|
|
1449
|
-
// node_modules/.bun/yaml@2.
|
|
1451
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyPair.js
|
|
1450
1452
|
var require_stringifyPair = __commonJS((exports) => {
|
|
1451
1453
|
var identity = require_identity();
|
|
1452
1454
|
var Scalar = require_Scalar();
|
|
@@ -1582,7 +1584,7 @@ ${ctx.indent}`;
|
|
|
1582
1584
|
exports.stringifyPair = stringifyPair;
|
|
1583
1585
|
});
|
|
1584
1586
|
|
|
1585
|
-
// node_modules/.bun/yaml@2.
|
|
1587
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/log.js
|
|
1586
1588
|
var require_log = __commonJS((exports) => {
|
|
1587
1589
|
var node_process = __require("process");
|
|
1588
1590
|
function debug(logLevel, ...messages) {
|
|
@@ -1601,7 +1603,7 @@ var require_log = __commonJS((exports) => {
|
|
|
1601
1603
|
exports.warn = warn;
|
|
1602
1604
|
});
|
|
1603
1605
|
|
|
1604
|
-
// node_modules/.bun/yaml@2.
|
|
1606
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/merge.js
|
|
1605
1607
|
var require_merge = __commonJS((exports) => {
|
|
1606
1608
|
var identity = require_identity();
|
|
1607
1609
|
var Scalar = require_Scalar();
|
|
@@ -1618,18 +1620,18 @@ var require_merge = __commonJS((exports) => {
|
|
|
1618
1620
|
};
|
|
1619
1621
|
var isMergeKey = (ctx, key) => (merge.identify(key) || identity.isScalar(key) && (!key.type || key.type === Scalar.Scalar.PLAIN) && merge.identify(key.value)) && ctx?.doc.schema.tags.some((tag) => tag.tag === merge.tag && tag.default);
|
|
1620
1622
|
function addMergeToJSMap(ctx, map, value) {
|
|
1621
|
-
|
|
1622
|
-
if (identity.isSeq(
|
|
1623
|
-
for (const it of
|
|
1623
|
+
const source = resolveAliasValue(ctx, value);
|
|
1624
|
+
if (identity.isSeq(source))
|
|
1625
|
+
for (const it of source.items)
|
|
1624
1626
|
mergeValue(ctx, map, it);
|
|
1625
|
-
else if (Array.isArray(
|
|
1626
|
-
for (const it of
|
|
1627
|
+
else if (Array.isArray(source))
|
|
1628
|
+
for (const it of source)
|
|
1627
1629
|
mergeValue(ctx, map, it);
|
|
1628
1630
|
else
|
|
1629
|
-
mergeValue(ctx, map,
|
|
1631
|
+
mergeValue(ctx, map, source);
|
|
1630
1632
|
}
|
|
1631
1633
|
function mergeValue(ctx, map, value) {
|
|
1632
|
-
const source = ctx
|
|
1634
|
+
const source = resolveAliasValue(ctx, value);
|
|
1633
1635
|
if (!identity.isMap(source))
|
|
1634
1636
|
throw new Error("Merge sources must be maps or map aliases");
|
|
1635
1637
|
const srcMap = source.toJSON(null, ctx, Map);
|
|
@@ -1650,12 +1652,15 @@ var require_merge = __commonJS((exports) => {
|
|
|
1650
1652
|
}
|
|
1651
1653
|
return map;
|
|
1652
1654
|
}
|
|
1655
|
+
function resolveAliasValue(ctx, value) {
|
|
1656
|
+
return ctx && identity.isAlias(value) ? value.resolve(ctx.doc, ctx) : value;
|
|
1657
|
+
}
|
|
1653
1658
|
exports.addMergeToJSMap = addMergeToJSMap;
|
|
1654
1659
|
exports.isMergeKey = isMergeKey;
|
|
1655
1660
|
exports.merge = merge;
|
|
1656
1661
|
});
|
|
1657
1662
|
|
|
1658
|
-
// node_modules/.bun/yaml@2.
|
|
1663
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/addPairToJSMap.js
|
|
1659
1664
|
var require_addPairToJSMap = __commonJS((exports) => {
|
|
1660
1665
|
var log2 = require_log();
|
|
1661
1666
|
var merge = require_merge();
|
|
@@ -1716,7 +1721,7 @@ var require_addPairToJSMap = __commonJS((exports) => {
|
|
|
1716
1721
|
exports.addPairToJSMap = addPairToJSMap;
|
|
1717
1722
|
});
|
|
1718
1723
|
|
|
1719
|
-
// node_modules/.bun/yaml@2.
|
|
1724
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Pair.js
|
|
1720
1725
|
var require_Pair = __commonJS((exports) => {
|
|
1721
1726
|
var createNode = require_createNode();
|
|
1722
1727
|
var stringifyPair = require_stringifyPair();
|
|
@@ -1754,7 +1759,7 @@ var require_Pair = __commonJS((exports) => {
|
|
|
1754
1759
|
exports.createPair = createPair;
|
|
1755
1760
|
});
|
|
1756
1761
|
|
|
1757
|
-
// node_modules/.bun/yaml@2.
|
|
1762
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyCollection.js
|
|
1758
1763
|
var require_stringifyCollection = __commonJS((exports) => {
|
|
1759
1764
|
var identity = require_identity();
|
|
1760
1765
|
var stringify = require_stringify();
|
|
@@ -1906,7 +1911,7 @@ ${indent}${end}`;
|
|
|
1906
1911
|
exports.stringifyCollection = stringifyCollection;
|
|
1907
1912
|
});
|
|
1908
1913
|
|
|
1909
|
-
// node_modules/.bun/yaml@2.
|
|
1914
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLMap.js
|
|
1910
1915
|
var require_YAMLMap = __commonJS((exports) => {
|
|
1911
1916
|
var stringifyCollection = require_stringifyCollection();
|
|
1912
1917
|
var addPairToJSMap = require_addPairToJSMap();
|
|
@@ -2033,7 +2038,7 @@ var require_YAMLMap = __commonJS((exports) => {
|
|
|
2033
2038
|
exports.findPair = findPair;
|
|
2034
2039
|
});
|
|
2035
2040
|
|
|
2036
|
-
// node_modules/.bun/yaml@2.
|
|
2041
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/map.js
|
|
2037
2042
|
var require_map = __commonJS((exports) => {
|
|
2038
2043
|
var identity = require_identity();
|
|
2039
2044
|
var YAMLMap = require_YAMLMap();
|
|
@@ -2052,7 +2057,7 @@ var require_map = __commonJS((exports) => {
|
|
|
2052
2057
|
exports.map = map;
|
|
2053
2058
|
});
|
|
2054
2059
|
|
|
2055
|
-
// node_modules/.bun/yaml@2.
|
|
2060
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLSeq.js
|
|
2056
2061
|
var require_YAMLSeq = __commonJS((exports) => {
|
|
2057
2062
|
var createNode = require_createNode();
|
|
2058
2063
|
var stringifyCollection = require_stringifyCollection();
|
|
@@ -2145,7 +2150,7 @@ var require_YAMLSeq = __commonJS((exports) => {
|
|
|
2145
2150
|
exports.YAMLSeq = YAMLSeq;
|
|
2146
2151
|
});
|
|
2147
2152
|
|
|
2148
|
-
// node_modules/.bun/yaml@2.
|
|
2153
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/seq.js
|
|
2149
2154
|
var require_seq = __commonJS((exports) => {
|
|
2150
2155
|
var identity = require_identity();
|
|
2151
2156
|
var YAMLSeq = require_YAMLSeq();
|
|
@@ -2164,7 +2169,7 @@ var require_seq = __commonJS((exports) => {
|
|
|
2164
2169
|
exports.seq = seq;
|
|
2165
2170
|
});
|
|
2166
2171
|
|
|
2167
|
-
// node_modules/.bun/yaml@2.
|
|
2172
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/string.js
|
|
2168
2173
|
var require_string = __commonJS((exports) => {
|
|
2169
2174
|
var stringifyString = require_stringifyString();
|
|
2170
2175
|
var string = {
|
|
@@ -2180,7 +2185,7 @@ var require_string = __commonJS((exports) => {
|
|
|
2180
2185
|
exports.string = string;
|
|
2181
2186
|
});
|
|
2182
2187
|
|
|
2183
|
-
// node_modules/.bun/yaml@2.
|
|
2188
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/null.js
|
|
2184
2189
|
var require_null = __commonJS((exports) => {
|
|
2185
2190
|
var Scalar = require_Scalar();
|
|
2186
2191
|
var nullTag = {
|
|
@@ -2195,7 +2200,7 @@ var require_null = __commonJS((exports) => {
|
|
|
2195
2200
|
exports.nullTag = nullTag;
|
|
2196
2201
|
});
|
|
2197
2202
|
|
|
2198
|
-
// node_modules/.bun/yaml@2.
|
|
2203
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/bool.js
|
|
2199
2204
|
var require_bool = __commonJS((exports) => {
|
|
2200
2205
|
var Scalar = require_Scalar();
|
|
2201
2206
|
var boolTag = {
|
|
@@ -2216,7 +2221,7 @@ var require_bool = __commonJS((exports) => {
|
|
|
2216
2221
|
exports.boolTag = boolTag;
|
|
2217
2222
|
});
|
|
2218
2223
|
|
|
2219
|
-
// node_modules/.bun/yaml@2.
|
|
2224
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyNumber.js
|
|
2220
2225
|
var require_stringifyNumber = __commonJS((exports) => {
|
|
2221
2226
|
function stringifyNumber({ format, minFractionDigits, tag, value }) {
|
|
2222
2227
|
if (typeof value === "bigint")
|
|
@@ -2225,7 +2230,7 @@ var require_stringifyNumber = __commonJS((exports) => {
|
|
|
2225
2230
|
if (!isFinite(num))
|
|
2226
2231
|
return isNaN(num) ? ".nan" : num < 0 ? "-.inf" : ".inf";
|
|
2227
2232
|
let n = Object.is(value, -0) ? "-0" : JSON.stringify(value);
|
|
2228
|
-
if (!format && minFractionDigits && (!tag || tag === "tag:yaml.org,2002:float") &&
|
|
2233
|
+
if (!format && minFractionDigits && (!tag || tag === "tag:yaml.org,2002:float") && /^-?\d/.test(n) && !n.includes("e")) {
|
|
2229
2234
|
let i = n.indexOf(".");
|
|
2230
2235
|
if (i < 0) {
|
|
2231
2236
|
i = n.length;
|
|
@@ -2240,7 +2245,7 @@ var require_stringifyNumber = __commonJS((exports) => {
|
|
|
2240
2245
|
exports.stringifyNumber = stringifyNumber;
|
|
2241
2246
|
});
|
|
2242
2247
|
|
|
2243
|
-
// node_modules/.bun/yaml@2.
|
|
2248
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/float.js
|
|
2244
2249
|
var require_float = __commonJS((exports) => {
|
|
2245
2250
|
var Scalar = require_Scalar();
|
|
2246
2251
|
var stringifyNumber = require_stringifyNumber();
|
|
@@ -2283,7 +2288,7 @@ var require_float = __commonJS((exports) => {
|
|
|
2283
2288
|
exports.floatNaN = floatNaN;
|
|
2284
2289
|
});
|
|
2285
2290
|
|
|
2286
|
-
// node_modules/.bun/yaml@2.
|
|
2291
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/int.js
|
|
2287
2292
|
var require_int = __commonJS((exports) => {
|
|
2288
2293
|
var stringifyNumber = require_stringifyNumber();
|
|
2289
2294
|
var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
|
|
@@ -2325,7 +2330,7 @@ var require_int = __commonJS((exports) => {
|
|
|
2325
2330
|
exports.intOct = intOct;
|
|
2326
2331
|
});
|
|
2327
2332
|
|
|
2328
|
-
// node_modules/.bun/yaml@2.
|
|
2333
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/schema.js
|
|
2329
2334
|
var require_schema = __commonJS((exports) => {
|
|
2330
2335
|
var map = require_map();
|
|
2331
2336
|
var _null = require_null();
|
|
@@ -2350,7 +2355,7 @@ var require_schema = __commonJS((exports) => {
|
|
|
2350
2355
|
exports.schema = schema;
|
|
2351
2356
|
});
|
|
2352
2357
|
|
|
2353
|
-
// node_modules/.bun/yaml@2.
|
|
2358
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/json/schema.js
|
|
2354
2359
|
var require_schema2 = __commonJS((exports) => {
|
|
2355
2360
|
var Scalar = require_Scalar();
|
|
2356
2361
|
var map = require_map();
|
|
@@ -2414,7 +2419,7 @@ var require_schema2 = __commonJS((exports) => {
|
|
|
2414
2419
|
exports.schema = schema;
|
|
2415
2420
|
});
|
|
2416
2421
|
|
|
2417
|
-
// node_modules/.bun/yaml@2.
|
|
2422
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/binary.js
|
|
2418
2423
|
var require_binary = __commonJS((exports) => {
|
|
2419
2424
|
var node_buffer = __require("buffer");
|
|
2420
2425
|
var Scalar = require_Scalar();
|
|
@@ -2469,7 +2474,7 @@ var require_binary = __commonJS((exports) => {
|
|
|
2469
2474
|
exports.binary = binary;
|
|
2470
2475
|
});
|
|
2471
2476
|
|
|
2472
|
-
// node_modules/.bun/yaml@2.
|
|
2477
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/pairs.js
|
|
2473
2478
|
var require_pairs = __commonJS((exports) => {
|
|
2474
2479
|
var identity = require_identity();
|
|
2475
2480
|
var Pair = require_Pair();
|
|
@@ -2544,7 +2549,7 @@ ${cn.comment}` : item.comment;
|
|
|
2544
2549
|
exports.resolvePairs = resolvePairs;
|
|
2545
2550
|
});
|
|
2546
2551
|
|
|
2547
|
-
// node_modules/.bun/yaml@2.
|
|
2552
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/omap.js
|
|
2548
2553
|
var require_omap = __commonJS((exports) => {
|
|
2549
2554
|
var identity = require_identity();
|
|
2550
2555
|
var toJS = require_toJS();
|
|
@@ -2616,7 +2621,7 @@ var require_omap = __commonJS((exports) => {
|
|
|
2616
2621
|
exports.omap = omap;
|
|
2617
2622
|
});
|
|
2618
2623
|
|
|
2619
|
-
// node_modules/.bun/yaml@2.
|
|
2624
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/bool.js
|
|
2620
2625
|
var require_bool2 = __commonJS((exports) => {
|
|
2621
2626
|
var Scalar = require_Scalar();
|
|
2622
2627
|
function boolStringify({ value, source }, ctx) {
|
|
@@ -2645,7 +2650,7 @@ var require_bool2 = __commonJS((exports) => {
|
|
|
2645
2650
|
exports.trueTag = trueTag;
|
|
2646
2651
|
});
|
|
2647
2652
|
|
|
2648
|
-
// node_modules/.bun/yaml@2.
|
|
2653
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/float.js
|
|
2649
2654
|
var require_float2 = __commonJS((exports) => {
|
|
2650
2655
|
var Scalar = require_Scalar();
|
|
2651
2656
|
var stringifyNumber = require_stringifyNumber();
|
|
@@ -2691,7 +2696,7 @@ var require_float2 = __commonJS((exports) => {
|
|
|
2691
2696
|
exports.floatNaN = floatNaN;
|
|
2692
2697
|
});
|
|
2693
2698
|
|
|
2694
|
-
// node_modules/.bun/yaml@2.
|
|
2699
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/int.js
|
|
2695
2700
|
var require_int2 = __commonJS((exports) => {
|
|
2696
2701
|
var stringifyNumber = require_stringifyNumber();
|
|
2697
2702
|
var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
|
|
@@ -2767,7 +2772,7 @@ var require_int2 = __commonJS((exports) => {
|
|
|
2767
2772
|
exports.intOct = intOct;
|
|
2768
2773
|
});
|
|
2769
2774
|
|
|
2770
|
-
// node_modules/.bun/yaml@2.
|
|
2775
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/set.js
|
|
2771
2776
|
var require_set = __commonJS((exports) => {
|
|
2772
2777
|
var identity = require_identity();
|
|
2773
2778
|
var Pair = require_Pair();
|
|
@@ -2850,7 +2855,7 @@ var require_set = __commonJS((exports) => {
|
|
|
2850
2855
|
exports.set = set;
|
|
2851
2856
|
});
|
|
2852
2857
|
|
|
2853
|
-
// node_modules/.bun/yaml@2.
|
|
2858
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js
|
|
2854
2859
|
var require_timestamp = __commonJS((exports) => {
|
|
2855
2860
|
var stringifyNumber = require_stringifyNumber();
|
|
2856
2861
|
function parseSexagesimal(str, asBigInt) {
|
|
@@ -2932,7 +2937,7 @@ var require_timestamp = __commonJS((exports) => {
|
|
|
2932
2937
|
exports.timestamp = timestamp;
|
|
2933
2938
|
});
|
|
2934
2939
|
|
|
2935
|
-
// node_modules/.bun/yaml@2.
|
|
2940
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/schema.js
|
|
2936
2941
|
var require_schema3 = __commonJS((exports) => {
|
|
2937
2942
|
var map = require_map();
|
|
2938
2943
|
var _null = require_null();
|
|
@@ -2973,7 +2978,7 @@ var require_schema3 = __commonJS((exports) => {
|
|
|
2973
2978
|
exports.schema = schema;
|
|
2974
2979
|
});
|
|
2975
2980
|
|
|
2976
|
-
// node_modules/.bun/yaml@2.
|
|
2981
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/tags.js
|
|
2977
2982
|
var require_tags = __commonJS((exports) => {
|
|
2978
2983
|
var map = require_map();
|
|
2979
2984
|
var _null = require_null();
|
|
@@ -3064,7 +3069,7 @@ var require_tags = __commonJS((exports) => {
|
|
|
3064
3069
|
exports.getTags = getTags;
|
|
3065
3070
|
});
|
|
3066
3071
|
|
|
3067
|
-
// node_modules/.bun/yaml@2.
|
|
3072
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/Schema.js
|
|
3068
3073
|
var require_Schema = __commonJS((exports) => {
|
|
3069
3074
|
var identity = require_identity();
|
|
3070
3075
|
var map = require_map();
|
|
@@ -3094,7 +3099,7 @@ var require_Schema = __commonJS((exports) => {
|
|
|
3094
3099
|
exports.Schema = Schema;
|
|
3095
3100
|
});
|
|
3096
3101
|
|
|
3097
|
-
// node_modules/.bun/yaml@2.
|
|
3102
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyDocument.js
|
|
3098
3103
|
var require_stringifyDocument = __commonJS((exports) => {
|
|
3099
3104
|
var identity = require_identity();
|
|
3100
3105
|
var stringify = require_stringify();
|
|
@@ -3174,7 +3179,7 @@ var require_stringifyDocument = __commonJS((exports) => {
|
|
|
3174
3179
|
exports.stringifyDocument = stringifyDocument;
|
|
3175
3180
|
});
|
|
3176
3181
|
|
|
3177
|
-
// node_modules/.bun/yaml@2.
|
|
3182
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/Document.js
|
|
3178
3183
|
var require_Document = __commonJS((exports) => {
|
|
3179
3184
|
var Alias = require_Alias();
|
|
3180
3185
|
var Collection = require_Collection();
|
|
@@ -3409,7 +3414,7 @@ var require_Document = __commonJS((exports) => {
|
|
|
3409
3414
|
exports.Document = Document;
|
|
3410
3415
|
});
|
|
3411
3416
|
|
|
3412
|
-
// node_modules/.bun/yaml@2.
|
|
3417
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/errors.js
|
|
3413
3418
|
var require_errors = __commonJS((exports) => {
|
|
3414
3419
|
class YAMLError extends Error {
|
|
3415
3420
|
constructor(name, pos, code, message) {
|
|
@@ -3474,7 +3479,7 @@ ${pointer}
|
|
|
3474
3479
|
exports.prettifyError = prettifyError;
|
|
3475
3480
|
});
|
|
3476
3481
|
|
|
3477
|
-
// node_modules/.bun/yaml@2.
|
|
3482
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-props.js
|
|
3478
3483
|
var require_resolve_props = __commonJS((exports) => {
|
|
3479
3484
|
function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {
|
|
3480
3485
|
let spaceBefore = false;
|
|
@@ -3604,7 +3609,7 @@ var require_resolve_props = __commonJS((exports) => {
|
|
|
3604
3609
|
exports.resolveProps = resolveProps;
|
|
3605
3610
|
});
|
|
3606
3611
|
|
|
3607
|
-
// node_modules/.bun/yaml@2.
|
|
3612
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-contains-newline.js
|
|
3608
3613
|
var require_util_contains_newline = __commonJS((exports) => {
|
|
3609
3614
|
function containsNewline(key) {
|
|
3610
3615
|
if (!key)
|
|
@@ -3644,7 +3649,7 @@ var require_util_contains_newline = __commonJS((exports) => {
|
|
|
3644
3649
|
exports.containsNewline = containsNewline;
|
|
3645
3650
|
});
|
|
3646
3651
|
|
|
3647
|
-
// node_modules/.bun/yaml@2.
|
|
3652
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-flow-indent-check.js
|
|
3648
3653
|
var require_util_flow_indent_check = __commonJS((exports) => {
|
|
3649
3654
|
var utilContainsNewline = require_util_contains_newline();
|
|
3650
3655
|
function flowIndentCheck(indent, fc, onError) {
|
|
@@ -3659,7 +3664,7 @@ var require_util_flow_indent_check = __commonJS((exports) => {
|
|
|
3659
3664
|
exports.flowIndentCheck = flowIndentCheck;
|
|
3660
3665
|
});
|
|
3661
3666
|
|
|
3662
|
-
// node_modules/.bun/yaml@2.
|
|
3667
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-map-includes.js
|
|
3663
3668
|
var require_util_map_includes = __commonJS((exports) => {
|
|
3664
3669
|
var identity = require_identity();
|
|
3665
3670
|
function mapIncludes(ctx, items, search) {
|
|
@@ -3672,7 +3677,7 @@ var require_util_map_includes = __commonJS((exports) => {
|
|
|
3672
3677
|
exports.mapIncludes = mapIncludes;
|
|
3673
3678
|
});
|
|
3674
3679
|
|
|
3675
|
-
// node_modules/.bun/yaml@2.
|
|
3680
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-map.js
|
|
3676
3681
|
var require_resolve_block_map = __commonJS((exports) => {
|
|
3677
3682
|
var Pair = require_Pair();
|
|
3678
3683
|
var YAMLMap = require_YAMLMap();
|
|
@@ -3779,7 +3784,7 @@ var require_resolve_block_map = __commonJS((exports) => {
|
|
|
3779
3784
|
exports.resolveBlockMap = resolveBlockMap;
|
|
3780
3785
|
});
|
|
3781
3786
|
|
|
3782
|
-
// node_modules/.bun/yaml@2.
|
|
3787
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-seq.js
|
|
3783
3788
|
var require_resolve_block_seq = __commonJS((exports) => {
|
|
3784
3789
|
var YAMLSeq = require_YAMLSeq();
|
|
3785
3790
|
var resolveProps = require_resolve_props();
|
|
@@ -3827,7 +3832,7 @@ var require_resolve_block_seq = __commonJS((exports) => {
|
|
|
3827
3832
|
exports.resolveBlockSeq = resolveBlockSeq;
|
|
3828
3833
|
});
|
|
3829
3834
|
|
|
3830
|
-
// node_modules/.bun/yaml@2.
|
|
3835
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js
|
|
3831
3836
|
var require_resolve_end = __commonJS((exports) => {
|
|
3832
3837
|
function resolveEnd(end, offset, reqSpace, onError) {
|
|
3833
3838
|
let comment = "";
|
|
@@ -3867,7 +3872,7 @@ var require_resolve_end = __commonJS((exports) => {
|
|
|
3867
3872
|
exports.resolveEnd = resolveEnd;
|
|
3868
3873
|
});
|
|
3869
3874
|
|
|
3870
|
-
// node_modules/.bun/yaml@2.
|
|
3875
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-collection.js
|
|
3871
3876
|
var require_resolve_flow_collection = __commonJS((exports) => {
|
|
3872
3877
|
var identity = require_identity();
|
|
3873
3878
|
var Pair = require_Pair();
|
|
@@ -4058,7 +4063,7 @@ var require_resolve_flow_collection = __commonJS((exports) => {
|
|
|
4058
4063
|
exports.resolveFlowCollection = resolveFlowCollection;
|
|
4059
4064
|
});
|
|
4060
4065
|
|
|
4061
|
-
// node_modules/.bun/yaml@2.
|
|
4066
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-collection.js
|
|
4062
4067
|
var require_compose_collection = __commonJS((exports) => {
|
|
4063
4068
|
var identity = require_identity();
|
|
4064
4069
|
var Scalar = require_Scalar();
|
|
@@ -4120,7 +4125,7 @@ var require_compose_collection = __commonJS((exports) => {
|
|
|
4120
4125
|
exports.composeCollection = composeCollection;
|
|
4121
4126
|
});
|
|
4122
4127
|
|
|
4123
|
-
// node_modules/.bun/yaml@2.
|
|
4128
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-scalar.js
|
|
4124
4129
|
var require_resolve_block_scalar = __commonJS((exports) => {
|
|
4125
4130
|
var Scalar = require_Scalar();
|
|
4126
4131
|
function resolveBlockScalar(ctx, scalar, onError) {
|
|
@@ -4313,7 +4318,7 @@ var require_resolve_block_scalar = __commonJS((exports) => {
|
|
|
4313
4318
|
exports.resolveBlockScalar = resolveBlockScalar;
|
|
4314
4319
|
});
|
|
4315
4320
|
|
|
4316
|
-
// node_modules/.bun/yaml@2.
|
|
4321
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-scalar.js
|
|
4317
4322
|
var require_resolve_flow_scalar = __commonJS((exports) => {
|
|
4318
4323
|
var Scalar = require_Scalar();
|
|
4319
4324
|
var resolveEnd = require_resolve_end();
|
|
@@ -4450,7 +4455,7 @@ var require_resolve_flow_scalar = __commonJS((exports) => {
|
|
|
4450
4455
|
while (next === " " || next === "\t")
|
|
4451
4456
|
next = source[++i + 1];
|
|
4452
4457
|
} else if (next === "x" || next === "u" || next === "U") {
|
|
4453
|
-
const length =
|
|
4458
|
+
const length = next === "x" ? 2 : next === "u" ? 4 : 8;
|
|
4454
4459
|
res += parseCharCode(source, i + 1, length, onError);
|
|
4455
4460
|
i += length;
|
|
4456
4461
|
} else {
|
|
@@ -4519,17 +4524,18 @@ var require_resolve_flow_scalar = __commonJS((exports) => {
|
|
|
4519
4524
|
const cc = source.substr(offset, length);
|
|
4520
4525
|
const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);
|
|
4521
4526
|
const code = ok ? parseInt(cc, 16) : NaN;
|
|
4522
|
-
|
|
4527
|
+
try {
|
|
4528
|
+
return String.fromCodePoint(code);
|
|
4529
|
+
} catch {
|
|
4523
4530
|
const raw = source.substr(offset - 2, length + 2);
|
|
4524
4531
|
onError(offset - 2, "BAD_DQ_ESCAPE", `Invalid escape sequence ${raw}`);
|
|
4525
4532
|
return raw;
|
|
4526
4533
|
}
|
|
4527
|
-
return String.fromCodePoint(code);
|
|
4528
4534
|
}
|
|
4529
4535
|
exports.resolveFlowScalar = resolveFlowScalar;
|
|
4530
4536
|
});
|
|
4531
4537
|
|
|
4532
|
-
// node_modules/.bun/yaml@2.
|
|
4538
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-scalar.js
|
|
4533
4539
|
var require_compose_scalar = __commonJS((exports) => {
|
|
4534
4540
|
var identity = require_identity();
|
|
4535
4541
|
var Scalar = require_Scalar();
|
|
@@ -4607,7 +4613,7 @@ var require_compose_scalar = __commonJS((exports) => {
|
|
|
4607
4613
|
exports.composeScalar = composeScalar;
|
|
4608
4614
|
});
|
|
4609
4615
|
|
|
4610
|
-
// node_modules/.bun/yaml@2.
|
|
4616
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-empty-scalar-position.js
|
|
4611
4617
|
var require_util_empty_scalar_position = __commonJS((exports) => {
|
|
4612
4618
|
function emptyScalarPosition(offset, before, pos) {
|
|
4613
4619
|
if (before) {
|
|
@@ -4634,7 +4640,7 @@ var require_util_empty_scalar_position = __commonJS((exports) => {
|
|
|
4634
4640
|
exports.emptyScalarPosition = emptyScalarPosition;
|
|
4635
4641
|
});
|
|
4636
4642
|
|
|
4637
|
-
// node_modules/.bun/yaml@2.
|
|
4643
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-node.js
|
|
4638
4644
|
var require_compose_node = __commonJS((exports) => {
|
|
4639
4645
|
var Alias = require_Alias();
|
|
4640
4646
|
var identity = require_identity();
|
|
@@ -4737,7 +4743,7 @@ var require_compose_node = __commonJS((exports) => {
|
|
|
4737
4743
|
exports.composeNode = composeNode;
|
|
4738
4744
|
});
|
|
4739
4745
|
|
|
4740
|
-
// node_modules/.bun/yaml@2.
|
|
4746
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-doc.js
|
|
4741
4747
|
var require_compose_doc = __commonJS((exports) => {
|
|
4742
4748
|
var Document = require_Document();
|
|
4743
4749
|
var composeNode = require_compose_node();
|
|
@@ -4777,7 +4783,7 @@ var require_compose_doc = __commonJS((exports) => {
|
|
|
4777
4783
|
exports.composeDoc = composeDoc;
|
|
4778
4784
|
});
|
|
4779
4785
|
|
|
4780
|
-
// node_modules/.bun/yaml@2.
|
|
4786
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/composer.js
|
|
4781
4787
|
var require_composer = __commonJS((exports) => {
|
|
4782
4788
|
var node_process = __require("process");
|
|
4783
4789
|
var directives = require_directives();
|
|
@@ -4863,8 +4869,10 @@ ${cb}` : comment;
|
|
|
4863
4869
|
}
|
|
4864
4870
|
}
|
|
4865
4871
|
if (afterDoc) {
|
|
4866
|
-
|
|
4867
|
-
|
|
4872
|
+
for (let i = 0;i < this.errors.length; ++i)
|
|
4873
|
+
doc.errors.push(this.errors[i]);
|
|
4874
|
+
for (let i = 0;i < this.warnings.length; ++i)
|
|
4875
|
+
doc.warnings.push(this.warnings[i]);
|
|
4868
4876
|
} else {
|
|
4869
4877
|
doc.errors = this.errors;
|
|
4870
4878
|
doc.warnings = this.warnings;
|
|
@@ -4966,7 +4974,7 @@ ${end.comment}` : end.comment;
|
|
|
4966
4974
|
exports.Composer = Composer;
|
|
4967
4975
|
});
|
|
4968
4976
|
|
|
4969
|
-
// node_modules/.bun/yaml@2.
|
|
4977
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-scalar.js
|
|
4970
4978
|
var require_cst_scalar = __commonJS((exports) => {
|
|
4971
4979
|
var resolveBlockScalar = require_resolve_block_scalar();
|
|
4972
4980
|
var resolveFlowScalar = require_resolve_flow_scalar();
|
|
@@ -5156,7 +5164,7 @@ var require_cst_scalar = __commonJS((exports) => {
|
|
|
5156
5164
|
exports.setScalarValue = setScalarValue;
|
|
5157
5165
|
});
|
|
5158
5166
|
|
|
5159
|
-
// node_modules/.bun/yaml@2.
|
|
5167
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-stringify.js
|
|
5160
5168
|
var require_cst_stringify = __commonJS((exports) => {
|
|
5161
5169
|
var stringify = (cst) => ("type" in cst) ? stringifyToken(cst) : stringifyItem(cst);
|
|
5162
5170
|
function stringifyToken(token) {
|
|
@@ -5214,7 +5222,7 @@ var require_cst_stringify = __commonJS((exports) => {
|
|
|
5214
5222
|
exports.stringify = stringify;
|
|
5215
5223
|
});
|
|
5216
5224
|
|
|
5217
|
-
// node_modules/.bun/yaml@2.
|
|
5225
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-visit.js
|
|
5218
5226
|
var require_cst_visit = __commonJS((exports) => {
|
|
5219
5227
|
var BREAK = Symbol("break visit");
|
|
5220
5228
|
var SKIP = Symbol("skip children");
|
|
@@ -5273,7 +5281,7 @@ var require_cst_visit = __commonJS((exports) => {
|
|
|
5273
5281
|
exports.visit = visit;
|
|
5274
5282
|
});
|
|
5275
5283
|
|
|
5276
|
-
// node_modules/.bun/yaml@2.
|
|
5284
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst.js
|
|
5277
5285
|
var require_cst = __commonJS((exports) => {
|
|
5278
5286
|
var cstScalar = require_cst_scalar();
|
|
5279
5287
|
var cstStringify = require_cst_stringify();
|
|
@@ -5374,7 +5382,7 @@ var require_cst = __commonJS((exports) => {
|
|
|
5374
5382
|
exports.tokenType = tokenType;
|
|
5375
5383
|
});
|
|
5376
5384
|
|
|
5377
|
-
// node_modules/.bun/yaml@2.
|
|
5385
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/lexer.js
|
|
5378
5386
|
var require_lexer = __commonJS((exports) => {
|
|
5379
5387
|
var cst = require_cst();
|
|
5380
5388
|
function isEmpty(ch) {
|
|
@@ -5576,7 +5584,7 @@ var require_lexer = __commonJS((exports) => {
|
|
|
5576
5584
|
const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true));
|
|
5577
5585
|
this.indentNext = this.indentValue + 1;
|
|
5578
5586
|
this.indentValue += n;
|
|
5579
|
-
return
|
|
5587
|
+
return "block-start";
|
|
5580
5588
|
}
|
|
5581
5589
|
return "doc";
|
|
5582
5590
|
}
|
|
@@ -5883,26 +5891,37 @@ var require_lexer = __commonJS((exports) => {
|
|
|
5883
5891
|
return 0;
|
|
5884
5892
|
}
|
|
5885
5893
|
*pushIndicators() {
|
|
5886
|
-
|
|
5887
|
-
|
|
5888
|
-
|
|
5889
|
-
|
|
5890
|
-
|
|
5891
|
-
|
|
5892
|
-
|
|
5893
|
-
|
|
5894
|
-
|
|
5895
|
-
|
|
5896
|
-
|
|
5897
|
-
|
|
5898
|
-
|
|
5899
|
-
|
|
5900
|
-
|
|
5901
|
-
|
|
5894
|
+
let n = 0;
|
|
5895
|
+
loop:
|
|
5896
|
+
while (true) {
|
|
5897
|
+
switch (this.charAt(0)) {
|
|
5898
|
+
case "!":
|
|
5899
|
+
n += yield* this.pushTag();
|
|
5900
|
+
n += yield* this.pushSpaces(true);
|
|
5901
|
+
continue loop;
|
|
5902
|
+
case "&":
|
|
5903
|
+
n += yield* this.pushUntil(isNotAnchorChar);
|
|
5904
|
+
n += yield* this.pushSpaces(true);
|
|
5905
|
+
continue loop;
|
|
5906
|
+
case "-":
|
|
5907
|
+
case "?":
|
|
5908
|
+
case ":": {
|
|
5909
|
+
const inFlow = this.flowLevel > 0;
|
|
5910
|
+
const ch1 = this.charAt(1);
|
|
5911
|
+
if (isEmpty(ch1) || inFlow && flowIndicatorChars.has(ch1)) {
|
|
5912
|
+
if (!inFlow)
|
|
5913
|
+
this.indentNext = this.indentValue + 1;
|
|
5914
|
+
else if (this.flowKey)
|
|
5915
|
+
this.flowKey = false;
|
|
5916
|
+
n += yield* this.pushCount(1);
|
|
5917
|
+
n += yield* this.pushSpaces(true);
|
|
5918
|
+
continue loop;
|
|
5919
|
+
}
|
|
5920
|
+
}
|
|
5902
5921
|
}
|
|
5922
|
+
break loop;
|
|
5903
5923
|
}
|
|
5904
|
-
|
|
5905
|
-
return 0;
|
|
5924
|
+
return n;
|
|
5906
5925
|
}
|
|
5907
5926
|
*pushTag() {
|
|
5908
5927
|
if (this.charAt(1) === "<") {
|
|
@@ -5960,7 +5979,7 @@ var require_lexer = __commonJS((exports) => {
|
|
|
5960
5979
|
exports.Lexer = Lexer;
|
|
5961
5980
|
});
|
|
5962
5981
|
|
|
5963
|
-
// node_modules/.bun/yaml@2.
|
|
5982
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/line-counter.js
|
|
5964
5983
|
var require_line_counter = __commonJS((exports) => {
|
|
5965
5984
|
class LineCounter {
|
|
5966
5985
|
constructor() {
|
|
@@ -5988,7 +6007,7 @@ var require_line_counter = __commonJS((exports) => {
|
|
|
5988
6007
|
exports.LineCounter = LineCounter;
|
|
5989
6008
|
});
|
|
5990
6009
|
|
|
5991
|
-
// node_modules/.bun/yaml@2.
|
|
6010
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/parser.js
|
|
5992
6011
|
var require_parser = __commonJS((exports) => {
|
|
5993
6012
|
var node_process = __require("process");
|
|
5994
6013
|
var cst = require_cst();
|
|
@@ -6056,6 +6075,13 @@ var require_parser = __commonJS((exports) => {
|
|
|
6056
6075
|
while (prev[++i]?.type === "space") {}
|
|
6057
6076
|
return prev.splice(i, prev.length);
|
|
6058
6077
|
}
|
|
6078
|
+
function arrayPushArray(target, source) {
|
|
6079
|
+
if (source.length < 1e5)
|
|
6080
|
+
Array.prototype.push.apply(target, source);
|
|
6081
|
+
else
|
|
6082
|
+
for (let i = 0;i < source.length; ++i)
|
|
6083
|
+
target.push(source[i]);
|
|
6084
|
+
}
|
|
6059
6085
|
function fixFlowSeqItems(fc) {
|
|
6060
6086
|
if (fc.start.type === "flow-seq-start") {
|
|
6061
6087
|
for (const it of fc.items) {
|
|
@@ -6065,11 +6091,11 @@ var require_parser = __commonJS((exports) => {
|
|
|
6065
6091
|
delete it.key;
|
|
6066
6092
|
if (isFlowToken(it.value)) {
|
|
6067
6093
|
if (it.value.end)
|
|
6068
|
-
|
|
6094
|
+
arrayPushArray(it.value.end, it.sep);
|
|
6069
6095
|
else
|
|
6070
6096
|
it.value.end = it.sep;
|
|
6071
6097
|
} else
|
|
6072
|
-
|
|
6098
|
+
arrayPushArray(it.start, it.sep);
|
|
6073
6099
|
delete it.sep;
|
|
6074
6100
|
}
|
|
6075
6101
|
}
|
|
@@ -6409,7 +6435,7 @@ var require_parser = __commonJS((exports) => {
|
|
|
6409
6435
|
const prev = map.items[map.items.length - 2];
|
|
6410
6436
|
const end = prev?.value?.end;
|
|
6411
6437
|
if (Array.isArray(end)) {
|
|
6412
|
-
|
|
6438
|
+
arrayPushArray(end, it.start);
|
|
6413
6439
|
end.push(this.sourceToken);
|
|
6414
6440
|
map.items.pop();
|
|
6415
6441
|
return;
|
|
@@ -6597,7 +6623,7 @@ var require_parser = __commonJS((exports) => {
|
|
|
6597
6623
|
const prev = seq.items[seq.items.length - 2];
|
|
6598
6624
|
const end = prev?.value?.end;
|
|
6599
6625
|
if (Array.isArray(end)) {
|
|
6600
|
-
|
|
6626
|
+
arrayPushArray(end, it.start);
|
|
6601
6627
|
end.push(this.sourceToken);
|
|
6602
6628
|
seq.items.pop();
|
|
6603
6629
|
return;
|
|
@@ -6837,7 +6863,7 @@ var require_parser = __commonJS((exports) => {
|
|
|
6837
6863
|
exports.Parser = Parser;
|
|
6838
6864
|
});
|
|
6839
6865
|
|
|
6840
|
-
// node_modules/.bun/yaml@2.
|
|
6866
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/public-api.js
|
|
6841
6867
|
var require_public_api = __commonJS((exports) => {
|
|
6842
6868
|
var composer = require_composer();
|
|
6843
6869
|
var Document = require_Document();
|
|
@@ -6933,7 +6959,7 @@ var require_public_api = __commonJS((exports) => {
|
|
|
6933
6959
|
|
|
6934
6960
|
// backend/src/server.ts
|
|
6935
6961
|
import { randomUUID as randomUUID3 } from "crypto";
|
|
6936
|
-
import { join as join8, resolve as
|
|
6962
|
+
import { join as join8, resolve as resolve9 } from "path";
|
|
6937
6963
|
import { mkdirSync } from "fs";
|
|
6938
6964
|
import { networkInterfaces } from "os";
|
|
6939
6965
|
|
|
@@ -10910,7 +10936,7 @@ var coerce = {
|
|
|
10910
10936
|
date: (arg) => ZodDate.create({ ...arg, coerce: true })
|
|
10911
10937
|
};
|
|
10912
10938
|
var NEVER = INVALID;
|
|
10913
|
-
// node_modules/.bun/@ts-rest+core@3.52.1+
|
|
10939
|
+
// node_modules/.bun/@ts-rest+core@3.52.1+1c8a9bbc689bc595/node_modules/@ts-rest/core/index.esm.mjs
|
|
10914
10940
|
var isZodObjectStrict = (obj) => {
|
|
10915
10941
|
return typeof (obj === null || obj === undefined ? undefined : obj.passthrough) === "function";
|
|
10916
10942
|
};
|
|
@@ -11081,6 +11107,13 @@ var SetWorktreeArchivedResponseSchema = exports_external.object({
|
|
|
11081
11107
|
ok: exports_external.literal(true),
|
|
11082
11108
|
archived: exports_external.boolean()
|
|
11083
11109
|
});
|
|
11110
|
+
var SetWorktreeLabelRequestSchema = exports_external.object({
|
|
11111
|
+
label: exports_external.string().trim().max(80).nullable()
|
|
11112
|
+
});
|
|
11113
|
+
var SetWorktreeLabelResponseSchema = exports_external.object({
|
|
11114
|
+
ok: exports_external.literal(true),
|
|
11115
|
+
label: exports_external.string().nullable()
|
|
11116
|
+
});
|
|
11084
11117
|
var ToggleEnabledRequestSchema = exports_external.object({
|
|
11085
11118
|
enabled: exports_external.boolean()
|
|
11086
11119
|
});
|
|
@@ -11190,6 +11223,7 @@ var AppNotificationSchema = exports_external.object({
|
|
|
11190
11223
|
});
|
|
11191
11224
|
var ProjectWorktreeSnapshotSchema = exports_external.object({
|
|
11192
11225
|
branch: exports_external.string(),
|
|
11226
|
+
label: exports_external.string().nullable(),
|
|
11193
11227
|
baseBranch: exports_external.string().optional(),
|
|
11194
11228
|
path: exports_external.string(),
|
|
11195
11229
|
dir: exports_external.string(),
|
|
@@ -11385,6 +11419,7 @@ var apiPaths = {
|
|
|
11385
11419
|
openWorktree: "/api/worktrees/:name/open",
|
|
11386
11420
|
closeWorktree: "/api/worktrees/:name/close",
|
|
11387
11421
|
setWorktreeArchived: "/api/worktrees/:name/archive",
|
|
11422
|
+
setWorktreeLabel: "/api/worktrees/:name/label",
|
|
11388
11423
|
sendWorktreePrompt: "/api/worktrees/:name/send",
|
|
11389
11424
|
mergeWorktree: "/api/worktrees/:name/merge",
|
|
11390
11425
|
fetchWorktreeDiff: "/api/worktrees/:name/diff",
|
|
@@ -11588,6 +11623,16 @@ var apiContract = c.router({
|
|
|
11588
11623
|
...commonErrorResponses
|
|
11589
11624
|
}
|
|
11590
11625
|
},
|
|
11626
|
+
setWorktreeLabel: {
|
|
11627
|
+
method: "PUT",
|
|
11628
|
+
path: apiPaths.setWorktreeLabel,
|
|
11629
|
+
pathParams: WorktreeNameParamsSchema,
|
|
11630
|
+
body: SetWorktreeLabelRequestSchema,
|
|
11631
|
+
responses: {
|
|
11632
|
+
200: SetWorktreeLabelResponseSchema,
|
|
11633
|
+
...commonErrorResponses
|
|
11634
|
+
}
|
|
11635
|
+
},
|
|
11591
11636
|
sendWorktreePrompt: {
|
|
11592
11637
|
method: "POST",
|
|
11593
11638
|
path: apiPaths.sendWorktreePrompt,
|
|
@@ -11969,7 +12014,7 @@ async function sendPrompt(worktreeId, target, text, paneIndex = 0, preamble, sub
|
|
|
11969
12014
|
if (load.exitCode !== 0) {
|
|
11970
12015
|
return { ok: false, error: `load-buffer failed${load.stderr ? `: ${load.stderr}` : ""}` };
|
|
11971
12016
|
}
|
|
11972
|
-
const paste = await tmuxExec(["tmux", "paste-buffer", "-b", bufferName, "-t", paneTarget, "-d"]);
|
|
12017
|
+
const paste = await tmuxExec(["tmux", "paste-buffer", "-rp", "-b", bufferName, "-t", paneTarget, "-d"]);
|
|
11973
12018
|
if (paste.exitCode !== 0) {
|
|
11974
12019
|
return { ok: false, error: `paste-buffer failed${paste.stderr ? `: ${paste.stderr}` : ""}` };
|
|
11975
12020
|
}
|
|
@@ -12728,7 +12773,7 @@ class CodexAppServerClient {
|
|
|
12728
12773
|
import { readFileSync } from "fs";
|
|
12729
12774
|
import { dirname as dirname2, join as join2, resolve } from "path";
|
|
12730
12775
|
|
|
12731
|
-
// node_modules/.bun/yaml@2.
|
|
12776
|
+
// node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/index.js
|
|
12732
12777
|
var composer = require_composer();
|
|
12733
12778
|
var Document = require_Document();
|
|
12734
12779
|
var Schema = require_Schema();
|
|
@@ -13376,6 +13421,12 @@ function pruneArchivedWorktreeState(input) {
|
|
|
13376
13421
|
}
|
|
13377
13422
|
|
|
13378
13423
|
// backend/src/services/agent-chat-service.ts
|
|
13424
|
+
var CODEX_SUBMIT_DELAY_MS = 200;
|
|
13425
|
+
function resolveAgentTerminalSubmitDelayMs(input) {
|
|
13426
|
+
if (!input.agentId || !input.agent || input.agent.kind !== "builtin")
|
|
13427
|
+
return 0;
|
|
13428
|
+
return input.agent.implementation.agent === "codex" ? CODEX_SUBMIT_DELAY_MS : 0;
|
|
13429
|
+
}
|
|
13379
13430
|
function resolveAgentChatSupport(input) {
|
|
13380
13431
|
if (!input.agentId) {
|
|
13381
13432
|
return {
|
|
@@ -13411,7 +13462,7 @@ function resolveAgentChatSupport(input) {
|
|
|
13411
13462
|
ok: true,
|
|
13412
13463
|
data: {
|
|
13413
13464
|
provider: input.agent.implementation.agent,
|
|
13414
|
-
submitDelayMs: input
|
|
13465
|
+
submitDelayMs: resolveAgentTerminalSubmitDelayMs(input)
|
|
13415
13466
|
}
|
|
13416
13467
|
};
|
|
13417
13468
|
}
|
|
@@ -13880,11 +13931,11 @@ async function createLinearIssue(input) {
|
|
|
13880
13931
|
|
|
13881
13932
|
// backend/src/services/lifecycle-service.ts
|
|
13882
13933
|
import { mkdir as mkdir4 } from "fs/promises";
|
|
13883
|
-
import { dirname as dirname4, resolve as
|
|
13934
|
+
import { dirname as dirname4, resolve as resolve7 } from "path";
|
|
13884
13935
|
|
|
13885
13936
|
// backend/src/adapters/agent-runtime.ts
|
|
13886
13937
|
import { chmod as chmod2, mkdir as mkdir3 } from "fs/promises";
|
|
13887
|
-
import { dirname as dirname3, join as join4 } from "path";
|
|
13938
|
+
import { dirname as dirname3, join as join4, resolve as resolve3 } from "path";
|
|
13888
13939
|
|
|
13889
13940
|
// backend/src/adapters/fs.ts
|
|
13890
13941
|
import { mkdir as mkdir2 } from "fs/promises";
|
|
@@ -14059,11 +14110,22 @@ function normalizeConversationMeta(raw) {
|
|
|
14059
14110
|
};
|
|
14060
14111
|
return normalized;
|
|
14061
14112
|
}
|
|
14113
|
+
function normalizeOptionalString(raw) {
|
|
14114
|
+
return typeof raw === "string" && raw.trim() ? raw.trim() : undefined;
|
|
14115
|
+
}
|
|
14062
14116
|
function normalizeWorktreeMeta(meta) {
|
|
14063
14117
|
const conversation = normalizeConversationMeta(meta.conversation);
|
|
14064
|
-
|
|
14065
|
-
|
|
14066
|
-
|
|
14118
|
+
const normalizedLabel = normalizeOptionalString(meta.label);
|
|
14119
|
+
if (conversation === meta.conversation && normalizedLabel === meta.label) {
|
|
14120
|
+
return meta;
|
|
14121
|
+
}
|
|
14122
|
+
const rest = { ...meta };
|
|
14123
|
+
delete rest.label;
|
|
14124
|
+
delete rest.conversation;
|
|
14125
|
+
return {
|
|
14126
|
+
...rest,
|
|
14127
|
+
...normalizedLabel ? { label: normalizedLabel } : {},
|
|
14128
|
+
...conversation !== undefined ? { conversation } : {}
|
|
14067
14129
|
};
|
|
14068
14130
|
}
|
|
14069
14131
|
function isPrComment(raw) {
|
|
@@ -14097,6 +14159,7 @@ async function writeWorktreePrs(gitDir, prs) {
|
|
|
14097
14159
|
}
|
|
14098
14160
|
|
|
14099
14161
|
// backend/src/adapters/agent-runtime.ts
|
|
14162
|
+
var GENERATED_CODEX_HOOKS_EXCLUDE = ".codex/hooks.json";
|
|
14100
14163
|
function shellQuote(value) {
|
|
14101
14164
|
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
14102
14165
|
}
|
|
@@ -14115,6 +14178,7 @@ from pathlib import Path
|
|
|
14115
14178
|
|
|
14116
14179
|
|
|
14117
14180
|
CONTROL_ENV_PATH = Path(__file__).resolve().with_name("control.env")
|
|
14181
|
+
CONTROL_REQUEST_TIMEOUT_SECONDS = 2
|
|
14118
14182
|
|
|
14119
14183
|
|
|
14120
14184
|
def read_control_env():
|
|
@@ -14144,6 +14208,7 @@ def build_parser():
|
|
|
14144
14208
|
|
|
14145
14209
|
status_changed = subparsers.add_parser("status-changed")
|
|
14146
14210
|
status_changed.add_argument("--lifecycle", choices=["starting", "running", "idle", "stopped"], required=True)
|
|
14211
|
+
status_changed.add_argument("--best-effort", action="store_true")
|
|
14147
14212
|
|
|
14148
14213
|
pr_opened = subparsers.add_parser("pr-opened")
|
|
14149
14214
|
pr_opened.add_argument("--url")
|
|
@@ -14153,6 +14218,11 @@ def build_parser():
|
|
|
14153
14218
|
|
|
14154
14219
|
subparsers.add_parser("claude-user-prompt-submit")
|
|
14155
14220
|
subparsers.add_parser("claude-post-tool-use")
|
|
14221
|
+
subparsers.add_parser("codex-session-start")
|
|
14222
|
+
subparsers.add_parser("codex-user-prompt-submit")
|
|
14223
|
+
subparsers.add_parser("codex-permission-request")
|
|
14224
|
+
subparsers.add_parser("codex-post-tool-use")
|
|
14225
|
+
subparsers.add_parser("codex-stop")
|
|
14156
14226
|
|
|
14157
14227
|
return parser
|
|
14158
14228
|
|
|
@@ -14195,6 +14265,41 @@ def read_hook_payload():
|
|
|
14195
14265
|
return parsed if isinstance(parsed, dict) else {}
|
|
14196
14266
|
|
|
14197
14267
|
|
|
14268
|
+
def iter_string_values(value):
|
|
14269
|
+
if isinstance(value, str):
|
|
14270
|
+
yield value
|
|
14271
|
+
return
|
|
14272
|
+
if isinstance(value, dict):
|
|
14273
|
+
for child in value.values():
|
|
14274
|
+
yield from iter_string_values(child)
|
|
14275
|
+
return
|
|
14276
|
+
if isinstance(value, list):
|
|
14277
|
+
for child in value:
|
|
14278
|
+
yield from iter_string_values(child)
|
|
14279
|
+
|
|
14280
|
+
|
|
14281
|
+
def find_pr_url(value):
|
|
14282
|
+
for text in iter_string_values(value):
|
|
14283
|
+
match = re.search(r"https://github\\.com/[^\\s\\"]+/pull/\\d+", text)
|
|
14284
|
+
if match:
|
|
14285
|
+
return match.group(0)
|
|
14286
|
+
return None
|
|
14287
|
+
|
|
14288
|
+
|
|
14289
|
+
def maybe_send_pr_opened(hook_payload, control_env):
|
|
14290
|
+
tool_name = hook_payload.get("tool_name")
|
|
14291
|
+
tool_input = hook_payload.get("tool_input")
|
|
14292
|
+
if not isinstance(tool_input, dict) or tool_name != "Bash":
|
|
14293
|
+
return True
|
|
14294
|
+
|
|
14295
|
+
command = tool_input.get("command")
|
|
14296
|
+
if not isinstance(command, str) or "gh pr create" not in command:
|
|
14297
|
+
return True
|
|
14298
|
+
|
|
14299
|
+
pr_args = argparse.Namespace(url=find_pr_url(hook_payload.get("tool_response")))
|
|
14300
|
+
return send_payload(build_payload("pr-opened", pr_args, control_env), control_env)
|
|
14301
|
+
|
|
14302
|
+
|
|
14198
14303
|
def send_payload(payload, control_env):
|
|
14199
14304
|
request = urllib.request.Request(
|
|
14200
14305
|
control_env["WEBMUX_CONTROL_URL"],
|
|
@@ -14207,7 +14312,7 @@ def send_payload(payload, control_env):
|
|
|
14207
14312
|
)
|
|
14208
14313
|
|
|
14209
14314
|
try:
|
|
14210
|
-
with urllib.request.urlopen(request, timeout=
|
|
14315
|
+
with urllib.request.urlopen(request, timeout=CONTROL_REQUEST_TIMEOUT_SECONDS) as response:
|
|
14211
14316
|
if response.status < 200 or response.status >= 300:
|
|
14212
14317
|
print(f"control endpoint returned HTTP {response.status}", file=sys.stderr)
|
|
14213
14318
|
return False
|
|
@@ -14241,34 +14346,40 @@ def main():
|
|
|
14241
14346
|
print(f"missing control env keys: {', '.join(missing)}", file=sys.stderr)
|
|
14242
14347
|
return 1
|
|
14243
14348
|
|
|
14349
|
+
if parsed.command == "codex-session-start":
|
|
14350
|
+
send_payload(build_payload("status-changed", argparse.Namespace(lifecycle="idle"), control_env), control_env)
|
|
14351
|
+
return 0
|
|
14352
|
+
|
|
14353
|
+
if parsed.command == "codex-user-prompt-submit":
|
|
14354
|
+
send_payload(build_payload("status-changed", argparse.Namespace(lifecycle="running"), control_env), control_env)
|
|
14355
|
+
return 0
|
|
14356
|
+
|
|
14244
14357
|
if parsed.command == "claude-user-prompt-submit":
|
|
14245
14358
|
if not send_payload(build_payload("status-changed", argparse.Namespace(lifecycle="running"), control_env), control_env):
|
|
14246
14359
|
return 1
|
|
14247
14360
|
return 0
|
|
14248
14361
|
|
|
14249
|
-
if parsed.command == "
|
|
14250
|
-
|
|
14251
|
-
|
|
14252
|
-
tool_input = hook_payload.get("tool_input")
|
|
14253
|
-
if not isinstance(tool_input, dict) or tool_name != "Bash":
|
|
14254
|
-
return 0
|
|
14362
|
+
if parsed.command == "codex-permission-request":
|
|
14363
|
+
send_payload(build_payload("status-changed", argparse.Namespace(lifecycle="idle"), control_env), control_env)
|
|
14364
|
+
return 0
|
|
14255
14365
|
|
|
14256
|
-
|
|
14257
|
-
|
|
14258
|
-
|
|
14366
|
+
if parsed.command == "codex-post-tool-use":
|
|
14367
|
+
hook_payload = read_hook_payload()
|
|
14368
|
+
maybe_send_pr_opened(hook_payload, control_env)
|
|
14369
|
+
return 0
|
|
14259
14370
|
|
|
14260
|
-
|
|
14261
|
-
|
|
14262
|
-
if
|
|
14263
|
-
match = re.search(r"https://github\\.com/[^\\s\\"]+/pull/\\d+", tool_response)
|
|
14264
|
-
if match:
|
|
14265
|
-
pr_args.url = match.group(0)
|
|
14371
|
+
if parsed.command == "claude-post-tool-use":
|
|
14372
|
+
hook_payload = read_hook_payload()
|
|
14373
|
+
return 0 if maybe_send_pr_opened(hook_payload, control_env) else 1
|
|
14266
14374
|
|
|
14267
|
-
|
|
14375
|
+
if parsed.command == "codex-stop":
|
|
14376
|
+
send_payload(build_payload("agent-stopped", parsed, control_env), control_env)
|
|
14377
|
+
print(json.dumps({}))
|
|
14378
|
+
return 0
|
|
14268
14379
|
|
|
14269
14380
|
payload = build_payload(parsed.command, parsed, control_env)
|
|
14270
14381
|
if not send_payload(payload, control_env):
|
|
14271
|
-
return 1
|
|
14382
|
+
return 0 if getattr(parsed, "best_effort", False) else 1
|
|
14272
14383
|
|
|
14273
14384
|
return 0
|
|
14274
14385
|
|
|
@@ -14338,6 +14449,81 @@ function buildClaudeHookSettings(input) {
|
|
|
14338
14449
|
}
|
|
14339
14450
|
};
|
|
14340
14451
|
}
|
|
14452
|
+
function buildCodexHookSettings(input) {
|
|
14453
|
+
const statusCommand = `${shellQuote(input.agentCtlPath)} status-changed --lifecycle running --best-effort`;
|
|
14454
|
+
return {
|
|
14455
|
+
hooks: {
|
|
14456
|
+
SessionStart: [
|
|
14457
|
+
{
|
|
14458
|
+
matcher: "startup|resume|clear",
|
|
14459
|
+
hooks: [
|
|
14460
|
+
{
|
|
14461
|
+
type: "command",
|
|
14462
|
+
command: `${shellQuote(input.agentCtlPath)} codex-session-start`,
|
|
14463
|
+
timeout: 30
|
|
14464
|
+
}
|
|
14465
|
+
]
|
|
14466
|
+
}
|
|
14467
|
+
],
|
|
14468
|
+
UserPromptSubmit: [
|
|
14469
|
+
{
|
|
14470
|
+
hooks: [
|
|
14471
|
+
{
|
|
14472
|
+
type: "command",
|
|
14473
|
+
command: `${shellQuote(input.agentCtlPath)} codex-user-prompt-submit`,
|
|
14474
|
+
timeout: 30
|
|
14475
|
+
}
|
|
14476
|
+
]
|
|
14477
|
+
}
|
|
14478
|
+
],
|
|
14479
|
+
PermissionRequest: [
|
|
14480
|
+
{
|
|
14481
|
+
hooks: [
|
|
14482
|
+
{
|
|
14483
|
+
type: "command",
|
|
14484
|
+
command: `${shellQuote(input.agentCtlPath)} codex-permission-request`,
|
|
14485
|
+
timeout: 30
|
|
14486
|
+
}
|
|
14487
|
+
]
|
|
14488
|
+
}
|
|
14489
|
+
],
|
|
14490
|
+
PreToolUse: [
|
|
14491
|
+
{
|
|
14492
|
+
hooks: [
|
|
14493
|
+
{
|
|
14494
|
+
type: "command",
|
|
14495
|
+
command: statusCommand,
|
|
14496
|
+
timeout: 30
|
|
14497
|
+
}
|
|
14498
|
+
]
|
|
14499
|
+
}
|
|
14500
|
+
],
|
|
14501
|
+
PostToolUse: [
|
|
14502
|
+
{
|
|
14503
|
+
matcher: "Bash",
|
|
14504
|
+
hooks: [
|
|
14505
|
+
{
|
|
14506
|
+
type: "command",
|
|
14507
|
+
command: `${shellQuote(input.agentCtlPath)} codex-post-tool-use`,
|
|
14508
|
+
timeout: 30
|
|
14509
|
+
}
|
|
14510
|
+
]
|
|
14511
|
+
}
|
|
14512
|
+
],
|
|
14513
|
+
Stop: [
|
|
14514
|
+
{
|
|
14515
|
+
hooks: [
|
|
14516
|
+
{
|
|
14517
|
+
type: "command",
|
|
14518
|
+
command: `${shellQuote(input.agentCtlPath)} codex-stop`,
|
|
14519
|
+
timeout: 30
|
|
14520
|
+
}
|
|
14521
|
+
]
|
|
14522
|
+
}
|
|
14523
|
+
]
|
|
14524
|
+
}
|
|
14525
|
+
};
|
|
14526
|
+
}
|
|
14341
14527
|
async function mergeClaudeSettings(settingsPath, hookSettings) {
|
|
14342
14528
|
let existing = {};
|
|
14343
14529
|
try {
|
|
@@ -14357,13 +14543,77 @@ async function mergeClaudeSettings(settingsPath, hookSettings) {
|
|
|
14357
14543
|
await Bun.write(settingsPath, JSON.stringify(merged, null, 2) + `
|
|
14358
14544
|
`);
|
|
14359
14545
|
}
|
|
14546
|
+
function commandStartsWithAgentCtl(command, agentCtlPath) {
|
|
14547
|
+
const trimmedCommand = command.trimStart();
|
|
14548
|
+
const quotedAgentCtlPath = shellQuote(agentCtlPath);
|
|
14549
|
+
return trimmedCommand === agentCtlPath || trimmedCommand.startsWith(`${agentCtlPath} `) || trimmedCommand === quotedAgentCtlPath || trimmedCommand.startsWith(`${quotedAgentCtlPath} `);
|
|
14550
|
+
}
|
|
14551
|
+
function isWebmuxHookGroup(group, agentCtlPath) {
|
|
14552
|
+
if (!isRecord5(group) || !Array.isArray(group.hooks))
|
|
14553
|
+
return false;
|
|
14554
|
+
return group.hooks.some((hook) => isRecord5(hook) && typeof hook.command === "string" && commandStartsWithAgentCtl(hook.command, agentCtlPath));
|
|
14555
|
+
}
|
|
14556
|
+
async function mergeCodexHooksFile(hooksPath, hookSettings, agentCtlPath) {
|
|
14557
|
+
let existing = {};
|
|
14558
|
+
try {
|
|
14559
|
+
const file = Bun.file(hooksPath);
|
|
14560
|
+
if (await file.exists()) {
|
|
14561
|
+
const parsed = await file.json();
|
|
14562
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
14563
|
+
existing = parsed;
|
|
14564
|
+
}
|
|
14565
|
+
}
|
|
14566
|
+
} catch {
|
|
14567
|
+
existing = {};
|
|
14568
|
+
}
|
|
14569
|
+
const existingHooks = isRecord5(existing.hooks) ? existing.hooks : {};
|
|
14570
|
+
const mergedHooks = { ...existingHooks };
|
|
14571
|
+
for (const [eventName, groups] of Object.entries(hookSettings)) {
|
|
14572
|
+
const eventGroups = existingHooks[eventName];
|
|
14573
|
+
const preservedGroups = Array.isArray(eventGroups) ? eventGroups.filter((group) => !isWebmuxHookGroup(group, agentCtlPath)) : [];
|
|
14574
|
+
mergedHooks[eventName] = [...preservedGroups, ...groups];
|
|
14575
|
+
}
|
|
14576
|
+
await Bun.write(hooksPath, JSON.stringify({ ...existing, hooks: mergedHooks }, null, 2) + `
|
|
14577
|
+
`);
|
|
14578
|
+
}
|
|
14579
|
+
async function resolveGitCommonDir(gitDir) {
|
|
14580
|
+
try {
|
|
14581
|
+
const commonDir = (await Bun.file(join4(gitDir, "commondir")).text()).trim();
|
|
14582
|
+
if (!commonDir)
|
|
14583
|
+
return gitDir;
|
|
14584
|
+
return commonDir.startsWith("/") ? commonDir : resolve3(gitDir, commonDir);
|
|
14585
|
+
} catch {
|
|
14586
|
+
return gitDir;
|
|
14587
|
+
}
|
|
14588
|
+
}
|
|
14589
|
+
async function ensureGeneratedCodexHooksIgnored(gitDir) {
|
|
14590
|
+
const commonDir = await resolveGitCommonDir(gitDir);
|
|
14591
|
+
const excludePath = join4(commonDir, "info", "exclude");
|
|
14592
|
+
let existing = "";
|
|
14593
|
+
try {
|
|
14594
|
+
existing = await Bun.file(excludePath).text();
|
|
14595
|
+
} catch {
|
|
14596
|
+
existing = "";
|
|
14597
|
+
}
|
|
14598
|
+
const lines = existing.split(/\r?\n/).map((line) => line.trim());
|
|
14599
|
+
if (lines.includes(GENERATED_CODEX_HOOKS_EXCLUDE))
|
|
14600
|
+
return;
|
|
14601
|
+
await mkdir3(dirname3(excludePath), { recursive: true });
|
|
14602
|
+
const separator = existing.length > 0 && !existing.endsWith(`
|
|
14603
|
+
`) ? `
|
|
14604
|
+
` : "";
|
|
14605
|
+
await Bun.write(excludePath, `${existing}${separator}${GENERATED_CODEX_HOOKS_EXCLUDE}
|
|
14606
|
+
`);
|
|
14607
|
+
}
|
|
14360
14608
|
async function ensureAgentRuntimeArtifacts(input) {
|
|
14361
14609
|
const storagePaths = getWorktreeStoragePaths(input.gitDir);
|
|
14362
14610
|
const artifacts = {
|
|
14363
14611
|
agentCtlPath: join4(storagePaths.webmuxDir, "webmux-agentctl"),
|
|
14364
|
-
claudeSettingsPath: join4(input.worktreePath, ".claude", "settings.local.json")
|
|
14612
|
+
claudeSettingsPath: join4(input.worktreePath, ".claude", "settings.local.json"),
|
|
14613
|
+
codexHooksPath: join4(input.worktreePath, ".codex", "hooks.json")
|
|
14365
14614
|
};
|
|
14366
14615
|
await mkdir3(dirname3(artifacts.claudeSettingsPath), { recursive: true });
|
|
14616
|
+
await mkdir3(dirname3(artifacts.codexHooksPath), { recursive: true });
|
|
14367
14617
|
await Bun.write(artifacts.agentCtlPath, buildAgentCtlScript());
|
|
14368
14618
|
await chmod2(artifacts.agentCtlPath, 493);
|
|
14369
14619
|
const hookSettings = buildClaudeHookSettings(artifacts);
|
|
@@ -14372,12 +14622,14 @@ async function ensureAgentRuntimeArtifacts(input) {
|
|
|
14372
14622
|
throw new Error("Invalid Claude hook settings");
|
|
14373
14623
|
}
|
|
14374
14624
|
await mergeClaudeSettings(artifacts.claudeSettingsPath, hooks);
|
|
14625
|
+
await ensureGeneratedCodexHooksIgnored(input.gitDir);
|
|
14626
|
+
await mergeCodexHooksFile(artifacts.codexHooksPath, buildCodexHookSettings(artifacts).hooks, artifacts.agentCtlPath);
|
|
14375
14627
|
return artifacts;
|
|
14376
14628
|
}
|
|
14377
14629
|
|
|
14378
14630
|
// backend/src/adapters/tmux.ts
|
|
14379
14631
|
import { createHash } from "crypto";
|
|
14380
|
-
import { basename as basename2, resolve as
|
|
14632
|
+
import { basename as basename2, resolve as resolve4 } from "path";
|
|
14381
14633
|
function runTmux(args) {
|
|
14382
14634
|
const result = Bun.spawnSync(["tmux", ...args], {
|
|
14383
14635
|
stdout: "pipe",
|
|
@@ -14405,7 +14657,7 @@ function sanitizeTmuxNameSegment(value, maxLength = 24) {
|
|
|
14405
14657
|
return trimmed || "x";
|
|
14406
14658
|
}
|
|
14407
14659
|
function buildProjectSessionName(projectRoot2) {
|
|
14408
|
-
const resolved =
|
|
14660
|
+
const resolved = resolve4(projectRoot2);
|
|
14409
14661
|
const base = sanitizeTmuxNameSegment(basename2(resolved), 18);
|
|
14410
14662
|
const hash = createHash("sha1").update(resolved).digest("hex").slice(0, 8);
|
|
14411
14663
|
return `wm-${base}-${hash}`;
|
|
@@ -14546,15 +14798,16 @@ function buildDockerRuntimeBootstrap(runtimeEnvPath) {
|
|
|
14546
14798
|
}
|
|
14547
14799
|
function buildBuiltInAgentInvocation(input) {
|
|
14548
14800
|
if (input.agent === "codex") {
|
|
14801
|
+
const hooksFlag = " --enable codex_hooks";
|
|
14549
14802
|
const yoloFlag2 = input.yolo ? " --yolo" : "";
|
|
14550
14803
|
if (input.launchMode === "resume") {
|
|
14551
|
-
return `codex${yoloFlag2} resume --last`;
|
|
14804
|
+
return `codex${hooksFlag}${yoloFlag2} resume --last`;
|
|
14552
14805
|
}
|
|
14553
14806
|
const promptSuffix2 = input.prompt ? ` -- ${quoteShell(input.prompt)}` : "";
|
|
14554
14807
|
if (input.systemPrompt) {
|
|
14555
|
-
return `codex${yoloFlag2} -c ${quoteShell(`developer_instructions=${input.systemPrompt}`)}${promptSuffix2}`;
|
|
14808
|
+
return `codex${hooksFlag}${yoloFlag2} -c ${quoteShell(`developer_instructions=${input.systemPrompt}`)}${promptSuffix2}`;
|
|
14556
14809
|
}
|
|
14557
|
-
return `codex${yoloFlag2}${promptSuffix2}`;
|
|
14810
|
+
return `codex${hooksFlag}${yoloFlag2}${promptSuffix2}`;
|
|
14558
14811
|
}
|
|
14559
14812
|
const yoloFlag = input.yolo ? " --dangerously-skip-permissions" : "";
|
|
14560
14813
|
if (input.launchMode === "resume") {
|
|
@@ -14627,7 +14880,7 @@ function buildDockerAgentPaneCommand(input) {
|
|
|
14627
14880
|
}
|
|
14628
14881
|
|
|
14629
14882
|
// backend/src/services/session-service.ts
|
|
14630
|
-
import { resolve as
|
|
14883
|
+
import { resolve as resolve5 } from "path";
|
|
14631
14884
|
function quoteShell2(value) {
|
|
14632
14885
|
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
14633
14886
|
}
|
|
@@ -14641,7 +14894,7 @@ function buildCommandPaneStartupCommand(template, ctx) {
|
|
|
14641
14894
|
if (!template.workingDir) {
|
|
14642
14895
|
return template.command;
|
|
14643
14896
|
}
|
|
14644
|
-
const workingDir =
|
|
14897
|
+
const workingDir = resolve5(resolvePaneCwd(template, ctx), template.workingDir);
|
|
14645
14898
|
return `cd -- ${quoteShell2(workingDir)} && ${template.command}`;
|
|
14646
14899
|
}
|
|
14647
14900
|
function resolvePaneStartupCommand(template, ctx) {
|
|
@@ -14721,7 +14974,7 @@ import { randomUUID } from "crypto";
|
|
|
14721
14974
|
|
|
14722
14975
|
// backend/src/adapters/git.ts
|
|
14723
14976
|
import { readdirSync, rmSync, statSync } from "fs";
|
|
14724
|
-
import { resolve as
|
|
14977
|
+
import { resolve as resolve6, join as join5 } from "path";
|
|
14725
14978
|
function runGit(args, cwd) {
|
|
14726
14979
|
const result = Bun.spawnSync(["git", ...args], {
|
|
14727
14980
|
cwd,
|
|
@@ -14755,8 +15008,8 @@ function errorMessage(error) {
|
|
|
14755
15008
|
return error instanceof Error ? error.message : String(error);
|
|
14756
15009
|
}
|
|
14757
15010
|
function isRegisteredWorktree(entries, worktreePath) {
|
|
14758
|
-
const resolvedPath =
|
|
14759
|
-
return entries.some((entry) =>
|
|
15011
|
+
const resolvedPath = resolve6(worktreePath);
|
|
15012
|
+
return entries.some((entry) => resolve6(entry.path) === resolvedPath);
|
|
14760
15013
|
}
|
|
14761
15014
|
function removeDirectory(path) {
|
|
14762
15015
|
rmSync(path, {
|
|
@@ -14780,7 +15033,7 @@ function currentCheckoutRef(cwd) {
|
|
|
14780
15033
|
function resolveRepoRoot(dir) {
|
|
14781
15034
|
const direct = tryRunGit(["rev-parse", "--show-toplevel"], dir);
|
|
14782
15035
|
if (direct.ok)
|
|
14783
|
-
return
|
|
15036
|
+
return resolve6(dir, direct.stdout);
|
|
14784
15037
|
let entries;
|
|
14785
15038
|
try {
|
|
14786
15039
|
entries = readdirSync(dir);
|
|
@@ -14797,17 +15050,17 @@ function resolveRepoRoot(dir) {
|
|
|
14797
15050
|
}
|
|
14798
15051
|
const childResult = tryRunGit(["rev-parse", "--show-toplevel"], child);
|
|
14799
15052
|
if (childResult.ok)
|
|
14800
|
-
return
|
|
15053
|
+
return resolve6(child, childResult.stdout);
|
|
14801
15054
|
}
|
|
14802
15055
|
return null;
|
|
14803
15056
|
}
|
|
14804
15057
|
function resolveWorktreeRoot(cwd) {
|
|
14805
15058
|
const output = runGit(["rev-parse", "--show-toplevel"], cwd);
|
|
14806
|
-
return
|
|
15059
|
+
return resolve6(cwd, output);
|
|
14807
15060
|
}
|
|
14808
15061
|
function resolveWorktreeGitDir(cwd) {
|
|
14809
15062
|
const output = runGit(["rev-parse", "--git-dir"], cwd);
|
|
14810
|
-
return
|
|
15063
|
+
return resolve6(cwd, output);
|
|
14811
15064
|
}
|
|
14812
15065
|
function parseGitWorktreePorcelain(output) {
|
|
14813
15066
|
const entries = [];
|
|
@@ -15170,6 +15423,7 @@ function generateFallbackBranchName() {
|
|
|
15170
15423
|
|
|
15171
15424
|
// backend/src/services/lifecycle-service.ts
|
|
15172
15425
|
var DOCKER_CONTROL_HOST = "host.docker.internal";
|
|
15426
|
+
var MAX_WORKTREE_LABEL_LENGTH = 80;
|
|
15173
15427
|
function toErrorMessage2(error) {
|
|
15174
15428
|
return error instanceof Error ? error.message : String(error);
|
|
15175
15429
|
}
|
|
@@ -15179,6 +15433,15 @@ function stringifyStartupEnvValue(value) {
|
|
|
15179
15433
|
function trimTrailingSlashes(value) {
|
|
15180
15434
|
return value.replace(/\/+$/, "");
|
|
15181
15435
|
}
|
|
15436
|
+
function normalizeWorktreeLabel(label) {
|
|
15437
|
+
const trimmed = label?.trim() ?? "";
|
|
15438
|
+
if (!trimmed)
|
|
15439
|
+
return null;
|
|
15440
|
+
if (trimmed.length > MAX_WORKTREE_LABEL_LENGTH) {
|
|
15441
|
+
throw new LifecycleError(`Worktree label must be ${MAX_WORKTREE_LABEL_LENGTH} characters or fewer`, 400);
|
|
15442
|
+
}
|
|
15443
|
+
return trimmed;
|
|
15444
|
+
}
|
|
15182
15445
|
function isLoopbackHostname(hostname) {
|
|
15183
15446
|
return hostname === "127.0.0.1" || hostname === "localhost" || hostname === "::1" || hostname === "[::1]";
|
|
15184
15447
|
}
|
|
@@ -15353,6 +15616,21 @@ class LifecycleService {
|
|
|
15353
15616
|
throw this.wrapOperationError(error);
|
|
15354
15617
|
}
|
|
15355
15618
|
}
|
|
15619
|
+
async setWorktreeLabel(branch, label) {
|
|
15620
|
+
try {
|
|
15621
|
+
const normalizedLabel = normalizeWorktreeLabel(label);
|
|
15622
|
+
const resolved = await this.resolveExistingWorktree(branch);
|
|
15623
|
+
if (!resolved.meta) {
|
|
15624
|
+
throw new LifecycleError(`Worktree ${branch} has no managed metadata to label`, 409);
|
|
15625
|
+
}
|
|
15626
|
+
const nextMeta = this.withUpdatedLabel(resolved.meta, normalizedLabel);
|
|
15627
|
+
await writeWorktreeMeta(resolved.gitDir, nextMeta);
|
|
15628
|
+
await this.deps.reconciliation.reconcile(this.deps.projectRoot, { force: true });
|
|
15629
|
+
return { label: normalizedLabel };
|
|
15630
|
+
} catch (error) {
|
|
15631
|
+
throw this.wrapOperationError(error);
|
|
15632
|
+
}
|
|
15633
|
+
}
|
|
15356
15634
|
listAvailableBranches(options = {}) {
|
|
15357
15635
|
const localBranches = this.listLocalBranches().filter((branch) => isValidBranchName(branch));
|
|
15358
15636
|
const remoteBranches = options.includeRemote ? this.listRemoteBranches().filter((branch) => isValidBranchName(branch)) : [];
|
|
@@ -15445,20 +15723,20 @@ class LifecycleService {
|
|
|
15445
15723
|
return allocateServicePorts(metas, this.deps.config.services);
|
|
15446
15724
|
}
|
|
15447
15725
|
resolveWorktreePath(branch) {
|
|
15448
|
-
return
|
|
15726
|
+
return resolve7(this.deps.projectRoot, this.deps.config.workspace.worktreeRoot, branch);
|
|
15449
15727
|
}
|
|
15450
15728
|
listLocalBranches() {
|
|
15451
|
-
return this.deps.git.listLocalBranches(
|
|
15729
|
+
return this.deps.git.listLocalBranches(resolve7(this.deps.projectRoot));
|
|
15452
15730
|
}
|
|
15453
15731
|
listRemoteBranches() {
|
|
15454
|
-
return this.deps.git.listRemoteBranches(
|
|
15732
|
+
return this.deps.git.listRemoteBranches(resolve7(this.deps.projectRoot));
|
|
15455
15733
|
}
|
|
15456
15734
|
listCheckedOutBranches() {
|
|
15457
|
-
return new Set(this.deps.git.listWorktrees(
|
|
15735
|
+
return new Set(this.deps.git.listWorktrees(resolve7(this.deps.projectRoot)).filter((entry) => !entry.bare && entry.branch !== null).map((entry) => entry.branch));
|
|
15458
15736
|
}
|
|
15459
15737
|
listProjectWorktrees() {
|
|
15460
|
-
const projectRoot2 =
|
|
15461
|
-
return this.deps.git.listWorktrees(projectRoot2).filter((entry) => !entry.bare &&
|
|
15738
|
+
const projectRoot2 = resolve7(this.deps.projectRoot);
|
|
15739
|
+
return this.deps.git.listWorktrees(projectRoot2).filter((entry) => !entry.bare && resolve7(entry.path) !== projectRoot2);
|
|
15462
15740
|
}
|
|
15463
15741
|
async readManagedMetas() {
|
|
15464
15742
|
const metas = await Promise.all(this.listProjectWorktrees().map(async (entry) => {
|
|
@@ -15534,6 +15812,15 @@ class LifecycleService {
|
|
|
15534
15812
|
async updateWorktreeArchivedState(path, archived) {
|
|
15535
15813
|
await this.deps.archiveState.setArchived(path, archived);
|
|
15536
15814
|
}
|
|
15815
|
+
withUpdatedLabel(meta, label) {
|
|
15816
|
+
const nextMeta = { ...meta };
|
|
15817
|
+
if (label) {
|
|
15818
|
+
nextMeta.label = label;
|
|
15819
|
+
} else {
|
|
15820
|
+
delete nextMeta.label;
|
|
15821
|
+
}
|
|
15822
|
+
return nextMeta;
|
|
15823
|
+
}
|
|
15537
15824
|
async closeBranchWindow(branch) {
|
|
15538
15825
|
this.deps.tmux.killWindow(buildProjectSessionName(this.deps.projectRoot), buildWorktreeWindowName(branch));
|
|
15539
15826
|
await this.deps.reconciliation.reconcile(this.deps.projectRoot, { force: true });
|
|
@@ -16532,6 +16819,7 @@ function mapCreationSnapshot(creating) {
|
|
|
16532
16819
|
function mapWorktreeSnapshot(state, now, creating, isArchived, findLinearIssue, findAgentLabel) {
|
|
16533
16820
|
return {
|
|
16534
16821
|
branch: state.branch,
|
|
16822
|
+
label: state.label,
|
|
16535
16823
|
...state.baseBranch ? { baseBranch: state.baseBranch } : {},
|
|
16536
16824
|
path: state.path,
|
|
16537
16825
|
dir: state.path,
|
|
@@ -16554,6 +16842,7 @@ function mapWorktreeSnapshot(state, now, creating, isArchived, findLinearIssue,
|
|
|
16554
16842
|
function mapCreatingWorktreeSnapshot(creating, isArchived, findLinearIssue, findAgentLabel) {
|
|
16555
16843
|
return {
|
|
16556
16844
|
branch: creating.branch,
|
|
16845
|
+
label: null,
|
|
16557
16846
|
...creating.baseBranch ? { baseBranch: creating.baseBranch } : {},
|
|
16558
16847
|
path: creating.path,
|
|
16559
16848
|
dir: creating.path,
|
|
@@ -17317,7 +17606,7 @@ class BunPortProbe {
|
|
|
17317
17606
|
this.hostnames = hostnames;
|
|
17318
17607
|
}
|
|
17319
17608
|
isListening(port) {
|
|
17320
|
-
return new Promise((
|
|
17609
|
+
return new Promise((resolve8) => {
|
|
17321
17610
|
let settled = false;
|
|
17322
17611
|
let pending = this.hostnames.length;
|
|
17323
17612
|
const settle = (result) => {
|
|
@@ -17326,20 +17615,20 @@ class BunPortProbe {
|
|
|
17326
17615
|
if (result) {
|
|
17327
17616
|
settled = true;
|
|
17328
17617
|
clearTimeout(timer);
|
|
17329
|
-
|
|
17618
|
+
resolve8(true);
|
|
17330
17619
|
return;
|
|
17331
17620
|
}
|
|
17332
17621
|
pending--;
|
|
17333
17622
|
if (pending === 0) {
|
|
17334
17623
|
settled = true;
|
|
17335
17624
|
clearTimeout(timer);
|
|
17336
|
-
|
|
17625
|
+
resolve8(false);
|
|
17337
17626
|
}
|
|
17338
17627
|
};
|
|
17339
17628
|
const timer = setTimeout(() => {
|
|
17340
17629
|
if (!settled) {
|
|
17341
17630
|
settled = true;
|
|
17342
|
-
|
|
17631
|
+
resolve8(false);
|
|
17343
17632
|
}
|
|
17344
17633
|
}, this.timeoutMs);
|
|
17345
17634
|
for (const hostname of this.hostnames) {
|
|
@@ -17417,7 +17706,7 @@ async function defaultSpawn(args, options = {}) {
|
|
|
17417
17706
|
if (options.timeoutMs === undefined) {
|
|
17418
17707
|
return await resultPromise;
|
|
17419
17708
|
}
|
|
17420
|
-
return await new Promise((
|
|
17709
|
+
return await new Promise((resolve8, reject) => {
|
|
17421
17710
|
let settled = false;
|
|
17422
17711
|
const timeoutId = setTimeout(() => {
|
|
17423
17712
|
if (settled)
|
|
@@ -17433,7 +17722,7 @@ async function defaultSpawn(args, options = {}) {
|
|
|
17433
17722
|
return;
|
|
17434
17723
|
settled = true;
|
|
17435
17724
|
clearTimeout(timeoutId);
|
|
17436
|
-
|
|
17725
|
+
resolve8(result);
|
|
17437
17726
|
}, (error) => {
|
|
17438
17727
|
if (settled)
|
|
17439
17728
|
return;
|
|
@@ -17571,8 +17860,8 @@ class ArchiveStateService {
|
|
|
17571
17860
|
async withMutationLock(operation) {
|
|
17572
17861
|
const previous = this.mutationQueue;
|
|
17573
17862
|
let release = () => {};
|
|
17574
|
-
this.mutationQueue = new Promise((
|
|
17575
|
-
release =
|
|
17863
|
+
this.mutationQueue = new Promise((resolve8) => {
|
|
17864
|
+
release = resolve8;
|
|
17576
17865
|
});
|
|
17577
17866
|
await previous.catch(() => {});
|
|
17578
17867
|
try {
|
|
@@ -17688,6 +17977,7 @@ function makeDefaultState(input) {
|
|
|
17688
17977
|
return {
|
|
17689
17978
|
worktreeId: input.worktreeId,
|
|
17690
17979
|
branch: input.branch,
|
|
17980
|
+
label: input.label ?? null,
|
|
17691
17981
|
baseBranch: input.baseBranch ?? null,
|
|
17692
17982
|
path: input.path,
|
|
17693
17983
|
profile: input.profile ?? null,
|
|
@@ -17733,6 +18023,8 @@ class ProjectRuntime {
|
|
|
17733
18023
|
this.reindexBranch(existing.branch, input.branch, input.worktreeId);
|
|
17734
18024
|
existing.path = input.path;
|
|
17735
18025
|
existing.branch = input.branch;
|
|
18026
|
+
if (input.label !== undefined)
|
|
18027
|
+
existing.label = input.label;
|
|
17736
18028
|
if (input.baseBranch !== undefined)
|
|
17737
18029
|
existing.baseBranch = input.baseBranch;
|
|
17738
18030
|
existing.profile = input.profile ?? existing.profile;
|
|
@@ -17847,9 +18139,9 @@ class ProjectRuntime {
|
|
|
17847
18139
|
}
|
|
17848
18140
|
|
|
17849
18141
|
// backend/src/services/reconciliation-service.ts
|
|
17850
|
-
import { basename as basename3, resolve as
|
|
18142
|
+
import { basename as basename3, resolve as resolve8 } from "path";
|
|
17851
18143
|
function makeUnmanagedWorktreeId(path) {
|
|
17852
|
-
return `unmanaged:${
|
|
18144
|
+
return `unmanaged:${resolve8(path)}`;
|
|
17853
18145
|
}
|
|
17854
18146
|
function isValidPort2(port) {
|
|
17855
18147
|
return port !== null && Number.isInteger(port) && port >= 1 && port <= 65535;
|
|
@@ -17906,7 +18198,7 @@ class ReconciliationService {
|
|
|
17906
18198
|
if (!options.force && this.now() - this.lastReconciledAt < this.freshnessMs) {
|
|
17907
18199
|
return;
|
|
17908
18200
|
}
|
|
17909
|
-
const normalizedRepoRoot =
|
|
18201
|
+
const normalizedRepoRoot = resolve8(repoRoot);
|
|
17910
18202
|
const reconcilePromise = this.runReconcile(normalizedRepoRoot).then(() => {
|
|
17911
18203
|
this.lastReconciledAt = this.now();
|
|
17912
18204
|
});
|
|
@@ -17925,7 +18217,7 @@ class ReconciliationService {
|
|
|
17925
18217
|
windows = [];
|
|
17926
18218
|
}
|
|
17927
18219
|
const seenWorktreeIds = new Set;
|
|
17928
|
-
const candidateEntries = worktrees.filter((entry) => !entry.bare &&
|
|
18220
|
+
const candidateEntries = worktrees.filter((entry) => !entry.bare && resolve8(entry.path) !== normalizedRepoRoot);
|
|
17929
18221
|
const reconciledStates = await mapWithConcurrency(candidateEntries, this.concurrency, async (entry) => {
|
|
17930
18222
|
const gitDir = this.deps.git.resolveWorktreeGitDir(entry.path);
|
|
17931
18223
|
const meta = await readWorktreeMeta(gitDir);
|
|
@@ -17936,6 +18228,7 @@ class ReconciliationService {
|
|
|
17936
18228
|
return {
|
|
17937
18229
|
worktreeId,
|
|
17938
18230
|
branch,
|
|
18231
|
+
label: meta?.label ?? null,
|
|
17939
18232
|
baseBranch: meta?.baseBranch ?? null,
|
|
17940
18233
|
path: entry.path,
|
|
17941
18234
|
profile: meta?.profile ?? null,
|
|
@@ -17968,6 +18261,7 @@ class ReconciliationService {
|
|
|
17968
18261
|
this.deps.runtime.upsertWorktree({
|
|
17969
18262
|
worktreeId: state.worktreeId,
|
|
17970
18263
|
branch: state.branch,
|
|
18264
|
+
label: state.label,
|
|
17971
18265
|
baseBranch: state.baseBranch,
|
|
17972
18266
|
path: state.path,
|
|
17973
18267
|
profile: state.profile,
|
|
@@ -18166,7 +18460,7 @@ function getFrontendConfig() {
|
|
|
18166
18460
|
startupEnvs: config.startupEnvs,
|
|
18167
18461
|
linkedRepos: config.integrations.github.linkedRepos.map((lr) => ({
|
|
18168
18462
|
alias: lr.alias,
|
|
18169
|
-
...lr.dir ? { dir:
|
|
18463
|
+
...lr.dir ? { dir: resolve9(PROJECT_DIR, lr.dir) } : {}
|
|
18170
18464
|
})),
|
|
18171
18465
|
linearAutoCreateWorktrees: linearAutoCreateEnabled,
|
|
18172
18466
|
autoRemoveOnMerge: autoRemoveOnMergeEnabled,
|
|
@@ -18270,7 +18564,8 @@ async function resolveTerminalWorktree(branch) {
|
|
|
18270
18564
|
attachTarget: {
|
|
18271
18565
|
ownerSessionName: state.session.sessionName,
|
|
18272
18566
|
windowName: state.session.windowName
|
|
18273
|
-
}
|
|
18567
|
+
},
|
|
18568
|
+
agentName: state.agentName
|
|
18274
18569
|
};
|
|
18275
18570
|
}
|
|
18276
18571
|
async function resolveAgentsTerminalWorktree(branch) {
|
|
@@ -18318,9 +18613,9 @@ async function hasValidControlToken(req) {
|
|
|
18318
18613
|
}
|
|
18319
18614
|
async function getWorktreeGitDirs() {
|
|
18320
18615
|
const gitDirs = new Map;
|
|
18321
|
-
const projectRoot2 =
|
|
18616
|
+
const projectRoot2 = resolve9(PROJECT_DIR);
|
|
18322
18617
|
for (const entry of git.listWorktrees(projectRoot2)) {
|
|
18323
|
-
if (entry.bare ||
|
|
18618
|
+
if (entry.bare || resolve9(entry.path) === projectRoot2 || !entry.branch)
|
|
18324
18619
|
continue;
|
|
18325
18620
|
gitDirs.set(entry.branch, git.resolveWorktreeGitDir(entry.path));
|
|
18326
18621
|
}
|
|
@@ -18403,6 +18698,12 @@ function resolveWorktreeAgentChatSupport(worktree, action) {
|
|
|
18403
18698
|
action
|
|
18404
18699
|
});
|
|
18405
18700
|
}
|
|
18701
|
+
function resolveWorktreeTerminalSubmitDelayMs(agentName) {
|
|
18702
|
+
return resolveAgentTerminalSubmitDelayMs({
|
|
18703
|
+
agentId: agentName,
|
|
18704
|
+
agent: agentName ? getAgentDefinition(config, agentName) : null
|
|
18705
|
+
});
|
|
18706
|
+
}
|
|
18406
18707
|
async function apiAttachAgentsWorktree(branch) {
|
|
18407
18708
|
touchDashboardActivity();
|
|
18408
18709
|
const resolved = await resolveAgentsWorktree(branch);
|
|
@@ -18724,6 +19025,17 @@ async function apiSetWorktreeArchived(name, req) {
|
|
|
18724
19025
|
log.debug(`[worktree:archive] done name=${name} archived=${body.archived}`);
|
|
18725
19026
|
return jsonResponse({ ok: true, archived: body.archived });
|
|
18726
19027
|
}
|
|
19028
|
+
async function apiSetWorktreeLabel(name, req) {
|
|
19029
|
+
ensureBranchNotBusy(name);
|
|
19030
|
+
const parsed = await parseJsonBody(req, SetWorktreeLabelRequestSchema);
|
|
19031
|
+
if (!parsed.ok)
|
|
19032
|
+
return parsed.response;
|
|
19033
|
+
const body = parsed.data;
|
|
19034
|
+
log.info(`[worktree:label] name=${name} label=${body.label ? JSON.stringify(body.label) : "null"}`);
|
|
19035
|
+
const result = await lifecycleService.setWorktreeLabel(name, body.label);
|
|
19036
|
+
log.debug(`[worktree:label] done name=${name} label=${result.label ? JSON.stringify(result.label) : "null"}`);
|
|
19037
|
+
return jsonResponse({ ok: true, label: result.label });
|
|
19038
|
+
}
|
|
18727
19039
|
async function apiSendPrompt(name, req) {
|
|
18728
19040
|
ensureBranchNotBusy(name);
|
|
18729
19041
|
const parsed = await parseJsonBody(req, SendWorktreePromptRequestSchema);
|
|
@@ -18734,7 +19046,8 @@ async function apiSendPrompt(name, req) {
|
|
|
18734
19046
|
const preamble = body.preamble;
|
|
18735
19047
|
log.info(`[worktree:send] name=${name} text="${text.slice(0, 80)}"`);
|
|
18736
19048
|
const terminalWorktree = await resolveTerminalWorktree(name);
|
|
18737
|
-
const
|
|
19049
|
+
const submitDelayMs = resolveWorktreeTerminalSubmitDelayMs(terminalWorktree.agentName);
|
|
19050
|
+
const result = await sendPrompt(terminalWorktree.worktreeId, terminalWorktree.attachTarget, text, 0, preamble, submitDelayMs);
|
|
18738
19051
|
if (!result.ok)
|
|
18739
19052
|
return errorResponse(result.error, 503);
|
|
18740
19053
|
return jsonResponse({ ok: true });
|
|
@@ -18854,7 +19167,7 @@ async function apiPullMain(req) {
|
|
|
18854
19167
|
return errorResponse(`Unknown linked repo: ${repo}`, 404);
|
|
18855
19168
|
if (!linkedRepo.dir)
|
|
18856
19169
|
return errorResponse(`Linked repo "${repo}" has no dir configured`, 400);
|
|
18857
|
-
const resolvedDir =
|
|
19170
|
+
const resolvedDir = resolve9(PROJECT_DIR, linkedRepo.dir);
|
|
18858
19171
|
const repoRoot = git.resolveRepoRoot(resolvedDir);
|
|
18859
19172
|
if (!repoRoot)
|
|
18860
19173
|
return errorResponse(`Linked repo "${repo}" dir is not a git repository: ${resolvedDir}`, 400);
|
|
@@ -18945,7 +19258,7 @@ async function apiUploadFiles(name, req) {
|
|
|
18945
19258
|
}
|
|
18946
19259
|
const safeName = `${Date.now()}_${sanitizeFilename(entry.name)}`;
|
|
18947
19260
|
const destPath = join8(uploadDir, safeName);
|
|
18948
|
-
if (!
|
|
19261
|
+
if (!resolve9(destPath).startsWith(uploadDir + "/")) {
|
|
18949
19262
|
return errorResponse("Invalid filename", 400);
|
|
18950
19263
|
}
|
|
18951
19264
|
await Bun.write(destPath, entry);
|
|
@@ -19138,6 +19451,15 @@ Bun.serve({
|
|
|
19138
19451
|
return catching(`PUT /api/worktrees/${name}/archive`, () => apiSetWorktreeArchived(name, req));
|
|
19139
19452
|
}
|
|
19140
19453
|
},
|
|
19454
|
+
[apiPaths.setWorktreeLabel]: {
|
|
19455
|
+
PUT: (req) => {
|
|
19456
|
+
const parsed = parseWorktreeNameParam(req.params);
|
|
19457
|
+
if (!parsed.ok)
|
|
19458
|
+
return parsed.response;
|
|
19459
|
+
const name = parsed.data;
|
|
19460
|
+
return catching(`PUT /api/worktrees/${name}/label`, () => apiSetWorktreeLabel(name, req));
|
|
19461
|
+
}
|
|
19462
|
+
},
|
|
19141
19463
|
[apiPaths.sendWorktreePrompt]: {
|
|
19142
19464
|
POST: (req) => {
|
|
19143
19465
|
const parsed = parseWorktreeNameParam(req.params);
|
|
@@ -19214,8 +19536,8 @@ Bun.serve({
|
|
|
19214
19536
|
if (STATIC_DIR) {
|
|
19215
19537
|
const rawPath = url.pathname === "/" ? "index.html" : url.pathname;
|
|
19216
19538
|
const filePath = join8(STATIC_DIR, rawPath);
|
|
19217
|
-
const staticRoot =
|
|
19218
|
-
if (!
|
|
19539
|
+
const staticRoot = resolve9(STATIC_DIR);
|
|
19540
|
+
if (!resolve9(filePath).startsWith(staticRoot + "/")) {
|
|
19219
19541
|
return new Response("Forbidden", { status: 403 });
|
|
19220
19542
|
}
|
|
19221
19543
|
const file = Bun.file(filePath);
|