@tocca-systems/twp-cli 0.17.1 → 0.19.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.
Files changed (34) hide show
  1. package/CHANGELOG.public.md +8 -0
  2. package/README.md +82 -7
  3. package/dist/{ai-dispatch-27EZS2S3.js → ai-dispatch-PNA4UF4I.js} +2 -2
  4. package/dist/{api-command-UIL4WGMG.js → api-command-JJJOEIZQ.js} +2 -2
  5. package/dist/{app-LLSZV6SM.js → app-SOQPONUU.js} +22 -21
  6. package/dist/auto-update-CV2MM32C.js +4 -0
  7. package/dist/auto-update-worker-ML7EBNQW.js +16 -0
  8. package/dist/{backlog-AYEKG575.js → backlog-NV7Z76R3.js} +1 -1
  9. package/dist/chunk-3WHC4FSG.js +15 -0
  10. package/dist/chunk-5WGOHFAS.js +3 -0
  11. package/dist/chunk-BOBSH3QN.js +9 -0
  12. package/dist/{chunk-SQSVA6AT.js → chunk-BYRM4NSC.js} +1 -1
  13. package/dist/chunk-DEVIQH5U.js +18 -0
  14. package/dist/{chunk-RQFG3OUL.js → chunk-FOFV2MNL.js} +1 -1
  15. package/dist/chunk-GTABFTZP.js +23 -0
  16. package/dist/chunk-ILKQDXI5.js +22 -0
  17. package/dist/{chunk-Y5RTTQ4Y.js → chunk-MGKVUKU5.js} +90 -43
  18. package/dist/{chunk-7WEYBZSK.js → chunk-MIMDLO52.js} +1 -1
  19. package/dist/{chunk-H3JTPDCJ.js → chunk-NWABK3RZ.js} +3 -18
  20. package/dist/{chunk-KXFT226N.js → chunk-VGK2JMBW.js} +17 -15
  21. package/dist/{chunk-63LDNYGW.js → chunk-XNLIEUAW.js} +1 -1
  22. package/dist/cli.js +54 -33
  23. package/dist/{commands-VUWI4ERO.js → commands-7D5EEQBY.js} +6 -5
  24. package/dist/{commands-XYKBLMXT.js → commands-EWRHQZYM.js} +56 -61
  25. package/dist/logout-guard-Q4MQFEGR.js +13 -0
  26. package/dist/{oneshot-HQJEXZHJ.js → oneshot-XLLRNRLK.js} +8 -7
  27. package/dist/{project-OKTJ32JT.js → project-BATJQR3F.js} +1 -1
  28. package/dist/{run-DWQEHR6I.js → run-OB3JFPSH.js} +2 -2
  29. package/dist/{setup-AJ56N6XO.js → setup-ROGEF3UO.js} +2 -1
  30. package/dist/{task-7K54BO5U.js → task-6QUH5OXF.js} +39 -8
  31. package/dist/update-EXFIHTMW.js +3 -0
  32. package/package.json +1 -1
  33. package/dist/chunk-S646CPM4.js +0 -9
  34. package/dist/update-WDWUECN7.js +0 -21
