aiterm-mcp 0.25.1 → 0.25.2

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/README.ja.md CHANGED
@@ -96,6 +96,11 @@ host統合は、kitepon.devの製品開発を支える内部基盤
96
96
 
97
97
  14 ツール: 6 つの **PTY ツール**(`pty_open` / `pty_send` / `pty_read` / `pty_key` / `pty_close` / `pty_list`)で 1 本の永続端末を開き・操作し・読む。加えて 4 つの **エージェント起動ツール**(`claude_agent` / `codex_agent` / `grok_agent` / `composer_agent`)が別のコーディングエージェントの TUI を新しい端末の中に起動し、`agent_configure`が起動中のClaude/Codex/Grok/Composerのmodel・effortを再起動なしで変更し、`claude_turn`がdurable caller向けの構造化issue/recoveryを、`claude_approval`が相関済みClaude承認UI中継を、`diagnostics`が安全なfactory readinessを返す。バックエンドは **tmux** なので、MCP サーバや AI クライアントが再起動してもセッションは生き残る。
98
98
 
99
+ **v0.25.2ではGrok 4.6を含む同一sessionの連続設定変更を安定化。** Grok Build 1.0.3で
100
+ `/model`の成功通知が再描画により消えても、変更前には無かった要求model/effortが常駐footerへ現れた
101
+ 最終状態を確認する。caller側のretry、再起動、失敗の成功丸めは不要で、`grok-4.6`は従来どおり
102
+ 明示`model`としてlive catalog照合後に起動・変更できる。
103
+
99
104
  **v0.25.0ではGrok/Composerへ共通launcher制御を同等実装。** 起動時`reasoning_effort`、
100
105
  `write_scope:"read-only"`の`--sandbox read-only`強制、`agent_configure`による同一session内の
101
106
  model/effort変更に対応した。明示したGrok/Composer modelとComposer既定modelはPTY作成前に
package/README.md CHANGED
@@ -96,6 +96,11 @@ toolchain behind kitepon.dev's products.
96
96
 
97
97
  Fourteen tools: six **PTY tools** — `pty_open` / `pty_send` / `pty_read` / `pty_key` / `pty_close` / `pty_list` — to open, drive, and read one persistent terminal, four **agent launchers** — `claude_agent` / `codex_agent` / `grok_agent` / `composer_agent` — that each start another coding agent's TUI inside a fresh one, `agent_configure` to change a running Claude/Codex/Grok/Composer session's model and effort without restarting it, `claude_turn` for durable structured issue/recovery, `claude_approval` for correlated Claude approval prompts, and `diagnostics` for safe factory readiness. The backend is **tmux**, so sessions survive even if the MCP server or the AI client restarts.
98
98
 
99
+ **v0.25.2 stabilizes repeated in-place configuration changes, including Grok 4.6.** If Grok Build
100
+ 1.0.3 redraws before its `/model` success notice can be observed, aiterm confirms the requested model/effort
101
+ from the persistent footer when that state was absent before the command. Callers do not retry, restart, or
102
+ round a failure into success; explicit `grok-4.6` launch and configuration still pass the live catalog check.
103
+
99
104
  **v0.25.0 gives Grok and Composer the same shared launcher controls.** Their launchers now pass
100
105
  `reasoning_effort`, enforce `write_scope: "read-only"` with `--sandbox read-only`, and support
101
106
  in-place model/effort changes through `agent_configure`. Before creating a PTY, aiterm checks an
package/dist/core.js CHANGED
@@ -3629,8 +3629,24 @@ function lineCounts(screen) {
3629
3629
  }
3630
3630
  return counts;
3631
3631
  }
3632
- async function waitForGrokConfigurationResult(name, before, timeoutMs = 3_000) {
3632
+ function grokFooterHasConfiguration(screen, model, effort) {
3633
+ const modelMatch = model?.match(/^grok-(\d+(?:\.\d+)*)$/) ?? null;
3634
+ if (model && !modelMatch)
3635
+ return false;
3636
+ const modelLabel = modelMatch ? `Grok ${modelMatch[1]}` : null;
3637
+ return screen.split("\n").some((line) => {
3638
+ if (!line.includes("·"))
3639
+ return false;
3640
+ if (modelLabel && !line.includes(`${modelLabel} (`))
3641
+ return false;
3642
+ if (effort && !line.includes(`(${effort})`))
3643
+ return false;
3644
+ return modelLabel !== null || effort !== null;
3645
+ });
3646
+ }
3647
+ async function waitForGrokConfigurationResult(name, before, model, effort, timeoutMs = 3_000) {
3633
3648
  const beforeCounts = lineCounts(before);
3649
+ const footerAlreadyMatched = grokFooterHasConfiguration(before, model, effort);
3634
3650
  const deadline = performance.now() + timeoutMs;
3635
3651
  do {
3636
3652
  const screen = captureScreen(name, AGENT_TUI_READY_LINES);
@@ -3647,6 +3663,10 @@ async function waitForGrokConfigurationResult(name, before, timeoutMs = 3_000) {
3647
3663
  throw new AitermError(`Grokの設定変更に失敗しました: ${error}`, 2);
3648
3664
  if (added.some((line) => /^(?:Switched to |✓?\s*Default model:)/.test(line)))
3649
3665
  return;
3666
+ // Grok Build 1.0.3では成功通知が次の再描画で消えることがある。変更前には無かった
3667
+ // target model/effortが常駐footerへ現れた場合も、vendor自身の最終状態として受理する。
3668
+ if (!footerAlreadyMatched && grokFooterHasConfiguration(screen, model, effort))
3669
+ return;
3650
3670
  await sleep(100);
3651
3671
  } while (performance.now() < deadline);
3652
3672
  throw new AitermError(`${agentLabel(loadAgentMetadata(name).kind)} の設定変更完了を確認できません`, 2);
@@ -3740,7 +3760,7 @@ export async function configureAgent(name, opts) {
3740
3760
  : `/effort ${effort}`;
3741
3761
  const before = captureScreen(name, AGENT_TUI_READY_LINES);
3742
3762
  await sendAgentPromptText(name, command);
3743
- await waitForGrokConfigurationResult(name, before);
3763
+ await waitForGrokConfigurationResult(name, before, model, effort);
3744
3764
  return {
3745
3765
  schema: "aiterm.agent-configure-result.v1",
3746
3766
  session_id: name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiterm-mcp",
3
- "version": "0.25.1",
3
+ "version": "0.25.2",
4
4
  "mcpName": "io.github.kitepon/aiterm-mcp",
5
5
  "description": "Persistent tmux terminal MCP for launching and driving Claude, Codex, Grok, or Composer from any MCP client, cross-vendor or same-vendor. Also runs durable PTY sessions for SSH, containers, and REPLs.",
6
6
  "keywords": [