@kontextmind/kxm 0.7.207 → 0.7.209

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kontextmind/kxm",
3
- "version": "0.7.207",
3
+ "version": "0.7.209",
4
4
  "description": "KXM local-first multi-agent orchestration and operator dashboard",
5
5
  "type": "module",
6
6
  "author": "KontextMind",
@@ -77,9 +77,9 @@
77
77
  ]
78
78
  },
79
79
  "dependencies": {
80
- "@anthropic-ai/claude-agent-sdk": "0.3.303",
81
- "@earendil-works/pi-tui": "1.3.0",
82
- "@modelcontextprotocol/sdk": "1.32.1",
80
+ "@anthropic-ai/claude-agent-sdk": "0.3.310",
81
+ "@earendil-works/pi-tui": "1.4.0",
82
+ "@modelcontextprotocol/sdk": "1.32.2",
83
83
  "yaml": "^2.9.0"
84
84
  },
85
85
  "peerDependencies": {
@@ -95,17 +95,17 @@
95
95
  }
96
96
  },
97
97
  "devDependencies": {
98
- "@earendil-works/pi-coding-agent": "1.3.0",
99
- "@modelcontextprotocol/sdk": "1.32.1",
98
+ "@earendil-works/pi-coding-agent": "1.4.0",
99
+ "@modelcontextprotocol/sdk": "1.32.2",
100
100
  "@playwright/test": "1.64.1",
101
101
  "@types/node": "26.6.5",
102
102
  "ajv": "8.20.0",
103
103
  "commander": "15.0.0",
104
104
  "esbuild": "0.28.2",
105
- "markdownlint-cli2": "0.23.3",
105
+ "markdownlint-cli2": "0.24.0",
106
106
  "nx": "24.0.1",
107
107
  "tsx": "^4.23.13",
108
- "typebox": "1.4.2",
108
+ "typebox": "1.4.3",
109
109
  "typescript": "7.0.2"
110
110
  },
