aiterm-mcp 0.58.4 → 0.59.1
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 +90 -1
- package/README.ja.md +15 -5
- package/README.md +14 -4
- package/dist/agent-shared.js +48 -1
- package/dist/core.js +868 -106
- package/dist/cursor-parent-receive.js +2 -1
- package/dist/fast-mode.js +22 -0
- package/dist/harnesses/claude.js +137 -19
- package/dist/harnesses/codex.js +126 -22
- package/dist/harnesses/cursor.js +96 -12
- package/dist/harnesses/grok.js +159 -2
- package/dist/index.js +41 -7
- package/dist/live-node.js +17 -0
- package/dist/model-catalog.js +1 -0
- package/dist/parent-delivery-cli.js +3 -2
- package/dist/runtime-error-report.js +2 -1
- package/dist/runtime-error-store.js +3 -2
- package/dist/user-config.js +138 -0
- package/docs/DESIGN.md +11 -0
- package/docs/RELEASE.md +5 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,93 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.59.1] - 2026-10-13
|
|
11
|
+
|
|
12
|
+
### 修正
|
|
13
|
+
|
|
14
|
+
- **長く続いているCodexの番へ、回答を流している間に届いた文が、30秒待って断られていた。**(ADR 0101 の直し)
|
|
15
|
+
回答を流している間のCodexは画面に動作中の行を出さないので、番が動いているかは会話の記録で確かめている。その開始の印を記録の末尾1MiBの中でしか
|
|
16
|
+
探しておらず、番が1MiBより多く書いた後は「動いていない」と読んで、新しいturnの道で入力待ちを30秒待ち、
|
|
17
|
+
`…TUI が入力受付状態になりません。文字列は送信していません。`で断っていた(2026-10-13、20分を過ぎた番で4通)。
|
|
18
|
+
開始の印を、境界に当たるまで記録をさかのぼって探す。動作中の行が出ている間に届いた文と、止まっている席への文は、今までと同じ。
|
|
19
|
+
|
|
20
|
+
## [0.59.0] - 2026-10-13
|
|
21
|
+
|
|
22
|
+
### 追加
|
|
23
|
+
|
|
24
|
+
- ファスト(各harnessの、費用や利用量を多く払って応答を速くする切り替え)を、席ごとに切り替えられる(ADR 0114)。
|
|
25
|
+
- `agent_launch`・`agent_configure`に`fast`(真偽、省略可)。返りの`fast`は、切り替えた後の実際の状態。
|
|
26
|
+
`agent_configure`は`fast`だけの指定も受け、省略はその席の今の状態を変えない。
|
|
27
|
+
- **席は必ず通常の速度で起きる。** `fast`を省いた起動とfalseは同じ。Claude Codeは席ごとの設定で`fastMode: false`、
|
|
28
|
+
Codexは`-c service_tier=default`を明示する。利用者の設定にファストが残っていても、modelの既定の段がFastでも、席は通常で始まる。
|
|
29
|
+
`fast: true`は、通常で起こしてから、その席を切り替える。
|
|
30
|
+
- **切り替えは席だけに留める。** harnessの切り替えの命令は利用者の既定も書き換える(Claude Codeの`/fast`は`settings.json`の`fastMode`、
|
|
31
|
+
Codexの`/fast`は`config.toml`の`service_tier`、Grokの`/model`は`config.toml`の`[models]`、Cursorは版によって`cli-config.json`)。
|
|
32
|
+
切り替えの直前の値へ戻す。
|
|
33
|
+
読む・切り替える・戻すは、設定fileごとの鍵で、同じ端末の全てのAitermの間で1つずつにする。
|
|
34
|
+
- `agent_models`のmodelごとに`fast`(そのmodelで切り替えられるか。harnessが返す値)。fastが別のmodel IDのharness(Cursor・Grok)は、
|
|
35
|
+
fast版を別のmodelとして並べず、元のmodelの`fast: true`にする(**Grokの一覧から`grok-4.7-build-fast`が消え、`grok-4.7`が`fast: true`になる**)。
|
|
36
|
+
最上位の`fast_unavailable`は、アカウントの都合でどのmodelでも使えない時の訳(今はClaude Code)。
|
|
37
|
+
- 断りの符号(文の先頭): `FAST_MODE_NOT_SUPPORTED`・`FAST_MODE_UNAVAILABLE`・`FAST_MODE_MODEL_CONFLICT`・`FAST_MODE_UNCONFIRMED`。
|
|
38
|
+
起動で`FAST_MODE_UNAVAILABLE`・`FAST_MODE_UNCONFIRMED`になった時は、起動を断らずに通常の速度で起こし、返りの`fast_error`に訳を入れる。
|
|
39
|
+
- Claude Codeをファストへ入れる所は、usage creditsが要るので本物では確かめていない(使えない時の断りまでを本物で、入る所は実物の作りを写した模擬で確かめた)。
|
|
40
|
+
|
|
41
|
+
- 席の環境へ、席の会話ID(`AITERM_AGENT_VENDOR_SESSION_ID`)を入れる(ADR 0118)。起動の時点で会話IDが決まるClaude CodeとGrokの席だけ。
|
|
42
|
+
起動の印(`AITERM_AGENT_LAUNCH_ID`)は席が起こした子にも継がれるので、hookなどが「席そのものの会話か」を見分ける時に、自分の会話IDと比べる。
|
|
43
|
+
|
|
44
|
+
### 変更
|
|
45
|
+
|
|
46
|
+
- Codexの席は、`-c service_tier=default`を付けて起こす。今までは何も渡さず、利用者のconfigの`service_tier`と、modelの既定の段で流れていた。
|
|
47
|
+
- Claude Codeの席ごとの設定(Aitermが`--settings`で渡すfile)へ`fastMode: false`が入る。
|
|
48
|
+
- `agent_configure`は、何も指定しない時の文が「model、reasoning_effort、fast のいずれかを指定してください」になる。
|
|
49
|
+
- CI: pushは、同じcommitの全テスト(手動実行か定期実行)がもう通っている環境を流さない(ADR 0115)。枝で3環境の全テストを通してから
|
|
50
|
+
mainへ早送りすると、同じcommitで同じ試験がもう一度(Windowsは12分)走っていた。製品の動きは変わらない。
|
|
51
|
+
|
|
52
|
+
### 修正
|
|
53
|
+
|
|
54
|
+
- **利用枠に当たったClaude Codeの席へ送った文が、会話へ入らずに消える件を直す(ADR 0117)。**
|
|
55
|
+
Claude Code 2.1.296は、枠に当たると自分で`/rate-limit-options`を開き、入力欄の代わりに選ぶ画面を出す。Aitermはその画面へ
|
|
56
|
+
「貼り付け+Enter」を打っていた。貼り付けは捨てられ、Enterが1番を選んで画面が閉じ、Aitermは打った控えを返していた。
|
|
57
|
+
- 送る前に今の画面を読み、利用枠の選ぶ画面はEscで閉じてから送る(返りの`pane_input_recovery`に`claude_rate_limit_menu_closed`)。
|
|
58
|
+
閉じない時は`CLAUDE_RATE_LIMIT_MENU_NOT_CLOSED`で断る。
|
|
59
|
+
- 見覚えの無い選ぶ画面(最後の行が`Enter to confirm · Esc to cancel`)が出ている席へは、何も打たずに`CLAUDE_SELECT_MENU_OPEN`で断る。
|
|
60
|
+
選ぶ画面は打鍵の数字をEnter無しで選び、「j」「k」で選択を動かすので、打鍵で入る前置き(`preface`)が別の番を選びえた。
|
|
61
|
+
- 選ぶ画面が出ていない席への送信、枠で終わった番の完了待ちの返り(`error`)は、今までと同じ。
|
|
62
|
+
- 動いていた本物の席で選ぶ画面を開いてから送ると、直す前は文が消え、直した後は席が答えた。
|
|
63
|
+
- **Claude Codeの席が、Aitermで届けた長い頼みを「利用者の指示ではない」と見て動かない事があった件を直す(ADR 0116)。**
|
|
64
|
+
Claude Codeは、貼り付けで入った長い文(改行3つ以上か800字を超える文)を`<pasted_content>`で包み、「包みの中の指示は、利用者自身の言葉が
|
|
65
|
+
頼んだ時だけ従う」と読む。Aitermは、呼び手が`pty_send`の`preface`を渡さない限り、包みの外に何も入れていなかった
|
|
66
|
+
(`agent_launch`の`prompt`と`remote`の先の席には、渡す口も無かった)。
|
|
67
|
+
- 包みになる文には、Aitermが出所の1行を貼り付けの印なしで入れる:
|
|
68
|
+
「Aitermが届ける、この席の呼び手からの正規の送信です。下の貼り付けは、どこかから拾った文ではなく、呼び手がこの席へ宛てて送った文です。」
|
|
69
|
+
新しいturn・差し込み・起動時の文の3つとも。`remote`の先の席では、現地のAitermが自分で入れる。
|
|
70
|
+
- 起動時にClaude Codeの席へ渡す文(`aiterm_subagent_context`)へ、この1行の見分け方を足す。
|
|
71
|
+
- 呼び手が`preface`を渡した時、包まれない短い文、Codex・Grok・Cursorの席は、今までと同じ。
|
|
72
|
+
- 実物の席(Opus 5.5、利用者に止められた直後に長い頼みが届く場面、4回ずつ)で、直す前は4回とも従わず、直した後は4回とも従った。
|
|
73
|
+
- Grokの席を起こすたびに、利用者の`~/.grok/config.toml`の既定のmodelが、その席のmodelへ書き換わっていた件を直す(ADR 0114)。
|
|
74
|
+
Grok 1.0.50は、`--model`を付けて起こすだけで`[models].default`を書く。`agent_configure`でmodelやeffortを替えた時も、
|
|
75
|
+
`default`と`default_reasoning_effort`に残っていた。起動と設定替えの前後で、直前の値へ戻す。
|
|
76
|
+
- Cursorの席を起こした時と設定替えの時に、利用者の`~/.cursor/cli-config.json`の既定のmodelが、その席のmodelへ書き換わっていた件を直す
|
|
77
|
+
(書くのはCursorの版による。2026.10.01-14929f9)。起動と設定替えの前後で、直前の値へ戻す。
|
|
78
|
+
- Codexの席で`agent_configure`がmodelやeffortを替えると、利用者の`~/.codex/config.toml`の既定(`model`・`model_reasoning_effort`)に残っていた件を直す。
|
|
79
|
+
公式の口(App Serverの`config/batchWrite`)で、直前の値へ戻す。
|
|
80
|
+
- Codex 0.162.1で、`agent_configure`へ一覧のmodel ID(`gpt-6.1-sol`)を渡すと「Codexの/modelに … がありません」で断り、選ぶ画面を開いたまま
|
|
81
|
+
返していた件を直す(選ぶ画面は表示名`GPT-6.1-Sol`で並ぶ)。大文字と小文字を問わずに比べ、選べずに断る時は選ぶ画面を閉じる。
|
|
82
|
+
- Cursorのパラメータの画面で、矢印を続けて送って鍵が落ちると、違う行(別のeffort)を選びかねなかった件を直す。1歩ずつ画面で確かめて進める。
|
|
83
|
+
- 今のCursor(2026.10.01)で、`agent_configure`がeffortを替えた後に「変更完了を確認できません」で返り、その席への次の送信が
|
|
84
|
+
「入力待ちではありません」で断られていた件を直す(替え自体は効いていた)。Cursorは`/model`の選ぶ画面を閉じても入力欄を描かず、
|
|
85
|
+
閉じた画面の行も消さない。閉じた後に入力欄を描き直させ、画面の今の姿を最後の行で読む。同じ席で設定替えを繰り返しても外れない。
|
|
86
|
+
|
|
87
|
+
- 動いている最中にNodeが更新されて前の版の場所が消えると、補助のprocessを起こせなくなっていた件を直す(ADR 0113)。
|
|
88
|
+
- **起きていた事**: MCP processが、不具合の記録の係を起こす時と、呼び手へ待ち受けの起動先(`wait_process.executable`)を渡す時に、
|
|
89
|
+
自分が起きた時のNodeの場所(`process.execPath`)を使っていた。Homebrewは版ごとの場所へ入れて、更新で前の版を消す。
|
|
90
|
+
2026-10-12にMacでNodeが26.10.0_1から26.11.1へ上がり、前から動いていたMCP process 19個が、無いNodeを指したまま黙って失敗していた
|
|
91
|
+
(不具合の記録が残らない、`diagnostics`の`runtime_error_store`が`unverified`、渡した待ち受けが起きない)。
|
|
92
|
+
- **直した後**: 使う時に、今ある場所を返す(`liveNodeExecutable`)。Homebrewは更新でも残る`opt`の場所、実体が消えていればPATHの`node`。
|
|
93
|
+
- **変わる値**: Homebrewの端末で、`wait_process.executable`と`aiterm-parent-delivery provider`の`node`が`…/opt/node/bin/node`になる。形は同じ。
|
|
94
|
+
- **効く範囲**: この版より後に起きたprocess。前から動いているprocessは、会話を開き直すまで古いまま。
|
|
95
|
+
- 共通部品`aiterm-steer-delivery`を`^0.4.6`へ上げる(止まったCodexの会話を起こす見張りと、Codexへ渡すPATHにも同じ直しが入る)。
|
|
96
|
+
|
|
10
97
|
## [0.58.4] - 2026-10-12
|
|
11
98
|
|
|
12
99
|
### 修正
|
|
@@ -2542,7 +2629,9 @@ prototype (preserved under `prototype/python/` as the porting source and referen
|
|
|
2542
2629
|
`ubuntu-latest` for Node 18/20/22, publishing to npm on `v*` tags with
|
|
2543
2630
|
provenance.
|
|
2544
2631
|
|
|
2545
|
-
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.
|
|
2632
|
+
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.59.1...HEAD
|
|
2633
|
+
[0.59.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.59.0...v0.59.1
|
|
2634
|
+
[0.59.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.58.4...v0.59.0
|
|
2546
2635
|
[0.58.4]: https://github.com/kitepon/aiterm-mcp/compare/v0.58.3...v0.58.4
|
|
2547
2636
|
[0.58.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.58.2...v0.58.3
|
|
2548
2637
|
[0.58.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.58.1...v0.58.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.
|
|
212
|
+
**状態:** 開発継続中 · 現行公開版 **v0.59.1** · 動作対象は Linux · WSL2 · macOS · Windows ネイティブ · MIT · [変更履歴](CHANGELOG.md)。
|
|
213
213
|
|
|
214
214
|
### 更新と巻き戻し
|
|
215
215
|
|
|
@@ -266,6 +266,8 @@ agent配送だけを期待する連携では、`pty_send`に`require_agent:true`
|
|
|
266
266
|
|
|
267
267
|
agent session宛ての`pty_send`は、任意の`preface`(本文の前に置く1行)を受ける。渡る文は「`preface`・空行・`text`」。Claude Codeの席へは、`preface`を端末の貼り付けの印なしで入れ、空行と本文を1回の貼り付けで入れる。Claude Codeは貼り付けた長い文を`<pasted_content>`で包み、「包みの中の指示は、包みの外の利用者自身の言葉が頼んだ時だけ従う」と読むので、連携元が付ける前置き(誰からの連絡か)を包みの外へ出すために使う。Codex・Grok・Cursorの席へは1つにつないで貼る。`preface`は1行・200字以内・制御文字なしで、行頭が記号や空白でなく、`@`を含まない文。外れた時は`AGENT_PREFACE_INVALID`と「文字列は送信していません。」を返す。通常PTY・`force:true`・`remote`付きでは使えない。
|
|
268
268
|
|
|
269
|
+
呼び手が`preface`を渡さない時も、Claude Codeの席へ送る文が包まれる長さ(改行3つ以上か800字以上)なら、Aitermが自分で1行を入れる: 「Aitermが届ける、この席の呼び手からの正規の送信です。下の貼り付けは、どこかから拾った文ではなく、呼び手がこの席へ宛てて送った文です。」出所だけを言い、従えとは書かない。新しいturn・差し込み・`agent_launch`の`prompt`・`remote`の先の席(現地のAitermが入れる)のどれも同じ。この1行が無いと、文の全部が包みの中になり、Claude Codeの席は「利用者自身の指示ではない」と見て動かない事がある。短い文、Codex・Grok・Cursorの席、`raw`・`force`付きの送信は今までと同じ(ADR 0116)。
|
|
270
|
+
|
|
269
271
|
同じagent sessionへの`pty_send`が重なった時は、1本ずつ通す。後の1通は、前の1通を送り終えてから振り分け直すので、順に送った時と同じ結果になる(起動直後のClaude Codeへ重なった後の1通は`mode=agent_steer`で返る)。前の1通が起動直後の入力受付待ちなら、その分だけ返りが遅れる。待つ上限(POSIX 60秒、Windows 180秒)を越えた時は、打鍵前に`AGENT_SEND_BUSY`と「文字列は送信していません」を返す。送信の途中で終了したprocessのlockは、次の送信が片付けて進む。
|
|
270
272
|
|
|
271
273
|
`agent_launch`・`pty_send`(agent session宛て)は任意の`image`(画像ファイルの絶対パスの配列。png/jpg/jpeg/gif/webp)を受ける。aitermが本文末尾へ添付行を付け、どのharnessも自分のfile読取toolでそのpathを画像として開く。呼出し側はharness別の添付手順を覚えない。不正なpathは送信前に拒否する。
|
|
@@ -582,12 +584,12 @@ Claudeの相関済み承認は既存の`claude_approval`を使う。
|
|
|
582
584
|
| `pty_close` | 冪等に閉じ、`closed` / `already_closed`を返す | `session_id` |
|
|
583
585
|
| `pty_list` | textと構造化したsession一覧、明示した非秘密環境変数の照会 | `env_keys?` |
|
|
584
586
|
| `pty_observe` | pane/harnessの生存、native process identity、状態と活動 | `session_id`, `cursor?` |
|
|
585
|
-
| `agent_launch` | harnessとmodelを別軸で選ぶ正規agent起動入口 | `harness`, `prompt?`, `model?`, `reasoning_effort?`, `cwd?`, `write_scope?`, `trust_project?`, `env_vars?`, `throughline_source_session?`, `throughline_supplement_file?` |
|
|
587
|
+
| `agent_launch` | harnessとmodelを別軸で選ぶ正規agent起動入口 | `harness`, `prompt?`, `model?`, `reasoning_effort?`, `fast?`, `cwd?`, `write_scope?`, `trust_project?`, `env_vars?`, `throughline_source_session?`, `throughline_supplement_file?` |
|
|
586
588
|
| `agent_auth` | 公式CLIの認証を開始・確認・取消し、公式URL・device code・入力待ちを返す | `harness`, `action`, `session_id?`, `cwd?`, `env_vars?`, `relogin?` |
|
|
587
589
|
| `agent_models` | harnessが今選べるmodelとreasoning effortを、そのharness自身の一覧からpromptを送らずに取得 | `harness`, `cwd?`, `include_hidden?` |
|
|
588
590
|
| `agent_approval` | Codexの現在の承認を検査し、単発許可・拒否を送る | `action`, `session_id`, `approval_choice?`, `observed_prompt_digest?` |
|
|
589
591
|
| `claude_agent` / `codex_agent` / `grok_agent` | deprecated互換alias(`composer_agent`は0.41.0で削除。Composerは`agent_launch`の`cursor-cli`で使う) | 旧launcher引数 |
|
|
590
|
-
| `agent_configure` | 起動中のClaude/Codex/Grok/Cursorを再起動せずmodel/effort変更 | `session_id`, `model?`, `reasoning_effort?` |
|
|
592
|
+
| `agent_configure` | 起動中のClaude/Codex/Grok/Cursorを再起動せずmodel/effort/fast変更 | `session_id`, `model?`, `reasoning_effort?`, `fast?` |
|
|
591
593
|
| `claude_turn` | 相関済みClaude operationをdispatch(issue)または回収(recover) | `action`, `session_id`, `operation_id`, `text?` |
|
|
592
594
|
| `claude_approval` | 現在表示中の相関済みClaude承認UIを検査または応答 | `action`, `session_id`, `operation_id?`, `approval_choice?`, `observed_prompt_digest?` |
|
|
593
595
|
| `diagnostics` | 機械可読 JSON による read-only factory readiness | (なし) |
|
|
@@ -617,7 +619,15 @@ Aitermは、既定では実行時エラーをどこへも送らない。送る
|
|
|
617
619
|
|
|
618
620
|
`agent_launch`は選んだharnessの対話TUIを新しい永続PTYに起動し、`session_id`を返す。harnessはagent loop・認証・hook・session・transcriptを所有し、modelは独立。以後は他sessionと同じ`pty_read`/`pty_send`で操作する。
|
|
619
621
|
|
|
620
|
-
`agent_configure({ session_id, model?, reasoning_effort? })`はharness標準操作で起動中のClaude/Codex/Grok/Cursorを変更し、PTYと会話contextを維持する。
|
|
622
|
+
`agent_configure({ session_id, model?, reasoning_effort?, fast? })`はharness標準操作で起動中のClaude/Codex/Grok/Cursorを変更し、PTYと会話contextを維持する。
|
|
623
|
+
|
|
624
|
+
**ファスト(`fast`)。** 各harnessの、費用や利用量を多く払って応答を速くする切り替え(Claude Codeの`/fast`、Codexの速度の段、GrokとCursorのfast版のmodel)を、席ごとに切り替える(ADR 0114)。
|
|
625
|
+
|
|
626
|
+
- 席は必ず通常の速度で起きる。`agent_launch`の`fast`を省いた時とfalseは同じで、利用者の設定にファストが残っていても通常で始まる。`fast: true`は通常で起こしてから、その席を切り替える。
|
|
627
|
+
- `agent_configure({ session_id, fast })`は、動いている席を起こし直さずに切り替える。`fast`だけでも渡せる。省略は、その席の今の状態を変えない。
|
|
628
|
+
- 切り替えは席だけに留める。harnessの切り替えの命令は利用者の既定(`~/.claude/settings.json`の`fastMode`、`~/.codex/config.toml`の`service_tier`、`~/.grok/config.toml`の`[models]`)も書き換えるので、Aitermが切り替えの直前の値へ戻す。Grokは起動の`--model`でも既定を書くので、起動の前後でも戻す。
|
|
629
|
+
- 返りの`fast`は、切り替えた後の実際の状態。`agent_models`のmodelごとの`fast`が、そのmodelで切り替えられるかを示す(GrokとCursorのfast版は別のmodelとして並ばず、元のmodelの`fast: true`になる)。最上位の`fast_unavailable`は、アカウントの都合でどのmodelでも使えない時の訳。
|
|
630
|
+
- 断りは文の先頭の符号で分かる: `FAST_MODE_NOT_SUPPORTED`(そのmodelは対応していない)、`FAST_MODE_UNAVAILABLE`(アカウントや契約で使えない)、`FAST_MODE_MODEL_CONFLICT`(modelへfast版のIDを書いて`fast: false`を渡した)、`FAST_MODE_UNCONFIRMED`(切り替えた後の状態を確かめられない)。起動で`FAST_MODE_UNAVAILABLE`・`FAST_MODE_UNCONFIRMED`になった時は、起動を断らずに通常の速度で起こし、返りを`fast: false`、`fast_error: { code, message }`にする。
|
|
621
631
|
|
|
622
632
|
`agent_auth({ harness, action:"start"|"status"|"cancel", session_id?, cwd?, env_vars?, relogin? })`は、各harnessの公式CLIで認証を進める。Claudeは`claude auth login`、CodexとGrokは`login --device-auth`、Cursorは`NO_OPEN_BROWSER=1 cursor-agent login`を使い、資格情報は各CLIだけが保存する。Aitermは資格情報を読取り・copy・編集せず、独自OAuthも実装しない。`remote`は他toolと同じ標準対応。
|
|
623
633
|
|
|
@@ -647,7 +657,7 @@ PTYが消失した場合は、相関記録の有無にかかわらず`status`が
|
|
|
647
657
|
| `grok-cli` | `grok agent stdio`の`initialize`(`_meta.modelState`) | modelごとのeffort。sessionは作らない |
|
|
648
658
|
| `cursor-cli` | `cursor-agent models` | 素のmodel IDと、Aitermが`<model>-<effort>`へ連結できるeffortへ分ける。`-fast`版とeffortが途中に入るIDは候補にしない。使う時は完成形をeffortなしで`model`に渡す |
|
|
649
659
|
|
|
650
|
-
結果(`aiterm.agent-models.v1`)は`{ harness, source, harness_version, default_model, efforts, adapter_efforts, models: [{ id, display_name, efforts, default_effort, hidden }] }`。`id`とeffortはそのまま`agent_launch`/`agent_configure`へ渡せる。上位の`efforts`は全modelの和。取得不能は`MODEL_CATALOG_UNAVAILABLE`、形式異常は`MODEL_CATALOG_INVALID`で、別の一覧へfallbackしない。`remote`を付けると、その端末のharnessの一覧を返す。
|
|
660
|
+
結果(`aiterm.agent-models.v1`)は`{ harness, source, harness_version, default_model, efforts, adapter_efforts, fast_unavailable, models: [{ id, display_name, efforts, default_effort, hidden, fast }] }`。`id`とeffortはそのまま`agent_launch`/`agent_configure`へ渡せる。上位の`efforts`は全modelの和。取得不能は`MODEL_CATALOG_UNAVAILABLE`、形式異常は`MODEL_CATALOG_INVALID`で、別の一覧へfallbackしない。`remote`を付けると、その端末のharnessの一覧を返す。
|
|
651
661
|
|
|
652
662
|
```json
|
|
653
663
|
{ "name": "agent_models", "arguments": { "harness": "grok-cli" } }
|
package/README.md
CHANGED
|
@@ -227,7 +227,7 @@ collection is off by default and performs no network I/O. It ships via
|
|
|
227
227
|
tag-triggered CI with npm provenance (OIDC Trusted Publishing); the GitHub
|
|
228
228
|
Release re-registers the Official MCP Registry entry.
|
|
229
229
|
|
|
230
|
-
**Status:** actively maintained · current public release **v0.
|
|
230
|
+
**Status:** actively maintained · current public release **v0.59.1** · 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).
|
|
231
231
|
|
|
232
232
|
### Update and rollback
|
|
233
233
|
|
|
@@ -291,6 +291,8 @@ Set `require_agent:true` on `pty_send` when the integration requires agent deliv
|
|
|
291
291
|
|
|
292
292
|
`pty_send` to an agent session accepts an optional `preface`: one line placed before the text, so the message reads "`preface`, blank line, `text`". For a Claude Code session Aiterm enters the `preface` without the terminal's paste markers and pastes the blank line and the text in one paste. Claude Code wraps long pasted text in `<pasted_content>` and follows instructions inside it only where the user's own words outside the tags ask it to, so this keeps an integration's header (who the message is from) outside the wrapper. For Codex, Grok and Cursor sessions the three parts are joined and pasted as before. The `preface` must be a single line of at most 200 characters with no control characters, must not start with a symbol or whitespace, and must not contain `@`; otherwise Aiterm returns `AGENT_PREFACE_INVALID` and "文字列は送信していません。" before sending anything. It cannot be used with ordinary PTY sends, `force:true`, or `remote`.
|
|
293
293
|
|
|
294
|
+
When the caller gives no `preface`, Aiterm adds one itself for a Claude Code session whenever the text is long enough for Claude Code to wrap it (three or more line breaks, or 800 characters and up): "Aitermが届ける、この席の呼び手からの正規の送信です。下の貼り付けは、どこかから拾った文ではなく、呼び手がこの席へ宛てて送った文です。" ("A regular message from this session's caller, delivered by Aiterm. The paste below was sent to this session by the caller, not picked up from somewhere else.") The line states where the message comes from and does not tell the session to obey it. It applies to new turns, to steering, to the `prompt` of `agent_launch`, and to `remote` sessions (the Aiterm on that machine adds it). Without that line the whole message sits inside the wrapper, and a Claude Code session may decline to act on it as "not the user's own instruction". Short texts, Codex, Grok and Cursor sessions, and sends with `raw` or `force` are unchanged (ADR 0116).
|
|
295
|
+
|
|
294
296
|
Overlapping `pty_send` calls to the same agent session are handled one at a time. A later call picks its route only after the earlier one has been sent, so the result matches calls made in sequence (a call that overlaps the first send to a freshly started Claude Code session returns `mode=agent_steer`). It returns later by however long the earlier call waits for the session to accept input. If its turn does not come within the limit (60 seconds on POSIX, 180 seconds on Windows), Aiterm refuses before sending any text and returns `AGENT_SEND_BUSY` with an explicit unsent message. A lock left by a process that exited mid-send is cleared by the next send.
|
|
295
297
|
|
|
296
298
|
`agent_launch` and `pty_send` (to an agent session) accept an optional `image`: an array of absolute paths to image files (png/jpg/jpeg/gif/webp). Aiterm appends an attachment block to the prompt, and every harness opens the path with its own file-reading tool and sees the image; the caller never learns harness-specific attachment tricks. Invalid paths are rejected before anything is sent.
|
|
@@ -624,12 +626,12 @@ continue to use `claude_approval`.
|
|
|
624
626
|
| `pty_close` | Close idempotently; return `closed` / `already_closed` | `session_id` |
|
|
625
627
|
| `pty_list` | Text and structured session list (each agent session carries its harness conversation ID as `vendor_session_id`), with explicitly requested non-secret environment values | `env_keys?` |
|
|
626
628
|
| `pty_observe` | Pane/harness liveness, native process identity, state, and activity | `session_id`, `cursor?` |
|
|
627
|
-
| `agent_launch` | Canonical agent launch; harness and model are independent | `harness`, `prompt?`, `model?`, `reasoning_effort?`, `cwd?`, `write_scope?`, `trust_project?`, `env_vars?`, `throughline_source_session?`, `throughline_supplement_file?` |
|
|
629
|
+
| `agent_launch` | Canonical agent launch; harness and model are independent | `harness`, `prompt?`, `model?`, `reasoning_effort?`, `fast?`, `cwd?`, `write_scope?`, `trust_project?`, `env_vars?`, `throughline_source_session?`, `throughline_supplement_file?` |
|
|
628
630
|
| `agent_auth` | 公式CLIの認証を開始・確認・取消し、公式URL・device code・入力待ちを返す | `harness`, `action`, `session_id?`, `cwd?`, `env_vars?`, `relogin?` |
|
|
629
631
|
| `agent_models` | List the models and reasoning efforts a harness offers now, read from that harness's own catalog without sending a prompt | `harness`, `cwd?`, `include_hidden?` |
|
|
630
632
|
| `agent_approval` | Inspect a Codex approval and submit a one-time approval or denial | `action`, `session_id`, `approval_choice?`, `observed_prompt_digest?` |
|
|
631
633
|
| `claude_agent` / `codex_agent` / `grok_agent` | Deprecated compatibility aliases (`composer_agent` was removed in 0.41.0; run Composer with `agent_launch` on `cursor-cli`) | legacy launcher arguments |
|
|
632
|
-
| `agent_configure` | Change model/effort in a running Claude, Codex, Grok, or Cursor session without restarting it | `session_id`, `model?`, `reasoning_effort?` |
|
|
634
|
+
| `agent_configure` | Change model/effort/fast in a running Claude, Codex, Grok, or Cursor session without restarting it | `session_id`, `model?`, `reasoning_effort?`, `fast?` |
|
|
633
635
|
| `claude_turn` | Issue (dispatch-only) or recover one correlated Claude operation | `action`, `session_id`, `operation_id`, `text?` |
|
|
634
636
|
| `claude_approval` | Inspect or answer the current correlated Claude approval prompt | `action`, `session_id`, `operation_id?`, `approval_choice?`, `observed_prompt_digest?` |
|
|
635
637
|
| `diagnostics` | Read-only factory readiness as machine-readable JSON | (none) |
|
|
@@ -662,7 +664,15 @@ enables collection on that host.
|
|
|
662
664
|
|
|
663
665
|
`agent_launch` starts a selected harness's interactive coding-agent TUI inside a fresh persistent PTY and returns its `session_id`. The harness owns the agent loop, authentication, hooks, session, and transcript; `model` is independent. The TUI is a full-screen app, so read it with `pty_read({ screen: true })` for the rendered view.
|
|
664
666
|
|
|
665
|
-
`agent_configure({ session_id, model?, reasoning_effort? })` changes a running Claude, Codex, Grok, or Cursor TUI through the harness's standard controls, preserving the PTY and conversation context.
|
|
667
|
+
`agent_configure({ session_id, model?, reasoning_effort?, fast? })` changes a running Claude, Codex, Grok, or Cursor TUI through the harness's standard controls, preserving the PTY and conversation context.
|
|
668
|
+
|
|
669
|
+
**ファスト(`fast`)。** 各harnessの、費用や利用量を多く払って応答を速くする切り替え(Claude Codeの`/fast`、Codexの速度の段、GrokとCursorのfast版のmodel)を、席ごとに切り替える(ADR 0114)。
|
|
670
|
+
|
|
671
|
+
- 席は必ず通常の速度で起きる。`agent_launch`の`fast`を省いた時とfalseは同じで、利用者の設定にファストが残っていても通常で始まる。`fast: true`は通常で起こしてから、その席を切り替える。
|
|
672
|
+
- `agent_configure({ session_id, fast })`は、動いている席を起こし直さずに切り替える。`fast`だけでも渡せる。省略は、その席の今の状態を変えない。
|
|
673
|
+
- 切り替えは席だけに留める。harnessの切り替えの命令は利用者の既定(`~/.claude/settings.json`の`fastMode`、`~/.codex/config.toml`の`service_tier`、`~/.grok/config.toml`の`[models]`)も書き換えるので、Aitermが切り替えの直前の値へ戻す。Grokは起動の`--model`でも既定を書くので、起動の前後でも戻す。
|
|
674
|
+
- 返りの`fast`は、切り替えた後の実際の状態。`agent_models`のmodelごとの`fast`が、そのmodelで切り替えられるかを示す(GrokとCursorのfast版は別のmodelとして並ばず、元のmodelの`fast: true`になる)。最上位の`fast_unavailable`は、アカウントの都合でどのmodelでも使えない時の訳。
|
|
675
|
+
- 断りは文の先頭の符号で分かる: `FAST_MODE_NOT_SUPPORTED`(そのmodelは対応していない)、`FAST_MODE_UNAVAILABLE`(アカウントや契約で使えない)、`FAST_MODE_MODEL_CONFLICT`(modelへfast版のIDを書いて`fast: false`を渡した)、`FAST_MODE_UNCONFIRMED`(切り替えた後の状態を確かめられない)。起動で`FAST_MODE_UNAVAILABLE`・`FAST_MODE_UNCONFIRMED`になった時は、起動を断らずに通常の速度で起こし、返りを`fast: false`、`fast_error: { code, message }`にする。
|
|
666
676
|
|
|
667
677
|
Claude Codeの席では、`/model`の選ぶ画面の`s`(use this session only)で替える。`/model <名前>`・`/effort <値>`は選んだ値を端末の`~/.claude/settings.json`へ新しい会話の既定として保存するので、打たない(ADR 0111)。その選び方が無い版、選ぶ画面に無いmodel、そのmodelで選べないeffortは、何も変えずに断る(`CLAUDE_MODEL_SESSION_ONLY_UNAVAILABLE`・`CLAUDE_MODEL_NOT_IN_PICKER`・`CLAUDE_EFFORT_NOT_SELECTABLE`)。席を閉じて立て直すと端末の既定へ戻るので、立て直す時は`agent_launch`へ同じ`model`・`reasoning_effort`を渡す。
|
|
668
678
|
|
package/dist/agent-shared.js
CHANGED
|
@@ -33,6 +33,41 @@ export function readTailLinesNewestFirst(file, maxBytes) {
|
|
|
33
33
|
lines.shift();
|
|
34
34
|
return lines.filter(line => line.trim() !== "").reverse();
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* 記録を末尾から先頭へさかのぼり、行を新しい順に`visit`へ渡す。`visit`がundefined以外を返したら、そこで止めてその値を返す。
|
|
38
|
+
* 先頭まで読んで何も返らなければundefined。書いている途中の行(改行で終わっていない末尾)がある時と、読めなかった時はnull。
|
|
39
|
+
* 1回に読むのは`chunkBytes`ずつ。行が読む範囲に収まらない時は、収まるまで範囲を広げる(行の途中では切らない)。
|
|
40
|
+
*/
|
|
41
|
+
export function scanLinesNewestFirst(file, visit, chunkBytes) {
|
|
42
|
+
let end = safeStatSize(file);
|
|
43
|
+
for (let tail = true; end > 0; tail = false) {
|
|
44
|
+
let span = chunkBytes;
|
|
45
|
+
let start = Math.max(0, end - span);
|
|
46
|
+
let chunk = readFileRange(file, start, end);
|
|
47
|
+
// 範囲の先頭で切れた行は、次の回で読む。改行が範囲の最後の1つだけなら、その行は範囲に収まっていない。
|
|
48
|
+
let cut = start === 0 ? 0 : chunk.indexOf(0x0a) + 1;
|
|
49
|
+
while (chunk.length === end - start && start > 0 && (cut === 0 || cut === chunk.length)) {
|
|
50
|
+
span *= 2;
|
|
51
|
+
start = Math.max(0, end - span);
|
|
52
|
+
chunk = readFileRange(file, start, end);
|
|
53
|
+
cut = start === 0 ? 0 : chunk.indexOf(0x0a) + 1;
|
|
54
|
+
}
|
|
55
|
+
if (chunk.length !== end - start)
|
|
56
|
+
return null;
|
|
57
|
+
if (tail && chunk[chunk.length - 1] !== 0x0a)
|
|
58
|
+
return null;
|
|
59
|
+
const lines = chunk.subarray(cut).toString("utf8").split("\n");
|
|
60
|
+
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
61
|
+
if (lines[index].trim() === "")
|
|
62
|
+
continue;
|
|
63
|
+
const found = visit(lines[index]);
|
|
64
|
+
if (found !== undefined)
|
|
65
|
+
return found;
|
|
66
|
+
}
|
|
67
|
+
end = start + cut;
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
36
71
|
export function readFileRange(p, from, to) {
|
|
37
72
|
const len = Math.max(0, to - from);
|
|
38
73
|
if (len === 0)
|
|
@@ -121,6 +156,7 @@ export function pollGate(intervalMs, now = () => performance.now()) {
|
|
|
121
156
|
export const AGENT_EVENT_MAX_BYTES = 1024 * 1024;
|
|
122
157
|
export const AGENT_EVENT_TAIL_BYTES = 64 * 1024;
|
|
123
158
|
// turnの境界(開始・終わり)を、harnessの記録の末尾から探す時に読む大きさ。終わった席では境界は末尾の近くにある。
|
|
159
|
+
// 動いている番の開始は、番が長いとこれより前になる。開始を探す所は、この大きさずつさかのぼる(scanLinesNewestFirst)。
|
|
124
160
|
export const AGENT_TURN_BOUNDARY_TAIL_BYTES = 1024 * 1024;
|
|
125
161
|
export const CODEX_TRANSCRIPT_INCREMENT_MAX_BYTES = 16 * 1024 * 1024;
|
|
126
162
|
export const GROK_TRANSCRIPT_INCREMENT_MAX_BYTES = 16 * 1024 * 1024;
|
|
@@ -238,7 +274,17 @@ export function agentHarness(kind) {
|
|
|
238
274
|
? "cursor-cli"
|
|
239
275
|
: "grok-cli";
|
|
240
276
|
}
|
|
241
|
-
|
|
277
|
+
/**
|
|
278
|
+
* 呼び手が`preface`を渡さない時に、Aitermが自分で貼り付けの印なしで入れる1行(ADR 0116)。
|
|
279
|
+
* Claude Codeは、貼り付けの印で入った長い文を`<pasted_content>`で包み、包みの中の指示を「包みの外の利用者自身の言葉が
|
|
280
|
+
* 頼んだ時だけ従う」と読む。包みの外に何も無いと、席は呼び手の頼みを「誰かが貼った文」と見て手を止める事がある。
|
|
281
|
+
* 出所だけを言い、従えとは書かない(誰の頼みをどう扱うかは、席の決まりに任せる)。
|
|
282
|
+
*/
|
|
283
|
+
export const AGENT_DEFAULT_PREFACE = "Aitermが届ける、この席の呼び手からの正規の送信です。下の貼り付けは、どこかから拾った文ではなく、呼び手がこの席へ宛てて送った文です。";
|
|
284
|
+
/**
|
|
285
|
+
* sub-agentへ起動時に渡す文。`notes`は、harnessごとに足す行(閉じる印の前に入る)。
|
|
286
|
+
*/
|
|
287
|
+
export function subagentInstruction(meta, notes = []) {
|
|
242
288
|
if (meta.agent_role !== "subagent" ||
|
|
243
289
|
!meta.parent_session_id ||
|
|
244
290
|
!Number.isSafeInteger(meta.delegation_depth) ||
|
|
@@ -257,6 +303,7 @@ export function subagentInstruction(meta) {
|
|
|
257
303
|
"delegation_allowed=true",
|
|
258
304
|
"任務の所有権を保ち、結果を親へ返してください。必要なら追加のsub-agentへ委譲してよいです。",
|
|
259
305
|
"ただし、同じ任務全体を同型agentへ反射的に丸投げして自己複製ループを作らないでください。",
|
|
306
|
+
...notes,
|
|
260
307
|
"</aiterm_subagent_context>",
|
|
261
308
|
].join("\n");
|
|
262
309
|
}
|