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 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.0...HEAD
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.0** · 動作対象は Linux · WSL2 · macOS · Windows ネイティブ · MIT · [変更履歴](CHANGELOG.md)。
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.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).
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(fs.readFileSync(authMetadataPath(name), "utf8"));
3386
+ value = JSON.parse(source);
3378
3387
  }
3379
- catch {
3380
- throw new AitermError("AGENT_AUTH_SESSION_NOT_FOUND: 指定sessionはAitermの認証sessionではありません。", 2);
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
- meta = loadAuthMetadata(name, kind);
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 (!sessionExists(session))
3470
- return result("failed", session, "認証sessionが終了観測前に失われました。");
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.0",
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": [