aiterm-mcp 0.46.0 → 0.46.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 +8 -1
- package/README.ja.md +3 -1
- package/README.md +3 -1
- package/dist/core.js +38 -8
- package/docs/DESIGN.md +2 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.46.1] - 2026-10-02
|
|
11
|
+
|
|
12
|
+
### 修正
|
|
13
|
+
|
|
14
|
+
- 認証PTYが閉じられた、またはbackend再起動で失われた場合、`agent_auth`の`status`は`failed`、`cancel`は取消済みの`blocked`を返し、`session_id:null`で再開始できる。通常PTY・harness不一致・記録の破損や読取り失敗は引き続きエラーとする。
|
|
15
|
+
|
|
10
16
|
## [0.46.0] - 2026-10-02
|
|
11
17
|
|
|
12
18
|
### 追加
|
|
@@ -1958,7 +1964,8 @@ prototype (preserved under `prototype/python/` as the porting source and referen
|
|
|
1958
1964
|
`ubuntu-latest` for Node 18/20/22, publishing to npm on `v*` tags with
|
|
1959
1965
|
provenance.
|
|
1960
1966
|
|
|
1961
|
-
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.46.
|
|
1967
|
+
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.46.1...HEAD
|
|
1968
|
+
[0.46.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.46.0...v0.46.1
|
|
1962
1969
|
[0.46.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.45.2...v0.46.0
|
|
1963
1970
|
[0.45.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.45.1...v0.45.2
|
|
1964
1971
|
[0.45.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.45.0...v0.45.1
|
package/README.ja.md
CHANGED
|
@@ -203,7 +203,7 @@ runtime-error store は canonical dotagents config の `collection.enabled: true
|
|
|
203
203
|
場合だけ収集し、既定OFF、network送信は行いません。tag起点CIのnpm provenance(OIDC Trusted
|
|
204
204
|
Publishing)で公開し、GitHub Release が Official MCP Registry を再登録します。
|
|
205
205
|
|
|
206
|
-
**状態:** 開発継続中 · 現行公開版 **v0.46.
|
|
206
|
+
**状態:** 開発継続中 · 現行公開版 **v0.46.1** · 動作対象は Linux · WSL2 · macOS · Windows ネイティブ · MIT · [変更履歴](CHANGELOG.md)。
|
|
207
207
|
|
|
208
208
|
### 更新と巻き戻し
|
|
209
209
|
|
|
@@ -556,6 +556,8 @@ consumer は `aiterm-runtime-errors snapshot` を読み、durable ingestion 後
|
|
|
556
556
|
|
|
557
557
|
Grokには公式認証status commandが無いため、session付きの確認は公式loginのexit 0を正本にし、session無しの確認は`blocked`を返す。他harnessは公式statusも照合する。Claudeは認証後の公式初回案内を同じsessionで進め、選択待ちは`blocked`/`input_required:true`で返す。`authenticated`は認証結果であり、`agent_launch`の起動準備完了は別途確認する。`cancel`は指定した認証sessionだけを閉じ、資格情報を削除しない。
|
|
558
558
|
|
|
559
|
+
PTYが消失した場合は、相関記録の有無にかかわらず`status`が`failed`、`cancel`が既に終了・取消済みを示す`blocked`を返し、どちらも`session_id:null`となる。保存したsession IDを解除して`start`で再開始できる。生存中の通常PTYやharness不一致、記録の破損・読取り失敗はエラーを返す。
|
|
560
|
+
|
|
559
561
|
`agent_models({ harness, cwd?, include_hidden? })`は、導入済みのharnessが今選べるmodel IDとreasoning effortを返す。画面の候補を、実際にagentを動かす端末の一覧から作れる。各harness自身の一覧を読むだけで、promptもturnも送らない。
|
|
560
562
|
|
|
561
563
|
| `harness` | 取得元 | 補足 |
|
package/README.md
CHANGED
|
@@ -217,7 +217,7 @@ collection is off by default and performs no network I/O. It ships via
|
|
|
217
217
|
tag-triggered CI with npm provenance (OIDC Trusted Publishing); the GitHub
|
|
218
218
|
Release re-registers the Official MCP Registry entry.
|
|
219
219
|
|
|
220
|
-
**Status:** actively maintained · current public release **v0.46.
|
|
220
|
+
**Status:** actively maintained · current public release **v0.46.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).
|
|
221
221
|
|
|
222
222
|
### Update and rollback
|
|
223
223
|
|
|
@@ -591,6 +591,8 @@ Consumer flow is `aiterm-runtime-errors snapshot`, then `aiterm-runtime-errors a
|
|
|
591
591
|
|
|
592
592
|
Grokには公式認証status commandが無いため、session付きの確認は公式loginのexit 0を正本にし、session無しの確認は`blocked`を返す。他harnessは公式statusも照合する。Claudeは認証後の公式初回案内を同じsessionで進め、選択待ちは`blocked`/`input_required:true`で返す。`authenticated`は認証結果であり、`agent_launch`の起動準備完了は別途確認する。`cancel`は指定した認証sessionだけを閉じ、資格情報を削除しない。
|
|
593
593
|
|
|
594
|
+
PTYが消失した場合は、相関記録の有無にかかわらず`status`が`failed`、`cancel`が既に終了・取消済みを示す`blocked`を返し、どちらも`session_id:null`となる。保存したsession IDを解除して`start`で再開始できる。生存中の通常PTYやharness不一致、記録の破損・読取り失敗はエラーを返す。
|
|
595
|
+
|
|
594
596
|
`agent_models({ harness, cwd?, include_hidden? })` returns the model IDs and reasoning efforts the installed harness offers right now, so a UI can build its choices from the machine that actually runs the agents. It reads each harness's own catalog and never sends a prompt or starts a turn:
|
|
595
597
|
|
|
596
598
|
| `harness` | Source | Notes |
|
package/dist/core.js
CHANGED
|
@@ -3372,13 +3372,26 @@ function authPane(meta, screen) {
|
|
|
3372
3372
|
}
|
|
3373
3373
|
}
|
|
3374
3374
|
function loadAuthMetadata(name, kind) {
|
|
3375
|
+
let source;
|
|
3376
|
+
try {
|
|
3377
|
+
source = fs.readFileSync(authMetadataPath(name), "utf8");
|
|
3378
|
+
}
|
|
3379
|
+
catch (error) {
|
|
3380
|
+
if (error.code === "ENOENT")
|
|
3381
|
+
return null;
|
|
3382
|
+
throw error;
|
|
3383
|
+
}
|
|
3375
3384
|
let value;
|
|
3376
3385
|
try {
|
|
3377
|
-
value = JSON.parse(
|
|
3386
|
+
value = JSON.parse(source);
|
|
3378
3387
|
}
|
|
3379
|
-
catch {
|
|
3380
|
-
|
|
3388
|
+
catch (error) {
|
|
3389
|
+
if (error instanceof SyntaxError)
|
|
3390
|
+
throw new AitermError("AGENT_AUTH_STATE_INVALID: 認証sessionの記録が不正です。", 2);
|
|
3391
|
+
throw error;
|
|
3381
3392
|
}
|
|
3393
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
3394
|
+
throw new AitermError("AGENT_AUTH_STATE_INVALID: 認証sessionの記録が不正です。", 2);
|
|
3382
3395
|
if (value.kind !== kind)
|
|
3383
3396
|
throw new AitermError("AGENT_AUTH_HARNESS_MISMATCH: 認証sessionのharnessが一致しません。", 2);
|
|
3384
3397
|
if (typeof value.bin !== "string" || typeof value.cwd !== "string" || !path.isAbsolute(value.cwd)
|
|
@@ -3388,6 +3401,10 @@ function loadAuthMetadata(name, kind) {
|
|
|
3388
3401
|
}
|
|
3389
3402
|
return value;
|
|
3390
3403
|
}
|
|
3404
|
+
/** 一覧の取得失敗を端末の消失へ丸めず、正規PTY一覧で存在を確認する。 */
|
|
3405
|
+
function authSessionExists(name) {
|
|
3406
|
+
return listSessionsResult().sessions.some(session => session.session_id === name);
|
|
3407
|
+
}
|
|
3391
3408
|
function authSessionEnvironment(name, keys) {
|
|
3392
3409
|
const env = { ...process.env };
|
|
3393
3410
|
for (const key of keys) {
|
|
@@ -3417,7 +3434,14 @@ export async function authenticateAgent(kind, options) {
|
|
|
3417
3434
|
if (options.action === "cancel") {
|
|
3418
3435
|
if (!options.session_id)
|
|
3419
3436
|
throw new AitermError("AGENT_AUTH_SESSION_REQUIRED: cancelにはsession_idが必要です。", 2);
|
|
3420
|
-
loadAuthMetadata(options.session_id, kind);
|
|
3437
|
+
const meta = loadAuthMetadata(options.session_id, kind);
|
|
3438
|
+
if (!authSessionExists(options.session_id)) {
|
|
3439
|
+
if (meta)
|
|
3440
|
+
fs.unlinkSync(authMetadataPath(options.session_id));
|
|
3441
|
+
return result("blocked", null, "認証sessionは既に終了または取消済みです。");
|
|
3442
|
+
}
|
|
3443
|
+
if (!meta)
|
|
3444
|
+
throw new AitermError("AGENT_AUTH_SESSION_NOT_FOUND: 指定sessionはAitermの認証sessionではありません。", 2);
|
|
3421
3445
|
closeSession(options.session_id);
|
|
3422
3446
|
return result("blocked", null, "認証sessionを取り消しました。");
|
|
3423
3447
|
}
|
|
@@ -3461,13 +3485,19 @@ export async function authenticateAgent(kind, options) {
|
|
|
3461
3485
|
const checked = authStatus(kind, bin, cwd);
|
|
3462
3486
|
return result(checked.status === "authenticated" ? "authenticated" : checked.status === "failed" ? "failed" : "blocked", null, checked.message ?? (checked.status === "unauthenticated" ? "公式CLIの認証が必要です。agent_authのstartで開始してください。" : null));
|
|
3463
3487
|
}
|
|
3464
|
-
else
|
|
3465
|
-
|
|
3488
|
+
else {
|
|
3489
|
+
const loaded = loadAuthMetadata(name, kind);
|
|
3490
|
+
if (!authSessionExists(name))
|
|
3491
|
+
return result("failed", null, "認証sessionが失われました。agent_authのstartで開始してください。");
|
|
3492
|
+
if (!loaded)
|
|
3493
|
+
throw new AitermError("AGENT_AUTH_SESSION_NOT_FOUND: 指定sessionはAitermの認証sessionではありません。", 2);
|
|
3494
|
+
meta = loaded;
|
|
3495
|
+
}
|
|
3466
3496
|
const session = name;
|
|
3467
3497
|
const deadline = performance.now() + (options.action === "start" ? 3000 : 0);
|
|
3468
3498
|
for (;;) {
|
|
3469
|
-
if (!
|
|
3470
|
-
return result("failed",
|
|
3499
|
+
if (!authSessionExists(session))
|
|
3500
|
+
return result("failed", null, "認証sessionが失われました。agent_authのstartで開始してください。");
|
|
3471
3501
|
const observed = tmux("display-message", "-p", "-t", session, "#{pane_dead}\t#{pane_dead_status}");
|
|
3472
3502
|
if (observed.code !== 0)
|
|
3473
3503
|
return result("failed", session, "認証processの終了状態を取得できません。");
|
package/docs/DESIGN.md
CHANGED
|
@@ -248,6 +248,8 @@ shell、接続先、各harnessの公式CLIが所有する。
|
|
|
248
248
|
|
|
249
249
|
`agent_auth`の共通進行はcore、公式command・status・認証画面の解釈は`src/harnesses/`が所有する。CLIの認証processを通常HOMEのPTYへ一度だけ起動し、`remain-on-exit`と`pane_dead_status`で終了を観測する。credentialを読み取る状態管理や独自OAuthは持たず、Aitermが保存するのは認証sessionのharness・実行file・cwd・phase・引き継いだenvの名前だけである。取消と通常のPTY closeでこの相関記録を削除する。
|
|
250
250
|
|
|
251
|
+
PTYが消失した場合は、相関記録の有無にかかわらず`status`が`failed`、`cancel`が既に終了・取消済みを示す`blocked`を返し、どちらも`session_id:null`となる。保存したsession IDを解除して`start`で再開始できる。生存中の通常PTYやharness不一致、記録の破損・読取り失敗はエラーを返す。
|
|
252
|
+
|
|
251
253
|
Claude/Codex/Cursorは公式statusを照合する。Grokは公式status commandが無いため、認証sessionの公式login exit 0を正本にし、session無しの確認を`blocked`とする。Claudeはlogin完了後に同じPTYへ公式の初回TUIを用意し、初回案内の入力待ちを`blocked`/`input_required:true`へ写す。認証とlauncherの起動準備は別の結果であり、`agent_launch`のready gateを省略しない。
|
|
252
254
|
|
|
253
255
|
公開receiptは`aiterm.agent-auth-result.v1`で、公式HTTPS URLと明示device codeだけを抽出する。生の画面本文・credential・token・OAuth callback codeは含めない。人の入力は既存の`pty_send`/`pty_key`で同じPTYへ送る。`remote`は標準のremote tool中継を使い、callerはCLI commandや環境ごとの入力方言を組み立てない。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiterm-mcp",
|
|
3
|
-
"version": "0.46.
|
|
3
|
+
"version": "0.46.1",
|
|
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": [
|