aiterm-mcp 0.57.3 → 0.58.0
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 +37 -1
- package/README.ja.md +1 -1
- package/README.md +5 -1
- package/dist/harnesses/codex.js +14 -6
- package/dist/parent-delivery-cli.js +12 -3
- package/docs/DESIGN.md +5 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.58.0] - 2026-10-09
|
|
11
|
+
|
|
12
|
+
### 修正
|
|
13
|
+
|
|
14
|
+
- Codexのアプリが寝かせた会話へ届けた文が、人がその会話を開くまで動かなかった件を直す(ADR 0108)。
|
|
15
|
+
Codexが公式キューの文を番にするのは、会話を載せているprocessだけ。アプリは、見ていない会話を60秒で下ろす(Codex 0.154.0から。
|
|
16
|
+
その前は30分)。下ろされた会話あての文(子の回答、`aiterm-parent-delivery`で頼まれた文)は、キューに残ったままだった。
|
|
17
|
+
- 入れた約15秒後にキューを見直す。文が残っていて、アプリの会話で、最後の番が普通に終わっている時だけ、OSの口で
|
|
18
|
+
`codex://threads/<会話>`を開かせる。アプリが会話を載せ、公式キューが番を始める(実物で、入れてから約18秒)。
|
|
19
|
+
- 番の途中の会話、最後の番が途中で止められた会話(人が止めた、ほかの製品が作業を別の会話へ移した)、CLIの席は起こさない。
|
|
20
|
+
- 文が届いた時、アプリの画面はその会話へ切り替わる(macOSでは、アプリを前面へは出さない)。同じ会話へ続けて届いた時は、30秒の間は開き直さない。
|
|
21
|
+
- `aiterm-parent-delivery codex state`は、見張りが結果を残した後だけ`wake`を付ける(`outcome`が`woken`なら、開かせてキューが動いた)。
|
|
22
|
+
今までの項目(`state`・`hook`・`turn_id`・`queued`)と、`submit`の返りは変えていない。
|
|
23
|
+
- 見張りが起きるのはmacOSとWindowsだけ。Windowsでは、人の画面のあるsessionの時だけ開く。Linux(サーバー、コンテナ)では何も変わらない。
|
|
24
|
+
止める時は環境変数`AITERM_STEER_CODEX_WAKE=0`。
|
|
25
|
+
- Linuxのアプリが寝かせた会話は、まだ起こさない。確かめた端末ではリンクを開かせても会話が載らなかったが、その端末のアプリは
|
|
26
|
+
ログインの期限が切れていて、原因を分けられていない。今までどおり、会話が開かれた時に届く。
|
|
27
|
+
- 共通パッケージ`aiterm-steer-delivery`を0.4.1へ上げる。
|
|
28
|
+
|
|
29
|
+
## [0.57.4] - 2026-10-08
|
|
30
|
+
|
|
31
|
+
### 修正
|
|
32
|
+
|
|
33
|
+
- Codexの席で、警告の画面(足元の「⚠ N warnings · f2 to view」をF2で開いた所)が開いている間に送った文が、届かないのに
|
|
34
|
+
`agent_dispatch`で返っていた件を直す(ADR 0107)。
|
|
35
|
+
起動の見出し(`>_ OpenAI Codex`)の`>_`を入力欄の印と読んでいたので、見出しが画面に残る席では、入力欄が警告の画面に
|
|
36
|
+
置き換わっていても入力待ちと読んでいた。文は警告の画面に吸われ、turnは始まらず、完了は来なかった。
|
|
37
|
+
- 見出しの`>_`を入力欄の印に数えない。入力欄の行がある時だけ入力待ちと読む。
|
|
38
|
+
- 警告の画面を、応答の要る画面と同じに数える。`pty_observe`は`blocked`・`unknown_dialog`、`pty_send`は待たずに、今までと同じ
|
|
39
|
+
文面(「…入力受付状態になりません。文字列は送信していません。…」)で断る。番が動いている席・回答を流している席でも同じ。
|
|
40
|
+
見出しが流れた後の席では、今まで30秒待ってから同じ文面(`state=unknown reason=unrecognized_screen`)で断っていた。
|
|
41
|
+
- Aitermは警告の画面を閉じない(`Esc`はその警告を消す)。引数、返りの項目、断りの文面、警告の画面が開いていない席の読みは変えていない。
|
|
42
|
+
警告の画面は人がF2を押した時だけ開くので、BellTeamの席の動きは変わらない。
|
|
43
|
+
|
|
10
44
|
## [0.57.3] - 2026-10-08
|
|
11
45
|
|
|
12
46
|
### 修正
|
|
@@ -2430,7 +2464,9 @@ prototype (preserved under `prototype/python/` as the porting source and referen
|
|
|
2430
2464
|
`ubuntu-latest` for Node 18/20/22, publishing to npm on `v*` tags with
|
|
2431
2465
|
provenance.
|
|
2432
2466
|
|
|
2433
|
-
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.
|
|
2467
|
+
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.58.0...HEAD
|
|
2468
|
+
[0.58.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.57.4...v0.58.0
|
|
2469
|
+
[0.57.4]: https://github.com/kitepon/aiterm-mcp/compare/v0.57.3...v0.57.4
|
|
2434
2470
|
[0.57.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.57.2...v0.57.3
|
|
2435
2471
|
[0.57.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.57.1...v0.57.2
|
|
2436
2472
|
[0.57.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.57.0...v0.57.1
|
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.
|
|
212
|
+
**状態:** 開発継続中 · 現行公開版 **v0.58.0** · 動作対象は Linux · WSL2 · macOS · Windows ネイティブ · MIT · [変更履歴](CHANGELOG.md)。
|
|
213
213
|
|
|
214
214
|
### 更新と巻き戻し
|
|
215
215
|
|
package/README.md
CHANGED
|
@@ -65,6 +65,10 @@ aiterm-setup --json --codex-steer enable
|
|
|
65
65
|
公式キューと公式hookを使い、実行中の親には同じターンの次の推論へ回答を渡し、終了後は同じ会話を自動再開します。
|
|
66
66
|
Codexの起動プログラムと通常のstdio通信は変更しません。hookの実行ファイルが失われてもCodexの起動・応答は継続します。
|
|
67
67
|
終了後の再開は公式キューの監視周期に従い、約10秒かかる場合があります。
|
|
68
|
+
Codexのアプリは、見ていない会話を60秒で寝かせます。寝ている会話のキューは、その会話が開かれるまで動きません。
|
|
69
|
+
Aitermは、入れた約15秒後にまだ文が残っていて、番が普通に終わって寝ている会話なら、アプリにその会話を開かせて起こします(`codex://threads/<会話>`)。
|
|
70
|
+
その時、アプリの画面はその会話へ切り替わります。番の途中の会話、途中で止められた会話、CLIの席は起こしません。止める時は環境変数`AITERM_STEER_CODEX_WAKE=0`を立てます。
|
|
71
|
+
起こすのはmacOSとWindowsのアプリです。Linuxのアプリが寝かせた会話は、まだ起こしません(実物で確かめられていません。会話が開かれた時に届きます)。
|
|
68
72
|
|
|
69
73
|
`aiterm-setup`は`CODEX_HOME/hooks.json`へ専用の`PostToolUse`と`Stop`を追加し、公式APIでその2件だけを承認・読戻しします。
|
|
70
74
|
他のhookや承認は保持します。選択と配送の所有記録は`~/.config/aiterm-mcp/codex-parent-hooks/`へ保存します。
|
|
@@ -223,7 +227,7 @@ collection is off by default and performs no network I/O. It ships via
|
|
|
223
227
|
tag-triggered CI with npm provenance (OIDC Trusted Publishing); the GitHub
|
|
224
228
|
Release re-registers the Official MCP Registry entry.
|
|
225
229
|
|
|
226
|
-
**Status:** actively maintained · current public release **v0.
|
|
230
|
+
**Status:** actively maintained · current public release **v0.58.0** · 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
231
|
|
|
228
232
|
### Update and rollback
|
|
229
233
|
|
package/dist/harnesses/codex.js
CHANGED
|
@@ -632,6 +632,11 @@ export function codexLaunchNote(model, effort, meta) {
|
|
|
632
632
|
const summary = meta?.kind === "codex" && meta.codex_home ? codexConfigSummary(configPath) : "";
|
|
633
633
|
return (summary ? `${launch}\n${summary}\n` : launch) + writeScopeNote;
|
|
634
634
|
}
|
|
635
|
+
// 入力欄の行頭の印(「›」。古い描画では「>」)。番号つきの行(「› 1. …」)はmodalで選択中の選択肢。
|
|
636
|
+
// 起動の見出し(「>_ OpenAI Codex (v0.161.0)」)の「>_」は入力欄ではない。これを入力欄と数えると、見出しが残っている席で
|
|
637
|
+
// 入力欄が別の画面(F2で開いた警告の画面など)に置き換わっていても入力待ちと読み、文がその画面に吸われる
|
|
638
|
+
// (Codex 0.161.0の実物、2026-10-08。ADR 0107)。
|
|
639
|
+
const CODEX_COMPOSER_LINE = String.raw `(?:^|\n)[ \t]*[›>](?!_)(?![ \t]*\d+\.)`;
|
|
635
640
|
export function codexTuiReady(screen) {
|
|
636
641
|
if (codexStartupFailure(screen))
|
|
637
642
|
return false;
|
|
@@ -639,11 +644,14 @@ export function codexTuiReady(screen) {
|
|
|
639
644
|
// capture-paneは直近45行だけなので、会話が進むとheaderは正常に画面外へ流れる。
|
|
640
645
|
const codexFrontend = screen.includes("OpenAI Codex")
|
|
641
646
|
|| /(^|\n)\s*\S+\s+(?:default|low|medium|high|xhigh|max|ultra)(?:\s+fast)?\s+·\s+\S.*$/m.test(screen);
|
|
642
|
-
return codexFrontend &&
|
|
647
|
+
return codexFrontend && new RegExp(CODEX_COMPOSER_LINE).test(screen);
|
|
643
648
|
}
|
|
644
649
|
// 0.155までは文章のfooter、0.157からは「enter select · esc back」のようなkey hint行になった。
|
|
645
|
-
|
|
646
|
-
|
|
650
|
+
// 足元の「⚠ N warnings · f2 to view」をF2で開いた警告の画面は、入力欄の場所に出て、鍵を自分で受ける
|
|
651
|
+
// (足元は「k keep & next · esc dismiss & close · ^o copy · ←/→ warning · ↓ scroll」、見出しは「Warnings · 1 of 3 · Startup」)。
|
|
652
|
+
// 開いている間に打った文は入力欄へ入らないので、応答の要るmodalと同じに数える。Aitermは閉じない(Escはその警告を消す)。
|
|
653
|
+
const CODEX_MODAL_FOOTER = /Press enter to confirm or esc to (?:cancel|go back)|enter to submit\s*\|\s*esc to cancel|(?<=^|\n)[ \t]*(?:[^\n]*· )?enter [a-z]+ · (?:[^\n]* · )?esc [a-z]+[ \t]*(?=\n|$)|(?<=^|\n)[ \t]*(?:[^\n]*· )?esc dismiss(?: & close)?(?: · [^\n]*)?[ \t]*(?=\n|$)/gi;
|
|
654
|
+
const CODEX_DIALOG_HEADING = /Would you like to run the following command\?|Allow the [^\n]+ MCP server to run tool|Hooks need review|Do you trust the contents of this directory|Trust this folder\?|Update available!|Approaching rate limits|(?<=^|\n)[ \t]*Warnings · \d+ of \d+(?= ·|[ \t]*(?:\n|$))/g;
|
|
647
655
|
const CODEX_MODAL_MARKER = new RegExp(`${CODEX_MODAL_FOOTER.source}|${CODEX_DIALOG_HEADING.source}`, "gi");
|
|
648
656
|
function currentCodexDialog(screen) {
|
|
649
657
|
const footers = [...screen.matchAll(CODEX_MODAL_FOOTER)];
|
|
@@ -675,7 +683,7 @@ export function codexPaneObservation(screen) {
|
|
|
675
683
|
// psmuxはmodalを画面上部へ描き、下の空行もcaptureへ含める。空行を落としてから末尾を取る。
|
|
676
684
|
const tail = screen.replace(/\s+$/, "").split("\n").slice(-24).join("\n");
|
|
677
685
|
// 現在のmodal footerがある時だけ、折返しで上へ出た質問を画面全体から探す。
|
|
678
|
-
const lastComposer = [...tail.matchAll(
|
|
686
|
+
const lastComposer = [...tail.matchAll(new RegExp(CODEX_COMPOSER_LINE, "g"))].at(-1)?.index ?? -1;
|
|
679
687
|
const lastDialog = [...tail.matchAll(CODEX_MODAL_MARKER)].at(-1)?.index ?? -1;
|
|
680
688
|
const modal = lastDialog > lastComposer;
|
|
681
689
|
if (!modal) {
|
|
@@ -707,7 +715,7 @@ export function codexPaneObservation(screen) {
|
|
|
707
715
|
export function codexRateLimitModelSwitchDialog(screen) {
|
|
708
716
|
const current = currentCodexDialog(screen);
|
|
709
717
|
const footer = [...current.matchAll(CODEX_MODAL_FOOTER)].at(-1)?.index ?? -1;
|
|
710
|
-
const composer = [...current.matchAll(
|
|
718
|
+
const composer = [...current.matchAll(new RegExp(CODEX_COMPOSER_LINE, "g"))].at(-1)?.index ?? -1;
|
|
711
719
|
// footerが無いか、現在のcomposerがmodal footerより後なら、scrollbackの古いmodalである。
|
|
712
720
|
if (footer < 0 || composer > footer)
|
|
713
721
|
return null;
|
|
@@ -796,7 +804,7 @@ export function codexStartupAction(screen, trustProject) {
|
|
|
796
804
|
return { kind, keys: [...Array(Math.abs(distance)).fill(distance > 0 ? "Down" : "Up"), "Enter"] };
|
|
797
805
|
}
|
|
798
806
|
// submit座礁観測のcomposer領域マーカー(ready判定と同じ記号を行頭基準で探す)。
|
|
799
|
-
export const CODEX_COMPOSER_MARKER_RE = /^\s*[›>]/;
|
|
807
|
+
export const CODEX_COMPOSER_MARKER_RE = /^\s*[›>](?!_)/;
|
|
800
808
|
// Codexの起動前modalダイアログ検知。表示中はheader/footerが描かれず codexTuiReady が
|
|
801
809
|
// 恒久falseになるため、ready gate失敗の原因究明用に画面から種別を特定する
|
|
802
810
|
// (実被弾 2026-08-25: update確認で初手prompt未送信のまま30秒timeout→40分停滞)。
|
|
@@ -13,13 +13,15 @@
|
|
|
13
13
|
// verify の steer:"enabled" は設定の話(hookが登録・承認済みで、親がhookの導入後に起きている)。届いた事は言わない。
|
|
14
14
|
// submit の queued_submission_id は、公式キューが受け付けた事。
|
|
15
15
|
// state は届き方の事実を返す。hook:"emitted" と turn_id は、Aitermのhookがその番へ本文を入れた事。queued は、今も公式キューに残っているか。
|
|
16
|
+
// wake は、寝ている会話を起こす見張り(ADR 0108)の結果。見張りが終わった後だけ付く。outcome:"woken" は、アプリに会話を開かせてキューが動いた事。
|
|
16
17
|
//
|
|
17
18
|
// 対象はCodexの親だけ。親の指定は、CodexがMCP要求へ付けるthreadIdと、そのCodexのCODEX_HOME。
|
|
18
19
|
import * as fs from "node:fs";
|
|
19
20
|
import * as path from "node:path";
|
|
20
21
|
import { createRequire } from "node:module";
|
|
21
22
|
import { fileURLToPath } from "node:url";
|
|
22
|
-
import { realCodexHome } from "aiterm-steer-delivery";
|
|
23
|
+
import { realCodexHome, readCodexWakeResult } from "aiterm-steer-delivery";
|
|
24
|
+
import { AITERM_PROFILE } from "./steer-profile.js";
|
|
23
25
|
import { checkCodexParent, submitCodexParentAnswer, withCodexReceiver } from "./codex-parent-receiver.js";
|
|
24
26
|
import { codexHookDeliveryState, codexHookDirectory, codexInputDirectory } from "./codex-hook-state.js";
|
|
25
27
|
export const PARENT_DELIVERY_SCHEMA = "aiterm.parent-delivery.v1";
|
|
@@ -99,6 +101,13 @@ async function deliveryState(target, delivery) {
|
|
|
99
101
|
else if (claim !== null || fs.existsSync(path.join(directory, "pending", `${delivery}.json`)))
|
|
100
102
|
hook = "pending";
|
|
101
103
|
}
|
|
104
|
+
let wake = {};
|
|
105
|
+
try {
|
|
106
|
+
const saved = readCodexWakeResult(AITERM_PROFILE, delivery);
|
|
107
|
+
if (saved)
|
|
108
|
+
wake = { wake: saved };
|
|
109
|
+
}
|
|
110
|
+
catch { /* 読めない結果は、無い物として扱う(届き方の事実は下で返す) */ }
|
|
102
111
|
try {
|
|
103
112
|
const queued = await withCodexReceiver(target, async (request) => {
|
|
104
113
|
let cursor = null;
|
|
@@ -112,11 +121,11 @@ async function deliveryState(target, delivery) {
|
|
|
112
121
|
} while (cursor);
|
|
113
122
|
return false;
|
|
114
123
|
});
|
|
115
|
-
return { state, hook, turn_id: turn, queued };
|
|
124
|
+
return { state, hook, turn_id: turn, queued, ...wake };
|
|
116
125
|
}
|
|
117
126
|
catch (error) {
|
|
118
127
|
const code = error?.delivery_code;
|
|
119
|
-
return { state, hook, turn_id: turn, queued: null, queue_error: typeof code === "string" ? code : "CODEX_QUEUE_UNREADABLE" };
|
|
128
|
+
return { state, hook, turn_id: turn, queued: null, queue_error: typeof code === "string" ? code : "CODEX_QUEUE_UNREADABLE", ...wake };
|
|
120
129
|
}
|
|
121
130
|
}
|
|
122
131
|
/**
|
package/docs/DESIGN.md
CHANGED
|
@@ -128,6 +128,8 @@ Cursorのsubmitはadapterがextended keyboard protocolのEnterへ変換し、呼
|
|
|
128
128
|
Codex・Grok・Cursorの席は、新しいturnを送るたびに入力受付を確かめる。起動の途中の入力欄を採らないよう、500msおきに11回続けて
|
|
129
129
|
入力待ちを読む(ADR 0014)。席のharnessが自分の記録で「この起動でturnを1つ終えていて、次のturnを始めていない」と示している時は、
|
|
130
130
|
100msおきに2回で通す(ADR 0097)。記録の上でturnが動いている間は、画面が入力待ちに見えても11回の確かめを通る。
|
|
131
|
+
Codexの入力待ちは、入力欄の行(`›`、古い描画の`>`)がある時だけ読む。起動の見出しの`>_`は入力欄ではない。足元の警告をF2で開いた
|
|
132
|
+
警告の画面は、入力欄の場所に出て鍵を受けるので、応答の要る画面と同じに数え、`pty_send`は打鍵の前に断る。Aitermは閉じない(ADR 0107)。
|
|
131
133
|
|
|
132
134
|
### 親配送の共通モジュール化(設計)
|
|
133
135
|
|
|
@@ -147,6 +149,9 @@ Steerを選択した端末(macOS・Windows・Linux。Desktop同梱のCLI、無
|
|
|
147
149
|
`src/codex-parent-hooks.ts`の同期`PostToolUse`がAitermの回答を同じターンの文脈へ渡し、
|
|
148
150
|
`Stop`が最終応答の生成中に届いた回答で同じターンを継続する。
|
|
149
151
|
取り込まれていない回答は公式キューに残り、親がidleになった時に通常配送される。終了後の再開には約10秒かかる場合がある。
|
|
152
|
+
公式キューを番にするのは、会話を載せているprocessだけ。アプリが下ろした会話(見ている接続が無くなって60秒)は、
|
|
153
|
+
入れた後の見張り(共通パッケージの`codex-wake`)が約15秒後に見直し、アプリの会話で最後の番が普通に終わっている時だけ、
|
|
154
|
+
OSの口で`codex://threads/<会話>`を開かせて起こす(ADR 0108。macOSとWindows。Linuxのアプリはまだ起こせない)。番の途中、途中で止められた会話、CLIの席は起こさない。
|
|
150
155
|
親を別processでload/resumeせず、modelや権限のoverrideを渡さない。native sub-agentは自動配送の親にしない。
|
|
151
156
|
|
|
152
157
|
`src/codex-hook-state.ts`は同じCodex home・thread・配送UUID・本文hashへの所有記録を保持する。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiterm-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.58.0",
|
|
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": [
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
74
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
75
|
-
"aiterm-steer-delivery": "^0.
|
|
75
|
+
"aiterm-steer-delivery": "^0.4.1",
|
|
76
76
|
"ws": "8.21.3",
|
|
77
77
|
"zod": "^4.4.3"
|
|
78
78
|
},
|