aiterm-mcp 0.29.7 → 0.29.8
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 +9 -9
- package/README.md +12 -12
- package/dist/agent-shared.js +1 -1
- package/dist/claude-stop-hook.js +1 -1
- package/dist/harnesses/claude.js +9 -1
- package/dist/index.js +1 -1
- package/dist/state-root.js +7 -0
- package/package.json +1 -1
package/README.ja.md
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
>
|
|
21
21
|
> **これは何か:** AI が握る 1 本の永続 MCP 端末——その中に他のコーディングエージェントも起動できる。`ssh`・`docker exec`・REPL・別エージェントの TUI は、すべてその 1 本の端末の中へ「送るだけのテキスト」として入れ子になる。仕組みはあえて素朴——MCP クライアントが相手エージェントの端末を 1 ターンずつ操作するだけ。隠れたプロトコルも・aiterm独自の共有メモリ層も・自律的な交渉も無い。起動したagentは、直接CLIと同じproject/harnessの通常memory・設定を読む。
|
|
22
22
|
>
|
|
23
|
-
>
|
|
23
|
+
> **人が端末に張り付く必要はない。** aiterm は MCP 越しにプログラムから駆動されるので、「AI が別のエージェントを起動して操作する」のに端末の前に誰も座らなくていい——オーケストレーションのループ・CI ステップ・cron から動かせる。
|
|
24
24
|
>
|
|
25
25
|
> *MCP = Model Context Protocol — Claude Code のようなツールが AI に機能を差し込むためのオープン標準。*
|
|
26
26
|
|
|
@@ -35,7 +35,7 @@ cloneもビルドも不要。どのクライアントでも公開パッケージ
|
|
|
35
35
|
npx -y aiterm-mcp
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
**Node.js ≥ 18**
|
|
38
|
+
**Node.js ≥ 18** と対応multiplexer backend(POSIXは**tmux**、Windows nativeは**psmux 3.3.8以上**)が必要。Codexを操作する場合は、Codex CLIの導入と認証も必要。
|
|
39
39
|
|
|
40
40
|
### Claude Code
|
|
41
41
|
|
|
@@ -94,7 +94,7 @@ host統合は、kitepon.devの製品開発を支える内部基盤
|
|
|
94
94
|
|
|
95
95
|
**言葉でなく実測で:** 記録済み203テストのベンチマークでは、`pty_read` はコンテキストに載るトークンを生ログの **約 7.1 分の 1** に減らす。しかも pass/fail の判定は畳んでも残る。→ [組み込みシェルツールとの使い分け](#組み込みシェルツールとの使い分け)
|
|
96
96
|
|
|
97
|
-
15ツール: 6つのPTYツール、正規のagent起動入口`agent_launch`、移行用の旧4alias、`agent_configure`、`claude_turn`、`claude_approval`、`diagnostics
|
|
97
|
+
15ツール: 6つのPTYツール、正規のagent起動入口`agent_launch`、移行用の旧4alias、`agent_configure`、`claude_turn`、`claude_approval`、`diagnostics`。backendはPOSIXのtmux/Windows nativeのpsmuxなので、MCPサーバやAIクライアントが再起動してもsessionは生き残る。
|
|
98
98
|
|
|
99
99
|
**v0.28.0では実行基盤harnessとmodelを分離した。** harnessはagent loop・認証・hook・session・transcriptを所有し、modelはその上で選ぶ。Cursor Agent CLIでGPT/Claude/Grokを選んでも完了契約はCursor方式のまま。Composerは別harnessではなく、`harness:"grok-cli", model:"grok-composer-2.5-fast"`で表す。旧4起動ツールは同じ実装へ流れる互換alias。
|
|
100
100
|
|
|
@@ -109,7 +109,7 @@ model/effort変更に対応した。明示したGrok/Composer modelとCompos
|
|
|
109
109
|
現在の`grok models` catalogへ照合し、不在時は別modelへ黙ってfallbackせず明示失敗する。
|
|
110
110
|
|
|
111
111
|
**v0.24.3ではlauncherへ渡す環境変数を現在のMCP processから明示選択できる。** `env_vars`へ
|
|
112
|
-
変数名だけを指定すると、aitermは起動時の現在値を読み、存在する値だけをそのagentへ渡す。永続
|
|
112
|
+
変数名だけを指定すると、aitermは起動時の現在値を読み、存在する値だけをそのagentへ渡す。永続multiplexer
|
|
113
113
|
serverがMCP processより先に起動していても、古いserver環境に席identityやworkflow変数を消されない。
|
|
114
114
|
あわせてCodex v0.147が長寿命footerへ加える任意`fast`を認識し、idleな`medium fast ·` sessionでも
|
|
115
115
|
再描画・再試行・再起動なしに`agent_configure`できる。
|
|
@@ -163,7 +163,7 @@ Publishing)で公開し、GitHub Release が Official MCP Registry を再登
|
|
|
163
163
|
|
|
164
164
|
### 1. SSH・コンテナ・REPL を 1 本の永続端末で操作する — 土台
|
|
165
165
|
|
|
166
|
-
これが土台で、tmux
|
|
166
|
+
これが土台で、platform backend(POSIXのtmux/Windows nativeのpsmux)だけで動く——他の CLI は要らない。`pty_open` がローカル端末を 1 個握り、`ssh host`・`docker exec -it x bash`・REPL は、その中へ `pty_send` で打ち込む「ただのテキスト」——**一度だけ**。以降のコマンドは同じ認証済みセッションを通る。セッション種別をツールで区別しない。
|
|
167
167
|
|
|
168
168
|
```
|
|
169
169
|
pty_open() → ローカル端末を 1 個握る
|
|
@@ -208,7 +208,7 @@ Cursorの`model`は`gpt-5.6-luna`のようなbase model、`reasoning_effort`は`
|
|
|
208
208
|
`env_vars`は環境変数の**名前**だけを並べるallowlistであり、name/value mapではない。aitermは
|
|
209
209
|
launcher起動時に現在のMCP processから各名前を読み、存在する値をshell quoteして、その1回のvendor
|
|
210
210
|
起動コマンドへ入れる。未設定名は省略し、shell変数名として不正な名前はsession作成前に失敗する。
|
|
211
|
-
全環境の暗黙copy、
|
|
211
|
+
全環境の暗黙copy、backend server再起動、retry、fallbackは行わない。値はMCP tool引数には入らないが、
|
|
212
212
|
PTYの起動コマンドとして送られ、sessionの`.lastcmd`にも保持されるため、起動先vendorと同じOS userへ
|
|
213
213
|
到達する。秘密転送路ではなく、席identityやworkflow用の非secret変数だけに使う。
|
|
214
214
|
|
|
@@ -268,7 +268,7 @@ Throughline自体が不要である。
|
|
|
268
268
|
← 499999500000 [is_complete=True via until]
|
|
269
269
|
```
|
|
270
270
|
|
|
271
|
-
上の採取で私が触ったのは 2 本の `⋮` 行(長い head/tail を README 用に省略)と長すぎる grep 行 1 本の truncate だけ——`〈…〉` マーカー・トークン数・各 `is_complete` はツールが出した通り。(`until` は末尾スペース無しの `">>>"` を使う——採取されるプロンプトは末尾が削られるので `">>> "` だと外れて `timeout` に落ちる。)ネスト中は `until`(内側プロンプト)か `mark: true` を渡すこと——そこでは quiescence が原理的に効かないため([完了検出](#完了検出5-層) / [既知の制約](#既知の制約バグではなく仕様))。同じ
|
|
271
|
+
上の採取で私が触ったのは 2 本の `⋮` 行(長い head/tail を README 用に省略)と長すぎる grep 行 1 本の truncate だけ——`〈…〉` マーカー・トークン数・各 `is_complete` はツールが出した通り。(`until` は末尾スペース無しの `">>>"` を使う——採取されるプロンプトは末尾が削られるので `">>> "` だと外れて `timeout` に落ちる。)ネスト中は `until`(内側プロンプト)か `mark: true` を渡すこと——そこでは quiescence が原理的に効かないため([完了検出](#完了検出5-層) / [既知の制約](#既知の制約バグではなく仕様))。同じmultiplexer backendに人が `attach` すれば、これらをライブで覗ける([人が覗く](#人が覗く))。
|
|
272
272
|
|
|
273
273
|
## 最初の実行(約60秒)
|
|
274
274
|
|
|
@@ -281,7 +281,7 @@ Claude Code を再起動して、接続を確認:
|
|
|
281
281
|
最初のセッション——4 回の呼び出しで、1 個の永続端末:
|
|
282
282
|
|
|
283
283
|
```text
|
|
284
|
-
pty_open() → { session_id: "t1", attach: "
|
|
284
|
+
pty_open() → { session_id: "t1", attach: "<platform attach command>" }
|
|
285
285
|
pty_send("t1", "echo hello") → PTY にコマンドを送る
|
|
286
286
|
pty_read("t1", { wait: true }) → "hello" (トークン削減・完了検出つき)
|
|
287
287
|
pty_close("t1") → 端末を解放
|
|
@@ -323,7 +323,7 @@ flowchart LR
|
|
|
323
323
|
P -->|"launches a fresh PTY per agent"| A["another coding-agent TUI<br/>Claude · Codex · Grok · Cursor"]
|
|
324
324
|
```
|
|
325
325
|
|
|
326
|
-
primitive は「PTY を 1 個握る」ことだけ。それ以外——SSH・コンテナ・REPL・起動したエージェント TUI——は、永続端末の中で動く「対話的な何か」に過ぎず、同じ `pty_send` / `pty_read` で操作する。各起動ツールは自分専用の新しい PTY を開く。PTY は
|
|
326
|
+
primitive は「PTY を 1 個握る」ことだけ。それ以外——SSH・コンテナ・REPL・起動したエージェント TUI——は、永続端末の中で動く「対話的な何か」に過ぎず、同じ `pty_send` / `pty_read` で操作する。各起動ツールは自分専用の新しい PTY を開く。PTY はPOSIXのtmux/Windows nativeのpsmux上にあるので、MCP サーバや AI クライアントが再起動してもセッションは生き残る。
|
|
327
327
|
|
|
328
328
|
## 組み込みシェルツールとの使い分け
|
|
329
329
|
|
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
>
|
|
21
21
|
> **What it is:** one persistent MCP terminal your AI drives — and can launch other coding agents into. `ssh`, `docker exec`, a REPL, or another agent's TUI all nest inside that one terminal as just text you send in. The mechanism is deliberately plain — your MCP client drives the other agent's terminal turn by turn: no hidden protocol, no separate aiterm-owned shared-memory layer, no autonomous negotiation. Launched agents still read the normal project and harness memory/configuration that a direct CLI launch would use.
|
|
22
22
|
>
|
|
23
|
-
> **No human at a
|
|
23
|
+
> **No human at a terminal required.** aiterm is driven programmatically over MCP, so an AI can launch and drive another agent with no one sitting in the terminal — from an orchestration loop, a CI step, or a cron job.
|
|
24
24
|
>
|
|
25
25
|
> *MCP = Model Context Protocol — the open standard that lets tools like Claude Code plug capabilities into an AI.*
|
|
26
26
|
|
|
@@ -34,7 +34,7 @@ No clone or build is required. Each client launches the published package with:
|
|
|
34
34
|
npx -y aiterm-mcp
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
Requires **Node.js ≥ 18** and **tmux
|
|
37
|
+
Requires **Node.js ≥ 18** and a supported multiplexer backend: **tmux** on POSIX or **psmux 3.3.8+** on native Windows. Driving Codex also requires the Codex CLI to be installed and authenticated.
|
|
38
38
|
|
|
39
39
|
### Claude Code
|
|
40
40
|
|
|
@@ -94,7 +94,7 @@ toolchain behind kitepon.dev's products.
|
|
|
94
94
|
|
|
95
95
|
**Measured, not claimed:** in the recorded 203-test benchmark, a `pty_read` puts **~7.1× fewer tokens** in your context than the raw log — and the pass/fail verdict survives the fold. → [When to reach for it vs. the built-in shell](#when-to-reach-for-it-vs-the-built-in-shell)
|
|
96
96
|
|
|
97
|
-
Fifteen tools: six **PTY tools** — `pty_open` / `pty_send` / `pty_read` / `pty_key` / `pty_close` / `pty_list` — to open, drive, and read one persistent terminal; one canonical **agent launcher**, `agent_launch`, which selects `claude-code`, `codex-cli`, `grok-cli`, or `cursor-cli` as the execution harness; four deprecated launcher aliases kept for migration; `agent_configure`; `claude_turn`; `claude_approval`; and `diagnostics`. The backend is **tmux**, so sessions survive even if the MCP server or the AI client restarts.
|
|
97
|
+
Fifteen tools: six **PTY tools** — `pty_open` / `pty_send` / `pty_read` / `pty_key` / `pty_close` / `pty_list` — to open, drive, and read one persistent terminal; one canonical **agent launcher**, `agent_launch`, which selects `claude-code`, `codex-cli`, `grok-cli`, or `cursor-cli` as the execution harness; four deprecated launcher aliases kept for migration; `agent_configure`; `claude_turn`; `claude_approval`; and `diagnostics`. The backend is **tmux on POSIX and psmux on native Windows**, so sessions survive even if the MCP server or the AI client restarts.
|
|
98
98
|
|
|
99
99
|
**v0.28.0 separates the execution harness from the model.** The harness owns the agent loop, authentication, hooks, session, and transcript; `model` is what that harness runs. Cursor Agent CLI can therefore select GPT, Claude, or Grok without changing the completion contract from Cursor hooks to another harness's. Grok Composer is a Grok CLI model preset, not another harness: use `harness: "grok-cli", model: "grok-composer-2.5-fast"`. The old four launcher tools are thin compatibility aliases over the same implementation.
|
|
100
100
|
|
|
@@ -111,8 +111,8 @@ An unavailable model fails visibly instead of letting the harness CLI fall back
|
|
|
111
111
|
|
|
112
112
|
**v0.24.3 forwards explicitly selected launcher environment variables from the current MCP process.**
|
|
113
113
|
Pass variable names in `env_vars`; aiterm reads their current values at launch and injects only the
|
|
114
|
-
present ones into that agent. This works even when the persistent
|
|
115
|
-
process, so a stale
|
|
114
|
+
present ones into that agent. This works even when the persistent multiplexer server predates the MCP
|
|
115
|
+
process, so a stale backend-server environment cannot erase per-seat identity or workflow variables.
|
|
116
116
|
It also recognizes Codex v0.147's optional `fast` token in long-lived model/effort footers, keeping
|
|
117
117
|
`agent_configure` available on an idle `medium fast ·` session without redraw, retry, or restart.
|
|
118
118
|
|
|
@@ -183,7 +183,7 @@ I used **Codex with GPT-5.6** as an engineering collaborator: it inspected the i
|
|
|
183
183
|
|
|
184
184
|
### 1. Drive SSH, containers, and REPLs in one persistent terminal — the primitive
|
|
185
185
|
|
|
186
|
-
This is the base, and it works with just
|
|
186
|
+
This is the base, and it works with just the platform backend — tmux on POSIX or psmux on native Windows. `pty_open` grabs one local terminal; `ssh host`, `docker exec -it x bash`, or a REPL are just text you `pty_send` into it — **once**. Every command after that rides the same already-authenticated session. Session kind is never a tool-level distinction.
|
|
187
187
|
|
|
188
188
|
```
|
|
189
189
|
pty_open() → grab one local terminal
|
|
@@ -229,7 +229,7 @@ The canonical harness choices are:
|
|
|
229
229
|
`env_vars` is an allowlist of environment-variable **names**, not a name/value map. At launch,
|
|
230
230
|
aiterm reads each valid name from its current MCP process, shell-quotes present values, and places
|
|
231
231
|
them on that one harness launch command. Missing names are omitted; invalid shell variable names
|
|
232
|
-
fail before session creation. There is no implicit whole-environment copy,
|
|
232
|
+
fail before session creation. There is no implicit whole-environment copy, backend-server restart,
|
|
233
233
|
retry, or fallback. Values do not enter the MCP tool arguments, but they are delivered through the
|
|
234
234
|
PTY launch command and retained in aiterm's per-session `.lastcmd`; the launched harness and other
|
|
235
235
|
processes with access to the same OS user may read them. Use this for non-secret seat identity and
|
|
@@ -294,7 +294,7 @@ Nesting is just text you send in — here a Python REPL *inside* the same PTY (a
|
|
|
294
294
|
← 499999500000 [is_complete=True via until]
|
|
295
295
|
```
|
|
296
296
|
|
|
297
|
-
The only edits to the captures above are the two `⋮` lines (a long head/tail run abbreviated for the README) and one over-long grep line truncated to fit — the `⟨…⟩` marker, the token counts, and every `is_complete` verdict are exactly what the tool printed. (Use `until: ">>>"` without a trailing space — the captured prompt is trimmed, so `">>> "` would miss and fall through to `timeout`.) While nested, pass `until` (the inner prompt) or `mark: true`, because quiescence cannot fire there by design — see [Completion detection](#completion-detection-5-layers) and [Known constraints](#known-constraints-by-design-not-bugs). A human can `attach` to the same
|
|
297
|
+
The only edits to the captures above are the two `⋮` lines (a long head/tail run abbreviated for the README) and one over-long grep line truncated to fit — the `⟨…⟩` marker, the token counts, and every `is_complete` verdict are exactly what the tool printed. (Use `until: ">>>"` without a trailing space — the captured prompt is trimmed, so `">>> "` would miss and fall through to `timeout`.) While nested, pass `until` (the inner prompt) or `mark: true`, because quiescence cannot fire there by design — see [Completion detection](#completion-detection-5-layers) and [Known constraints](#known-constraints-by-design-not-bugs). A human can `attach` to the same multiplexer backend and watch any of this live (see [A human can watch](#a-human-can-watch)).
|
|
298
298
|
|
|
299
299
|
## First run (≈60 seconds)
|
|
300
300
|
|
|
@@ -307,7 +307,7 @@ Restart Claude Code, then verify the connection:
|
|
|
307
307
|
Your first session — four calls, one persistent terminal:
|
|
308
308
|
|
|
309
309
|
```text
|
|
310
|
-
pty_open() → { session_id: "t1", attach: "
|
|
310
|
+
pty_open() → { session_id: "t1", attach: "<platform attach command>" }
|
|
311
311
|
pty_send("t1", "echo hello") → command sent into the PTY
|
|
312
312
|
pty_read("t1", { wait: true }) → "hello" (token-reduced, completion detected)
|
|
313
313
|
pty_close("t1") → terminal released
|
|
@@ -349,7 +349,7 @@ flowchart LR
|
|
|
349
349
|
P -->|"launches a fresh PTY per agent"| A["another coding-agent harness<br/>Claude Code · Codex CLI · Grok CLI · Cursor CLI"]
|
|
350
350
|
```
|
|
351
351
|
|
|
352
|
-
One PTY is the only primitive. Everything else — SSH, containers, REPLs, and the launched agent TUIs — is just something interactive running inside a persistent terminal, driven with the same `pty_send` / `pty_read`. Each launcher opens its own fresh PTY. Because the PTYs live in tmux, sessions outlive the MCP server and the AI client.
|
|
352
|
+
One PTY is the only primitive. Everything else — SSH, containers, REPLs, and the launched agent TUIs — is just something interactive running inside a persistent terminal, driven with the same `pty_send` / `pty_read`. Each launcher opens its own fresh PTY. Because the PTYs live in tmux on POSIX or psmux on native Windows, sessions outlive the MCP server and the AI client.
|
|
353
353
|
|
|
354
354
|
## When to reach for it vs. the built-in shell
|
|
355
355
|
|
|
@@ -556,8 +556,8 @@ symlink, filter, or replace harness configuration, authentication, MCP, plugin,
|
|
|
556
556
|
trust, memory, or history stores. Cleanup removes only aiterm-owned launch metadata and completion
|
|
557
557
|
correlation files.
|
|
558
558
|
|
|
559
|
-
The ordinary environment still comes from the shell
|
|
560
|
-
belongs to the current MCP process rather than the older persistent
|
|
559
|
+
The ordinary environment still comes from the persistent shell session. When a caller needs a value that
|
|
560
|
+
belongs to the current MCP process rather than the older persistent multiplexer server, every harness
|
|
561
561
|
accepts `env_vars: ["NAME", ...]`. Only those names are refreshed at launch; this is a narrow
|
|
562
562
|
per-launch overlay, not a replacement environment or configuration snapshot.
|
|
563
563
|
|
package/dist/agent-shared.js
CHANGED
|
@@ -100,7 +100,7 @@ export function stateRoot() {
|
|
|
100
100
|
return path.join(base, `aiterm-mcp-${uid}`);
|
|
101
101
|
}
|
|
102
102
|
export function ensureStateRoot() {
|
|
103
|
-
// state root は OS が与える
|
|
103
|
+
// state root は OS が与えるper-user runtime dir(Windows隔離時TMPDIR/XDG_RUNTIME_DIR/os.tmpdir())の下に作る。
|
|
104
104
|
// 以前はここで symlink・owner・mode を検査していたが、共有 /tmp に敵対的な同居主体がいる
|
|
105
105
|
// 前提の防御であり、対応 OS の既定配置では成立しない(オーナー裁定 2026-08-19)。
|
|
106
106
|
// 作成時の 0o700 は検査ではなく妥当な既定として残す。経路の異常は以降の
|
package/dist/claude-stop-hook.js
CHANGED
|
@@ -22,7 +22,7 @@ function hasAitermEnv() {
|
|
|
22
22
|
process.env.AITERM_AGENT_LAUNCH_ID);
|
|
23
23
|
}
|
|
24
24
|
function agentsDir() {
|
|
25
|
-
// state root は OS が与える
|
|
25
|
+
// state root は OS が与えるper-user runtime dir(Windows隔離時TMPDIR/XDG_RUNTIME_DIR/os.tmpdir())の下にある。
|
|
26
26
|
// 以前はここで symlink・owner・mode を検査していたが、共有 /tmp に敵対的な同居主体がいる
|
|
27
27
|
// 前提の防御であり、対応 OS の既定配置では成立しない(オーナー裁定 2026-08-19)。
|
|
28
28
|
// 経路の異常は open/stat の OS エラーとしてそのまま露出させる。
|
package/dist/harnesses/claude.js
CHANGED
|
@@ -177,7 +177,15 @@ export function claudeLaunchNote(model, effort, meta) {
|
|
|
177
177
|
return `起動設定: model=${model ?? "CLI既定"} effort=${effort ?? "CLI既定"}。${writeScopeNote}`;
|
|
178
178
|
}
|
|
179
179
|
export function claudeTuiReady(screen) {
|
|
180
|
-
|
|
180
|
+
if (!screen.includes("Claude Code"))
|
|
181
|
+
return false;
|
|
182
|
+
const lastMarker = screen.split(/\r?\n/u).filter((line) => /^\s*❯/u.test(line)).at(-1)?.trim();
|
|
183
|
+
if (!lastMarker)
|
|
184
|
+
return false;
|
|
185
|
+
// Claude Code 2.1.251 のworkspace trust UIも選択カーソルに❯を使う。
|
|
186
|
+
// 最後のmarker行だけを見ることで、古いtrust表示がscrollbackに残っていても
|
|
187
|
+
// その下に描画された現在のcomposerを優先する。
|
|
188
|
+
return !/^❯\s*(?:\d+\.\s*)?(?:No,\s*exit|Yes,\s*I trust this folder)(?:\s|$)/iu.test(lastMarker);
|
|
181
189
|
}
|
|
182
190
|
// submit座礁観測のcomposer領域マーカー(ready判定と同じ記号を行頭基準で探す)。
|
|
183
191
|
export const CLAUDE_COMPOSER_MARKER_RE = /^\s*❯/;
|
package/dist/index.js
CHANGED
|
@@ -94,7 +94,7 @@ server.registerTool("diagnostics", {
|
|
|
94
94
|
}, async () => ok(await factoryDiagnostics()));
|
|
95
95
|
const DEFAULT_PTY_SHELL = process.platform === "win32" ? "pwsh" : "bash";
|
|
96
96
|
server.registerTool("pty_open", {
|
|
97
|
-
description: "
|
|
97
|
+
description: "ローカル永続端末(POSIXはtmux、Windows nativeはpsmux 3.3.8以上)を1個開き、session_id を返す。backend server常駐ゆえ本サーバや " +
|
|
98
98
|
"クライアントが再起動してもセッションは生存する。リモート操作は専用ツールにせず、開いた端末の中で " +
|
|
99
99
|
'pty_send(session_id, "ssh host") と打って入る。',
|
|
100
100
|
inputSchema: {
|
package/dist/state-root.js
CHANGED
|
@@ -16,6 +16,13 @@ export function currentUid() {
|
|
|
16
16
|
return process.getuid();
|
|
17
17
|
}
|
|
18
18
|
export function runtimeStateBase() {
|
|
19
|
+
// Windows Node の os.tmpdir() は TMPDIR を参照せず TEMP を返す。一方、psmux namespace は
|
|
20
|
+
// tmux-runtime.ts で TMPDIR を最優先する。test/隔離processがTMPDIRだけを変えた時に
|
|
21
|
+
// PTYは隔離されてもmanaged metadataが本番TEMPへ残ると、隔離側killAllが本番相関だけを
|
|
22
|
+
// 消してしまう。Windowsだけ同じTMPDIR境界へ揃える。通常serverはTMPDIR未設定なので
|
|
23
|
+
// 従来どおりos.tmpdir()(%TEMP%)を使う。
|
|
24
|
+
if (process.platform === "win32" && process.env.TMPDIR)
|
|
25
|
+
return process.env.TMPDIR;
|
|
19
26
|
const xdg = process.env.XDG_RUNTIME_DIR;
|
|
20
27
|
if (xdg) {
|
|
21
28
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiterm-mcp",
|
|
3
|
-
"version": "0.29.
|
|
3
|
+
"version": "0.29.8",
|
|
4
4
|
"mcpName": "io.github.kitepon/aiterm-mcp",
|
|
5
5
|
"description": "Persistent terminal MCP with one harness-based launcher for Claude Code, Codex CLI, Grok CLI, and Cursor Agent CLI, plus durable PTYs for SSH, containers, and REPLs.",
|
|
6
6
|
"keywords": [
|