@kontextmind/kxm 0.7.207 → 0.7.208

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.
@@ -11,7 +11,7 @@
11
11
  "name": "kxm",
12
12
  "source": "./plugins/kxm",
13
13
  "description": "Durable workflows, peer agents, and kxm tui",
14
- "version": "0.7.207",
14
+ "version": "0.7.208",
15
15
  "category": "development",
16
16
  "tags": ["kxm", "multi-agent", "workflows", "mcp"]
17
17
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kontextmind/kxm",
3
- "version": "0.7.207",
3
+ "version": "0.7.208",
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.208",
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
  }
@@ -35592,6 +35592,15 @@ var McpServer = class {
35592
35592
  this._promptHandlersInitialized = false;
35593
35593
  this.server = new Server(serverInfo, options);
35594
35594
  this._maxToolInputElements = resolveMaxToolInputElements(options?.maxToolInputElements);
35595
+ if (options?.capabilities?.tools) {
35596
+ this.setToolRequestHandlers();
35597
+ }
35598
+ if (options?.capabilities?.resources) {
35599
+ this.setResourceRequestHandlers();
35600
+ }
35601
+ if (options?.capabilities?.prompts) {
35602
+ this.setPromptRequestHandlers();
35603
+ }
35595
35604
  }
35596
35605
  /**
35597
35606
  * Access experimental features.
@@ -41883,6 +41892,9 @@ function detectCapabilitiesFromEnvironment(tmuxForwardsHyperlink) {
41883
41892
  if (termProgram === "herdr") {
41884
41893
  return { images: "kitty", trueColor: hasTrueColorHint, hyperlinks: true };
41885
41894
  }
41895
+ if (termProgram === "rex") {
41896
+ return { images: "kitty", trueColor: true, hyperlinks: true };
41897
+ }
41886
41898
  if (process.env.KITTY_WINDOW_ID || termProgram === "kitty") {
41887
41899
  return { images: "kitty", trueColor: true, hyperlinks: true };
41888
41900
  }
@@ -42249,6 +42261,26 @@ var TuiBase = class _TuiBase extends Container {
42249
42261
  }
42250
42262
  afterTerminalStop(_options) {
42251
42263
  }
42264
+ /** Mode resets written before the terminal's own resets when the process exits without stop(). */
42265
+ getExitRestorePrefix() {
42266
+ return `${this.terminalColorSchemeNotificationsEnabled ? "\x1B[?2031l" : ""}\x1B[?25h`;
42267
+ }
42268
+ /** Mode resets written after the terminal's own resets when the process exits without stop(). */
42269
+ getExitRestoreSuffix() {
42270
+ return "";
42271
+ }
42272
+ /**
42273
+ * Last-resort restore for exit paths that skip stop(), e.g. a direct process.exit() (#11170).
42274
+ * Hard kills and native aborts run no JavaScript and cannot be covered.
42275
+ */
42276
+ exitRestoreHandler = () => {
42277
+ if (this.stopped)
42278
+ return;
42279
+ try {
42280
+ this.terminal.restoreOnExit?.(this.getExitRestorePrefix(), this.getExitRestoreSuffix());
42281
+ } catch {
42282
+ }
42283
+ };
42252
42284
  get fullRedraws() {
42253
42285
  return this.fullRedrawCount;
42254
42286
  }
@@ -42565,6 +42597,8 @@ var TuiBase = class _TuiBase extends Container {
42565
42597
  }
