replicas-mcp 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/bowser-QNXG5MCF.js +2822 -0
  2. package/dist/chunk-3X3IL2A6.js +2094 -0
  3. package/dist/chunk-C6IOMGXW.js +1052 -0
  4. package/dist/chunk-FIMT2XWG.js +576 -0
  5. package/dist/chunk-KEOQGGM5.js +1490 -0
  6. package/dist/chunk-NWBPSHNL.js +2865 -0
  7. package/dist/{chunk-MO4EEYFW.js → chunk-Q6JESX2O.js} +5 -1
  8. package/dist/chunk-QIOBV22I.js +436 -0
  9. package/dist/{dist-es-SCPV3ZCZ.js → dist-es-3DLRX4SC.js} +26 -24
  10. package/dist/{dist-es-HU5E5HQ2.js → dist-es-7DMTLQRJ.js} +10 -11
  11. package/dist/{dist-es-VRURAF5E.js → dist-es-B6XNMCQ4.js} +5 -4
  12. package/dist/{dist-es-7T436X7S.js → dist-es-KLEKEXIP.js} +11 -12
  13. package/dist/{dist-es-BSYEGR6D.js → dist-es-MAMFGWZS.js} +48 -52
  14. package/dist/{dist-es-BPXINP6D.js → dist-es-V7ZJXG3C.js} +22 -32
  15. package/dist/{dist-es-RNSS2U3E.js → dist-es-VBWSM7AX.js} +28 -33
  16. package/dist/event-streams-D47TMH7D.js +1377 -0
  17. package/dist/index.js +1063 -314
  18. package/dist/{loadSso-XSERNFCM.js → loadSso-4NJATGLO.js} +85 -62
  19. package/dist/{signin-GATCKLJP.js → signin-HB5KQSHQ.js} +95 -83
  20. package/dist/{sso-oidc-JF4BALR2.js → sso-oidc-7AKRONOU.js} +103 -64
  21. package/dist/{sts-UFAVCISZ.js → sts-WSDR725H.js} +4965 -5056
  22. package/package.json +1 -1
  23. package/src/index.ts +2 -2
  24. package/dist/chunk-2KQ6OUSY.js +0 -1033
  25. package/dist/chunk-2Y7PD56W.js +0 -164
  26. package/dist/chunk-5VUQ55WW.js +0 -242
  27. package/dist/chunk-AAVVX4U5.js +0 -175
  28. package/dist/chunk-CXFLI7S3.js +0 -5706
  29. package/dist/chunk-ERL3EC7G.js +0 -44
  30. package/dist/chunk-SGITM26Q.js +0 -877
  31. package/dist/chunk-ST5JVROM.js +0 -39
  32. package/dist/chunk-SWX24AGM.js +0 -62
  33. package/dist/chunk-WPAL27HA.js +0 -29
  34. package/dist/chunk-ZDZBYCXV.js +0 -52
  35. package/dist/chunk-ZNARSMJG.js +0 -14
  36. package/dist/event-streams-EHSSWA6E.js +0 -253
package/dist/index.js CHANGED
@@ -3,11 +3,11 @@ import {
3
3
  __commonJS,
4
4
  __require,
5
5
  __toESM
6
- } from "./chunk-MO4EEYFW.js";
6
+ } from "./chunk-Q6JESX2O.js";
7
7
 
