tarsk 0.5.69 → 0.5.70

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 (61) hide show
  1. package/dist/index.js +276 -165
  2. package/dist/public/assets/{account-view-Chzj6v7a.js → account-view-B3-h2Omm.js} +1 -1
  3. package/dist/public/assets/{alert-dialog-CLYxQdrK.js → alert-dialog-hMK0ERPv.js} +1 -1
  4. package/dist/public/assets/{async-error-boundary-CM6LU7nT.js → async-error-boundary-Ca8lx8YM.js} +1 -1
  5. package/dist/public/assets/{browser-tab--1iEoJGu.js → browser-tab-C6INAmPZ.js} +1 -1
  6. package/dist/public/assets/{chat-dock-context-Gg1jpamu.js → chat-dock-context-CjVDawH_.js} +1 -1
  7. package/dist/public/assets/{commit-dialog-BfdxNX_T.js → commit-dialog-ClrhP7Jd.js} +1 -1
  8. package/dist/public/assets/{commit-error-dialog-DrsDKL-B.js → commit-error-dialog-Clt0BgiE.js} +1 -1
  9. package/dist/public/assets/{commit-method-fields-o-xw2faT.js → commit-method-fields-BwX9cAYJ.js} +1 -1
  10. package/dist/public/assets/{context-menu-BLvLpqq7.js → context-menu-C5sSYyMw.js} +1 -1
  11. package/dist/public/assets/{conversation-history-view-ukfe_7qw.js → conversation-history-view-CcBBgh8V.js} +1 -1
  12. package/dist/public/assets/create-project-dialog-CPz95RZY.js +6 -0
  13. package/dist/public/assets/{create-repo-dialog-CkFACtMf.js → create-repo-dialog-CUm5YAtV.js} +1 -1
  14. package/dist/public/assets/{delete-confirm-dialog-D1zjctrX.js → delete-confirm-dialog-CUm3m7WO.js} +1 -1
  15. package/dist/public/assets/{diff-view-Cxf7v9t1.js → diff-view-BJga_mCE.js} +1 -1
  16. package/dist/public/assets/{explorer-tab-view-LkT0bDcR.js → explorer-tab-view-D9bH6cb1.js} +2 -2
  17. package/dist/public/assets/{explorer-tree-B6EZUVTn.js → explorer-tree-Bciwq7MW.js} +1 -1
  18. package/dist/public/assets/{explorer-view-D5y8Uxoi.js → explorer-view-Ufv--EPU.js} +1 -1
  19. package/dist/public/assets/{git-history-dialog-X6sVwgPT.js → git-history-dialog-NdDkNMAP.js} +1 -1
  20. package/dist/public/assets/{index-CJCQ4bTo.js → index-CsUbYVa9.js} +16 -16
  21. package/dist/public/assets/{mcp-server-card-DPakHrG9.js → mcp-server-card-CzXVgu1Z.js} +1 -1
  22. package/dist/public/assets/{merged-pr-dialog-C3euJvCu.js → merged-pr-dialog-ClxYJI_m.js} +1 -1
  23. package/dist/public/assets/{model-list-controls-2JtkzWsp.js → model-list-controls-KE0f0BLj.js} +1 -1
  24. package/dist/public/assets/{monaco-setup-b-rhUj5t.js → monaco-setup-Bpe6FBYw.js} +1 -1
  25. package/dist/public/assets/{onboarding-KBcwP-kU.js → onboarding-DTF0L4Nt.js} +1 -1
  26. package/dist/public/assets/{project-env-vars-view-D60J_-qQ.js → project-env-vars-view-xuiGkrnJ.js} +1 -1
  27. package/dist/public/assets/{project-model-aliases-view-EClnOgBH.js → project-model-aliases-view-BdbzKmYL.js} +1 -1
  28. package/dist/public/assets/{project-settings-view-Cb0iiyad.js → project-settings-view-CuwlpN98.js} +1 -1
  29. package/dist/public/assets/{project-tools-view-B_WnVICB.js → project-tools-view-kZysTxYq.js} +1 -1
  30. package/dist/public/assets/{providers-list-view-CYy82_hl.js → providers-list-view-BF3ctCjJ.js} +1 -1
  31. package/dist/public/assets/{pull-request-dialog-CitbRcub.js → pull-request-dialog-BC_tPcL-.js} +1 -1
  32. package/dist/public/assets/{pull-with-changes-dialog-CpgHqvKf.js → pull-with-changes-dialog-CaOxy8gu.js} +1 -1
  33. package/dist/public/assets/{push-before-pr-dialog-CrcNZDLb.js → push-before-pr-dialog-GZEUiZUR.js} +1 -1
  34. package/dist/public/assets/{react-vendor-7n7LyU5o.js → react-vendor-CCZMLxmy.js} +1 -1
  35. package/dist/public/assets/{settings-general-view-72s5xgPj.js → settings-general-view-CscBURgS.js} +1 -1
  36. package/dist/public/assets/{settings-instructions-view-DN4-73KP.js → settings-instructions-view-DcmFP_43.js} +1 -1
  37. package/dist/public/assets/{settings-list-CWdsaJKC.js → settings-list-XkmhqNbT.js} +1 -1
  38. package/dist/public/assets/{settings-logs-view-CkkVgGvv.js → settings-logs-view-CcjSlyGf.js} +1 -1
  39. package/dist/public/assets/{settings-mcp-servers-view-B8_vnfl6.js → settings-mcp-servers-view-dtuAjs13.js} +1 -1
  40. package/dist/public/assets/{settings-models-view-xIRY7PvW.js → settings-models-view-BxcooRk0.js} +1 -1
  41. package/dist/public/assets/{settings-rules-view-DIk0ghSW.js → settings-rules-view-C-ykSCar.js} +1 -1
  42. package/dist/public/assets/{settings-skills-view-qWbr0Vl2.js → settings-skills-view-B3mgDInQ.js} +1 -1
  43. package/dist/public/assets/{settings-slack-view-RFLP0USW.js → settings-slack-view-CppRZhMV.js} +1 -1
  44. package/dist/public/assets/{settings-slash-commands-view-zFWoR_R7.js → settings-slash-commands-view-DTjTThgi.js} +1 -1
  45. package/dist/public/assets/{settings-statistics-view-BgrzVn4R.js → settings-statistics-view-B88qkfOC.js} +1 -1
  46. package/dist/public/assets/{settings-storage-view-BS2k7E74.js → settings-storage-view-DR7vf1Zh.js} +1 -1
  47. package/dist/public/assets/{settings-subagents-view-BZr1NkVp.js → settings-subagents-view-B7vHT4_J.js} +1 -1
  48. package/dist/public/assets/{settings-system-prompt-view-mQErde93.js → settings-system-prompt-view-D5fjsQT6.js} +1 -1
  49. package/dist/public/assets/{settings-view-D4-XZz2V.js → settings-view-DOMStvOg.js} +2 -2
  50. package/dist/public/assets/{tasks-view-DgkXglqW.js → tasks-view-KcH0lX_t.js} +2 -2
  51. package/dist/public/assets/{terminal-panel-DCaBWV04.js → terminal-panel-ozKXkKxm.js} +1 -1
  52. package/dist/public/assets/{ui-components-1WsgZqWa.js → ui-components-D63KPVFX.js} +1 -1
  53. package/dist/public/assets/{use-active-dock-panel-instance-B9ao_JH2.js → use-active-dock-panel-instance-CN8Djesu.js} +1 -1
  54. package/dist/public/assets/{use-installed-ai-files-GpG9ZL8U.js → use-installed-ai-files-Bx9lPbQB.js} +1 -1
  55. package/dist/public/assets/{web-D7CwlITA.js → web-BdMnTk6x.js} +1 -1
  56. package/dist/public/assets/{web-BuYdGVW8.js → web-Brg1tgLR.js} +1 -1
  57. package/dist/public/assets/{web-CEfF0992.js → web-DUuz6a51.js} +1 -1
  58. package/dist/public/assets/{web-yeAPC2wm.js → web-DdKg_e2t.js} +1 -1
  59. package/dist/public/index.html +5 -5
  60. package/package.json +1 -1
  61. package/dist/public/assets/create-project-dialog-DrXo61FQ.js +0 -6
