@tocca-systems/twp-cli 0.87.0 → 0.89.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.public.md +22 -0
- package/README.md +54 -3
- package/dist/{agent-SFDNPV24.js → agent-76ZH3E67.js} +1 -1
- package/dist/{agent-loop-KNAIM7MN.js → agent-loop-XPV5PNE5.js} +1 -1
- package/dist/ai-dispatch-FTZKQHEL.js +80 -0
- package/dist/analysis-CUXB6NQF.js +5 -0
- package/dist/{announcement-XAIC4CNE.js → announcement-4YNKKG5V.js} +1 -1
- package/dist/{api-command-2PNCTAWY.js → api-command-QS6VCLTX.js} +3 -3
- package/dist/{app-ALJYSYKI.js → app-GWNEJ24L.js} +4 -4
- package/dist/{attendance-correct-CJ3FJSVI.js → attendance-correct-KOTYM2DS.js} +2 -2
- package/dist/{attendance-lists-RRGFCDZR.js → attendance-lists-QUSNJQV2.js} +2 -2
- package/dist/{backlog-L5VRYZGM.js → backlog-CNTVVRZ6.js} +22 -20
- package/dist/budget-X3OMSO3F.js +4 -0
- package/dist/capacity-list-command-LKOVLAY4.js +24 -0
- package/dist/{capacity-report-command-BUCAQ2P4.js → capacity-report-command-CENWVTKK.js} +1 -1
- package/dist/{chunk-LGJPXLMC.js → chunk-2L2EGIWR.js} +1 -1
- package/dist/{chunk-2AVQILQQ.js → chunk-2T23XGJF.js} +2 -2
- package/dist/chunk-34TCAKT5.js +88 -0
- package/dist/{chunk-DR6BUZXT.js → chunk-3D734ED2.js} +1 -1
- package/dist/{chunk-QGRBZ2C2.js → chunk-3OCV6SOR.js} +1 -1
- package/dist/chunk-5PBNMFNO.js +49 -0
- package/dist/{chunk-NMYHFVDR.js → chunk-6FGQNFUV.js} +1 -1
- package/dist/{chunk-IIK77LSC.js → chunk-6M5NUVJJ.js} +1 -1
- package/dist/{chunk-FJEGS55N.js → chunk-733XATRJ.js} +1 -1
- package/dist/{chunk-FBVSHQST.js → chunk-7KD24ABA.js} +1 -1
- package/dist/{chunk-QUMDKN3U.js → chunk-7KD5RWFY.js} +1 -1
- package/dist/{chunk-WWDNWWPJ.js → chunk-DADDMUI5.js} +1 -1
- package/dist/chunk-DG7JPFYK.js +12 -0
- package/dist/{chunk-AV7L2IEN.js → chunk-E3UET43F.js} +1 -1
- package/dist/{chunk-E4FUHYC6.js → chunk-EGFVST6P.js} +1 -1
- package/dist/{chunk-VERYHAWV.js → chunk-EOXTDZTA.js} +4 -4
- package/dist/{chunk-RMU72S3D.js → chunk-FM3RHTEQ.js} +1 -1
- package/dist/{chunk-Y24FMUYU.js → chunk-INS77QHY.js} +4 -4
- package/dist/{chunk-SJDU7HP6.js → chunk-JA7DLMKJ.js} +4 -4
- package/dist/{chunk-MLRBDF44.js → chunk-JF2GCXNQ.js} +1 -1
- package/dist/{chunk-WDQMYRPE.js → chunk-KW37N7IO.js} +1 -1
- package/dist/{chunk-RTYJWZRA.js → chunk-LS7DFMG6.js} +1 -1
- package/dist/{chunk-OW23MAVO.js → chunk-M37IYSEG.js} +1 -1
- package/dist/{chunk-H4CDX4TX.js → chunk-MMVXE2CJ.js} +4 -3
- package/dist/{chunk-M7UEPYUQ.js → chunk-NLDVB4PZ.js} +1 -1
- package/dist/{chunk-XJ5EKWQY.js → chunk-OP5WINVG.js} +1 -1
- package/dist/{chunk-4FCPLEZN.js → chunk-OVV2PTZF.js} +1 -1
- package/dist/{chunk-Y7QW7MHQ.js → chunk-PWKWXZDZ.js} +1 -1
- package/dist/{chunk-5LFUD7K3.js → chunk-Q5NZXJNI.js} +28 -30
- package/dist/chunk-RACLI3FA.js +8 -0
- package/dist/{chunk-VRJF6JLR.js → chunk-RIEBWMKF.js} +1 -1
- package/dist/{chunk-GO4KFSBE.js → chunk-TVISFCQN.js} +5 -4
- package/dist/chunk-UVCJXHWN.js +5 -0
- package/dist/chunk-UZUV5FYG.js +16 -0
- package/dist/{chunk-4VBSSXGA.js → chunk-WGAEYNZQ.js} +1 -1
- package/dist/{chunk-KPCVSILY.js → chunk-WJJW7VX7.js} +1 -1
- package/dist/{chunk-MUIN7OUW.js → chunk-Y7GYWZLW.js} +3 -5
- package/dist/cli.js +57 -14
- package/dist/{commands-GQBRPBFW.js → commands-3B5GGPY7.js} +69 -68
- package/dist/{commands-KKEZJCLF.js → commands-RBN5WGWJ.js} +2 -2
- package/dist/{company-TF76Z3U5.js → company-3227PJ3Q.js} +2 -2
- package/dist/{completion-C6ZQCDT2.js → completion-32FJZVQR.js} +1 -1
- package/dist/{configure-3JID6MQ5.js → configure-DONZ3M6N.js} +3 -3
- package/dist/{contract-CFLPFV4I.js → contract-H5QWWRB3.js} +2 -2
- package/dist/{department-T22PBYMP.js → department-NIUPNDHH.js} +1 -1
- package/dist/{deposit-PLQ7WHOX.js → deposit-HUFSDRRK.js} +1 -1
- package/dist/{dispatch-HHWTJ3P4.js → dispatch-GSBMRWQ4.js} +1 -1
- package/dist/{domain-knowledge-YFY5H6UB.js → domain-knowledge-M4Y7744J.js} +1 -1
- package/dist/{estimate-DYPQ27KU.js → estimate-BIGMD2NU.js} +3 -3
- package/dist/evaluation-L4L23IY2.js +122 -0
- package/dist/{expense-EA77QGLW.js → expense-JKENK2W2.js} +1 -1
- package/dist/{fiscal-year-YSFASZEW.js → fiscal-year-G45WHCZC.js} +1 -1
- package/dist/{holiday-E5WEZU6J.js → holiday-EW62DVPW.js} +3 -3
- package/dist/{inquiry-LEYPOQWZ.js → inquiry-QGUOVO77.js} +1 -1
- package/dist/{invoice-CAYBEW65.js → invoice-ZWUU3FSZ.js} +2 -2
- package/dist/{job-title-RSDAHHVJ.js → job-title-CXCW7BAP.js} +1 -1
- package/dist/{knowledge-GYLFDEXS.js → knowledge-PBFDM5WJ.js} +2 -2
- package/dist/{leave-IG7SWPPB.js → leave-CXTBZFIC.js} +3 -3
- package/dist/{license-I2SL53UI.js → license-7WE7UPVX.js} +1 -1
- package/dist/{logout-guard-FCCJSF5V.js → logout-guard-PEETWT4A.js} +1 -1
- package/dist/{media-UGPQN4GI.js → media-FM53QOC2.js} +3 -3
- package/dist/{notification-IEANIYPD.js → notification-Z2VMBWO3.js} +1 -1
- package/dist/{onedrive-KWVOUGG6.js → onedrive-Z43D26SJ.js} +1 -1
- package/dist/{oneshot-3N2W247J.js → oneshot-YDTQT2T3.js} +1 -1
- package/dist/{outlook-FQYNTXOB.js → outlook-ILJN562M.js} +1 -1
- package/dist/{plan-submit-F5VH3T37.js → plan-submit-WP25FEYE.js} +1 -1
- package/dist/{position-CRVEGXPL.js → position-CLQVRA7Y.js} +1 -1
- package/dist/project-OTJCVFOW.js +4 -0
- package/dist/{prospect-A2YNQ4DE.js → prospect-3EHNELGI.js} +2 -2
- package/dist/{purchase-F3HUNCJE.js → purchase-MMUXAEER.js} +3 -3
- package/dist/{receivable-K4UKS46G.js → receivable-E52RNQTW.js} +1 -1
- package/dist/{redmine-MC3RIB7W.js → redmine-CKXEOH7Q.js} +1 -1
- package/dist/{registry-AQXCC42T.js → registry-A7OXOQPI.js} +1 -1
- package/dist/{report-HUP2TXTK.js → report-UTVGNCLP.js} +1 -1
- package/dist/{run-E3TOMCP7.js → run-VNV2AVDI.js} +2 -2
- package/dist/{sales-ai-review-5BJ3HNP5.js → sales-ai-review-XFMAKAOH.js} +2 -2
- package/dist/{sales-master-DUTB2DUX.js → sales-master-I6X4WFV3.js} +2 -2
- package/dist/{sales-numbering-WTEFGPOV.js → sales-numbering-P3JG4UPD.js} +1 -1
- package/dist/{schedule-command-ZOE3NYAA.js → schedule-command-4TFAFIAO.js} +1 -1
- package/dist/{search-JLFW7JSD.js → search-KFMYAVLM.js} +7 -6
- package/dist/{segment-ZKJYMOKV.js → segment-LCZFL6QE.js} +1 -1
- package/dist/{server-settings-GFWQ5ERV.js → server-settings-RNJ6RVTE.js} +1 -1
- package/dist/{server-skills-FVYYZ54O.js → server-skills-5JESWOTH.js} +1 -1
- package/dist/{setup-DW2H7BDN.js → setup-ICJPTYKW.js} +1 -1
- package/dist/{skill-5NCDQFDN.js → skill-GK2WADKA.js} +2 -2
- package/dist/{skill-check-JBRUAUID.js → skill-check-VNUNX6IO.js} +2 -2
- package/dist/{staffing-board-NWZLXYXJ.js → staffing-board-5YHU7V6Z.js} +3 -3
- package/dist/{status-command-PEL5GWIH.js → status-command-2FL2SVFR.js} +1 -1
- package/dist/{supplier-payment-QKWONHRH.js → supplier-payment-V4KRH7VA.js} +2 -2
- package/dist/{support-MLNODDQT.js → support-FU5M5LM3.js} +2 -2
- package/dist/{task-JGCMQZRK.js → task-PFSBL4A3.js} +4 -4
- package/dist/{teams-X5WBB5YH.js → teams-43CJTQHL.js} +1 -1
- package/dist/{user-FA2FIC47.js → user-5KHSDIVN.js} +4 -4
- package/dist/{user-contract-type-RELV4BV7.js → user-contract-type-4JXN7B7J.js} +1 -1
- package/dist/{worker-agent-IPOLSJEA.js → worker-agent-4TVU6AES.js} +1 -1
- package/dist/{workflow-VJL4FV3U.js → workflow-U5YJ2I6L.js} +1 -1
- package/package.json +1 -1
- package/dist/ai-dispatch-QKGK4P7P.js +0 -78
- package/dist/analysis-DPQN4BFG.js +0 -5
- package/dist/budget-T5YJTALN.js +0 -4
- package/dist/chunk-IVFSEXD3.js +0 -48
- package/dist/chunk-L37NS5L2.js +0 -8
- package/dist/chunk-MZXLMVQM.js +0 -11
- package/dist/chunk-O52RKZCC.js +0 -16
- package/dist/evaluation-NG4DIIJM.js +0 -61
- package/dist/project-JICUCXI5.js +0 -4
package/CHANGELOG.public.md
CHANGED
|
@@ -11,6 +11,28 @@
|
|
|
11
11
|
`CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
|
|
12
12
|
-->
|
|
13
13
|
|
|
14
|
+
## 0.89.0
|
|
15
|
+
|
|
16
|
+
評価期間の作成・変更・削除・締め・締め解除、評価基準(A〜E の説明)の表示・置き換え、役割テンプレートの一覧・作成・変更・削除を CLI から行えるようになりました。
|
|
17
|
+
|
|
18
|
+
`twp goal-sheet update` / `submit`・`twp evaluation step update`・`twp evaluation feedback save` / `send` / `publish`・`twp project evaluation create` で、目標シートの書き換えと提出、評価段の入力、フィードバックの下書き保存と公開、プロジェクトでの要員評価の作成をコマンドから行えるようになりました。フィードバックの公開は評価対象者に通知されるため `--yes` が必要です。
|
|
19
|
+
|
|
20
|
+
Microsoft 365 連携がデバイスポリシーで拒否されたときの案内を、原因に応じた解消手順(PC のブラウザからログインし直す等)を示すように直しました。
|
|
21
|
+
|
|
22
|
+
`twp backlog comment list --all` と `twp configure` の細かな不具合を修正しました(設定した既定の Backlog スペースが見つからないときの案内、ヘルプの誤った説明、端末で中断したときに設定が保存されてしまう問題など)。
|
|
23
|
+
|
|
24
|
+
ループがAIを1つも使えない状態になったとき、その機体をエージェントループ画面のランナー一覧で「AI使用不可」と確認できるようになりました(再ログインが必要な枠も表示されます)。
|
|
25
|
+
|
|
26
|
+
## 0.88.0
|
|
27
|
+
|
|
28
|
+
ループが状態ディレクトリへ実行結果のローカルファイルを書かなくなりました。実行結果の履歴はサーバ側で全機体ぶんをまとめて参照できます。
|
|
29
|
+
|
|
30
|
+
twp search --ai で Wiki ページの一部が当たったとき、当たった見出しを表示し、その節だけを開く twp wiki get --section のコマンドを案内するようにしました。
|
|
31
|
+
|
|
32
|
+
`twp task-loop capacity list` で、ループ実行機と AI アカウント枠の利用状況(5時間枠・週間枠・再ログイン期限)を画面を開かずに確認できるようになりました。
|
|
33
|
+
|
|
34
|
+
ループがAIを1つも使えずに作業を見送ったとき、どのAIがなぜ使えなかったか(再ログインが必要な枠など)を実行履歴に残すようになりました。
|
|
35
|
+
|
|
14
36
|
## 0.87.0
|
|
15
37
|
|
|
16
38
|
タスクグループ(閲覧できる人を限定するタスクのまとまり)を、twp task group list / create / update / delete で一覧・作成・更新・削除できるようにしました。twp task create / update の --group でタスクをグループに入れ、--clear group で外せます。
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ TWP(Tocca Working Platform)を、ターミナルから使うための CLI
|
|
|
24
24
|
| **できる** | `twp skill` / `twp qualification` によるスキルマスタ・資格マスタの一覧、スキル・スキルカテゴリの作成・更新・削除とカテゴリ内の並び替え、資格マスタの作成・更新・削除と CSV 一括登録・資格制度の説明文の更新(いずれも管理者のみ)、スキルマップの表示(部署で絞り込める)とスキル保有者の横断検索(所属付き)、自分のスキルプロファイルへの自己評価の提出(`--yes` が要ります)、`twp user skills` / `qualifications` / `trainings` / `contracts` によるユーザーのスキル評価・保有資格・研修受講履歴・雇用契約の参照。スキルマップと横断検索は HR管理者、雇用契約は原価管理者か管理者、研修履歴は人事管理の権限が要ります |
|
|
25
25
|
| **できる** | `twp department` / `twp position` / `twp job-title` / `twp segment` / `twp user-contract-type` / `twp fiscal-year` による組織マスタ(部署・役職・職位・セグメント・契約形態・事業年度設定)の一覧・取得・作成・更新・削除、`twp holiday` / `twp business-hours` によるカレンダーマスタ(祝日・営業日)の読み書きと CSV の出し入れと、部署ツリー・部署の所属者の表示。作成・更新・削除は管理者の権限が要ります |
|
|
26
26
|
| **できる** | `twp inquiry category` による問い合わせカテゴリの一覧・取得・作成・更新(通知先の設定・末尾への並べ替えを含む)。取得・作成・更新は問い合わせ機能の管理者の権限が要ります |
|
|
27
|
-
| **できる** | `twp evaluation` / `twp goal-sheet`
|
|
27
|
+
| **できる** | `twp evaluation` / `twp goal-sheet` による人事評価と目標シートの読み取り(評価期間・見てよい範囲の評価と目標シートの一覧・部下の評価の状況・評価の詳細とプロジェクト別評価・自分の目標シート・受け取ったフィードバック)と書き込み(目標シートの書き換え・提出、評価段の入力、フィードバックの下書き保存・送信・公開、`twp project evaluation create` によるプロジェクトでの要員評価の作成)、評価期間の作成・変更・削除・締め・締め解除、評価基準(A〜E の説明)の表示・置き換え、`twp role-template` による役割テンプレートの一覧・作成・変更・削除。評価期間・評価基準・役割テンプレートの書き込みは管理者の権限が要ります |
|
|
28
28
|
| **できる** | `twp support` によるシステムサポートへの依頼(依頼者側)の一覧・詳細(コメントの経過を含む)・起票(添付3件まで)・コメント・完了・再問い合わせ・取り下げと、カテゴリの一覧。運営側(回答・ステータス変更)は扱いません |
|
|
29
29
|
| **できる** | `twp notification` による自分宛ての通知の一覧(未読・カテゴリ・語で絞り込み)・詳細・未読件数・カテゴリ一覧と、1件ずつ・まとめての既読化 |
|
|
30
30
|
| **できる** | `twp worker-agent` によるワーカーエージェント(AIエージェント)の参照(一覧・詳細・スケジュールと次回実行予定・許可できるツールのカタログ・実行回数の上限と今日の使用数)と、実行履歴・実行結果(最終要約を先頭に)・ステップログ・ステップの集計の読み取りと、作成・更新(スケジュール指定込み)・削除・有効化/無効化・今すぐ実行(`--wait` で終わるまで待つ)・実行の取消 |
|
|
@@ -545,7 +545,7 @@ twp inquiry category update <カテゴリ> [--title <名前>] [--sort <整数|la
|
|
|
545
545
|
- 削除はまだありません(`twp api /api/v2/inquiries/categories/<ID> --method DELETE --yes` で行えます)
|
|
546
546
|
- ヘルプは `twp inquiry category help`
|
|
547
547
|
|
|
548
|
-
###
|
|
548
|
+
### 人事評価・目標シートを読む・書く
|
|
549
549
|
|
|
550
550
|
```
|
|
551
551
|
twp evaluation period list
|
|
@@ -557,6 +557,15 @@ twp evaluation feedback mine
|
|
|
557
557
|
twp goal-sheet list [--period <評価期間ID>] [--status draft|submitted|approved] [--all]
|
|
558
558
|
twp goal-sheet mine
|
|
559
559
|
twp goal-sheet get <目標シートID>
|
|
560
|
+
|
|
561
|
+
# 書き込み
|
|
562
|
+
twp goal-sheet update <目標シートID> (--content-file <パス> | --generate-cli-skeleton)
|
|
563
|
+
twp goal-sheet submit <目標シートID> --yes
|
|
564
|
+
twp evaluation step update <評価ID> --step <n> (--content-file <パス> | --generate-cli-skeleton) [--draft]
|
|
565
|
+
twp evaluation feedback save <評価ID> --body-file <パス>
|
|
566
|
+
twp evaluation feedback send <評価ID> --body-file <パス> --yes
|
|
567
|
+
twp evaluation feedback publish <評価ID> --yes
|
|
568
|
+
twp project evaluation create <コード|ID> --user <ユーザー> --period <評価期間ID> [--content-file <パス> | --generate-cli-skeleton]
|
|
560
569
|
```
|
|
561
570
|
|
|
562
571
|
- 一覧に出るのは**見てよい分だけ**です(人事管理の管理者は全員分、それ以外は評価期間時点の部下の分)。権限が無い人の分は 403 ではなく「出てこない」ので、0件でも「その人の分が無い」とは限りません
|
|
@@ -564,9 +573,38 @@ twp goal-sheet get <目標シートID>
|
|
|
564
573
|
- `evaluation get` はプロジェクト別評価(`project_evaluations`)も続けて読みます。評価対象者本人が読むと評価段は空で返ります(フィードバックは `twp evaluation feedback mine`)
|
|
565
574
|
- `goal-sheet mine` は今期のシートが無くても作りません。目標の中身は `sections` にあるので `--output json` か `--query sections` で読んでください
|
|
566
575
|
- サーバに人で絞る条件はありません。特定の人だけを見るなら `--query "[?user_id=='<ユーザーID>']"` を使ってください
|
|
567
|
-
-
|
|
576
|
+
- `goal-sheet update` の `sections` は**丸ごと置き換わります**。`--generate-cli-skeleton` で今の `sections` を出し、直して送ってください。承認済みのシートは書き換えられません
|
|
577
|
+
- `evaluation step update` は `--draft` を付けないと**段を確定し、次の評価者へ進めます**。評語(`level` / `position_level` / `bonus_level`)は `A`〜`E` か `null` です
|
|
578
|
+
- `feedback save` は下書きで、評価対象者には届きません。`feedback send`(保存+公開)と `feedback publish`(保存済みを公開)は**本人へ通知され取り消せない**ので `--yes` が要ります。`--dry-run --no-redact` で送る本文と相手を確かめられます
|
|
579
|
+
- 送る前に、誰の評価・目標シートかを stderr に出します(`--dry-run` でも出ます)
|
|
580
|
+
- 代理入力・評価者の付け替え・差し戻し、評価通知 PDF はありません
|
|
568
581
|
- ヘルプは `twp evaluation help` / `twp goal-sheet help`
|
|
569
582
|
|
|
583
|
+
### 評価期間・評価基準・役割テンプレートを管理する(管理者)
|
|
584
|
+
|
|
585
|
+
```
|
|
586
|
+
twp evaluation period get <評価期間ID>
|
|
587
|
+
twp evaluation period create --name <名前> --start <YYYYMM> --end <YYYYMM> [--description <説明>] [--config-file <JSON>]
|
|
588
|
+
twp evaluation period update <評価期間ID> [--name <名前>] [--start <YYYYMM>] [--end <YYYYMM>] [--description <説明>] [--config-file <JSON>]
|
|
589
|
+
twp evaluation period delete <評価期間ID> --yes
|
|
590
|
+
twp evaluation period close <評価期間ID> --yes
|
|
591
|
+
twp evaluation period reopen <評価期間ID> --yes
|
|
592
|
+
twp evaluation criteria get
|
|
593
|
+
twp evaluation criteria set --file <JSON> --yes
|
|
594
|
+
twp role-template list [--active true|false] [--keyword <語>]
|
|
595
|
+
twp role-template create --name <名前> --required-skill <スキル> [--required-skill ...] [--optional-skill <スキル> ...]
|
|
596
|
+
twp role-template update <ID> [--name <名前>] [--required-skill <スキル> ...] [--optional-skill <スキル> ... | --clear-optional-skills] [--active true|false]
|
|
597
|
+
twp role-template delete <ID> --yes
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
- 締めると、その期間の目標シート・評価の入力が全従業員で止まります。`close` / `reopen` は `--yes` が要り、`--dry-run` で対象の期間と状態を見られます
|
|
601
|
+
- 締め済みの期間は変更・削除できません(送る前に CLI が止めます。先に `reopen` してください)
|
|
602
|
+
- `--config-file` は `period get --output json` の `sheet_config` / `evaluation_config` を持つ JSON です。書いたキーを丸ごと置き換えます
|
|
603
|
+
- `criteria set` はファイルの内容で評価基準を**丸ごと置き換えます**(書かなかった評価項目は消えます)。ファイルは `criteria get --output json` の出力をそのまま編集できます。`--dry-run` で変わる行を見られます
|
|
604
|
+
- 役割テンプレートのスキルは名前・コード・ID で指定できます(`twp skill list`)。`update` の `--required-skill` / `--optional-skill` は一覧を丸ごと置き換えます
|
|
605
|
+
- 評価で使われている役割テンプレートは削除できません(使わなくするなら `update --active false`)
|
|
606
|
+
- ヘルプは `twp evaluation period help` / `twp evaluation criteria help` / `twp role-template help`
|
|
607
|
+
|
|
570
608
|
### システムサポートへ依頼する
|
|
571
609
|
|
|
572
610
|
```
|
|
@@ -2179,6 +2217,19 @@ twp task-loop runner remove --project <キー|UUID> <runner_id> [--output json]
|
|
|
2179
2217
|
- `twp task-loop status` も `stale` の登録があるときにこのコマンドを案内します
|
|
2180
2218
|
- 終了コード: `0` 表示した/外した / `1` 対象が一覧に無い・`live` のため外せない(`--yes` なしの表示時) / `2` 引数の誤り・`--yes` なし / `3` サーバが 4xx を返した(`live` の 409・権限不足の 403 等) / `4` 5xx・通信失敗 / `5` 認証失敗
|
|
2181
2219
|
|
|
2220
|
+
### 実行機と AI アカウント枠の状態を読む(`capacity list`)
|
|
2221
|
+
|
|
2222
|
+
```bash
|
|
2223
|
+
twp task-loop capacity list [--project <キー|UUID>] [--include-stopped] [--output json|table|tsv] [--query <式>]
|
|
2224
|
+
```
|
|
2225
|
+
|
|
2226
|
+
- 画面「ループ実行機状態」と同じ内容を、**プロジェクト横断**(個人タスクのキューを含む)で読みます。どのプロジェクトが返るかはサーバの閲覧権限に従います
|
|
2227
|
+
- table / tsv は「プロジェクト × 実行機 × 枠」で1行です。枠の状態(使用可・除外中・要再ログイン)、5時間枠・週間枠の利用率とリセット時刻、再ログイン期限、観測時刻(30分より古ければ `(stale)`)を出します。使用中の枠は名前の後ろに `*` が付きます。枠を報告していない機・プローブが失敗した機も1行出します
|
|
2228
|
+
- **停止中の機は既定で出しません**(画面「アカウント別」表示の「停止中も表示」と同じ)。`--include-stopped` で出すと画面「機体別」表示と同じ全件になります。隠した台数と、サーバ側で一覧から外れている台数(N日以上応答なし)は stderr に出ます
|
|
2229
|
+
- 利用率は table / tsv では整数%に丸めます(画面と同じ)。`--output json` は生値です。`--query` は json では全体、table / tsv では展開した行の配列に対して評価します
|
|
2230
|
+
- `--project` はサーバが返した中から絞るだけです(`TWP_PROJECT` は読みません)
|
|
2231
|
+
- 終了コード: `0` 表示した(0件を含む) / `2` 引数の誤り / `3` サーバが 4xx を返した / `4` 5xx・通信失敗・応答の形が違う / `5` 認証失敗
|
|
2232
|
+
|
|
2182
2233
|
### ループを回さない機から枠情報だけを送る(`capacity report`)
|
|
2183
2234
|
|
|
2184
2235
|
```bash
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{SCHEDULE_HELP,parseSchedule}from"./chunk-
|
|
3
|
+
import{SCHEDULE_HELP,parseSchedule}from"./chunk-DADDMUI5.js";import"./chunk-WVCEKC7V.js";import"./chunk-RX5HWI4L.js";import{charCount,readBody}from"./chunk-IWYJSQ5I.js";import"./chunk-W4NLJ2YK.js";import{AGENT_REPOSITORIES_PATH,AGENT_SCHEDULES_PATH,AGENT_SESSIONS_PATH}from"./chunk-2T23XGJF.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{ApiError}from"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";
|
|
4
4
|
import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import"./chunk-II5RVJQN.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiRejectedError,ApiResponseError,NetworkError,UsageError,WaitTimeoutError}from"./chunk-VFPY2A23.js";import{NotLoggedInError,SessionExpiredError}from"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";
|
|
5
5
|
import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var LABEL="\u5B9A\u671F\u5B9F\u884C";var LIST_COLUMNS=["schedule_id","name","enabled","schedule","repository_full_name","next_run_at","last_run_at","disabled_reason","owner_user_id"];var GET_COLUMNS=["schedule_id","name","enabled","schedule","repository_full_name","base_branch","ai_provider","ai_model","next_run_at","last_run_at","last_session_id","consecutive_failures","disabled_reason","owner_user_id","can_edit","can_disable","created_at","updated_at"];var RUN_COLUMNS=["run_id","created_at","t\
|
|
6
6
|
rigger","result","skip_reason","session_id","pr_url","error_message"];var NAME_MAX_CHARS=100;var INSTRUCTION_MAX_CHARS=1e4;var RUNS_MAX_LIMIT=100;var FORBIDDEN="AI\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u6A5F\u80FD\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\uFF08agent\uFF09\u304C\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u5272\u308A\u5F53\u3066\u3089\u308C\u3066\u3044\u306A\u3044\u304B\u3001\u4ED6\u30E6\u30FC\u30B6\u30FC\u306E\u5B9A\u671F\u5B9F\u884C\u3092\u5909\u66F4\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307E\u3059\u3002\u7DE8\u96C6\u30FB\u524A\u9664\u30FB\u6709\u52B9\u5316\u30FB\u4ECA\u3059\u3050\u5B9F\u884C\u306F\u30AA\u30FC\u30CA\u30FC\u672C\u4EBA\u3060\u3051\u3001\u7121\u52B9\u5316\u306F\u30AA\u30FC\u30CA\u30FC\u3068\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u7BA1\u7406\u8005\u304C\u3067\u304D\u307E\u3059\u3002";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{stepToItem}from"./chunk-
|
|
3
|
+
import{stepToItem}from"./chunk-3D734ED2.js";import"./chunk-NXPLTDN4.js";import{loadLocalConfig}from"./chunk-INS77QHY.js";import{parseOperations}from"./chunk-CVX2YWHC.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import{loadAiConfig}from"./chunk-FABDZBDZ.js";import{SKILL_PREFIX_RE,setSkillPrefix}from"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-UZUV5FYG.js";import{PRIVATE_PROJECT_PREFIX,PRIVATE_PROJECT_REF,
|
|
4
4
|
isPrivateProjectRef}from"./chunk-RMFLTSOV.js";import"./chunk-IXT2X5BZ.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import"./chunk-II5RVJQN.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{acknowledgement,isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";
|
|
5
5
|
import"./chunk-5WGOHFAS.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var LABEL="\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30EB\u30FC\u30D7\u306E\u30A2\u30A4\u30C6\u30E0";var STATUSES=["pending","processing","completed","failed"];var AI_TYPES=["claude","gemini","codex","copilot"];var EFFORTS=["low","medium","high","xhigh","max"];var PRIORITIES=["P0","P1","P2","P3"];var LIST_COLUMNS=["item_id","status","task_key","label","ai_type","ai_effort","runner_id","created_at"];var GET_COLUMNS=["item_id","status","task_key","label","prompt","ai_type","ai_model","ai_effort","runn\
|
|
6
6
|
er_id","attempt_count","reclaim_count","error_message","created_by_name","created_at","started_at","completed_at"];var HISTORY_COLUMNS=["item_id","status","task_key","skill","ai_type","runner_id","duration_ms","cost_usd","created_at"];var PLAN_RESULTS=["enqueued","empty","json_not_found","ai_failed","error","skipped","gated","locked","abandoned"];var PLAN_HISTORY_COLUMNS=["plan_run_id","result","runner_id","ai_type","duration_ms","cost_usd","step_count","started_at"];var PROJECT_FLAG={name:"--pr\
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-MBPJV745.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-3OCV6SOR.js";import{detectAiClis}from"./chunk-5SONMN6K.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{ClaudeStreamRenderer}from"./chunk-NXPLTDN4.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,
|
|
4
|
+
detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import"./chunk-UZUV5FYG.js";import"./chunk-RMFLTSOV.js";import"./chunk-IXT2X5BZ.js";import"./chunk-VFPY2A23.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";
|
|
5
|
+
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 DEFAULT_AI_TIMING={abortGraceMs:5e3,abortReapMs:2e3,pollIntervalMs:5e3};function resolveTiming(over){return{abortGraceMs:over?.abortGraceMs??DEFAULT_AI_TIMING.abortGraceMs,abortReapMs:over?.abortReapMs??DEFAULT_AI_TIMING.abortReapMs,pollIntervalMs:over?.pollIntervalMs??DEFAULT_AI_TIMING.pollIntervalMs}}var MAX_RETAINED_BYTES=4*1024*1024;function closeStream(stream){return new Promise(resolve=>{if(stream===null)return resolve();stream.once("error",()=>resolve());stream.end(()=>resolve())})}function buildArgs(req,cfg,env,workspace){
|
|
6
|
+
const warnings=[];const requested=(req.model??"").trim();const usable=requested!==""&&isUsableModelId(requested);if(requested!==""&&!usable){warnings.push(`ai_model '${requested}' \u306F\u4F7F\u3048\u306A\u3044\u5F62\u3067\u3059 \u2192 \u30AB\u30C6\u30B4\u30EA\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3092\u4F7F\u3044\u307E\u3059`)}const fitsRoute=!usable||!isClaudeAi(req.ai)||modelFitsRoute(requested,env);if(usable&&!fitsRoute){warnings.push(`ai_model '${requested}' \u306F\u73FE\u5728\u306E\u5B9F\u884C\u7D4C\u8DEF\u3067\u306F\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\uFF08\u3053\u306E\u6A5F\u4F53\u306F ${usesBedrock(
|
|
7
|
+
env)?"Bedrock":"Anthropic \u76F4"}\uFF09 \u2192 \u30AB\u30C6\u30B4\u30EA\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3092\u4F7F\u3044\u307E\u3059`)}const fallback=cfg.modelFor(req.ai,req.category,env);const safeFallback=fallback===""||!isClaudeAi(req.ai)||modelFitsRoute(fallback,env)?fallback:"";if(fallback!==""&&safeFallback===""){warnings.push(`CLAUDE_MODEL '${fallback}' \u3082\u73FE\u5728\u306E\u5B9F\u884C\u7D4C\u8DEF\u3067\u306F\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093 \u2192 \u30E2\u30C7\u30EB\u3092\u6307\u5B9A\u3057\u307E\u305B\u3093`)}
|
|
8
|
+
const model=usable&&fitsRoute?requested:safeFallback;const maxTurns=cfg.maxTurnsFor(req.category,env);let effort="";switch(req.ai){case"gemini":return{file:"gemini",args:["--yolo",...model?["--model",model]:[]],env:{GEMINI_CLI_TRUST_WORKSPACE:"true"},model,effort,maxTurns,warnings};case"codex":return{file:"codex",args:["exec","-s","danger-full-access",...model?["--model",model]:[]],env:{},model,effort,maxTurns,warnings};case"copilot":{const mcp=path.join(workspace,".copilot","mcp-config.json");const args=[
|
|
9
|
+
"--allow-all"];if(fs.existsSync(mcp))args.push("--additional-mcp-config",`@${mcp}`);else warnings.push(`${mcp} \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002copilot \u306F MCP \u306A\u3057\u3067\u5B9F\u884C\u3055\u308C\u307E\u3059`);if(model)args.push("--model",model);return{file:"copilot",args,env:{},model,effort,maxTurns,warnings}}default:{if(req.ai!=="claude")warnings.push(`\u672A\u77E5\u306E AI '${req.ai}'\u3002claude \u3067\u5B9F\u884C\u3057\u307E\u3059`);const e=cfg.effortFor(req.category,
|
|
10
|
+
req.skill,env,req.effort);if(e.warning!==null)warnings.push(e.warning);effort=e.value;const args=["-p","--max-turns",String(maxTurns),"--output-format","stream-json","--verbose","--dangerously-skip-permissions"];if(model)args.push("--model",model);if(effort)args.push("--effort",effort);return{file:"claude",args,env:{},model,effort,maxTurns,warnings}}}}async function runOnce(req,deps){let metrics=null;const result=await runOnceCore(req,deps,m=>{metrics=m});return metrics===null?result:{...result,
|
|
11
|
+
metrics}}async function runOnceCore(req,deps,onMetrics){const env=deps.env??process.env;const timing=resolveTiming(deps.timing);const isClaude=isClaudeAi(req.ai);const built=buildArgs(req,deps.config,env,req.cwd);for(const w of built.warnings)deps.log(` \u8B66\u544A: ${w}`);if(built.model)deps.log(` model: ${built.model} (ai_model=${req.model||"default"}, category=${req.category})`);if(built.effort)deps.log(` effort: ${built.effort} (category=${req.category}, skill=${req.skill||"none"})`);if(built.
|
|
12
|
+
effort&&(req.effort??"").trim()===built.effort){deps.log(` effort \u6307\u5B9A\u5143: item (ai_effort=${built.effort})`)}const launch=isClaude?wrapWithAutoSwitch(deps.cas,built.file,built.args):{file:built.file,args:built.args};const slot=req.slot!==void 0?req.slot:isClaude&&deps.cas!==null?activeSlotPath(deps.cas):null;if(slot!==null)deps.log(` claude \u67A0: ${slot}`);deps.log(`${req.ai} \u5B9F\u884C: ${firstLine(req.prompt)}`);deps.log(` \u30ED\u30B0: ${req.logFile}`);const renderer=isClaude?
|
|
13
|
+
new ClaudeStreamRenderer(deps.now):null;const lines=[];let retained=0;let truncated=false;let stream=null;try{fs.mkdirSync(path.dirname(req.logFile),{recursive:true,mode:448});stream=fs.createWriteStream(req.logFile,{flags:"w",mode:384})}catch{}const emit=line=>{const clean=stripTerminalControls(line);stream?.write(`${clean}
|
|
14
|
+
`);deps.log(clean);if(retained<MAX_RETAINED_BYTES){lines.push(clean);retained+=clean.length+1}else if(!truncated){truncated=true;lines.push("\u2026\uFF08\u51FA\u529B\u304C\u4E0A\u9650\u3092\u8D85\u3048\u305F\u305F\u3081\u3001\u4EE5\u964D\u306F\u30B9\u30C6\u30C3\u30D7\u30ED\u30B0\u306B\u306E\u307F\u8A18\u9332\u3057\u307E\u3059\uFF09")}};emit(` \u30D7\u30ED\u30F3\u30D7\u30C8: ${req.prompt.length} \u6587\u5B57\uFF08stdin \u7D4C\u7531\uFF09`);const target=resolveSpawnTarget(launch.file,launch.args,
|
|
15
|
+
{env,platform:deps.platform});if(!target.ok){emit(`[twp task-loop] ${launch.file} \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093: ${target.reason}`);deps.onProcess?.(null);await closeStream(stream);return{outcome:"unavailable",output:lines.join("\n"),exitCode:null,cooldownSec:null,slot}}if(target.note!==null)deps.log(` \u8D77\u52D5: ${target.note}`);let spawned;try{spawned=spawn(target.file,target.args,{cwd:req.cwd,env:{...env,...built.env},detached:process.platform!=="win32",stdio:["pipe","p\
|
|
16
|
+
ipe","pipe"]})}catch(e){const code=e.code??"";if(!["EINVAL","ENOENT","EACCES","ENAMETOOLONG"].includes(code))throw e;const hint=code==="ENAMETOOLONG"?`\uFF08\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u304C\u9577\u3059\u304E\u307E\u3059\u3002\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\uFF0B\u5F15\u6570\u3067 ${[target.file,...target.args].join(" ").length} \u6587\u5B57\u3002Windows \u306E\u4E0A\u9650\u306F 32,767 \u6587\u5B57\u3002\u30D7\u30ED\u30F3\u30D7\u30C8 ${req.prompt.length} \u6587\u5B57\u306F stdin \u7D4C\u7531\u306A\u306E\u3067\u539F\u56E0\u3067\u306F\u3042\u308A\
|
|
17
|
+
\u307E\u305B\u3093\uFF09`:"";emit(`[twp task-loop] ${launch.file} \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093: ${e.message}${hint}`);deps.onProcess?.(null);await closeStream(stream);return{outcome:"unavailable",output:lines.join("\n"),exitCode:null,cooldownSec:null,slot}}let stdinDelivered=false;let stdinError=null;spawned.stdin.on("error",e=>{if(stdinError===null)stdinError=e.code??e.message});spawned.stdin.on("finish",()=>{stdinDelivered=true});spawned.stdin.end(req.prompt);let killedFor=null;
|
|
18
|
+
const signalTree=signal=>killProcessTree(spawned,signal,{platform:deps.platform});const killTree=()=>{signalTree("SIGKILL")};let exited=false;let markExited=()=>{};const exitedPromise=new Promise(resolve=>{markExited=()=>{exited=true;deps.onProcess?.(null);resolve()}});const waitExit=ms=>Promise.race([exitedPromise,new Promise(resolve=>{const t=setTimeout(resolve,ms);t.unref?.()})]);const abort=async()=>{if(exited||spawned.exitCode!==null||spawned.signalCode!==null)return;if(killedFor===null)killedFor=
|
|
19
|
+
"aborted";if(isForceOnly(deps.platform)){deps.log(`\u26A0\uFE0F \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u3051\u305F\u305F\u3081 ${req.ai} \u3092\u505C\u6B62\u3057\u307E\u3059\uFF08Windows \u306F\u7336\u4E88\u3092\u7F6E\u3051\u306A\u3044\u305F\u3081 taskkill /T /F \u3067\u6728\u3054\u3068\u5F37\u5236\u7D42\u4E86\u3057\u307E\u3059\uFF09`);const how=signalTree("SIGKILL");await waitExit(timing.abortReapMs);deps.log(!exited?` \u26A0\uFE0F ${req.ai} \u304C ${timing.abortReapMs/1e3}\u79D2 \u4EE5\u5185\u306B\u6D88\u3048\u307E\u305B\
|
|
20
|
+
\u3093\u3067\u3057\u305F\u3002\u6B8B\u3063\u3066\u3044\u306A\u3044\u304B taskkill /FI \u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044`:how==="taskkill"?` ${req.ai} \u306E\u30D7\u30ED\u30BB\u30B9\u6728\u3092\u5F37\u5236\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08\u5B6B\u307E\u3067 taskkill /T \u304C\u5C4A\u304D\u307E\u3057\u305F\uFF09`:` \u26A0\uFE0F ${req.ai} \u306E\u76F4\u4E0B\u306E\u30D7\u30ED\u30BB\u30B9\u3060\u3051\u3092\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08taskkill \u3092\u6483\u3066\u306A\u304B\u3063\u305F\u305F\u3081\u5B6B\u304C\u6B8B\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF09`);
|
|
21
|
+
return}deps.log(`\u26A0\uFE0F \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u3051\u305F\u305F\u3081 ${req.ai} \u3092\u505C\u6B62\u3057\u307E\u3059\uFF08SIGTERM \u2192 \u6700\u5927${timing.abortGraceMs/1e3}\u79D2 \u2192 SIGKILL\uFF09`);signalTree("SIGTERM");await waitExit(timing.abortGraceMs);deps.log(exited?` ${req.ai} \u306F\u81EA\u5206\u304B\u3089\u7D42\u4E86\u3057\u307E\u3057\u305F\u3002\u6B8B\u3063\u305F\u5B50\u5B6B\u3092\u30D7\u30ED\u30BB\u30B9\u30B0\u30EB\u30FC\u30D7\u3054\u3068\u6383\u304D\u307E\u3059`:
|
|
22
|
+
` ${req.ai} \u304C\u7336\u4E88\u5185\u306B\u7D42\u4E86\u3057\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u30D7\u30ED\u30BB\u30B9\u30B0\u30EB\u30FC\u30D7\u3092\u5F37\u5236\u7D42\u4E86\u3057\u307E\u3059`);signalTree("SIGKILL");await waitExit(timing.abortReapMs)};deps.onProcess?.(abort);const started=Date.now();const feed=lineFeeder(raw=>{if(renderer===null)emit(raw);else for(const l of renderer.push(raw))emit(l)});spawned.stdout.on("data",c=>feed(c.toString("utf8")));spawned.stderr.on("data",c=>feed(
|
|
23
|
+
c.toString("utf8")));const timer=setInterval(()=>{if((Date.now()-started)/1e3>=req.timeoutSec){deps.log(`\u26A0\uFE0F ${req.ai} \u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 (${Math.trunc((Date.now()-started)/1e3)}s >= ${req.timeoutSec}s) \u2192 \u30D7\u30ED\u30BB\u30B9\u3092\u5F37\u5236\u7D42\u4E86`);killedFor="timeout";killTree();return}const limited=renderer!==null?renderer.sawRateLimit():isRateLimited(recentTail(lines),req.ai);if(limited){deps.log(`\u26A0\uFE0F ${req.ai} \u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u691C\u77E5 \u2192 \u5373\u5EA7\u306B\u30D7\u30ED\u30BB\u30B9\u3092\u7D42\u4E86`);
|
|
24
|
+
killedFor="rate-limited";killTree()}},timing.pollIntervalMs);let notLaunched=false;const exitCode=await new Promise(resolve=>{spawned.on("error",e=>{notLaunched=true;emit(`[twp task-loop] ${launch.file} \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093: ${e.message}`);markExited();resolve(null)});spawned.on("close",code=>{markExited();resolve(code)})});deps.onProcess?.(null);clearInterval(timer);feed(null);if(stdinError!==null||!stdinDelivered){const cause=killedFor!==null?`\u3053\u3061\u3089\u304C ${killedFor}\
|
|
25
|
+
\u3067\u505C\u6B62\u3055\u305B\u305F\u305F\u3081`:notLaunched?"\u8D77\u52D5\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081":exitCode===null?`AI \u304C signal\uFF08${spawned.signalCode??"\u4E0D\u660E"}\uFF09\u3067\u843D\u3061\u305F\u305F\u3081`:exitCode!==0?`AI \u304C\u7D42\u4E86\u30B3\u30FC\u30C9 ${exitCode} \u3067\u5148\u306B\u7D42\u308F\u3063\u305F\u305F\u3081`:"AI \u304C stdin \u3092\u8AAD\u307F\u5207\u3089\u306A\u304B\u3063\u305F\u305F\u3081";emit(`[twp task-loop] ${req.ai} \u3078\u30D7\u30ED\u30F3\u30D7\u30C8 ${req.
|
|
26
|
+
prompt.length} \u6587\u5B57\u3092\u9001\u308A\u5207\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${cause}${stdinError===null?"":`\u30FB${stdinError}`}\uFF09`)}await closeStream(stream);const output=lines.join("\n");const scan=tailForScan(output);onMetrics({turns:renderer?.result.numTurns??null,tokensIn:renderer?.result.tokensIn??null,tokensOut:renderer?.result.tokensOut??null,costUsd:renderer?.result.costUsd??null,effort:built.effort===""?null:built.effort});const fatalText=exitCode!==0&&isCliFatalText(
|
|
27
|
+
renderer?.result.finalText??"")?renderer?.result.finalText??"":"";if(killedFor==="aborted"){return{outcome:"aborted",output,exitCode,cooldownSec:null,slot}}const untrusted=isClaude&&isUntrusted(scan);if(untrusted){deps.log("\u26A0\uFE0F claude: \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u672A\u30C8\u30E9\u30B9\u30C8\u306E\u8B66\u544A\u304C\u51FA\u3066\u3044\u307E\u3059\uFF08permissions.allow \u306F\u7121\u8996\u3055\u308C\u308B\u304C\u5B9F\u884C\u81EA\u4F53\u306F\u901A\u308B\u3002hasTrustDialogAccepted \u3092\u7ACB\u3066\u308B\u3053\u3068\uFF09")}
|
|
28
|
+
const structuredLimited=renderer?.result.rateLimited===true;const textLimited=renderer!==null?exitCode!==0&&isRateLimited(scan,req.ai):isRateLimited(scan,req.ai);const fatalLimited=fatalText!==""&&isRateLimited(fatalText,req.ai);if(killedFor==="rate-limited"||structuredLimited||textLimited||fatalLimited){return{outcome:"rate-limited",output,exitCode,cooldownSec:cooldownFrom(renderer,`${scan}
|
|
29
|
+
${fatalText}`,deps.now?.()??new Date),slot}}if(killedFor==="timeout")return{outcome:"timeout",output,exitCode,cooldownSec:null,slot};if(exitCode!==0&&(isAuthError(scan)||fatalText!==""&&isAuthError(fatalText))){deps.log(`\u26A0\uFE0F ${req.ai} \u8A8D\u8A3C\u30A8\u30E9\u30FC\u3092\u691C\u77E5\u3057\u307E\u3057\u305F\uFF08\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u5BFE\u8C61\uFF09`);return{outcome:"auth-error",output,exitCode,cooldownSec:null,slot}}if(isClaude&&exitCode!==0){const byEvent=renderer?.
|
|
30
|
+
result.subtype==="error_max_turns";if(byEvent||maxTurnsReached(output,built.maxTurns)){deps.log(`\u26A0\uFE0F claude \u30BF\u30FC\u30F3\u4E0A\u9650(${built.maxTurns})\u5230\u9054\u3067\u6253\u3061\u5207\u3089\u308C\u307E\u3057\u305F\uFF08\u672A\u5B8C\u4E86\u306E\u53EF\u80FD\u6027\u304C\u9AD8\u3044\uFF09`);return{outcome:"max-turns",output,exitCode,cooldownSec:null,slot}}}if(notLaunched){deps.log(`\u26D4 ${req.ai} \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u672A\u5C0E\u5165\u30FB\u5B9F\u884C\u6A29\u30FB\u30E9\u30C3\u30D1\u306E\u7834\u640D\u306E\u3044\u305A\u308C\u304B\uFF09`);
|
|
31
|
+
return{outcome:"unavailable",output,exitCode,cooldownSec:null,slot}}if(untrusted&&exitCode!==0){deps.log("\u26D4 claude: \u672A\u30C8\u30E9\u30B9\u30C8\u306E\u307E\u307E\u5931\u6557\u3057\u307E\u3057\u305F\uFF08permissions.allow \u7121\u8996\u304C\u539F\u56E0\u306E\u53EF\u80FD\u6027\uFF09");return{outcome:"untrusted",output,exitCode,cooldownSec:null,slot}}if(exitCode===0&&!stdinDelivered){deps.log(`\u26D4 ${req.ai} \u306F\u7D42\u4E86\u30B3\u30FC\u30C90\u3067\u7D42\u308F\u308A\u307E\u3057\u305F\u304C\u3001\u30D7\u30ED\u30F3\u30D7\u30C8 ${req.
|
|
32
|
+
prompt.length} \u6587\u5B57\u3092\u9001\u308A\u5207\u308C\u3066\u3044\u307E\u305B\u3093\uFF08\u5207\u308A\u8A70\u307E\u3063\u305F\u6307\u793A\u3067\u8D70\u3063\u305F\u53EF\u80FD\u6027\u304C\u3042\u308B\u305F\u3081\u6210\u529F\u3068\u3057\u3066\u6271\u3044\u307E\u305B\u3093\uFF09`);return{outcome:"failed",output,exitCode,cooldownSec:null,slot}}return{outcome:exitCode===0?"ok":"failed",output,exitCode,cooldownSec:null,slot}}function cooldownFrom(renderer,scan,now){const resets=renderer?.result.resetsAt??
|
|
33
|
+
null;if(resets!==null){const wait=Math.trunc((resets*1e3-now.getTime())/1e3);if(wait>0)return wait+30}return rateLimitWaitSeconds(scan,now)}function lineFeeder(onLine){let buffer="";return chunk=>{if(chunk===null){if(buffer!=="")onLine(buffer);buffer="";return}buffer+=chunk;const parts=buffer.split("\n");buffer=parts.pop()??"";for(const p of parts)onLine(p)}}function firstLine(prompt){return(prompt.split("\n")[0]??"").slice(0,80)}function recentTail(lines){let size=0;let from=lines.length;while(from>
|
|
34
|
+
0&&size<64*1024){from-=1;size+=(lines[from]??"").length+1}return lines.slice(from).join("\n")}function sleepSync(ms){const shared=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(shared,0,0,ms)}var DEFAULT_CHARTER_PREFIX="===== \u4EE5\u4E0B\u306F\u958B\u767A\u61B2\u7AE0\u3067\u3059\u3002\u5168\u3066\u306E\u5224\u65AD\u306E\u6700\u4E0A\u4F4D\u57FA\u6E96\u3067\u3042\u308A\u3001\u500B\u5225\u30B9\u30AD\u30EB\u306E\u624B\u9806\u3068\u77DB\u76FE\u3059\u308B\u5834\u5408\u306F\u672C\u61B2\u7AE0\u304C\u512A\u5148\u3057\u307E\u3059\u3002\u884C\u52D5\u3059\u308B\u524D\u306B\u3001\u305D\u306E\u884C\u52D5\u304C\u61B2\u7AE0\u306E\u76EE\u7684\u306B\u5BC4\u4E0E\u3059\u308B\u304B\u3092\u81EA\u3089\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 =====";
|
|
35
|
+
var DEFAULT_CHARTER_SUFFIX="===== \u958B\u767A\u61B2\u7AE0\u3053\u3053\u307E\u3067\u3002\u4EE5\u4E0B\u304C\u4ECA\u56DE\u306E\u30BF\u30B9\u30AF\u6307\u793A\u3067\u3059\u3002 =====";function wrapCharter(prefix,body,suffix){const parts=[];if(prefix!=="")parts.push(prefix);parts.push(body);if(suffix!=="")parts.push(suffix);return parts.join("\n\n")}var UNKNOWN_SLOT="(unresolved)";var FAST_FAIL_SEC=60;var FAST_FAIL_STREAK=3;var HEALTH_PROBE_AIS=["codex","gemini","copilot"];var HEALTH_PROBE_TTL_MS=1800*
|
|
36
|
+
1e3;var HEALTH_PROBE_TIMEOUT_SEC=60;var HEALTH_PROBE_PROMPT="Health check. Do not read or modify any files and do not run any commands. Reply with exactly: OK";var DispatchEngine=class{constructor(cfg,log,opts){this.cfg=cfg;this.log=log;this.opts=opts}cfg;log;opts;name="cli";cas=null;casDetected=false;slotResolved=new Map;lastSlot=new Map;charterWarned=false;unusable=null;activeAbort=null;aborting=false;unusableAt=0;fastFailStreak=new Map;healthyAt=new Map;unusableWhy=new Map;launcherBin(){const v=this.
|
|
37
|
+
opts.launcherBin?.trim();return v===void 0||v===""?DEFAULT_CLAUDE_LAUNCHER.bin:v}async run(req){this.slotResolved.clear();if(this.aborting){this.log("\u26D4 \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u3051\u3066\u3044\u308B\u305F\u3081 AI \u3092\u8D77\u52D5\u3057\u307E\u305B\u3093");return{outcome:"aborted",usedAi:"",serverAiType:null,output:"\uFF08\u4E2D\u65AD\u306E\u305F\u3081\u672A\u5B9F\u884C\uFF09"}}const baseEnv=this.opts.env??process.env;const env=req.extraEnv===void 0?baseEnv:{...baseEnv,
|
|
38
|
+
...req.extraEnv};const skill=req.skill??"";const category=req.category??this.cfg.categoryForSkill(skill);if(!this.preflightOk()){this.log("\u26D4 \u30DB\u30B9\u30C8\u5074\u306E\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u304C\u5230\u9054\u4E0D\u80FD\u3067\u3059\uFF08\u5168\u30DB\u30B9\u30C8\uFF09\u3002\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u3067\u306F AI \u3092\u8D77\u52D5\u3057\u307E\u305B\u3093");return{outcome:"network-down",usedAi:"",serverAiType:null,output:"\uFF08\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u5230\u9054\u4E0D\u80FD\u306E\u305F\u3081\u672A\u5B9F\u884C\uFF09"}}
|
|
39
|
+
if(!this.casDetected){this.cas=this.opts.detect!==void 0?this.opts.detect():detectClaudeAutoSwitch(this.launcherBin());this.casDetected=true;this.log(this.cas===null?` ${this.launcherBin()}: \u672A\u5C0E\u5165\uFF08claude \u3092\u7D20\u3067\u8D77\u52D5\u3057\u307E\u3059\uFF09`:` ${this.launcherBin()}: \u691C\u51FA\uFF08exec ${this.cas.hasExec?"\u3042\u308A \u2192 \u7D4C\u7531\u3057\u3066\u8D77\u52D5\u3057\u307E\u3059":"\u7121\u3057 \u2192 \u7D20\u3067\u8D77\u52D5\u3057\u307E\u3059\uFF08\u66F4\u65B0\u3092\u63A8\u5968\uFF09"}\
|
|
40
|
+
\uFF09`)}const tried=[];const reasons=new Map;let sawRateLimit=false;let sawTimeout=false;let sawFastFail=false;let sawUnavailable=false;let ranAny=false;let skippedForCooldown=false;let lastOutput="";let lastValidated=true;const requested=this.orderFor(category,skill,req.aiType);const head=requested[0]??"";const order=this.usableOrder(requested,category,skill,(ai,why)=>reasons.set(ai,why));for(const ai of order){if(tried.includes(ai))continue;if(!this.cfg.isAllowed(ai,category,skill)){this.log(
|
|
41
|
+
` ${ai} \u306F category=${category} / skill=${skill||"none"} \u306E\u5B9F\u884C\u5BFE\u8C61\u5916\u306E\u305F\u3081\u30B9\u30AD\u30C3\u30D7`);continue}const slotFor=()=>{if(!isClaudeAi(ai))return null;if(this.cas===null)return null;if(this.slotResolved.has(ai))return this.slotResolved.get(ai)??null;const resolved=(this.opts.activeSlot??activeSlotPath)(this.cas);const effective=resolved??this.lastSlot.get(ai)??UNKNOWN_SLOT;if(resolved!==null)this.lastSlot.set(ai,resolved);else this.log(` ${ai} \
|
|
42
|
+
\u306E\u67A0\u3092\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${this.launcherBin()} ${DEFAULT_CLAUDE_LAUNCHER.activeArgs.join(" ")}\uFF09\u3002${effective} \u3068\u3057\u3066\u6271\u3044\u307E\u3059`);this.slotResolved.set(ai,effective);return effective};const slotNow=this.cfg.hasCooldownFor(ai,this.now())?slotFor():null;if(this.cfg.isRateLimited(ai,this.now(),slotNow)){skippedForCooldown=true;reasons.set(ai,"rate-limited");this.log(` ${ai} \u306F\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u4E2D\u306E\u305F\u3081\u30B9\u30AD\u30C3\u30D7`);
|
|
43
|
+
continue}const isHead=tried.length===0&&ai===head;this.log(isHead?` AI\u9078\u629E: ${ai} (preferred) [category=${category}]`:` \u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF: ${ai} [category=${category}]`);const prompt=this.buildPrompt(req.prompt,req.promptPrefix,ai,tried,req.serverSkills);const logFile=tried.length===0?req.logFile:req.logFile.replace(/\.log$/,`-fallback-${ai}.log`);if(this.aborting){this.log(` \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u3051\u3066\u3044\u308B\u305F\u3081 ${ai}\
|
|
44
|
+
\u306F\u8D77\u52D5\u3057\u307E\u305B\u3093`);return{outcome:"aborted",usedAi:tried[tried.length-1]??"",serverAiType:null,output:lastOutput}}ranAny=true;const startedAt=this.now();const result=await(this.opts.runOnce??runOnce)({ai,prompt,logFile,cwd:req.cwd,timeoutSec:req.timeoutSec,category,skill,slot:slotFor(),model:isHead?req.aiModel:void 0,effort:req.aiEffort},{config:this.cfg,cas:this.cas,log:this.log,env,now:this.opts.now,onProcess:abort=>{this.activeAbort=abort;if(abort!==null&&this.aborting)
|
|
45
|
+
void abort()}});lastOutput=result.output;tried.push(ai);const elapsedMs=this.now()-startedAt;const elapsedSec=Math.round(elapsedMs/1e3);if(result.outcome==="failed"&&result.exitCode!==0&&elapsedMs>=0&&elapsedSec<FAST_FAIL_SEC){sawFastFail=true;reasons.set(ai,`fast-fail(${elapsedSec}s)`);const streak=(this.fastFailStreak.get(ai)??0)+1;this.fastFailStreak.set(ai,streak);this.log(` ${ai} \u304C ${elapsedSec}\u79D2\u3067\u5931\u6557\u3057\u307E\u3057\u305F\uFF08AI \u304C\u4ED5\u4E8B\u3092\u59CB\u3081\u308B\u524D\u306B\u843D\u3061\u305F\u53EF\u80FD\u6027\uFF09 \u2192 \u6B21\u306EAI\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF`);
|
|
46
|
+
if(streak>=FAST_FAIL_STREAK){const sec=this.markUnusable(ai,`fast-fail x${streak}`);this.fastFailStreak.delete(ai);this.log(` ${ai} \u306F\u8D77\u52D5\u76F4\u5F8C\u306E\u5931\u6557\u304C${streak}\u56DE\u7D9A\u3044\u3066\u3044\u307E\u3059 \u2192 ${sec}\u79D2\u9593\u306F\u9396\u304B\u3089\u5916\u3057\u307E\u3059\uFF08\u540C\u3058\u58C1\u306B\u5F8C\u7D9A\u30A2\u30A4\u30C6\u30E0\u3092\u5F53\u3066\u306A\u3044\u305F\u3081\u3002\u76F4\u8FD1\u306E\u51FA\u529B: ${failureHint(result.output)||"(\u7406\u7531\u884C\u306A\u3057)"}\
|
|
47
|
+
\uFF09`)}continue}if(!["rate-limited","auth-error","unavailable"].includes(result.outcome)){this.fastFailStreak.delete(ai)}if(!["rate-limited","auth-error","timeout","unavailable"].includes(result.outcome)){if(result.outcome==="ok"&&req.validate!==void 0){if(req.validate(result.output)){this.log(` ${ai} \u304B\u3089\u5B9F\u884C\u8A08\u753BJSON\u3092\u53D6\u5F97\u3057\u307E\u3057\u305F`)}else{this.log(` ${ai}: \u5B9F\u884C\u8A08\u753B\u306EJSON\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 \u2192 \u6B21\u306EAI\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF`);
|
|
48
|
+
lastValidated=false;continue}}return this.finish(result.outcome,ai,result.output,result.metrics)}if(result.outcome==="rate-limited"){sawRateLimit=true;reasons.set(ai,"rate-limited");const seconds=result.cooldownSec??this.cfg.cooldownDefaultSec(ai,env);const slotUsed=slotFor();const capped=this.cfg.markRateLimited(ai,seconds,this.now(),slotUsed);this.log(` ${ai} \u3092\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u3068\u3057\u3066\u30DE\u30FC\u30AF (${capped}\u79D2\u9593${slotUsed===null?"":` / \u67A0 ${slotUsed}`}\
|
|
49
|
+
)`);await this.waitBeforeFallback(ai,env)}else if(result.outcome==="timeout"){sawTimeout=true;reasons.set(ai,"timeout");this.log(` ${ai} \u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 \u2192 \u6B21\u306EAI\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF`)}else if(result.outcome==="unavailable"){sawUnavailable=true;const why=this.reasonLabel("not-startable",slotFor());reasons.set(ai,why);const sec=this.markUnusable(ai,why);this.log(` ${ai} \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093 \u2192 \u6B21\u306EAI\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\uFF08${sec}\
|
|
50
|
+
\u79D2\u9593\u306F\u9396\u304B\u3089\u5916\u3057\u307E\u3059\uFF09`)}else{sawUnavailable=true;const why=this.reasonLabel("auth-error",slotFor());reasons.set(ai,why);const sec=this.markUnusable(ai,why);this.log(` ${ai} \u306E\u8A8D\u8A3C\u30A8\u30E9\u30FC \u2192 \u6B21\u306EAI\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\uFF08${sec}\u79D2\u9593\u306F\u9396\u304B\u3089\u5916\u3057\u307E\u3059\uFF09`)}}if(!lastValidated&&!sawRateLimit&&ranAny){this.log("\u26A0\uFE0F \u3069\u306EAI\u304B\u3089\u3082\u5B9F\u884C\u8A08\u753BJSON\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");
|
|
51
|
+
return{outcome:"ok",usedAi:tried[tried.length-1]??"",serverAiType:null,output:lastOutput}}if(!ranAny){if(skippedForCooldown){this.log("\u26A0\uFE0F \u5168AI\u304C\u30AF\u30FC\u30EB\u30C0\u30A6\u30F3\u4E2D\u30671\u3064\u3082\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u5F85\u6A5F\u3057\u3066\u518D\u8A66\u884C\u3057\u307E\u3059\uFF09");return{outcome:"rate-limited",usedAi:"",serverAiType:null,output:lastOutput}}this.log("\u26A0\uFE0F \u5B9F\u884C\u3067\u304D\u308BAI\u304C\u9396\u306B1\u3064\u3082\u3042\u308A\u307E\u305B\u3093\uFF08\u672A\u30ED\u30B0\u30A4\u30F3\u30FB\u30AB\u30C6\u30B4\u30EA\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09");
|
|
52
|
+
return this.unavailable("",lastOutput,reasons,requested)}if(sawTimeout){this.log("\u26A0\uFE0F \u5168AI\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u307E\u305F\u306F\u8A8D\u8A3C\u30A8\u30E9\u30FC\u3067\u3059\uFF08\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u3067\u306F\u306A\u3044\u306E\u3067\u901A\u5E38\u5931\u6557\u3068\u3057\u3066\u6271\u3044\u307E\u3059\uFF09");return{outcome:"timeout",usedAi:tried[tried.length-1]??"",serverAiType:null,output:lastOutput}}if(sawRateLimit){this.log("\u26A0\uFE0F \u5168AI\u304C\u30EC\u30FC\u30C8\u30EA\u30DF\
|
|
53
|
+
\u30C3\u30C8\u3067\u3059");return{outcome:"rate-limited",usedAi:"",serverAiType:null,output:lastOutput}}if(sawFastFail&&!sawUnavailable){this.log("\u26A0\uFE0F \u5168AI\u304C\u8D77\u52D5\u76F4\u5F8C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u901A\u5E38\u5931\u6557\u3068\u3057\u3066\u6271\u3044\u307E\u3059\uFF09");return this.finish("failed",tried[tried.length-1]??"",lastOutput)}this.log("\u26A0\uFE0F \u5168AI\u304C\u8A8D\u8A3C\u30A8\u30E9\u30FC\u307E\u305F\u306F\u8D77\u52D5\u4E0D\u80FD\u3067\u3059\uFF081\u884C\u3082\u5B9F\u884C\u3057\u3066\u3044\u306A\u3044\u305F\u3081\u3001\u5931\u6557\u3067\u306F\u306A\u304F\u672A\u5B9F\u884C\u3068\u3057\u3066\u6271\u3044\u307E\u3059\uFF09");
|
|
54
|
+
return this.unavailable(tried[tried.length-1]??"",lastOutput,reasons,requested)}unavailable(usedAi,output,reasons,order){const rank=ai=>{const i=order.indexOf(ai);return i<0?order.length:i};const aiReasons=[...reasons].sort(([a],[b])=>rank(a)-rank(b)).map(([ai,why])=>`${ai}=${why}`).join(" / ");if(aiReasons!=="")this.log(` \u4F7F\u3048\u306A\u304B\u3063\u305F\u7406\u7531: ${aiReasons}`);return{outcome:"unavailable",usedAi,serverAiType:null,output,...aiReasons===""?{}:{aiReasons}}}async healthCheck(ctx){
|
|
55
|
+
const results=[];if(this.aborting)return results;const targets=HEALTH_PROBE_AIS.flatMap(ai=>{const category=this.cfg.probeCategoryFor(ai);return category===null?[]:[{ai,category}]});if(targets.length===0)return results;if(!this.preflightOk()){for(const{ai}of targets)results.push({ai,verdict:"skipped",reason:"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u5230\u9054\u4E0D\u80FD",elapsedSec:null});this.logHealth(results);return results}const env=this.opts.env??process.env;const detected=this.detectUnusable();
|
|
56
|
+
for(const{ai,category}of targets){const now=this.now();if(detected.get(ai)?.hard===true){results.push({ai,verdict:"skipped",reason:"\u672A\u5C0E\u5165",elapsedSec:null});continue}if(this.cfg.isAiUnusable(ai,now)||this.cfg.isRateLimited(ai,now)){results.push({ai,verdict:"skipped",reason:"\u9664\u5916\u4E2D\uFF08\u671F\u9650\u660E\u3051\u306B\u518D\u691C\u67FB\uFF09",elapsedSec:null});continue}const last=this.healthyAt.get(ai);if(last!==void 0&&now-last>=0&&now-last<HEALTH_PROBE_TTL_MS){results.push(
|
|
57
|
+
{ai,verdict:"skipped",reason:"\u76F4\u8FD1\u306B\u5065\u5168",elapsedSec:null});continue}if(this.aborting)break;const startedAt=this.now();let result;try{result=await(this.opts.runOnce??runOnce)({ai,prompt:HEALTH_PROBE_PROMPT,logFile:`${ctx.logFilePrefix}-${ai}.log`,cwd:ctx.cwd,timeoutSec:HEALTH_PROBE_TIMEOUT_SEC,category,skill:""},{config:this.cfg,cas:this.cas,log:this.log,env,now:this.opts.now,onProcess:abort=>{this.activeAbort=abort;if(abort!==null&&this.aborting)void abort()}})}catch(err){results.
|
|
58
|
+
push({ai,verdict:"inconclusive",reason:`\u691C\u67FB\u304C\u4F8B\u5916\u3067\u7D42\u4E86\uFF08${err.message}\uFF09`,elapsedSec:null});continue}const elapsedMs=this.now()-startedAt;const elapsedSec=Math.round(elapsedMs/1e3);const hint=failureHint(result.output)||"(\u7406\u7531\u884C\u306A\u3057)";if(result.outcome==="ok"){this.healthyAt.set(ai,this.now());this.fastFailStreak.delete(ai);results.push({ai,verdict:"healthy",reason:"\u5FDC\u7B54\u3042\u308A",elapsedSec})}else if(result.outcome==="rate\
|
|
59
|
+
-limited"){const sec=this.cfg.markRateLimited(ai,result.cooldownSec??this.cfg.cooldownDefaultSec(ai,env),this.now());this.healthyAt.delete(ai);results.push({ai,verdict:"unhealthy",reason:`\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u30FB\u5229\u7528\u4E0A\u9650\uFF08${sec}\u79D2\u9593\u5916\u3057\u307E\u3059: ${hint}\uFF09`,elapsedSec})}else if(result.outcome==="auth-error"||result.outcome==="unavailable"){const sec=this.markUnusable(ai,result.outcome==="auth-error"?"auth-error":"not-startable");
|
|
60
|
+
this.healthyAt.delete(ai);results.push({ai,verdict:"unhealthy",reason:`${result.outcome==="auth-error"?"\u8A8D\u8A3C\u30A8\u30E9\u30FC":"\u8D77\u52D5\u4E0D\u80FD"}\uFF08${sec}\u79D2\u9593\u5916\u3057\u307E\u3059: ${hint}\uFF09`,elapsedSec})}else if(result.outcome==="failed"&&result.exitCode!==0&&elapsedMs>=0&&elapsedSec<FAST_FAIL_SEC){const sec=this.markUnusable(ai,`fast-fail(${elapsedSec}s)`);this.fastFailStreak.delete(ai);this.healthyAt.delete(ai);results.push({ai,verdict:"unhealthy",reason:`${elapsedSec}\
|
|
61
|
+
\u79D2\u3067\u7570\u5E38\u7D42\u4E86\uFF08${sec}\u79D2\u9593\u5916\u3057\u307E\u3059: ${hint}\uFF09`,elapsedSec})}else{results.push({ai,verdict:"inconclusive",reason:`${result.outcome}\uFF08\u5916\u3057\u307E\u305B\u3093\uFF09`,elapsedSec})}}this.activeAbort=null;this.logHealth(results);return results}logHealth(results){const label={healthy:"\u5065\u5168",unhealthy:"\u4E0D\u5065\u5168",skipped:"\u691C\u67FB\u7701\u7565",inconclusive:"\u5224\u5B9A\u4E0D\u80FD"};for(const r of results){this.log(` \
|
|
62
|
+
AI\u30D8\u30EB\u30B9\u30C1\u30A7\u30C3\u30AF: ${r.ai} ${label[r.verdict]}\uFF08${r.reason}${r.elapsedSec===null?"":`\u30FB${r.elapsedSec}\u79D2`}\uFF09`)}}async abort(){this.aborting=true;const abort=this.activeAbort;if(abort===null)return false;await abort();return true}now(){return(this.opts.now??(()=>new Date))().getTime()}usableOrder(order,category,skill,note=()=>{}){const detected=this.detectUnusable();const unique=[...new Set(order)];const kept=[];const soft=[];const dropped=[];for(const ai of unique){
|
|
63
|
+
const cooled=this.cfg.isAiUnusable(ai,this.now());const hit=cooled?{why:"\u76F4\u8FD1\u306E\u8A8D\u8A3C\u30A8\u30E9\u30FC\u30FB\u8D77\u52D5\u5931\u6557\u30FB\u8D77\u52D5\u76F4\u5F8C\u306E\u5931\u6557\u306E\u9023\u7D9A",hard:false}:detected.get(ai);if(hit===void 0){kept.push(ai);continue}note(ai,cooled?`excluded:${this.unusableWhy.get(ai)??"recent-failure"}`:hit.hard?"not-installed":"not-logged-in");dropped.push(`${ai}\uFF08${hit.why}\uFF09`);if(!hit.hard)soft.push(ai)}if(dropped.length===0)return unique;
|
|
64
|
+
const canRun=list=>list.some(ai=>this.cfg.isAllowed(ai,category,skill));if(!canRun(kept)&&canRun(soft)){this.log(` \u26A0\uFE0F \u9396\u306B\u5B9F\u884C\u3067\u304D\u308B AI \u304C\u6B8B\u308A\u307E\u305B\u3093\uFF08\u9664\u5916\u5019\u88DC: ${dropped.join(" / ")}\uFF09`);this.log(" \u63A8\u5B9A\u3067\u5916\u3057\u305F\u3082\u306E\u306F\u5224\u5B9A\u304C\u8AA4\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308B\u305F\u3081\u3001\u9396\u3078\u623B\u3057\u307E\u3059\uFF08fail-open\uFF09");
|
|
65
|
+
return unique.filter(ai=>kept.includes(ai)||soft.includes(ai))}this.log(` \u9396\u304B\u3089\u9664\u5916: ${dropped.join(" / ")}`);if(kept.length===0){this.log(" \u9396\u306B\u8D77\u52D5\u3067\u304D\u308B AI \u304C1\u3064\u3082\u6B8B\u308A\u307E\u305B\u3093\uFF08\u672A\u5C0E\u5165\u306E AI \u3092\u8D77\u52D5\u3057\u3066\u3082\u5FC5\u305A\u5931\u6557\u3057\u307E\u3059\uFF09")}return kept}detectUnusable(){const now=this.now();if(this.unusable!==null&&now-this.unusableAt<DETECT_CACHE_MS)return this.
|
|
66
|
+
unusable;const map=new Map;this.unusable=map;this.unusableAt=now;try{for(const d of(this.opts.detectClis??detectAiClis)({env:this.opts.env??process.env,launcherBin:this.launcherBin()})){if(!d.installed)map.set(d.ai,{why:"PATH \u306B\u7121\u3044\uFF08\u672A\u5C0E\u5165\uFF09",hard:true});else if(d.auth==="unauthenticated")map.set(d.ai,{why:"\u672A\u30ED\u30B0\u30A4\u30F3",hard:false})}}catch(err){this.log(` \u26A0\uFE0F AI CLI \u306E\u691C\u51FA\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08${err.
|
|
67
|
+
message}\uFF09\u3002\u9396\u306F\u305D\u306E\u307E\u307E\u4F7F\u3044\u307E\u3059`);map.clear()}return map}markUnusable(ai,why){this.unusableWhy.set(ai,why);return this.cfg.markAiUnusable(ai,this.now())}reasonLabel(code,slot){if(slot===null)return code;return`${code}(${slot===UNKNOWN_SLOT?slot:path2.basename(slot)})`}orderFor(category,skill,preferred){const chain=this.cfg.chainFor(category);const head=preferred&&preferred.trim()!==""?preferred.trim():this.cfg.selectPrimary(category,skill,"P2","");
|
|
68
|
+
return head===""?chain:[head,...chain]}finish(outcome,ai,output,metrics){const serverAiType=isServerAiType(ai)?ai:null;return metrics===void 0?{outcome,usedAi:ai,serverAiType,output}:{outcome,usedAi:ai,serverAiType,output,metrics}}async waitBeforeFallback(ai,env){const delay=this.cfg.fallbackDelaySec(ai,env);if(delay<=0)return;this.log(` \u23F3 ${ai} \u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8 \u2192 \u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u524D\u306B ${delay}\u79D2 \u5F85\u6A5F\uFF08\u4ED6AI\u3078\u306E\u8EE2\u5AC1\u3092\u6291\u5236\uFF09`);
|
|
69
|
+
const sleep=this.opts.sleep??(ms=>new Promise(r=>setTimeout(r,ms)));await sleep(delay*1e3)}buildPrompt(body,promptPrefix,ai,tried,serverSkills){const expanded=this.expandSkills(body,ai,serverSkills);const parts=[];if(tried.length>0)parts.push(fallbackNote(tried));const charter=this.charter();if(charter!==null)parts.push(charter);if(promptPrefix!==void 0&&promptPrefix!=="")parts.push(promptPrefix);parts.push(expanded);return parts.join("\n\n")}expandSkills(prompt,ai,serverSkills){const skills=serverSkills??
|
|
70
|
+
new Map;const cmd=this.opts.compileCommand;if(ai==="claude"||cmd===void 0||cmd.length===0)return expandServerSkills(prompt,skills);if(skills.size===0)return this.expandForNonClaude(prompt,ai,this.opts.workspace);const overlay=this.opts.skillOverlayDir;if(overlay===void 0||overlay===""){this.log(` \u26A0\uFE0F ${ai} \u5411\u3051\u306E\u30AA\u30FC\u30D0\u30FC\u30EC\u30A4\u306E\u7F6E\u304D\u5834\u6240\u304C\u672A\u8A2D\u5B9A\u306E\u305F\u3081\u3001\u30B5\u30FC\u30D0\u7248\u30B9\u30AD\u30EB\u3092\u4F7F\u308F\u305A\u30D5\u30A1\u30A4\u30EB\u7248\u3067\u5B9F\u884C\u3057\u307E\u3059`);
|
|
71
|
+
return this.expandForNonClaude(prompt,ai,this.opts.workspace)}try{prepareSkillOverlay(overlay,this.opts.workspace,skills,ai)}catch(err){this.log(` \u26A0\uFE0F \u30B5\u30FC\u30D0\u7248\u30B9\u30AD\u30EB\u306E\u30AA\u30FC\u30D0\u30FC\u30EC\u30A4\u3092\u4F5C\u308C\u307E\u305B\u3093\uFF08${err.message}\uFF09\u3002\u30B5\u30FC\u30D0\u7248\u3092\u4F7F\u308F\u305A\u30D5\u30A1\u30A4\u30EB\u7248\u3067\u5B9F\u884C\u3057\u307E\u3059`);return this.expandForNonClaude(prompt,ai,this.opts.workspace)}return this.
|
|
72
|
+
expandForNonClaude(prompt,ai,overlay)}expandForNonClaude(prompt,ai,projectDir){const cmd=this.opts.compileCommand;if(ai==="claude"||cmd===void 0||cmd.length===0)return prompt;const[file,...args]=cmd;if(file===void 0)return prompt;const compileEnv={...this.opts.env??process.env};const resolved=process.platform!=="win32"||isWindowsDriveAbsolute(file)?file:findExecutable(file,{env:compileEnv,platform:"win32"});if(resolved===null)return prompt;const r=spawnSync(resolved,[...args,"--provider",ai,"--p\
|
|
73
|
+
roject-dir",projectDir],{encoding:"utf8",env:{...this.opts.env??process.env,_AI_PROMPT:prompt},timeout:6e4,maxBuffer:32*1024*1024});const out=(r.stdout??"").trim();if(r.error!==void 0||r.status!==0||out===""){this.log(` \u26A0\uFE0F ${ai} \u5411\u3051\u306E\u30B9\u30AD\u30EB\u5C55\u958B\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u672A\u5C55\u958B\u306E\u307E\u307E\u5B9F\u884C\u3057\u307E\u3059\uFF09`);return prompt}return out}charter(){if(this.opts.charterEnabled===false)return null;const server=this.
|
|
74
|
+
opts.serverPrompts?.()??{};const prefix=server.charter_prefix??this.opts.charterPrefix??DEFAULT_CHARTER_PREFIX;const suffix=server.charter_suffix??this.opts.charterSuffix??DEFAULT_CHARTER_SUFFIX;if(server.charter!==void 0){return server.charter===""?null:wrapCharter(prefix,server.charter,suffix)}const file=this.opts.charterFile;if(file===void 0||file.trim()==="")return null;const resolved=path2.isAbsolute(file)?file:path2.resolve(this.opts.workspace,file);let body;try{body=fs2.readFileSync(resolved,
|
|
75
|
+
"utf8")}catch{if(!this.charterWarned){this.charterWarned=true;this.log(` \u26A0\uFE0F\u26A0\uFE0F \u61B2\u7AE0\u3092\u6CE8\u5165\u3067\u304D\u307E\u305B\u3093\uFF08${resolved} \u304C\u8AAD\u3081\u306A\u3044\uFF09\u3002\u4EE5\u5F8C\u306E\u5B9F\u884C\u306F\u61B2\u7AE0\u306A\u3057\u3067\u9032\u307F\u307E\u3059`);this.log(" \u30D5\u30A1\u30A4\u30EB\u306E\u79FB\u52D5\u30FB\u6539\u540D\u30FB\u6A29\u9650\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8A2D\u5B9A: charter_file / CHARTER_FILE\uFF09")}
|
|
76
|
+
return null}return wrapCharter(prefix,body,suffix)}preflightOk(){const env=this.opts.env??process.env;if((env.PREFLIGHT_ENABLED??"true")!=="true")return true;const hosts=this.opts.preflightHosts??DEFAULT_PREFLIGHT_HOSTS;if(hosts.length===0)return true;const timeout=Number.parseInt(env.PREFLIGHT_TIMEOUT??"",10);const sec=Number.isInteger(timeout)&&timeout>0?timeout:5;for(let attempt=0;attempt<2;attempt+=1){if(attempt>0)sleepSync(2e3);for(const host of hosts){const nul=process.platform==="win32"?"\
|
|
77
|
+
NUL":"/dev/null";const curl=process.platform==="win32"?system32(process.env,"curl.exe"):"curl";if(curl===null)return false;const r=spawnSync(curl,["-sS","--max-time",String(sec),"-o",nul,`https://${host}/`],{encoding:"utf8",timeout:(sec+5)*1e3});if(r.error===void 0&&r.status===0)return true}}return false}};var DETECT_CACHE_MS=1800*1e3;var DEFAULT_PREFLIGHT_HOSTS=["api.anthropic.com","github.com"];function fallbackNote(tried){return["\u3010\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u5B9F\u884C\u306B\u3064\u3044\u3066\u306E\u6CE8\u610F\u3011",
|
|
78
|
+
`\u3053\u306E\u30BF\u30B9\u30AF\u306F\u5225\u306EAI\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\uFF08${tried.join(", ")}\uFF09\u304C\u5148\u306B\u8A66\u884C\u3057\u307E\u3057\u305F\u304C\u3001\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u3001\u8A8D\u8A3C\u30A8\u30E9\u30FC\u3001\u307E\u305F\u306F\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u306B\u3088\u308A\u5B8C\u4E86\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002`,"\u524D\u306EAI\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u304C\u30BF\u30B9\u30AF\u306E\u9014\u4E2D\u307E\u3067\u4F5C\u696D\u3092\u9032\u3081\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u7279\u306B\u4EE5\u4E0B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044:",
|
|
79
|
+
"- TWP\u30BF\u30B9\u30AF\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u300C\u9032\u884C\u4E2D\u300D\u306B\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u304B\uFF08\u5909\u66F4\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u305D\u306E\u307E\u307E\u7D99\u7D9A\uFF09","- \u30B3\u30E1\u30F3\u30C8\u304C\u9014\u4E2D\u307E\u3067\u6295\u7A3F\u3055\u308C\u3066\u3044\u306A\u3044\u304B","- \u30D6\u30E9\u30F3\u30C1\u3084PR\u304C\u4F5C\u6210\u9014\u4E2D\u3067\u306A\u3044\u304B","\u307E\u305A\u73FE\u72B6\u3092\u78BA\u8A8D\u3057\u3066\u304B\u3089\u3001\u4E2D\u65AD\u3055\u308C\u305F\u7B87\u6240\u304B\u3089\u4F5C\u696D\u3092\u518D\u958B\u3057\u3066\u304F\
|
|
80
|
+
\u3060\u3055\u3044\u3002"].join("\n")}export{DEFAULT_CHARTER_PREFIX,DEFAULT_CHARTER_SUFFIX,DEFAULT_PREFLIGHT_HOSTS,DispatchEngine};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{DEPARTMENT_FLAG,FROM_FLAG,MANHOUR_DESCRIPTION,MANHOUR_FROM_FLAG,MANHOUR_TO_FLAG,MONTH_FLAG,TO_FLAG,USER_FLAG,analysisDomain,analysisForbidden,currentMonth,dataOf,levelGuidance,listIn,manhourNotes,manhourQuery,manhourRows,monthColumns,monthRange,monthsBetween,noArgs,periodNote,profitRows,rangeNotes,recordOf,resolveFilters,resolvedOrUndefined,responseMonths,staffKpiRows,workloadDistributionNotes,workloadDistributionRows}from"./chunk-NLDVB4PZ.js";import"./chunk-Y7GYWZLW.js";import"./chunk-UVCJXHWN.js";
|
|
4
|
+
import"./chunk-EXT4AIDF.js";import"./chunk-KW37N7IO.js";import"./chunk-RX5HWI4L.js";import"./chunk-JJSBBWJ5.js";import"./chunk-IWYJSQ5I.js";import"./chunk-W4NLJ2YK.js";import"./chunk-2T23XGJF.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";import"./chunk-MI6HVYR2.js";import"./chunk-II5RVJQN.js";import"./chunk-PS5QFKHB.js";import"./chunk-3ZRMMBP5.js";
|
|
5
|
+
import"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{DEPARTMENT_FLAG,FROM_FLAG,MANHOUR_DESCRIPTION,MANHOUR_FROM_FLAG,MANHOUR_TO_FLAG,MONTH_FLAG,TO_FLAG,USER_FLAG,analysisDomain,analysisForbidden,currentMonth,dataOf,levelGuidance,listIn,manhourNotes,manhourQuery,manhourRows,monthColumns,monthRange,monthsBetween,noArgs,periodNote,profitRows,rangeNotes,recordOf,resolveFilters,resolvedOrUndefined,responseMonths,staffKpiRows,workloadDistributionNotes,workloadDistributionRows};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{composeDocument,htmlToText,metaLine}from"./chunk-C7MO3RHJ.js";import{boundedText}from"./chunk-JJSBBWJ5.js";import{readBody}from"./chunk-IWYJSQ5I.js";import"./chunk-W4NLJ2YK.js";import{ANNOUNCEMENTS_PATH}from"./chunk-
|
|
3
|
+
import{composeDocument,htmlToText,metaLine}from"./chunk-C7MO3RHJ.js";import{boundedText}from"./chunk-JJSBBWJ5.js";import{readBody}from"./chunk-IWYJSQ5I.js";import"./chunk-W4NLJ2YK.js";import{ANNOUNCEMENTS_PATH}from"./chunk-2T23XGJF.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,positiveInteger}from"./chunk-MI6HVYR2.js";
|
|
4
4
|
import"./chunk-II5RVJQN.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var LABEL="\u304A\u77E5\u3089\u305B";var LIST_COLUMNS=["id","publish_start_at","sender_name","category_name","title","is_read","require_confirmation","is_confirmed"];var UNCONFIRMED_COLUMNS=["id","publish_start_at","publish_end_at","importance","title"];var GET_COLUMNS=["id","title","sender_name","category_name","importance_name","publish_start_at","publish_end_at","is_organization","is_read","require_confirmation","is_confirmed","allow_replies","link_url"];var REPLY_COLUMNS=["id","created_at","\
|
|
5
5
|
user_name","is_mine","content"];var REPLY_MAX_CHARS=2e3;function noArgs(input,op){if(input.args.length>0){throw new UsageError(`${op} \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,`twp announcement ${op} help`)}}function checkId(raw,help){const id=raw.trim();if(id==="")throw new UsageError("\u304A\u77E5\u3089\u305B\u306E ID \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",help);if(!isSafePathSegment(id)){throw new UsageError(`\u304A\u77E5\u3089\u305B\u306E ID \u3068\u3057\u3066\u4F7F\u3048\u306A\u3044\
|
|
6
6
|
\u5024\u3067\u3059: ${id}`,"\u304A\u77E5\u3089\u305B\u306E ID \u306F twp announcement list \u306E id \u5217\u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002")}return id}function announcementId(input,op){const help=`twp announcement ${op} help`;const[raw,...rest]=input.args;if(rest.length>0)throw new UsageError(`${op} \u304C\u53D7\u3051\u53D6\u308C\u308B\u304A\u77E5\u3089\u305B ID \u306F1\u3064\u3060\u3051\u3067\u3059: ${rest.join(" ")}`,help);return checkId(raw??"",help)}function announcementIds(input){
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{CommandModelMissingError,MAX_REPORTED_VIOLATIONS,loadCommandModelDomain,loadCommandModelRoutes,validateBody,validateQuery}from"./chunk-NZ7WI4RZ.js";import{exitCodeFor,fetchAllPages,reportError}from"./chunk-
|
|
4
|
-
import{parseOperationArgs,repeatedValues}from"./chunk-RX5HWI4L.js";import{readBody}from"./chunk-IWYJSQ5I.js";import{ALLOW_REDACTED_FLAG,NO_REDACT_FLAG,NO_REDACT_NOTICE}from"./chunk-W4NLJ2YK.js";import"./chunk-
|
|
3
|
+
import{CommandModelMissingError,MAX_REPORTED_VIOLATIONS,loadCommandModelDomain,loadCommandModelRoutes,validateBody,validateQuery}from"./chunk-NZ7WI4RZ.js";import{exitCodeFor,fetchAllPages,reportError}from"./chunk-JA7DLMKJ.js";import"./chunk-DG7JPFYK.js";import{renderOutput}from"./chunk-SZOEBJGI.js";import"./chunk-Q3B65OFC.js";import{evaluateQuery}from"./chunk-GFLGXGWE.js";import{describeWaitResult,parseWaitOptions,waitUntilTerminal}from"./chunk-WVCEKC7V.js";
|
|
4
|
+
import{parseOperationArgs,repeatedValues}from"./chunk-RX5HWI4L.js";import{readBody}from"./chunk-IWYJSQ5I.js";import{ALLOW_REDACTED_FLAG,NO_REDACT_FLAG,NO_REDACT_NOTICE}from"./chunk-W4NLJ2YK.js";import"./chunk-2T23XGJF.js";import"./chunk-HVZUXLQ4.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import{redactSecretValues,redactSecrets,withDebug}from"./chunk-IXT2X5BZ.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,
|
|
5
5
|
envelopePaging,isPageNumberEnvelope,pageRangeNotes,positiveInteger,readEnvelopeCursor,readPageNumberCursor,shellQuote}from"./chunk-MI6HVYR2.js";import"./chunk-II5RVJQN.js";import"./chunk-3ZRMMBP5.js";import{ApiResponseError,EXIT_OK,EXIT_WAIT_TIMEOUT,NetworkError,UsageError}from"./chunk-VFPY2A23.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-PECIBNFD.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";
|
|
6
|
-
import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import{HELP_TOKEN}from"./chunk-
|
|
6
|
+
import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import{HELP_TOKEN}from"./chunk-JF2GCXNQ.js";import"./chunk-QQRJLH6B.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-74BPZOKU.js";import"./chunk-UREA4ZIG.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MIN_SEGMENT_CHARS=3;var parsedCache=new WeakMap;function splitSegments(path){return path.split("/").filter(segment=>segment!=="")}function parseRoutes(routes){const cached=parsedCache.get(routes);if(cached!==void 0)return cached;const parsed=[];for(const[key,domain]of Object.entries(routes.routes)){const space=key.indexOf(" ");if(space<=0)continue;const template=key.slice(space+1);parsed.push({method:key.slice(0,space),template,domain,segments:splitSegments(template).map(segment=>/^\{[^/{}]+\}$/.
|
|
7
7
|
test(segment)?null:segment)})}parsedCache.set(routes,parsed);return parsed}function matches(route,segments){if(route.segments.length!==segments.length)return false;return route.segments.every((literal,i)=>literal===null||literal===segments[i])}function compareSpecificity(a,b){const literals=route=>route.segments.filter(segment=>segment!==null).length;const diff=literals(b)-literals(a);if(diff!==0)return diff;for(let i=0;i<a.segments.length;i+=1){const aLiteral=a.segments[i]!==null;const bLiteral=b.
|
|
8
8
|
segments[i]!==null;if(aLiteral!==bLiteral)return aLiteral?-1:1}return 0}function lookupRoute(routes,method,path){const segments=splitSegments(path);const hits=parseRoutes(routes).filter(route=>matches(route,segments));const sameMethod=hits.filter(route=>route.method===method).sort(compareSpecificity);const best=sameMethod[0];if(best!==void 0)return{kind:"matched",domain:best.domain,template:best.template};if(hits.length>0){const[top]=[...hits].sort(compareSpecificity);const template=top.template;
|
|
9
9
|
const methods=[...new Set(hits.filter(route=>route.template===template).map(route=>route.method))].sort();return{kind:"method-mismatch",template,methods}}return{kind:"unknown"}}function pickOperation(operations,method,template){return operations.find(op=>op.method===method&&op.path===template)??null}async function suggestRoutes(routes,path,limit=5){const{default:fuzzysort}=await import("./fuzzysort-DFVKV4B4.js");const parsed=parseRoutes(routes);const templates=[...new Set(parsed.map(route=>route.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
3
|
import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,describeAuditLog,describeToolCatalog,displayCwd,executeTool,findProjectTwpSubdir,localTools,lstatOrNull,parseFrontMatter,parseRule,persistProjectAllow,projectPermissionsPath,projectRootFor,readFileTool,residentInputs,resolveGitExecutable,runTurn,secretReason}from"./chunk-4DUZIRGL.js";import"./chunk-NZ7WI4RZ.js";import{buildDiffLines,
|
|
4
|
-
diffStat}from"./chunk-VRBI2NPI.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import"./chunk-N2UVRM3Z.js";import"./chunk-
|
|
5
|
-
import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-XNLIEUAW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-EDF4U5BT.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.js";import{parseArgv}from"./chunk-
|
|
6
|
-
nextMode}from"./chunk-2LOT54OO.js";import"./chunk-
|
|
4
|
+
diffStat}from"./chunk-VRBI2NPI.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import"./chunk-N2UVRM3Z.js";import"./chunk-2T23XGJF.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";import"./chunk-II5RVJQN.js";import"./chunk-VFPY2A23.js";import{RelayError,builtinCatalog,classifyModelSwitch,createRuntime,loadCachedCatalog,modelLabel,pickModel,specFor,toModelInfos}from"./chunk-LLBLGHHZ.js";
|
|
5
|
+
import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-XNLIEUAW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-EDF4U5BT.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.js";import{parseArgv}from"./chunk-5PBNMFNO.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,
|
|
6
|
+
nextMode}from"./chunk-2LOT54OO.js";import"./chunk-JF2GCXNQ.js";import"./chunk-EOXTDZTA.js";import"./chunk-QQRJLH6B.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-UREA4ZIG.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";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.
|
|
7
7
|
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]||
|
|
8
8
|
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=
|
|
9
9
|
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){
|
|
@@ -1212,7 +1212,7 @@ cwd()){const listed=await gitListFiles(cwd2);const raw=listed??await walkFiles(c
|
|
|
1212
1212
|
1;const after=/^[^\s]*/.exec(text.slice(cursor))?.[0]??"";return{query,start,end:cursor+after.length}}var TWP_SLASH_ROUTES={"/tasks":{domain:"task",operation:"list"},"/task":{domain:"task",operation:"get"},"/projects":{domain:"project",operation:"list"}};function isTwpSlashCommand(name){return Object.hasOwn(TWP_SLASH_ROUTES,name)}async function runTwpSlashCommand(name,args,deps){const route=TWP_SLASH_ROUTES[name];if(!Object.hasOwn(TWP_SLASH_ROUTES,name)||route===void 0){return{code:2,out:"",err:`\u4E0D\u660E\u306A\u30B3\u30DE\u30F3\u30C9: ${name}
|
|
1213
1213
|
`}}const parsed=parseArgv([route.domain,route.operation,...args]);if(parsed.command!=="domain"||parsed.domain!==route.domain){return{code:2,out:"",err:`${name}: \u3053\u306E\u5F15\u6570\u306F\u4F7F\u3048\u307E\u305B\u3093\uFF08${args.join(" ")}\uFF09
|
|
1214
1214
|
`}}if(parsed.unknown.length>0){return{code:2,out:"",err:`\u4E0D\u660E\u306A\u5F15\u6570: ${parsed.unknown.join(" ")}
|
|
1215
|
-
`}}let out="";let err="";const io={out:text=>void(out+=text),err:text=>void(err+=text),isTty:true};const globals={profile:parsed.profile??deps.profile,...parsed.output!==void 0?{output:parsed.output}:{},...parsed.query!==void 0?{query:parsed.query}:{},dryRun:parsed.dryRun,debug:parsed.debug,yes:parsed.yes,refresh:parsed.refresh};const{runDomain}=await import("./run-
|
|
1215
|
+
`}}let out="";let err="";const io={out:text=>void(out+=text),err:text=>void(err+=text),isTty:true};const globals={profile:parsed.profile??deps.profile,...parsed.output!==void 0?{output:parsed.output}:{},...parsed.query!==void 0?{query:parsed.query}:{},dryRun:parsed.dryRun,debug:parsed.debug,yes:parsed.yes,refresh:parsed.refresh};const{runDomain}=await import("./run-VNV2AVDI.js");try{const code=await runDomain({domain:route.domain,...parsed.operation!==void 0?{operation:parsed.operation}:
|
|
1216
1216
|
{},argv:parsed.domainArgv,help:parsed.domainHelp,globals,version:deps.version,io,...deps.fetchImpl!==void 0?{fetchImpl:deps.fetchImpl}:{}});return{code,out,err}}catch(e){return{code:1,out,err:`${err}${e.message}
|
|
1217
1217
|
`}}}var GIT_LOG_OUTPUT=["9f3c1a2 feat(ui): \u4E00\u89A7\u306E\u30D5\u30A3\u30EB\u30BF\u3092 URL \u30AF\u30A8\u30EA\u3068\u540C\u671F\u3059\u308B","4b8e0d7 fix(ui): \u4EEE\u60F3\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u884C\u9AD8\u3055\u3092\u5B9F\u6E2C\u5024\u306B\u5408\u308F\u305B\u308B","c15a99e refactor(api): \u4E00\u89A7\u53D6\u5F97\u306E\u30DA\u30FC\u30B8\u30F3\u30B0\u51E6\u7406\u3092\u5171\u901A\u5316\u3059\u308B","2d70f4b test: \u4E00\u89A7\u30D5\u30A3\u30EB\u30BF\u306E\u56DE\u5E30\u30C6\u30B9\u30C8\u3092\u8FFD\u52A0\u3059\u308B",
|
|
1218
1218
|
"a6e2b38 fix(api): \u7A7A\u306E\u691C\u7D22\u6761\u4EF6\u3067\u5168\u4EF6\u8FD4\u3089\u306A\u3044\u3088\u3046\u306B\u3059\u308B","7c40d51 chore(deps): \u958B\u767A\u4F9D\u5B58\u3092\u6700\u65B0\u3078\u66F4\u65B0\u3059\u308B","e83b1c6 docs: \u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u624B\u9806\u306B Node 22 \u306E\u524D\u63D0\u3092\u8FFD\u8A18\u3059\u308B","b91f7a4 fix(ui): \u30E2\u30FC\u30C0\u30EB\u306E\u91CD\u306A\u308A\u9806\u3092\u6307\u5B9A\u3059\u308B","5a2c8e0 perf(api): \u4E00\u89A7\u306E N+1 \u3092\u89E3\u6D88\u3059\u308B",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{PUNCH_TYPES,assertMonthOpen,attendanceDomain}from"./chunk-
|
|
4
|
-
import"./chunk-MI6HVYR2.js";import"./chunk-II5RVJQN.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiRejectedError,ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var CREATE_USAGE="twp attendance record create --date <YYYY-MM-DD> --time <HH:MM> --type <clock-in|clock-out|break-start|break-end|switch> [--project <\u30B3\u30FC\u30C9|ID>] [--task <\u30BF\u30B9\u30AFID>] [--memo <\u30E1\u30E2>]";var UPDATE_USAGE="twp attendance record update <\u8A18\u9332ID> --memo <\u30E1\u30E2> [--month <YYYY-MM>]";var DELETE_USAGE="twp attendance record delete <\u8A18\u9332ID> --reason <\u7406\u7531> --yes [--month <YYYY-MM>]";var MOVE_USAGE="twp attendance record move <\u8A18\u9332\
|
|
3
|
+
import{PUNCH_TYPES,assertMonthOpen,attendanceDomain}from"./chunk-Y7GYWZLW.js";import"./chunk-UVCJXHWN.js";import{dateFlag,monthFlag}from"./chunk-EXT4AIDF.js";import"./chunk-KW37N7IO.js";import"./chunk-RX5HWI4L.js";import"./chunk-JJSBBWJ5.js";import"./chunk-IWYJSQ5I.js";import"./chunk-W4NLJ2YK.js";import"./chunk-2T23XGJF.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";
|
|
4
|
+
import"./chunk-IXT2X5BZ.js";import"./chunk-MI6HVYR2.js";import"./chunk-II5RVJQN.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiRejectedError,ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var CREATE_USAGE="twp attendance record create --date <YYYY-MM-DD> --time <HH:MM> --type <clock-in|clock-out|break-start|break-end|switch> [--project <\u30B3\u30FC\u30C9|ID>] [--task <\u30BF\u30B9\u30AFID>] [--memo <\u30E1\u30E2>]";var UPDATE_USAGE="twp attendance record update <\u8A18\u9332ID> --memo <\u30E1\u30E2> [--month <YYYY-MM>]";var DELETE_USAGE="twp attendance record delete <\u8A18\u9332ID> --reason <\u7406\u7531> --yes [--month <YYYY-MM>]";var MOVE_USAGE="twp attendance record move <\u8A18\u9332\
|
|
5
5
|
ID> --project <\u30B3\u30FC\u30C9|ID> [--month <YYYY-MM>]";var TEXT_MAX=500;var UUID_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;var TIME_PATTERN=/^(\d{2}):(\d{2})(?::(\d{2}))?$/;var CLOSED_REASON="\u30B5\u30FC\u30D0\u306F\u7DE0\u3081\u6E08\u307F\u306E\u6708\u3078\u306E\u4FEE\u6B63\u3092\u62D2\u5426\u305B\u305A\u7DE0\u3081\u306E\u96C6\u8A08\u3092\u6D17\u3044\u66FF\u3048\u308B\u306E\u3067\u3001CLI \u304C\u9001\u308B\u524D\u306B\u6B62\u3081\u3066\u3044\u307E\u3059\u3002";
|
|
6
6
|
var FORBIDDEN="\u81EA\u5206\u306E\u6253\u523B\u306E\u4FEE\u6B63\u306B\u306F\u6253\u523B\u4FEE\u6B63\u306E\u6A29\u9650\uFF08\u30E6\u30FC\u30B6\u30FC\u8A2D\u5B9A\u306E\u300C\u6253\u523B\u4FEE\u6B63\u300D\uFF09\u3068\u52E4\u6020\u306E\u5229\u7528\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u306E\u7BA1\u7406\u8005\u306B\u4ED8\u4E0E\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044";var RECORD_COLUMNS=["id","type","type_label","recorded_at","year_month","project_id","t\
|
|
7
7
|
ask_id","memo","is_manual","deleted_at"];var LABELS={clock_in:"\u51FA\u52E4",clock_out:"\u9000\u52E4",break_start:"\u4F11\u61A9\u958B\u59CB",break_end:"\u4F11\u61A9\u7D42\u4E86",switch:"\u5207\u66FF"};var TYPE_ORDER={break_start:1,break_end:2,switch:3,clock_out:4,clock_in:5};function zonedParts(epochMs,timeZone){const parts=new Intl.DateTimeFormat("en-US",{timeZone,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}).formatToParts(new Date(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{hoursMinutes}from"./chunk-
|
|
4
|
-
import"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MONTH_FLAG={name:"--month",summary:"\u5BFE\u8C61\u306E\u5E74\u6708\uFF08YYYY-MM\uFF09",takesValue:true,placeholder:"<YYYY-MM>"};var ME_FLAG={name:"--me",summary:"\u81EA\u5206\u306E\u5206\u3060\u3051\u3092\u8868\u793A\u3059\u308B\uFF08\u7121\u3051\u308C\u3070\u5168\u54E1\u5206\u30FB\u7BA1\u7406\u8005\uFF09",takesValue:false};var FORBIDDEN_ADMIN="\u6A29\u9650\u304C\u8DB3\u308A\u307E\u305B\u3093\u3002\u5168\u54E1\u5206\uFF08--me \u306A\u3057\uFF09\u306F\u52E4\u6020\u306E\u7BA1\u7406\u8005\u6A29\u9650\uFF08\u52E4\u6020: \u7BA1\u7406\u8005\uFF09\u3001\u81EA\u5206\u306E\u5206\uFF08--me\uFF09\u306F\u52E4\u6020\u306E\u5229\u7528\u6A29\u9650\u304C\u8981\u308A\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u306E\u7BA1\u7406\u8005\u306B\u6A29\u9650\u306E\u4ED8\u4E0E\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044";
|
|
3
|
+
import{hoursMinutes}from"./chunk-Y7GYWZLW.js";import"./chunk-UVCJXHWN.js";import{monthFlag}from"./chunk-EXT4AIDF.js";import"./chunk-KW37N7IO.js";import"./chunk-RX5HWI4L.js";import"./chunk-JJSBBWJ5.js";import"./chunk-IWYJSQ5I.js";import"./chunk-W4NLJ2YK.js";import"./chunk-2T23XGJF.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";import"./chunk-MI6HVYR2.js";
|
|
4
|
+
import"./chunk-II5RVJQN.js";import"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MONTH_FLAG={name:"--month",summary:"\u5BFE\u8C61\u306E\u5E74\u6708\uFF08YYYY-MM\uFF09",takesValue:true,placeholder:"<YYYY-MM>"};var ME_FLAG={name:"--me",summary:"\u81EA\u5206\u306E\u5206\u3060\u3051\u3092\u8868\u793A\u3059\u308B\uFF08\u7121\u3051\u308C\u3070\u5168\u54E1\u5206\u30FB\u7BA1\u7406\u8005\uFF09",takesValue:false};var FORBIDDEN_ADMIN="\u6A29\u9650\u304C\u8DB3\u308A\u307E\u305B\u3093\u3002\u5168\u54E1\u5206\uFF08--me \u306A\u3057\uFF09\u306F\u52E4\u6020\u306E\u7BA1\u7406\u8005\u6A29\u9650\uFF08\u52E4\u6020: \u7BA1\u7406\u8005\uFF09\u3001\u81EA\u5206\u306E\u5206\uFF08--me\uFF09\u306F\u52E4\u6020\u306E\u5229\u7528\u6A29\u9650\u304C\u8981\u308A\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u306E\u7BA1\u7406\u8005\u306B\u6A29\u9650\u306E\u4ED8\u4E0E\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044";
|
|
5
5
|
function listBody(spec,body){if(!isRecord(body)||!Array.isArray(body[spec.key])){throw new ApiResponseError(`${spec.label}\u306E\u5FDC\u7B54\u306B ${spec.key} \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return body}function monthListOperation(spec){const usage=`twp ${spec.domain} list [--month <YYYY-MM>] [--me]`;return{name:"list",summary:`\u6708\u306E${spec.label}\u3092\u4E00\u89A7\u3059\u308B\uFF08--me \u3067\u81EA\u5206\u306E\u5206\u30FB\u7121\u3051\u308C\u3070\u5168\u54E1\u5206\uFF1D\u7BA1\u7406\u8005\uFF09`,
|
|
6
6
|
usage,description:`GET ${spec.path} \u3092\u8868\u793A\u3057\u307E\u3059\uFF08\u5168\u54E1\u5206\u30FB\u52E4\u6020\u306E\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\uFF09\u3002--me \u3092\u4ED8\u3051\u308B\u3068 GET ${spec.path}/me\uFF08\u81EA\u5206\u306E\u5206\uFF09\u3067\u3059\u3002
|
|
7
7
|
--month \u304C\u7121\u3051\u308C\u3070\u4ECA\u6708\u3067\u3059\uFF08\u30C6\u30CA\u30F3\u30C8\u306E\u696D\u52D9\u65E5\u306E\u533A\u5207\u308A\u3067\u30B5\u30FC\u30D0\u304C\u6C7A\u3081\u307E\u3059\uFF09\u3002
|