42566
42598
  start() {
42567
42599
  this.stopped = false;
42600
+ process.off("exit", this.exitRestoreHandler);
42601
+ process.on("exit", this.exitRestoreHandler);
42568
42602
  this.beforeTerminalStart();
42569
42603
  this.terminal.start((data) => this.handleTerminalInput(data), () => this.requestRender());
42570
42604
  this.afterTerminalStart();
@@ -42607,6 +42641,7 @@ var TuiBase = class _TuiBase extends Container {
42607
42641
  }
42608
42642
  stop(options = {}) {
42609
42643
  this.stopped = true;
42644
+ process.off("exit", this.exitRestoreHandler);
42610
42645
  this.cancelRenderTimer();
42611
42646
  if (this.terminalColorSchemeNotificationsEnabled) {
42612
42647
  this.terminal.write("\x1B[?2031l");
@@ -44096,6 +44131,183 @@ var Input = class {
44096
44131
  }
44097
44132
  };
44098
44133
 
44134
+ // node_modules/marked-cjk-friendly/dist/index.js
44135
+ 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}";
44136
+ var cjkTest = new RegExp(`[${CJK}]`, "u");
44137
+ var punctuationCjk = new RegExp(`^((?![*_])[\\s\\p{P}\\p{S}${CJK}])`, "u");
44138
+ function buildRDelimAst(punct, punctSpace, notPunctSpace) {
44139
+ return new RegExp(`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)${punct}(\\*+)(?=[\\s]|$)|${notPunctSpace}(\\*+)(?!\\*)(?=${punctSpace}|$)|(?!\\*)${punctSpace}(\\*+)(?=${notPunctSpace})|[\\s](\\*+)(?!\\*)(?=${punct})|(?!\\*)${punct}(\\*+)(?!\\*)(?=${punct})|${notPunctSpace}(\\*+)(?=${notPunctSpace})`, "gu");
44140
+ }
44141
+ function buildRDelimUnd(punct, punctSpace, notPunctSpace) {
44142
+ return new RegExp(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)${punct}(_+)(?=[\\s]|$)|${notPunctSpace}(_+)(?!_)(?=${punctSpace}|$)|(?!_)${punctSpace}(_+)(?=${notPunctSpace})|[\\s](_+)(?!_)(?=${punct})|(?!_)${punct}(_+)(?!_)(?=${punct})`, "gu");
44143
+ }
44144
+ function buildRDelimDel(punct, punctSpace, notPunctSpace) {
44145
+ return new RegExp(`^[^~]+(?=[^~])|(?!~)${punct}(~~?)(?=[\\s]|$)|${notPunctSpace}(~~?)(?!~)(?=${punctSpace}|$)|(?!~)${punctSpace}(~~?)(?=${notPunctSpace})|[\\s](~~?)(?!~)(?=${punct})|(?!~)${punct}(~~?)(?!~)(?=${punct})|${notPunctSpace}(~~?)(?=${notPunctSpace})`, "gu");
44146
+ }
44147
+ var cjkPunct = `[\\p{P}\\p{S}${CJK}]`;
44148
+ var cjkPunctSpace = `[\\s\\p{P}\\p{S}${CJK}]`;
44149
+ var cjkNotPunctSpace = `[^\\s\\p{P}\\p{S}${CJK}]`;
44150
+ var cjkDelPunct = `(?![*_])[\\p{P}\\p{S}${CJK}]`;
44151
+ var cjkDelPunctSpace = `(?![*_])[\\s\\p{P}\\p{S}${CJK}]`;
44152
+ var cjkDelNotPunctSpace = `(?:[^\\s\\p{P}\\p{S}${CJK}]|[*_])`;
44153
+ var cjkPunctGfm = `(?!~)[\\p{P}\\p{S}${CJK}]`;
44154
+ var cjkPunctSpaceGfm = `(?!~)[\\s\\p{P}\\p{S}${CJK}]`;
44155
+ var cjkNotPunctSpaceGfm = `(?:[^\\s\\p{P}\\p{S}${CJK}]|~)`;
44156
+ var emStrongRDelimAstCjk = buildRDelimAst(cjkPunct, cjkPunctSpace, cjkNotPunctSpace);
44157
+ var emStrongRDelimAstCjkGfm = buildRDelimAst(cjkPunctGfm, cjkPunctSpaceGfm, cjkNotPunctSpaceGfm);
44158
+ var emStrongRDelimUndCjk = buildRDelimUnd(cjkPunct, cjkPunctSpace, cjkNotPunctSpace);
44159
+ var delRDelimCjk = buildRDelimDel(cjkDelPunct, cjkDelPunctSpace, cjkDelNotPunctSpace);
44160
+ function isPrevCharCjk(prevChar, maskedSrc, src) {
44161
+ let prevIsCjk = punctuationCjk.test(prevChar);
44162
+ if (!prevIsCjk && prevChar) {
44163
+ const prevIdx = maskedSrc.length - src.length;
44164
+ if (prevIdx >= 1) {
44165
+ let idx = prevIdx - 1;
44166
+ let code = maskedSrc.charCodeAt(idx);
44167
+ if (code >= 65024 && code <= 65038 && idx >= 1) {
44168
+ idx--;
44169
+ code = maskedSrc.charCodeAt(idx);
44170
+ }
44171
+ if ((code & 64512) === 56320 && idx >= 1) {
44172
+ const cp = maskedSrc.codePointAt(idx - 1);
44173
+ if (cp !== void 0 && cp > 65535) {
44174
+ if (cp >= 917760 && cp <= 917999) prevIsCjk = true;
44175
+ else prevIsCjk = cjkTest.test(String.fromCodePoint(cp));
44176
+ }
44177
+ } else prevIsCjk = cjkTest.test(String.fromCharCode(code));
44178
+ }
44179
+ }
44180
+ return prevIsCjk;
44181
+ }
44182
+ function isCjkAdjacentToDelimiter(rightMatch, clippedMaskedSrc) {
44183
+ if (!(rightMatch[1] || rightMatch[2] || rightMatch[3] || rightMatch[4])) return false;
44184
+ const charBefore = String.fromCodePoint(rightMatch[0].codePointAt(0));
44185
+ const afterPos = rightMatch.index + rightMatch[0].length;
44186
+ const charAfter = afterPos < clippedMaskedSrc.length ? String.fromCodePoint(clippedMaskedSrc.codePointAt(afterPos)) : "";
44187
+ return cjkTest.test(charBefore) || cjkTest.test(charAfter);
44188
+ }
44189
+ function usesModernEmStrongLayout(match) {
44190
+ return match.length >= 5;
44191
+ }
44192
+ function hasEmStrongLeadContent(match) {
44193
+ return Boolean(match[1] || match[2] || match[3] || match[4]);
44194
+ }
44195
+ function isEmStrongUnderscoreWordChar(match) {
44196
+ return usesModernEmStrongLayout(match) ? Boolean(match[4]) : Boolean(match[3]);
44197
+ }
44198
+ function getEmStrongOpeningPunctuation(match) {
44199
+ if (usesModernEmStrongLayout(match)) return match[1] || match[3] || "";
44200
+ return match[1] || match[2] || "";
44201
+ }
44202
+ function markedCjkFriendly() {
44203
+ return { tokenizer: {
44204
+ emStrong(src, maskedSrc, prevChar = "") {
44205
+ const { rules } = this;
44206
+ const match = rules.inline.emStrongLDelim.exec(src);
44207
+ if (!match) return false;
44208
+ const modernEmStrongLayout = usesModernEmStrongLayout(match);
44209
+ if (modernEmStrongLayout && !hasEmStrongLeadContent(match)) return;
44210
+ if (isEmStrongUnderscoreWordChar(match) && prevChar.match(rules.other.unicodeAlphaNumeric)) return false;
44211
+ const nextChar = getEmStrongOpeningPunctuation(match);
44212
+ const prevIsCjk = isPrevCharCjk(prevChar, maskedSrc, src);
44213
+ if (!nextChar || !prevChar || rules.inline.punctuation.exec(prevChar) || prevIsCjk || cjkTest.test(nextChar)) {
44214
+ const lLength = [...match[0]].length - 1;
44215
+ let rDelim;
44216
+ let rLength;
44217
+ let delimTotal = lLength;
44218
+ let midDelimTotal = 0;
44219
+ const prevCharIsSameDelimiter = modernEmStrongLayout && prevChar === match[0][0];
44220
+ const isGfm = rules.inline.emStrongRDelimAst.source.includes("(?!~)");
44221
+ let endReg;
44222
+ if (match[0][0] === "*") endReg = isGfm ? emStrongRDelimAstCjkGfm : emStrongRDelimAstCjk;
44223
+ else endReg = emStrongRDelimUndCjk;
44224
+ endReg.lastIndex = 0;
44225
+ const clippedMaskedSrc = maskedSrc.slice(-1 * src.length + lLength);
44226
+ let rMatch;
44227
+ while ((rMatch = endReg.exec(clippedMaskedSrc)) != null) {
44228
+ rDelim = rMatch[1] || rMatch[2] || rMatch[3] || rMatch[4] || rMatch[5] || rMatch[6];
44229
+ if (!rDelim) continue;
44230
+ rLength = [...rDelim].length;
44231
+ const isCjkAdjacent = isCjkAdjacentToDelimiter(rMatch, clippedMaskedSrc);
44232
+ const isLeftOnly = Boolean(rMatch[3] || rMatch[4]);
44233
+ const isBoth = Boolean(rMatch[5] || rMatch[6]);
44234
+ if (isLeftOnly && !isCjkAdjacent) {
44235
+ delimTotal += rLength;
44236
+ continue;
44237
+ }
44238
+ if (isBoth || isCjkAdjacent) {
44239
+ if (lLength % 3 && !((lLength + rLength) % 3)) {
44240
+ midDelimTotal += rLength;
44241
+ continue;
44242
+ }
44243
+ if (prevCharIsSameDelimiter && isBoth) break;
44244
+ }
44245
+ delimTotal -= rLength;
44246
+ if (delimTotal > 0) continue;
44247
+ rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
44248
+ const lastCharLength = rMatch[0].codePointAt(0) > 65535 ? 2 : 1;
44249
+ const raw = src.slice(0, lLength + rMatch.index + lastCharLength + rLength);
44250
+ if (Math.min(lLength, rLength) % 2) {
44251
+ const text2 = raw.slice(1, -1);
44252
+ return {
44253
+ type: "em",
44254
+ raw,
44255
+ text: text2,
44256
+ tokens: this.lexer.inlineTokens(text2)
44257
+ };
44258
+ }
44259
+ const text = raw.slice(2, -2);
44260
+ return {
44261
+ type: "strong",
44262
+ raw,
44263
+ text,
44264
+ tokens: this.lexer.inlineTokens(text)
44265
+ };
44266
+ }
44267
+ }
44268
+ },
44269
+ del(src, maskedSrc, prevChar = "") {
44270
+ const { rules } = this;
44271
+ const match = rules.inline.delLDelim.exec(src);
44272
+ if (!match) return false;
44273
+ const nextChar = match[1] || "";
44274
+ const prevIsCjk = isPrevCharCjk(prevChar, maskedSrc, src);
44275
+ if (!nextChar || !prevChar || rules.inline.punctuation.exec(prevChar) || prevIsCjk || cjkTest.test(nextChar)) {
44276
+ const lLength = [...match[0]].length - 1;
44277
+ let rDelim;
44278
+ let rLength;
44279
+ let delimTotal = lLength;
44280
+ delRDelimCjk.lastIndex = 0;
44281
+ const clippedMaskedSrc = maskedSrc.slice(-1 * src.length + lLength);
44282
+ let rMatch;
44283
+ while ((rMatch = delRDelimCjk.exec(clippedMaskedSrc)) != null) {
44284
+ rDelim = rMatch[1] || rMatch[2] || rMatch[3] || rMatch[4] || rMatch[5] || rMatch[6];
44285
+ if (!rDelim) continue;
44286
+ rLength = [...rDelim].length;
44287
+ if (rLength !== lLength) continue;
44288
+ const isCjkAdjacent = isCjkAdjacentToDelimiter(rMatch, clippedMaskedSrc);
44289
+ if ((rMatch[3] || rMatch[4]) && !isCjkAdjacent) {
44290
+ delimTotal += rLength;
44291
+ continue;
44292
+ }
44293
+ delimTotal -= rLength;
44294
+ if (delimTotal > 0) continue;
44295
+ rLength = Math.min(rLength, rLength + delimTotal);
44296
+ const lastCharLength = rMatch[0].codePointAt(0) > 65535 ? 2 : 1;
44297
+ const raw = src.slice(0, lLength + rMatch.index + lastCharLength + rLength);
44298
+ const text = raw.slice(lLength, -lLength);
44299
+ return {
44300
+ type: "del",
44301
+ raw,
44302
+ text,
44303
+ tokens: this.lexer.inlineTokens(text)
44304
+ };
44305
+ }
44306
+ }
44307
+ }
44308
+ } };
44309
+ }
44310
+
44099
44311
  // node_modules/@earendil-works/pi-tui/dist/components/markdown.js
44100
44312
  var STRICT_STRIKETHROUGH_REGEX = /^(~~)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/;
44101
44313
  var StrictStrikethroughTokenizer = class extends y {
@@ -44166,21 +44378,32 @@ function tokenizeInlineLatex(source) {
44166
44378
  const raw = source.slice(0, closingIndex + closing.length);
44167
44379
  return { type: "latex", raw, text };
44168
44380
  }
44381
+ var TABLE_DELIMITER_ROW_REGEX = /^ {0,3}\|?[ \t]*:?-+:?[ \t]*(?:\|[ \t]*:?-+:?[ \t]*)*\|?[ \t]*$/;
44382
+ function containsTableStart(source) {
44383
+ const lines = source.split("\n");
44384
+ for (let index = 0; index < lines.length - 1; index++) {
44385
+ const delimiterRow = lines[index + 1];
44386
+ if ((delimiterRow.includes("|") || lines[index].includes("|")) && TABLE_DELIMITER_ROW_REGEX.test(delimiterRow)) {
44387
+ return true;
44388
+ }
44389
+ }
44390
+ return false;
44391
+ }
44169
44392
  function tokenizeBlockLatex(source) {
44170
44393
  const dollarMatch = /^ {0,3}\$\$[ \t]*(?:\n)?([\s\S]*?)\$\$[ \t]*(?:\n|$)/.exec(source);
44171
- if (dollarMatch?.[1]) {
44394
+ if (dollarMatch?.[1] && !containsTableStart(dollarMatch[1])) {
44172
44395
  return { type: "latexBlock", raw: dollarMatch[0], text: dollarMatch[1].trim() };
44173
44396
  }
44174
44397
  const bracketMatch = /^ {0,3}\\\[[ \t]*(?:\n)?([\s\S]*?)\\\][ \t]*(?:\n|$)/.exec(source);
44175
- if (bracketMatch?.[1]) {
44398
+ if (bracketMatch?.[1] && !containsTableStart(bracketMatch[1])) {
44176
44399
  return { type: "latexBlock", raw: bracketMatch[0], text: bracketMatch[1].trim() };
44177
44400
  }
44178
44401
  const pendingBracket = /^ {0,3}\\\[[ \t]*(?:\n)?([\s\S]*)$/.exec(source);
44179
- if (pendingBracket) {
44402
+ if (pendingBracket?.[1] && !containsTableStart(pendingBracket[1])) {
44180
44403
  return { type: "latexBlock", raw: pendingBracket[0], text: pendingBracket[1], pending: true };
44181
44404
  }
44182
44405
  const pendingDollar = /^ {0,3}\$\$[ \t]*(?:\n)?([\s\S]*)$/.exec(source);
44183
- if (pendingDollar?.[1] && looksLikePendingDollarMath(pendingDollar[1])) {
44406
+ if (pendingDollar?.[1] && looksLikePendingDollarMath(pendingDollar[1]) && !containsTableStart(pendingDollar[1])) {
44184
44407
  return { type: "latexBlock", raw: pendingDollar[0], text: pendingDollar[1], pending: true };
44185
44408
  }
44186
44409
  return void 0;
@@ -44209,7 +44432,10 @@ var markdownParser = new Z();
44209
44432
  markdownParser.setOptions({
44210
44433
  tokenizer: new StrictStrikethroughTokenizer()
44211
44434
  });
44212
- markdownParser.use({ extensions: [...LATEX_MARKDOWN_EXTENSIONS] });
44435
+ markdownParser.use({
44436
+ tokenizer: { emStrong: markedCjkFriendly().tokenizer?.emStrong },
44437
+ extensions: [...LATEX_MARKDOWN_EXTENSIONS]
44438
+ });
44213
44439
 
44214
44440
  // node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js
44215
44441
  var ScrollView = class extends Container {
@@ -45369,6 +45595,15 @@ var TuiAltScreen = class extends TuiBase {
45369
45595
  this.savedCapabilities = void 0;
45370
45596
  }
45371
45597
  }
45598
+ getExitRestorePrefix() {
45599
+ const prefix = super.getExitRestorePrefix();
45600
+ if (!this.altScreenActive)
45601
+ return prefix;
45602
+ return `${END_SYNCHRONIZED_OUTPUT}${this.mouseEnabled ? DISABLE_MOUSE : ""}${ENABLE_AUTOWRAP}${prefix}`;
45603
+ }
45604
+ getExitRestoreSuffix() {
45605
+ return `${super.getExitRestoreSuffix()}${this.altScreenActive ? `${EXIT_ALT_SCREEN}\x1B[?25h` : ""}`;
45606
+ }
45372
45607
  deleteKittyImages() {
45373
45608
  return this.imageProtocol === "kitty" ? deleteAllKittyImages() : "";
45374
45609
  }
@@ -25462,7 +25462,7 @@ function sessionTokenFixHint(policy) {
25462
25462
  }
25463
25463
 
25464
25464
  // plugins/kxm/src/mcp-server.ts
25465
- var VERSION = "0.7.207";
25465
+ var VERSION = "0.7.208";
25466
25466
  var CONFIGURE_PLUGIN = "/plugin configure kxm@kxm";
25467
25467
  var inbox = /* @__PURE__ */ new Map();
25468
25468
  var notifiedInbox = /* @__PURE__ */ new Set();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-plugin",
3
- "version": "0.7.207",
3
+ "version": "0.7.208",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "engines": {
@@ -11,7 +11,7 @@ import { deliverInboxNotification } from "./inbox.ts";
11
11
  import type { HubEvent, MessageRecord } from "./protocol.ts";
12
12
  import { sessionTokenFixHint } from "./session-token-hint.ts";
13
13
 
14
- const VERSION = "0.7.207";
14
+ const VERSION = "0.7.208";
15
15
  const CONFIGURE_PLUGIN = "/plugin configure kxm@kxm";
16
16
  const inbox = new Map<string, MessageRecord>();
17
17
  const notifiedInbox = new Set<string>();