8
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/identity.js
8
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js
9
9
  var require_identity = __commonJS({
10
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/identity.js"(exports) {
10
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js"(exports) {
11
11
  "use strict";
12
12
  var ALIAS = /* @__PURE__ */ Symbol.for("yaml.alias");
13
13
  var DOC = /* @__PURE__ */ Symbol.for("yaml.document");
@@ -62,9 +62,9 @@ var require_identity = __commonJS({
62
62
  }
63
63
  });
64
64
 
65
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/visit.js
65
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/visit.js
66
66
  var require_visit = __commonJS({
67
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/visit.js"(exports) {
67
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/visit.js"(exports) {
68
68
  "use strict";
69
69
  var identity = require_identity();
70
70
  var BREAK = /* @__PURE__ */ Symbol("break visit");
@@ -220,9 +220,9 @@ var require_visit = __commonJS({
220
220
  }
221
221
  });
222
222
 
223
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/doc/directives.js
223
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/directives.js
224
224
  var require_directives = __commonJS({
225
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/doc/directives.js"(exports) {
225
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/directives.js"(exports) {
226
226
  "use strict";
227
227
  var identity = require_identity();
228
228
  var visit = require_visit();
@@ -391,9 +391,9 @@ var require_directives = __commonJS({
391
391
  }
392
392
  });
393
393
 
394
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/doc/anchors.js
394
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/anchors.js
395
395
  var require_anchors = __commonJS({
396
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/doc/anchors.js"(exports) {
396
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/anchors.js"(exports) {
397
397
  "use strict";
398
398
  var identity = require_identity();
399
399
  var visit = require_visit();
@@ -461,9 +461,9 @@ var require_anchors = __commonJS({
461
461
  }
462
462
  });
463
463
 
464
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/doc/applyReviver.js
464
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/applyReviver.js
465
465
  var require_applyReviver = __commonJS({
466
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/doc/applyReviver.js"(exports) {
466
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/applyReviver.js"(exports) {
467
467
  "use strict";
468
468
  function applyReviver(reviver, obj, key, val) {
469
469
  if (val && typeof val === "object") {
@@ -511,9 +511,9 @@ var require_applyReviver = __commonJS({
511
511
  }
512
512
  });
513
513
 
514
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/toJS.js
514
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/toJS.js
515
515
  var require_toJS = __commonJS({
516
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/toJS.js"(exports) {
516
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/toJS.js"(exports) {
517
517
  "use strict";
518
518
  var identity = require_identity();
519
519
  function toJS(value, arg, ctx) {
@@ -541,9 +541,9 @@ var require_toJS = __commonJS({
541
541
  }
542
542
  });
543
543
 
544
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/Node.js
544
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Node.js
545
545
  var require_Node = __commonJS({
546
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/Node.js"(exports) {
546
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Node.js"(exports) {
547
547
  "use strict";
548
548
  var applyReviver = require_applyReviver();
549
549
  var identity = require_identity();
@@ -582,9 +582,9 @@ var require_Node = __commonJS({
582
582
  }
583
583
  });
584
584
 
585
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/Alias.js
585
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Alias.js
586
586
  var require_Alias = __commonJS({
587
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/Alias.js"(exports) {
587
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Alias.js"(exports) {
588
588
  "use strict";
589
589
  var anchors = require_anchors();
590
590
  var visit = require_visit();
@@ -698,9 +698,9 @@ var require_Alias = __commonJS({
698
698
  }
699
699
  });
700
700
 
701
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/Scalar.js
701
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Scalar.js
702
702
  var require_Scalar = __commonJS({
703
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/Scalar.js"(exports) {
703
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Scalar.js"(exports) {
704
704
  "use strict";
705
705
  var identity = require_identity();
706
706
  var Node = require_Node();
@@ -728,9 +728,9 @@ var require_Scalar = __commonJS({
728
728
  }
729
729
  });
730
730
 
731
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/doc/createNode.js
731
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/createNode.js
732
732
  var require_createNode = __commonJS({
733
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/doc/createNode.js"(exports) {
733
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/createNode.js"(exports) {
734
734
  "use strict";
735
735
  var Alias = require_Alias();
736
736
  var identity = require_identity();
@@ -803,9 +803,9 @@ var require_createNode = __commonJS({
803
803
  }
804
804
  });
805
805
 
806
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/Collection.js
806
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Collection.js
807
807
  var require_Collection = __commonJS({
808
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/Collection.js"(exports) {
808
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Collection.js"(exports) {
809
809
  "use strict";
810
810
  var createNode = require_createNode();
811
811
  var identity = require_identity();
@@ -946,9 +946,9 @@ var require_Collection = __commonJS({
946
946
  }
947
947
  });
948
948
 
949
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyComment.js
949
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyComment.js
950
950
  var require_stringifyComment = __commonJS({
951
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyComment.js"(exports) {
951
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyComment.js"(exports) {
952
952
  "use strict";
953
953
  var stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#");
954
954
  function indentComment(comment, indent) {
@@ -963,9 +963,9 @@ var require_stringifyComment = __commonJS({
963
963
  }
964
964
  });
965
965
 
966
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/foldFlowLines.js
966
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/foldFlowLines.js
967
967
  var require_foldFlowLines = __commonJS({
968
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/foldFlowLines.js"(exports) {
968
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/foldFlowLines.js"(exports) {
969
969
  "use strict";
970
970
  var FOLD_FLOW = "flow";
971
971
  var FOLD_BLOCK = "block";
@@ -1099,9 +1099,9 @@ ${indent}${text.slice(fold + 1, end2)}`;
1099
1099
  }
1100
1100
  });
1101
1101
 
1102
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyString.js
1102
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyString.js
1103
1103
  var require_stringifyString = __commonJS({
1104
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyString.js"(exports) {
1104
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyString.js"(exports) {
1105
1105
  "use strict";
1106
1106
  var Scalar = require_Scalar();
1107
1107
  var foldFlowLines = require_foldFlowLines();
@@ -1382,9 +1382,9 @@ ${indent}`);
1382
1382
  }
1383
1383
  });
1384
1384
 
1385
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringify.js
1385
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringify.js
1386
1386
  var require_stringify = __commonJS({
1387
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringify.js"(exports) {
1387
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringify.js"(exports) {
1388
1388
  "use strict";
1389
1389
  var anchors = require_anchors();
1390
1390
  var identity = require_identity();
@@ -1506,9 +1506,9 @@ ${ctx.indent}${str}`;
1506
1506
  }
1507
1507
  });
1508
1508
 
1509
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyPair.js
1509
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyPair.js
1510
1510
  var require_stringifyPair = __commonJS({
1511
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyPair.js"(exports) {
1511
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyPair.js"(exports) {
1512
1512
  "use strict";
1513
1513
  var identity = require_identity();
1514
1514
  var Scalar = require_Scalar();
@@ -1639,9 +1639,9 @@ ${ctx.indent}`;
1639
1639
  }
1640
1640
  });
1641
1641
 
1642
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/log.js
1642
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/log.js
1643
1643
  var require_log = __commonJS({
1644
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/log.js"(exports) {
1644
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/log.js"(exports) {
1645
1645
  "use strict";
1646
1646
  var node_process = __require("process");
1647
1647
  function debug(logLevel, ...messages) {
@@ -1661,9 +1661,9 @@ var require_log = __commonJS({
1661
1661
  }
1662
1662
  });
1663
1663
 
1664
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/merge.js
1664
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/merge.js
1665
1665
  var require_merge = __commonJS({
1666
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/merge.js"(exports) {
1666
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/merge.js"(exports) {
1667
1667
  "use strict";
1668
1668
  var identity = require_identity();
1669
1669
  var Scalar = require_Scalar();
@@ -1721,9 +1721,9 @@ var require_merge = __commonJS({
1721
1721
  }
1722
1722
  });
1723
1723
 
1724
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/addPairToJSMap.js
1724
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/addPairToJSMap.js
1725
1725
  var require_addPairToJSMap = __commonJS({
1726
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/addPairToJSMap.js"(exports) {
1726
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/addPairToJSMap.js"(exports) {
1727
1727
  "use strict";
1728
1728
  var log = require_log();
1729
1729
  var merge = require_merge();
@@ -1785,9 +1785,9 @@ var require_addPairToJSMap = __commonJS({
1785
1785
  }
1786
1786
  });
1787
1787
 
1788
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/Pair.js
1788
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Pair.js
1789
1789
  var require_Pair = __commonJS({
1790
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/Pair.js"(exports) {
1790
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Pair.js"(exports) {
1791
1791
  "use strict";
1792
1792
  var createNode = require_createNode();
1793
1793
  var stringifyPair = require_stringifyPair();
@@ -1825,9 +1825,9 @@ var require_Pair = __commonJS({
1825
1825
  }
1826
1826
  });
1827
1827
 
1828
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyCollection.js
1828
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyCollection.js
1829
1829
  var require_stringifyCollection = __commonJS({
1830
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyCollection.js"(exports) {
1830
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyCollection.js"(exports) {
1831
1831
  "use strict";
1832
1832
  var identity = require_identity();
1833
1833
  var stringify = require_stringify();
@@ -1976,9 +1976,9 @@ ${indent}${end}`;
1976
1976
  }
1977
1977
  });
1978
1978
 
1979
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/YAMLMap.js
1979
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLMap.js
1980
1980
  var require_YAMLMap = __commonJS({
1981
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/YAMLMap.js"(exports) {
1981
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLMap.js"(exports) {
1982
1982
  "use strict";
1983
1983
  var stringifyCollection = require_stringifyCollection();
1984
1984
  var addPairToJSMap = require_addPairToJSMap();
@@ -2120,9 +2120,9 @@ var require_YAMLMap = __commonJS({
2120
2120
  }
2121
2121
  });
2122
2122
 
2123
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/common/map.js
2123
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/map.js
2124
2124
  var require_map = __commonJS({
2125
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/common/map.js"(exports) {
2125
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/map.js"(exports) {
2126
2126
  "use strict";
2127
2127
  var identity = require_identity();
2128
2128
  var YAMLMap = require_YAMLMap();
@@ -2142,9 +2142,9 @@ var require_map = __commonJS({
2142
2142
  }
2143
2143
  });
2144
2144
 
2145
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/YAMLSeq.js
2145
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLSeq.js
2146
2146
  var require_YAMLSeq = __commonJS({
2147
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/nodes/YAMLSeq.js"(exports) {
2147
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLSeq.js"(exports) {
2148
2148
  "use strict";
2149
2149
  var createNode = require_createNode();
2150
2150
  var stringifyCollection = require_stringifyCollection();
@@ -2258,9 +2258,9 @@ var require_YAMLSeq = __commonJS({
2258
2258
  }
2259
2259
  });
2260
2260
 
2261
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/common/seq.js
2261
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/seq.js
2262
2262
  var require_seq = __commonJS({
2263
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/common/seq.js"(exports) {
2263
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/seq.js"(exports) {
2264
2264
  "use strict";
2265
2265
  var identity = require_identity();
2266
2266
  var YAMLSeq = require_YAMLSeq();
@@ -2280,9 +2280,9 @@ var require_seq = __commonJS({
2280
2280
  }
2281
2281
  });
2282
2282
 
2283
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/common/string.js
2283
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/string.js
2284
2284
  var require_string = __commonJS({
2285
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/common/string.js"(exports) {
2285
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/string.js"(exports) {
2286
2286
  "use strict";
2287
2287
  var stringifyString = require_stringifyString();
2288
2288
  var string = {
@@ -2299,9 +2299,9 @@ var require_string = __commonJS({
2299
2299
  }
2300
2300
  });
2301
2301
 
2302
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/common/null.js
2302
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/null.js
2303
2303
  var require_null = __commonJS({
2304
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/common/null.js"(exports) {
2304
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/null.js"(exports) {
2305
2305
  "use strict";
2306
2306
  var Scalar = require_Scalar();
2307
2307
  var nullTag = {
@@ -2317,9 +2317,9 @@ var require_null = __commonJS({
2317
2317
  }
2318
2318
  });
2319
2319
 
2320
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/core/bool.js
2320
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/bool.js
2321
2321
  var require_bool = __commonJS({
2322
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/core/bool.js"(exports) {
2322
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/bool.js"(exports) {
2323
2323
  "use strict";
2324
2324
  var Scalar = require_Scalar();
2325
2325
  var boolTag = {
@@ -2341,9 +2341,9 @@ var require_bool = __commonJS({
2341
2341
  }
2342
2342
  });
2343
2343
 
2344
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyNumber.js
2344
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyNumber.js
2345
2345
  var require_stringifyNumber = __commonJS({
2346
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyNumber.js"(exports) {
2346
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyNumber.js"(exports) {
2347
2347
  "use strict";
2348
2348
  function stringifyNumber({ format, minFractionDigits, tag, value }) {
2349
2349
  if (typeof value === "bigint")
@@ -2368,9 +2368,9 @@ var require_stringifyNumber = __commonJS({
2368
2368
  }
2369
2369
  });
2370
2370
 
2371
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/core/float.js
2371
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/float.js
2372
2372
  var require_float = __commonJS({
2373
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/core/float.js"(exports) {
2373
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/float.js"(exports) {
2374
2374
  "use strict";
2375
2375
  var Scalar = require_Scalar();
2376
2376
  var stringifyNumber = require_stringifyNumber();
@@ -2414,9 +2414,9 @@ var require_float = __commonJS({
2414
2414
  }
2415
2415
  });
2416
2416
 
2417
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/core/int.js
2417
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/int.js
2418
2418
  var require_int = __commonJS({
2419
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/core/int.js"(exports) {
2419
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/int.js"(exports) {
2420
2420
  "use strict";
2421
2421
  var stringifyNumber = require_stringifyNumber();
2422
2422
  var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
@@ -2459,9 +2459,9 @@ var require_int = __commonJS({
2459
2459
  }
2460
2460
  });
2461
2461
 
2462
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/core/schema.js
2462
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/schema.js
2463
2463
  var require_schema = __commonJS({
2464
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/core/schema.js"(exports) {
2464
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/schema.js"(exports) {
2465
2465
  "use strict";
2466
2466
  var map = require_map();
2467
2467
  var _null = require_null();
@@ -2487,9 +2487,9 @@ var require_schema = __commonJS({
2487
2487
  }
2488
2488
  });
2489
2489
 
2490
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/json/schema.js
2490
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/json/schema.js
2491
2491
  var require_schema2 = __commonJS({
2492
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/json/schema.js"(exports) {
2492
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/json/schema.js"(exports) {
2493
2493
  "use strict";
2494
2494
  var Scalar = require_Scalar();
2495
2495
  var map = require_map();
@@ -2554,9 +2554,9 @@ var require_schema2 = __commonJS({
2554
2554
  }
2555
2555
  });
2556
2556
 
2557
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/binary.js
2557
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/binary.js
2558
2558
  var require_binary = __commonJS({
2559
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/binary.js"(exports) {
2559
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/binary.js"(exports) {
2560
2560
  "use strict";
2561
2561
  var node_buffer = __require("buffer");
2562
2562
  var Scalar = require_Scalar();
@@ -2620,9 +2620,9 @@ var require_binary = __commonJS({
2620
2620
  }
2621
2621
  });
2622
2622
 
2623
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/pairs.js
2623
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/pairs.js
2624
2624
  var require_pairs = __commonJS({
2625
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/pairs.js"(exports) {
2625
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/pairs.js"(exports) {
2626
2626
  "use strict";
2627
2627
  var identity = require_identity();
2628
2628
  var Pair = require_Pair();
@@ -2698,9 +2698,9 @@ ${cn.comment}` : item.comment;
2698
2698
  }
2699
2699
  });
2700
2700
 
2701
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/omap.js
2701
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/omap.js
2702
2702
  var require_omap = __commonJS({
2703
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/omap.js"(exports) {
2703
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/omap.js"(exports) {
2704
2704
  "use strict";
2705
2705
  var identity = require_identity();
2706
2706
  var toJS = require_toJS();
@@ -2776,9 +2776,9 @@ var require_omap = __commonJS({
2776
2776
  }
2777
2777
  });
2778
2778
 
2779
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/bool.js
2779
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/bool.js
2780
2780
  var require_bool2 = __commonJS({
2781
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/bool.js"(exports) {
2781
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/bool.js"(exports) {
2782
2782
  "use strict";
2783
2783
  var Scalar = require_Scalar();
2784
2784
  function boolStringify({ value, source }, ctx) {
@@ -2808,9 +2808,9 @@ var require_bool2 = __commonJS({
2808
2808
  }
2809
2809
  });
2810
2810
 
2811
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/float.js
2811
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/float.js
2812
2812
  var require_float2 = __commonJS({
2813
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/float.js"(exports) {
2813
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/float.js"(exports) {
2814
2814
  "use strict";
2815
2815
  var Scalar = require_Scalar();
2816
2816
  var stringifyNumber = require_stringifyNumber();
@@ -2857,9 +2857,9 @@ var require_float2 = __commonJS({
2857
2857
  }
2858
2858
  });
2859
2859
 
2860
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/int.js
2860
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/int.js
2861
2861
  var require_int2 = __commonJS({
2862
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/int.js"(exports) {
2862
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/int.js"(exports) {
2863
2863
  "use strict";
2864
2864
  var stringifyNumber = require_stringifyNumber();
2865
2865
  var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
@@ -2936,9 +2936,9 @@ var require_int2 = __commonJS({
2936
2936
  }
2937
2937
  });
2938
2938
 
2939
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/set.js
2939
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/set.js
2940
2940
  var require_set = __commonJS({
2941
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/set.js"(exports) {
2941
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/set.js"(exports) {
2942
2942
  "use strict";
2943
2943
  var identity = require_identity();
2944
2944
  var Pair = require_Pair();
@@ -3025,9 +3025,9 @@ var require_set = __commonJS({
3025
3025
  }
3026
3026
  });
3027
3027
 
3028
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js
3028
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js
3029
3029
  var require_timestamp = __commonJS({
3030
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js"(exports) {
3030
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js"(exports) {
3031
3031
  "use strict";
3032
3032
  var stringifyNumber = require_stringifyNumber();
3033
3033
  function parseSexagesimal(str, asBigInt) {
@@ -3113,9 +3113,9 @@ var require_timestamp = __commonJS({
3113
3113
  }
3114
3114
  });
3115
3115
 
3116
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/schema.js
3116
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/schema.js
3117
3117
  var require_schema3 = __commonJS({
3118
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/yaml-1.1/schema.js"(exports) {
3118
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/schema.js"(exports) {
3119
3119
  "use strict";
3120
3120
  var map = require_map();
3121
3121
  var _null = require_null();
@@ -3157,9 +3157,9 @@ var require_schema3 = __commonJS({
3157
3157
  }
3158
3158
  });
3159
3159
 
3160
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/tags.js
3160
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/tags.js
3161
3161
  var require_tags = __commonJS({
3162
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/tags.js"(exports) {
3162
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/tags.js"(exports) {
3163
3163
  "use strict";
3164
3164
  var map = require_map();
3165
3165
  var _null = require_null();
@@ -3251,9 +3251,9 @@ var require_tags = __commonJS({
3251
3251
  }
3252
3252
  });
3253
3253
 
3254
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/Schema.js
3254
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/Schema.js
3255
3255
  var require_Schema = __commonJS({
3256
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/schema/Schema.js"(exports) {
3256
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/Schema.js"(exports) {
3257
3257
  "use strict";
3258
3258
  var identity = require_identity();
3259
3259
  var map = require_map();
@@ -3283,9 +3283,9 @@ var require_Schema = __commonJS({
3283
3283
  }
3284
3284
  });
3285
3285
 
3286
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyDocument.js
3286
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyDocument.js
3287
3287
  var require_stringifyDocument = __commonJS({
3288
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/stringify/stringifyDocument.js"(exports) {
3288
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyDocument.js"(exports) {
3289
3289
  "use strict";
3290
3290
  var identity = require_identity();
3291
3291
  var stringify = require_stringify();
@@ -3363,9 +3363,9 @@ var require_stringifyDocument = __commonJS({
3363
3363
  }
3364
3364
  });
3365
3365
 
3366
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/doc/Document.js
3366
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/Document.js
3367
3367
  var require_Document = __commonJS({
3368
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/doc/Document.js"(exports) {
3368
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/Document.js"(exports) {
3369
3369
  "use strict";
3370
3370
  var Alias = require_Alias();
3371
3371
  var Collection = require_Collection();
@@ -3672,9 +3672,9 @@ var require_Document = __commonJS({
3672
3672
  }
3673
3673
  });
3674
3674
 
3675
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/errors.js
3675
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/errors.js
3676
3676
  var require_errors = __commonJS({
3677
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/errors.js"(exports) {
3677
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/errors.js"(exports) {
3678
3678
  "use strict";
3679
3679
  var YAMLError = class extends Error {
3680
3680
  constructor(name, pos, code, message) {
@@ -3737,9 +3737,9 @@ ${pointer}
3737
3737
  }
3738
3738
  });
3739
3739
 
3740
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-props.js
3740
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-props.js
3741
3741
  var require_resolve_props = __commonJS({
3742
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-props.js"(exports) {
3742
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-props.js"(exports) {
3743
3743
  "use strict";
3744
3744
  function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {
3745
3745
  let spaceBefore = false;
@@ -3871,9 +3871,9 @@ var require_resolve_props = __commonJS({
3871
3871
  }
3872
3872
  });
3873
3873
 
3874
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/util-contains-newline.js
3874
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-contains-newline.js
3875
3875
  var require_util_contains_newline = __commonJS({
3876
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/util-contains-newline.js"(exports) {
3876
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-contains-newline.js"(exports) {
3877
3877
  "use strict";
3878
3878
  function containsNewline(key) {
3879
3879
  if (!key)
@@ -3913,9 +3913,9 @@ var require_util_contains_newline = __commonJS({
3913
3913
  }
3914
3914
  });
3915
3915
 
3916
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/util-flow-indent-check.js
3916
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-flow-indent-check.js
3917
3917
  var require_util_flow_indent_check = __commonJS({
3918
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/util-flow-indent-check.js"(exports) {
3918
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-flow-indent-check.js"(exports) {
3919
3919
  "use strict";
3920
3920
  var utilContainsNewline = require_util_contains_newline();
3921
3921
  function flowIndentCheck(indent, fc, onError) {
@@ -3931,9 +3931,9 @@ var require_util_flow_indent_check = __commonJS({
3931
3931
  }
3932
3932
  });
3933
3933
 
3934
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/util-map-includes.js
3934
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-map-includes.js
3935
3935
  var require_util_map_includes = __commonJS({
3936
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/util-map-includes.js"(exports) {
3936
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-map-includes.js"(exports) {
3937
3937
  "use strict";
3938
3938
  var identity = require_identity();
3939
3939
  function mapIncludes(ctx, items, search) {
@@ -3947,9 +3947,9 @@ var require_util_map_includes = __commonJS({
3947
3947
  }
3948
3948
  });
3949
3949
 
3950
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-block-map.js
3950
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-map.js
3951
3951
  var require_resolve_block_map = __commonJS({
3952
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-block-map.js"(exports) {
3952
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-map.js"(exports) {
3953
3953
  "use strict";
3954
3954
  var Pair = require_Pair();
3955
3955
  var YAMLMap = require_YAMLMap();
@@ -4055,9 +4055,9 @@ var require_resolve_block_map = __commonJS({
4055
4055
  }
4056
4056
  });
4057
4057
 
4058
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-block-seq.js
4058
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-seq.js
4059
4059
  var require_resolve_block_seq = __commonJS({
4060
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-block-seq.js"(exports) {
4060
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-seq.js"(exports) {
4061
4061
  "use strict";
4062
4062
  var YAMLSeq = require_YAMLSeq();
4063
4063
  var resolveProps = require_resolve_props();
@@ -4106,9 +4106,9 @@ var require_resolve_block_seq = __commonJS({
4106
4106
  }
4107
4107
  });
4108
4108
 
4109
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-end.js
4109
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js
4110
4110
  var require_resolve_end = __commonJS({
4111
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-end.js"(exports) {
4111
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js"(exports) {
4112
4112
  "use strict";
4113
4113
  function resolveEnd(end, offset, reqSpace, onError) {
4114
4114
  let comment = "";
@@ -4149,9 +4149,9 @@ var require_resolve_end = __commonJS({
4149
4149
  }
4150
4150
  });
4151
4151
 
4152
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-flow-collection.js
4152
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-collection.js
4153
4153
  var require_resolve_flow_collection = __commonJS({
4154
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-flow-collection.js"(exports) {
4154
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-collection.js"(exports) {
4155
4155
  "use strict";
4156
4156
  var identity = require_identity();
4157
4157
  var Pair = require_Pair();
@@ -4343,9 +4343,9 @@ var require_resolve_flow_collection = __commonJS({
4343
4343
  }
4344
4344
  });
4345
4345
 
4346
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/compose-collection.js
4346
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-collection.js
4347
4347
  var require_compose_collection = __commonJS({
4348
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/compose-collection.js"(exports) {
4348
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-collection.js"(exports) {
4349
4349
  "use strict";
4350
4350
  var identity = require_identity();
4351
4351
  var Scalar = require_Scalar();
@@ -4408,9 +4408,9 @@ var require_compose_collection = __commonJS({
4408
4408
  }
4409
4409
  });
4410
4410
 
4411
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-block-scalar.js
4411
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-scalar.js
4412
4412
  var require_resolve_block_scalar = __commonJS({
4413
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-block-scalar.js"(exports) {
4413
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-scalar.js"(exports) {
4414
4414
  "use strict";
4415
4415
  var Scalar = require_Scalar();
4416
4416
  function resolveBlockScalar(ctx, scalar, onError) {
@@ -4591,9 +4591,9 @@ var require_resolve_block_scalar = __commonJS({
4591
4591
  }
4592
4592
  });
4593
4593
 
4594
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-flow-scalar.js
4594
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-scalar.js
4595
4595
  var require_resolve_flow_scalar = __commonJS({
4596
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/resolve-flow-scalar.js"(exports) {
4596
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-scalar.js"(exports) {
4597
4597
  "use strict";
4598
4598
  var Scalar = require_Scalar();
4599
4599
  var resolveEnd = require_resolve_end();
@@ -4811,9 +4811,9 @@ var require_resolve_flow_scalar = __commonJS({
4811
4811
  }
4812
4812
  });
4813
4813
 
4814
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/compose-scalar.js
4814
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-scalar.js
4815
4815
  var require_compose_scalar = __commonJS({
4816
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/compose-scalar.js"(exports) {
4816
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-scalar.js"(exports) {
4817
4817
  "use strict";
4818
4818
  var identity = require_identity();
4819
4819
  var Scalar = require_Scalar();
@@ -4892,9 +4892,9 @@ var require_compose_scalar = __commonJS({
4892
4892
  }
4893
4893
  });
4894
4894
 
4895
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/util-empty-scalar-position.js
4895
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-empty-scalar-position.js
4896
4896
  var require_util_empty_scalar_position = __commonJS({
4897
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/util-empty-scalar-position.js"(exports) {
4897
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-empty-scalar-position.js"(exports) {
4898
4898
  "use strict";
4899
4899
  function emptyScalarPosition(offset, before, pos) {
4900
4900
  if (before) {
@@ -4922,9 +4922,9 @@ var require_util_empty_scalar_position = __commonJS({
4922
4922
  }
4923
4923
  });
4924
4924
 
4925
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/compose-node.js
4925
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-node.js
4926
4926
  var require_compose_node = __commonJS({
4927
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/compose-node.js"(exports) {
4927
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-node.js"(exports) {
4928
4928
  "use strict";
4929
4929
  var Alias = require_Alias();
4930
4930
  var identity = require_identity();
@@ -5028,9 +5028,9 @@ var require_compose_node = __commonJS({
5028
5028
  }
5029
5029
  });
5030
5030
 
5031
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/compose-doc.js
5031
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-doc.js
5032
5032
  var require_compose_doc = __commonJS({
5033
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/compose-doc.js"(exports) {
5033
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-doc.js"(exports) {
5034
5034
  "use strict";
5035
5035
  var Document = require_Document();
5036
5036
  var composeNode = require_compose_node();
@@ -5071,9 +5071,9 @@ var require_compose_doc = __commonJS({
5071
5071
  }
5072
5072
  });
5073
5073
 
5074
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/composer.js
5074
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/composer.js
5075
5075
  var require_composer = __commonJS({
5076
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/compose/composer.js"(exports) {
5076
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/composer.js"(exports) {
5077
5077
  "use strict";
5078
5078
  var node_process = __require("process");
5079
5079
  var directives = require_directives();
@@ -5155,8 +5155,10 @@ ${cb}` : comment;
5155
5155
  }
5156
5156
  }
5157
5157
  if (afterDoc) {
5158
- Array.prototype.push.apply(doc.errors, this.errors);
5159
- Array.prototype.push.apply(doc.warnings, this.warnings);
5158
+ for (let i = 0; i < this.errors.length; ++i)
5159
+ doc.errors.push(this.errors[i]);
5160
+ for (let i = 0; i < this.warnings.length; ++i)
5161
+ doc.warnings.push(this.warnings[i]);
5160
5162
  } else {
5161
5163
  doc.errors = this.errors;
5162
5164
  doc.warnings = this.warnings;
@@ -5277,9 +5279,9 @@ ${end.comment}` : end.comment;
5277
5279
  }
5278
5280
  });
5279
5281
 
5280
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/cst-scalar.js
5282
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-scalar.js
5281
5283
  var require_cst_scalar = __commonJS({
5282
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/cst-scalar.js"(exports) {
5284
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-scalar.js"(exports) {
5283
5285
  "use strict";
5284
5286
  var resolveBlockScalar = require_resolve_block_scalar();
5285
5287
  var resolveFlowScalar = require_resolve_flow_scalar();
@@ -5462,9 +5464,9 @@ var require_cst_scalar = __commonJS({
5462
5464
  }
5463
5465
  });
5464
5466
 
5465
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/cst-stringify.js
5467
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-stringify.js
5466
5468
  var require_cst_stringify = __commonJS({
5467
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/cst-stringify.js"(exports) {
5469
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-stringify.js"(exports) {
5468
5470
  "use strict";
5469
5471
  var stringify = (cst) => "type" in cst ? stringifyToken(cst) : stringifyItem(cst);
5470
5472
  function stringifyToken(token) {
@@ -5523,9 +5525,9 @@ var require_cst_stringify = __commonJS({
5523
5525
  }
5524
5526
  });
5525
5527
 
5526
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/cst-visit.js
5528
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-visit.js
5527
5529
  var require_cst_visit = __commonJS({
5528
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/cst-visit.js"(exports) {
5530
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-visit.js"(exports) {
5529
5531
  "use strict";
5530
5532
  var BREAK = /* @__PURE__ */ Symbol("break visit");
5531
5533
  var SKIP = /* @__PURE__ */ Symbol("skip children");
@@ -5585,9 +5587,9 @@ var require_cst_visit = __commonJS({
5585
5587
  }
5586
5588
  });
5587
5589
 
5588
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/cst.js
5590
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst.js
5589
5591
  var require_cst = __commonJS({
5590
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/cst.js"(exports) {
5592
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst.js"(exports) {
5591
5593
  "use strict";
5592
5594
  var cstScalar = require_cst_scalar();
5593
5595
  var cstStringify = require_cst_stringify();
@@ -5687,9 +5689,9 @@ var require_cst = __commonJS({
5687
5689
  }
5688
5690
  });
5689
5691
 
5690
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/lexer.js
5692
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/lexer.js
5691
5693
  var require_lexer = __commonJS({
5692
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/lexer.js"(exports) {
5694
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/lexer.js"(exports) {
5693
5695
  "use strict";
5694
5696
  var cst = require_cst();
5695
5697
  function isEmpty(ch) {
@@ -5889,7 +5891,7 @@ var require_lexer = __commonJS({
5889
5891
  const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true));
5890
5892
  this.indentNext = this.indentValue + 1;
5891
5893
  this.indentValue += n;
5892
- return yield* this.parseBlockStart();
5894
+ return "block-start";
5893
5895
  }
5894
5896
  return "doc";
5895
5897
  }
@@ -6188,28 +6190,38 @@ var require_lexer = __commonJS({
6188
6190
  return 0;
6189
6191
  }
6190
6192
  *pushIndicators() {
6191
- switch (this.charAt(0)) {
6192
- case "!":
6193
- return (yield* this.pushTag()) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators());
6194
- case "&":
6195
- return (yield* this.pushUntil(isNotAnchorChar)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators());
6196
- case "-":
6197
- // this is an error
6198
- case "?":
6199
- // this is an error outside flow collections
6200
- case ":": {
6201
- const inFlow = this.flowLevel > 0;
6202
- const ch1 = this.charAt(1);
6203
- if (isEmpty(ch1) || inFlow && flowIndicatorChars.has(ch1)) {
6204
- if (!inFlow)
6205
- this.indentNext = this.indentValue + 1;
6206
- else if (this.flowKey)
6207
- this.flowKey = false;
6208
- return (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators());
6193
+ let n = 0;
6194
+ loop: while (true) {
6195
+ switch (this.charAt(0)) {
6196
+ case "!":
6197
+ n += yield* this.pushTag();
6198
+ n += yield* this.pushSpaces(true);
6199
+ continue loop;
6200
+ case "&":
6201
+ n += yield* this.pushUntil(isNotAnchorChar);
6202
+ n += yield* this.pushSpaces(true);
6203
+ continue loop;
6204
+ case "-":
6205
+ // this is an error
6206
+ case "?":
6207
+ // this is an error outside flow collections
6208
+ case ":": {
6209
+ const inFlow = this.flowLevel > 0;
6210
+ const ch1 = this.charAt(1);
6211
+ if (isEmpty(ch1) || inFlow && flowIndicatorChars.has(ch1)) {
6212
+ if (!inFlow)
6213
+ this.indentNext = this.indentValue + 1;
6214
+ else if (this.flowKey)
6215
+ this.flowKey = false;
6216
+ n += yield* this.pushCount(1);
6217
+ n += yield* this.pushSpaces(true);
6218
+ continue loop;
6219
+ }
6209
6220
  }
6210
6221
  }
6222
+ break loop;
6211
6223
  }
6212
- return 0;
6224
+ return n;
6213
6225
  }
6214
6226
  *pushTag() {
6215
6227
  if (this.charAt(1) === "<") {
@@ -6266,9 +6278,9 @@ var require_lexer = __commonJS({
6266
6278
  }
6267
6279
  });
6268
6280
 
6269
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/line-counter.js
6281
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/line-counter.js
6270
6282
  var require_line_counter = __commonJS({
6271
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/line-counter.js"(exports) {
6283
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/line-counter.js"(exports) {
6272
6284
  "use strict";
6273
6285
  var LineCounter = class {
6274
6286
  constructor() {
@@ -6297,9 +6309,9 @@ var require_line_counter = __commonJS({
6297
6309
  }
6298
6310
  });
6299
6311
 
6300
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/parser.js
6312
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/parser.js
6301
6313
  var require_parser = __commonJS({
6302
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/parse/parser.js"(exports) {
6314
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/parser.js"(exports) {
6303
6315
  "use strict";
6304
6316
  var node_process = __require("process");
6305
6317
  var cst = require_cst();
@@ -6368,6 +6380,13 @@ var require_parser = __commonJS({
6368
6380
  }
6369
6381
  return prev.splice(i, prev.length);
6370
6382
  }
6383
+ function arrayPushArray(target, source) {
6384
+ if (source.length < 1e5)
6385
+ Array.prototype.push.apply(target, source);
6386
+ else
6387
+ for (let i = 0; i < source.length; ++i)
6388
+ target.push(source[i]);
6389
+ }
6371
6390
  function fixFlowSeqItems(fc) {
6372
6391
  if (fc.start.type === "flow-seq-start") {
6373
6392
  for (const it of fc.items) {
@@ -6377,11 +6396,11 @@ var require_parser = __commonJS({
6377
6396
  delete it.key;
6378
6397
  if (isFlowToken(it.value)) {
6379
6398
  if (it.value.end)
6380
- Array.prototype.push.apply(it.value.end, it.sep);
6399
+ arrayPushArray(it.value.end, it.sep);
6381
6400
  else
6382
6401
  it.value.end = it.sep;
6383
6402
  } else
6384
- Array.prototype.push.apply(it.start, it.sep);
6403
+ arrayPushArray(it.start, it.sep);
6385
6404
  delete it.sep;
6386
6405
  }
6387
6406
  }
@@ -6736,7 +6755,7 @@ var require_parser = __commonJS({
6736
6755
  const prev = map.items[map.items.length - 2];
6737
6756
  const end = prev?.value?.end;
6738
6757
  if (Array.isArray(end)) {
6739
- Array.prototype.push.apply(end, it.start);
6758
+ arrayPushArray(end, it.start);
6740
6759
  end.push(this.sourceToken);
6741
6760
  map.items.pop();
6742
6761
  return;
@@ -6924,7 +6943,7 @@ var require_parser = __commonJS({
6924
6943
  const prev = seq.items[seq.items.length - 2];
6925
6944
  const end = prev?.value?.end;
6926
6945
  if (Array.isArray(end)) {
6927
- Array.prototype.push.apply(end, it.start);
6946
+ arrayPushArray(end, it.start);
6928
6947
  end.push(this.sourceToken);
6929
6948
  seq.items.pop();
6930
6949
  return;
@@ -7164,9 +7183,9 @@ var require_parser = __commonJS({
7164
7183
  }
7165
7184
  });
7166
7185
 
7167
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/public-api.js
7186
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/public-api.js
7168
7187
  var require_public_api = __commonJS({
7169
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/public-api.js"(exports) {
7188
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/public-api.js"(exports) {
7170
7189
  "use strict";
7171
7190
  var composer = require_composer();
7172
7191
  var Document = require_Document();
@@ -7261,9 +7280,9 @@ var require_public_api = __commonJS({
7261
7280
  }
7262
7281
  });
7263
7282
 
7264
- // ../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/index.js
7283
+ // ../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/index.js
7265
7284
  var require_dist = __commonJS({
7266
- "../node_modules/.bun/yaml@2.8.4/node_modules/yaml/dist/index.js"(exports) {
7285
+ "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/index.js"(exports) {
7267
7286
  "use strict";
7268
7287
  var composer = require_composer();
7269
7288
  var Document = require_Document();
@@ -7318,7 +7337,30 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7318
7337
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7319
7338
  import { z } from "zod";
7320
7339
 
7340
+ // ../shared/src/type-guards.ts
7341
+ function isRecord(value) {
7342
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7343
+ }
7344
+
7321
7345
  // ../shared/src/event.ts
7346
+ var CLAUDE_PARTIAL_MESSAGE_EVENT_TYPE = "claude-partial-message";
7347
+ function coerceClaudePartialMessagePayload(payload) {
7348
+ const streamId = payload.streamId;
7349
+ if (typeof streamId !== "string" || !streamId) return null;
7350
+ const parentToolUseId = payload.parent_tool_use_id;
7351
+ const text = typeof payload.text === "string" && payload.text ? payload.text : void 0;
7352
+ const thinking = typeof payload.thinking === "string" && payload.thinking ? payload.thinking : void 0;
7353
+ if (!text && !thinking) return null;
7354
+ return {
7355
+ streamId,
7356
+ parent_tool_use_id: typeof parentToolUseId === "string" ? parentToolUseId : null,
7357
+ ...text ? { text } : {},
7358
+ ...thinking ? { thinking } : {},
7359
+ status: payload.status === "completed" ? "completed" : "in_progress"
7360
+ };
7361
+ }
7362
+ var USER_MESSAGE_ID_PAYLOAD_KEY = "replicasMessageId";
7363
+ var CODEX_ASP_ITEM_ID_PAYLOAD_KEY = "codexAspItemId";
7322
7364
  var CODEX_QUOTA_STATUS_EVENT_TYPE = "codex-quota-status";
7323
7365
 
7324
7366
  // ../shared/src/pricing.ts
@@ -7398,20 +7440,194 @@ var SANDBOX_LIFECYCLE = {
7398
7440
  AUTO_DELETE_MINUTES: -1,
7399
7441
  SSH_TOKEN_EXPIRATION_MINUTES: 3 * 60
7400
7442
  };
7401
- function buildPaths(homeDir) {
7402
- return {
7403
- HOME_DIR: homeDir,
7404
- WORKSPACES_DIR: `${homeDir}/workspaces`,
7405
- REPLICAS_DIR: `${homeDir}/.replicas`,
7406
- REPLICAS_FILES_DIR: `${homeDir}/.replicas/files`,
7407
- REPLICAS_RUNTIME_ENV_FILE: `${homeDir}/.replicas/runtime-env.sh`
7408
- };
7409
- }
7410
- var DAYTONA_PATHS = buildPaths("/home/ubuntu");
7411
- var E2B_PATHS = buildPaths("/home/user");
7443
+ var WORKSPACE_SIZES = ["small", "large"];
7444
+ var INVALID_WORKSPACE_SIZE_ERROR = `Invalid size: must be one of ${WORKSPACE_SIZES.join(", ")}`;
7445
+
7446
+ // ../shared/src/default-skills/replicas-agent/abilities/computer.ts
7447
+ var SECTION = `### Computer use (Linux desktop control)
7448
+ Drive the workspace's Linux desktop - open a browser, click, type, scroll, screenshot, record - via the \`replicas computer\` CLI. Every Replicas workspace boots with Xvfb / openbox / x11vnc / noVNC pre-installed and the live noVNC viewer is automatically published as an authenticated preview, so a \`Desktop\` tab is always available in the dashboard. Use \`replicas computer info\` to get the viewer URL when you want to share it (e.g. point a user on Slack at the live stream).
7449
+
7450
+ **Reference:** \`references/COMPUTER-USE.md\`
7451
+
7452
+ Use this when:
7453
+ - A task requires interacting with a website, web app, or desktop application that has no usable API
7454
+ - You want the user to watch the agent work - they can open the \`Desktop\` tab, or you can share the URL from \`replicas computer info\`
7455
+ - You're testing UI changes in a browser before reporting them as done
7456
+ - You want to record a screen capture of a task as proof to share back`;
7457
+ var REFERENCE = `# Computer use (Linux desktop control)
7458
+
7459
+ Every Replicas workspace boots with a full Linux desktop stack - Xvfb (1920\xD71080), openbox, tint2, x11vnc, noVNC, ffmpeg, and Google Chrome. The engine also auto-registers the noVNC viewer (port 6080) as an authenticated preview at startup, so the dashboard \`Desktop\` tab is live the moment the workspace is up. You drive the desktop through the \`replicas computer\` CLI.
7460
+
7461
+ Use this for anything the user can't reasonably do via an API - clicking around web apps, filling forms, testing UI changes, dragging files between desktop apps, recording a walkthrough.
7462
+
7463
+ ## When to use it
7464
+
7465
+ - **Prefer real APIs first.** If a task has a CLI or HTTP API (GitHub, Linear, Slack, Replicas itself), use that. Driving a UI is slower, flakier, and less auditable.
7466
+ - **Use it when there's no API**: testing a frontend you just changed, navigating a vendor portal, demonstrating a flow on video.
7467
+ - **Use it when the user wants to watch.** The dashboard already shows a \`Desktop\` tab. If you're talking to the user somewhere else (e.g. Slack), call \`replicas computer info\` to get the viewer URL and paste it in.
7468
+
7469
+ ## Never use raw \`xdotool\` / \`scrot\` / \`ffmpeg\` directly
7470
+
7471
+ The CLI is the canonical surface. Chat transcripts that show \`DISPLAY=:99 xdotool key Return\` are noisy and break when the underlying stack changes. Always call the CLI:
7472
+
7473
+ \`\`\`bash
7474
+ # DO
7475
+ replicas computer key Return
7476
+ replicas computer screenshot /tmp/state.png
7477
+
7478
+ # DON'T
7479
+ DISPLAY=:99 xdotool key Return
7480
+ scrot /tmp/state.png
7481
+ \`\`\`
7482
+
7483
+ ## Quickstart
7484
+
7485
+ \`\`\`bash
7486
+ # 1) (Optional) Get the live viewer URL so you can share it with the user.
7487
+ # The desktop is already running and the preview is already registered -
7488
+ # this just looks up the URL.
7489
+ replicas computer info
7490
+
7491
+ # 2) Launch a browser on the workspace display.
7492
+ replicas computer launch chrome
7493
+
7494
+ # 3) Take a screenshot so you can see what's there.
7495
+ replicas computer screenshot /tmp/state.png
7496
+ # (Read the PNG yourself before deciding where to click.)
7497
+
7498
+ # 4) Drive the UI.
7499
+ replicas computer key ctrl+l # focus address bar
7500
+ replicas computer type "https://news.ycombinator.com"
7501
+ replicas computer key Return
7502
+ replicas computer click 521 700 # click coordinates from the screenshot
7503
+ replicas computer scroll down --amount 5
7504
+
7505
+ # 5) (Optional) Record a screencap to share back.
7506
+ replicas computer record start /tmp/demo.mp4 --fps 60
7507
+ # ... do stuff ...
7508
+ replicas computer record stop
7509
+ replicas media upload /tmp/demo.mp4
7510
+ \`\`\`
7511
+
7512
+ ## Command reference
7513
+
7514
+ ### \`replicas computer info\`
7515
+ Prints the live noVNC viewer URL (\`https://6080-<hash>.tryreplicas.com/\`) for the workspace desktop. The engine auto-registers this authenticated preview on startup; \`info\` just looks it up. Use it when you want to share the live stream URL with the user out-of-band (e.g. in a Slack reply) - the dashboard \`Desktop\` tab already points at the same URL automatically.
7516
+
7517
+ If invoked very early in the workspace lifecycle, \`info\` will poll briefly while the engine finishes registering the preview, then error if it's still not available.
7518
+
7519
+ ### \`replicas computer status\`
7520
+ Prints which desktop services are running and the active preview URL (if any). Useful for debugging when a tool call seems to be doing nothing.
7521
+
7522
+ ### \`replicas computer screenshot <path>\`
7523
+ Captures the current desktop to a PNG at the given path. Read the file (e.g. with your Read tool) to see what's on screen - coordinates from the screenshot drive subsequent \`click\` / \`move\` / \`drag\` calls.
7524
+
7525
+ ### \`replicas computer click <x> <y> [--button N] [--double] [--modifiers ctrl+shift]\`
7526
+ Move to (x, y) and click. Default is left-click (button 1); pass \`--button 3\` for right-click. \`--modifiers\` holds keys during the click (e.g. ctrl-click a link to open in a new tab).
7527
+
7528
+ ### \`replicas computer move <x> <y>\`
7529
+ Move the mouse without clicking. Useful for hovering tooltips.
7530
+
7531
+ ### \`replicas computer type <text> [--delay MS]\`
7532
+ Type a literal string into the focused field. Default per-character delay is 12ms (~80 wpm) - feels human and avoids breaking apps that debounce input. Bump \`--delay 30\` for stricter apps.
7533
+
7534
+ For key combos (not literal text), use \`key\`. \`type "ctrl+l"\` will literally type the seven characters \`c t r l + l\`.
7535
+
7536
+ ### \`replicas computer key <combo>\`
7537
+ Press a single key or combo. Examples: \`Return\`, \`Escape\`, \`Tab\`, \`ctrl+l\`, \`ctrl+shift+t\`, \`alt+Left\`, \`Page_Down\`, \`Home\`. Syntax matches \`xdotool key\`.
7538
+
7539
+ ### \`replicas computer scroll <up|down|left|right> [--amount N] [--x X --y Y]\`
7540
+ Scroll the wheel. Pass \`--x\` / \`--y\` to hover before scrolling (otherwise scrolls wherever the cursor currently is). Default amount is 3 wheel ticks.
7541
+
7542
+ ### \`replicas computer drag <fromX> <fromY> <toX> <toY>\`
7543
+ Press left mouse at (fromX, fromY), drag to (toX, toY), release. For things like dragging a file onto an upload zone.
7544
+
7545
+ ### \`replicas computer launch <app> [args...]\`
7546
+ Spawns an app on the workspace display. Built-in aliases:
7547
+ - \`chrome\` - Google Chrome with a clean profile and sane flags
7548
+ - \`chromium\` - Chromium variant
7549
+ - \`firefox\` - Firefox
7550
+ - \`terminal\` - xfce4-terminal (modern, themed); \`xterm\` for the classic
7551
+ - \`notepad\` / \`editor\` - mousepad (lightweight GTK text editor)
7552
+ - \`files\` / \`filemanager\` - thunar (file manager)
7553
+ Anything else gets \`exec\`'d verbatim, so \`replicas computer launch xeyes\` works if xeyes is installed.
7554
+
7555
+ ### \`replicas computer record start <path> [--fps N]\`
7556
+ Starts an ffmpeg screen recorder. Output is a fragmented MP4 (still playable if the workspace dies mid-record). Default 60fps; drop to 30 if the workspace is CPU-constrained.
7557
+
7558
+ Only one recording at a time. Re-running \`start\` while one is active fails - call \`stop\` first.
7559
+
7560
+ ### \`replicas computer record stop\`
7561
+ SIGINTs ffmpeg, waits for it to finalize the MP4, prints the output path. Upload it with \`replicas media upload <path>\` to share it.
7562
+
7563
+ ## Patterns
7564
+
7565
+ ### Action / screenshot loop
7566
+ You are blind between tool calls. After any action that changes the screen, take a screenshot before deciding the next coordinate:
7567
+
7568
+ \`\`\`bash
7569
+ replicas computer click 521 700
7570
+ sleep 2 # let the page settle
7571
+ replicas computer screenshot /tmp/after-click.png
7572
+ # read /tmp/after-click.png, decide next click
7573
+ \`\`\`
7574
+
7575
+ \`sleep\` is a regular shell sleep - there's no \`replicas computer wait\` command, but you can mix shell sleeps freely.
7576
+
7577
+ ### Typing into an address bar
7578
+ \`\`\`bash
7579
+ replicas computer key ctrl+l # focus address bar
7580
+ replicas computer type "https://example.com"
7581
+ replicas computer key Return
7582
+ sleep 3 # wait for page load
7583
+ replicas computer screenshot /tmp/loaded.png
7584
+ \`\`\`
7585
+
7586
+ ### Coordinates from screenshots
7587
+ The display is 1920\xD71080 by default. Screenshot pixels map 1:1 to click coordinates - if your Read tool shows a button at pixel (520, 700), click \`replicas computer click 520 700\`. **No translation needed.** Modern image-reading models often imagine the screenshot is at a different resolution; trust the \`xdpyinfo\` value (\`replicas computer status\` shows the real size).
7588
+
7589
+ ### Letting the user watch
7590
+ The Desktop tab is already live in the dashboard - the user can open it any time. If you're communicating with the user somewhere else (Slack, PR comment, etc.), grab the URL with \`replicas computer info\` and share it inline so they can watch you work.
7591
+
7592
+ ### Recording a deliverable
7593
+ For tasks the user wants proof of:
7594
+ \`\`\`bash
7595
+ replicas computer record start /tmp/walkthrough.mp4
7596
+ # ... your work ...
7597
+ replicas computer record stop
7598
+ replicas media upload /tmp/walkthrough.mp4
7599
+ \`\`\`
7600
+ Then embed the printed \`![\u2026](\u2026)\` line in your chat reply. See \`MEDIA.md\`.
7601
+
7602
+ ## Failure modes
7603
+
7604
+ - **"Desktop services script missing"**: workspace image is older than this skill. Tell the user - nothing you can do from the CLI side.
7605
+ - **\`xdotool ... failed: Can't open display\`**: Xvfb didn't come up. \`replicas computer status\` will show which service is dead. Re-running any CLI command auto-attempts to start it.
7606
+ - **Browser doesn't appear after \`launch chrome\`**: give it 1-2s, then screenshot. Chrome cold-start on the virtual display takes ~500ms but bigger pages take longer.
7607
+ - **Live preview shows static / black screen**: the browser may have crashed. \`replicas computer status\` should show no Chrome process - re-launch.
7608
+ - **\`replicas computer info\` errors with "not registered"**: engine couldn't register the preview at startup (transient monolith error, or warming mode). Re-running the engine usually fixes it. Until it's registered, the Desktop tab will show a placeholder.
7609
+
7610
+ ## What gets baked in vs. lazy
7611
+
7612
+ | Component | Where |
7613
+ |---|---|
7614
+ | \`xvfb\`, \`openbox\`, \`tint2\`, \`x11vnc\`, \`websockify\`, \`xdotool\`, \`scrot\`, \`ffmpeg\`, \`google-chrome\` | Baked into the workspace image |
7615
+ | Xvfb / openbox / tint2 / x11vnc / websockify processes | Started at workspace boot (\`replicas-start-desktop-services\`) |
7616
+ | noVNC preview URL (port 6080) | Registered by the engine on startup (authenticated) |
7617
+ | Dashboard \`Desktop\` tab | Always available once the engine has registered the preview |
7618
+
7619
+ You can call any of the input tools (\`click\`, \`type\`, \`screenshot\`, etc.) immediately - the daemons are already running.
7620
+ `;
7621
+ var COMPUTER_ABILITY = {
7622
+ label: "Computer use",
7623
+ description: "Drive the workspace's Linux desktop and stream a live noVNC viewer.",
7624
+ bullet: "- Driving the workspace Linux desktop (open a browser, click, type, scroll, screenshot, record) and exposing a live noVNC viewer in the dashboard",
7625
+ section: SECTION,
7626
+ referenceFile: { name: "COMPUTER-USE.md", content: REFERENCE }
7627
+ };
7412
7628
 
7413
7629
  // ../shared/src/default-skills/replicas-agent/abilities/docker.ts
7414
- var SECTION = `### Docker
7630
+ var SECTION2 = `### Docker
7415
7631
  Start and use the Docker daemon in Replicas workspaces. Docker is pre-installed but the daemon does not auto-start.
7416
7632
 
7417
7633
  **Reference:** \`references/DOCKER.md\`
@@ -7420,7 +7636,7 @@ Use this when:
7420
7636
  - You need to run \`docker\` or \`docker compose\` commands
7421
7637
  - You need to build or run Docker containers
7422
7638
  - Your task involves containerized services or Docker-based workflows`;
7423
- var REFERENCE = `# Docker
7639
+ var REFERENCE2 = `# Docker
7424
7640
 
7425
7641
  Docker is pre-installed in Replicas workspaces, but the daemon does **not** auto-start. You must start it manually before running any \`docker\` or \`docker compose\` commands.
7426
7642
 
@@ -7428,33 +7644,30 @@ Docker is pre-installed in Replicas workspaces, but the daemon does **not** auto
7428
7644
 
7429
7645
  \`\`\`bash
7430
7646
  sudo service docker start
7647
+ until docker info >/dev/null 2>&1; do sleep 0.2; done
7431
7648
  \`\`\`
7432
7649
 
7433
- After starting, verify the daemon is running:
7434
-
7435
- \`\`\`bash
7436
- docker info
7437
- \`\`\`
7650
+ \`service docker start\` returns before the socket is accepting connections, so immediate commands may fail without the poll.
7438
7651
 
7439
7652
  ## Important Notes
7440
7653
 
7441
7654
  - **Start once per session.** The daemon stays running until the workspace shuts down. You do not need to restart it between commands.
7442
7655
  - **Check before starting.** If you are unsure whether the daemon is already running, check first to avoid an unnecessary restart:
7443
7656
  \`\`\`bash
7444
- docker info > /dev/null 2>&1 || sudo service docker start
7657
+ docker info >/dev/null 2>&1 || { sudo service docker start && until docker info >/dev/null 2>&1; do sleep 0.2; done; }
7445
7658
  \`\`\`
7446
- - **Sudo is required** for starting the daemon, but regular \`docker\` commands run without sudo (the user is in the \`docker\` group).
7659
+ - **Sudo is only required for starting the daemon.** The workspace user is in the \`docker\` group, so regular \`docker\` commands work without sudo.
7447
7660
  `;
7448
7661
  var DOCKER_ABILITY = {
7449
7662
  label: "Docker",
7450
7663
  description: "Start the daemon, build/run containers, drive `docker compose`.",
7451
7664
  bullet: "- Using Docker (starting the daemon, running containers, docker compose)",
7452
- section: SECTION,
7453
- referenceFile: { name: "DOCKER.md", content: REFERENCE }
7665
+ section: SECTION2,
7666
+ referenceFile: { name: "DOCKER.md", content: REFERENCE2 }
7454
7667
  };
7455
7668
 
7456
7669
  // ../shared/src/default-skills/replicas-agent/abilities/github.ts
7457
- var SECTION2 = `### GitHub
7670
+ var SECTION3 = `### GitHub
7458
7671
  Use the pre-authenticated \`gh\` CLI for pull requests, issues, actions, and API calls.
7459
7672
 
7460
7673
  **Reference:** \`references/GITHUB.md\`
@@ -7464,7 +7677,7 @@ Use this when:
7464
7677
  - You need to interact with GitHub issues or actions
7465
7678
  - You need to use the GitHub API for advanced operations
7466
7679
  - You need to include images in PR descriptions`;
7467
- var REFERENCE2 = `# GitHub Integration
7680
+ var REFERENCE3 = `# GitHub Integration
7468
7681
 
7469
7682
  This guide covers how to interact with GitHub from within your Replicas workspace.
7470
7683
 
@@ -7583,19 +7796,77 @@ gh pr review 123 --request-changes --body "Changes needed"
7583
7796
  GitHub does NOT have a public API for uploading images to PRs/issues. When you need to include images:
7584
7797
  - Do NOT use placeholder image URLs
7585
7798
  - Do NOT commit screenshots as files to the repository
7586
- - Upload images to Imgur (or another external host) and use the returned URLs in your PR markdown
7587
- - If you were triggered from Slack, also upload the images to the Slack thread so the user can see them directly
7799
+ - Use the \`replicas-agent\` skill to share the image
7800
+ - If you were triggered from Slack, also upload the image to the Slack thread so the user can see it directly
7588
7801
  `;
7589
7802
  var GITHUB_ABILITY = {
7590
7803
  label: "GitHub",
7591
7804
  description: "Pre-authenticated `gh` CLI for PRs, issues, releases, and GraphQL.",
7592
7805
  bullet: "- Interacting with GitHub (creating PRs, managing issues, using the API, etc.)",
7593
- section: SECTION2,
7594
- referenceFile: { name: "GITHUB.md", content: REFERENCE2 }
7806
+ section: SECTION3,
7807
+ referenceFile: { name: "GITHUB.md", content: REFERENCE3 }
7808
+ };
7809
+
7810
+ // ../shared/src/default-skills/replicas-agent/abilities/gitlab.ts
7811
+ var SECTION4 = `### GitLab
7812
+ Workspace repos hosted on GitLab use pre-configured git credentials \u2014 push, pull, and open merge requests with plain \`git\`.
7813
+
7814
+ **Reference:** \`references/GITLAB.md\`
7815
+
7816
+ Use this when:
7817
+ - A repo's remote is on gitlab.com or a self-managed GitLab instance
7818
+ - You need to open or update a merge request`;
7819
+ var REFERENCE4 = `# GitLab Integration
7820
+
7821
+ This guide covers how to work with GitLab-hosted repositories from within your Replicas workspace.
7822
+
7823
+ ## Prerequisites
7824
+
7825
+ Git credentials for the workspace's GitLab hosts are pre-configured in \`~/.git-credentials\` and refreshed automatically. Plain \`git fetch\` / \`git pull\` / \`git push\` over HTTPS work with no additional setup.
7826
+
7827
+ - Never ask the user for a GitLab token or PAT \u2014 credentials are already wired. If a push fails with an authentication error, report it to the user instead of working around it.
7828
+ - There is no \`glab\` CLI in the workspace, and \`gh\` only works for GitHub remotes. Check a repo's host with \`git remote get-url origin\` before choosing the GitHub or GitLab workflow.
7829
+
7830
+ ## Merge Requests
7831
+
7832
+ Create a merge request directly from a push using push options:
7833
+
7834
+ \`\`\`bash
7835
+ git push -o merge_request.create -o merge_request.target=<default-branch> origin HEAD
7836
+ \`\`\`
7837
+
7838
+ Useful options:
7839
+
7840
+ \`\`\`bash
7841
+ -o merge_request.title="Title"
7842
+ -o merge_request.description="Description"
7843
+ -o merge_request.draft # open as draft
7844
+ -o merge_request.remove_source_branch # delete branch on merge
7845
+ \`\`\`
7846
+
7847
+ GitLab prints the MR URL in the push output \u2014 include it in your reply to the user.
7848
+
7849
+ ## GitLab API (advanced)
7850
+
7851
+ For operations with no git equivalent (commenting on MRs, reading pipelines), call the REST API with the workspace credential:
7852
+
7853
+ \`\`\`bash
7854
+ TOKEN=$(grep -m1 '://oauth2:' ~/.git-credentials | sed -E 's#https://oauth2:([^@]+)@.*#\\1#')
7855
+ curl -s -H "Authorization: Bearer $TOKEN" "https://gitlab.com/api/v4/projects/<url-encoded-path>/merge_requests"
7856
+ \`\`\`
7857
+
7858
+ Use the repo's own host in the API base URL for self-managed instances.
7859
+ `;
7860
+ var GITLAB_ABILITY = {
7861
+ label: "GitLab",
7862
+ description: "Pre-configured git credentials for GitLab repos; merge requests via push options.",
7863
+ bullet: "- Interacting with GitLab (pushing to GitLab repos, opening merge requests)",
7864
+ section: SECTION4,
7865
+ referenceFile: { name: "GITLAB.md", content: REFERENCE4 }
7595
7866
  };
7596
7867
 
7597
7868
  // ../shared/src/default-skills/replicas-agent/abilities/google.ts
7598
- var SECTION3 = `### Google Workspace (Docs, Sheets, Forms, Drive)
7869
+ var SECTION5 = `### Google Workspace (Docs, Sheets, Forms, Drive)
7599
7870
  Create and edit Google Docs, Sheets, and Forms via the Replicas gateway. Files are owned by Replicas \u2014 the integration cannot access pre-existing Google content created outside of it.
7600
7871
 
7601
7872
  **Reference:** \`references/GOOGLE.md\`
@@ -7604,7 +7875,7 @@ Use this when:
7604
7875
  - You need to create or edit a Google Doc, Sheet, or Form
7605
7876
  - You need to share, rename, move, or delete a Replicas-created Google file
7606
7877
  - You need to read responses from a Replicas-created Google Form`;
7607
- var REFERENCE3 = `# Google Workspace (Docs, Sheets, Forms, Drive)
7878
+ var REFERENCE5 = `# Google Workspace (Docs, Sheets, Forms, Drive)
7608
7879
 
7609
7880
  This guide covers how to create and edit Google Docs, Sheets, and Forms \u2014 plus do basic Drive file operations \u2014 from inside a Replicas workspace, using the monolith as a gateway to Google's APIs.
7610
7881
 
@@ -7865,12 +8136,12 @@ var GOOGLE_ABILITY = {
7865
8136
  label: "Google Workspace",
7866
8137
  description: "Create / edit Docs, Sheets, Forms, and Drive files via the Replicas gateway.",
7867
8138
  bullet: "- Interacting with Google Workspace (creating and editing Docs, Sheets, and Forms, sharing files, reading form responses, etc.)",
7868
- section: SECTION3,
7869
- referenceFile: { name: "GOOGLE.md", content: REFERENCE3 }
8139
+ section: SECTION5,
8140
+ referenceFile: { name: "GOOGLE.md", content: REFERENCE5 }
7870
8141
  };
7871
8142
 
7872
8143
  // ../shared/src/default-skills/replicas-agent/abilities/linear.ts
7873
- var SECTION4 = `### Linear
8144
+ var SECTION6 = `### Linear
7874
8145
  Fetch issues, update state, add comments, and search via the Linear GraphQL API.
7875
8146
 
7876
8147
  **Reference:** \`references/LINEAR.md\`
@@ -7879,7 +8150,7 @@ Use this when:
7879
8150
  - You encounter a Linear issue link and need to understand the task
7880
8151
  - You need to update an issue's state (e.g. mark as done)
7881
8152
  - You need to comment on or search for Linear issues`;
7882
- var REFERENCE4 = `# Linear Integration
8153
+ var REFERENCE6 = `# Linear Integration
7883
8154
 
7884
8155
  This guide covers how to interact with Linear from within your Replicas workspace.
7885
8156
 
@@ -7954,13 +8225,13 @@ var LINEAR_ABILITY = {
7954
8225
  label: "Linear",
7955
8226
  description: "Fetch issues, post comments, update states via the Linear GraphQL API.",
7956
8227
  bullet: "- Interacting with Linear (fetching issues, updating state, commenting, etc.)",
7957
- section: SECTION4,
7958
- referenceFile: { name: "LINEAR.md", content: REFERENCE4 }
8228
+ section: SECTION6,
8229
+ referenceFile: { name: "LINEAR.md", content: REFERENCE6 }
7959
8230
  };
7960
8231
 
7961
8232
  // ../shared/src/default-skills/replicas-agent/abilities/media.ts
7962
- var SECTION5 = `### Media
7963
- Share screenshots, screen recordings, generated diagrams, and audio clips inline in the Replicas chat (and as references in external messages).
8233
+ var SECTION7 = `### Media
8234
+ Share screenshots, screen recordings, generated diagrams, and audio clips inline in the Replicas chat and natively embedded in external messages.
7964
8235
 
7965
8236
  **Reference:** \`references/MEDIA.md\`
7966
8237
 
@@ -7968,9 +8239,9 @@ Use this when:
7968
8239
  - You produce a screenshot, recording, generated image, or audio clip the user should see
7969
8240
  - You record video output (browser automation, screen capture) \u2014 including the recommended aspect ratio and FPS
7970
8241
  - You need to embed media in a Slack/Linear/GitHub message AND keep a referenceable copy in the Replicas dashboard`;
7971
- var REFERENCE5 = `# Media (Screenshots, Recordings, Audio)
8242
+ var REFERENCE7 = `# Media (Screenshots, Recordings, Audio)
7972
8243
 
7973
- This guide covers how to share screenshots, screen recordings, generated diagrams, and audio clips with the user inline in the Replicas chat.
8244
+ This guide covers how to share screenshots, screen recordings, generated diagrams, and audio clips \u2014 both inline in the Replicas chat and natively embedded in external surfaces (Slack, Linear, GitHub).
7974
8245
 
7975
8246
  ## Prerequisites
7976
8247
 
@@ -7986,7 +8257,7 @@ Upload to Replicas in these cases \u2014 and **only** these cases:
7986
8257
 
7987
8258
  If none of these apply, don't upload.
7988
8259
 
7989
- ## Uploading
8260
+ ## Uploading to Replicas
7990
8261
 
7991
8262
  \`\`\`bash
7992
8263
  replicas media upload <path-to-file> [<path-to-file> ...]
@@ -7996,48 +8267,185 @@ Pass one or more file paths. Uploading several files in a single invocation is p
7996
8267
 
7997
8268
  For each file, the CLI prints two lines:
7998
8269
 
7999
- 1. \`![filename](<api-url>)\` \u2014 the chat embed (renders inline in Replicas chat only; see below).
8270
+ 1. \`![filename](<api-url>)\` \u2014 the chat embed (renders inline in Replicas chat **only** \u2014 see below).
8000
8271
  2. \`View in Replicas: <deep-link>\` \u2014 a per-file dashboard URL of the form \`https://tryreplicas.com/workspaces/<workspace-id>?mode=media&media=<media-id>\` that opens directly to that specific file.
8001
8272
 
8002
8273
  Match each "View in Replicas" line to the embed line directly above it \u2014 that's the deep link for that file.
8003
8274
 
8004
- ## How to use the output
8275
+ ## The two URLs the CLI gives you \u2014 and where each one is allowed
8005
8276
 
8006
- ### CRITICAL: the markdown embed URL is for Replicas chat only
8277
+ | URL | What it is | Where it's allowed |
8278
+ |---|---|---|
8279
+ | \`https://api.tryreplicas.com/v1/media/<id>\` (inside \`![\u2026](\u2026)\`) | Authenticated API redirect to a presigned blob \u2014 requires the Replicas chat session | **Only** in the Replicas chat reply. Nowhere else. |
8280
+ | \`https://tryreplicas.com/workspaces/<workspace-id>?mode=media&media=<media-id>\` | Public dashboard deep link to the media tab, scrolled to that specific file | Everywhere external \u2014 Slack, GitHub, Linear, PR bodies, comments, emails. |
8007
8281
 
8008
- The URL inside \`![filename](...)\` points at \`api.tryreplicas.com/v1/media/<id>\`. This is **not a public URL** \u2014 it requires the Replicas chat's authenticated session, which resolves it to a presigned download. Anywhere else (Slack, Linear, GitHub, a browser tab the user opens directly, a customer copy-pasting from chat), it returns \`{"error":"Missing authorization token"}\` and renders as a broken image.
8282
+ ### NEVER link the API redirect URL outside the Replicas chat reply
8009
8283
 
8010
- **Never paste this URL outside your Replicas chat reply.** Not in Slack messages, not in Linear comments, not in PR descriptions or commit messages, not in external docs \u2014 nowhere a non-Replicas surface will render it.
8284
+ The \`api.tryreplicas.com/v1/media/<id>\` URL is **not public**. It's an authenticated redirect that only resolves to a presigned download when the Replicas chat session token is present. Anywhere else (Slack, Linear, GitHub, a browser tab the user opens directly, a customer copy-pasting from chat) it returns \`{"error":"Missing authorization token"}\` and renders as a broken image.
8011
8285
 
8012
- ### Always render dashboard URLs as \`[View in Replicas](<url>)\` hyperlinks
8286
+ This rule has no exceptions:
8287
+ - \u274C Never paste it in a Slack message \u2014 upload the actual bytes via the 3-step \`files.getUploadURLExternal\` \u2192 POST bytes \u2192 \`files.completeUploadExternal\` flow instead (see below).
8288
+ - \u274C Never paste it in a GitHub PR description, issue body, review comment, or commit message.
8289
+ - \u274C Never paste it in a Linear issue body or comment \u2014 upload via Linear's \`fileUpload\` mutation instead (see below).
8290
+ - \u274C Never link to it from any external doc, email, or external chat.
8291
+ - \u274C Never include it as a "backup link" in case the dashboard link breaks \u2014 it will always break externally.
8013
8292
 
8014
- Whenever you share a workspace dashboard URL \u2014 in chat or anywhere else \u2014 format it as a markdown hyperlink labeled **View in Replicas**:
8293
+ ### ALWAYS link the dashboard URL \u2014 never the API URL \u2014 when referencing media externally
8015
8294
 
8016
- \`\`\`markdown
8017
- [View in Replicas](https://tryreplicas.com/workspaces/<workspace-id>?mode=media&media=<media-id>)
8295
+ When you reference an uploaded file from anywhere outside the Replicas chat reply, the link must be the dashboard form:
8296
+
8297
+ \`\`\`
8298
+ https://tryreplicas.com/workspaces/<workspace-id>?mode=media&media=<media-id>
8018
8299
  \`\`\`
8019
8300
 
8020
- Never paste the raw URL. Raw URLs look unpolished.
8301
+ Both query params are required:
8302
+ - \`mode=media\` opens the media tab in the dashboard.
8303
+ - \`media=<media-id>\` scrolls to and opens that specific file.
8021
8304
 
8022
- Two flavors of dashboard URL the CLI gives you:
8305
+ Never link \`tryreplicas.com/workspaces/<id>?mode=media\` without the \`media=<id>\` param when you have a specific file in mind \u2014 that lands on the gallery, not the file. Never link the bare workspace URL.
8023
8306
 
8024
- - **Per-file deep link** (default \u2014 what \`replicas media upload\` prints): \`...?mode=media&media=<media-id>\` opens the dashboard scrolled to that specific file. Use this whenever you're linking to *one* file.
8025
- - **Media tab link** (no \`media=\` param): \`...?mode=media\` opens the workspace's media tab listing all files. Use this only when you're pointing at the collection, not a specific file (rare \u2014 you almost always have a specific file in mind).
8307
+ Always render as a markdown / mrkdwn hyperlink labeled **View in Replicas** \u2014 never paste a raw URL.
8026
8308
 
8027
- ### In your Replicas chat reply
8309
+ ## In your Replicas chat reply
8028
8310
 
8029
8311
  Include each markdown embed line **verbatim** where you want that file to render inline. The chat substitutes each one with an embedded image, video, or audio player. Multiple embeds can appear in a single reply.
8030
8312
 
8031
- After (or alongside) the embeds, include a \`[View in Replicas](<deep-link>)\` hyperlink for each file using the per-file URL the CLI printed for that file. This lets the user jump to the specific item in the media tab.
8313
+ After (or alongside) the embeds, include a \`[View in Replicas](<deep-link>)\` hyperlink for each file using the per-file dashboard URL from the CLI. This lets the user jump to the specific item in the media tab.
8314
+
8315
+ ## On external platforms \u2014 upload natively AND link the dashboard
8316
+
8317
+ Sharing media externally is a **two-step requirement** for every file:
8318
+
8319
+ 1. **Upload the raw bytes natively to that platform** so the recipient sees the media embedded inline in the message itself.
8320
+ 2. **Link the Replicas dashboard deep link** (\`?mode=media&media=<id>\` form) so the user can jump straight to the workspace.
8321
+
8322
+ A link alone is not enough. A native upload alone is not enough. Do both.
8323
+
8324
+ The one exception is GitHub, which has no public image upload API \u2014 there, the dashboard link is the only option (see below).
8032
8325
 
8033
- ### On external platforms (Slack, Linear, GitHub, etc.)
8326
+ ### Slack \u2014 embed natively via the 3-step external file upload flow
8034
8327
 
8035
- Do **both** of these \u2014 neither alone is sufficient:
8328
+ A Slack message that just contains a \`tryreplicas.com\` link is not acceptable when the message is supposed to show an image. The recipient should see the image inline in the thread.
8036
8329
 
8037
- 1. Upload the raw bytes via that platform's own upload API (Slack \`files.upload\`, Linear attachments, Imgur for GitHub PR/issue images, etc.) so the recipient actually sees the media.
8038
- 2. Include a \`[View in Replicas](<deep-link>)\` hyperlink \u2014 use the per-file deep link the CLI printed for that file (\`...?mode=media&media=<media-id>\`), so the recipient lands directly on that specific item.
8330
+ Slack deprecated the single-shot \`files.upload\` endpoint. The raw HTTP replacement is a 3-step flow: reserve an upload URL with \`files.getUploadURLExternal\`, POST the bytes to it, then share into the channel/thread with \`files.completeUploadExternal\`. (\`files.uploadV2\` is **only** an SDK convenience wrapper \u2014 it is NOT a real Web API HTTP endpoint and \`POST https://slack.com/api/files.uploadV2\` will return \`unknown_method\`.)
8039
8331
 
8040
- Do **not** include the \`![filename](https://api.tryreplicas.com/...)\` markdown embed in external messages. It will render as a broken image / 401 for the recipient.
8332
+ \`\`\`bash
8333
+ FILE=/abs/path/to/screenshot.png
8334
+ FILENAME=$(basename "$FILE")
8335
+ LENGTH=$(stat -c%s "$FILE" 2>/dev/null || stat -f%z "$FILE")
8336
+
8337
+ # 1. Reserve an upload URL + file ID.
8338
+ RESERVE=$(curl -s -G "https://slack.com/api/files.getUploadURLExternal" \\
8339
+ -H "Authorization: Bearer $SLACK_BOT_TOKEN" \\
8340
+ --data-urlencode "filename=$FILENAME" \\
8341
+ --data-urlencode "length=$LENGTH")
8342
+ UPLOAD_URL=$(echo "$RESERVE" | jq -r '.upload_url')
8343
+ FILE_ID=$(echo "$RESERVE" | jq -r '.file_id')
8344
+
8345
+ # 2. POST the raw bytes to the reserved URL.
8346
+ # Do not use -F / multipart here \u2014 the presigned URL expects the bytes
8347
+ # directly in the request body.
8348
+ curl -s -X POST "$UPLOAD_URL" \\
8349
+ -H "Content-Type: application/octet-stream" \\
8350
+ --data-binary @"$FILE"
8351
+
8352
+ # 3. Complete the upload, sharing it into the channel/thread with the dashboard link.
8353
+ curl -s -X POST "https://slack.com/api/files.completeUploadExternal" \\
8354
+ -H "Authorization: Bearer $SLACK_BOT_TOKEN" \\
8355
+ -H "Content-Type: application/json; charset=utf-8" \\
8356
+ -d "{
8357
+ \\"files\\": [{\\"id\\": \\"$FILE_ID\\", \\"title\\": \\"Screenshot\\"}],
8358
+ \\"channel_id\\": \\"CHANNEL_ID\\",
8359
+ \\"thread_ts\\": \\"THREAD_TS\\",
8360
+ \\"initial_comment\\": \\"<https://tryreplicas.com/workspaces/<workspace-id>?mode=media&media=<media-id>|View in Replicas>\\"
8361
+ }"
8362
+ \`\`\`
8363
+
8364
+ Notes:
8365
+ - All three steps are required; do not try to POST to \`https://slack.com/api/files.uploadV2\` \u2014 that endpoint does not exist on the Web API.
8366
+ - \`initial_comment\` uses Slack mrkdwn (\`<url|label>\`), not GitHub-flavored markdown.
8367
+ - Omit \`thread_ts\` only when you genuinely want a top-level channel post.
8368
+ - For multiple files in the same message, run steps 1\u20132 per file and pass all \`{id, title}\` objects in the \`files\` array of a single \`files.completeUploadExternal\` call \u2014 they share into the thread together.
8369
+ - If you also need to post a separate text reply in the thread, send it with \`chat.postMessage\` after the upload \u2014 but the upload itself must carry the image.
8370
+
8371
+ Never paste the \`api.tryreplicas.com/v1/media/<id>\` URL into a Slack message body or \`initial_comment\` \u2014 it will render as a broken image attempt.
8372
+
8373
+ ### Linear \u2014 embed natively via the GraphQL \`fileUpload\` mutation
8374
+
8375
+ Linear comments and issue bodies support markdown image embeds, but the image URL must be publicly accessible \u2014 so you upload the file to Linear's storage first, then reference the returned \`assetUrl\` in markdown. Three steps:
8376
+
8377
+ Use \`jq\` to build the JSON bodies \u2014 the GraphQL variables (\`size\`, \`filename\`, the comment body) need to be real JSON values, not unquoted placeholders, and \`jq -n --argjson / --arg\` is the safest way to interpolate shell values without quoting bugs.
8378
+
8379
+ \`\`\`bash
8380
+ FILE=/abs/path/to/screenshot.png
8381
+ FILENAME=$(basename "$FILE")
8382
+ SIZE=$(stat -c%s "$FILE" 2>/dev/null || stat -f%z "$FILE")
8383
+ CONTENT_TYPE=image/png
8384
+ ISSUE_UUID=... # the Linear issue's UUID
8385
+ WORKSPACE_ID=... # the Replicas workspace ID
8386
+ MEDIA_ID=... # the media ID printed by \`replicas media upload\`
8387
+
8388
+ # 1. Ask Linear for an upload URL + assetUrl.
8389
+ RESERVE=$(curl -s -X POST https://api.linear.app/graphql \\
8390
+ -H "Authorization: Bearer $LINEAR_ACCESS_TOKEN" \\
8391
+ -H "Content-Type: application/json" \\
8392
+ -d "$(jq -n \\
8393
+ --argjson size "$SIZE" \\
8394
+ --arg contentType "$CONTENT_TYPE" \\
8395
+ --arg filename "$FILENAME" \\
8396
+ '{
8397
+ query: "mutation($size: Int!, $contentType: String!, $filename: String!) { fileUpload(size: $size, contentType: $contentType, filename: $filename) { uploadFile { uploadUrl assetUrl headers { key value } } } }",
8398
+ variables: { size: $size, contentType: $contentType, filename: $filename }
8399
+ }')")
8400
+ UPLOAD_URL=$(echo "$RESERVE" | jq -r '.data.fileUpload.uploadFile.uploadUrl')
8401
+ ASSET_URL=$(echo "$RESERVE" | jq -r '.data.fileUpload.uploadFile.assetUrl')
8402
+
8403
+ # 2. PUT the bytes to uploadUrl, replaying every header Linear returned.
8404
+ # Linear's presigned URL requires the exact Content-Type / Cache-Control /
8405
+ # etc. it gave you back, so forward each {key, value} from the headers array.
8406
+ HEADER_ARGS=()
8407
+ while IFS=$'\\t' read -r k v; do
8408
+ HEADER_ARGS+=(-H "$k: $v")
8409
+ done < <(echo "$RESERVE" | jq -r '.data.fileUpload.uploadFile.headers[] | "\\(.key)\\t\\(.value)"')
8410
+
8411
+ curl -s -X PUT "$UPLOAD_URL" \\
8412
+ "\${HEADER_ARGS[@]}" \\
8413
+ --data-binary @"$FILE"
8414
+
8415
+ # 3. Reference assetUrl inline in the comment body, alongside the dashboard link.
8416
+ BODY=$(printf '![screenshot](%s)\\n\\n[View in Replicas](https://tryreplicas.com/workspaces/%s?mode=media&media=%s)' \\
8417
+ "$ASSET_URL" "$WORKSPACE_ID" "$MEDIA_ID")
8418
+
8419
+ curl -s -X POST https://api.linear.app/graphql \\
8420
+ -H "Authorization: Bearer $LINEAR_ACCESS_TOKEN" \\
8421
+ -H "Content-Type: application/json" \\
8422
+ -d "$(jq -n \\
8423
+ --arg issueId "$ISSUE_UUID" \\
8424
+ --arg body "$BODY" \\
8425
+ '{
8426
+ query: "mutation($issueId: String!, $body: String!) { commentCreate(input: { issueId: $issueId, body: $body }) { success } }",
8427
+ variables: { issueId: $issueId, body: $body }
8428
+ }')"
8429
+ \`\`\`
8430
+
8431
+ The same flow works for issue bodies (use \`issueCreate\` / \`issueUpdate\` with the same markdown body).
8432
+
8433
+ Never paste the \`api.tryreplicas.com/v1/media/<id>\` URL into a Linear body or comment \u2014 it will render as a broken image to anyone outside your Replicas chat.
8434
+
8435
+ ### GitHub \u2014 link the dashboard deep link (no public upload API exists)
8436
+
8437
+ GitHub has **no public API** for uploading images to PRs or issues. Their web UI uses an undocumented internal endpoint that's not available to API clients. So for GitHub specifically, the only correct way to share media is the dashboard deep link, rendered as a markdown hyperlink:
8438
+
8439
+ \`\`\`markdown
8440
+ [View in Replicas](https://tryreplicas.com/workspaces/<workspace-id>?mode=media&media=<media-id>)
8441
+ \`\`\`
8442
+
8443
+ Do **not**:
8444
+ - Commit screenshots as files to the repo as a workaround.
8445
+ - Use placeholder image URLs.
8446
+ - Embed the \`api.tryreplicas.com/v1/media/<id>\` URL in markdown \u2014 it renders as a broken image for every viewer.
8447
+
8448
+ This applies to PR descriptions, PR review comments, issue bodies, issue comments, and commit messages.
8041
8449
 
8042
8450
  ## Recording defaults
8043
8451
 
@@ -8081,13 +8489,13 @@ replicas media upload chart-a.svg chart-b.svg --kind image
8081
8489
  var MEDIA_ABILITY = {
8082
8490
  label: "Media",
8083
8491
  description: "Share screenshots, recordings, generated images, and audio clips.",
8084
- bullet: "- Sharing media (screenshots, screen recordings, generated diagrams, audio clips) \u2014 including in your Replicas chat reply and to external platforms",
8085
- section: SECTION5,
8086
- referenceFile: { name: "MEDIA.md", content: REFERENCE5 }
8492
+ bullet: "- Producing or showing the user any media \u2014 screenshots, screen recordings, generated images or diagrams, audio clips \u2014 including in your Replicas chat reply, PR descriptions/comments, and other external platforms",
8493
+ section: SECTION7,
8494
+ referenceFile: { name: "MEDIA.md", content: REFERENCE7 }
8087
8495
  };
8088
8496
 
8089
8497
  // ../shared/src/default-skills/replicas-agent/abilities/previews.ts
8090
- var SECTION6 = `### Previews
8498
+ var SECTION8 = `### Previews
8091
8499
  Expose locally running services (web apps, APIs, databases) as public preview URLs so humans can interact with them directly.
8092
8500
 
8093
8501
  **Reference:** \`references/PREVIEWS.md\`
@@ -8096,7 +8504,7 @@ Use this when:
8096
8504
  - You need to start a service that a human should view or interact with
8097
8505
  - The task involves UI work that benefits from human review
8098
8506
  - You are verifying frontend/backend integrations visually`;
8099
- var REFERENCE6 = `# Preview URLs
8507
+ var REFERENCE8 = `# Preview URLs
8100
8508
 
8101
8509
  When you run services on ports \u2014 such as a web app, API server, or database \u2014 humans may want to interact with them directly. You can expose your locally running services as public preview URLs.
8102
8510
 
@@ -8178,12 +8586,12 @@ var PREVIEWS_ABILITY = {
8178
8586
  label: "Previews",
8179
8587
  description: "Expose locally running services on public preview URLs for humans.",
8180
8588
  bullet: "- Creating preview URLs for locally running services",
8181
- section: SECTION6,
8182
- referenceFile: { name: "PREVIEWS.md", content: REFERENCE6 }
8589
+ section: SECTION8,
8590
+ referenceFile: { name: "PREVIEWS.md", content: REFERENCE8 }
8183
8591
  };
8184
8592
 
8185
8593
  // ../shared/src/default-skills/replicas-agent/abilities/replicas.ts
8186
- var SECTION7 = `### Replicas (in-workspace CLI)
8594
+ var SECTION9 = `### Replicas (in-workspace CLI)
8187
8595
  Take action *with* Replicas itself \u2014 manage automations, environments (variables, files), repos, and \`replicas.json\` config \u2014 using the pre-installed, pre-authenticated \`replicas\` CLI.
8188
8596
 
8189
8597
  **Reference:** \`references/REPLICAS.md\`
@@ -8193,7 +8601,7 @@ Use this when:
8193
8601
  - The user asks you to manage environments, environment variables, or environment files
8194
8602
  - The user asks "what envs / repos / automations do I have?"
8195
8603
  - The user asks you to scaffold a \`replicas.json\` / \`replicas.yaml\` in a repo`;
8196
- var REFERENCE7 = `# Replicas (in-workspace CLI)
8604
+ var REFERENCE9 = `# Replicas (in-workspace CLI)
8197
8605
 
8198
8606
  This guide covers how to take action *with* Replicas itself from inside a Replicas workspace \u2014 managing automations, environments (and their variables/files), repos, previews, and the user's \`replicas.json\` config \u2014 using the pre-installed \`replicas\` CLI.
8199
8607
 
@@ -8387,13 +8795,13 @@ var REPLICAS_ABILITY = {
8387
8795
  description: "Teach the agent about Replicas itself \u2014 automations, environments, the in-workspace CLI.",
8388
8796
  // No bullet — help_instructions covers the `replicas` CLI surface in detail.
8389
8797
  bullet: "",
8390
- section: SECTION7,
8391
- referenceFile: { name: "REPLICAS.md", content: REFERENCE7 },
8798
+ section: SECTION9,
8799
+ referenceFile: { name: "REPLICAS.md", content: REFERENCE9 },
8392
8800
  locked: true
8393
8801
  };
8394
8802
 
8395
8803
  // ../shared/src/default-skills/replicas-agent/abilities/slack.ts
8396
- var SECTION8 = `### Slack
8804
+ var SECTION10 = `### Slack
8397
8805
  Send messages, read threads, search conversations, and upload files via the Slack Web API.
8398
8806
 
8399
8807
  **Reference:** \`references/SLACK.md\`
@@ -8403,7 +8811,7 @@ Use this when:
8403
8811
  - You need to read or fetch a Slack conversation
8404
8812
  - You encounter a Slack message link and need to retrieve its content
8405
8813
  - The task asks you to notify, update, or communicate via Slack`;
8406
- var REFERENCE8 = `# Slack Integration
8814
+ var REFERENCE10 = `# Slack Integration
8407
8815
 
8408
8816
  This guide covers how to interact with Slack from within your Replicas workspace.
8409
8817
 
@@ -8458,14 +8866,42 @@ curl -s "https://slack.com/api/search.messages?query=YOUR_SEARCH_QUERY" \\
8458
8866
 
8459
8867
  ### Uploading Files
8460
8868
 
8869
+ Slack deprecated \`files.upload\`; the raw HTTP replacement is a 3-step flow. (\`files.uploadV2\` is **only** an SDK convenience wrapper and is NOT a real Web API HTTP endpoint \u2014 \`POST https://slack.com/api/files.uploadV2\` returns \`unknown_method\`.)
8870
+
8461
8871
  \`\`\`bash
8462
- curl -s -X POST "https://slack.com/api/files.uploadV2" \\
8872
+ FILE=/path/to/file
8873
+ FILENAME=$(basename "$FILE")
8874
+ LENGTH=$(stat -c%s "$FILE" 2>/dev/null || stat -f%z "$FILE")
8875
+
8876
+ # 1. Reserve an upload URL + file ID.
8877
+ RESERVE=$(curl -s -G "https://slack.com/api/files.getUploadURLExternal" \\
8878
+ -H "Authorization: Bearer $SLACK_BOT_TOKEN" \\
8879
+ --data-urlencode "filename=$FILENAME" \\
8880
+ --data-urlencode "length=$LENGTH")
8881
+ UPLOAD_URL=$(echo "$RESERVE" | jq -r '.upload_url')
8882
+ FILE_ID=$(echo "$RESERVE" | jq -r '.file_id')
8883
+
8884
+ # 2. POST the raw bytes to the reserved URL.
8885
+ # Do not use -F / multipart here \u2014 the presigned URL expects the bytes
8886
+ # directly in the request body.
8887
+ curl -s -X POST "$UPLOAD_URL" \\
8888
+ -H "Content-Type: application/octet-stream" \\
8889
+ --data-binary @"$FILE"
8890
+
8891
+ # 3. Complete the upload and share into a channel (and optionally a thread).
8892
+ curl -s -X POST "https://slack.com/api/files.completeUploadExternal" \\
8463
8893
  -H "Authorization: Bearer $SLACK_BOT_TOKEN" \\
8464
- -F "channel_id=CHANNEL_ID" \\
8465
- -F "file=@/path/to/file" \\
8466
- -F "title=File title"
8894
+ -H "Content-Type: application/json; charset=utf-8" \\
8895
+ -d "{
8896
+ \\"files\\": [{\\"id\\": \\"$FILE_ID\\", \\"title\\": \\"File title\\"}],
8897
+ \\"channel_id\\": \\"CHANNEL_ID\\",
8898
+ \\"thread_ts\\": \\"OPTIONAL_THREAD_TS\\",
8899
+ \\"initial_comment\\": \\"Optional message body\\"
8900
+ }"
8467
8901
  \`\`\`
8468
8902
 
8903
+ Omit \`thread_ts\` and/or \`initial_comment\` if you don't need them.
8904
+
8469
8905
  ### Other Operations
8470
8906
 
8471
8907
  You can list channels, read channel history, add reactions, and perform any other operation supported by the Slack Web API using the same authentication pattern.
@@ -8476,15 +8912,17 @@ var SLACK_ABILITY = {
8476
8912
  label: "Slack",
8477
8913
  description: "Send messages, read threads, search conversations, upload files.",
8478
8914
  bullet: "- Interacting with Slack (sending messages, reading threads, etc.)",
8479
- section: SECTION8,
8480
- referenceFile: { name: "SLACK.md", content: REFERENCE8 }
8915
+ section: SECTION10,
8916
+ referenceFile: { name: "SLACK.md", content: REFERENCE10 }
8481
8917
  };
8482
8918
 
8483
8919
  // ../shared/src/default-skills/replicas-agent/registry.ts
8484
8920
  var REPLICAS_AGENT_ABILITY_REGISTRY = {
8485
8921
  replicas: REPLICAS_ABILITY,
8922
+ computer: COMPUTER_ABILITY,
8486
8923
  docker: DOCKER_ABILITY,
8487
8924
  github: GITHUB_ABILITY,
8925
+ gitlab: GITLAB_ABILITY,
8488
8926
  google: GOOGLE_ABILITY,
8489
8927
  linear: LINEAR_ABILITY,
8490
8928
  media: MEDIA_ABILITY,
@@ -8510,36 +8948,40 @@ var DEFAULT_DEFAULT_SKILLS = {
8510
8948
  var import_yaml = __toESM(require_dist());
8511
8949
 
8512
8950
  // ../shared/src/warm-hooks.ts
8513
- var DEFAULT_WARM_HOOK_TIMEOUT_MS = 5 * 60 * 1e3;
8514
- var MAX_WARM_HOOK_TIMEOUT_MS = 15 * 60 * 1e3;
8951
+ var DEFAULT_WARM_HOOK_TIMEOUT_MS = 60 * 60 * 1e3;
8952
+ var MAX_WARM_HOOK_TIMEOUT_MS = 120 * 60 * 1e3;
8953
+ var DEFAULT_START_HOOK_TIMEOUT_MS = 5 * 60 * 1e3;
8515
8954
  var HOOK_EXEC_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
8516
8955
 
8517
8956
  // ../shared/src/engine/types.ts
8518
8957
  var CLAUDE_OPUS_1M_MODEL = "opus[1m]";
8519
8958
  var LEGACY_CLAUDE_OPUS_1M_MODEL = "opus-1m";
8959
+ var DEFAULT_CODEX_MODEL = "gpt-5.5";
8520
8960
  var MODEL_LABELS = {
8521
8961
  sonnet: "Sonnet 4.5",
8522
- opus: "Opus 4.7",
8523
- [CLAUDE_OPUS_1M_MODEL]: "Opus 4.7 (1M)",
8524
- [LEGACY_CLAUDE_OPUS_1M_MODEL]: "Opus 4.7 (1M)",
8962
+ opus: "Opus 4.8",
8963
+ [CLAUDE_OPUS_1M_MODEL]: "Opus 4.8 (1M)",
8964
+ [LEGACY_CLAUDE_OPUS_1M_MODEL]: "Opus 4.8 (1M)",
8525
8965
  haiku: "Haiku 4.5",
8526
- "gpt-5.5": "GPT-5.5",
8966
+ [DEFAULT_CODEX_MODEL]: "GPT-5.5",
8527
8967
  "gpt-5.4": "GPT-5.4",
8528
8968
  "gpt-5.4-mini": "GPT-5.4 Mini",
8529
8969
  "gpt-5.3-codex": "GPT-5.3 Codex",
8530
- "gpt-5.3-codex-spark": "GPT-5.3 Codex Spark",
8531
- "gpt-5.2-codex": "GPT-5.2 Codex",
8532
- "gpt-5.2": "GPT-5.2",
8533
- "gpt-5.1-codex-max": "GPT-5.1 Codex Max",
8534
- "gpt-5.1-codex": "GPT-5.1 Codex",
8535
- "gpt-5.1": "GPT-5.1",
8536
- "gpt-5-codex": "GPT-5 Codex",
8537
- "gpt-5": "GPT-5"
8970
+ "gpt-5.2": "GPT-5.2"
8538
8971
  };
8972
+ var MAX_CANVAS_FILE_BYTES = 5 * 1024 * 1024;
8539
8973
 
8540
8974
  // ../shared/src/routes/workspaces.ts
8541
8975
  var WORKSPACE_FILE_UPLOAD_MAX_SIZE_BYTES = 20 * 1024 * 1024;
8542
8976
  var WORKSPACE_FILE_CONTENT_MAX_SIZE_BYTES = 1 * 1024 * 1024;
8977
+ var WORKSPACE_STATUS_FILTERS = ["active", "sleeping", "preparing", "failed"];
8978
+ var DEFAULT_STATUS_FILTERS = [...WORKSPACE_STATUS_FILTERS];
8979
+ var DEFAULT_WORKSPACE_FILTERS = {
8980
+ statuses: [...DEFAULT_STATUS_FILTERS],
8981
+ ownerIds: [],
8982
+ activity: "any"
8983
+ };
8984
+ var ONE_DAY_MS = 24 * 60 * 60 * 1e3;
8543
8985
 
8544
8986
  // ../shared/src/audit-log.ts
8545
8987
  var AUDIT_LOG_ACTION = {
@@ -8551,7 +8993,71 @@ var AUDIT_LOG_ACTION = {
8551
8993
  };
8552
8994
  var AUDIT_LOG_ACTIONS = Object.values(AUDIT_LOG_ACTION);
8553
8995
 
8554
- // ../shared/src/display-message/parsers/codex-parser.ts
8996
+ // ../shared/src/automations/types.ts
8997
+ var AUTOMATION_DEBOUNCE_MAX_SECONDS = 24 * 60 * 60;
8998
+
8999
+ // ../shared/src/display-message/types.ts
9000
+ var BACKGROUND_TASK_SUBTYPES = /* @__PURE__ */ new Set([
9001
+ "task_started",
9002
+ "task_progress",
9003
+ "task_updated",
9004
+ "task_notification"
9005
+ ]);
9006
+ function isBackgroundTaskSubtype(subtype) {
9007
+ return typeof subtype === "string" && BACKGROUND_TASK_SUBTYPES.has(subtype);
9008
+ }
9009
+ function optionalString(value) {
9010
+ return typeof value === "string" ? value : void 0;
9011
+ }
9012
+ function coerceBackgroundTaskPayload(payload) {
9013
+ if (!isRecord(payload)) return null;
9014
+ const subtype = payload.subtype;
9015
+ if (!isBackgroundTaskSubtype(subtype)) return null;
9016
+ const taskId = payload.task_id;
9017
+ if (typeof taskId !== "string" || !taskId) return null;
9018
+ const patch = isRecord(payload.patch) ? {
9019
+ status: optionalString(payload.patch.status),
9020
+ description: optionalString(payload.patch.description),
9021
+ error: optionalString(payload.patch.error),
9022
+ isBackgrounded: optionalBoolean(payload.patch.is_backgrounded)
9023
+ } : void 0;
9024
+ const usage = isRecord(payload.usage) ? {
9025
+ totalTokens: optionalNumber(payload.usage.total_tokens),
9026
+ toolUses: optionalNumber(payload.usage.tool_uses),
9027
+ durationMs: optionalNumber(payload.usage.duration_ms)
9028
+ } : void 0;
9029
+ return {
9030
+ subtype,
9031
+ taskId,
9032
+ description: optionalString(payload.description),
9033
+ summary: optionalString(payload.summary),
9034
+ outputFile: optionalString(payload.output_file),
9035
+ status: optionalString(payload.status),
9036
+ taskType: optionalString(payload.task_type),
9037
+ workflowName: optionalString(payload.workflow_name),
9038
+ prompt: optionalString(payload.prompt),
9039
+ lastToolName: optionalString(payload.last_tool_name),
9040
+ usage,
9041
+ patch
9042
+ };
9043
+ }
9044
+ function optionalNumber(value) {
9045
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
9046
+ }
9047
+ function optionalBoolean(value) {
9048
+ return typeof value === "boolean" ? value : void 0;
9049
+ }
9050
+ function normalizeBackgroundTaskStatus(status) {
9051
+ if (status === "completed" || status === "failed" || status === "stopped") {
9052
+ return status;
9053
+ }
9054
+ if (status === "killed") {
9055
+ return "stopped";
9056
+ }
9057
+ return "in_progress";
9058
+ }
9059
+
9060
+ // ../shared/src/json.ts
8555
9061
  function safeJsonParse(str, fallback) {
8556
9062
  try {
8557
9063
  return JSON.parse(str);
@@ -8559,9 +9065,27 @@ function safeJsonParse(str, fallback) {
8559
9065
  return fallback;
8560
9066
  }
8561
9067
  }
9068
+
9069
+ // ../shared/src/display-message/parsers/codex-parser.ts
8562
9070
  function getStatusFromExitCode(exitCode) {
8563
9071
  return exitCode === 0 ? "completed" : "failed";
8564
9072
  }
9073
+ function getPayloadString(event, key) {
9074
+ const value = event.payload?.[key];
9075
+ return typeof value === "string" ? value : null;
9076
+ }
9077
+ function displayId(event, eventIndex, prefix) {
9078
+ const stableId = getPayloadString(event, USER_MESSAGE_ID_PAYLOAD_KEY) ?? getPayloadString(event, CODEX_ASP_ITEM_ID_PAYLOAD_KEY);
9079
+ return stableId ? `${prefix}-${stableId}` : `${prefix}-${event.timestamp}-${eventIndex}`;
9080
+ }
9081
+ function userMessageImages(value) {
9082
+ if (!Array.isArray(value)) return void 0;
9083
+ const images = value.filter((item) => {
9084
+ if (!isRecord(item)) return false;
9085
+ return item.type === "image" && typeof item.mediaType === "string" && typeof item.data === "string";
9086
+ });
9087
+ return images.length > 0 ? images : void 0;
9088
+ }
8565
9089
  function parseShellOutput(raw) {
8566
9090
  const exitCodeMatch = raw.match(/^Exit code: (\d+)/m) || raw.match(/Process exited with code (\d+)/);
8567
9091
  const exitCode = exitCodeMatch ? parseInt(exitCodeMatch[1], 10) : 0;
@@ -8625,6 +9149,7 @@ function parsePatch(input) {
8625
9149
  function parseCodexEvents(events) {
8626
9150
  const messages = [];
8627
9151
  const pendingCommands = /* @__PURE__ */ new Map();
9152
+ const pendingToolCalls = /* @__PURE__ */ new Map();
8628
9153
  const pendingPatches = /* @__PURE__ */ new Map();
8629
9154
  events.forEach((event, eventIndex) => {
8630
9155
  if (event.type === CODEX_QUOTA_STATUS_EVENT_TYPE) {
@@ -8644,16 +9169,18 @@ function parseCodexEvents(events) {
8644
9169
  return;
8645
9170
  }
8646
9171
  if (event.type === "event_msg" && event.payload?.type === "user_message") {
9172
+ const message = getPayloadString(event, "message");
8647
9173
  messages.push({
8648
- id: `user-${event.timestamp}-${eventIndex}`,
9174
+ id: displayId(event, eventIndex, "user"),
8649
9175
  type: "user",
8650
- content: event.payload.message || "",
9176
+ content: message ?? "",
9177
+ images: userMessageImages(event.payload.images),
8651
9178
  timestamp: event.timestamp
8652
9179
  });
8653
9180
  }
8654
9181
  if (event.type === "event_msg" && event.payload?.type === "agent_reasoning") {
8655
9182
  messages.push({
8656
- id: `reasoning-${event.timestamp}-${eventIndex}-${messages.length}`,
9183
+ id: displayId(event, eventIndex, "reasoning"),
8657
9184
  type: "reasoning",
8658
9185
  content: event.payload.text || "",
8659
9186
  status: "completed",
@@ -8667,7 +9194,7 @@ function parseCodexEvents(events) {
8667
9194
  const textContent = content.filter((c) => c.type === "output_text").map((c) => c.text || "").join("\n");
8668
9195
  if (textContent) {
8669
9196
  messages.push({
8670
- id: `agent-${event.timestamp}-${eventIndex}`,
9197
+ id: displayId(event, eventIndex, "agent"),
8671
9198
  type: "agent",
8672
9199
  content: textContent,
8673
9200
  timestamp: event.timestamp
@@ -8707,19 +9234,25 @@ function parseCodexEvents(events) {
8707
9234
  const callId = event.payload.call_id;
8708
9235
  const name = event.payload.name;
8709
9236
  const input = event.payload.input || "";
9237
+ const server2 = typeof event.payload.server === "string" ? event.payload.server : "custom";
8710
9238
  const status = event.payload.status || "in_progress";
8711
9239
  if (name === "apply_patch") {
8712
9240
  const operations = parsePatch(input);
8713
9241
  pendingPatches.set(callId, { input, status, timestamp: event.timestamp, operations });
8714
9242
  } else {
8715
- messages.push({
8716
- id: `toolcall-${event.timestamp}-${eventIndex}`,
9243
+ const msg = {
9244
+ id: `toolcall-${callId || getPayloadString(event, CODEX_ASP_ITEM_ID_PAYLOAD_KEY) || `${event.timestamp}-${eventIndex}`}`,
8717
9245
  type: "tool_call",
8718
- server: "custom",
9246
+ server: server2,
8719
9247
  tool: name,
9248
+ input,
8720
9249
  status,
8721
9250
  timestamp: event.timestamp
8722
- });
9251
+ };
9252
+ messages.push(msg);
9253
+ if (callId) {
9254
+ pendingToolCalls.set(callId, msg);
9255
+ }
8723
9256
  }
8724
9257
  }
8725
9258
  if (payloadType === "custom_tool_call_output") {
@@ -8741,9 +9274,14 @@ function parseCodexEvents(events) {
8741
9274
  });
8742
9275
  pendingPatches.delete(callId);
8743
9276
  } else {
8744
- const toolCallMsg = messages.findLast((m) => m.type === "tool_call");
9277
+ const fallbackToolCallMsg = messages.findLast((m) => m.type === "tool_call");
9278
+ const toolCallMsg = pendingToolCalls.get(callId) ?? fallbackToolCallMsg;
8745
9279
  if (toolCallMsg) {
8746
9280
  toolCallMsg.status = getStatusFromExitCode(output.metadata?.exit_code);
9281
+ toolCallMsg.output = output.output ?? (typeof event.payload.output === "string" ? event.payload.output : "");
9282
+ if (callId) {
9283
+ pendingToolCalls.delete(callId);
9284
+ }
8747
9285
  }
8748
9286
  }
8749
9287
  }
@@ -8771,40 +9309,210 @@ function parseCodexEvents(events) {
8771
9309
  return messages;
8772
9310
  }
8773
9311
 
8774
- // ../shared/src/display-message/parsers/claude-parser.ts
8775
- function safeJsonParse2(str, fallback) {
9312
+ // ../shared/src/display-message/task-accumulator.ts
9313
+ function mapTaskStatus(status) {
9314
+ if (status === "in_progress" || status === "completed") return status;
9315
+ return "pending";
9316
+ }
9317
+ function toAccumulatorInput(input) {
9318
+ if (typeof input === "string") {
9319
+ try {
9320
+ const parsed = JSON.parse(input);
9321
+ return isRecord(parsed) ? parsed : {};
9322
+ } catch {
9323
+ return {};
9324
+ }
9325
+ }
9326
+ return isRecord(input) ? input : {};
9327
+ }
9328
+ function extractToolResultText(content, separator = "\n") {
9329
+ if (typeof content === "string") return content;
9330
+ if (!Array.isArray(content)) return "";
9331
+ const texts = [];
9332
+ for (const part of content) {
9333
+ if (isRecord(part) && part.type === "text" && typeof part.text === "string") {
9334
+ texts.push(part.text);
9335
+ }
9336
+ }
9337
+ return texts.join(separator);
9338
+ }
9339
+ function normalizeContentBlocks(content) {
9340
+ if (typeof content === "string") {
9341
+ return content ? [{ type: "text", text: content }] : [];
9342
+ }
9343
+ return content ?? [];
9344
+ }
9345
+ function parseStringField(value) {
9346
+ if (typeof value !== "string") return null;
9347
+ const trimmed = value.trim();
9348
+ return trimmed ? trimmed : null;
9349
+ }
9350
+ function parseCreateResultTaskId(resultText) {
8776
9351
  try {
8777
- return JSON.parse(str);
9352
+ const parsed = JSON.parse(resultText);
9353
+ if (isRecord(parsed) && isRecord(parsed.task)) {
9354
+ return parseStringField(parsed.task.id);
9355
+ }
8778
9356
  } catch {
8779
- return fallback;
8780
9357
  }
9358
+ return resultText.match(/\bTask\s+#?([A-Za-z0-9_-]+)\s+created\b/i)?.[1] ?? null;
8781
9359
  }
8782
- function extractToolResultContent(content) {
8783
- if (!content) return "";
8784
- if (typeof content === "string") return content;
8785
- if (Array.isArray(content)) {
8786
- return content.filter((item) => item.type === "text").map((item) => item.text || "").join("\n");
9360
+ var TaskAccumulator = class {
9361
+ tasksByTaskId = /* @__PURE__ */ new Map();
9362
+ tasksByCreateToolUseId = /* @__PURE__ */ new Map();
9363
+ orderedKeys = [];
9364
+ processToolUse(toolName, toolUseId, input) {
9365
+ if (toolName === "TaskCreate") {
9366
+ const subject = parseStringField(input.subject);
9367
+ if (!subject) return false;
9368
+ this.tasksByCreateToolUseId.set(toolUseId, { subject, status: "pending" });
9369
+ this.orderedKeys.push(toolUseId);
9370
+ return true;
9371
+ }
9372
+ if (toolName === "TaskUpdate") {
9373
+ const taskId = parseStringField(input.taskId);
9374
+ if (!taskId) return false;
9375
+ if (input.status === "deleted") {
9376
+ if (!this.tasksByTaskId.delete(taskId)) return false;
9377
+ const idx = this.orderedKeys.indexOf(taskId);
9378
+ if (idx !== -1) this.orderedKeys.splice(idx, 1);
9379
+ return true;
9380
+ }
9381
+ const existing = this.tasksByTaskId.get(taskId);
9382
+ const subject = parseStringField(input.subject) ?? existing?.subject;
9383
+ if (!subject) return false;
9384
+ const status = input.status !== void 0 ? mapTaskStatus(input.status) : existing?.status ?? "pending";
9385
+ this.tasksByTaskId.set(taskId, { subject, status });
9386
+ if (!existing) this.orderedKeys.push(taskId);
9387
+ return true;
9388
+ }
9389
+ if (toolName === "TaskList") {
9390
+ if (!Array.isArray(input.tasks)) return false;
9391
+ let changed = false;
9392
+ for (const raw of input.tasks) {
9393
+ if (!isRecord(raw)) continue;
9394
+ const id = parseStringField(raw.id);
9395
+ const subject = parseStringField(raw.subject);
9396
+ if (!id || !subject) continue;
9397
+ const existing = this.tasksByTaskId.get(id);
9398
+ const next = { subject, status: mapTaskStatus(raw.status) };
9399
+ if (existing && existing.subject === next.subject && existing.status === next.status) continue;
9400
+ this.tasksByTaskId.set(id, next);
9401
+ if (!existing) this.orderedKeys.push(id);
9402
+ changed = true;
9403
+ }
9404
+ return changed;
9405
+ }
9406
+ return false;
9407
+ }
9408
+ processCreateResult(toolUseId, resultText) {
9409
+ const pending = this.tasksByCreateToolUseId.get(toolUseId);
9410
+ if (!pending) return false;
9411
+ const taskId = parseCreateResultTaskId(resultText);
9412
+ if (!taskId) return false;
9413
+ this.tasksByTaskId.set(taskId, pending);
9414
+ this.tasksByCreateToolUseId.delete(toolUseId);
9415
+ const idx = this.orderedKeys.indexOf(toolUseId);
9416
+ if (idx !== -1) this.orderedKeys.splice(idx, 1, taskId);
9417
+ return true;
9418
+ }
9419
+ getTasks() {
9420
+ const out = [];
9421
+ for (const key of this.orderedKeys) {
9422
+ const task = this.tasksByTaskId.get(key) ?? this.tasksByCreateToolUseId.get(key);
9423
+ if (task && task.subject) out.push(task);
9424
+ }
9425
+ return out;
9426
+ }
9427
+ processContentBlock(block) {
9428
+ if (!isRecord(block)) return false;
9429
+ if (block.type === "tool_use" && typeof block.name === "string" && typeof block.id === "string") {
9430
+ return this.processToolUse(block.name, block.id, toAccumulatorInput(block.input));
9431
+ }
9432
+ if (block.type === "tool_result" && typeof block.tool_use_id === "string") {
9433
+ return this.processCreateResult(block.tool_use_id, extractToolResultText(block.content, ""));
9434
+ }
9435
+ return false;
8787
9436
  }
8788
- return "";
9437
+ };
9438
+
9439
+ // ../shared/src/display-message/parsers/mcp.ts
9440
+ function parseMcpToolName(name) {
9441
+ const prefix = "mcp__";
9442
+ if (!name.startsWith(prefix)) return null;
9443
+ const rest = name.slice(prefix.length);
9444
+ const sep = rest.indexOf("__");
9445
+ if (sep <= 0) return null;
9446
+ const server2 = rest.slice(0, sep);
9447
+ const tool = rest.slice(sep + 2);
9448
+ if (!server2 || !tool) return null;
9449
+ return { server: server2, tool };
8789
9450
  }
9451
+
9452
+ // ../shared/src/display-message/parsers/claude-parser.ts
9453
+ var LOCAL_COMMAND_ECHO_REGEX = /^<(?:command-name|command-message|local-command-stdout|local-command-stderr)>/;
8790
9454
  function parseClaudeEvents(events, parentToolUseId) {
8791
9455
  const messages = [];
8792
9456
  const filterValue = parentToolUseId !== void 0 ? parentToolUseId : null;
8793
- const filteredEvents = events.filter(
8794
- (e) => e.payload.parent_tool_use_id === filterValue
8795
- );
9457
+ const filteredEvents = events.filter((e) => {
9458
+ const eventParentToolUseId = e.payload.parent_tool_use_id ?? null;
9459
+ return eventParentToolUseId === filterValue;
9460
+ });
8796
9461
  const toolCallMap = /* @__PURE__ */ new Map();
9462
+ const taskMessageMap = /* @__PURE__ */ new Map();
9463
+ const partialIndexes = /* @__PURE__ */ new Map();
9464
+ const completedPartialStreamIds = /* @__PURE__ */ new Set();
9465
+ const taskAccumulator = new TaskAccumulator();
9466
+ const taskSnapshot = () => taskAccumulator.getTasks().map((task) => ({
9467
+ text: task.subject,
9468
+ completed: task.status === "completed",
9469
+ itemStatus: task.status
9470
+ }));
8797
9471
  filteredEvents.forEach((event) => {
9472
+ if (event.type === CLAUDE_PARTIAL_MESSAGE_EVENT_TYPE) {
9473
+ const payload = coerceClaudePartialMessagePayload(event.payload);
9474
+ if (!payload) return;
9475
+ const existing = partialIndexes.get(payload.streamId) ?? {};
9476
+ if (payload.thinking) {
9477
+ const reasoningMessage = {
9478
+ id: `reasoning-partial:${payload.streamId}`,
9479
+ type: "reasoning",
9480
+ content: payload.thinking,
9481
+ status: payload.status,
9482
+ timestamp: event.timestamp
9483
+ };
9484
+ if (existing.reasoning !== void 0) messages[existing.reasoning] = reasoningMessage;
9485
+ else existing.reasoning = messages.push(reasoningMessage) - 1;
9486
+ }
9487
+ if (payload.text) {
9488
+ const agentMessage = {
9489
+ id: `agent-partial:${payload.streamId}`,
9490
+ type: "agent",
9491
+ content: payload.text,
9492
+ timestamp: event.timestamp
9493
+ };
9494
+ if (existing.agent !== void 0) messages[existing.agent] = agentMessage;
9495
+ else existing.agent = messages.push(agentMessage) - 1;
9496
+ }
9497
+ partialIndexes.set(payload.streamId, existing);
9498
+ return;
9499
+ }
8798
9500
  if (event.type === "claude-user") {
8799
- const content = event.payload.message?.content || [];
9501
+ const content = normalizeContentBlocks(event.payload.message?.content);
8800
9502
  const toolResult = content.find((c) => c.type === "tool_result");
8801
9503
  if (toolResult && toolResult.tool_use_id) {
9504
+ if (!toolResult.is_error) {
9505
+ taskAccumulator.processContentBlock(toolResult);
9506
+ }
8802
9507
  return;
8803
9508
  }
8804
9509
  if (event.payload.isSynthetic) {
8805
9510
  return;
8806
9511
  }
8807
9512
  const textContent = content.filter((c) => c.type === "text").map((c) => c.text || "").join("\n");
9513
+ if (LOCAL_COMMAND_ECHO_REGEX.test(textContent.trim())) {
9514
+ return;
9515
+ }
8808
9516
  const images = content.filter((c) => c.type === "image" && c.source).map((c) => {
8809
9517
  const source = c.source;
8810
9518
  return {
@@ -8824,7 +9532,11 @@ function parseClaudeEvents(events, parentToolUseId) {
8824
9532
  }
8825
9533
  }
8826
9534
  if (event.type === "claude-assistant") {
8827
- const contentBlocks = event.payload.message?.content || [];
9535
+ const messageId = event.payload.message?.id;
9536
+ if (typeof messageId === "string" && messageId) {
9537
+ completedPartialStreamIds.add(messageId);
9538
+ }
9539
+ const contentBlocks = normalizeContentBlocks(event.payload.message?.content);
8828
9540
  contentBlocks.forEach((block) => {
8829
9541
  if (block.type === "text" && block.text) {
8830
9542
  messages.push({
@@ -8853,7 +9565,7 @@ function parseClaudeEvents(events, parentToolUseId) {
8853
9565
  input: toolInput
8854
9566
  });
8855
9567
  if (toolName === "Task" || toolName === "Agent") {
8856
- const inputObj = typeof toolInput === "string" ? safeJsonParse2(toolInput, {}) : toolInput;
9568
+ const inputObj = typeof toolInput === "string" ? safeJsonParse(toolInput, {}) : toolInput;
8857
9569
  const nestedEvents = events.filter((e) => e.payload.parent_tool_use_id === toolUseId).map((e) => ({
8858
9570
  timestamp: e.timestamp,
8859
9571
  type: e.type,
@@ -8872,7 +9584,7 @@ function parseClaudeEvents(events, parentToolUseId) {
8872
9584
  timestamp: event.timestamp
8873
9585
  });
8874
9586
  } else if (toolName === "Bash" || toolName === "bash" || toolName === "shell") {
8875
- const inputObj = typeof toolInput === "string" ? safeJsonParse2(toolInput, {}) : toolInput;
9587
+ const inputObj = typeof toolInput === "string" ? safeJsonParse(toolInput, {}) : toolInput;
8876
9588
  const command = inputObj.command || "";
8877
9589
  messages.push({
8878
9590
  id: `command-${event.timestamp}-${messages.length}`,
@@ -8883,7 +9595,7 @@ function parseClaudeEvents(events, parentToolUseId) {
8883
9595
  timestamp: event.timestamp
8884
9596
  });
8885
9597
  } else if (toolName === "Write" || toolName === "Edit") {
8886
- const inputObj = typeof toolInput === "string" ? safeJsonParse2(toolInput, {}) : toolInput;
9598
+ const inputObj = typeof toolInput === "string" ? safeJsonParse(toolInput, {}) : toolInput;
8887
9599
  const filePath = inputObj.file_path || "";
8888
9600
  const action = toolName === "Write" ? "add" : "update";
8889
9601
  let diff;
@@ -8919,24 +9631,20 @@ function parseClaudeEvents(events, parentToolUseId) {
8919
9631
  status: "in_progress",
8920
9632
  timestamp: event.timestamp
8921
9633
  });
8922
- } else if (toolName === "TodoWrite") {
8923
- const inputObj = typeof toolInput === "string" ? safeJsonParse2(toolInput, {}) : toolInput;
8924
- const todos = Array.isArray(inputObj.todos) ? inputObj.todos : [];
8925
- const todoItems = todos.map((todo) => ({
8926
- text: todo.content,
8927
- completed: todo.status === "completed"
8928
- }));
8929
- if (todoItems.length > 0) {
9634
+ } else if (toolName === "TaskCreate" || toolName === "TaskUpdate" || toolName === "TaskList") {
9635
+ taskAccumulator.processContentBlock(block);
9636
+ const snapshot = taskSnapshot();
9637
+ if (snapshot.length > 0) {
8930
9638
  messages.push({
8931
9639
  id: `todo-${event.timestamp}-${messages.length}`,
8932
9640
  type: "todo_list",
8933
- items: todoItems,
9641
+ items: snapshot,
8934
9642
  status: "completed",
8935
9643
  timestamp: event.timestamp
8936
9644
  });
8937
9645
  }
8938
9646
  } else if (toolName === "WebSearch") {
8939
- const inputObj = typeof toolInput === "string" ? safeJsonParse2(toolInput, {}) : toolInput;
9647
+ const inputObj = typeof toolInput === "string" ? safeJsonParse(toolInput, {}) : toolInput;
8940
9648
  const query = inputObj.query || "";
8941
9649
  messages.push({
8942
9650
  id: `search-${event.timestamp}-${messages.length}`,
@@ -8946,7 +9654,7 @@ function parseClaudeEvents(events, parentToolUseId) {
8946
9654
  timestamp: event.timestamp
8947
9655
  });
8948
9656
  } else if (toolName === "Skill") {
8949
- const inputObj = typeof toolInput === "string" ? safeJsonParse2(toolInput, {}) : toolInput;
9657
+ const inputObj = typeof toolInput === "string" ? safeJsonParse(toolInput, {}) : toolInput;
8950
9658
  messages.push({
8951
9659
  id: `skill-${event.timestamp}-${messages.length}`,
8952
9660
  type: "skill",
@@ -8956,7 +9664,7 @@ function parseClaudeEvents(events, parentToolUseId) {
8956
9664
  timestamp: event.timestamp
8957
9665
  });
8958
9666
  } else if (toolName === "mcp__relay-subagent-tools__spawn_agent") {
8959
- const inputObj = typeof toolInput === "string" ? safeJsonParse2(toolInput, {}) : toolInput;
9667
+ const inputObj = typeof toolInput === "string" ? safeJsonParse(toolInput, {}) : toolInput;
8960
9668
  messages.push({
8961
9669
  id: `subagent-${event.timestamp}-${messages.length}`,
8962
9670
  type: "subagent",
@@ -8971,12 +9679,13 @@ function parseClaudeEvents(events, parentToolUseId) {
8971
9679
  timestamp: event.timestamp
8972
9680
  });
8973
9681
  } else if (toolName === "mcp__relay-subagent-tools__delete_agent") {
8974
- const inputObj = typeof toolInput === "string" ? safeJsonParse2(toolInput, {}) : toolInput;
9682
+ const inputObj = typeof toolInput === "string" ? safeJsonParse(toolInput, {}) : toolInput;
9683
+ const mcp = parseMcpToolName(toolName);
8975
9684
  messages.push({
8976
9685
  id: `toolcall-${event.timestamp}-${messages.length}`,
8977
9686
  type: "tool_call",
8978
- server: "relay-subagent-tools",
8979
- tool: "delete_agent",
9687
+ server: mcp?.server ?? "relay-subagent-tools",
9688
+ tool: mcp?.tool ?? "delete_agent",
8980
9689
  input: inputObj,
8981
9690
  status: "in_progress",
8982
9691
  timestamp: event.timestamp
@@ -9008,6 +9717,36 @@ function parseClaudeEvents(events, parentToolUseId) {
9008
9717
  });
9009
9718
  }
9010
9719
  }
9720
+ if (event.type === "claude-system") {
9721
+ const payload = coerceBackgroundTaskPayload(event.payload);
9722
+ if (payload) {
9723
+ const existing = taskMessageMap.get(payload.taskId);
9724
+ const nextStatus = payload.subtype === "task_notification" ? normalizeBackgroundTaskStatus(payload.status) : payload.subtype === "task_updated" ? normalizeBackgroundTaskStatus(payload.patch?.status) : existing?.status ?? "in_progress";
9725
+ const nextMessage = {
9726
+ id: existing?.id ?? `task-${event.timestamp}-${messages.length}`,
9727
+ type: "background_task",
9728
+ taskId: payload.taskId,
9729
+ status: nextStatus,
9730
+ description: payload.description ?? payload.patch?.description ?? existing?.description,
9731
+ summary: payload.summary ?? existing?.summary,
9732
+ outputFile: payload.outputFile ?? existing?.outputFile,
9733
+ taskType: payload.taskType ?? existing?.taskType,
9734
+ workflowName: payload.workflowName ?? existing?.workflowName,
9735
+ prompt: payload.prompt ?? existing?.prompt,
9736
+ lastToolName: payload.lastToolName ?? existing?.lastToolName,
9737
+ usage: payload.usage ?? existing?.usage,
9738
+ error: payload.patch?.error ?? existing?.error,
9739
+ isBackgrounded: payload.patch?.isBackgrounded ?? existing?.isBackgrounded,
9740
+ timestamp: existing?.timestamp ?? event.timestamp
9741
+ };
9742
+ if (existing) {
9743
+ Object.assign(existing, nextMessage);
9744
+ } else {
9745
+ taskMessageMap.set(payload.taskId, nextMessage);
9746
+ messages.push(nextMessage);
9747
+ }
9748
+ }
9749
+ }
9011
9750
  });
9012
9751
  filteredEvents.forEach((event) => {
9013
9752
  if (event.type === "replicas-tool-input-request") {
@@ -9042,14 +9781,17 @@ function parseClaudeEvents(events, parentToolUseId) {
9042
9781
  });
9043
9782
  filteredEvents.forEach((event) => {
9044
9783
  if (event.type === "claude-user") {
9045
- const content = event.payload.message?.content || [];
9784
+ const content = normalizeContentBlocks(event.payload.message?.content);
9046
9785
  const toolResult = content.find((c) => c.type === "tool_result");
9047
9786
  if (toolResult && toolResult.tool_use_id) {
9048
9787
  const toolInfo = toolCallMap.get(toolResult.tool_use_id);
9049
9788
  if (!toolInfo) return;
9050
- const resultContent = extractToolResultContent(toolResult.content);
9789
+ const resultContent = extractToolResultText(toolResult.content);
9051
9790
  const isError = toolResult.is_error || false;
9052
9791
  const status = isError ? "failed" : "completed";
9792
+ if (toolInfo.toolName === "TaskCreate" && !isError) {
9793
+ taskAccumulator.processContentBlock(toolResult);
9794
+ }
9053
9795
  const message = messages[toolInfo.messageIndex];
9054
9796
  if (!message) return;
9055
9797
  if (message.type === "command") {
@@ -9074,7 +9816,7 @@ function parseClaudeEvents(events, parentToolUseId) {
9074
9816
  message.output = resultContent;
9075
9817
  message.status = status;
9076
9818
  if (!message.chatId && resultContent) {
9077
- const parsed = safeJsonParse2(resultContent, {});
9819
+ const parsed = safeJsonParse(resultContent, {});
9078
9820
  if (parsed.chatId) {
9079
9821
  message.chatId = parsed.chatId;
9080
9822
  }
@@ -9083,9 +9825,16 @@ function parseClaudeEvents(events, parentToolUseId) {
9083
9825
  }
9084
9826
  }
9085
9827
  });
9086
- return messages;
9828
+ if (partialIndexes.size === 0 || completedPartialStreamIds.size === 0) return messages;
9829
+ return messages.filter((message) => {
9830
+ const prefix = ["reasoning-partial:", "agent-partial:"].find((p) => message.id.startsWith(p));
9831
+ return !prefix || !completedPartialStreamIds.has(message.id.slice(prefix.length));
9832
+ });
9087
9833
  }
9088
9834
 
9835
+ // ../shared/src/display-message/parsers/codex-asp-parser.ts
9836
+ var DUPLICATE_WINDOW_MS = 5 * 60 * 1e3;
9837
+
9089
9838
  // ../shared/src/display-message/parsers/index.ts
9090
9839
  function parseAgentEvents(events, agentType) {
9091
9840
  if (agentType === "codex") {
@@ -9135,7 +9884,7 @@ function result(data, isError = false) {
9135
9884
  }
9136
9885
  var server = new McpServer({
9137
9886
  name: "replicas-mcp",
9138
- version: "0.2.2"
9887
+ version: "0.2.4"
9139
9888
  });
9140
9889
  var registerTool = server.registerTool.bind(server);
9141
9890
  registerTool(
@@ -9177,7 +9926,7 @@ registerTool(
9177
9926
  page: z.number().optional(),
9178
9927
  limit: z.number().optional(),
9179
9928
  user_id: z.string().optional().describe("Filter by creator user ID"),
9180
- source: z.enum(["api", "dashboard", "slack", "linear", "github", "automation"]).optional().describe("Filter by creation source"),
9929
+ source: z.enum(["api", "dashboard", "slack", "linear", "github", "gitlab", "automation"]).optional().describe("Filter by creation source"),
9181
9930
  status: z.enum(["active", "sleeping", "preparing"]).optional().describe("Filter by workspace status")
9182
9931
  }
9183
9932
  },