package/dist/index.js CHANGED
@@ -89424,7 +89424,7 @@ var require_bignumber = __commonJS({
89424
89424
  return arr.reverse();
89425
89425
  }
89426
89426
  return function(str3, baseIn, baseOut, sign, callerIsToString) {
89427
- var alphabet, d, e2, k2, r2, x4, xc, y, i2 = str3.indexOf("."), dp = DECIMAL_PLACES, rm12 = ROUNDING_MODE;
89427
+ var alphabet, d, e2, k2, r2, x4, xc, y, i2 = str3.indexOf("."), dp = DECIMAL_PLACES, rm13 = ROUNDING_MODE;
89428
89428
  if (i2 >= 0) {
89429
89429
  k2 = POW_PRECISION;
89430
89430
  POW_PRECISION = 0;
@@ -89450,7 +89450,7 @@ var require_bignumber = __commonJS({
89450
89450
  x4.c = xc;
89451
89451
  x4.e = e2;
89452
89452
  x4.s = sign;
89453
- x4 = div(x4, y, dp, rm12, baseOut);
89453
+ x4 = div(x4, y, dp, rm13, baseOut);
89454
89454
  xc = x4.c;
89455
89455
  r2 = x4.r;
89456
89456
  e2 = x4.e;
@@ -89459,7 +89459,7 @@ var require_bignumber = __commonJS({
89459
89459
  i2 = xc[d];
89460
89460
  k2 = baseOut / 2;
89461
89461
  r2 = r2 || d < 0 || xc[d + 1] != null;
89462
- r2 = rm12 < 4 ? (i2 != null || r2) && (rm12 == 0 || rm12 == (x4.s < 0 ? 3 : 2)) : i2 > k2 || i2 == k2 && (rm12 == 4 || r2 || rm12 == 6 && xc[d - 1] & 1 || rm12 == (x4.s < 0 ? 8 : 7));
89462
+ r2 = rm13 < 4 ? (i2 != null || r2) && (rm13 == 0 || rm13 == (x4.s < 0 ? 3 : 2)) : i2 > k2 || i2 == k2 && (rm13 == 4 || r2 || rm13 == 6 && xc[d - 1] & 1 || rm13 == (x4.s < 0 ? 8 : 7));
89463
89463
  if (d < 1 || !xc[0]) {
89464
89464
  str3 = r2 ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);
89465
89465
  } else {
@@ -89517,7 +89517,7 @@ var require_bignumber = __commonJS({
89517
89517
  }
89518
89518
  for (; !a2[0] && a2.length > 1; a2.splice(0, 1)) ;
89519
89519
  }
89520
- return function(x4, y, dp, rm12, base) {
89520
+ return function(x4, y, dp, rm13, base) {
89521
89521
  var cmp, e2, i2, more, n7, prod, prodL, q3, qc, rem, remL, rem0, xi2, xL, yc0, yL, yz, s2 = x4.s == y.s ? 1 : -1, xc = x4.c, yc = y.c;
89522
89522
  if (!xc || !xc[0] || !yc || !yc[0]) {
89523
89523
  return new BigNumber2(
@@ -89614,7 +89614,7 @@ var require_bignumber = __commonJS({
89614
89614
  }
89615
89615
  if (base == BASE) {
89616
89616
  for (i2 = 1, s2 = qc[0]; s2 >= 10; s2 /= 10, i2++) ;
89617
- round(q3, dp + (q3.e = i2 + e2 * LOG_BASE - 1) + 1, rm12, more);
89617
+ round(q3, dp + (q3.e = i2 + e2 * LOG_BASE - 1) + 1, rm13, more);
89618
89618
  } else {
89619
89619
  q3.e = e2;
89620
89620
  q3.r = +more;
@@ -89622,10 +89622,10 @@ var require_bignumber = __commonJS({
89622
89622
  return q3;
89623
89623
  };
89624
89624
  })();
89625
- function format3(n7, i2, rm12, id) {
89625
+ function format3(n7, i2, rm13, id) {
89626
89626
  var c0, e2, ne3, len, str3;
89627
- if (rm12 == null) rm12 = ROUNDING_MODE;
89628
- else intCheck(rm12, 0, 8);
89627
+ if (rm13 == null) rm13 = ROUNDING_MODE;
89628
+ else intCheck(rm13, 0, 8);
89629
89629
  if (!n7.c) return n7.toString();
89630
89630
  c0 = n7.c[0];
89631
89631
  ne3 = n7.e;
@@ -89633,7 +89633,7 @@ var require_bignumber = __commonJS({
89633
89633
  str3 = coeffToString(n7.c);
89634
89634
  str3 = id == 1 || id == 2 && (ne3 <= TO_EXP_NEG || ne3 >= TO_EXP_POS) ? toExponential(str3, ne3) : toFixedPoint(str3, ne3, "0");
89635
89635
  } else {
89636
- n7 = round(new BigNumber2(n7), i2, rm12);
89636
+ n7 = round(new BigNumber2(n7), i2, rm13);
89637
89637
  e2 = n7.e;
89638
89638
  str3 = coeffToString(n7.c);
89639
89639
  len = str3.length;
@@ -89706,7 +89706,7 @@ var require_bignumber = __commonJS({
89706
89706
  x4.c = x4.e = null;
89707
89707
  };
89708
89708
  })();
89709
- function round(x4, sd, rm12, r2) {
89709
+ function round(x4, sd, rm13, r2) {
89710
89710
  var d, i2, j3, k2, n7, ni2, rd, xc = x4.c, pows10 = POWS_TEN;
89711
89711
  if (xc) {
89712
89712
  out: {
@@ -89741,8 +89741,8 @@ var require_bignumber = __commonJS({
89741
89741
  // The expression n % pows10[d - j - 1] returns all digits of n to the right
89742
89742
  // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.
89743
89743
  xc[ni2 + 1] != null || (j3 < 0 ? n7 : n7 % pows10[d - j3 - 1]);
89744
- r2 = rm12 < 4 ? (rd || r2) && (rm12 == 0 || rm12 == (x4.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm12 == 4 || r2 || rm12 == 6 && // Check whether the digit to the left of the rounding digit is odd.
89745
- (i2 > 0 ? j3 > 0 ? n7 / pows10[d - j3] : 0 : xc[ni2 - 1]) % 10 & 1 || rm12 == (x4.s < 0 ? 8 : 7));
89744
+ r2 = rm13 < 4 ? (rd || r2) && (rm13 == 0 || rm13 == (x4.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm13 == 4 || r2 || rm13 == 6 && // Check whether the digit to the left of the rounding digit is odd.
89745
+ (i2 > 0 ? j3 > 0 ? n7 / pows10[d - j3] : 0 : xc[ni2 - 1]) % 10 & 1 || rm13 == (x4.s < 0 ? 8 : 7));
89746
89746
  if (sd < 1 || !xc[0]) {
89747
89747
  xc.length = 0;
89748
89748
  if (r2) {
@@ -89807,13 +89807,13 @@ var require_bignumber = __commonJS({
89807
89807
  P3.comparedTo = function(y, b2) {
89808
89808
  return compare(this, new BigNumber2(y, b2));
89809
89809
  };
89810
- P3.decimalPlaces = P3.dp = function(dp, rm12) {
89810
+ P3.decimalPlaces = P3.dp = function(dp, rm13) {
89811
89811
  var c, n7, v3, x4 = this;
89812
89812
  if (dp != null) {
89813
89813
  intCheck(dp, 0, MAX);
89814
- if (rm12 == null) rm12 = ROUNDING_MODE;
89815
- else intCheck(rm12, 0, 8);
89816
- return round(new BigNumber2(x4), dp + x4.e + 1, rm12);
89814
+ if (rm13 == null) rm13 = ROUNDING_MODE;
89815
+ else intCheck(rm13, 0, 8);
89816
+ return round(new BigNumber2(x4), dp + x4.e + 1, rm13);
89817
89817
  }
89818
89818
  if (!(c = x4.c)) return null;
89819
89819
  n7 = ((v3 = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;
@@ -89896,11 +89896,11 @@ var require_bignumber = __commonJS({
89896
89896
  if (nIsNeg) y = ONE.div(y);
89897
89897
  return m2 ? y.mod(m2) : k2 ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;
89898
89898
  };
89899
- P3.integerValue = function(rm12) {
89899
+ P3.integerValue = function(rm13) {
89900
89900
  var n7 = new BigNumber2(this);
89901
- if (rm12 == null) rm12 = ROUNDING_MODE;
89902
- else intCheck(rm12, 0, 8);
89903
- return round(n7, n7.e + 1, rm12);
89901
+ if (rm13 == null) rm13 = ROUNDING_MODE;
89902
+ else intCheck(rm13, 0, 8);
89903
+ return round(n7, n7.e + 1, rm13);
89904
89904
  };
89905
89905
  P3.isEqualTo = P3.eq = function(y, b2) {
89906
89906
  return compare(this, new BigNumber2(y, b2)) === 0;
@@ -90127,13 +90127,13 @@ var require_bignumber = __commonJS({
90127
90127
  }
90128
90128
  return normalise(y, xc, ye2);
90129
90129
  };
90130
- P3.precision = P3.sd = function(sd, rm12) {
90130
+ P3.precision = P3.sd = function(sd, rm13) {
90131
90131
  var c, n7, v3, x4 = this;
90132
90132
  if (sd != null && sd !== !!sd) {
90133
90133
  intCheck(sd, 1, MAX);
90134
- if (rm12 == null) rm12 = ROUNDING_MODE;
90135
- else intCheck(rm12, 0, 8);
90136
- return round(new BigNumber2(x4), sd, rm12);
90134
+ if (rm13 == null) rm13 = ROUNDING_MODE;
90135
+ else intCheck(rm13, 0, 8);
90136
+ return round(new BigNumber2(x4), sd, rm13);
90137
90137
  }
90138
90138
  if (!(c = x4.c)) return null;
90139
90139
  v3 = c.length - 1;
@@ -90203,36 +90203,36 @@ var require_bignumber = __commonJS({
90203
90203
  }
90204
90204
  return round(r2, r2.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m2);
90205
90205
  };
90206
- P3.toExponential = function(dp, rm12) {
90206
+ P3.toExponential = function(dp, rm13) {
90207
90207
  if (dp != null) {
90208
90208
  intCheck(dp, 0, MAX);
90209
90209
  dp++;
90210
90210
  }
90211
- return format3(this, dp, rm12, 1);
90211
+ return format3(this, dp, rm13, 1);
90212
90212
  };
90213
- P3.toFixed = function(dp, rm12) {
90213
+ P3.toFixed = function(dp, rm13) {
90214
90214
  if (dp != null) {
90215
90215
  intCheck(dp, 0, MAX);
90216
90216
  dp = dp + this.e + 1;
90217
90217
  }
90218
- return format3(this, dp, rm12);
90218
+ return format3(this, dp, rm13);
90219
90219
  };
90220
- P3.toFormat = function(dp, rm12, format4) {
90220
+ P3.toFormat = function(dp, rm13, format4) {
90221
90221
  var str3, x4 = this;
90222
90222
  if (format4 == null) {
90223
- if (dp != null && rm12 && typeof rm12 == "object") {
90224
- format4 = rm12;
90225
- rm12 = null;
90223
+ if (dp != null && rm13 && typeof rm13 == "object") {
90224
+ format4 = rm13;
90225
+ rm13 = null;
90226
90226
  } else if (dp && typeof dp == "object") {
90227
90227
  format4 = dp;
90228
- dp = rm12 = null;
90228
+ dp = rm13 = null;
90229
90229
  } else {
90230
90230
  format4 = FORMAT;
90231
90231
  }
90232
90232
  } else if (typeof format4 != "object") {
90233
90233
  throw Error(bignumberError + "Argument not an object: " + format4);
90234
90234
  }
90235
- str3 = x4.toFixed(dp, rm12);
90235
+ str3 = x4.toFixed(dp, rm13);
90236
90236
  if (x4.c) {
90237
90237
  var i2, arr = str3.split("."), g1 = +format4.groupSize, g2 = +format4.secondaryGroupSize, groupSeparator = format4.groupSeparator || "", intPart = arr[0], fractionPart = arr[1], isNeg = x4.s < 0, intDigits = isNeg ? intPart.slice(1) : intPart, len = intDigits.length;
90238
90238
  if (g2) {
@@ -90300,9 +90300,9 @@ var require_bignumber = __commonJS({
90300
90300
  P3.toNumber = function() {
90301
90301
  return +valueOf(this);
90302
90302
  };
90303
- P3.toPrecision = function(sd, rm12) {
90303
+ P3.toPrecision = function(sd, rm13) {
90304
90304
  if (sd != null) intCheck(sd, 1, MAX);
90305
- return format3(this, sd, rm12, 2);
90305
+ return format3(this, sd, rm13, 2);
90306
90306
  };
90307
90307
  P3.toString = function(b2) {
90308
90308
  var str3, n7 = this, s2 = n7.s, e2 = n7.e;
@@ -250456,6 +250456,9 @@ function streamAsyncGenerator(c, generator, options2) {
250456
250456
  await writer.write(JSON.stringify(event) + "\n");
250457
250457
  } catch {
250458
250458
  clientConnected = false;
250459
+ if (abortOnDisconnect) {
250460
+ options2?.abortController?.abort();
250461
+ }
250459
250462
  }
250460
250463
  }
250461
250464
  } catch (error48) {
@@ -255303,7 +255306,12 @@ async function handleCreateProject(c, projectManager) {
255303
255306
  );
255304
255307
  }
255305
255308
  const method = isValidCommitMethod(commitMethod) ? commitMethod : CommitMethods.PullRequest;
255306
- return streamAsyncGenerator(c, projectManager.createProject(gitUrl, method));
255309
+ const abortController = new AbortController();
255310
+ return streamAsyncGenerator(
255311
+ c,
255312
+ projectManager.createProject(gitUrl, method, { signal: abortController.signal }),
255313
+ { abortController }
255314
+ );
255307
255315
  } catch (error48) {
255308
255316
  return errorResponse(
255309
255317
  c,
@@ -255326,7 +255334,10 @@ var init_projects_create_route = __esm({
255326
255334
 
255327
255335
  // src/features/projects/projects-open-folder.route.ts
255328
255336
  async function handleOpenFolderProject(c, projectManager) {
255329
- const generator = projectManager.createProjectFromFolder();
255337
+ const abortController = new AbortController();
255338
+ const generator = projectManager.createProjectFromFolder({
255339
+ signal: abortController.signal
255340
+ });
255330
255341
  const first2 = await generator.next();
255331
255342
  if (first2.done) {
255332
255343
  return c.body(null, 204);
@@ -255335,7 +255346,7 @@ async function handleOpenFolderProject(c, projectManager) {
255335
255346
  yield first2.value;
255336
255347
  yield* generator;
255337
255348
  }
255338
- return streamAsyncGenerator(c, prependFirst());
255349
+ return streamAsyncGenerator(c, prependFirst(), { abortController });
255339
255350
  }
255340
255351
  var init_projects_open_folder_route = __esm({
255341
255352
  "src/features/projects/projects-open-folder.route.ts"() {
@@ -256265,7 +256276,14 @@ async function handleOpenPathProject(c, projectManager) {
256265
256276
  if (typeof body.path !== "string" || body.path.trim().length === 0) {
256266
256277
  return errorResponse(c, ErrorCodes.INVALID_REQUEST, "path is required", 400);
256267
256278
  }
256268
- return streamAsyncGenerator(c, projectManager.createProjectFromPath(body.path.trim()));
256279
+ const abortController = new AbortController();
256280
+ return streamAsyncGenerator(
256281
+ c,
256282
+ projectManager.createProjectFromPath(body.path.trim(), {
256283
+ signal: abortController.signal
256284
+ }),
256285
+ { abortController }
256286
+ );
256269
256287
  }
256270
256288
  var init_projects_open_path_route = __esm({
256271
256289
  "src/features/projects/projects-open-path.route.ts"() {
@@ -256291,7 +256309,14 @@ async function handleCreateFolderProject(c, projectManager) {
256291
256309
  );
256292
256310
  return c.json(response, statusCode);
256293
256311
  }
256294
- return streamAsyncGenerator(c, projectManager.createProjectFromNewFolder(projectName.trim()));
256312
+ const abortController = new AbortController();
256313
+ return streamAsyncGenerator(
256314
+ c,
256315
+ projectManager.createProjectFromNewFolder(projectName.trim(), {
256316
+ signal: abortController.signal
256317
+ }),
256318
+ { abortController }
256319
+ );
256295
256320
  } catch (error48) {
256296
256321
  const { response, statusCode } = ResponseBuilder.error(
256297
256322
  "REQUEST_PARSE_ERROR",
@@ -256345,9 +256370,13 @@ async function handleCreateProjectFromZip(c, projectManager) {
256345
256370
  }
256346
256371
  const suggestedName = typeof name === "string" && name.trim() ? name.trim() : void 0;
256347
256372
  const overrideId = typeof overrideProjectId === "string" && overrideProjectId.trim() ? overrideProjectId.trim() : void 0;
256373
+ const abortController = new AbortController();
256348
256374
  return streamAsyncGenerator(
256349
256375
  c,
256350
- projectManager.createProjectFromZip(zipBuffer, suggestedName, overrideId)
256376
+ projectManager.createProjectFromZip(zipBuffer, suggestedName, overrideId, {
256377
+ signal: abortController.signal
256378
+ }),
256379
+ { abortController }
256351
256380
  );
256352
256381
  } catch (error48) {
256353
256382
  const { response, statusCode } = ResponseBuilder.error(
@@ -263524,9 +263553,7 @@ var init_projects_creator = __esm({
263524
263553
  }
263525
263554
  async extractZipEntries(zip, folderPath) {
263526
263555
  const entries = zip.getEntries().filter((entry) => !entry.isDirectory);
263527
- const hasSrc = entries.some(
263528
- (entry) => entry.entryName.replace(/\\/g, "/").startsWith("src/")
263529
- );
263556
+ const hasSrc = entries.some((entry) => entry.entryName.replace(/\\/g, "/").startsWith("src/"));
263530
263557
  const ignoredPrefixes = ["plugin.json", "mcp.json", "skills/"];
263531
263558
  for (const entry of entries) {
263532
263559
  const entryName = entry.entryName.replace(/\\/g, "/");
@@ -263548,7 +263575,7 @@ var init_projects_creator = __esm({
263548
263575
  await writeFile11(output2, entry.getData());
263549
263576
  }
263550
263577
  }
263551
- async *createProject(gitUrl, commitMethod = CommitMethods.PullRequest) {
263578
+ async *createProject(gitUrl, commitMethod = CommitMethods.PullRequest, options2) {
263552
263579
  if (!this.gitManager.validateGitUrl(gitUrl)) {
263553
263580
  yield {
263554
263581
  type: "error",
@@ -263584,7 +263611,9 @@ var init_projects_creator = __esm({
263584
263611
  threadId: initialThreadId,
263585
263612
  projectId
263586
263613
  };
263587
- for await (const gitEvent of this.gitManager.cloneRepository(gitUrl, firstThreadPath)) {
263614
+ for await (const gitEvent of this.gitManager.cloneRepository(gitUrl, firstThreadPath, {
263615
+ signal: options2?.signal
263616
+ })) {
263588
263617
  if (gitEvent.type === "error") {
263589
263618
  this.processingStateManager?.clearProcessing(initialThreadId);
263590
263619
  yield {
@@ -263599,6 +263628,12 @@ var init_projects_creator = __esm({
263599
263628
  };
263600
263629
  }
263601
263630
  }
263631
+ if (options2?.signal?.aborted) {
263632
+ this.processingStateManager?.clearProcessing(initialThreadId);
263633
+ await rm5(firstThreadPath, { recursive: true, force: true }).catch(() => {
263634
+ });
263635
+ return;
263636
+ }
263602
263637
  let branchName = "main";
263603
263638
  if (commitMethod === CommitMethods.PullRequest) {
263604
263639
  const baseBranch = this.gitManager.sanitizeBranchName(generateRandomHyphenatedName());
@@ -263642,6 +263677,12 @@ var init_projects_creator = __esm({
263642
263677
  };
263643
263678
  }
263644
263679
  const suggestedSetupScript = await this.detectSetupScript(firstThreadPath);
263680
+ if (options2?.signal?.aborted) {
263681
+ this.processingStateManager?.clearProcessing(initialThreadId);
263682
+ await rm5(firstThreadPath, { recursive: true, force: true }).catch(() => {
263683
+ });
263684
+ return;
263685
+ }
263645
263686
  const allSetupScripts = [];
263646
263687
  await this.findAllPackageJsonFiles(firstThreadPath, firstThreadPath, allSetupScripts);
263647
263688
  const project = {
@@ -263687,7 +263728,10 @@ var init_projects_creator = __esm({
263687
263728
  };
263688
263729
  }
263689
263730
  }
263690
- async *createProjectFromScaffold(projectName, templateId, packageManager) {
263731
+ async *createProjectFromScaffold(projectName, templateId, packageManager, options2) {
263732
+ if (options2?.signal?.aborted) {
263733
+ return;
263734
+ }
263691
263735
  if (!isValidPackageManager(packageManager)) {
263692
263736
  yield {
263693
263737
  type: "error",
@@ -263739,6 +263783,12 @@ var init_projects_creator = __esm({
263739
263783
  return;
263740
263784
  }
263741
263785
  const firstThreadPath = this.generateThreadPath(projectId, initialThreadId);
263786
+ if (options2?.signal?.aborted) {
263787
+ this.processingStateManager?.clearProcessing(initialThreadId);
263788
+ await rm5(firstThreadPath, { recursive: true, force: true }).catch(() => {
263789
+ });
263790
+ return;
263791
+ }
263742
263792
  yield {
263743
263793
  type: "progress",
263744
263794
  message: `Scaffolding project in folder: ${firstThreadPath}`
@@ -263787,7 +263837,10 @@ var init_projects_creator = __esm({
263787
263837
  };
263788
263838
  }
263789
263839
  }
263790
- async *createProjectFromNewFolder(projectName) {
263840
+ async *createProjectFromNewFolder(projectName, options2) {
263841
+ if (options2?.signal?.aborted) {
263842
+ return;
263843
+ }
263791
263844
  const trimmedProjectName = projectName.trim();
263792
263845
  const folderName = this.toFolderName(trimmedProjectName);
263793
263846
  if (!trimmedProjectName || !folderName) {
@@ -263832,6 +263885,14 @@ var init_projects_creator = __esm({
263832
263885
  currentBranch: "main",
263833
263886
  createdAt: /* @__PURE__ */ new Date()
263834
263887
  };
263888
+ if (options2?.signal?.aborted) {
263889
+ this.processingStateManager?.clearProcessing(initialThreadId);
263890
+ try {
263891
+ await rm5(folderPath, { recursive: true, force: true });
263892
+ } catch {
263893
+ }
263894
+ return;
263895
+ }
263835
263896
  await this.persistProject(project);
263836
263897
  projectMetadataSaved = true;
263837
263898
  await this.persistThread(initialThread);
@@ -263878,7 +263939,10 @@ var init_projects_creator = __esm({
263878
263939
  * so URLs remain stable. The zip's manifest name is also unwrapped from the
263879
263940
  * Share dialog's `-source-code` suffix so the project keeps its original name.
263880
263941
  */
263881
- async *createProjectFromZip(zipBuffer, suggestedName, overrideProjectId) {
263942
+ async *createProjectFromZip(zipBuffer, suggestedName, overrideProjectId, options2) {
263943
+ if (options2?.signal?.aborted) {
263944
+ return;
263945
+ }
263882
263946
  let zip;
263883
263947
  try {
263884
263948
  zip = new import_adm_zip3.default(zipBuffer);
@@ -263897,6 +263961,9 @@ var init_projects_creator = __esm({
263897
263961
  }
263898
263962
  let projectId = randomUUID14();
263899
263963
  let projectNameToPersist = projectName;
263964
+ if (options2?.signal?.aborted) {
263965
+ return;
263966
+ }
263900
263967
  if (overrideProjectId) {
263901
263968
  const result = await this.teardownOverriddenProject(overrideProjectId, projectName);
263902
263969
  if (!result.ok) {
@@ -264020,7 +264087,7 @@ var init_projects_creator = __esm({
264020
264087
  }
264021
264088
  return candidate;
264022
264089
  }
264023
- async *createProjectFromFolder() {
264090
+ async *createProjectFromFolder(options2) {
264024
264091
  await loadUtils();
264025
264092
  if (!Utils) {
264026
264093
  yield { type: "error", message: "File dialog not available in server mode" };
@@ -264035,14 +264102,17 @@ var init_projects_creator = __esm({
264035
264102
  if (!folderPath) {
264036
264103
  return;
264037
264104
  }
264038
- yield* this.createProjectFromPath(folderPath);
264105
+ yield* this.createProjectFromPath(folderPath, options2);
264039
264106
  }
264040
264107
  /**
264041
264108
  * Creates or reuses a project for an absolute folder path (no native dialog).
264042
264109
  * Idempotent: if a project already uses this folder, returns that project.
264043
264110
  */
264044
- async *createProjectFromPath(folderPath) {
264111
+ async *createProjectFromPath(folderPath, options2) {
264045
264112
  const normalizedPath = normalizeFolderPath(folderPath);
264113
+ if (options2?.signal?.aborted) {
264114
+ return;
264115
+ }
264046
264116
  try {
264047
264117
  const stats = await stat10(normalizedPath);
264048
264118
  if (!stats.isDirectory()) {
@@ -264119,6 +264189,10 @@ var init_projects_creator = __esm({
264119
264189
  currentBranch: branchName,
264120
264190
  createdAt: /* @__PURE__ */ new Date()
264121
264191
  };
264192
+ if (options2?.signal?.aborted) {
264193
+ this.processingStateManager?.clearProcessing(initialThreadId);
264194
+ return;
264195
+ }
264122
264196
  await this.persistProject(project);
264123
264197
  await this.persistThread(initialThread);
264124
264198
  await this.applySuggestedRunCommand(project, projectId);
@@ -264364,38 +264438,48 @@ var init_projects_manager = __esm({
264364
264438
  * - 1.4 - THE CLI SHALL determine the storage path for each Project folder
264365
264439
  * - 1.5 - WHEN a Project folder is created, THE System SHALL associate it with the provided git URL
264366
264440
  */
264367
- async *createProject(gitUrl, commitMethod = CommitMethods.PullRequest) {
264368
- yield* this.projectCreator.createProject(gitUrl, commitMethod);
264441
+ async *createProject(gitUrl, commitMethod = CommitMethods.PullRequest, options2) {
264442
+ yield* this.projectCreator.createProject(gitUrl, commitMethod, options2);
264369
264443
  }
264370
264444
  /**
264371
264445
  * Creates a new project from a local folder via native OS dialog.
264372
264446
  */
264373
- async *createProjectFromFolder() {
264374
- yield* this.projectCreator.createProjectFromFolder();
264447
+ async *createProjectFromFolder(options2) {
264448
+ yield* this.projectCreator.createProjectFromFolder(options2);
264375
264449
  }
264376
264450
  /**
264377
264451
  * Creates or reuses a project for an absolute folder path.
264378
264452
  */
264379
- async *createProjectFromPath(folderPath) {
264380
- yield* this.projectCreator.createProjectFromPath(folderPath);
264453
+ async *createProjectFromPath(folderPath, options2) {
264454
+ yield* this.projectCreator.createProjectFromPath(folderPath, options2);
264381
264455
  }
264382
264456
  /**
264383
264457
  * Creates a new project by scaffolding a web app, then git init and initial thread.
264384
264458
  */
264385
- async *createProjectFromScaffold(projectName, templateId, packageManager) {
264386
- yield* this.projectCreator.createProjectFromScaffold(projectName, templateId, packageManager);
264459
+ async *createProjectFromScaffold(projectName, templateId, packageManager, options2) {
264460
+ yield* this.projectCreator.createProjectFromScaffold(
264461
+ projectName,
264462
+ templateId,
264463
+ packageManager,
264464
+ options2
264465
+ );
264387
264466
  }
264388
264467
  /**
264389
264468
  * Creates a new empty folder project under the root folder.
264390
264469
  */
264391
- async *createProjectFromNewFolder(projectName) {
264392
- yield* this.projectCreator.createProjectFromNewFolder(projectName);
264470
+ async *createProjectFromNewFolder(projectName, options2) {
264471
+ yield* this.projectCreator.createProjectFromNewFolder(projectName, options2);
264393
264472
  }
264394
264473
  /**
264395
264474
  * Creates a new project from a zip archive.
264396
264475
  */
264397
- async *createProjectFromZip(zipBuffer, suggestedName, overrideProjectId) {
264398
- yield* this.projectCreator.createProjectFromZip(zipBuffer, suggestedName, overrideProjectId);
264476
+ async *createProjectFromZip(zipBuffer, suggestedName, overrideProjectId, options2) {
264477
+ yield* this.projectCreator.createProjectFromZip(
264478
+ zipBuffer,
264479
+ suggestedName,
264480
+ overrideProjectId,
264481
+ options2
264482
+ );
264399
264483
  }
264400
264484
  /**
264401
264485
  * Gets a project by ID
@@ -265750,9 +265834,13 @@ async function postScaffold(c, projectManager) {
265750
265834
  );
265751
265835
  return c.json(response, statusCode);
265752
265836
  }
265837
+ const abortController = new AbortController();
265753
265838
  return streamAsyncGenerator(
265754
265839
  c,
265755
- projectManager.createProjectFromScaffold(projectName.trim(), templateId, packageManager)
265840
+ projectManager.createProjectFromScaffold(projectName.trim(), templateId, packageManager, {
265841
+ signal: abortController.signal
265842
+ }),
265843
+ { abortController }
265756
265844
  );
265757
265845
  } catch (error48) {
265758
265846
  const { response, statusCode } = ResponseBuilder.error(
@@ -425094,14 +425182,15 @@ var init_threads_routes = __esm({
425094
425182
  });
425095
425183
 
425096
425184
  // src/features/git/git.manager.ts
425097
- import { mkdir as mkdir16 } from "fs/promises";
425185
+ import { mkdir as mkdir16, rm as rm12 } from "fs/promises";
425098
425186
  import { dirname as dirname20 } from "path";
425099
- var GitManagerImpl;
425187
+ var FILTER_UNSUPPORTED_PATTERN, GitManagerImpl;
425100
425188
  var init_git_manager = __esm({
425101
425189
  "src/features/git/git.manager.ts"() {
425102
425190
  "use strict";
425103
425191
  init_utils5();
425104
425192
  init_git_utils();
425193
+ FILTER_UNSUPPORTED_PATTERN = /filter|partial clone|blob/i;
425105
425194
  GitManagerImpl = class {
425106
425195
  /**
425107
425196
  * Regular expressions for validating different git URL formats
@@ -425161,7 +425250,8 @@ var init_git_manager = __esm({
425161
425250
  * - 7.2 - IF a git clone operation fails, THEN THE CLI SHALL return a descriptive error message
425162
425251
  * - 7.3 - WHEN a clone operation is in progress, THE CLI SHALL stream git output to provide progress feedback
425163
425252
  */
425164
- async *cloneRepository(gitUrl, targetPath) {
425253
+ async *cloneRepository(gitUrl, targetPath, options2) {
425254
+ const signal = options2?.signal;
425165
425255
  if (!this.validateGitUrl(gitUrl)) {
425166
425256
  yield {
425167
425257
  type: "error",
@@ -425173,58 +425263,29 @@ var init_git_manager = __esm({
425173
425263
  try {
425174
425264
  const parentDir = dirname20(targetPath);
425175
425265
  await mkdir16(parentDir, { recursive: true });
425176
- const gitProcess = spawnProcess("git", ["clone", "--progress", gitUrl, targetPath]);
425177
- const eventQueue = [];
425178
- let processExited = false;
425179
- let exitCode = null;
425180
- let processError = null;
425181
- if (gitProcess.stdout) {
425182
- gitProcess.stdout.on("data", (data) => {
425183
- const output2 = data.toString();
425184
- eventQueue.push({
425185
- type: "stdout",
425186
- data: output2
425187
- });
425188
- });
425189
- }
425190
- if (gitProcess.stderr) {
425191
- gitProcess.stderr.on("data", (data) => {
425192
- const output2 = data.toString();
425193
- eventQueue.push({
425194
- type: "stderr",
425195
- data: output2
425196
- });
425197
- });
425198
- }
425199
- gitProcess.on("close", (code) => {
425200
- exitCode = code;
425201
- processExited = true;
425202
- });
425203
- gitProcess.on("error", (err2) => {
425204
- processError = err2;
425205
- processExited = true;
425206
- });
425207
- while (!processExited || eventQueue.length > 0) {
425208
- if (eventQueue.length > 0) {
425209
- const event = eventQueue.shift();
425210
- if (event) {
425211
- yield event;
425212
- }
425213
- } else {
425214
- await new Promise((resolve18) => setTimeout(resolve18, 10));
425215
- }
425266
+ let result = yield* this.spawnGitStreaming(
425267
+ ["clone", "--progress", "--filter=blob:none", gitUrl, targetPath],
425268
+ signal
425269
+ );
425270
+ if (!result.ok && !result.aborted && FILTER_UNSUPPORTED_PATTERN.test(result.stderr)) {
425271
+ await rm12(targetPath, { recursive: true, force: true });
425272
+ result = yield* this.spawnGitStreaming(["clone", "--progress", gitUrl, targetPath], signal);
425216
425273
  }
425217
- if (processError) {
425218
- const errorMessage2 = processError instanceof Error ? processError.message : JSON.stringify(processError);
425274
+ if (result.processError) {
425275
+ const errorMessage2 = result.processError instanceof Error ? result.processError.message : JSON.stringify(result.processError);
425219
425276
  yield {
425220
425277
  type: "error",
425221
425278
  message: errorMessage2,
425222
- error: processError
425279
+ error: result.processError
425223
425280
  };
425224
425281
  return;
425225
425282
  }
425226
- if (exitCode !== 0) {
425227
- const errorMsg = `Git clone failed with exit code ${exitCode}`;
425283
+ if (!result.ok) {
425284
+ if (result.aborted) {
425285
+ await rm12(targetPath, { recursive: true, force: true });
425286
+ return;
425287
+ }
425288
+ const errorMsg = `Git clone failed with exit code ${result.exitCode}`;
425228
425289
  yield {
425229
425290
  type: "error",
425230
425291
  message: errorMsg,
@@ -425243,6 +425304,96 @@ var init_git_manager = __esm({
425243
425304
  };
425244
425305
  }
425245
425306
  }
425307
+ /**
425308
+ * Spawns a git process and streams its stdout/stderr as GitEvents
425309
+ *
425310
+ * Guarantees cleanup no matter how the generator ends:
425311
+ * - Aborting the signal kills the git process (prevents zombie clones
425312
+ * eating memory/disk after the client disconnects)
425313
+ * - A `finally` block removes all listeners and kills the process if the
425314
+ * generator is closed early (e.g. `generator.return()` by the consumer),
425315
+ * so the event queue cannot grow unboundedly
425316
+ *
425317
+ * @param args - Arguments passed to `git` (after the command name)
425318
+ * @param signal - Optional cancellation signal
425319
+ * @yields GitEvent objects for stdout and stderr
425320
+ * @returns The stream result once the process has exited and been drained
425321
+ */
425322
+ async *spawnGitStreaming(args2, signal, cwd) {
425323
+ const gitProcess = spawnProcess("git", args2, cwd ? { cwd } : void 0);
425324
+ const eventQueue = [];
425325
+ let processExited = false;
425326
+ let exitCode = null;
425327
+ let processError = null;
425328
+ let stdoutText = "";
425329
+ let stderrText = "";
425330
+ let killed = false;
425331
+ const onStdout = (data) => {
425332
+ const output2 = data.toString();
425333
+ stdoutText += output2;
425334
+ eventQueue.push({
425335
+ type: "stdout",
425336
+ data: output2
425337
+ });
425338
+ };
425339
+ const onStderr = (data) => {
425340
+ const output2 = data.toString();
425341
+ stderrText += output2;
425342
+ eventQueue.push({
425343
+ type: "stderr",
425344
+ data: output2
425345
+ });
425346
+ };
425347
+ const onClose = (code) => {
425348
+ exitCode = code;
425349
+ processExited = true;
425350
+ };
425351
+ const onError = (err2) => {
425352
+ processError = err2;
425353
+ processExited = true;
425354
+ };
425355
+ gitProcess.stdout?.on("data", onStdout);
425356
+ gitProcess.stderr?.on("data", onStderr);
425357
+ gitProcess.on("close", onClose);
425358
+ gitProcess.on("error", onError);
425359
+ try {
425360
+ while (!processExited || eventQueue.length > 0) {
425361
+ if (signal?.aborted && !processExited && !killed) {
425362
+ killed = true;
425363
+ gitProcess.kill("SIGTERM");
425364
+ }
425365
+ if (eventQueue.length > 0) {
425366
+ const event = eventQueue.shift();
425367
+ if (event) {
425368
+ yield event;
425369
+ }
425370
+ } else {
425371
+ await new Promise((resolve18) => setTimeout(resolve18, 10));
425372
+ }
425373
+ }
425374
+ } finally {
425375
+ gitProcess.stdout?.off("data", onStdout);
425376
+ gitProcess.stderr?.off("data", onStderr);
425377
+ gitProcess.off("close", onClose);
425378
+ gitProcess.off("error", onError);
425379
+ if (!processExited) {
425380
+ killed = true;
425381
+ gitProcess.kill("SIGTERM");
425382
+ }
425383
+ }
425384
+ const aborted2 = signal?.aborted === true;
425385
+ if (processError) {
425386
+ return { ok: false, exitCode, stdout: stdoutText, stderr: stderrText, processError, aborted: aborted2 };
425387
+ }
425388
+ return {
425389
+ ok: exitCode === 0,
425390
+ exitCode,
425391
+ stdout: stdoutText,
425392
+ stderr: stderrText,
425393
+ processError,
425394
+ aborted: aborted2
425395
+ };
425396
+ }
425246
425397
  /**
425247
425398
  * Sanitizes a branch name to ensure it only contains valid git branch characters
425248
425399
  *
@@ -425286,63 +425437,23 @@ var init_git_manager = __esm({
425286
425437
  */
425287
425438
  async *createAndCheckoutBranch(repoPath, branchName) {
425288
425439
  try {
425289
- const gitProcess = spawnProcess("git", ["checkout", "-b", branchName], {
425290
- cwd: repoPath
425291
- });
425292
- const eventQueue = [];
425293
- let processExited = false;
425294
- let exitCode = null;
425295
- let processError = null;
425296
- let stderrOutput = "";
425297
- if (gitProcess.stdout) {
425298
- gitProcess.stdout.on("data", (data) => {
425299
- const output2 = data.toString();
425300
- eventQueue.push({
425301
- type: "stdout",
425302
- data: output2
425303
- });
425304
- });
425305
- }
425306
- if (gitProcess.stderr) {
425307
- gitProcess.stderr.on("data", (data) => {
425308
- const output2 = data.toString();
425309
- stderrOutput += output2;
425310
- eventQueue.push({
425311
- type: "stderr",
425312
- data: output2
425313
- });
425314
- });
425315
- }
425316
- gitProcess.on("close", (code) => {
425317
- exitCode = code;
425318
- processExited = true;
425319
- });
425320
- gitProcess.on("error", (err2) => {
425321
- processError = err2;
425322
- processExited = true;
425323
- });
425324
- while (!processExited || eventQueue.length > 0) {
425325
- if (eventQueue.length > 0) {
425326
- const event = eventQueue.shift();
425327
- if (event) {
425328
- yield event;
425329
- }
425330
- } else {
425331
- await new Promise((resolve18) => setTimeout(resolve18, 10));
425332
- }
425333
- }
425334
- if (processError) {
425335
- const errorMessage2 = processError instanceof Error ? processError.message : JSON.stringify(processError);
425440
+ const result = yield* this.spawnGitStreaming(
425441
+ ["checkout", "-b", branchName],
425442
+ void 0,
425443
+ repoPath
425444
+ );
425445
+ if (result.processError) {
425446
+ const errorMessage2 = result.processError instanceof Error ? result.processError.message : JSON.stringify(result.processError);
425336
425447
  yield {
425337
425448
  type: "error",
425338
425449
  message: errorMessage2,
425339
- error: processError
425450
+ error: result.processError
425340
425451
  };
425341
425452
  return;
425342
425453
  }
425343
- if (exitCode !== 0) {
425344
- const detail = stderrOutput.trim();
425345
- const errorMsg = `Failed to create and checkout branch '${branchName}' with exit code ${exitCode}${detail ? `: ${detail}` : ""}`;
425454
+ if (!result.ok) {
425455
+ const detail = result.stderr.trim();
425456
+ const errorMsg = `Failed to create and checkout branch '${branchName}' with exit code ${result.exitCode}${detail ? `: ${detail}` : ""}`;
425346
425457
  yield {
425347
425458
  type: "error",
425348
425459
  message: errorMsg,