@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.
@@ -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.209";
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.209",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "engines": {
@@ -61,9 +61,10 @@ export interface GuideWorkflow {
61
61
  const ADMITTED_GUIDE_BINDINGS: Readonly<Record<string, AgentBinding>> = Object.freeze({
62
62
  "anthropic/claude-fable-5.1": { harness: "claude", provider: "anthropic", model: "fable" },
63
63
  "anthropic/fable": { harness: "claude", provider: "anthropic", model: "fable" },
64
+ "openai/gpt-6.1-sol": { harness: "codex", provider: "openai", model: "gpt-6.1-sol" },
64
65
  "openai/gpt-5.6-sol": { harness: "codex", provider: "openai", model: "gpt-5.6-sol" },
65
- "x-ai/grok-4.6": { harness: "grok", provider: "xai", model: "grok-4.6" },
66
- "xai/grok-4.6": { harness: "grok", provider: "xai", model: "grok-4.6" },
66
+ "x-ai/grok-4.7": { harness: "grok", provider: "xai", model: "grok-4.7" },
67
+ "xai/grok-4.7": { harness: "grok", provider: "xai", model: "grok-4.7" },
67
68
  "qwen/qwen3.7-plus": { harness: "pi", provider: "openrouter", model: "qwen/qwen3.7-plus" },
68
69
  });
69
70
 
@@ -84,7 +85,7 @@ export const GUIDE_WORKFLOWS: readonly GuideWorkflow[] = [
84
85
  { vendor: "anthropic", model: "claude-fable-5.1" },
85
86
  { vendor: "deepseek", model: "deepseek-v4-pro-0813" },
86
87
  { vendor: "openai", model: "gpt-6-astra-pro" },
87
- { vendor: "x-ai", model: "grok-4.6" },
88
+ { vendor: "x-ai", model: "grok-4.7" },
88
89
  { vendor: "qwen", model: "qwen3.8-max-0902" },
89
90
  ],
90
91
  },
@@ -107,11 +108,11 @@ export const GUIDE_WORKFLOWS: readonly GuideWorkflow[] = [
107
108
  role: "scaffold-build-specialist",
108
109
  domain: "Provisions monorepo workspace topologies, linters, Docker multi-stage builds, and CI pipelines.",
109
110
  candidates: [
110
- { vendor: "x-ai", model: "grok-4.6" },
111
+ { vendor: "x-ai", model: "grok-4.7" },
111
112
  { vendor: "mistralai", model: "devstral-2512" },
112
113
  { vendor: "qwen", model: "qwen3.7-plus" },
113
114
  { vendor: "openai", model: "gpt-5.3-codex" },
114
- { vendor: "kwaipilot", model: "kat-coder-pro-v2.5" },
115
+ { vendor: "qwen", model: "qwen3-coder" },
115
116
  ],
116
117
  },