@@ -11,6 +11,14 @@
11
11
  `CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
12
12
  -->
13
13
 
14
+ ## 0.19.0
15
+
16
+ **`twp logout` が、同じ資格情報で動いている `twp task-loop` を止めてしまわないようにしました。** 同じマシンで同じプロファイルの task-loop が動いているときは、ログアウトせずに理由と影響(そのループが止まること・もう一度 `twp login` が必要になること)をお知らせします。それでもログアウトする場合は `twp logout --force` を使ってください。
17
+
18
+ **自動アップデートに対応しました。** `npm i -g @tocca-systems/twp-cli` で導入した twp は、1日1回新しい版を確認し、twp を終了したあとに自動で更新します(次に起動したときから新しい版で動きます)。更新後の初回起動では、何版から何版へ上がったかを1行でお知らせします。更新に失敗しても、いまの版のまま問題なく使えます(理由と手動の更新方法を1回だけお知らせします)。
19
+
20
+ 自動アップデートを止めるには、環境変数 `TWP_NO_AUTO_UPDATE=1` を設定するか、`~/.twp/config.json` に `"auto_update": false` を書いてください。npx やプロジェクトへのローカル導入で使っている場合は自動では更新せず、新しい版があることだけをお知らせします。
21
+
14
22
  ## 0.16.0
15
23
 
16
24
  `twp task-loop` が、使っている AI アカウントの枠(利用率・上限・再ログイン期限)をエージェントループ画面へ報告できるようになりました。**設定しなければ何も変わりません**(プローブの実行も送信も起きません)。
package/README.md CHANGED
@@ -44,8 +44,9 @@ twp -p "<プロンプト>" 非対話で 1 往復だけ実行(応答は stdout
44
44
  twp login ログイン(ブラウザ委譲 / --password / --token)
45
45
  twp login --tenant <code>
46
46
  テナントコードを先に指定する(--password のプロンプトを 1 つ省ける)
47
- twp logout / whoami
48
- twp update npm の最新版と、サーバが要求する最小バージョンを確認
47
+ twp logout ログアウト(同じ資格情報で twp task-loop が稼働中なら拒否する。--force で続行)
48
+ twp whoami ログイン中のユーザー・テナントを表示
49
+ twp update npm の最新版・サーバが要求する最小バージョン・自動更新の状態を確認
49
50
  twp --mode biz 起動時のモードを指定(dev | biz | plan)
50
51
  twp --permission-mode denyAll
51
52
  ツール実行の既定を上書き(plan | acceptEdits | denyAll)
@@ -80,6 +81,11 @@ twp task comment create <キー|ID> --body-file <背景.md> \
80
81
  --ask-question --question "<質問文>" --option ok=このまま進める --option back=差し戻す
81
82
  twp task comment create <キー|ID> --body-file <回答.md> --answer-to <コメントID> --select ok
82
83
 
84
+ # タスクの添付ファイル
85
+ twp task attachment list <キー|ID> # id / file_name / content_type / file_size / is_committed / created_at
86
+ twp task attachment upload <キー|ID> --file <パス> [--name <ファイル名>] [--content-type <型>]
87
+ twp task attachment download <添付ID> --out <パス> [--force]
88
+
83
89
  # --status / --type などに渡せる値を調べる
84
90
  twp task status list [--project <コード>]
85
91
  twp task type list [--project <コード>]
@@ -97,7 +103,9 @@ twp task label list [--project <コード>]
97
103
  - **フラグの値は `--flag 値` でも `--flag=値` でも書けます。** 空白を含む値は `--keyword "山田 太郎"` のように引用し、`-` で始まる値は `--keyword=-foo` の形で渡します
98
104
  - **質問(`--ask-question`)は質問文(`--question` / `--question-file`)と選択肢(`--option キー=表示文`・1〜5個)が要ります。** 選択肢のキーは10文字以内で、回答(`--select`)に使う識別子です。複数選択は `--multi-select`、自由記述を禁じるなら `--no-free-text`
99
105
  - **`twp task comment list` の `question` / `answer` 列で、回答済みかどうかが分かります**(同じページにある回答を質問の行へ突き合わせます。ページをまたぐ場合は `--all` を付けてください)
100
- - ヘルプは `twp task help` / `twp task comment help` / `twp task create help`
106
+ - **`twp task attachment upload` はアップロード用URLの発行・ファイルの転送・タスクへの紐づけを1コマンドで行います。** 既にある添付は残したまま追加します。紐づけに失敗したときは添付IDを stderr に出して失敗で終わります(紐づけていない添付はサーバが自動で削除するので、そのまま再実行して構いません)。`--dry-run` は最初のリクエスト(URLの発行)だけを表示します
107
+ - `twp task attachment download` は `twp backlog attachment download` と同じく **`--out` のパスへ実体を書き出し、既存ファイルは `--force` を付けたときだけ上書きします**。添付ID は `twp task attachment list` の `id` です
108
+ - ヘルプは `twp task help` / `twp task comment help` / `twp task create help` / `twp task attachment help`
101
109
 
102
110
  グローバルオプション: `--profile <名前>` / `--output <json|table|text|tsv>` / `--query <JMESPath>` / `--dry-run` / `--debug` / `--yes` / `--refresh`。**`--output json` は常に API の生のレスポンス**を返します(表示用に間引きません)。
103
111
 
@@ -163,9 +171,39 @@ twp task-loop stop
163
171
 
164
172
  **モデル取次には `cli` 権限付きトークンが必要。** `twp login`(ブラウザ委譲)と `twp login --password` が発行する。`twp login --token` で保存した通常トークンは TWP API には使えるが会話は 401 になる。
165
173
 
166
- ### 更新(`twp update`)
174
+ ### 自動アップデート
175
+
176
+ **`npm i -g @tocca-systems/twp-cli` で導入した場合、twp は自動で最新版へ更新される(既定で有効)。**
177
+
178
+ - 24時間に1回、バックグラウンドで npm registry の最新版を確認する(起動は待たせない)
179
+ - 新しい版があれば、**起動した twp が終了してから** `npm i -g @tocca-systems/twp-cli@<最新版>` を実行する。効くのは**次回起動から**で、実行中の twp は差し替えない
180
+ - 更新後の初回起動で `twp を 0.18.0 から 0.19.0 へ自動更新しました` のように stderr へ1行出す
181
+ - **失敗しても現在の版のまま動く。** 権限不足(グローバルの導入先に書けない)・registry 不達のときは、次回起動時に理由と手動の更新方法を1回だけ知らせる
182
+ - 通知はすべて stderr に出す(`--output json` の stdout は汚さない)
183
+
184
+ **無効化**(どちらでもよい。無効化すると確認の通信も起きない):
185
+
186
+ ```bash
187
+ export TWP_NO_AUTO_UPDATE=1
188
+ ```
189
+
190
+ ```jsonc
191
+ // ~/.twp/config.json
192
+ { "auto_update": false }
193
+ ```
194
+
195
+ | 導入のしかた | 挙動 |
196
+ |---|---|
197
+ | `npm i -g`(npm のグローバル導入) | 自動で更新する |
198
+ | npx / プロジェクトへのローカル導入 / pnpm | 更新しない。新しい版があることと更新方法を、版ごとに1回だけ知らせる |
199
+ | ソースから実行(`node dist/cli.js` 等) | 何もしない |
200
+ | `CI` が設定された環境 / `twp task-loop` とその配下 | 何もしない |
201
+
202
+ グローバル導入かどうかは、実行中の `cli.js` の実体パスが `npm root -g` 配下にあるかで判定する。状態は `~/.twp/update-state.json` に残る(消すと次回起動で確認し直す)。
203
+
204
+ ### 更新の確認(`twp update`)
167
205
 
168
- `twp update` は **npm の最新版**と、**接続先のリレーが要求する最小サポートバージョン**の両方を報告する。**自分では更新しない**(インストール方法・権限が環境で違うため、実行すべきコマンドを表示する)。最小サポート未満なら終了コード 1。
206
+ `twp update` は **npm の最新版**と、**接続先のリレーが要求する最小サポートバージョン**の両方を報告し、自動アップデートが効いているかも表示する。**このコマンド自身は更新を実行しない**(実行中の自分を差し替えないため。更新は上の自動アップデートが行う)。最小サポート未満なら終了コード 1。
169
207
 
170
208
  リレーは古いクライアントを拒否しない(`/api/cli/v1` の後方互換は恒久的に保つ)。止めるのは CLI 側で、**下限が読めない・取れないときは素通りする**(回線断やサーバ未対応で全員が使えなくなるのを避ける)。下限は `~/.twp/models.json` にプロファイル単位でキャッシュする。
171
209
 
@@ -180,6 +218,7 @@ twp 0.2.3
180
218
 
181
219
  最新版 0.3.0(npm registry)
182
220
  最小サポート 0.2.0(サーバ / https://ai-api.tocca.systems)
221
+ 自動更新 有効(npm グローバル導入・24時間ごとに確認し、次回起動から反映)
183
222
  判定 更新できます(必須ではありません)
184
223
 
185
224
  npm i -g @tocca-systems/twp-cli@latest
@@ -252,8 +291,8 @@ twp login
252
291
 
253
292
  | モード | ツール | 権限 |
254
293
  |---|---|---|
255
- | 開発 `dev` | ローカルツール全部 + 開発系 TWP ドメイン | 書き込みは確認 / 読み取りは許可 |
256
- | 業務 `biz` | TWP ドメイン中心 | `bash` と `write_file` は拒否 |
294
+ | 開発 `dev` | ローカルツール全部 + 開発系 TWP ドメイン | 書き込み・コマンド実行(`git` を含む)は確認 / 読み取りは許可 |
295
+ | 業務 `biz` | TWP ドメイン中心 | `bash` と `write_file` と `git` は拒否 |
257
296
  | プラン `plan` | 読み取りのみ | 全書き込み拒否 |
258
297
 
259
298
  **モデルはモードと直交する。** 業務モードに切り替えてもモデルは変わらない(`/model` で別に切り替える)。
@@ -285,6 +324,42 @@ permissions:
285
324
  - **書き間違えても起動は止まらない。** 読めなかった項目は警告を出して既定へ戻る。起動時に `⚠ モード定義:` が出たらその行を直す
286
325
  - いま何が効いているかは `/context` で確認できる(どのファイルが効いているか・有効ツール glob・常駐ツールの実体が出る)
287
326
 
327
+ ### 権限ルール(`~/.twp/settings.json` と `--allowed-tools`)
328
+
329
+ 「このコマンドは毎回聞かなくてよい」「このツールは絶対に使わせない」を、Claude Code と同じ記法で書ける。組織で使っている Claude Code の allowlist をそのまま移せる。
330
+
331
+ ```json
332
+ {
333
+ "permissions": {
334
+ "allow": ["Bash(git status:*)", "Bash(npm test)", "Write(src/**)", "git(log:*)"],
335
+ "ask": ["Bash(git push:*)"],
336
+ "deny": ["Bash(rm:*)", "twp_delete_task"]
337
+ }
338
+ }
339
+ ```
340
+
341
+ | 書き方 | 意味 |
342
+ |---|---|
343
+ | `Bash` / `twp_update_task` | そのツール全体 |
344
+ | `Bash(git status:*)` | `git status` で始まるコマンド(語の区切りで一致) |
345
+ | `Bash(npm test)` | そのコマンドと完全一致 |
346
+ | `Write(src/**)` / `Edit(src/*.ts)` / `Read(~/notes/**)` | パスの glob(素の相対と `/` 始まりは作業ディレクトリ基準・`//` 始まりは絶対パス・`~/` はホーム)。`Edit` は `write_file` も含む |
347
+ | `git(log:*)` | `git` ツールの `<サブコマンド> <引数>` |
348
+
349
+ 置き場所と強さ(上ほど強い): `--allowed-tools` / `--disallowed-tools`(カンマ区切り・繰り返し可)→ セッション内の「今後聞かない」→ `.twp/settings.local.json` → `.twp/settings.json` → `~/.twp/settings.json` → モードの方針。
350
+
351
+ - **拒否(deny)は常に勝つ。** どこに書いた deny も、どれだけ具体的な allow にも負けない。**モードの拒否も覆らない**(`--allowed-tools Bash` を付けても業務モードの `bash` は拒否のまま)
352
+ - 拒否が無ければ**より具体的なルールが勝つ**(`Bash` の allow より `Bash(npm test)` の ask が強い)。同じ具体性なら上の置き場所が勝つ
353
+ - **`Bash(git status:*)` を許可しても `git status && rm -rf .` は通らない。** 許可ルールは「解釈の余地が無い文字(英数字と `_ - . / = : , @ % +` と空白)だけでできた1本のコマンド」にしか当たらない。引用符・`$`・`#`・`~`・`*`・分岐・リダイレクトを含むものと `rm -rf` には当たらず、確認へ落ちる(`git commit -m "x"` のような引用符付きも確認になる)。拒否ルールは逆に、分岐した後ろの断片にも当たる
354
+ - **Windows の `shell`(PowerShell / cmd)には `Bash(...)` の許可ルールを当てない**(引用と分岐の規則が bash と違うため。拒否ルールは当たる)
355
+ - **信用できないリポジトリでは git の許可ルールも安全ではない。** `git status` は `.git/config` の `core.fsmonitor` を、`git log -p` は textconv を実行しうる。上の例の `Bash(git status:*)` / `git(log:*)` は、自分で clone した信用できるリポジトリで使う
356
+ - **リポジトリ側(`.twp/settings.json` / `.twp/settings.local.json`)は締める向きにしか効かない。** `allow` は無視して警告する(モード定義ファイルと同じ理由)。緩めるときは自分の `~/.twp/settings.json` に書く
357
+ - **設定ファイルが読めないと自動許可を止める。** 壊れたファイルに書いていた拒否が消えて緩むのを避けるため、直るまで「許可」は「確認」に変わる。起動時に `⚠ 権限設定:` が出たらその行を直す
358
+ - **拒否ルールは「よくある書き方を止める網」であって、書いたコマンドを確実に止める境界ではない。** `sudo rm` `/bin/rm` `then rm` `$(rm …)` のような書き方には当たるが、`find -exec rm` のように引数の中から起動するものは拾えない。確実に止めたいならツールごと拒否する(`Bash`)か、業務・プランモードを使う
359
+ - `Read(...)` の拒否は `grep` / `glob` にも効くが、**探索の起点がその範囲の中にあるときだけ**(リポジトリ全体を起点にした `grep` は、拒否した範囲の中まで読む)。確実に読ませないなら `Read` ごと拒否するか業務・プランモードを使う
360
+ - 設定ファイルが読めない間は、読み取りも含めて**すべての自動許可が確認に変わる**(`-p` では確認できないので拒否になる)
361
+ - `twp_call`(ツールを名前で呼ぶメタツール)は**中で実行されるツールの名前**で判定するよう権限エンジン側は用意してある。`twp_call` そのものを許可しても何も緩まない。**ただし `twp_call` 自体はまだ無い**(今後のバージョンで追加)
362
+
288
363
  ### `--permission-mode`(実行1回ぶんの上書き)
289
364
 
290
365
  モードの方針の上に、その実行ぶんの既定を重ねる。CI・SSH・パイプで「何が自動で通るか」を呼び出し側が明示するためのもの。
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-ZOOEH7ZE.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,detectAiClis,detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-H3JTPDCJ.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";
4
- import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{spawnSync}from"child_process";import fs2 from"fs";import path2 from"path";import{spawn}from"child_process";import fs from"fs";import path from"path";var FINAL_REPORT_BEGIN="<<<AI_FINAL_REPORT>>>";var FINAL_REPORT_END="<<<END_AI_FINAL_REPORT>>>";var ClaudeStreamRenderer=class{constructor(now=()=>new Date){this.now=now}now;toolNames=new Map;toolCount=0;result={subtype:null,isError:null,numTurns:null,costUsd:null,durationMs:null,tokensIn:null,tokensOut:null,rateLimited:false,resetsAt:null,finalText:""};push(line){const trimmed=line.trim();if(trimmed==="")return[];let event;try{const parsed=JSON.parse(trimmed);if(parsed===null||typeof parsed!=="\
3
+ import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-ZOOEH7ZE.js";import{detectAiClis}from"./chunk-DEVIQH5U.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-NWABK3RZ.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import{findExecutable,
4
+ isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-5WGOHFAS.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{spawnSync}from"child_process";import fs2 from"fs";import path2 from"path";import{spawn}from"child_process";import fs from"fs";import path from"path";var FINAL_REPORT_BEGIN="<<<AI_FINAL_REPORT>>>";var FINAL_REPORT_END="<<<END_AI_FINAL_REPORT>>>";var ClaudeStreamRenderer=class{constructor(now=()=>new Date){this.now=now}now;toolNames=new Map;toolCount=0;result={subtype:null,isError:null,numTurns:null,costUsd:null,durationMs:null,tokensIn:null,tokensOut:null,rateLimited:false,resetsAt:null,finalText:""};push(line){const trimmed=line.trim();if(trimmed==="")return[];let event;try{const parsed=JSON.parse(trimmed);if(parsed===null||typeof parsed!=="\
5
5
  object"||Array.isArray(parsed)){return[line]}event=parsed}catch{return[line]}switch(event["type"]){case"rate_limit_event":return this.onRateLimit(event);case"assistant":return this.onAssistant(event);case"user":return this.onUser(event);case"result":return this.onResult(event);default:return event["type"]==="system"?[]:[line]}}sawRateLimit(){return this.result.rateLimited}lastRateLimitNote="";onRateLimit(event){const info=event["rate_limit_info"];if(info===null||typeof info!=="object")return[];const rec=info;
6
6
  const status=typeof rec["status"]==="string"?rec["status"]:"";const resets=typeof rec["resetsAt"]==="number"?rec["resetsAt"]:null;if(status==="")return[];const at=isSaneEpochSec(resets)?` resets=${new Date(resets*1e3).toISOString()}`:"";if(status.startsWith("allowed")){if(status==="allowed")return[];const seen=`${status}|${resets??""}`;if(seen===this.lastRateLimitNote)return[];this.lastRateLimitNote=seen;return[this.line(`\u2139\uFE0F \u4E0A\u9650\u306B\u63A5\u8FD1\uFF08status=${status}${at}\uFF09\u2014 \u5B9F\
7
7
  \u884C\u306F\u7D99\u7D9A\u3057\u307E\u3059`)]}if(resets!==null)this.result.resetsAt=resets;this.result.rateLimited=true;return[this.line(`\u26A0\uFE0F \u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u901A\u77E5: status=${status}${at}`)]}onAssistant(event){const out=[];for(const block of contentBlocks(event)){if(block.type==="tool_use"){const name=typeof block.name==="string"?block.name:"tool";if(typeof block.id==="string")this.toolNames.set(block.id,name);this.toolCount+=1;out.push(this.line(`>> ${name}${toolDetail(
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{readBody}from"./chunk-QVXZEUKN.js";import{OUTPUT_FORMATS,evaluateQuery,exitCodeFor,fetchAllPages,redactSecretValues,renderOutput,reportError,resolveOutputFormat,withDebug}from"./chunk-KXFT226N.js";import"./chunk-WVS4W5FY.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-63LDNYGW.js";import{GLOBAL_OPTIONS_HELP,HELP_TOKEN}from"./chunk-FKIZ5ZJU.js";import{parseOperationArgs,repeatedValues}from"./chunk-O52CUEDO.js";import"./chunk-QQRJLH6B.js";
4
- import"./chunk-7WEYBZSK.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JKSXUBND.js";import"./chunk-II5RVJQN.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,positiveInteger,readEnvelopeCursor,shellQuote}from"./chunk-2VISRLWS.js";
3
+ import{OUTPUT_FORMATS,evaluateQuery,exitCodeFor,fetchAllPages,redactSecretValues,renderOutput,reportError,resolveOutputFormat,withDebug}from"./chunk-VGK2JMBW.js";import"./chunk-WVS4W5FY.js";import{parseOperationArgs,repeatedValues}from"./chunk-O52CUEDO.js";import{GLOBAL_OPTIONS_HELP,HELP_TOKEN}from"./chunk-FKIZ5ZJU.js";import"./chunk-QQRJLH6B.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{readBody}from"./chunk-QVXZEUKN.js";
4
+ import"./chunk-MIMDLO52.js";import"./chunk-II5RVJQN.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JKSXUBND.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,positiveInteger,readEnvelopeCursor,shellQuote}from"./chunk-2VISRLWS.js";
5
5
  import{EXIT_OK,NetworkError,UsageError}from"./chunk-M3GWY6NT.js";import"./chunk-5QCAIKFE.js";import"./chunk-VSJBJXZO.js";import{readFile}from"fs/promises";import{existsSync}from"fs";import{dirname,join,resolve}from"path";import{fileURLToPath}from"url";var DIR_NAME="command-model";var cachedDir;function commandModelDir(){if(cachedDir!==void 0)return cachedDir;let current=dirname(fileURLToPath(import.meta.url));for(let depth=0;depth<6;depth+=1){const candidate=join(current,DIR_NAME);if(existsSync(join(candidate,"index.json"))){cachedDir=candidate;return cachedDir}if(existsSync(join(current,"package.json")))break;const parent=resolve(
6
6
  current,"..");if(parent===current)break;current=parent}cachedDir=null;return cachedDir}var CommandModelMissingError=class extends Error{constructor(detail){super(`\u30B3\u30DE\u30F3\u30C9\u30E2\u30C7\u30EB\uFF08${DIR_NAME}/\uFF09\u3092\u8AAD\u3081\u307E\u305B\u3093: ${detail}
7
7
  \u958B\u767A\u6642\u306F \`npm run generate:command-model -- --spec <api.json>\` \u3067\u751F\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);this.name="CommandModelMissingError"}};var domainCache=new Map;var routesCache=null;async function readJson(file){const dir=commandModelDir();if(dir===null)throw new CommandModelMissingError("\u30D1\u30C3\u30B1\u30FC\u30B8\u306B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u3042\u308A\u307E\u305B\u3093");const path=join(dir,file);try{return JSON.parse(await readFile(path,"utf8"))}catch(cause){throw new CommandModelMissingError(`${path} \u3092\u8AAD\u3081\u307E\u305B\u3093\uFF08${cause.message}\uFF09`)}}async function loadCommandModelRoutes(){if(routesCache!==null)return routesCache;const file=await readJson("_routes.json");if(typeof file?.routes!=="object"||file.routes===null||Array.isArray(file.routes)){throw new CommandModelMissingError("_routes.json \u306E\u5F62\u304C\u9055\u3044\u307E\u3059\uFF08routes \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09")}routesCache=file;return routesCache}async function loadCommandModelDomain(domain){const cached=domainCache.get(domain);if(cached!==void 0)return cached;
@@ -1,8 +1,8 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{RESIDENT_TOKEN_CAP,activateModeFiles,buildResidentSet,buildSystemPrompt,createAuditLogger,currentBranch,describeAuditLog,displayCwd,runTurn}from"./chunk-Y5RTTQ4Y.js";import{RelayError,builtinCatalog,createRuntime,loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-RQFG3OUL.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-N2UVRM3Z.js";import"./chunk-PMOUHEJQ.js";import{applyPermissionMode,
4
- checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-S646CPM4.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-WVS4W5FY.js";import"./chunk-63LDNYGW.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{__commonJS,__export,__require,
5
- __toESM}from"./chunk-VSJBJXZO.js";var require_react_production=__commonJS({"node_modules/react/cjs/react.production.js"(exports){"use strict";var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element");var REACT_PORTAL_TYPE=Symbol.for("react.portal");var REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");var REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode");var REACT_PROFILER_TYPE=Symbol.for("react.profiler");var REACT_CONSUMER_TYPE=Symbol.for("react.consumer");var REACT_CONTEXT_TYPE=Symbol.for("react.context");var REACT_FORWARD_REF_TYPE=Symbol.
3
+ import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,currentBranch,describeAuditLog,displayCwd,runTurn}from"./chunk-MGKVUKU5.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-WVS4W5FY.js";import"./chunk-N2UVRM3Z.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-BOBSH3QN.js";import{RelayError,builtinCatalog,createRuntime,
4
+ loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-FOFV2MNL.js";import"./chunk-XNLIEUAW.js";import"./chunk-PMOUHEJQ.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";
5
+ import{__commonJS,__export,__require,__toESM}from"./chunk-VSJBJXZO.js";var require_react_production=__commonJS({"node_modules/react/cjs/react.production.js"(exports){"use strict";var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element");var REACT_PORTAL_TYPE=Symbol.for("react.portal");var REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");var REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode");var REACT_PROFILER_TYPE=Symbol.for("react.profiler");var REACT_CONSUMER_TYPE=Symbol.for("react.consumer");var REACT_CONTEXT_TYPE=Symbol.for("react.context");var REACT_FORWARD_REF_TYPE=Symbol.
6
6
  for("react.forward_ref");var REACT_SUSPENSE_TYPE=Symbol.for("react.suspense");var REACT_MEMO_TYPE=Symbol.for("react.memo");var REACT_LAZY_TYPE=Symbol.for("react.lazy");var REACT_ACTIVITY_TYPE=Symbol.for("react.activity");var REACT_VIEW_TRANSITION_TYPE=Symbol.for("react.view_transition");var MAYBE_ITERATOR_SYMBOL=Symbol.iterator;function getIteratorFn(maybeIterable){if(null===maybeIterable||"object"!==typeof maybeIterable)return null;maybeIterable=MAYBE_ITERATOR_SYMBOL&&maybeIterable[MAYBE_ITERATOR_SYMBOL]||
7
7
  maybeIterable["@@iterator"];return"function"===typeof maybeIterable?maybeIterable:null}var ReactNoopUpdateQueue={isMounted:function(){return false},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}};var assign=Object.assign;var emptyObject={};function Component(props,context,updater){this.props=props;this.context=context;this.refs=emptyObject;this.updater=updater||ReactNoopUpdateQueue}Component.prototype.isReactComponent={};Component.prototype.setState=
8
8
  function(partialState,callback){if("object"!==typeof partialState&&"function"!==typeof partialState&&null!=partialState)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,partialState,callback,"setState")};Component.prototype.forceUpdate=function(callback){this.updater.enqueueForceUpdate(this,callback,"forceUpdate")};function ComponentDummy(){}ComponentDummy.prototype=Component.prototype;function PureComponent2(props,context,updater){
@@ -1260,8 +1260,8 @@ Text,{children:[(0,import_jsx_runtime8.jsx)(Text,{color:"cyan",children:ev.name.
1260
1260
  shiftTab2.raw)}\uFF08${hexRaw(shiftTab2.raw)}\uFF09`:"\u672A\u691C\u51FA \u2014 Shift+Tab \u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044"}),!shiftTab2&&tab2?(0,import_jsx_runtime8.jsx)(Text,{color:"yellow",children:"Tab \u306E\u307F\u691C\u51FA\u3002\u3053\u306E\u7AEF\u672B\u306F Shift+Tab \u3092\u7D20\u306E TAB \u3068\u3057\u3066\u9001\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF08Alt+M / /mode \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\uFF09"}):null]}),(0,import_jsx_runtime8.jsxs)(
1261
1261
  Box_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime8.jsx)(Text,{bold:true,children:"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\uFF08\u30D7\u30ED\u30AD\u30B7 / CA\uFF09"}),diagnostics.map(line=>(0,import_jsx_runtime8.jsxs)(Text,{children:[(0,import_jsx_runtime8.jsx)(Text,{color:"cyan",children:padDisplay(line.label,22)}),(0,import_jsx_runtime8.jsx)(Text,{color:line.warn===true?"yellow":void 0,children:line.value})]},line.label)),caWarn?(0,import_jsx_runtime8.jsx)(Text,{color:"\
1262
1262
  yellow",children:"\u26A0 TLS \u508D\u53D7\u30D7\u30ED\u30AD\u30B7\u914D\u4E0B\u3067\u306F NODE_EXTRA_CA_CERTS \u306B\u30D7\u30ED\u30AD\u30B7\u306E CA \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08Node \u8D77\u52D5\u6642\u306B\u3057\u304B\u8AAD\u307E\u308C\u306A\u3044\u305F\u3081\u3001\u8A2D\u5B9A\u5F8C\u306B twp \u3092\u518D\u8D77\u52D5\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\uFF09"}):null]}),(0,import_jsx_runtime8.jsx)(Text,{dimColor:true,children:"Esc \u3067\u623B\u308B"})]})}var import_react37=__toESM(require_react(),1);function useTerminalSize(){const read=()=>({rows:process.stdout.rows||24,columns:process.stdout.columns||80});const[size,setSize]=(0,import_react37.useState)(read);(0,import_react37.useEffect)(()=>{const onResize=()=>setSize(read());process.stdout.on("resize",onResize);return()=>{process.stdout.off("resize",onResize)}},[]);return size}var import_jsx_runtime9=__toESM(require_jsx_runtime(),1);function paletteFor(text,mode){return text.startsWith("/")&&!text.includes(" ")?filterCommands(text,mode):[]}function insert(b,value){return{text:b.text.slice(0,b.cursor)+value+b.text.slice(b.cursor),cursor:b.cursor+value.length}}var seq=0;var nextId=()=>`i${++seq}`;function fullInputFor(request){const command=request.input["command"];if(typeof command==="string"&&command!=="")return command;return request.preview}function catalogTitleSuffix(source){
1263
- if(source==="server")return"";return source==="cache"?" \u2014 \u30AD\u30E3\u30C3\u30B7\u30E5":" \u2014 \u7D44\u307F\u8FBC\u307F\u4E00\u89A7\uFF08\u672A\u53D6\u5F97\uFF09"}function App2({initialMode,initialModel,initialCatalog,initialModelWarning,runtime,version,startInDoctor,permissionMode,audit}){const{exit}=use_app_default();const size=useTerminalSize();const stream=useTokenStream();const[items,setItems]=(0,import_react38.useState)(()=>[{id:nextId(),kind:"banner",banner:buildBanner({version,model:initialModel,
1264
- width:process.stdout.columns||80,branch:currentBranch()})}]);const bufferRef=(0,import_react38.useRef)({text:"",cursor:0});const[buffer,setBufferState]=(0,import_react38.useState)(bufferRef.current);const[mode,setMode]=(0,import_react38.useState)(initialMode);const[model,setModel]=(0,import_react38.useState)(initialModel);const[catalog,setCatalog]=(0,import_react38.useState)(initialCatalog);const[busy,setBusy]=(0,import_react38.useState)(false);const[context,setContext]=(0,import_react38.useState)(
1263
+ if(source==="server")return"";return source==="cache"?" \u2014 \u30AD\u30E3\u30C3\u30B7\u30E5":" \u2014 \u7D44\u307F\u8FBC\u307F\u4E00\u89A7\uFF08\u672A\u53D6\u5F97\uFF09"}function App2({initialMode,initialModel,initialCatalog,initialModelWarning,runtime,version,startInDoctor,permissionMode,permissionLayers,audit}){const{exit}=use_app_default();const size=useTerminalSize();const stream=useTokenStream();const[items,setItems]=(0,import_react38.useState)(()=>[{id:nextId(),kind:"banner",banner:buildBanner(
1264
+ {version,model:initialModel,width:process.stdout.columns||80,branch:currentBranch()})}]);const bufferRef=(0,import_react38.useRef)({text:"",cursor:0});const[buffer,setBufferState]=(0,import_react38.useState)(bufferRef.current);const[mode,setMode]=(0,import_react38.useState)(initialMode);const[model,setModel]=(0,import_react38.useState)(initialModel);const[catalog,setCatalog]=(0,import_react38.useState)(initialCatalog);const[busy,setBusy]=(0,import_react38.useState)(false);const[context,setContext]=(0,import_react38.useState)(
1265
1265
  ()=>runtime.context.snapshot());const[runningTool,setRunningTool]=(0,import_react38.useState)(null);const[overlay,setOverlay]=(0,import_react38.useState)(startInDoctor?"doctor":"none");const[pendingPermission,setPendingPermission]=(0,import_react38.useState)(null);const[keyLog,setKeyLog]=(0,import_react38.useState)([]);const[ctrlCArmed,setCtrlCArmed]=(0,import_react38.useState)(false);const[pasting,setPasting]=(0,import_react38.useState)(false);const setBuffer=(0,import_react38.useCallback)(fn=>{
1266
1266
  bufferRef.current=fn(bufferRef.current);setBufferState(bufferRef.current)},[]);const clearBuffer=(0,import_react38.useCallback)(()=>setBuffer(()=>({text:"",cursor:0})),[setBuffer]);const selectedRef=(0,import_react38.useRef)(0);const[selectedState,setSelectedState]=(0,import_react38.useState)(0);const setSelected=(0,import_react38.useCallback)(next=>{selectedRef.current=typeof next==="function"?next(selectedRef.current):next;setSelectedState(selectedRef.current)},[]);const modeRef=(0,import_react38.useRef)(
1267
1267
  mode);modeRef.current=mode;const modelRef=(0,import_react38.useRef)(model);modelRef.current=model;const busyRef=(0,import_react38.useRef)(false);const abortRef=(0,import_react38.useRef)(false);const streamAbortRef=(0,import_react38.useRef)(null);const sleepRef=(0,import_react38.useRef)(null);const permissionResolver=(0,import_react38.useRef)(null);const sessionAllow=(0,import_react38.useRef)(new Set);const demoSessionAllow=(0,import_react38.useRef)(new Set);const lastToolRef=(0,import_react38.useRef)(
@@ -1271,22 +1271,22 @@ floor=>{const text=minSupportedBlockMessage(version,floor??"");commit({kind:"not
1271
1271
  return}if(initialModelWarning!==null){commit({kind:"notice",tone:"warn",text:initialModelWarning})}let cancelled=false;const pending=runtime.loadCatalog();catalogFetchRef.current=pending;void pending.then(fetched=>{if(cancelled)return;if(isBelowMinSupported(version,fetched.minSupportedVersion)){blockOnMinSupported(fetched.minSupportedVersion);return}setCatalog(fetched);const picked=pickModel(fetched,modelRef.current);if(picked.model!==modelRef.current){setModel(picked.model);if(picked.warning!==
1272
1272
  void 0)commit({kind:"notice",tone:"warn",text:picked.warning})}});return()=>{cancelled=true}},[blockOnMinSupported,commit,initialModelWarning,runtime,version]);const sleep=ms=>new Promise(resolve=>{const timer=setTimeout(()=>{sleepRef.current=null;resolve()},ms);sleepRef.current={timer,resolve}});const abortSleep=()=>{const s=sleepRef.current;if(!s)return;clearTimeout(s.timer);sleepRef.current=null;s.resolve()};const askPermission=spec=>new Promise(resolve=>{setPendingPermission(spec);setSelected(
1273
1273
  0);setOverlay("permission");permissionResolver.current=choice=>{setOverlay("none");setPendingPermission(null);permissionResolver.current=null;resolve(choice)}});const runTurn2=(0,import_react38.useCallback)(async text=>{if(busyRef.current){commit({kind:"notice",tone:"warn",text:"\u5B9F\u884C\u4E2D\u3067\u3059\u3002Ctrl+C \u3067\u4E2D\u65AD\u3057\u3066\u304B\u3089\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044"});return}busyRef.current=true;abortRef.current=false;setBusy(true);commit({kind:"user",
1274
- text});const startupCatalog=await catalogFetchRef.current;if(startupCatalog&&isBelowMinSupported(version,startupCatalog.minSupportedVersion)){blockOnMinSupported(startupCatalog.minSupportedVersion);return}const controller=new AbortController;streamAbortRef.current=controller;stream.begin();try{const turnMode=getMode(modeRef.current);const resident=buildResidentSet(turnMode,{...permissionMode!==void 0?{permissionMode}:{}});const result=await runTurn(runtime.client,runtime.context,{input:text,model:modelRef.
1275
- current,system:buildSystemPrompt({cwd:cwd2,branch,modeLabel:turnMode.label,cliVersion:version,toolNames:resident.tools.map(t=>t.name),...turnMode.prompt!==void 0?{modePrompt:turnMode.prompt}:{}}),signal:controller.signal,onTextDelta:delta=>stream.push(stripTerminalControls(delta)),tools:resident.tools,execute:{mode:turnMode,ctx:{cwd:process.cwd()},sessionAllow:sessionAllow.current,...permissionMode!==void 0?{permissionMode}:{},audit,askPermission:request=>askPermission({name:request.tool.name,input:fullInputFor(
1276
- request),...request.diff?{diff:request.diff}:{},noAlwaysReason:request.noAlwaysReason}),onStart:(tool,preview)=>{const safe=stripTerminalControls(preview);setRunningTool({name:stripTerminalControls(tool.name),summary:safe,input:safe,output:"",status:"running"})}},onToolUse:()=>{const partial=stream.end();stream.clear();if(partial.trim()!=="")commit({kind:"assistant",text:partial})},onToolResult:(call,toolResult)=>{setRunningTool(null);const label=stripTerminalControls(toolResult.summary??call.name);
1277
- const run={name:stripTerminalControls(call.name),summary:label,input:label,output:stripTerminalControls(toolResult.content),status:toolResult.denied===true?"denied":toolResult.isError===true?"error":"done",...toolResult.diff?{diff:toolResult.diff}:{}};lastToolRef.current=run;commit({kind:"tool",run});stream.begin()}});const full=stream.end();stream.clear();if(full.trim()!=="")commit({kind:"assistant",text:full});if(result.maxStepsReached){commit({kind:"notice",tone:"warn",text:"\u30C4\u30FC\u30EB\u5B9F\u884C\u306E\u5F80\u5FA9\u304C\u4E0A\u9650\u306B\u9054\u3057\u305F\u305F\u3081\
1278
- \u6253\u3061\u5207\u308A\u307E\u3057\u305F\u3002\u7D9A\u304D\u306F\u540C\u3058\u4F1A\u8A71\u3067\u6307\u793A\u3057\u3066\u304F\u3060\u3055\u3044"})}if(result.droppedMessages>0){commit({kind:"notice",tone:"warn",text:`\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u4E0A\u9650\u306B\u8FD1\u3065\u3044\u305F\u305F\u3081\u3001\u53E4\u3044\u3084\u308A\u53D6\u308A ${result.droppedMessages} \u4EF6\u3092\u5C65\u6B74\u304B\u3089\u843D\u3068\u3057\u307E\u3057\u305F\uFF08/clear \u3067\u660E\u793A\u7684\u306B\u6D88\u305B\u307E\u3059\uFF09`})}
1279
- if(result.upstreamError!==null){commit({kind:"notice",tone:"error",text:`\u30E2\u30C7\u30EB\u306E\u5FDC\u7B54\u304C\u9014\u4E2D\u3067\u7D42\u308F\u308A\u307E\u3057\u305F: ${result.upstreamError}`})}if(result.aborted){commit({kind:"notice",tone:"warn",text:"\u4E2D\u65AD\u3057\u307E\u3057\u305F\uFF08Ctrl+C\uFF09\u2014 \u3053\u3053\u307E\u3067\u306E\u6D88\u8CBB\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u306B\u8A08\u4E0A\u3055\u308C\u307E\u3059"})}else if(result.emptyResponse){
1280
- commit({kind:"notice",tone:"warn",text:"\u30E2\u30C7\u30EB\u304B\u3089\u30C6\u30AD\u30B9\u30C8\u5FDC\u7B54\u304C\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F"})}}catch(err){const partial=stream.end();stream.clear();if(partial.trim()!=="")commit({kind:"assistant",text:partial});commit({kind:"notice",tone:"error",text:err instanceof RelayError?err.message:`\u30E2\u30C7\u30EB\u53D6\u6B21\u3067\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: ${err.message}`})}finally{streamAbortRef.current=
1281
- null;setRunningTool(null);setContext(runtime.context.snapshot());busyRef.current=false;setBusy(false)}},[audit,blockOnMinSupported,branch,commit,cwd2,permissionMode,runtime,stream,version]);const runDemo=(0,import_react38.useCallback)(async text=>{if(busyRef.current){commit({kind:"notice",tone:"warn",text:"\u5B9F\u884C\u4E2D\u3067\u3059\u3002Ctrl+C \u3067\u4E2D\u65AD\u3057\u3066\u304B\u3089\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044"});return}busyRef.current=true;abortRef.current=false;setBusy(
1282
- true);commit({kind:"user",text});for(const step of buildScenario(text)){if(abortRef.current)break;if(step.type==="text"){await stream.start(step.text);stream.clear();if(!abortRef.current)commit({kind:"assistant",text:step.text});continue}const spec=step.spec;const policy=applyPermissionMode(checkPermission(spec.name,getMode(modeRef.current)),spec.risk??"exec",permissionMode).decision;const decision=policy!=="deny"&&demoSessionAllow.current.has(spec.name)?"allow":policy;if(decision==="deny"){const run={
1283
- name:spec.name,summary:spec.summary,input:spec.input,output:`permission denied: ${getMode(modeRef.current).label}\u30E2\u30FC\u30C9\u3067\u306F ${spec.name} \u306F deny \u3067\u3059`,status:"denied"};commit({kind:"tool",run});commit({kind:"notice",tone:"warn",text:"deny-and-continue: \u62D2\u5426\u3092 tool result \u3068\u3057\u3066\u30E2\u30C7\u30EB\u3078\u8FD4\u3057\u3001\u30EB\u30FC\u30D7\u306F\u7D9A\u884C\u3057\u307E\u3059\uFF08\u7121\u8A00\u306E allow \u306B\u306F\u3057\u306A\u3044\uFF09"});
1274
+ text});const startupCatalog=await catalogFetchRef.current;if(startupCatalog&&isBelowMinSupported(version,startupCatalog.minSupportedVersion)){blockOnMinSupported(startupCatalog.minSupportedVersion);return}const controller=new AbortController;streamAbortRef.current=controller;stream.begin();try{const turnMode=getMode(modeRef.current);const resident=buildResidentSet(turnMode,{...permissionMode!==void 0?{permissionMode}:{},permissionLayers});const result=await runTurn(runtime.client,runtime.context,
1275
+ {input:text,model:modelRef.current,system:buildSystemPrompt({cwd:cwd2,branch,modeLabel:turnMode.label,cliVersion:version,toolNames:resident.tools.map(t=>t.name),...turnMode.prompt!==void 0?{modePrompt:turnMode.prompt}:{}}),signal:controller.signal,onTextDelta:delta=>stream.push(stripTerminalControls(delta)),tools:resident.tools,execute:{mode:turnMode,ctx:{cwd:process.cwd()},sessionAllow:sessionAllow.current,permissionLayers,...permissionMode!==void 0?{permissionMode}:{},audit,askPermission:request=>askPermission(
1276
+ {name:(request.target?.tool??request.tool).name,input:fullInputFor(request),...request.diff?{diff:request.diff}:{},noAlwaysReason:request.noAlwaysReason}),onStart:(tool,preview)=>{const safe=stripTerminalControls(preview);setRunningTool({name:stripTerminalControls(tool.name),summary:safe,input:safe,output:"",status:"running"})}},onToolUse:()=>{const partial=stream.end();stream.clear();if(partial.trim()!=="")commit({kind:"assistant",text:partial})},onToolResult:(call,toolResult)=>{setRunningTool(
1277
+ null);const label=stripTerminalControls(toolResult.summary??call.name);const run={name:stripTerminalControls(call.name),summary:label,input:label,output:stripTerminalControls(toolResult.content),status:toolResult.denied===true?"denied":toolResult.isError===true?"error":"done",...toolResult.diff?{diff:toolResult.diff}:{}};lastToolRef.current=run;commit({kind:"tool",run});stream.begin()}});const full=stream.end();stream.clear();if(full.trim()!=="")commit({kind:"assistant",text:full});if(result.maxStepsReached){
1278
+ commit({kind:"notice",tone:"warn",text:"\u30C4\u30FC\u30EB\u5B9F\u884C\u306E\u5F80\u5FA9\u304C\u4E0A\u9650\u306B\u9054\u3057\u305F\u305F\u3081\u6253\u3061\u5207\u308A\u307E\u3057\u305F\u3002\u7D9A\u304D\u306F\u540C\u3058\u4F1A\u8A71\u3067\u6307\u793A\u3057\u3066\u304F\u3060\u3055\u3044"})}if(result.droppedMessages>0){commit({kind:"notice",tone:"warn",text:`\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u4E0A\u9650\u306B\u8FD1\u3065\u3044\u305F\u305F\u3081\u3001\u53E4\u3044\u3084\u308A\u53D6\u308A ${result.
1279
+ droppedMessages} \u4EF6\u3092\u5C65\u6B74\u304B\u3089\u843D\u3068\u3057\u307E\u3057\u305F\uFF08/clear \u3067\u660E\u793A\u7684\u306B\u6D88\u305B\u307E\u3059\uFF09`})}if(result.upstreamError!==null){commit({kind:"notice",tone:"error",text:`\u30E2\u30C7\u30EB\u306E\u5FDC\u7B54\u304C\u9014\u4E2D\u3067\u7D42\u308F\u308A\u307E\u3057\u305F: ${result.upstreamError}`})}if(result.aborted){commit({kind:"notice",tone:"warn",text:"\u4E2D\u65AD\u3057\u307E\u3057\u305F\uFF08Ctrl+C\uFF09\u2014 \u3053\u3053\u307E\u3067\u306E\u6D88\u8CBB\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u306B\u8A08\u4E0A\u3055\u308C\u307E\u3059"})}else if(result.
1280
+ emptyResponse){commit({kind:"notice",tone:"warn",text:"\u30E2\u30C7\u30EB\u304B\u3089\u30C6\u30AD\u30B9\u30C8\u5FDC\u7B54\u304C\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F"})}}catch(err){const partial=stream.end();stream.clear();if(partial.trim()!=="")commit({kind:"assistant",text:partial});commit({kind:"notice",tone:"error",text:err instanceof RelayError?err.message:`\u30E2\u30C7\u30EB\u53D6\u6B21\u3067\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: ${err.message}`})}finally{streamAbortRef.
1281
+ current=null;setRunningTool(null);setContext(runtime.context.snapshot());busyRef.current=false;setBusy(false)}},[audit,blockOnMinSupported,branch,commit,cwd2,permissionLayers,permissionMode,runtime,stream,version]);const runDemo=(0,import_react38.useCallback)(async text=>{if(busyRef.current){commit({kind:"notice",tone:"warn",text:"\u5B9F\u884C\u4E2D\u3067\u3059\u3002Ctrl+C \u3067\u4E2D\u65AD\u3057\u3066\u304B\u3089\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044"});return}busyRef.current=true;abortRef.
1282
+ current=false;setBusy(true);commit({kind:"user",text});for(const step of buildScenario(text)){if(abortRef.current)break;if(step.type==="text"){await stream.start(step.text);stream.clear();if(!abortRef.current)commit({kind:"assistant",text:step.text});continue}const spec=step.spec;const policy=applyPermissionMode(checkPermission(spec.name,getMode(modeRef.current)),spec.risk??"exec",permissionMode).decision;const decision=policy!=="deny"&&demoSessionAllow.current.has(spec.name)?"allow":policy;if(decision===
1283
+ "deny"){const run={name:spec.name,summary:spec.summary,input:spec.input,output:`permission denied: ${getMode(modeRef.current).label}\u30E2\u30FC\u30C9\u3067\u306F ${spec.name} \u306F deny \u3067\u3059`,status:"denied"};commit({kind:"tool",run});commit({kind:"notice",tone:"warn",text:"deny-and-continue: \u62D2\u5426\u3092 tool result \u3068\u3057\u3066\u30E2\u30C7\u30EB\u3078\u8FD4\u3057\u3001\u30EB\u30FC\u30D7\u306F\u7D9A\u884C\u3057\u307E\u3059\uFF08\u7121\u8A00\u306E allow \u306B\u306F\u3057\u306A\u3044\uFF09"});
1284
1284
  continue}if(decision==="ask"){const choice=await askPermission(spec);if(choice==="no"){commit({kind:"tool",run:{name:spec.name,summary:spec.summary,input:spec.input,output:"\u30E6\u30FC\u30B6\u30FC\u304C\u62D2\u5426\u3057\u307E\u3057\u305F",status:"denied"}});commit({kind:"notice",tone:"info",text:"\u300C\u4EE3\u308F\u308A\u306B\u3053\u3046\u3057\u3066\u300D\u306E\u5165\u529B\u6B04\u306F\u3053\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u306B\u306F\u3042\u308A\u307E\u305B\u3093\uFF08\u3053\u3053\u3067\u6253\u3061\u5207\u308A\u307E\u3059\uFF09"});
1285
1285
  break}if(choice==="always")demoSessionAllow.current.add(spec.name)}setRunningTool({name:spec.name,summary:spec.summary,input:spec.input,output:"",status:"running"});await sleep(spec.durationMs);setRunningTool(null);if(abortRef.current)break;const done={name:spec.name,summary:spec.summary,input:spec.input,output:spec.output,status:"done",durationMs:spec.durationMs};lastToolRef.current=done;commit({kind:"tool",run:done})}stream.clear();busyRef.current=false;setBusy(false)},[commit,stream]);const runCommand=(0,import_react38.useCallback)(
1286
1286
  line=>{const parsed=parseCommandLine(line);if(!parsed)return;const{args}=parsed;const name=resolveCommandName(parsed.name);switch(name){case"/exit":exit();return;case"/clear":setItems([]);runtime.context.clear();setContext(runtime.context.snapshot());return;case"/doctor":setOverlay("doctor");return;case"/model":setSelected(Math.max(0,catalog.ids.indexOf(model)));setOverlay("model");return;case"/mode":{const target=args[0];if(target!==void 0&&!isModeId(target)){commit({kind:"notice",tone:"warn",text:`\
1287
1287
  \u4E0D\u660E\u306A\u30E2\u30FC\u30C9: ${target}\uFF08dev | biz | plan\uFF09`});return}const to=target??nextMode(modeRef.current);setMode(to);commit({kind:"notice",tone:"info",text:`\u30E2\u30FC\u30C9\u3092 ${getMode(to).label}\uFF08${to}\uFF09\u306B\u5207\u308A\u66FF\u3048\u307E\u3057\u305F \u2014 ${getMode(to).description}`});return}case"/help":commit({kind:"notice",tone:"info",text:["\u4F1A\u8A71\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u3067\u5B9F\u969B\u306B\u30E2\u30C7\u30EB\u3078\u9001\u3089\u308C\u307E\u3059",
1288
1288
  `\u4F7F\u3048\u308B\u30B3\u30DE\u30F3\u30C9: ${commandsForMode(modeRef.current).map(c=>c.name).join(" ")}\uFF08/exit \u306F /quit \u3082\u53EF\uFF09`,...PENDING_COMMANDS.length>0?[`\u672A\u5B9F\u88C5\u306E\u305F\u3081\u767B\u9332\u3057\u3066\u3044\u306A\u3044\u30B3\u30DE\u30F3\u30C9: ${PENDING_COMMANDS.map(c=>c.name).join(" ")}`]:[],"\u30AD\u30FC: Shift+Tab \u307E\u305F\u306F Alt+M \u3067\u30E2\u30FC\u30C9\u5DE1\u56DE \xB7 Ctrl+R \u3067\u76F4\u524D\u306E\u30C4\u30FC\u30EB\u51FA\u529B\u3092\u5C55\u958B",
1289
- "\u6539\u884C: Shift+Enter\uFF08kitty \u5BFE\u5FDC\u7AEF\u672B\uFF09\xB7 Ctrl+J\uFF08\u5168\u7AEF\u672B\uFF09\xB7 \\ \u3092\u6253\u3063\u3066\u304B\u3089 Enter \u3067\u3082\u53EF"].join("\n")});return;case"/context":{const snapshot=runtime.context.snapshot();const t=snapshot.totals;const resident=buildResidentSet(getMode(modeRef.current),{...permissionMode!==void 0?{permissionMode}:{}});commit({kind:"notice",tone:"info",text:[`\u30E2\u30C7\u30EB: ${modelLabel(model)}\uFF08\u30E2\u30FC\u30C9\u3068\u306F\u72EC\u7ACB\uFF09`,
1289
+ "\u6539\u884C: Shift+Enter\uFF08kitty \u5BFE\u5FDC\u7AEF\u672B\uFF09\xB7 Ctrl+J\uFF08\u5168\u7AEF\u672B\uFF09\xB7 \\ \u3092\u6253\u3063\u3066\u304B\u3089 Enter \u3067\u3082\u53EF"].join("\n")});return;case"/context":{const snapshot=runtime.context.snapshot();const t=snapshot.totals;const resident=buildResidentSet(getMode(modeRef.current),{...permissionMode!==void 0?{permissionMode}:{},permissionLayers});commit({kind:"notice",tone:"info",text:[`\u30E2\u30C7\u30EB: ${modelLabel(model)}\uFF08\u30E2\u30FC\u30C9\u3068\u306F\u72EC\u7ACB\uFF09`,
1290
1290
  `\u30E2\u30FC\u30C9: ${getMode(modeRef.current).label} \u2014 \u6709\u52B9\u30C4\u30FC\u30EB glob: ${getMode(modeRef.current).tools.join(" ")}`,`\u30E2\u30FC\u30C9\u5B9A\u7FA9: ${modeSource(modeRef.current)??"\u7D44\u307F\u8FBC\u307F\uFF08\u5B9A\u7FA9\u30D5\u30A1\u30A4\u30EB\u306A\u3057\uFF09"}`,`\u63A5\u7D9A\u5148: ${runtime.relayUrl}\uFF08\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB: ${runtime.profileName}\uFF09`,`\u30BF\u30FC\u30F3\u6570: ${snapshot.turns} \xB7 \u76F4\u8FD1\u306E\u30D7\u30ED\u30F3\u30D7\u30C8\u9577: ${snapshot.
1291
1291
  lastPromptTokens} tok`,`\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u6B8B\u91CF: ${snapshot.remainingPercent}%\uFF08\u7A93 200,000 tok \u306E\u6982\u7B97\uFF09`,`\u5B9F\u6E2C\u30C8\u30FC\u30AF\u30F3\u5408\u8A08: input ${t.inputTokens} / cache_read ${t.cacheReadTokens} / cache_write ${t.cacheWriteTokens} / output ${t.outputTokens}`,...snapshot.droppedMessages>0?[`\u4E0A\u9650\u306E\u305F\u3081\u843D\u3068\u3057\u305F\u3084\u308A\u53D6\u308A: ${snapshot.droppedMessages} \u4EF6`]:[],`permission-mode: ${describePermissionMode(
1292
1292
  permissionMode)}`,`\u76E3\u67FB\u30ED\u30B0: ${describeAuditLog(audit)}`,`\u5E38\u99D0\u30C4\u30FC\u30EB: ${resident.tools.length} \u672C / \u30B9\u30AD\u30FC\u30DE\u6982\u7B97 ${resident.tokens} tok\uFF08\u4E0A\u9650 ${RESIDENT_TOKEN_CAP} tok\uFF09`,` ${resident.tools.map(t2=>t2.name).join(" ")||"\uFF08\u306A\u3057\uFF09"}`,...resident.dropped.length>0?[` \u4E0A\u9650\u8D85\u904E\u3067\u5916\u3057\u305F\u30C4\u30FC\u30EB: ${resident.dropped.join(" ")}`]:[],"TWP API \u306E\u30C4\u30FC\u30EB\uFF08\u30E1\u30BF\u30C4\u30FC\u30EB\u30FB\u30AB\u30BF\u30ED\u30B0\u914D\u4FE1\uFF09\u306F\u5225\u30BF\u30B9\u30AF\u3067\u8F09\u308A\u307E\
@@ -1304,13 +1304,14 @@ body-11-doctorNetworkRows(networkDiagnostics));return(0,import_jsx_runtime9.jsxs
1304
1304
  truncate",children:line===""?" ":line},i))}):null,runningTool?(0,import_jsx_runtime9.jsx)(ToolCard,{run:runningTool,expanded:false,maxLines:budget.body}):null,overlay==="permission"&&pendingPermission?(0,import_jsx_runtime9.jsx)(PermissionDialog,{spec:pendingPermission,selected:selectedState,maxDiffLines:diffBudget}):null,overlay==="model"?(0,import_jsx_runtime9.jsx)(SelectList,{title:`\u30E2\u30C7\u30EB\u3092\u9078\u629E\uFF08\u30E2\u30FC\u30C9\u3068\u306F\u72EC\u7ACB\uFF09${catalogTitleSuffix(
1305
1305
  catalog.source)}`,items:toModelInfos(catalog.ids).map(m=>({key:m.id,label:m.label,hint:m.note})),selected:selectedState,maxRows:Math.min(catalog.ids.length,listBudget),footer:"\u2191\u2193 \u3067\u9078\u629E \xB7 Enter \u3067\u6C7A\u5B9A \xB7 Esc \u3067\u53D6\u6D88"}):null,overlay==="doctor"?(0,import_jsx_runtime9.jsx)(Doctor,{events:keyLog,maxRows:doctorBudget,network:networkDiagnostics}):null,overlay==="none"&&!busy&&paletteItems.length>0?(0,import_jsx_runtime9.jsx)(SelectList,{title:"\u30B9\u30E9\u30C3\u30B7\u30E5\u30B3\u30DE\u30F3\
1306
1306
  \u30C9",items:paletteItems.map(c=>({key:c.name,label:`${c.name}${c.argumentHint?` ${c.argumentHint}`:""}`,hint:c.description})),selected:selectedState,maxRows:Math.min(8,listBudget),footer:"\u2191\u2193 \u9078\u629E \xB7 Tab \u88DC\u5B8C \xB7 Enter \u5B9F\u884C \xB7 Esc \u53D6\u6D88"}):null,(0,import_jsx_runtime9.jsx)(InputBox,{value:buffer.text,window:inputWindow,busy,pasting,width:size.columns}),(0,import_jsx_runtime9.jsx)(StatusLine,{mode:modeDef,model,cwd:cwd2,branch,contextRemaining:context.
1307
- remainingPercent,width:size.columns}),(0,import_jsx_runtime9.jsx)(HintLine,{width:size.columns})]})]})}var import_jsx_runtime10=__toESM(require_jsx_runtime(),1);async function startTui(opts){activateModeFiles(text=>void process.stderr.write(stripTerminalControls(text)));const mode=opts.mode??"dev";const runtime=createRuntime({...opts.profile!==void 0?{profile:opts.profile}:{},...opts.model!==void 0?{model:opts.model}:{},cliVersion:opts.version});const initialCatalog=loadCachedCatalog(runtime.profileName,runtime.relayUrl)??builtinCatalog();const picked=pickModel(initialCatalog,runtime.configuredModel??
1308
- void 0);if(opts.noTui){printPlain(mode,picked.model,runtime.relayUrl,opts.version,opts.permissionMode);return}if(!opts.doctor){const blocked=await checkMinSupportedVersion({current:opts.version,cachedFloor:runtime.loadCachedFloor().minSupportedVersion,refresh:async()=>(await runtime.loadCatalog()).minSupportedVersion,write:text=>void process.stderr.write(stripTerminalControls(text))});if(blocked){process.exitCode=1;return}}const audit=createAuditLogger({mode,permissionMode:opts.permissionMode,model:picked.
1309
- model,cwd:process.cwd(),cliVersion:opts.version,interactive:true});const instance=render_default((0,import_jsx_runtime10.jsx)(App2,{initialMode:mode,initialModel:picked.model,initialCatalog,initialModelWarning:picked.warning??null,runtime,version:opts.version,startInDoctor:opts.doctor,audit,...opts.permissionMode!==void 0?{permissionMode:opts.permissionMode}:{}}),{exitOnCtrlC:false});await instance.waitUntilExit()}function printPlain(mode,model,relayUrl,version,permissionMode){const out={write:text=>void process.
1310
- stdout.write(stripTerminalControls(text))};out.write(`twp ${version} \u2014 \u3053\u306E\u74B0\u5883\u3067\u306F\u5BFE\u8A71 TUI \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\uFF08--no-tui / \u975ETTY\uFF09
1307
+ remainingPercent,width:size.columns}),(0,import_jsx_runtime9.jsx)(HintLine,{width:size.columns})]})]})}var import_jsx_runtime10=__toESM(require_jsx_runtime(),1);async function startTui(opts){activateModeFiles(text=>void process.stderr.write(stripTerminalControls(text)));const permissionLayers=activatePermissionSettings(text=>void process.stderr.write(stripTerminalControls(text)),{...opts.allowedTools?{allowedTools:opts.allowedTools}:{},...opts.disallowedTools?{disallowedTools:opts.disallowedTools}:{}});const mode=opts.mode??"dev";const runtime=createRuntime({...opts.profile!==void 0?{profile:opts.
1308
+ profile}:{},...opts.model!==void 0?{model:opts.model}:{},cliVersion:opts.version});const initialCatalog=loadCachedCatalog(runtime.profileName,runtime.relayUrl)??builtinCatalog();const picked=pickModel(initialCatalog,runtime.configuredModel??void 0);if(opts.noTui){printPlain(mode,picked.model,runtime.relayUrl,opts.version,opts.permissionMode,(opts.allowedTools?.length??0)+(opts.disallowedTools?.length??0)>0);return}if(!opts.doctor){const blocked=await checkMinSupportedVersion({current:opts.version,
1309
+ cachedFloor:runtime.loadCachedFloor().minSupportedVersion,refresh:async()=>(await runtime.loadCatalog()).minSupportedVersion,write:text=>void process.stderr.write(stripTerminalControls(text))});if(blocked){process.exitCode=1;return}}const audit=createAuditLogger({mode,permissionMode:opts.permissionMode,model:picked.model,cwd:process.cwd(),cliVersion:opts.version,interactive:true});const instance=render_default((0,import_jsx_runtime10.jsx)(App2,{initialMode:mode,initialModel:picked.model,initialCatalog,
1310
+ initialModelWarning:picked.warning??null,runtime,version:opts.version,startInDoctor:opts.doctor,audit,permissionLayers,...opts.permissionMode!==void 0?{permissionMode:opts.permissionMode}:{}}),{exitOnCtrlC:false});await instance.waitUntilExit()}function printPlain(mode,model,relayUrl,version,permissionMode,hasRuleFlags=false){const out={write:text=>void process.stdout.write(stripTerminalControls(text))};out.write(`twp ${version} \u2014 \u3053\u306E\u74B0\u5883\u3067\u306F\u5BFE\u8A71 TUI \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\uFF08--no-tui / \u975ETTY\uFF09
1311
1311
  `);out.write(`mode=${mode} model=${model} relay=${relayUrl}
1312
1312
  `);if(permissionMode!==void 0){out.write(`permission-mode=${permissionMode}\uFF08\u3053\u306E\u7D4C\u8DEF\u3067\u306F\u30C4\u30FC\u30EB\u3092\u5B9F\u884C\u3057\u306A\u3044\u305F\u3081\u52B9\u304D\u307E\u305B\u3093\uFF09
1313
- `)}out.write('1 \u5F80\u5FA9\u3060\u3051\u5B9F\u884C\u3059\u308B: twp -p "\u8CEA\u554F" \uFF08\u6A19\u6E96\u5165\u529B\u304B\u3089\u306F twp -p -\uFF09\n');const network=proxyDiagnostics();out.write("\n\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\uFF08\u30D7\u30ED\u30AD\u30B7 / CA\uFF09:\n");for(const line of network){out.write(` ${line.warn===true?"\u26A0 ":""}${line.label}: ${line.value}
1313
+ `)}if(hasRuleFlags){out.write("--allowed-tools / --disallowed-tools\uFF08\u3053\u306E\u7D4C\u8DEF\u3067\u306F\u30C4\u30FC\u30EB\u3092\u5B9F\u884C\u3057\u306A\u3044\u305F\u3081\u52B9\u304D\u307E\u305B\u3093\uFF09\n")}out.write('1 \u5F80\u5FA9\u3060\u3051\u5B9F\u884C\u3059\u308B: twp -p "\u8CEA\u554F" \uFF08\u6A19\u6E96\u5165\u529B\u304B\u3089\u306F twp -p -\uFF09\n');const network=proxyDiagnostics();out.write("\n\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\uFF08\u30D7\u30ED\u30AD\u30B7 / CA\uFF09:\n");
1314
+ for(const line of network){out.write(` ${line.warn===true?"\u26A0 ":""}${line.label}: ${line.value}
1314
1315
  `)}}export{startTui};
1315
1316
  /*! Bundled license information:
1316
1317
 
@@ -0,0 +1,4 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{CHECK_INTERVAL_MS,DISABLE_ENV,PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,describeAutoUpdate,isCheckDue,listRegisteredPids,lockFilePath,onStartup,pickNotice,readUpdateState,registerRunning,resolveCliPath,runDirPath,sameNpmPath,stateFilePath,workerEnv,writeUpdateState}from"./chunk-ILKQDXI5.js";import"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";
4
+ import"./chunk-VSJBJXZO.js";export{CHECK_INTERVAL_MS,DISABLE_ENV,PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,describeAutoUpdate,isCheckDue,listRegisteredPids,lockFilePath,onStartup,pickNotice,readUpdateState,registerRunning,resolveCliPath,runDirPath,sameNpmPath,stateFilePath,workerEnv,writeUpdateState};
@@ -0,0 +1,16 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{fetchLatestVersion,isBehindLatest,resolveNpmCommand}from"./chunk-GTABFTZP.js";import"./chunk-FOFV2MNL.js";import"./chunk-XNLIEUAW.js";import"./chunk-PMOUHEJQ.js";import{PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,isCheckDue,listRegisteredPids,lockFilePath,readUpdateState,resolveCliPath,runDirPath,writeUpdateState}from"./chunk-ILKQDXI5.js";import{PACKAGE_NAME,parseVersionCore}from"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";
4
+ import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{execFile}from"child_process";import fs from"fs";import path from"path";var PARENT_WAIT_MAX_MS=12*60*60*1e3;var PARENT_POLL_MS=1e3;var LOCK_STALE_MS=PARENT_WAIT_MAX_MS+60*60*1e3;var INSTALL_TIMEOUT_MS=0;function childEnv(env){const next={...env};delete next[WORKER_ENV];delete next[PARENT_PID_ENV];return next}function createNpmRunner(env=process.env){const cmd=resolveNpmCommand({env});if(cmd===null)return null;return(args,timeoutMs)=>new Promise(resolve=>{execFile(cmd.file,[...cmd.prefix,...args],{timeout:timeoutMs,windowsHide:true,maxBuffer:8*1024*1024,cwd:path.dirname(lockFilePath(env)),env:childEnv(env)},(error,stdout,stderr)=>{if(error===null){resolve({ok:true,stdout:String(stdout),stderr:String(
5
+ stderr)});return}const e=error;resolve({ok:false,stdout:String(stdout??""),stderr:String(stderr??""),...e.killed?{error:"\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F"}:typeof e.code==="string"?{error:e.code}:{}})})})}function summarizeNpmFailure(result){const text=`${result.stderr}
6
+ ${result.stdout}`;const code=/npm (?:ERR!|error) code (\S+)/.exec(text)?.[1]??result.error;let reason;if(code==="EACCES"||code==="EPERM"){reason=`\u30B0\u30ED\u30FC\u30D0\u30EB\u306E\u5C0E\u5165\u5148\u306B\u66F8\u304D\u8FBC\u3080\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${code}\uFF09`}else if(code!==void 0&&/^(ENOTFOUND|ETIMEDOUT|ECONNREFUSED|ECONNRESET|EAI_AGAIN|ENETUNREACH)$/.test(code)){reason=`npm registry \u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${code}\
7
+ \uFF09`}else if(code!==void 0){reason=`npm \u304C\u5931\u6557\u3057\u307E\u3057\u305F\uFF08${code}\uFF09`}else{const line=text.split("\n").map(l=>l.trim()).find(l=>l!=="")??"\u4E0D\u660E\u306A\u30A8\u30E9\u30FC";reason=`npm \u304C\u5931\u6557\u3057\u307E\u3057\u305F: ${line}`}return stripTerminalControls(reason).slice(0,200)}function readInstalledVersion(cliPath){try{const pkgRoot=path.dirname(path.dirname(cliPath));const pkg=JSON.parse(fs.readFileSync(path.join(pkgRoot,"package.json"),"utf8"));
8
+ if(pkg.name!==PACKAGE_NAME||typeof pkg.version!=="string"||parseVersionCore(pkg.version)===null){return null}return pkg.version}catch{return null}}function isAlive(pid){try{process.kill(pid,0);return true}catch(err){return err.code==="EPERM"}}function acquireLock(env,now=Date.now()){const file=lockFilePath(env);for(let attempt=0;attempt<2;attempt++){try{fs.mkdirSync(path.dirname(file),{recursive:true,mode:448});fs.writeFileSync(file,String(process.pid),{flag:"wx",mode:384});return()=>{try{if(fs.
9
+ readFileSync(file,"utf8").trim()===String(process.pid))fs.rmSync(file,{force:true})}catch{}}}catch(err){if(err.code!=="EEXIST")return null;try{const holder=Number(fs.readFileSync(file,"utf8").trim());const age=now-fs.statSync(file).mtimeMs;if(Number.isInteger(holder)&&holder>0&&isAlive(holder)&&age<LOCK_STALE_MS)return null;fs.rmSync(file,{force:true})}catch{return null}}}return null}function ownsLock(env){try{return fs.readFileSync(lockFilePath(env),"utf8").trim()===String(process.pid)}catch{return false}}
10
+ function livingTwpPids(env){const parent=Number(env[PARENT_PID_ENV]);const candidates=new Set(listRegisteredPids(env));if(Number.isInteger(parent)&&parent>0)candidates.add(parent);candidates.delete(process.pid);const alive=[];for(const pid of candidates){if(isAlive(pid)){alive.push(pid)}else{try{fs.rmSync(path.join(runDirPath(env),String(pid)),{force:true})}catch{}}}return alive}async function defaultWaitForParent(env){const deadline=Date.now()+PARENT_WAIT_MAX_MS;while(livingTwpPids(env).length>
11
+ 0){if(Date.now()>=deadline)return false;await new Promise(r=>setTimeout(r,PARENT_POLL_MS))}return true}async function runAutoUpdateWorker(deps={}){const env=deps.env??process.env;const now=deps.now??Date.now;if(autoUpdateDisabledReason(env)!==null)return"disabled";const release=acquireLock(env,now());if(release===null)return"locked";try{let state=readUpdateState(env);if(!isCheckDue(state,now()))return"not-due";state={...state,checked_at:new Date(now()).toISOString()};writeUpdateState(state,env);
12
+ const cliPath=deps.cliPath===void 0?resolveCliPath():deps.cliPath;if(cliPath===null)return"no-cli-path";const latest=await(deps.fetchLatest??(()=>fetchLatestVersion({env})))();if(latest.version===null||parseVersionCore(latest.version)===null)return"latest-unavailable";state={...readUpdateState(env),checked_at:state.checked_at,latest:latest.version};const npm=deps.npm===void 0?createNpmRunner(env):deps.npm;let kind=classifyInstall(cliPath);if(kind==="npm-local"){kind=null;if(npm!==null){const root=await npm(
13
+ ["root","-g"],3e4);const reported=root.stdout.trim();if(root.ok&&reported!=="")kind=classifyInstall(cliPath,reported)}}if(kind===null){writeUpdateState(state,env);return"not-npm-global"}state={...state,install:{cli_path:cliPath,kind}};writeUpdateState(state,env);if(kind!=="npm-global"||npm===null)return"not-npm-global";const readVersion=deps.readInstalledVersion??readInstalledVersion;const before=readVersion(cliPath);if(before===null||!isBehindLatest(before,latest.version))return"up-to-date";if(!await(deps.
14
+ waitForParent??(()=>defaultWaitForParent(env)))())return"parent-still-running";const beforeInstall=readVersion(cliPath);if(beforeInstall===null||!isBehindLatest(beforeInstall,latest.version))return"up-to-date";if(!(deps.ownsLock??(()=>ownsLock(env)))())return"locked";const result=await npm(["install","-g",`${PACKAGE_NAME}@${latest.version}`,"--no-fund","--no-audit","--ignore-scripts","--loglevel=error"],INSTALL_TIMEOUT_MS);const after=readVersion(cliPath);const at=new Date(now()).toISOString();const current=readUpdateState(
15
+ env);if(result.ok&&after===latest.version){const next={...current,updated:{from:beforeInstall,to:latest.version,at,notified:false}};delete next.failed;writeUpdateState(next,env);return"updated"}const reason=result.ok?`\u66F4\u65B0\u5F8C\u306E\u7248\u304C ${after??"\u4E0D\u660E"} \u3067\u3057\u305F\uFF08\u671F\u5F85: ${latest.version}\uFF09`:summarizeNpmFailure(result);const alreadyNotified=current.failed?.target===latest.version&&current.failed.notified;writeUpdateState({...current,failed:{target:latest.
16
+ version,reason,at,notified:alreadyNotified}},env);return"failed"}finally{release()}}export{acquireLock,createNpmRunner,livingTwpPids,readInstalledVersion,resolveNpmCommand,runAutoUpdateWorker,summarizeNpmFailure};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{isRecord,pick,requireResolved,singleRef,withResolved}from"./chunk-GFC2ASHE.js";import{readBody}from"./chunk-QVXZEUKN.js";import{BACKLOG_BASE_PATH,BACKLOG_PROJECT_SCOPE_LABEL,BACKLOG_SCOPE_LABEL,backlogSpacePath,resolveNamed}from"./chunk-7WEYBZSK.js";import"./chunk-JKSXUBND.js";import"./chunk-II5RVJQN.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-J7QYPKVK.js";import"./chunk-NHYMHCAT.js";import{ApiResponseError,
3
+ import{readBody}from"./chunk-QVXZEUKN.js";import{BACKLOG_BASE_PATH,BACKLOG_PROJECT_SCOPE_LABEL,BACKLOG_SCOPE_LABEL,backlogSpacePath,resolveNamed}from"./chunk-MIMDLO52.js";import"./chunk-II5RVJQN.js";import"./chunk-JKSXUBND.js";import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import{isRecord,pick,requireResolved,singleRef,withResolved}from"./chunk-GFC2ASHE.js";import{ApiResponseError,
4
4
  UsageError}from"./chunk-M3GWY6NT.js";import"./chunk-5QCAIKFE.js";import"./chunk-VSJBJXZO.js";var DEFAULT_COUNT=20;var MAX_COUNT=100;var NUMERIC=/^[0-9]+$/;function isExactNumericId(value){return NUMERIC.test(value)&&String(Number(value))===value}var ISSUE_REF=/^(?:[A-Za-z0-9_]+-[0-9]+|[0-9]+)$/;var DATE=/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;var SPACE_COLUMNS=["id","space_url"];var PROJECT_COLUMNS=["id","projectKey","name"];var ISSUE_LIST_COLUMNS=["issueKey","summary","status","assignee","priority","dueDate","updated","descriptionTruncated"];var ISSUE_GET_COLUMNS=["id","issueKey","projectId","s\
5
5
  ummary","description","descriptionTruncated","status","issueType","priority","assignee","createdUser","parentIssueId","startDate","dueDate","estimatedHours","actualHours","created","updated"];var COMMENT_COLUMNS=["id","created","createdUserId","createdUser","content","changeLog"];function commentRow(row){const source=isRecord(row)?row:{};const user=isRecord(source["createdUser"])?source["createdUser"]:{};return pick({...source,createdUserId:user["id"]??null,createdUser:user["name"]??null},COMMENT_COLUMNS)}
6
6
  var ATTACHMENT_COLUMNS=["id","name","size","contentType","createdUserId","createdUser","created"];var STATUS_COLUMNS=["id","name","color"];var USER_COLUMNS=["id","userId","name","mailAddress","roleType"];var SPACE_FLAG={name:"--space",summary:"Backlog \u30B9\u30DA\u30FC\u30B9\uFF08ID / \u30B9\u30DA\u30FC\u30B9URL / \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3\uFF09\u3002\u767B\u9332\u304C1\u4EF6\u306A\u3089\u7701\u7565\u3067\u304D\u307E\u3059",takesValue:true,placeholder:"<ID|URL>"};var BODY_MAX_CHARS=1e5;
@@ -0,0 +1,15 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{system32}from"./chunk-N2UVRM3Z.js";import{execFileSync}from"child_process";import fs from"fs";import path from"path";var DEFAULT_GRACE_MS=6e4;var InstanceLock=class{constructor(lockDir,opts={}){this.lockDir=lockDir;this.opts=opts}lockDir;opts;owned=null;acquire(){const mine=this.tryMkdir();if(mine)return{acquired:true,reason:"",note:null};const oldPid=this.readPid();if(oldPid!==null){if(this.isLoop(oldPid)){return{acquired:false,reason:`\u540C\u3058\u30DE\u30B7\u30F3\u3067\u5225\u306E task-loop \u304C\u7A3C\u50CD\u4E2D\u3067\u3059\uFF08pid=${oldPid} / \u30ED\u30C3\u30AF: ${this.lockDir}\uFF09`,note:null}}const note=`\
4
+ \u30ED\u30C3\u30AF\u306EPID ${oldPid} \u306F\u5225\u306E\u30D7\u30ED\u30BB\u30B9\u306B\u518D\u5229\u7528\u3055\u308C\u3066\u3044\u307E\u3059\uFF08\u30EB\u30FC\u30D7\u3067\u306F\u306A\u3044\uFF09\u2192 \u6B8B\u9AB8\u3068\u3057\u3066\u5F15\u304D\u53D6\u308A\u307E\u3059`;return this.takeOver(note)}const age=this.lockAgeMs();const grace=this.opts.graceMs??DEFAULT_GRACE_MS;if(age===null||age<grace){return{acquired:false,reason:`\u30ED\u30C3\u30AF\u304C\u4F5C\u6210\u76F4\u5F8C\u306E\u305F\u3081\u5F85\u6A5F\u5074\u306B\u5012\u3057\u307E\u3059\uFF08\u30ED\u30C3\u30AF: ${this.
5
+ lockDir}\uFF09`,note:null}}return this.takeOver(`\u30ED\u30C3\u30AF\u306B pid \u304C\u306A\u304F\u4F5C\u6210\u304B\u3089 ${Math.trunc(age/1e3)} \u79D2\u7D4C\u904E\u3057\u3066\u3044\u307E\u3059 \u2192 \u6B8B\u9AB8\u3068\u3057\u3066\u5F15\u304D\u53D6\u308A\u307E\u3059`)}release(){if(!this.owned)return;if(this.readPid()===process.pid){fs.rmSync(this.owned,{recursive:true,force:true})}this.owned=null}takeOver(note){fs.rmSync(this.lockDir,{recursive:true,force:true});if(this.tryMkdir())return{acquired:true,
6
+ reason:"",note};return{acquired:false,reason:`\u30ED\u30C3\u30AF\u306E\u5F15\u304D\u53D6\u308A\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u5225\u30D7\u30ED\u30BB\u30B9\u304C\u5148\u306B\u53D6\u5F97\u3057\u305F\u53EF\u80FD\u6027\uFF09: ${this.lockDir}`,note:null}}tryMkdir(){try{fs.mkdirSync(path.dirname(this.lockDir),{recursive:true,mode:448});fs.mkdirSync(this.lockDir,{mode:448})}catch{return false}try{fs.writeFileSync(path.join(this.lockDir,"pid"),`${process.pid}
7
+ `)}catch{}this.owned=this.lockDir;return true}readPid(){try{const raw=fs.readFileSync(path.join(this.lockDir,"pid"),"utf8").split("\n")[0]?.trim();const pid=Number.parseInt(raw??"",10);return Number.isInteger(pid)&&pid>0?pid:null}catch{return null}}lockAgeMs(){try{const now=this.opts.now?.()??Date.now();return now-fs.statSync(this.lockDir).mtimeMs}catch{return null}}isLoop(pid){if(this.opts.isLoopProcess)return this.opts.isLoopProcess(pid);return defaultIsLoopProcess(pid)}};function defaultIsLoopProcess(pid,deps={}){
8
+ try{process.kill(pid,0)}catch(err){const code=err.code;if(code==="EPERM")return true;return false}const cmdline=readCommandLine(pid,deps);if(cmdline===null)return true;return cmdline.includes("task-loop")}function readCommandLine(pid,deps={}){const platform=deps.platform??process.platform;const env=deps.env??process.env;const nonEmpty=v=>v.trim()===""?null:v;if(platform==="linux"){try{const read=deps.readProc??(p=>fs.readFileSync(`/proc/${p}/cmdline`,"utf8"));return nonEmpty(read(pid).replace(/\0/g,
9
+ " "))}catch{return null}}const run=deps.run??((file,args)=>execFileSync(file,[...args],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],windowsHide:true}));if(platform==="win32"){const ps=system32(env,"WindowsPowerShell","v1.0","powershell.exe");if(ps===null)return null;try{const filter=`ProcessId=${String(Math.trunc(pid))}`;const cmd=`(Get-CimInstance Win32_Process -Filter "${filter}").CommandLine | Out-String -Width 32767`;return nonEmpty(run(ps,["-NoProfile","-NonInteractive","-C\
10
+ ommand",cmd]))}catch{return null}}try{return nonEmpty(run("ps",["-ww","-p",String(Math.trunc(pid)),"-o","command="]))}catch{return null}}import fs2 from"fs";import path2 from"path";var LOCK_OWNER_FILE="owner.json";var MAX_OWNER_BYTES=4096;function lockOwnerPath(lockDir){return path2.join(lockDir,LOCK_OWNER_FILE)}function buildLockOwner(input){return{pid:input.pid,profile:input.profile,twp_home:path2.resolve(input.twpHome),project_ref:input.projectRef,project_id:input.projectId,started_at:(input.now??new Date).toISOString()}}function writeLockOwner(lockDir,owner){try{fs2.writeFileSync(lockOwnerPath(lockDir),`${JSON.stringify(owner)}\
11
+
12
+ `,{mode:384});return null}catch(err){return err.message}}function readLockOwner(lockDir){let raw;try{const st=fs2.lstatSync(lockOwnerPath(lockDir));if(!st.isFile())return{ok:false,reason:`${LOCK_OWNER_FILE} \u304C\u901A\u5E38\u306E\u30D5\u30A1\u30A4\u30EB\u3067\u306F\u3042\u308A\u307E\u305B\u3093`};if(st.size>MAX_OWNER_BYTES)return{ok:false,reason:`${LOCK_OWNER_FILE} \u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${st.size} \u30D0\u30A4\u30C8\uFF09`};raw=fs2.readFileSync(lockOwnerPath(lockDir),
13
+ "utf8")}catch(err){const code=err.code;return{ok:false,reason:code==="ENOENT"?`${LOCK_OWNER_FILE} \u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u3053\u306E\u8A18\u9332\u3092\u66F8\u304B\u306A\u3044\u65E7\u7248\u306E twp \u3067\u8D77\u52D5\u3055\u308C\u305F\u30EB\u30FC\u30D7\u306E\u53EF\u80FD\u6027\uFF09`:`${LOCK_OWNER_FILE} \u3092\u8AAD\u3081\u307E\u305B\u3093\uFF08${code??err.message}\uFF09`}}let parsed;try{parsed=JSON.parse(raw)}catch{return{ok:false,reason:`${LOCK_OWNER_FILE} \u304C JSON \u3068\u3057\u3066\u8AAD\u3081\u307E\u305B\u3093`}}
14
+ const o=parsed;if(o===null||typeof o!=="object"||typeof o.pid!=="number"||typeof o.profile!=="string"||o.profile===""||typeof o.twp_home!=="string"||o.twp_home===""){return{ok:false,reason:`${LOCK_OWNER_FILE} \u306B pid / profile / twp_home \u304C\u3042\u308A\u307E\u305B\u3093`}}return{ok:true,owner:{pid:o.pid,profile:o.profile,twp_home:o.twp_home,project_ref:typeof o.project_ref==="string"?o.project_ref:"",project_id:typeof o.project_id==="string"?o.project_id:"",started_at:typeof o.started_at===
15
+ "string"?o.started_at:""}}}function sameTwpHome(a,b,platform=process.platform){try{const sa=fs2.statSync(path2.resolve(a),{bigint:true});const sb=fs2.statSync(path2.resolve(b),{bigint:true});if(sa.ino!==0n&&sb.ino!==0n)return sa.dev===sb.dev&&sa.ino===sb.ino}catch{}const norm=p=>{let resolved=path2.resolve(p);try{resolved=fs2.realpathSync.native(resolved)}catch{}return platform==="win32"||platform==="darwin"?resolved.toLowerCase():resolved};return norm(a)===norm(b)}export{InstanceLock,defaultIsLoopProcess,buildLockOwner,writeLockOwner,readLockOwner,sameTwpHome};
@@ -0,0 +1,3 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ var FALSY=new Set(["0","false","no","off"]);function isBoolishTrue(raw){const v=(raw??"").trim();if(v==="")return false;return!FALSY.has(v.toLowerCase())}export{isBoolishTrue};
@@ -0,0 +1,9 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ var MODE_IDS=["dev","biz","plan"];function isModeId(value){return value!==void 0&&MODE_IDS.includes(value)}var MODES=[{id:"dev",label:"\u958B\u767A",color:"green",description:"\u30ED\u30FC\u30AB\u30EB\u30C4\u30FC\u30EB\u5168\u90E8 \uFF0B \u958B\u767A\u7CFB TWP \u30C9\u30E1\u30A4\u30F3\u5E38\u99D0",tools:["read_file","write_file","edit_file","bash","shell","glob","grep","git","twp_*"],permissions:{read_file:"allow",glob:"allow",grep:"allow",git:"ask",twp_get_task:"allow",twp_list_tasks:"allow",twp_update_task:"\
4
+ ask",bash:"ask",shell:"ask",write_file:"ask",edit_file:"ask","*":"ask"}},{id:"biz",label:"\u696D\u52D9",color:"cyan",description:"TWP \u30C9\u30E1\u30A4\u30F3\u4E2D\u5FC3\u3002bash \u3068 write_file \u306F deny",tools:["twp_*","read_file","glob","grep"],permissions:{read_file:"allow",glob:"allow",grep:"allow",twp_get_task:"allow",twp_list_tasks:"allow",twp_update_task:"ask",bash:"deny",shell:"deny",git:"deny",write_file:"deny",edit_file:"deny","*":"ask"}},{id:"plan",label:"\u30D7\u30E9\u30F3",color:"\
5
+ magenta",description:"\u8AAD\u307F\u53D6\u308A\u306E\u307F\u3002\u5168\u66F8\u304D\u8FBC\u307F deny",tools:["read_file","glob","grep","twp_get_*","twp_list_*"],permissions:{read_file:"allow",glob:"allow",grep:"allow",twp_get_task:"allow",twp_list_tasks:"allow",bash:"deny",shell:"deny",git:"deny",write_file:"deny",edit_file:"deny","*":"deny"}}];var activeModeList=MODES;var activeModeSources=new Map;function setActiveModes(modes,sources=new Map){activeModeList=MODES.map(builtin=>modes.find(m=>m.id===
6
+ builtin.id)??builtin);activeModeSources=sources}function modeSource(id){return activeModeSources.get(id)??null}function getMode(id){const found=activeModeList.find(m=>m.id===id);if(!found)throw new Error(`unknown mode: ${id}`);return found}function nextMode(id){const i=activeModeList.findIndex(m=>m.id===id);const next=activeModeList[(i+1)%activeModeList.length];return next?next.id:"dev"}function checkPermission(toolName,mode){const own=key=>Object.hasOwn(mode.permissions,key)?mode.permissions[key]:void 0;const found=own(toolName)??own("*");return found==="allow"||found==="ask"||found==="deny"?found:"ask"}var PERMISSION_MODE_IDS=["plan","acceptEdits","denyAll"];function isPermissionModeId(value){return value!==void 0&&PERMISSION_MODE_IDS.includes(value)}function describePermissionMode(permissionMode){if(permissionMode===void 0)return"\u672A\u6307\u5B9A\uFF08\u30E2\u30FC\u30C9\u306E\u65B9\u91DD\u306E\u307E\u307E\uFF09";switch(permissionMode){case"plan":return"plan\uFF08read \u306E\u307F\u8A31\u53EF\u3002write / exec \u306F\u62D2\u5426\uFF09";case"acceptEdits":return"acceptEdits\uFF08write \u306E\u78BA\u8A8D\u3092\u81EA\u52D5\u627F\u8A8D\u3002read\
7
+ / exec \u306F\u30E2\u30FC\u30C9\u306E\u307E\u307E\uFF09";case"denyAll":return"denyAll\uFF08read \u3092\u542B\u3080\u5168\u30C4\u30FC\u30EB\u3092\u62D2\u5426\uFF09";default:{const exhaustive=permissionMode;return`${String(exhaustive)}\uFF08\u4E0D\u660E\u306A\u5024\u3002\u5B89\u5168\u5074\u3067\u5168\u62D2\u5426\uFF09`}}}function applyPermissionMode(decision,risk,permissionMode){if(permissionMode===void 0)return{decision,reason:null};if(decision==="deny")return{decision,reason:null};switch(permissionMode){case"\
8
+ denyAll":return{decision:"deny",reason:"permission-mode=denyAll\uFF08\u5168\u30C4\u30FC\u30EB\u3092\u62D2\u5426\uFF09"};case"plan":if(risk==="read")return{decision,reason:null};return{decision:"deny",reason:`permission-mode=plan\uFF08${risk} \u30C4\u30FC\u30EB\u3092\u62D2\u5426\uFF09`};case"acceptEdits":if(risk==="write"&&decision==="ask"){return{decision:"allow",reason:"permission-mode=acceptEdits\uFF08write \u3092\u81EA\u52D5\u627F\u8A8D\uFF09"}}return{decision,reason:null};default:return{decision:"\
9
+ deny",reason:"\u4E0D\u660E\u306A permission-mode\uFF08\u5B89\u5168\u5074\u3067\u62D2\u5426\uFF09"}}}export{isModeId,MODES,setActiveModes,modeSource,getMode,nextMode,checkPermission,isPermissionModeId,describePermissionMode,applyPermissionMode};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{DEFAULT_CLAUDE_LAUNCHER,isBoolishTrue,loadAiConfig}from"./chunk-H3JTPDCJ.js";import{killProcessTree}from"./chunk-N2UVRM3Z.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{projectFileKey}from"./chunk-GY7KI5E5.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";function stringField(value,key,fallback,warnings){if(value===void 0||value===null)return fallback;if(typeof value!=="string"||value.trim()===""){warnings.push(`claude_launcher.${key} \u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A '${fallback}' \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}return value.trim()}function argvField(value,key,fallback,warnings,allowEmpty){if(value===void 0||value===null)return fallback;
3
+ import{DEFAULT_CLAUDE_LAUNCHER,loadAiConfig}from"./chunk-NWABK3RZ.js";import{killProcessTree}from"./chunk-N2UVRM3Z.js";import{projectFileKey}from"./chunk-GY7KI5E5.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{isBoolishTrue}from"./chunk-5WGOHFAS.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";function stringField(value,key,fallback,warnings){if(value===void 0||value===null)return fallback;if(typeof value!=="string"||value.trim()===""){warnings.push(`claude_launcher.${key} \u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A '${fallback}' \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}return value.trim()}function argvField(value,key,fallback,warnings,allowEmpty){if(value===void 0||value===null)return fallback;
4
4
  if(!Array.isArray(value)){warnings.push(`claude_launcher.${key} \u306F\u6587\u5B57\u5217\u306E\u914D\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A [${fallback.join(", ")}] \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}for(const v of value){if(typeof v!=="string"||v.trim()===""){warnings.push(`claude_launcher.${key} \u306E\u8981\u7D20\u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A [${fallback.
5
5
  join(", ")}] \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}}if(value.length===0&&!allowEmpty){warnings.push(`claude_launcher.${key} \u306F1\u3064\u4EE5\u4E0A\u306E\u5F15\u6570\u304C\u8981\u308A\u307E\u3059\uFF08\u65E2\u5B9A [${fallback.join(", ")}] \u3092\u4F7F\u3044\u307E\u3059\uFF09`);return fallback}return value.map(v=>v.trim())}function probeMatchField(value,warnings){const raw=stringField(value,"probe_match",DEFAULT_CLAUDE_LAUNCHER.probeMatch,warnings);try{new RegExp(raw,"m")}catch(err){
6
6
  warnings.push(`claude_launcher.probe_match \u306F\u6B63\u898F\u8868\u73FE\u3068\u3057\u3066\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08${err.message}\uFF09\u3002\u65E2\u5B9A '${DEFAULT_CLAUDE_LAUNCHER.probeMatch}' \u3092\u4F7F\u3044\u307E\u3059`);return DEFAULT_CLAUDE_LAUNCHER.probeMatch}return raw}var NOT_YET_APPLIED=[{key:"probe",get:c=>c.probe},{key:"probe_match",get:c=>c.probeMatch},{key:"exec_args",get:c=>c.execArgs},{key:"active_args",get:c=>c.activeArgs}];function sameAsDefault(key,parsed){
@@ -0,0 +1,18 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,detectClaudeAutoSwitch,spawnSyncResolved}from"./chunk-NWABK3RZ.js";import{defaultIsExecutableFile,findOnPath,joinFor}from"./chunk-PMOUHEJQ.js";import{isBoolishTrue}from"./chunk-5WGOHFAS.js";import{spawnSync}from"child_process";import{createHash}from"crypto";import fs from"fs";import os from"os";import path from"path";var DETECTABLE_AIS=["claude","codex","gemini","copilot"];function isDetectableAi(value){return DETECTABLE_AIS.includes(value)}function isSelectable(d){return d.installed&&d.blockedReason===null&&d.auth!=="unauthenticated"}function resolveDetectDeps(deps={}){return resolve(deps)}function resolve(deps){const platform=deps.platform??process.platform;return{run:deps.run??spawnSync,env:deps.env??process.env,homedir:deps.homedir??os.homedir,isExecutableFile:deps.isExecutableFile??(p=>defaultIsExecutableFile(p,platform)),existsSync:deps.existsSync??fs.existsSync,readFileSync:deps.readFileSync??(p=>fs.readFileSync(p,"utf8")),platform,
4
+ now:deps.now??Date.now,launcherBin:nonEmptyBin(deps.launcherBin)??DEFAULT_CLAUDE_LAUNCHER.bin}}function nonEmptyBin(value){const t=value?.trim();return t===void 0||t===""?void 0:t}var PROBE_TIMEOUT_MS=1e4;function oneLine(text){return text.replace(/\s+/g," ").trim()}function claudeConfigDir(d){const lookup={env:d.env,platform:d.platform};const bin=nonEmptyBin(d.launcherBin)??DEFAULT_CLAUDE_LAUNCHER.bin;const cas=detectClaudeAutoSwitch(bin,d.run,lookup);if(cas!==null){const active=activeSlotPath(
5
+ cas,d.run,lookup);if(active!==null){return{dir:active,via:`${bin} ${DEFAULT_CLAUDE_LAUNCHER.activeArgs.join(" ")}`}}}const explicit=d.env.CLAUDE_CONFIG_DIR?.trim();if(explicit!==void 0&&explicit!=="")return{dir:explicit,via:"CLAUDE_CONFIG_DIR"};return{dir:joinFor(d.platform)(d.homedir(),".claude"),via:"\u65E2\u5B9A\uFF08~/.claude\uFF09"}}var CLAUDE_AUTH_ENV=[{key:"ANTHROPIC_API_KEY",label:"ANTHROPIC_API_KEY",boolish:false},{key:"ANTHROPIC_AUTH_TOKEN",label:"ANTHROPIC_AUTH_TOKEN",boolish:false},{
6
+ key:"CLAUDE_CODE_OAUTH_TOKEN",label:"CLAUDE_CODE_OAUTH_TOKEN",boolish:false},{key:"AWS_BEARER_TOKEN_BEDROCK",label:"AWS_BEARER_TOKEN_BEDROCK",boolish:false},{key:"CLAUDE_CODE_USE_BEDROCK",label:"CLAUDE_CODE_USE_BEDROCK\uFF08AWS \u8CC7\u683C\u60C5\u5831\u3067\u52D5\u304D\u307E\u3059\uFF09",boolish:true},{key:"CLAUDE_CODE_USE_VERTEX",label:"CLAUDE_CODE_USE_VERTEX\uFF08GCP \u8CC7\u683C\u60C5\u5831\u3067\u52D5\u304D\u307E\u3059\uFF09",boolish:true}];function envEnabled(raw,boolish){if(boolish)return isBoolishTrue(
7
+ raw);return(raw??"").trim()!==""}function keychainService(configDir,homedir){const norm=configDir.normalize("NFC");if(norm===path.posix.join(homedir,".claude").normalize("NFC"))return"Claude Code-credentials";return`Claude Code-credentials-${createHash("sha256").update(norm,"utf8").digest("hex").slice(0,8)}`}function probeMacKeychain(d,configDir){const account=d.env.USER?.trim()??"";const args=["find-generic-password","-s",keychainService(configDir,d.homedir())];if(account!=="")args.push("-a",account);
8
+ try{const r=d.run("/usr/bin/security",args,{encoding:"utf8",timeout:PROBE_TIMEOUT_MS,stdio:"ignore"});return r.error===void 0&&r.status===0}catch{return false}}function detectClaude(d){for(const e of CLAUDE_AUTH_ENV){if(envEnabled(d.env[e.key],e.boolish)){return{auth:"authenticated",detail:`${e.label} \u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059`,blockedReason:null}}}const{dir,via}=claudeConfigDir(d);const file=joinFor(d.platform)(dir,".credentials.json");let raw;try{if(!d.existsSync(file))
9
+ throw new Error("ENOENT");raw=d.readFileSync(file)}catch{if(d.platform==="darwin"){if(probeMacKeychain(d,dir)){return{auth:"authenticated",detail:oneLine(`macOS Keychain \u306B\u8CC7\u683C\u60C5\u5831\u304C\u3042\u308A\u307E\u3059\uFF08${dir}\uFF09`),blockedReason:null}}return{auth:"unknown",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08${dir}\uFF0F${via}\uFF09\u3002macOS \u306F Keychain \u306B\u4FDD\u5B58\u3059\u308B\u305F\u3081\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093`),
10
+ blockedReason:null}}return{auth:"unauthenticated",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${file}\uFF0F${via}\uFF09\u3002'claude' \u3092\u4E00\u5EA6\u8D77\u52D5\u3057\u3066\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044`),blockedReason:null}}let expiresAt;let hasToken;try{const parsed=JSON.parse(raw);hasToken=typeof parsed.claudeAiOauth?.accessToken==="string"&&parsed.claudeAiOauth.accessToken!=="";expiresAt=parsed.claudeAiOauth?.refreshTokenExpiresAt}catch{
11
+ return{auth:"unknown",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08${file}\uFF09\u3002\u30D5\u30A1\u30A4\u30EB\u304C\u58CA\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059`),blockedReason:null}}if(!hasToken){return{auth:"unauthenticated",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u306B\u30C8\u30FC\u30AF\u30F3\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${file}\uFF09`),blockedReason:null}}if(typeof expiresAt==="number"&&expiresAt>
12
+ 0&&expiresAt<d.now()){return{auth:"unauthenticated",detail:oneLine(`\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u304C\u5931\u52B9\u3057\u3066\u3044\u307E\u3059\uFF08${dir}\uFF09\u3002\u518D\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059`),blockedReason:null}}return{auth:"authenticated",detail:oneLine(`\u8CC7\u683C\u60C5\u5831\u304C\u3042\u308A\u307E\u3059\uFF08${dir}\uFF0F${via}\uFF09`),blockedReason:null}}function detectCodex(d,binPath){let r;try{r=spawnSyncResolved(binPath,
13
+ ["login","status"],{encoding:"utf8",timeout:PROBE_TIMEOUT_MS},{env:d.env,platform:d.platform},d.run)}catch(err){return{auth:"unknown",detail:oneLine(`codex login status \u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\uFF08${err.message}\uFF09`),blockedReason:null}}if(r.error!==void 0){return{auth:"unknown",detail:oneLine(`codex login status \u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\uFF08${r.error.message}\uFF09`),blockedReason:null}}if(r.status===null){return{auth:"unknown",detail:`codex\
14
+ login status \u304C ${PROBE_TIMEOUT_MS/1e3} \u79D2\u4EE5\u5185\u306B\u7D42\u308F\u308A\u307E\u305B\u3093\u3067\u3057\u305F`,blockedReason:null}}if(r.status===0)return{auth:"authenticated",detail:"codex login status: \u30ED\u30B0\u30A4\u30F3\u6E08\u307F",blockedReason:null};return{auth:"unauthenticated",detail:`codex login status \u304C\u7D42\u4E86\u30B3\u30FC\u30C9 ${r.status} \u3092\u8FD4\u3057\u307E\u3057\u305F\u3002'codex login' \u3067\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044`,
15
+ blockedReason:null}}function detectPending(ai){return{auth:"unknown",detail:"\u30ED\u30B0\u30A4\u30F3\u5224\u5B9A\u306E\u65B9\u6CD5\u304C\u672A\u78BA\u5B9A\u3067\u3059",blockedReason:`${ai} \u306F\u7121\u4EBA\u5B9F\u884C\u3067\u306E\u8A8D\u8A3C\u72B6\u614B\u3092\u5224\u5B9A\u3059\u308B\u65B9\u6CD5\u304C\u672A\u78BA\u5B9A\u306E\u305F\u3081\u9078\u629E\u3067\u304D\u307E\u305B\u3093`}}function detectAiClis(deps={}){const d=resolve(deps);return DETECTABLE_AIS.map(ai=>{const binPath=findOnPath(ai,d);
16
+ if(binPath===null){return{ai,installed:false,binPath:null,auth:"unknown",detail:"PATH \u306B\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08\u672A\u5C0E\u5165\uFF09",blockedReason:null}}const state=ai==="claude"?detectClaude(d):ai==="codex"?detectCodex(d,binPath):detectPending(ai);return{ai,installed:true,binPath,...state}})}function formatDetection(d,index){const selectable=isSelectable(d);const mark=selectable?d.auth==="authenticated"?"\u2705":"\u2754":" ";const num=index===null?" ":`${String(
17
+ index).padStart(2)}.`;const state=!d.installed?"\u672A\u5C0E\u5165":d.auth==="authenticated"?"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F":d.auth==="unauthenticated"?"\u672A\u30ED\u30B0\u30A4\u30F3":"\u672A\u5224\u5B9A";const blocked=d.blockedReason===null?"":`
18
+ \u9078\u629E\u3067\u304D\u307E\u305B\u3093: ${oneLine(d.blockedReason)}`;return`${num} ${mark} ${d.ai.padEnd(8)} ${state.padEnd(8)} ${oneLine(d.detail)}${blocked}`}export{isDetectableAi,isSelectable,resolveDetectDeps,claudeConfigDir,detectAiClis,formatDetection};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{parseVersionCore}from"./chunk-DXXFUNYN.js";import{AuthSession,loadCredentials,withFileLock}from"./chunk-63LDNYGW.js";import{effectiveApiUrl,effectiveRelayUrl,resolveConfiguredModel,resolveProfile}from"./chunk-NERYSBA4.js";import{ensureTwpHome,twpHomeDir}from"./chunk-RZVI6PMW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";var MAX_EVENT_BYTES=8*1024*1024;var SseBufferOverflowError=class extends Error{constructor(limit){super(`SSE \u306E\u30A4\u30D9\u30F3\u30C8\u5883\u754C\uFF08\u7A7A\u884C\uFF09\u304C ${limit} \u30D0\u30A4\u30C8\u4EE5\u5185\u306B\u73FE\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4E0A\u6D41\u306E\u5FDC\u7B54\u304C\u58CA\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002`)}};var SseParser=class{constructor(maxEventBytes=MAX_EVENT_BYTES){this.maxEventBytes=maxEventBytes}maxEventBytes;buffer="";pendingCr=false;push(chunk){
3
+ import{AuthSession,loadCredentials,withFileLock}from"./chunk-XNLIEUAW.js";import{parseVersionCore}from"./chunk-DXXFUNYN.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,effectiveRelayUrl,resolveConfiguredModel,resolveProfile}from"./chunk-NERYSBA4.js";import{ensureTwpHome,twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";var MAX_EVENT_BYTES=8*1024*1024;var SseBufferOverflowError=class extends Error{constructor(limit){super(`SSE \u306E\u30A4\u30D9\u30F3\u30C8\u5883\u754C\uFF08\u7A7A\u884C\uFF09\u304C ${limit} \u30D0\u30A4\u30C8\u4EE5\u5185\u306B\u73FE\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4E0A\u6D41\u306E\u5FDC\u7B54\u304C\u58CA\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002`)}};var SseParser=class{constructor(maxEventBytes=MAX_EVENT_BYTES){this.maxEventBytes=maxEventBytes}maxEventBytes;buffer="";pendingCr=false;push(chunk){
4
4
  let pending=this.pendingCr?`\r${chunk}`:chunk;this.pendingCr=pending.endsWith("\r");if(this.pendingCr)pending=pending.slice(0,-1);this.buffer+=pending.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(this.buffer.length>this.maxEventBytes){this.buffer="";this.pendingCr=false;throw new SseBufferOverflowError(this.maxEventBytes)}const events=[];for(;;){const boundary=this.buffer.indexOf("\n\n");if(boundary===-1)break;const block=this.buffer.slice(0,boundary);this.buffer=this.buffer.slice(boundary+2);const parsed=parseBlock(
5
5
  block);if(parsed)events.push(parsed)}return events}flush(){const rest=(this.pendingCr?`${this.buffer}
6
6
  `:this.buffer).trim();this.buffer="";this.pendingCr=false;if(rest==="")return[];const parsed=parseBlock(rest);return parsed?[parsed]:[]}};function parseBlock(block){let event="message";const data=[];for(const line of block.split("\n")){if(line.startsWith(":"))continue;const colon=line.indexOf(":");const field=colon===-1?line:line.slice(0,colon);let value=colon===-1?"":line.slice(colon+1);if(value.startsWith(" "))value=value.slice(1);if(field==="event")event=value;else if(field==="data")data.push(
@@ -0,0 +1,23 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{createRuntime}from"./chunk-FOFV2MNL.js";import{findExecutable}from"./chunk-PMOUHEJQ.js";import{describeAutoUpdate}from"./chunk-ILKQDXI5.js";import{PACKAGE_NAME,UPDATE_COMMAND,compareVersionCores,isBelowMinSupported,parseVersionCore}from"./chunk-DXXFUNYN.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{execFile}from"child_process";import fs from"fs";import path from"path";function resolveNpmCommand(deps={}){const platform=deps.platform??process.platform;const env=deps.env??process.env;const npmPath=(deps.find??(name=>findExecutable(name,{env,platform})))("npm");if(npmPath===null)return null;if(platform!=="win32")return{file:npmPath,prefix:[]};if(/\.exe$/i.test(npmPath))return{file:npmPath,prefix:[]};const cliJs=path.win32.join(path.win32.dirname(npmPath),"node_modules","npm","bin","npm-cli.js");return(deps.exists??fs.existsSync)(cliJs)?{file:deps.nodePath??process.
4
+ execPath,prefix:[cliJs]}:null}var DEFAULT_REGISTRY="https://registry.npmjs.org";function registryBase(env=process.env){const configured=env["npm_config_registry"]?.trim();if(configured===void 0||configured==="")return DEFAULT_REGISTRY;try{const url=new URL(configured);if(url.protocol!=="https:"&&url.protocol!=="http:")return DEFAULT_REGISTRY}catch{return DEFAULT_REGISTRY}return configured.replace(/\/+$/,"")}async function fetchFromRegistry(fetchImpl=httpFetch,env=process.env){const url=`${registryBase(env)}/${PACKAGE_NAME.replace(
5
+ "/","%2f")}`;const res=await fetchImpl(url,{headers:{Accept:"application/vnd.npm.install-v1+json"},signal:AbortSignal.timeout(5e3)});if(!res.ok){throw new Error(`registry \u304C ${res.status} \u3092\u8FD4\u3057\u307E\u3057\u305F`)}const body=await res.json();const latest=body["dist-tags"]?.latest;if(typeof latest!=="string"||parseVersionCore(latest)===null){throw new Error("registry \u306E\u5FDC\u7B54\u306B dist-tags.latest \u304C\u3042\u308A\u307E\u305B\u3093")}return{version:latest.trim(),source:"\
6
+ registry"}}async function fetchFromNpmCli(){const npm=resolveNpmCommand();if(npm===null){throw new Error("npm \u304C PATH \u306B\u898B\u3064\u304B\u308A\u307E\u305B\u3093")}const stdout=await new Promise((resolve,reject)=>{execFile(npm.file,[...npm.prefix,"view",PACKAGE_NAME,"version","--json"],{timeout:15e3,windowsHide:true},(error,out)=>error?reject(error):resolve(out))});const parsed=JSON.parse(stdout.trim());const latest=typeof parsed==="string"?parsed:null;if(latest===null||parseVersionCore(
7
+ latest)===null){throw new Error("npm view \u306E\u51FA\u529B\u304B\u3089\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F")}return{version:latest,source:"npm"}}function firstLine(message){const line=message.split("\n").map(l=>l.trim()).find(l=>l!=="")??message;return line.length>200?`${line.slice(0,200)}\u2026`:line}async function fetchLatestVersion(deps={}){const errors=[];for(const attempt of[()=>fetchFromRegistry(deps.fetchImpl??httpFetch,deps.env??process.env),
8
+ ()=>(deps.npmView??fetchFromNpmCli)()]){try{return await attempt()}catch(err){errors.push(firstLine(err instanceof Error?err.message:String(err)))}}return{version:null,source:null,error:errors.join(" / ")}}function isPrerelease(version){return/-/.test(version.trim())}function isBehindLatest(current,latest){const currentCore=parseVersionCore(current);const latestCore=parseVersionCore(latest);if(currentCore===null||latestCore===null||latest===null)return false;const diff=compareVersionCores(currentCore,
9
+ latestCore);if(diff!==0)return diff<0;return isPrerelease(current)&&!isPrerelease(latest)}async function runUpdate(opts,deps={}){const out=deps.out??(text=>void process.stdout.write(stripTerminalControls(text)));const err=deps.err??(text=>void process.stderr.write(stripTerminalControls(text)));const runtime=deps.runtime??createRuntime({...opts.profile!==void 0?{profile:opts.profile}:{},cliVersion:opts.version});let floor;let floorSource;if(runtime.loggedIn){const catalog=await runtime.loadCatalog();
10
+ floor=catalog.minSupportedVersion;floorSource=catalog.source==="server"?"\u30B5\u30FC\u30D0":catalog.source==="cache"?"\u30AD\u30E3\u30C3\u30B7\u30E5":"\u672A\u53D6\u5F97";if(floor===null){const cached=runtime.loadCachedFloor().minSupportedVersion;if(cached!==null){floor=cached;floorSource="\u30AD\u30E3\u30C3\u30B7\u30E5"}}}else{floor=runtime.loadCachedFloor().minSupportedVersion;floorSource="\u30AD\u30E3\u30C3\u30B7\u30E5\uFF08\u672A\u30ED\u30B0\u30A4\u30F3\uFF09"}const latest=deps.fetchLatest?
11
+ await deps.fetchLatest():await fetchLatestVersion();const behindLatest=isBehindLatest(opts.version,latest.version);const blocked=isBelowMinSupported(opts.version,floor);out(`twp ${opts.version}
12
+
13
+ `);out(latest.version!==null?` \u6700\u65B0\u7248 ${latest.version}\uFF08${latest.source==="registry"?"npm registry":"npm view"}\uFF09
14
+ `:" \u6700\u65B0\u7248 \u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\n");out(` \u6700\u5C0F\u30B5\u30DD\u30FC\u30C8 ${floor??"\u6307\u5B9A\u306A\u3057"}\uFF08${floorSource} / ${runtime.relayUrl}\uFF09
15
+ `);out(` \u81EA\u52D5\u66F4\u65B0 ${deps.describeAutoUpdate?deps.describeAutoUpdate():describeAutoUpdate(opts.version)}
16
+ `);if(blocked){out(` \u5224\u5B9A \u26A0 \u66F4\u65B0\u304C\u5FC5\u8981\u3067\u3059\uFF08${floor} \u672A\u6E80\u306E\u305F\u3081\u4F1A\u8A71\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093\uFF09
17
+
18
+ `);out(` ${UPDATE_COMMAND}
19
+ `);return 1}if(behindLatest){out(" \u5224\u5B9A \u66F4\u65B0\u3067\u304D\u307E\u3059\uFF08\u5FC5\u9808\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\n\n");out(` ${UPDATE_COMMAND}
20
+ `);return 0}out(latest.version!==null?" \u5224\u5B9A \u6700\u65B0\u3067\u3059\n":" \u5224\u5B9A \u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\n");if(latest.version===null&&latest.error!==void 0){err(`
21
+ \u6700\u65B0\u7248\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: ${latest.error}
22
+ `);err(`\u66F4\u65B0\u3059\u308B\u5834\u5408: ${UPDATE_COMMAND}
23
+ `)}return 0}export{resolveNpmCommand,fetchLatestVersion,isBehindLatest,runUpdate};