111
111
  "files": [
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "kxm",
4
4
  "displayName": "KXM",
5
- "version": "0.7.207",
5
+ "version": "0.7.209",
6
6
  "description": "Headless multi-agent orchestration, durable workflows, and a live operator dashboard for Pi and Claude Code",
7
7
  "author": {
8
8
  "name": "KontextMind",
@@ -45311,6 +45311,9 @@ function detectCapabilitiesFromEnvironment(tmuxForwardsHyperlink) {
45311
45311
  if (termProgram === "herdr") {
45312
45312
  return { images: "kitty", trueColor: hasTrueColorHint, hyperlinks: true };
45313
45313
  }
45314
+ if (termProgram === "rex") {
45315
+ return { images: "kitty", trueColor: true, hyperlinks: true };
45316
+ }
45314
45317
  if (process.env.KITTY_WINDOW_ID || termProgram === "kitty") {
45315
45318
  return { images: "kitty", trueColor: true, hyperlinks: true };
45316
45319
  }
@@ -45677,6 +45680,26 @@ var TuiBase = class _TuiBase extends Container {
45677
45680
  }
45678
45681
  afterTerminalStop(_options) {
45679
45682
  }
45683
+ /** Mode resets written before the terminal's own resets when the process exits without stop(). */
45684
+ getExitRestorePrefix() {
45685
+ return `${this.terminalColorSchemeNotificationsEnabled ? "\x1B[?2031l" : ""}\x1B[?25h`;
45686
+ }
45687
+ /** Mode resets written after the terminal's own resets when the process exits without stop(). */
45688
+ getExitRestoreSuffix() {
45689
+ return "";
45690
+ }
45691
+ /**
45692
+ * Last-resort restore for exit paths that skip stop(), e.g. a direct process.exit() (#11170).
45693
+ * Hard kills and native aborts run no JavaScript and cannot be covered.
45694
+ */
45695
+ exitRestoreHandler = () => {
45696
+ if (this.stopped)
45697
+ return;
45698
+ try {
45699
+ this.terminal.restoreOnExit?.(this.getExitRestorePrefix(), this.getExitRestoreSuffix());
45700
+ } catch {
45701
+ }
45702
+ };
45680
45703
  get fullRedraws() {
45681
45704
  return this.fullRedrawCount;
45682
45705
  }
@@ -45993,6 +46016,8 @@ var TuiBase = class _TuiBase extends Container {
45993
46016
  }
45994
46017
  start() {
45995
46018
  this.stopped = false;
46019
+ process.off("exit", this.exitRestoreHandler);
46020
+ process.on("exit", this.exitRestoreHandler);
45996
46021
  this.beforeTerminalStart();
45997
46022
  this.terminal.start((data) => this.handleTerminalInput(data), () => this.requestRender());
45998
46023
  this.afterTerminalStart();
@@ -46035,6 +46060,7 @@ var TuiBase = class _TuiBase extends Container {
46035
46060
  }
46036
46061
  stop(options = {}) {
46037
46062
  this.stopped = true;
46063
+ process.off("exit", this.exitRestoreHandler);
46038
46064
  this.cancelRenderTimer();
46039
46065
  if (this.terminalColorSchemeNotificationsEnabled) {
46040
46066
  this.terminal.write("\x1B[?2031l");
@@ -47524,6 +47550,183 @@ var Input = class {
47524
47550
  }
47525
47551
  };
47526
47552
 
47553
+ // node_modules/marked-cjk-friendly/dist/index.js
47554
+ var CJK = "\\u1100-\\u11ff\\u20a9\\u2329-\\u232a\\u2630-\\u2637\\u268a-\\u268f\\u2e80-\\u2e99\\u2e9b-\\u2ef3\\u2f00-\\u2fd5\\u2ff0-\\u303e\\u3041-\\u3096\\u3099-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u3190-\\u31e5\\u31ef-\\u321e\\u3220-\\u3247\\u3250-\\ua48c\\ua490-\\ua4c6\\ua960-\\ua97c\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufaff\\ufe10-\\ufe19\\ufe30-\\ufe52\\ufe54-\\ufe66\\ufe68-\\ufe6b\\uff01-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\\uffe0-\\uffe6\\uffe8-\\uffee\\u{16fe0}-\\u{16fe4}\\u{16ff0}-\\u{16ff6}\\u{17000}-\\u{18cda}\\u{18cff}-\\u{18d20}\\u{18d80}-\\u{18df2}\\u{18e00}-\\u{19191}\\u{191a0}-\\u{191d2}\\u{1aff0}-\\u{1aff3}\\u{1aff5}-\\u{1affb}\\u{1affd}-\\u{1affe}\\u{1b000}-\\u{1b128}\\u{1b132}\\u{1b150}-\\u{1b152}\\u{1b155}\\u{1b164}-\\u{1b168}\\u{1b170}-\\u{1b2fb}\\u{1d300}-\\u{1d356}\\u{1d360}-\\u{1d376}\\u{1f1ae}\\u{1f200}\\u{1f202}\\u{1f210}-\\u{1f219}\\u{1f21b}-\\u{1f22e}\\u{1f230}-\\u{1f231}\\u{1f237}\\u{1f23b}\\u{1f240}-\\u{1f248}\\u{1f260}-\\u{1f265}\\u{1f7da}\\u{20000}-\\u{3fffd}";
47555
+ var cjkTest = new RegExp(`[${CJK}]`, "u");
47556
+ var punctuationCjk = new RegExp(`^((?![*_])[\\s\\p{P}\\p{S}${CJK}])`, "u");
47557
+ function buildRDelimAst(punct, punctSpace, notPunctSpace) {
47558
+ return new RegExp(`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)${punct}(\\*+)(?=[\\s]|$)|${notPunctSpace}(\\*+)(?!\\*)(?=${punctSpace}|$)|(?!\\*)${punctSpace}(\\*+)(?=${notPunctSpace})|[\\s](\\*+)(?!\\*)(?=${punct})|(?!\\*)${punct}(\\*+)(?!\\*)(?=${punct})|${notPunctSpace}(\\*+)(?=${notPunctSpace})`, "gu");
47559
+ }
47560
+ function buildRDelimUnd(punct, punctSpace, notPunctSpace) {
47561
+ return new RegExp(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)${punct}(_+)(?=[\\s]|$)|${notPunctSpace}(_+)(?!_)(?=${punctSpace}|$)|(?!_)${punctSpace}(_+)(?=${notPunctSpace})|[\\s](_+)(?!_)(?=${punct})|(?!_)${punct}(_+)(?!_)(?=${punct})`, "gu");
47562
+ }
47563
+ function buildRDelimDel(punct, punctSpace, notPunctSpace) {
47564
+ return new RegExp(`^[^~]+(?=[^~])|(?!~)${punct}(~~?)(?=[\\s]|$)|${notPunctSpace}(~~?)(?!~)(?=${punctSpace}|$)|(?!~)${punctSpace}(~~?)(?=${notPunctSpace})|[\\s](~~?)(?!~)(?=${punct})|(?!~)${punct}(~~?)(?!~)(?=${punct})|${notPunctSpace}(~~?)(?=${notPunctSpace})`, "gu");
47565
+ }
47566
+ var cjkPunct = `[\\p{P}\\p{S}${CJK}]`;
47567
+ var cjkPunctSpace = `[\\s\\p{P}\\p{S}${CJK}]`;
47568
+ var cjkNotPunctSpace = `[^\\s\\p{P}\\p{S}${CJK}]`;
47569
+ var cjkDelPunct = `(?![*_])[\\p{P}\\p{S}${CJK}]`;
47570
+ var cjkDelPunctSpace = `(?![*_])[\\s\\p{P}\\p{S}${CJK}]`;
47571
+ var cjkDelNotPunctSpace = `(?:[^\\s\\p{P}\\p{S}${CJK}]|[*_])`;
47572
+ var cjkPunctGfm = `(?!~)[\\p{P}\\p{S}${CJK}]`;
47573
+ var cjkPunctSpaceGfm = `(?!~)[\\s\\p{P}\\p{S}${CJK}]`;
47574
+ var cjkNotPunctSpaceGfm = `(?:[^\\s\\p{P}\\p{S}${CJK}]|~)`;
47575
+ var emStrongRDelimAstCjk = buildRDelimAst(cjkPunct, cjkPunctSpace, cjkNotPunctSpace);
47576
+ var emStrongRDelimAstCjkGfm = buildRDelimAst(cjkPunctGfm, cjkPunctSpaceGfm, cjkNotPunctSpaceGfm);
47577
+ var emStrongRDelimUndCjk = buildRDelimUnd(cjkPunct, cjkPunctSpace, cjkNotPunctSpace);
47578
+ var delRDelimCjk = buildRDelimDel(cjkDelPunct, cjkDelPunctSpace, cjkDelNotPunctSpace);
47579
+ function isPrevCharCjk(prevChar, maskedSrc, src) {
47580
+ let prevIsCjk = punctuationCjk.test(prevChar);
47581
+ if (!prevIsCjk && prevChar) {
47582
+ const prevIdx = maskedSrc.length - src.length;
47583
+ if (prevIdx >= 1) {
47584
+ let idx = prevIdx - 1;
47585
+ let code = maskedSrc.charCodeAt(idx);
47586
+ if (code >= 65024 && code <= 65038 && idx >= 1) {
47587
+ idx--;
47588
+ code = maskedSrc.charCodeAt(idx);
47589
+ }
47590
+ if ((code & 64512) === 56320 && idx >= 1) {
47591
+ const cp = maskedSrc.codePointAt(idx - 1);
47592
+ if (cp !== void 0 && cp > 65535) {
47593
+ if (cp >= 917760 && cp <= 917999) prevIsCjk = true;
47594
+ else prevIsCjk = cjkTest.test(String.fromCodePoint(cp));
47595
+ }
47596
+ } else prevIsCjk = cjkTest.test(String.fromCharCode(code));
47597
+ }
47598
+ }
47599
+ return prevIsCjk;
47600
+ }
47601
+ function isCjkAdjacentToDelimiter(rightMatch, clippedMaskedSrc) {
47602
+ if (!(rightMatch[1] || rightMatch[2] || rightMatch[3] || rightMatch[4])) return false;
47603
+ const charBefore = String.fromCodePoint(rightMatch[0].codePointAt(0));
47604
+ const afterPos = rightMatch.index + rightMatch[0].length;
47605
+ const charAfter = afterPos < clippedMaskedSrc.length ? String.fromCodePoint(clippedMaskedSrc.codePointAt(afterPos)) : "";
47606
+ return cjkTest.test(charBefore) || cjkTest.test(charAfter);
47607
+ }
47608
+ function usesModernEmStrongLayout(match) {
47609
+ return match.length >= 5;
47610
+ }
47611
+ function hasEmStrongLeadContent(match) {
47612
+ return Boolean(match[1] || match[2] || match[3] || match[4]);
47613
+ }
47614
+ function isEmStrongUnderscoreWordChar(match) {
47615
+ return usesModernEmStrongLayout(match) ? Boolean(match[4]) : Boolean(match[3]);
47616
+ }
47617
+ function getEmStrongOpeningPunctuation(match) {
47618
+ if (usesModernEmStrongLayout(match)) return match[1] || match[3] || "";
47619
+ return match[1] || match[2] || "";
47620
+ }
47621
+ function markedCjkFriendly() {
47622
+ return { tokenizer: {
47623
+ emStrong(src, maskedSrc, prevChar = "") {
47624
+ const { rules } = this;
47625
+ const match = rules.inline.emStrongLDelim.exec(src);
47626
+ if (!match) return false;
47627
+ const modernEmStrongLayout = usesModernEmStrongLayout(match);
47628
+ if (modernEmStrongLayout && !hasEmStrongLeadContent(match)) return;
47629
+ if (isEmStrongUnderscoreWordChar(match) && prevChar.match(rules.other.unicodeAlphaNumeric)) return false;
47630
+ const nextChar = getEmStrongOpeningPunctuation(match);
47631
+ const prevIsCjk = isPrevCharCjk(prevChar, maskedSrc, src);
47632
+ if (!nextChar || !prevChar || rules.inline.punctuation.exec(prevChar) || prevIsCjk || cjkTest.test(nextChar)) {
47633
+ const lLength = [...match[0]].length - 1;
47634
+ let rDelim;
47635
+ let rLength;
47636
+ let delimTotal = lLength;
47637
+ let midDelimTotal = 0;
47638
+ const prevCharIsSameDelimiter = modernEmStrongLayout && prevChar === match[0][0];
47639
+ const isGfm = rules.inline.emStrongRDelimAst.source.includes("(?!~)");
47640
+ let endReg;
47641
+ if (match[0][0] === "*") endReg = isGfm ? emStrongRDelimAstCjkGfm : emStrongRDelimAstCjk;
47642
+ else endReg = emStrongRDelimUndCjk;
47643
+ endReg.lastIndex = 0;
47644
+ const clippedMaskedSrc = maskedSrc.slice(-1 * src.length + lLength);
47645
+ let rMatch;
47646
+ while ((rMatch = endReg.exec(clippedMaskedSrc)) != null) {
47647
+ rDelim = rMatch[1] || rMatch[2] || rMatch[3] || rMatch[4] || rMatch[5] || rMatch[6];
47648
+ if (!rDelim) continue;
47649
+ rLength = [...rDelim].length;
47650
+ const isCjkAdjacent = isCjkAdjacentToDelimiter(rMatch, clippedMaskedSrc);
47651
+ const isLeftOnly = Boolean(rMatch[3] || rMatch[4]);
47652
+ const isBoth = Boolean(rMatch[5] || rMatch[6]);
47653
+ if (isLeftOnly && !isCjkAdjacent) {
47654
+ delimTotal += rLength;
47655
+ continue;
47656
+ }
47657
+ if (isBoth || isCjkAdjacent) {
47658
+ if (lLength % 3 && !((lLength + rLength) % 3)) {
47659
+ midDelimTotal += rLength;
47660
+ continue;
47661
+ }
47662
+ if (prevCharIsSameDelimiter && isBoth) break;
47663
+ }
47664
+ delimTotal -= rLength;
47665
+ if (delimTotal > 0) continue;
47666
+ rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
47667
+ const lastCharLength = rMatch[0].codePointAt(0) > 65535 ? 2 : 1;
47668
+ const raw = src.slice(0, lLength + rMatch.index + lastCharLength + rLength);
47669
+ if (Math.min(lLength, rLength) % 2) {
47670
+ const text2 = raw.slice(1, -1);
47671
+ return {
47672
+ type: "em",
47673
+ raw,
47674
+ text: text2,
47675
+ tokens: this.lexer.inlineTokens(text2)
47676
+ };
47677
+ }
47678
+ const text = raw.slice(2, -2);
47679
+ return {
47680
+ type: "strong",
47681
+ raw,
47682
+ text,
47683
+ tokens: this.lexer.inlineTokens(text)
47684
+ };
47685
+ }
47686
+ }
47687
+ },
47688
+ del(src, maskedSrc, prevChar = "") {
47689
+ const { rules } = this;
47690
+ const match = rules.inline.delLDelim.exec(src);
47691
+ if (!match) return false;
47692
+ const nextChar = match[1] || "";
47693
+ const prevIsCjk = isPrevCharCjk(prevChar, maskedSrc, src);
47694
+ if (!nextChar || !prevChar || rules.inline.punctuation.exec(prevChar) || prevIsCjk || cjkTest.test(nextChar)) {
47695
+ const lLength = [...match[0]].length - 1;
47696
+ let rDelim;
47697
+ let rLength;
47698
+ let delimTotal = lLength;
47699
+ delRDelimCjk.lastIndex = 0;
47700
+ const clippedMaskedSrc = maskedSrc.slice(-1 * src.length + lLength);
47701
+ let rMatch;
47702
+ while ((rMatch = delRDelimCjk.exec(clippedMaskedSrc)) != null) {
47703
+ rDelim = rMatch[1] || rMatch[2] || rMatch[3] || rMatch[4] || rMatch[5] || rMatch[6];
47704
+ if (!rDelim) continue;
47705
+ rLength = [...rDelim].length;
47706
+ if (rLength !== lLength) continue;
47707
+ const isCjkAdjacent = isCjkAdjacentToDelimiter(rMatch, clippedMaskedSrc);
47708
+ if ((rMatch[3] || rMatch[4]) && !isCjkAdjacent) {
47709
+ delimTotal += rLength;
47710
+ continue;
47711
+ }
47712
+ delimTotal -= rLength;
47713
+ if (delimTotal > 0) continue;
47714
+ rLength = Math.min(rLength, rLength + delimTotal);
47715
+ const lastCharLength = rMatch[0].codePointAt(0) > 65535 ? 2 : 1;
47716
+ const raw = src.slice(0, lLength + rMatch.index + lastCharLength + rLength);
47717
+ const text = raw.slice(lLength, -lLength);
47718
+ return {
47719
+ type: "del",
47720
+ raw,
47721
+ text,
47722
+ tokens: this.lexer.inlineTokens(text)
47723
+ };
47724
+ }
47725
+ }
47726
+ }
47727
+ } };
47728
+ }
47729
+
47527
47730
  // node_modules/@earendil-works/pi-tui/dist/components/markdown.js
47528
47731
  var STRICT_STRIKETHROUGH_REGEX = /^(~~)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/;
47529
47732
  var StrictStrikethroughTokenizer = class extends y {
@@ -47594,21 +47797,32 @@ function tokenizeInlineLatex(source) {
47594
47797
  const raw = source.slice(0, closingIndex + closing.length);
47595
47798
  return { type: "latex", raw, text };
47596
47799
  }
47800
+ var TABLE_DELIMITER_ROW_REGEX = /^ {0,3}\|?[ \t]*:?-+:?[ \t]*(?:\|[ \t]*:?-+:?[ \t]*)*\|?[ \t]*$/;
47801
+ function containsTableStart(source) {
47802
+ const lines = source.split("\n");
47803
+ for (let index = 0; index < lines.length - 1; index++) {
47804
+ const delimiterRow = lines[index + 1];
47805
+ if ((delimiterRow.includes("|") || lines[index].includes("|")) && TABLE_DELIMITER_ROW_REGEX.test(delimiterRow)) {
47806
+ return true;
47807
+ }
47808
+ }
47809
+ return false;
47810
+ }
47597
47811
  function tokenizeBlockLatex(source) {
47598
47812
  const dollarMatch = /^ {0,3}\$\$[ \t]*(?:\n)?([\s\S]*?)\$\$[ \t]*(?:\n|$)/.exec(source);
47599
- if (dollarMatch?.[1]) {
47813
+ if (dollarMatch?.[1] && !containsTableStart(dollarMatch[1])) {
47600
47814
  return { type: "latexBlock", raw: dollarMatch[0], text: dollarMatch[1].trim() };
47601
47815
  }
47602
47816
  const bracketMatch = /^ {0,3}\\\[[ \t]*(?:\n)?([\s\S]*?)\\\][ \t]*(?:\n|$)/.exec(source);
47603
- if (bracketMatch?.[1]) {
47817
+ if (bracketMatch?.[1] && !containsTableStart(bracketMatch[1])) {
47604
47818
  return { type: "latexBlock", raw: bracketMatch[0], text: bracketMatch[1].trim() };
47605
47819
  }
47606
47820
  const pendingBracket = /^ {0,3}\\\[[ \t]*(?:\n)?([\s\S]*)$/.exec(source);
47607
- if (pendingBracket) {
47821
+ if (pendingBracket?.[1] && !containsTableStart(pendingBracket[1])) {
47608
47822
  return { type: "latexBlock", raw: pendingBracket[0], text: pendingBracket[1], pending: true };
47609
47823
  }
47610
47824
  const pendingDollar = /^ {0,3}\$\$[ \t]*(?:\n)?([\s\S]*)$/.exec(source);
47611
- if (pendingDollar?.[1] && looksLikePendingDollarMath(pendingDollar[1])) {
47825
+ if (pendingDollar?.[1] && looksLikePendingDollarMath(pendingDollar[1]) && !containsTableStart(pendingDollar[1])) {
47612
47826
  return { type: "latexBlock", raw: pendingDollar[0], text: pendingDollar[1], pending: true };
47613
47827
  }
47614
47828
  return void 0;
@@ -47637,7 +47851,10 @@ var markdownParser = new Z();
47637
47851
  markdownParser.setOptions({
47638
47852
  tokenizer: new StrictStrikethroughTokenizer()
47639
47853
  });
47640
- markdownParser.use({ extensions: [...LATEX_MARKDOWN_EXTENSIONS] });
47854
+ markdownParser.use({
47855
+ tokenizer: { emStrong: markedCjkFriendly().tokenizer?.emStrong },
47856
+ extensions: [...LATEX_MARKDOWN_EXTENSIONS]
47857
+ });
47641
47858
 
47642
47859
  // node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js
47643
47860
  var ScrollView = class extends Container {
@@ -48651,6 +48868,21 @@ var ProcessTerminal = class {
48651
48868
  process.stdin.setRawMode(this.wasRaw);
48652
48869
  }
48653
48870
  }
48871
+ restoreOnExit(before, after) {
48872
+ let sequence = before;
48873
+ if (this.progressInterval)
48874
+ sequence += TERMINAL_PROGRESS_CLEAR_SEQUENCE;
48875
+ sequence += "\x1B[?2004l";
48876
+ if (this.keyboardProtocolPushed || this._kittyProtocolActive)
48877
+ sequence += "\x1B[<u";
48878
+ if (this._modifyOtherKeysActive)
48879
+ sequence += "\x1B[>4;0m";
48880
+ sequence += after;
48881
+ try {
48882
+ fs2.writeSync(process.stdout.fd, sequence);
48883
+ } catch {
48884
+ }
48885
+ }
48654
48886
  write(data) {
48655
48887
  process.stdout.write(data);
48656
48888
  if (this.writeLogPath) {
@@ -49611,6 +49843,15 @@ var TuiAltScreen = class extends TuiBase {
49611
49843
  this.savedCapabilities = void 0;
49612
49844
  }
49613
49845
  }
49846
+ getExitRestorePrefix() {
49847
+ const prefix = super.getExitRestorePrefix();
49848
+ if (!this.altScreenActive)
49849
+ return prefix;
49850
+ return `${END_SYNCHRONIZED_OUTPUT}${this.mouseEnabled ? DISABLE_MOUSE : ""}${ENABLE_AUTOWRAP}${prefix}`;
49851
+ }
49852
+ getExitRestoreSuffix() {
49853
+ return `${super.getExitRestoreSuffix()}${this.altScreenActive ? `${EXIT_ALT_SCREEN}\x1B[?25h` : ""}`;
49854
+ }
49614
49855
  deleteKittyImages() {
49615
49856
  return this.imageProtocol === "kitty" ? deleteAllKittyImages() : "";
49616
49857
  }
@@ -56827,9 +57068,10 @@ import { dirname as dirname25, join as join58 } from "node:path";
56827
57068
  var ADMITTED_GUIDE_BINDINGS = Object.freeze({
56828
57069
  "anthropic/claude-fable-5.1": { harness: "claude", provider: "anthropic", model: "fable" },
56829
57070
  "anthropic/fable": { harness: "claude", provider: "anthropic", model: "fable" },
57071
+ "openai/gpt-6.1-sol": { harness: "codex", provider: "openai", model: "gpt-6.1-sol" },
56830
57072
  "openai/gpt-5.6-sol": { harness: "codex", provider: "openai", model: "gpt-5.6-sol" },
56831
- "x-ai/grok-4.6": { harness: "grok", provider: "xai", model: "grok-4.6" },
56832
- "xai/grok-4.6": { harness: "grok", provider: "xai", model: "grok-4.6" },
57073
+ "x-ai/grok-4.7": { harness: "grok", provider: "xai", model: "grok-4.7" },
57074
+ "xai/grok-4.7": { harness: "grok", provider: "xai", model: "grok-4.7" },
56833
57075
  "qwen/qwen3.7-plus": { harness: "pi", provider: "openrouter", model: "qwen/qwen3.7-plus" }
56834
57076
  });
56835
57077
  var GUIDE_WORKFLOWS = [
@@ -56848,7 +57090,7 @@ var GUIDE_WORKFLOWS = [
56848
57090
  { vendor: "anthropic", model: "claude-fable-5.1" },
56849
57091
  { vendor: "deepseek", model: "deepseek-v4-pro-0813" },
56850
57092
  { vendor: "openai", model: "gpt-6-astra-pro" },
56851
- { vendor: "x-ai", model: "grok-4.6" },
57093
+ { vendor: "x-ai", model: "grok-4.7" },
56852
57094
  { vendor: "qwen", model: "qwen3.8-max-0902" }
56853
57095
  ]
56854
57096
  },
@@ -56871,11 +57113,11 @@ var GUIDE_WORKFLOWS = [
56871
57113
  role: "scaffold-build-specialist",
56872
57114
  domain: "Provisions monorepo workspace topologies, linters, Docker multi-stage builds, and CI pipelines.",
56873
57115
  candidates: [
56874
- { vendor: "x-ai", model: "grok-4.6" },
57116
+ { vendor: "x-ai", model: "grok-4.7" },
56875
57117
  { vendor: "mistralai", model: "devstral-2512" },
56876
57118
  { vendor: "qwen", model: "qwen3.7-plus" },
56877
57119
  { vendor: "openai", model: "gpt-5.3-codex" },
56878
- { vendor: "kwaipilot", model: "kat-coder-pro-v2.5" }
57120
+ { vendor: "qwen", model: "qwen3-coder" }
56879
57121
  ]
56880
57122
  },
56881
57123
  {
@@ -56884,11 +57126,11 @@ var GUIDE_WORKFLOWS = [
56884
57126
  role: "backend-data-implementer",
56885
57127
  domain: "Implements domain entities, SQL queries/migrations, ORM persistence, concurrency primitives, and transactional boundaries.",
56886
57128
  candidates: [
56887
- { vendor: "x-ai", model: "grok-4.6" },
57129
+ { vendor: "x-ai", model: "grok-4.7" },
56888
57130
  { vendor: "qwen", model: "qwen3.7-plus" },
56889
57131
  { vendor: "deepseek", model: "deepseek-v4-pro-0813" },
56890
57132
  { vendor: "openai", model: "gpt-5.3-codex" },
56891
- { vendor: "kwaipilot", model: "kat-coder-pro-v2.5" }
57133
+ { vendor: "qwen", model: "qwen3-coder" }
56892
57134
  ]
56893
57135
  },
56894
57136
  {
@@ -56899,7 +57141,7 @@ var GUIDE_WORKFLOWS = [
56899
57141
  candidates: [
56900
57142
  { vendor: "anthropic", model: "claude-sonnet-5" },
56901
57143
  { vendor: "google", model: "gemini-3.8-flash" },
56902
- { vendor: "x-ai", model: "grok-4.6" },
57144
+ { vendor: "x-ai", model: "grok-4.7" },
56903
57145
  { vendor: "bytedance-seed", model: "seed-2.0-code" },
56904
57146
  { vendor: "openai", model: "gpt-5.3-codex" }
56905
57147
  ]
@@ -56911,7 +57153,7 @@ var GUIDE_WORKFLOWS = [
56911
57153
  domain: "Wires external APIs, authentication flows (OAuth2/OIDC), webhook validation, cloud SDKs, and async worker queues.",
56912
57154
  candidates: [
56913
57155
  { vendor: "openai", model: "gpt-5.6-sol" },
56914
- { vendor: "x-ai", model: "grok-4.6" },
57156
+ { vendor: "x-ai", model: "grok-4.7" },
56915
57157
  { vendor: "qwen", model: "qwen3.7-plus" },
56916
57158
  { vendor: "deepseek", model: "deepseek-v4-pro-0813" },
56917
57159
  { vendor: "google", model: "gemini-3.8-flash" }
@@ -56944,7 +57186,7 @@ var GUIDE_WORKFLOWS = [
56944
57186
  role: "code-transform-implementer",
56945
57187
  domain: "Executes surgical multi-file edits, applying design patterns while preserving comments and formatting.",
56946
57188
  candidates: [
56947
- { vendor: "x-ai", model: "grok-4.6" },
57189
+ { vendor: "x-ai", model: "grok-4.7" },
56948
57190
  { vendor: "relace", model: "relace-apply-3" },
56949
57191
  { vendor: "openai", model: "gpt-5.3-codex" },
56950
57192
  { vendor: "morph", model: "morph-v3-large" },
@@ -56957,8 +57199,8 @@ var GUIDE_WORKFLOWS = [
56957
57199
  role: "semantic-equivalence-verifier",
56958
57200
  domain: "Critic-with-gate: reviews public contract compliance and behavioral equivalence; deterministic checks remain the fixed witness gate and are never delegated to an LLM.",
56959
57201
  candidates: [
57202
+ { vendor: "openai", model: "gpt-6.1-sol" },
56960
57203
  { vendor: "openai", model: "gpt-5.6-sol" },
56961
- { vendor: "openai", model: "o3-mini-high" },
56962
57204
  { vendor: "deepseek", model: "deepseek-v4-pro-0813" },
56963
57205
  { vendor: "anthropic", model: "claude-opus-5" },
56964
57206
  { vendor: "mistralai", model: "devstral-2512" }
@@ -57016,7 +57258,7 @@ var GUIDE_WORKFLOWS = [
57016
57258
  { vendor: "openai", model: "gpt-6-astra-pro" },
57017
57259
  { vendor: "anthropic", model: "claude-fable-5.1" },
57018
57260
  { vendor: "qwen", model: "qwen3.8-2.4t-a95b" },
57019
- { vendor: "x-ai", model: "grok-4.6" }
57261
+ { vendor: "x-ai", model: "grok-4.7" }
57020
57262
  ]
57021
57263
  },
57022
57264
  {
@@ -57038,7 +57280,7 @@ var GUIDE_WORKFLOWS = [
57038
57280
  role: "iac-cloud-topology-engineer",
57039
57281
  domain: "Generates declarative Terraform/OpenTofu, Pulumi, Kubernetes CRDs, and VPC networking definitions.",
57040
57282
  candidates: [
57041
- { vendor: "x-ai", model: "grok-4.6" },
57283
+ { vendor: "x-ai", model: "grok-4.7" },
57042
57284
  { vendor: "qwen", model: "qwen3.7-plus" },
57043
57285
  { vendor: "openai", model: "gpt-5.3-codex" },
57044
57286
  { vendor: "google", model: "gemini-3.8-flash" },
@@ -57098,7 +57340,7 @@ var GUIDE_WORKFLOWS = [
57098
57340
  role: "documentation-writer",
57099
57341
  domain: "Authors concise, accurate developer and operator documentation with clear terminology, correct command flags, and consistent formatting without marketing drift.",
57100
57342
  candidates: [
57101
- { vendor: "x-ai", model: "grok-4.6" },
57343
+ { vendor: "x-ai", model: "grok-4.7" },
57102
57344
  { vendor: "qwen", model: "qwen3.7-plus" },
57103
57345
  { vendor: "anthropic", model: "claude-sonnet-5" },
57104
57346
  { vendor: "openai", model: "gpt-5.3-codex" },