117
118
  {
@@ -120,11 +121,11 @@ export const GUIDE_WORKFLOWS: readonly GuideWorkflow[] = [
120
121
  role: "backend-data-implementer",
121
122
  domain: "Implements domain entities, SQL queries/migrations, ORM persistence, concurrency primitives, and transactional boundaries.",
122
123
  candidates: [
123
- { vendor: "x-ai", model: "grok-4.6" },
124
+ { vendor: "x-ai", model: "grok-4.7" },
124
125
  { vendor: "qwen", model: "qwen3.7-plus" },
125
126
  { vendor: "deepseek", model: "deepseek-v4-pro-0813" },
126
127
  { vendor: "openai", model: "gpt-5.3-codex" },
127
- { vendor: "kwaipilot", model: "kat-coder-pro-v2.5" },
128
+ { vendor: "qwen", model: "qwen3-coder" },
128
129
  ],
129
130
  },
130
131
  {
@@ -135,7 +136,7 @@ export const GUIDE_WORKFLOWS: readonly GuideWorkflow[] = [
135
136
  candidates: [
136
137
  { vendor: "anthropic", model: "claude-sonnet-5" },
137
138
  { vendor: "google", model: "gemini-3.8-flash" },
138
- { vendor: "x-ai", model: "grok-4.6" },
139
+ { vendor: "x-ai", model: "grok-4.7" },
139
140
  { vendor: "bytedance-seed", model: "seed-2.0-code" },
140
141
  { vendor: "openai", model: "gpt-5.3-codex" },
141
142
  ],
@@ -147,7 +148,7 @@ export const GUIDE_WORKFLOWS: readonly GuideWorkflow[] = [
147
148
  domain: "Wires external APIs, authentication flows (OAuth2/OIDC), webhook validation, cloud SDKs, and async worker queues.",
148
149
  candidates: [
149
150
  { vendor: "openai", model: "gpt-5.6-sol" },
150
- { vendor: "x-ai", model: "grok-4.6" },
151
+ { vendor: "x-ai", model: "grok-4.7" },
151
152
  { vendor: "qwen", model: "qwen3.7-plus" },
152
153
  { vendor: "deepseek", model: "deepseek-v4-pro-0813" },
153
154
  { vendor: "google", model: "gemini-3.8-flash" },
@@ -180,7 +181,7 @@ export const GUIDE_WORKFLOWS: readonly GuideWorkflow[] = [
180
181
  role: "code-transform-implementer",
181
182
  domain: "Executes surgical multi-file edits, applying design patterns while preserving comments and formatting.",
182
183
  candidates: [
183
- { vendor: "x-ai", model: "grok-4.6" },
184
+ { vendor: "x-ai", model: "grok-4.7" },
184
185
  { vendor: "relace", model: "relace-apply-3" },
185
186
  { vendor: "openai", model: "gpt-5.3-codex" },
186
187
  { vendor: "morph", model: "morph-v3-large" },
@@ -193,8 +194,8 @@ export const GUIDE_WORKFLOWS: readonly GuideWorkflow[] = [
193
194
  role: "semantic-equivalence-verifier",
194
195
  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.",
195
196
  candidates: [
197
+ { vendor: "openai", model: "gpt-6.1-sol" },
196
198
  { vendor: "openai", model: "gpt-5.6-sol" },
197
- { vendor: "openai", model: "o3-mini-high" },
198
199
  { vendor: "deepseek", model: "deepseek-v4-pro-0813" },
199
200
  { vendor: "anthropic", model: "claude-opus-5" },
200
201
  { vendor: "mistralai", model: "devstral-2512" },
@@ -252,7 +253,7 @@ export const GUIDE_WORKFLOWS: readonly GuideWorkflow[] = [
252
253
  { vendor: "openai", model: "gpt-6-astra-pro" },
253
254
  { vendor: "anthropic", model: "claude-fable-5.1" },
254
255
  { vendor: "qwen", model: "qwen3.8-2.4t-a95b" },
255
- { vendor: "x-ai", model: "grok-4.6" },
256
+ { vendor: "x-ai", model: "grok-4.7" },
256
257
  ],
257
258
  },
258
259
  {
@@ -274,7 +275,7 @@ export const GUIDE_WORKFLOWS: readonly GuideWorkflow[] = [
274
275
  role: "iac-cloud-topology-engineer",
275
276
  domain: "Generates declarative Terraform/OpenTofu, Pulumi, Kubernetes CRDs, and VPC networking definitions.",
276
277
  candidates: [
277
- { vendor: "x-ai", model: "grok-4.6" },
278
+ { vendor: "x-ai", model: "grok-4.7" },
278
279
  { vendor: "qwen", model: "qwen3.7-plus" },
279
280
  { vendor: "openai", model: "gpt-5.3-codex" },
280
281
  { vendor: "google", model: "gemini-3.8-flash" },
@@ -334,7 +335,7 @@ export const GUIDE_WORKFLOWS: readonly GuideWorkflow[] = [
334
335
  role: "documentation-writer",
335
336
  domain: "Authors concise, accurate developer and operator documentation with clear terminology, correct command flags, and consistent formatting without marketing drift.",
336
337
  candidates: [
337
- { vendor: "x-ai", model: "grok-4.6" },
338
+ { vendor: "x-ai", model: "grok-4.7" },
338
339
  { vendor: "qwen", model: "qwen3.7-plus" },
339
340
  { vendor: "anthropic", model: "claude-sonnet-5" },
340
341
  { vendor: "openai", model: "gpt-5.3-codex" },
@@ -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.209";
15
15
  const CONFIGURE_PLUGIN = "/plugin configure kxm@kxm";
16
16
  const inbox = new Map<string, MessageRecord>();
17
17
  const notifiedInbox = new Set<string>();