aiterm-mcp 0.55.0 → 0.55.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/CHANGELOG.md +30 -1
- package/README.ja.md +1 -1
- package/README.md +1 -1
- package/dist/core.js +4 -2
- package/dist/harnesses/claude.js +24 -1
- package/dist/harnesses/codex.js +10 -1
- package/docs/DESIGN.md +3 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.55.2] - 2026-10-06
|
|
11
|
+
|
|
12
|
+
### 修正
|
|
13
|
+
|
|
14
|
+
- 会話欄か入力欄に`esc to interrupt`の語があるだけのClaude Codeを、動作中と読まない(ADR 0095)。回答や依頼文に
|
|
15
|
+
この語がある席は、turnが終わった後も`pty_observe`が`busy`を返し続けていた。起動時promptにこの語があると、送る前に
|
|
16
|
+
開始を確認した事になっていた。動作中の印として数えるのは、Claude Codeが自分で出す足元の行と進行行だけにする。
|
|
17
|
+
動いている間の読みは変わらない。
|
|
18
|
+
- 会話欄に`esc to interrupt`の語があるだけのCodexを、動作中と読まない(ADR 0095)。回答にこの語が残ったCodexの席は、
|
|
19
|
+
止まった後も`pty_observe`が`busy`を返し、次の`pty_send`が差し込み(`agent_steer`)として返っていた。Codexは文を
|
|
20
|
+
新しいturnとして処理するが、呼び出し側には完了待ちの手段も親への配送も渡らなかった。動作中の印として数えるのは、
|
|
21
|
+
Codexが自分で出す形(`(5s • esc to interrupt)`。括弧の中に経過時間、`•`、語)だけにする。
|
|
22
|
+
|
|
23
|
+
## [0.55.1] - 2026-10-06
|
|
24
|
+
|
|
25
|
+
### 修正
|
|
26
|
+
|
|
27
|
+
- Claude Code親への配送で、道具の呼び出しごとの置き場(Aiterm stateの`claude-parent-hooks/<tool_use_id>/`)が、
|
|
28
|
+
回答が届いた後も残っていたのを片付ける(ADR 0094、`aiterm-steer-delivery` 0.2.2)。届いた子1つにつき置き場が
|
|
29
|
+
1つ増え、Windowsの一時置き場では再起動でも消えなかった。
|
|
30
|
+
- 届いた置き場は、Aitermがhookの出し終えた記録を確かめた時に消す。消せなくても配送は成功のまま返す。
|
|
31
|
+
- 届かなかった置き場と、配送を結ばなかった置き場(誤りで返った呼び出し、打ち切られた呼び出し)は1日残し、
|
|
32
|
+
次の依頼の`PreToolUse`のhookが消す。依頼元のClaude processが居て配送を待っている置き場は、何日たっても残す。
|
|
33
|
+
- 会話終了のhookは、読めない記録が1つあっても止まらず、その会話の残りの依頼を閉じる。
|
|
34
|
+
- 0.55.0以前が残した置き場は、更新後に最初の依頼のhookが走った時に、上の決まりで消える。
|
|
35
|
+
- 道具の返り、配送の記録、hookの登録は変わらない。`aiterm-setup`の流し直しは要らない。
|
|
36
|
+
|
|
10
37
|
## [0.55.0] - 2026-10-06
|
|
11
38
|
|
|
12
39
|
### 変更
|
|
@@ -2256,7 +2283,9 @@ prototype (preserved under `prototype/python/` as the porting source and referen
|
|
|
2256
2283
|
`ubuntu-latest` for Node 18/20/22, publishing to npm on `v*` tags with
|
|
2257
2284
|
provenance.
|
|
2258
2285
|
|
|
2259
|
-
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.55.
|
|
2286
|
+
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.55.2...HEAD
|
|
2287
|
+
[0.55.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.55.1...v0.55.2
|
|
2288
|
+
[0.55.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.55.0...v0.55.1
|
|
2260
2289
|
[0.55.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.54.0...v0.55.0
|
|
2261
2290
|
[0.54.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.53.2...v0.54.0
|
|
2262
2291
|
[0.53.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.53.1...v0.53.2
|
package/README.ja.md
CHANGED
|
@@ -209,7 +209,7 @@ runtime-error store は canonical dotagents config の `collection.enabled: true
|
|
|
209
209
|
場合だけ収集し、既定OFF、network送信は行いません。tag起点CIのnpm provenance(OIDC Trusted
|
|
210
210
|
Publishing)で公開し、GitHub Release が Official MCP Registry を再登録します。
|
|
211
211
|
|
|
212
|
-
**状態:** 開発継続中 · 現行公開版 **v0.55.
|
|
212
|
+
**状態:** 開発継続中 · 現行公開版 **v0.55.2** · 動作対象は Linux · WSL2 · macOS · Windows ネイティブ · MIT · [変更履歴](CHANGELOG.md)。
|
|
213
213
|
|
|
214
214
|
### 更新と巻き戻し
|
|
215
215
|
|
package/README.md
CHANGED
|
@@ -223,7 +223,7 @@ collection is off by default and performs no network I/O. It ships via
|
|
|
223
223
|
tag-triggered CI with npm provenance (OIDC Trusted Publishing); the GitHub
|
|
224
224
|
Release re-registers the Official MCP Registry entry.
|
|
225
225
|
|
|
226
|
-
**Status:** actively maintained · current public release **v0.55.
|
|
226
|
+
**Status:** actively maintained · current public release **v0.55.2** · runs on Linux · WSL2 · macOS · native Windows (tmux on POSIX, the tmux-CLI-compatible [psmux](https://github.com/psmux/psmux) on native Windows — no WSL required) · MIT · see the [CHANGELOG](CHANGELOG.md).
|
|
227
227
|
|
|
228
228
|
### Update and rollback
|
|
229
229
|
|
package/dist/core.js
CHANGED
|
@@ -22,7 +22,7 @@ import { isWin, SOCKDIR, tmuxCommand, sendPsmuxPayload, loadPtyBufferChunk, past
|
|
|
22
22
|
import { sleep, currentUid, runtimeStateBase, safeStatSize, readFileRange, writeJson0600, createEmpty0600, shq, LAUNCH_ID_RE, AGENT_DONE_POLL_MS, AGENT_RATE_LIMIT_POLL_MS, pollGate, AGENT_EVENT_MAX_BYTES, assertSessionName, agentsDir, agentEventPath, agentMetadataPath, writeAgentMetadata, AGENT_EVENT_TAIL_BYTES, agentLabel, agentHarness, subagentInstruction, agentLineageFields, } from "./agent-shared.js";
|
|
23
23
|
import { catalogUnavailable } from "./model-catalog.js";
|
|
24
24
|
import { grokAuthPlan, grokAuthStatus, grokAuthPane, realGrokHome, resolveAndValidateGrokAuth, assertGrokModelAvailable, grokModelChoices, grokEventsTranscript, latestGrokCompletion, observeGrokDone, buildGrokAgentCmd, grokLaunchNote, grokEnvTokens, grokTuiReady, grokTuiBusy, grokPaneObservation, grokRateLimitDialog, grokStartupAction, grokLaunchBlockingDialog, assertGrokSandboxNotRejected, GROK_COMPOSER_MARKER_RE, grokFooterHasConfiguration, grokTranscriptText, createGrokAgentMetadata, } from "./harnesses/grok.js";
|
|
25
|
-
import { codexAuthPlan, codexAuthStatus, codexAuthPane, bindCodexTranscriptSession, latestCodexCompletion, observeCodexDone, buildCodexAgentCmd, codexLaunchNote, codexTuiReady, codexPaneObservation, codexHelperProcess, codexRateLimitModelSwitchDialog, codexApprovalDialog, codexStartupAction, CODEX_COMPOSER_MARKER_RE, codexModelChoice, codexEffortChoice, codexMoreReasoningChoice, codexTranscriptText, createCodexAgentMetadata, codexModelChoices, } from "./harnesses/codex.js";
|
|
25
|
+
import { codexAuthPlan, codexAuthStatus, codexAuthPane, bindCodexTranscriptSession, latestCodexCompletion, observeCodexDone, buildCodexAgentCmd, codexLaunchNote, codexTuiReady, codexPaneObservation, codexTuiBusy, codexHelperProcess, codexRateLimitModelSwitchDialog, codexApprovalDialog, codexStartupAction, CODEX_COMPOSER_MARKER_RE, codexModelChoice, codexEffortChoice, codexMoreReasoningChoice, codexTranscriptText, createCodexAgentMetadata, codexModelChoices, } from "./harnesses/codex.js";
|
|
26
26
|
import { claudeAuthPlan, claudeAuthStatus, claudeAuthPane, OPERATION_ID_RE, CLAUDE_RESULT_MAX_BYTES, CLAUDE_EFFORTS, agentManagedClaudeSettingsPath, agentClaudeResultPath, agentClaudeOperationPath, agentClaudeApprovalReceiptPath, agentClaudeDispatchReceiptPath, validateOperationId, readClaudeResultText, assertClaudeAuthenticationReady, claudeModelChoices, buildClaudeAgentCmd, claudeLaunchNote, claudeTuiReady, claudePaneObservation, claudeUsageLimit, claudeStartupAction, claudeLoginMethodMenu, CLAUDE_COMPOSER_MARKER_RE, createClaudeAgentMetadata, claudeSessionTranscriptPath, claudeApiErrorFromLine, claudeApiErrorAfter, } from "./harnesses/claude.js";
|
|
27
27
|
import { cursorAuthPlan, cursorAuthStatus, cursorAuthPane, bindCursorTranscriptSession, cursorTurnBoundary, latestCursorCompletion, observeCursorDone, cursorTranscriptText, assertCursorAuthenticationReady, assertCursorModelAvailable, cursorModelChoices, buildCursorAgentCmd, cursorAgentArgv, cursorPwshLaunchLine, cursorPromptWithLineage, createCursorAgentMetadata, cursorLaunchNote, cursorEffortNavigation, cursorTuiReady, cursorPaneObservation, cursorPromptHooksRunning, cursorUsageLimit, CURSOR_SUBMIT_SEQUENCE, CURSOR_COMPOSER_CONTENT_MARKER_RE, validateCursorModelEffort, } from "./harnesses/cursor.js";
|
|
28
28
|
import { readInterimWords, recordInterimBoundary } from "./interim-words.js";
|
|
@@ -3103,7 +3103,9 @@ function isAgentTuiReady(kind, screen) {
|
|
|
3103
3103
|
function isAgentTuiBusy(kind, screen) {
|
|
3104
3104
|
if (kind === "cursor")
|
|
3105
3105
|
return /ctrl\+c to stop/i.test(screen);
|
|
3106
|
-
if (kind === "codex"
|
|
3106
|
+
if (kind === "codex")
|
|
3107
|
+
return codexTuiBusy(screen);
|
|
3108
|
+
if (kind === "claude")
|
|
3107
3109
|
return /esc to interrupt/i.test(screen);
|
|
3108
3110
|
if (kind === "grok") {
|
|
3109
3111
|
return grokTuiBusy(screen);
|
package/dist/harnesses/claude.js
CHANGED
|
@@ -308,7 +308,30 @@ function claudeTurnProgress(screen) {
|
|
|
308
308
|
// 足元の「esc to interrupt」は、貼り付けの知らせ(paste again to expand)へ置き換わる間は出ない。複数行のpromptを
|
|
309
309
|
// 送った後の約8秒がそうで、その間は動いているのに入力待ちと読んでいた(2.1.291、2026-10-06)。進行行も動作中の印にする。
|
|
310
310
|
export function claudeTuiBusy(screen) {
|
|
311
|
-
return
|
|
311
|
+
return claudeInterruptHint(screen) || claudeTurnProgress(screen);
|
|
312
|
+
}
|
|
313
|
+
// 「esc to interrupt」は、Claude Codeが動いている間に自分で出す印である。会話欄(回答・依頼文・道具の出力)や、
|
|
314
|
+
// 入力欄へ打ちかけの文にこの語があっても、動作中の印にしない。Aitermの中身を話している席は、止まった後も
|
|
315
|
+
// 画面にこの語が残り、動作中と読まれ続けていた。
|
|
316
|
+
// 入力欄(すぐ上が罫線の「❯」行)を見つけた時は、次の行だけを見る。
|
|
317
|
+
// - 入力欄の下の罫線より後(足元の行)。
|
|
318
|
+
// - 入力欄より上の、行頭から始まる行(古い版の進行行「✻ Musing… (esc to interrupt)」)。会話欄の行は
|
|
319
|
+
// 回答の印(「●」。macOSは「⏺」)か依頼文の印(「❯」「>」)で始まるか、字下げされている。
|
|
320
|
+
// 会話欄と見分けられない行は、今までどおり印にする(動いている席を入力待ちと読む方が害が大きい)。
|
|
321
|
+
// 入力欄の無い画面も、今までどおり末尾のどこにあっても印にする。
|
|
322
|
+
const CLAUDE_INTERRUPT_HINT_RE = /esc to interrupt/i;
|
|
323
|
+
function claudeInterruptHint(screen) {
|
|
324
|
+
const lines = screen.split("\n").slice(-32);
|
|
325
|
+
const rule = /^\s*─{8,}\s*$/u;
|
|
326
|
+
let marker = lines.length - 1;
|
|
327
|
+
while (marker >= 0 && !CLAUDE_COMPOSER_MARKER_RE.test(lines[marker]))
|
|
328
|
+
marker--;
|
|
329
|
+
if (marker <= 0 || !rule.test(lines[marker - 1]))
|
|
330
|
+
return CLAUDE_INTERRUPT_HINT_RE.test(lines.join("\n"));
|
|
331
|
+
const below = lines.findIndex((line, i) => i > marker && rule.test(line));
|
|
332
|
+
const footer = below < 0 ? marker + 1 : below + 1;
|
|
333
|
+
return lines.some((line, i) => CLAUDE_INTERRUPT_HINT_RE.test(line)
|
|
334
|
+
&& (i >= footer || (i < marker - 1 && !/^(?:\s|[●⏺❯>])/u.test(line))));
|
|
312
335
|
}
|
|
313
336
|
export function claudePaneObservation(screen) {
|
|
314
337
|
const tail = screen.split("\n").slice(-32).join("\n");
|
package/dist/harnesses/codex.js
CHANGED
|
@@ -433,6 +433,15 @@ export function codexHelperProcess(command) {
|
|
|
433
433
|
const first = /^(?:"([^"]+)"|(\S+))/.exec(command);
|
|
434
434
|
return path.posix.basename((first?.[1] ?? first?.[2] ?? "").replace(/\\/g, "/")).replace(/\.exe$/i, "") === "codex-code-mode-host";
|
|
435
435
|
}
|
|
436
|
+
// Codexは動いている間、入力欄の上へ「◦ Working (5s • esc to interrupt)」の行を出す。見出しの文は作業の内容で変わるが、
|
|
437
|
+
// 括弧の中(経過時間、「•」、「esc to interrupt」)の形は変わらない。動作中の印として数えるのは、この形だけにする。
|
|
438
|
+
// 会話欄(回答・依頼文)に「esc to interrupt」の語があるだけの席を動作中と読むと、止まっている席への送信が
|
|
439
|
+
// 差し込みになり、その回の完了が呼び出し側へ届かない(Codex 0.160.1の実物、2026-10-06)。
|
|
440
|
+
// Codexは動作中の行と回答の行が同じ印(•)で始まるので、行頭の印では見分けられない。
|
|
441
|
+
const CODEX_INTERRUPT_HINT_RE = /\((?:\d+\s*[hms]\s*)+•\s*esc to interrupt\)/i;
|
|
442
|
+
export function codexTuiBusy(screen) {
|
|
443
|
+
return CODEX_INTERRUPT_HINT_RE.test(screen);
|
|
444
|
+
}
|
|
436
445
|
export function codexPaneObservation(screen) {
|
|
437
446
|
const failure = codexStartupFailure(screen);
|
|
438
447
|
if (failure)
|
|
@@ -444,7 +453,7 @@ export function codexPaneObservation(screen) {
|
|
|
444
453
|
const lastDialog = [...tail.matchAll(CODEX_MODAL_MARKER)].at(-1)?.index ?? -1;
|
|
445
454
|
const modal = lastDialog > lastComposer;
|
|
446
455
|
if (!modal) {
|
|
447
|
-
if (
|
|
456
|
+
if (codexTuiBusy(tail))
|
|
448
457
|
return { state: "busy", reason: "turn_running" };
|
|
449
458
|
if (codexTuiReady(tail))
|
|
450
459
|
return { state: "idle", reason: "composer_ready" };
|
package/docs/DESIGN.md
CHANGED
|
@@ -184,7 +184,9 @@ hookはNodeの実行ファイルと引数配列で直接起動し、shellやWind
|
|
|
184
184
|
本文の保存と同じ子への連続依頼の制御は`parent-delivery.ts`を共有する。Claude用記録は
|
|
185
185
|
`claude-parent-deliveries`へ分け、旧版のCodex readerに未知のparentを読ませない。
|
|
186
186
|
子の予約は既存の`parent-deliveries/claims`で共有し、親の種類をまたぐ並行送信を防ぐ。
|
|
187
|
-
hookとの受け渡しはAiterm stateの`claude-parent-hooks
|
|
187
|
+
hookとの受け渡しはAiterm stateの`claude-parent-hooks`へ、道具の呼び出しごとの置き場として置く。
|
|
188
|
+
届いた置き場は、送り手がhookの出し終えた記録を確かめた時に消す。届かなかった置き場と、配送を結ばなかった置き場は1日残し、
|
|
189
|
+
次の依頼の`PreToolUse`のhookが消す。依頼元が居て配送を待っている置き場は残す(ADR 0094)。
|
|
188
190
|
|
|
189
191
|
hookの登録は、`args`を使わずshellを通す1行で書く(ADR 0089)。POSIXは`exec '<node>' '<hook>'`、Windowsは
|
|
190
192
|
`& '<node>' '<hook>'; exit (Get-Variable LASTEXITCODE -ValueOnly)`と`shell: "powershell"`。同じ設定をGrokも読み、
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiterm-mcp",
|
|
3
|
-
"version": "0.55.
|
|
3
|
+
"version": "0.55.2",
|
|
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": [
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
74
|
-
"aiterm-steer-delivery": "^0.2.
|
|
74
|
+
"aiterm-steer-delivery": "^0.2.2",
|
|
75
75
|
"ws": "8.21.3",
|
|
76
76
|
"zod": "^4.4.3"
|
|
77
77
|
},
|