@tocca-systems/twp-cli 0.65.0 → 0.67.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 +16 -0
- package/README.md +50 -4
- package/command-model/wiki.json +2 -2
- package/dist/agent-SFX3ZVOB.js +160 -0
- package/dist/{agent-loop-VC47FGPR.js → agent-loop-6JO4PJRG.js} +23 -20
- package/dist/{ai-dispatch-GN5ZQPHC.js → ai-dispatch-YICIA4NI.js} +3 -3
- package/dist/{analysis-NEZXCJGT.js → analysis-HMOECNWG.js} +2 -2
- package/dist/{announcement-BEPIDOMO.js → announcement-Q642UMYK.js} +1 -1
- package/dist/{api-command-HP3ABNDG.js → api-command-WIMCS3VI.js} +4 -4
- package/dist/{app-C4TUNEAO.js → app-5FFWVAGQ.js} +3 -3
- package/dist/{attendance-correct-ZEWRXHUU.js → attendance-correct-DWVFYL2Y.js} +1 -1
- package/dist/{attendance-lists-BXAHFZYY.js → attendance-lists-772Y3ZWA.js} +1 -1
- package/dist/{backlog-UD226SVD.js → backlog-FG3Y5JTE.js} +1 -1
- package/dist/{budget-6HOZNG3E.js → budget-5RPOQZN7.js} +36 -17
- package/dist/{capacity-report-command-A6RYG2NV.js → capacity-report-command-PBE73I43.js} +1 -1
- package/dist/chunk-2OG4LAGD.js +41 -0
- package/dist/{chunk-2G6ZZPME.js → chunk-3EATJTPN.js} +2 -2
- package/dist/chunk-53D2WQQO.js +11 -0
- package/dist/{chunk-T4QZO6RQ.js → chunk-5SONMN6K.js} +1 -1
- package/dist/chunk-6CS5L24D.js +4 -0
- package/dist/chunk-6PAZUW73.js +16 -0
- package/dist/{chunk-ZJW3GBE5.js → chunk-7EJOKJLV.js} +1 -1
- package/dist/{chunk-3WFZOOXZ.js → chunk-AGI5KT4C.js} +1 -1
- package/dist/{chunk-5AQ2JPIS.js → chunk-APPYZQNC.js} +1 -1
- package/dist/{chunk-BTN4M7Y5.js → chunk-CCBNU5Y3.js} +2 -2
- package/dist/{chunk-AYE4DF6J.js → chunk-DAOC7VRM.js} +1 -1
- package/dist/{chunk-G26GIBRL.js → chunk-F4PGPJOI.js} +1 -1
- package/dist/{chunk-AEJHDFXB.js → chunk-FABDZBDZ.js} +5 -5
- package/dist/{chunk-FBBKRVVS.js → chunk-GLKZ4ZZY.js} +1 -1
- package/dist/{worker-agent-OBYRYPLC.js → chunk-HBEOI456.js} +3 -3
- package/dist/{chunk-ZSPWHEBL.js → chunk-HNG6MF26.js} +13 -13
- package/dist/{chunk-QSXS5SB2.js → chunk-HPPIVCK3.js} +3 -2
- package/dist/chunk-KDH3KWPO.js +4 -0
- package/dist/{chunk-CGHGQAEM.js → chunk-LJVAOWZI.js} +17 -16
- package/dist/{chunk-XNOZJ6T2.js → chunk-NVMJXFBT.js} +1 -1
- package/dist/{chunk-WHCMWXLC.js → chunk-OMWCSE4P.js} +2 -2
- package/dist/{chunk-ENVASCZU.js → chunk-P2DSHLHD.js} +2 -2
- package/dist/{chunk-UUP4X3WH.js → chunk-P6M2MCZJ.js} +18 -18
- package/dist/{chunk-FTAKYID7.js → chunk-QJAZLPA3.js} +1 -1
- package/dist/chunk-VIWQMDGG.js +91 -0
- package/dist/{chunk-BXTAAF5F.js → chunk-W2AIT5FJ.js} +5 -5
- package/dist/{chunk-Z2I5BGXV.js → chunk-WBUYPDJH.js} +1 -1
- package/dist/{chunk-G6RLNOIZ.js → chunk-WMEGP2BT.js} +1 -1
- package/dist/{chunk-RSATLT5H.js → chunk-X6L5LUC4.js} +1 -1
- package/dist/{chunk-Y2J4M2MG.js → chunk-XCPZ4R65.js} +1 -1
- package/dist/{chunk-SCU74Z4U.js → chunk-XGYOJHZC.js} +1 -1
- package/dist/cli.js +39 -12
- package/dist/{commands-EK3EYLQH.js → commands-4C6TJ4WG.js} +1 -1
- package/dist/{commands-2FOGOL65.js → commands-62NWF7GA.js} +22 -20
- package/dist/{company-MUGKJNY3.js → company-4DHVAW25.js} +2 -2
- package/dist/{completion-DGPGHQNL.js → completion-WR2GXZE7.js} +5 -5
- package/dist/{contract-DJJQBAWX.js → contract-PT7VW4IE.js} +2 -2
- package/dist/{department-RMZ72N6B.js → department-C6WIZPBS.js} +1 -1
- package/dist/{deposit-45Y3POXT.js → deposit-OEYFPEZG.js} +1 -1
- package/dist/{estimate-HTAF6FZT.js → estimate-4BUJQ3TP.js} +3 -3
- package/dist/{evaluation-J634U7JQ.js → evaluation-GLXQ54F6.js} +1 -1
- package/dist/{expense-EVNQ653C.js → expense-QE3WIJTN.js} +1 -1
- package/dist/{fiscal-year-MVOGDAIP.js → fiscal-year-YJWFQN4P.js} +1 -1
- package/dist/{inquiry-XO5R47OO.js → inquiry-ORB3ROAJ.js} +1 -1
- package/dist/{invoice-WE2SOMYN.js → invoice-XLX5KS2T.js} +2 -2
- package/dist/{job-title-3CGRQILF.js → job-title-UDF6I3BP.js} +1 -1
- package/dist/{knowledge-X3FGXIBL.js → knowledge-4QPIGJEE.js} +32 -27
- package/dist/{leave-IFYBLQBF.js → leave-3BJMXI7Q.js} +2 -2
- package/dist/license-OMIZUUTW.js +56 -0
- package/dist/{logout-guard-S2PVXK4V.js → logout-guard-2Y7HPIKN.js} +2 -1
- package/dist/{media-X32Y2MOY.js → media-TWRO65NT.js} +3 -3
- package/dist/{notification-MHYSQKYZ.js → notification-2IESSY5E.js} +1 -1
- package/dist/{oneshot-VL45DNR7.js → oneshot-4XO5HIJR.js} +1 -1
- package/dist/{outlook-YG7GFF44.js → outlook-KYTXHDAV.js} +1 -1
- package/dist/plan-submit-T5KHXNGH.js +4 -0
- package/dist/{position-6UC7X2BJ.js → position-CR6P4WC5.js} +1 -1
- package/dist/{project-LG47ZCEZ.js → project-JJEMEO2W.js} +1 -1
- package/dist/{prospect-FEU3WQYN.js → prospect-QG6X7ALK.js} +2 -2
- package/dist/{purchase-44B2NOOB.js → purchase-Z6ENEOZM.js} +3 -3
- package/dist/{receivable-NQNZ2B6B.js → receivable-ZBDXXMHX.js} +1 -1
- package/dist/{redmine-T3JDIH37.js → redmine-EIFHMLNE.js} +1 -1
- package/dist/{registry-LBL4AOZW.js → registry-WBDRVEUW.js} +1 -1
- package/dist/{report-GJK2YXVO.js → report-TTXGXSR3.js} +1 -1
- package/dist/revision-command-PM7FQUVF.js +31 -0
- package/dist/{run-RLV6W5JA.js → run-XZUJWTTZ.js} +2 -2
- package/dist/{sales-ai-review-PUJCOMP6.js → sales-ai-review-6TDJFHDL.js} +1 -1
- package/dist/{sales-master-GRR4WKLO.js → sales-master-H5HMVBJV.js} +2 -2
- package/dist/{sales-numbering-IUYAABSM.js → sales-numbering-Q5KRM63Y.js} +1 -1
- package/dist/{schedule-command-ZX5WNSAC.js → schedule-command-2HCOGYJW.js} +1 -1
- package/dist/{search-N5UE5CUL.js → search-GRAWP2LX.js} +1 -1
- package/dist/{segment-FQHY6DVH.js → segment-YOUY4PZC.js} +1 -1
- package/dist/server-settings-LJBDUOTV.js +4 -0
- package/dist/{setup-PF2VH2TW.js → setup-HHPKB6N4.js} +3 -3
- package/dist/{skill-PWCJCIQO.js → skill-RH5MBRXZ.js} +1 -1
- package/dist/{supplier-payment-HTENSEXJ.js → supplier-payment-EJTFKAKY.js} +2 -2
- package/dist/{support-DOWAY63P.js → support-FR3KY63E.js} +1 -1
- package/dist/{task-OMYFPWQZ.js → task-O7K6725Y.js} +2 -2
- package/dist/{teams-AUFHZRDH.js → teams-QRVCFJS4.js} +1 -1
- package/dist/{user-C7UKUPGT.js → user-PRGHG3HM.js} +15 -103
- package/dist/{user-contract-type-DO576EHJ.js → user-contract-type-K7CLKCEE.js} +1 -1
- package/dist/worker-agent-WDYZTQ5C.js +4 -0
- package/dist/{workflow-C2BEVHQ2.js → workflow-S25JXGWN.js} +1 -1
- package/package.json +1 -1
- package/dist/agent-HM4FHCJT.js +0 -100
- package/dist/chunk-UODNIEO2.js +0 -15
- package/dist/chunk-WG6NCT4L.js +0 -37
- package/dist/chunk-YASL34FY.js +0 -11
- package/dist/chunk-YYURQG4E.js +0 -4
- package/dist/plan-submit-CUVVYDTN.js +0 -4
- package/dist/server-settings-77MPN3UN.js +0 -3
package/CHANGELOG.public.md
CHANGED
|
@@ -11,6 +11,22 @@
|
|
|
11
11
|
`CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
|
|
12
12
|
-->
|
|
13
13
|
|
|
14
|
+
## 0.67.0
|
|
15
|
+
|
|
16
|
+
予実管理の部署按分に期間(開始月・終了月)を指定できるようになりました(`twp budget allocation set --file`)。`twp budget allocation list` で期間ごとの按分を確認できます。按分は全件置き換えなので、期間を残すときは `twp budget allocation list --output json` の結果を直して送り直してください。
|
|
17
|
+
|
|
18
|
+
## 0.66.0
|
|
19
|
+
|
|
20
|
+
シートライセンスの棚卸を CLI からできるようになりました(`twp license list` / `twp license assignments`)。機能ごとの枠・使用数と、割り当てた人の所属・最終ログインを一覧し、失効済みや権限が「なし」の人に割当が残っていないかを確認できます。組織管理者の権限が要ります。
|
|
21
|
+
|
|
22
|
+
コンテナエージェントの定期実行を CLI から作成・更新・有効化/無効化・削除し、今すぐ実行と実行履歴の確認ができるようになりました(`twp agent schedule`)。作成は既定で無効で、有効化と今すぐ実行には `--yes` が要ります。
|
|
23
|
+
|
|
24
|
+
`twp task-loop` が実行するスキルの呼び出し名の接頭辞(既定 `twp-`)を、ループ設定の `operations.skill_prefix` で変更・削除できるようになりました。空にすると `/<スキル名>` の形で呼び出します。
|
|
25
|
+
|
|
26
|
+
ループの憲章とスキル定義について、サーバに残る過去の版を一覧し(`history`)、2つの版の差分を確認し(`diff`)、指定した版へ戻せる(`revert`)ようになりました。戻す操作も新しい版として記録されます。
|
|
27
|
+
|
|
28
|
+
wiki ページを Markdown 形式で作成できるようになりました(`twp wiki create --content-format markdown`)。`twp wiki get` でページの形式を確認できます。
|
|
29
|
+
|
|
14
30
|
## 0.65.0
|
|
15
31
|
|
|
16
32
|
組織設定「各種マスタ設定」のセグメント・契約形態・事業年度設定を CLI から一覧・取得・作成・更新・削除できるようになりました(`twp segment` / `twp user-contract-type` / `twp fiscal-year`)。作成・更新・削除は管理者の権限が要ります。
|
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ TWP(Tocca Working Platform)を、ターミナルから使うための CLI
|
|
|
30
30
|
| **できる** | `twp worker-agent` によるワーカーエージェント(AIエージェント)の参照(一覧・詳細・スケジュールと次回実行予定・許可できるツールのカタログ・実行回数の上限と今日の使用数)と、実行履歴・実行結果(最終要約を先頭に)・ステップログ・ステップの集計の読み取りと、作成・更新(スケジュール指定込み)・削除・有効化/無効化・今すぐ実行(`--wait` で終わるまで待つ)・実行の取消 |
|
|
31
31
|
| **できる** | `twp search` による TWP 内のコンテンツ(タスク・Wiki・ノート・議事録・FAQ・サポート・ワークフロー等)の横断検索(通常検索と `--ai` の AI検索・種類/状態/カテゴリで絞り込み)と、検索できる種類の一覧。閲覧権限の無いものは出ません |
|
|
32
32
|
| **できる** | `twp announcement` による自分に届いているお知らせ(運営・組織)の一覧(未読・確認待ち・語で絞り込み)・本文と返信の表示・未読件数、既読化(1件ずつ・まとめて)・「確認しました」の記録・返信の一覧と投稿 |
|
|
33
|
-
| **できる** | `twp agent session` によるコンテナエージェント(リポジトリで作業する AI セッション)の起動・追加の指示・再開・停止・削除と、状態・作業ブランチ・PR・会話・実行ログ・変更ファイル(差分)の参照、`twp agent repository`
|
|
33
|
+
| **できる** | `twp agent session` によるコンテナエージェント(リポジトリで作業する AI セッション)の起動・追加の指示・再開・停止・削除と、状態・作業ブランチ・PR・会話・実行ログ・変更ファイル(差分)の参照、`twp agent repository` による起動できるリポジトリとブランチの一覧、`twp agent schedule` による定期実行の定義の作成・更新・有効化/無効化・削除・今すぐ実行と実行履歴の参照。`--wait` で作業が止まるまで待ち、最後のアシスタント発言・作業ブランチ・PR URL を出します。起動・指示・再開は AI クレジットを消費します |
|
|
34
34
|
| **できる** | `twp estimate` / `twp invoice` による販売管理の見積・請求の一覧(語・ステータス・取引先・プロジェクト・担当者・日付・回収状況で絞り込み)と詳細。販売管理・顧客管理の権限が要ります |
|
|
35
35
|
| **できる** | `twp estimate` による見積の作成・更新・削除・社内共有メモ・既存の請求の紐づけ・関連入金・部署按分・案件書類(注文書・個別契約書など)の登録・版の差替え・ダウンロードと、注文書からの注文書番号の読み取り・見積書/注文書/注文請書の PDF の書き出し。販売管理・顧客管理の権限が要ります |
|
|
36
36
|
| **できる** | `twp invoice` による請求の作成・更新・削除・取消と取消解除・統合請求書の作成・社内共有メモ・CSV/MF 会計仕訳の書き出し・請求書メールの送信・支払いリンクの作成・請求書/納品書/検収書の PDF の書き出し。販売管理・顧客管理の権限が要ります |
|
|
@@ -60,6 +60,7 @@ TWP(Tocca Working Platform)を、ターミナルから使うための CLI
|
|
|
60
60
|
| **できる** | `twp media ai-tag run` による AI のタグ提案(クレジットを消費・`--apply` で今のタグに追加) |
|
|
61
61
|
| **できる** | `twp media duplicate list` による内容が同じファイルの検出とアップロード前の同名検査 |
|
|
62
62
|
| **できる** | `twp storage get` によるストレージ使用量の確認(管理者) |
|
|
63
|
+
| **できる** | `twp license list` / `twp license assignments` によるシートライセンスの棚卸(機能ごとの枠・使用数・空き・削減予約、割当者の所属・最終ログインと「失効済み・権限 none・長期未ログインなのに割当が残っている」の判定。組織管理者) |
|
|
63
64
|
| **できる** | `twp attendance` による自分の勤怠の参照(いまの打刻状態・打刻の履歴・月の勤怠表)と打刻・打刻修正(過去の時刻での打刻・メモの変更・取り消し・プロジェクトの付け替え)、勤怠連絡の一覧・登録・変更・削除、チームの勤怠状況・フレックス精算の参照、管理者向けの残業サマリ(36協定を含む)・締め状況の参照 |
|
|
64
65
|
| **できる** | `twp leave` による有給の残日数・取得履歴・付与履歴の参照と有給の申請(`twp leave request`)、`twp workchange list` / `twp shift list` による月の勤務変更・シフトの参照(`--me` で自分の分・無ければ全員分=勤怠の管理者) |
|
|
65
66
|
| **できる** | `twp expense commuting` による通勤交通費の一覧・月ごとの内容と勤怠情報(有給・リモート・勤務変更)の参照、日ごとの区分の保存(下書き)・申請・申請の取消・削除。経費の管理者はテナント全員の一覧(`--all-users`)と月の CSV 出力(`export`)ができます |
|
|
@@ -917,6 +918,8 @@ twp media comment delete <コメントID> --file-id <ファイルID> --yes
|
|
|
917
918
|
twp media ai-tag run <ファイルID> --yes [--apply]
|
|
918
919
|
twp media duplicate list <ファイルID> | --name <ファイル名>... [--folder <ID|パス>] [--project <コード|ID>]
|
|
919
920
|
twp storage get
|
|
921
|
+
twp license list
|
|
922
|
+
twp license assignments <機能コード|機能名> | --all-features [--inactive-days <日数>]
|
|
920
923
|
```
|
|
921
924
|
|
|
922
925
|
- **`--project` を付けたときだけプロジェクトのファイル**、無ければ自分の個人ファイルが対象です(`TWP_PROJECT` などの既定プロジェクトは使いません)。フォルダ(`--folder` / `--parent`)はフォルダID(UUID)か「親/子/孫」形式のパスで指定します。パスは `--project` のスコープのフォルダツリーから解決し、同名が複数あるときや見つからないときは候補を出して終了コード 2 で止まります
|
|
@@ -938,6 +941,8 @@ twp storage get
|
|
|
938
941
|
- **一括操作(`bulk-*`)は1件でも失敗すると終了コード 3 で終わり、失敗したファイルと理由・適用済みのファイルを stderr に出します**(サーバは失敗があっても HTTP 200 を返すため)。`bulk-publish` / `bulk-unpublish` / `bulk-archive` は存在しないファイルIDが1件でもあると他も適用しません。`bulk-restore` / `bulk-move` / `bulk-delete` は1件ずつ処理するので、失敗したもの以外は適用されます。`bulk-download` は ZIP に入った件数が指定より少なければ書き出さずに終了コード 3 で終わります。件数は 100 件まで(`bulk-download` は 50 件)
|
|
939
942
|
- `bulk-restore` はゴミ箱から戻す操作です(アーカイブの解除ではありません)。`bulk-delete --permanent` は**ゴミ箱にあるファイルだけ**を完全に削除します(先に `bulk-delete` でゴミ箱へ移してください)
|
|
940
943
|
- `twp storage get` は使用量・上限・残量と種類別の内訳を出します(管理者のみ。アップロード前の容量検査は誰でも自動で行われます)
|
|
944
|
+
- **`twp license list` は画面の「課金管理 > ライセンス状況」と同じ枠・使用数を出します**(購入済みは Stripe の契約中のシートだけ)。シートの購入・削減は画面から行ってください
|
|
945
|
+
- **`twp license assignments` の判定(findings)は、失効済み/機能権限が none/`--inactive-days` 日(既定60・最大90)ログインの記録が無い/ユーザーが見つからない、の4種類です。** 最終ログインは `twp user export` と同じくログイン履歴(90日で消える・SSO は記録されない)から読むので、oauth の人は判定しません。各行の `release_command`(`twp user permission set`)は今後の版で追加されるコマンドで、まだ無い版では画面から権限を外してください
|
|
941
946
|
- **AI 生成(`twp media image create` / `twp media document create`)は生成物をメディアライブラリに保存し、`--out` を付けるとそのファイルをそのまま書き出します。** 付けなければファイルIDを出して終わります(あとから `twp media download` で取れます)。AI クレジットを消費するので `--yes` が要ります(送る内容は `--dry-run` で確認できます)。`--from <ファイルID>` を付けると、その画像を元にしたリミックスになります
|
|
942
947
|
- 書き出し先が既にあるときは、**生成を送る前に**止まります(クレジットを使ってから「書けません」で落ちません)。取得だけが失敗したときは、ファイルIDと `twp media download` のコマンドを出して失敗で終わります(生成し直す必要はありません)
|
|
943
948
|
- **生成の回数制限(1分あたりの回数・ユーザーごと)に当たっても自動では打ち直しません**(生成は1回ごとに課金されるため)。待つ秒数を stderr に出して終了コード 4 で終わります
|
|
@@ -1133,6 +1138,7 @@ twp budget target import-template --out <パス.csv> [--force] [--year <YYYY>] [
|
|
|
1133
1138
|
twp budget target import --year <YYYY> --file <CSV> --yes
|
|
1134
1139
|
twp budget allocation list [--project <コード>]
|
|
1135
1140
|
twp budget allocation set [--project <コード>] (--split <部署>=<比率>% | --split <部署>=<金額>)... --yes
|
|
1141
|
+
twp budget allocation set [--project <コード>] --file <JSON> --yes
|
|
1136
1142
|
twp budget allocation set [--project <コード>] --clear --yes
|
|
1137
1143
|
```
|
|
1138
1144
|
|
|
@@ -1143,6 +1149,8 @@ twp budget allocation set [--project <コード>] --clear --yes
|
|
|
1143
1149
|
- `target set --file` の JSON は `[{"department": "開発部", "month": 4, "sales_target": 1000000, "profit_target": 200000}]` の形です。誤りは全部挙げて1件も送りません
|
|
1144
1150
|
- `target import` は雛形(`import-template`)の形の CSV を取り込みます。1行でも誤りがあればサーバが1件も書かず、行ごとの理由をすべて出して終了コード 3 です
|
|
1145
1151
|
- `allocation set` は按分を**全件置き換え**ます(指定しなかった部署の按分は消えます)。`--clear` で按分をすべて消します。送る前に置換前と置換後の按分を出します。比率の合計はサーバが画面と同じ規則で検査し(比率だけなら合計 100%、金額の行を含むなら比率の合計が 100% 以下)、違反すると 1 件も書かずに 422 の理由を出して終了コード 3 で終わります
|
|
1152
|
+
- 按分の期間(`periods`)は `allocation set --file` で指定します。JSON は `[{"department": "営業部", "periods": [{"start_month": "2026-11", "end_month": "2027-01", "allocation_type": "amount", "amount": 300000}]}]` の形で、`periods` を省いた行は従来どおり全期間に効きます。`start_month` / `end_month` の `null` は下限・上限なしで、期間を持つ行は期間外の月に按分しません。`allocation list` は表では `periods` 列(`2026-11〜2027-01: 300,000 円`)に、`--output json` ではそのまま出します
|
|
1153
|
+
- **全件置換なので、`--split` / `--clear` で送ると今ある期間の設定も消えます**(消える部署は送る前に出します)。期間を残すなら `allocation list --output json` の結果を直して `--file` で送り直してください(`project_id` などの読み取り専用の項目は無視します)
|
|
1146
1154
|
|
|
1147
1155
|
### ワーカーエージェント(AIエージェント)を見る
|
|
1148
1156
|
|
|
@@ -1212,6 +1220,26 @@ twp agent session delete <セッション> --yes
|
|
|
1212
1220
|
- `cancel` は runner を止めるだけで記録は残ります(`resume` で再開できます)。`delete` は起動した本人だけが実行でき、取り消せません
|
|
1213
1221
|
- メンバーの管理・ターミナルのログ・リアルタイムの出力(WebSocket)はまだありません(`twp api /api/v2/agent/...` で到達できます)
|
|
1214
1222
|
|
|
1223
|
+
### コンテナエージェントを定期実行する
|
|
1224
|
+
|
|
1225
|
+
```bash
|
|
1226
|
+
twp agent schedule create --name <名前> --repository <owner/repo> --instructions-file task.md --schedule daily:09:00 [--base <ブランチ>] [--enable --yes]
|
|
1227
|
+
twp agent schedule list [--owner <ユーザー>]
|
|
1228
|
+
twp agent schedule get <定期実行>
|
|
1229
|
+
twp agent schedule update <定期実行> [--schedule <スケジュール>] [--instructions-file <パス>] [--name <名前>] [--model <モデル> --provider <プロバイダ>]
|
|
1230
|
+
twp agent schedule enable <定期実行> --yes
|
|
1231
|
+
twp agent schedule disable <定期実行>
|
|
1232
|
+
twp agent schedule delete <定期実行> --yes
|
|
1233
|
+
twp agent schedule run <定期実行> --yes
|
|
1234
|
+
twp agent schedule runs <定期実行> [--all]
|
|
1235
|
+
```
|
|
1236
|
+
|
|
1237
|
+
- 定期実行は、オーナー(作った人)の名義・権限・AI クレジットで、スケジュールどおりに無人でセッションを起動します(毎回新しいセッション)
|
|
1238
|
+
- **CLI からは既定で無効のまま作成します**(画面の既定は有効)。`--enable --yes` か、あとで `enable --yes` を打つと自動起動が始まります
|
|
1239
|
+
- `--schedule` の書き方は `twp worker-agent` と同じです(`interval:2h` / `daily:09:00` / `weekly:mon,fri@09:00` / `monthly:1,15@09:00`)。最小間隔はサーバの設定(2026-10 時点で 60 分)で、短すぎる間隔は 422 で断られます。`--model` を `update` で変えるときは `--provider` も指定します
|
|
1240
|
+
- **`run`(今すぐ実行)は、前回のセッションがまだ動いている・日次上限・クレジット不足のとき見送られ、理由を出して終了コード 3 で終わります**(実行履歴には残ります)。起動できたら `twp agent session get` で追えます
|
|
1241
|
+
- 一覧・詳細・実行履歴はテナント内の全員が見られます。編集・削除・有効化・今すぐ実行はオーナーだけ、無効化はオーナーとエージェント管理者ができます
|
|
1242
|
+
|
|
1215
1243
|
### ワークフロー(申請)を見る・出す・承認する
|
|
1216
1244
|
|
|
1217
1245
|
```bash
|
|
@@ -1307,8 +1335,8 @@ twp report reject <レポートID> --comment-file reason.md --yes # 差し戻
|
|
|
1307
1335
|
twp wiki list [--project <コード|ID>] [--status <draft|published>] [--tag <タグ>] [--keyword <語>] [--all]
|
|
1308
1336
|
twp wiki list [--project <コード|ID>] --parent <ページID>|root # 親ページ直下の子(root で最上位)
|
|
1309
1337
|
twp wiki get <ページID> --output text
|
|
1310
|
-
twp wiki create [--project <コード|ID>] --title <件名> --content-file <パス|-> [--parent <ページID>] [--status <draft|published>] [--tag <タグ>]...
|
|
1311
|
-
twp wiki update <ページID> [--title <件名>] [--content-file <パス|->] [--status <draft|published>] [--tag <タグ>]... [--clear-tags] [--if-version <版>]
|
|
1338
|
+
twp wiki create [--project <コード|ID>] --title <件名> --content-file <パス|-> [--content-format <html|markdown>] [--parent <ページID>] [--status <draft|published>] [--tag <タグ>]...
|
|
1339
|
+
twp wiki update <ページID> [--title <件名>] [--content-file <パス|->] [--content-format <html|markdown>] [--status <draft|published>] [--tag <タグ>]... [--clear-tags] [--if-version <版>]
|
|
1312
1340
|
twp wiki move <ページID> [--parent <ページID>|root] [--sort-order <順>]
|
|
1313
1341
|
twp wiki delete <ページID> --yes
|
|
1314
1342
|
twp note list [--mine] [--favorite] [--status <draft|published>] [--visibility <private|tenant|external|public>] [--keyword <語>] [--all]
|
|
@@ -1322,7 +1350,8 @@ twp meeting get <議事録ID> --output text
|
|
|
1322
1350
|
- wiki はプロジェクトごとです(`--project` を省くと既定のプロジェクト)。`--parent` は他の絞り込み・ページングと併用できません
|
|
1323
1351
|
- `twp meeting list` の `--from` / `--to` は開催日(日本時間の日付)の期間で、両端の日を含み、片方だけでも指定できます。`--keyword` はタイトルの語です
|
|
1324
1352
|
- `twp note get` で開くと、画面で開いたときと同じくノートの閲覧数が1増えます
|
|
1325
|
-
- wiki の本文は `--content-file` のファイル(`-`
|
|
1353
|
+
- wiki の本文は `--content-file` のファイル(`-` で標準入力)から読み、加工せずに送ります。Markdown で書いた本文は `--content-format markdown` を付けて作成してください(画面で Markdown として表示されます)。省くと HTML のページになり(そのことを stderr で知らせます)、Markdown を渡しても変換されず記号のまま表示されます。`create` で `--status` を省くと下書きになります
|
|
1354
|
+
- ページの形式(`html` / `markdown`)は作成後に変えられません。`update` で違う形式を指定するとサーバの拒否をそのまま出して終了コード 3 です。`twp wiki get` は形式を `content_format` 列(`--output text` では「形式:」)に出し、Markdown のページの本文は Markdown のまま出します
|
|
1326
1355
|
- `twp wiki update --if-version <版>` は送る直前にページの版(`twp wiki get` の `version`)を照合し、違えば何も送らずに終了コード 3 で止まります(照合と送信の間の他人の更新までは防げません)。`--tag` はタグを置き換え、`--clear-tags` で空にします
|
|
1327
1356
|
- 編集・移動・削除できるのはページの作成者・wiki の管理者・組織の管理者です。権限が無ければサーバの文面をそのまま出して終了コード 3 です
|
|
1328
1357
|
- ノート・議事録の書き込みはまだできません(`twp api /api/v2/notes/...`・`/api/v2/meetings/...` で到達できます)。ヘルプは `twp wiki help` / `twp note help` / `twp meeting help`
|
|
@@ -1873,6 +1902,23 @@ twp task-loop skill pull --project <キー|UUID> --all # サーバの全件
|
|
|
1873
1902
|
- **ループはキュー項目の `/<名前>` をサーバ版で実行します。** サーバに登録されたスキルはサーバ版が、登録されていないスキル(または本文を取得できなかったとき)は作業ディレクトリのファイルが使われます。サーバ版は作業ディレクトリへ書き出さずに実行します(claude にはプロンプト内で展開して渡します)
|
|
1874
1903
|
- どちらで走ったかはループのログとステップログに `skill=server@rev<番号>` / `skill=file` として残ります。一覧はサイクルごとに1回だけ取得し、本文は内容が変わったスキルだけを取り直します
|
|
1875
1904
|
|
|
1905
|
+
### サーバに残した版の履歴・差分・復元
|
|
1906
|
+
|
|
1907
|
+
サーバは憲章(ループ設定)とスキル定義を更新するたびに、その版を残します(対象ごとに直近100版)。
|
|
1908
|
+
|
|
1909
|
+
```bash
|
|
1910
|
+
twp task-loop skill history --project <キー|UUID> <名前> # 版の一覧(新しい順)
|
|
1911
|
+
twp task-loop skill diff --project <キー|UUID> <名前> --from 2 [--to 5] # 2つの版の差分(--to 省略でいまの版)
|
|
1912
|
+
twp task-loop skill revert --project <キー|UUID> <名前> --to 2 # 版 2 の本文へ戻す
|
|
1913
|
+
twp task-loop charter history|diff|revert --project <キー|UUID> ... # 憲章も同じ(スキル名は不要)
|
|
1914
|
+
```
|
|
1915
|
+
|
|
1916
|
+
- **revert は `--yes` なしでは戻しません。** 差分と revision を表示し、確定用のコマンド(`--yes --revision <番号>`)を案内します。push と同じく、差分を見た後に更新されていれば 409 で止まります
|
|
1917
|
+
- **戻す操作も新しい版として記録されます**(版番号は巻き戻りません)。ループは次のサイクルから戻した本文で動きます(ステップログの `skill=server@rev<番号>` に新しい番号が出ます)
|
|
1918
|
+
- **`charter revert` は憲章だけを戻します。** AI割当・注入文面は変わりません。憲章の版は設定全体の版なので、`charter history` には憲章以外を変えた版も並びます
|
|
1919
|
+
- 履歴が始まる前から登録済みだった版は「まだ履歴に保存されていません」と表示され、次の更新の直前に保存されます
|
|
1920
|
+
- 削除したスキルの版は、同じ名前で作り直すまで history / diff で引けます(revert はできないので、diff で本文を確認して push し直してください)
|
|
1921
|
+
|
|
1876
1922
|
### 計画AIが計画を提出する(`plan submit`)
|
|
1877
1923
|
|
|
1878
1924
|
```bash
|
package/command-model/wiki.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"domain": "wiki",
|
|
3
3
|
"operations": [
|
|
4
4
|
{"name":"backlinks","domain":"wiki","operationId":"wiki.backlinks","method":"GET","path":"/v2/wiki/{id}/backlinks","summary":"Get pages that link to this page","pathParams":[{"name":"id","type":"string","required":true,"source":"spec"}],"queryParams":[{"name":"limit","type":"integer","required":false,"description":"1ページあたりの件数","source":"curation"},{"name":"cursor","type":"string","required":false,"description":"次ページの取得に使うカーソル","source":"curation"}],"body":null,"resultPath":"backlinks","risk":"read","aliases":[]},
|
|
5
|
-
{"name":"create","domain":"wiki","operationId":"wiki.store","method":"POST","path":"/v2/wiki","summary":"Create a wiki page","pathParams":[],"queryParams":[],"body":{"schema":{"type":"object","properties":{"project_id":{"type":"string"},"title":{"type":"string","maxLength":255},"content":{"type":"string"},"status":{"type":"string","enum":["draft","published"]},"parent_page_id":{"type":["string","null"]},"slug":{"type":["string","null"],"maxLength":255},"sort_order":{"type":"integer","minimum":0},"tags":{"type":"array","items":{"type":"string","maxLength":50}}},"required":["project_id","title","content"]}},"resultPath":null,"risk":"write","aliases":[]},
|
|
5
|
+
{"name":"create","domain":"wiki","operationId":"wiki.store","method":"POST","path":"/v2/wiki","summary":"Create a wiki page","pathParams":[],"queryParams":[],"body":{"schema":{"type":"object","properties":{"project_id":{"type":"string"},"title":{"type":"string","maxLength":255},"content":{"type":"string"},"content_format":{"type":"string","enum":["html","markdown"]},"status":{"type":"string","enum":["draft","published"]},"parent_page_id":{"type":["string","null"]},"slug":{"type":["string","null"],"maxLength":255},"sort_order":{"type":"integer","minimum":0},"tags":{"type":"array","items":{"type":"string","maxLength":50}}},"required":["project_id","title","content"]}},"resultPath":null,"risk":"write","aliases":[]},
|
|
6
6
|
{"name":"delete","domain":"wiki","operationId":"wiki.destroy","method":"DELETE","path":"/v2/wiki/{id}","summary":"Delete a wiki page","pathParams":[{"name":"id","type":"string","required":true,"source":"spec"}],"queryParams":[],"body":null,"resultPath":null,"risk":"destructive","aliases":[]},
|
|
7
7
|
{"name":"get","domain":"wiki","operationId":"wiki.show","method":"GET","path":"/v2/wiki/{id}","summary":"Get a wiki page","pathParams":[{"name":"id","type":"string","required":true,"source":"spec"}],"queryParams":[{"name":"limit","type":"integer","required":false,"description":"1ページあたりの件数","source":"curation"},{"name":"cursor","type":"string","required":false,"description":"次ページの取得に使うカーソル","source":"curation"}],"body":null,"resultPath":null,"risk":"read","aliases":[]},
|
|
8
8
|
{"name":"list","domain":"wiki","operationId":"wiki.index","method":"GET","path":"/v2/wiki","summary":"List wiki pages for a project (paginated)","pathParams":[],"queryParams":[{"name":"status","type":"string","required":false,"description":"ページの状態で絞り込む","source":"spec"},{"name":"tag","type":"string","required":false,"description":"タグで絞り込む","source":"spec"},{"name":"keyword","type":"string","required":false,"description":"キーワードで絞り込む","source":"spec"},{"name":"cursor","type":"string","required":false,"description":"次ページの取得に使うカーソル","source":"curation"},{"name":"limit","type":"integer","required":false,"description":"1ページあたりの件数","source":"curation"},{"name":"project_id","type":"string","required":true,"description":"対象プロジェクトのID","source":"curation"}],"body":null,"resultPath":"items","risk":"read","aliases":[]},
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{"name":"show-version","domain":"wiki","operationId":"wiki.showVersion","method":"GET","path":"/v2/wiki/{id}/versions/{version}","summary":"Get a specific version of a wiki page","pathParams":[{"name":"id","type":"string","required":true,"source":"spec"},{"name":"version","type":"integer","required":true,"source":"spec"}],"queryParams":[{"name":"limit","type":"integer","required":false,"description":"1ページあたりの件数","source":"curation"},{"name":"cursor","type":"string","required":false,"description":"次ページの取得に使うカーソル","source":"curation"}],"body":null,"resultPath":null,"risk":"read","aliases":[]},
|
|
11
11
|
{"name":"tags","domain":"wiki","operationId":"wiki.tags","method":"GET","path":"/v2/wiki/tags","summary":"List tags for a project's wiki","pathParams":[],"queryParams":[{"name":"limit","type":"integer","required":false,"description":"1ページあたりの件数","source":"curation"},{"name":"cursor","type":"string","required":false,"description":"次ページの取得に使うカーソル","source":"curation"},{"name":"project_id","type":"string","required":true,"description":"対象プロジェクトのID","source":"curation"}],"body":null,"resultPath":"tags","risk":"read","aliases":[]},
|
|
12
12
|
{"name":"tree","domain":"wiki","operationId":"wiki.tree","method":"GET","path":"/v2/wiki/tree","summary":"Get wiki page tree for a project","pathParams":[],"queryParams":[{"name":"limit","type":"integer","required":false,"description":"1ページあたりの件数","source":"curation"},{"name":"cursor","type":"string","required":false,"description":"次ページの取得に使うカーソル","source":"curation"},{"name":"project_id","type":"string","required":true,"description":"対象プロジェクトのID","source":"curation"}],"body":null,"resultPath":"tree","risk":"read","aliases":[]},
|
|
13
|
-
{"name":"update","domain":"wiki","operationId":"wiki.update","method":"PUT","path":"/v2/wiki/{id}","summary":"Update a wiki page","pathParams":[{"name":"id","type":"string","required":true,"source":"spec"}],"queryParams":[],"body":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":255},"content":{"type":"string"},"status":{"type":"string","enum":["draft","published"]},"parent_page_id":{"type":["string","null"]},"slug":{"type":["string","null"],"maxLength":255},"sort_order":{"type":"integer","minimum":0},"tags":{"type":"array","items":{"type":"string","maxLength":50}}}}},"resultPath":null,"risk":"write","aliases":[]},
|
|
13
|
+
{"name":"update","domain":"wiki","operationId":"wiki.update","method":"PUT","path":"/v2/wiki/{id}","summary":"Update a wiki page","pathParams":[{"name":"id","type":"string","required":true,"source":"spec"}],"queryParams":[],"body":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":255},"content":{"type":"string"},"content_format":{"type":"string","enum":["html","markdown"]},"status":{"type":"string","enum":["draft","published"]},"parent_page_id":{"type":["string","null"]},"slug":{"type":["string","null"],"maxLength":255},"sort_order":{"type":"integer","minimum":0},"tags":{"type":"array","items":{"type":"string","maxLength":50}}}}},"resultPath":null,"risk":"write","aliases":[]},
|
|
14
14
|
{"name":"versions","domain":"wiki","operationId":"wiki.versions","method":"GET","path":"/v2/wiki/{id}/versions","summary":"List version history for a wiki page","pathParams":[{"name":"id","type":"string","required":true,"source":"spec"}],"queryParams":[{"name":"limit","type":"integer","required":false,"description":"1ページあたりの件数","source":"curation"},{"name":"cursor","type":"string","required":false,"description":"次ページの取得に使うカーソル","source":"curation"}],"body":null,"resultPath":"versions","risk":"read","aliases":[]}
|
|
15
15
|
]
|
|
16
16
|
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{SCHEDULE_HELP,parseSchedule}from"./chunk-HBEOI456.js";import"./chunk-WVCEKC7V.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import"./chunk-RX5HWI4L.js";import{charCount,readBody}from"./chunk-6LSQCOCJ.js";import{AGENT_REPOSITORIES_PATH,AGENT_SCHEDULES_PATH,AGENT_SESSIONS_PATH}from"./chunk-HNG6MF26.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{ApiError}from"./chunk-JA5A6UJ2.js";
|
|
4
|
+
import"./chunk-H4CDX4TX.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import"./chunk-II5RVJQN.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-4VZKNEVN.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";
|
|
5
|
+
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
|
+
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";
|
|
7
|
+
var SCHEDULE_REF_HELP="<\u5B9A\u671F\u5B9F\u884C> \u306F\u5B9A\u671F\u5B9F\u884C ID\uFF08twp agent schedule list \u306E schedule_id \u5217\uFF09\u3067\u3059\u3002";var CREDIT_CONFIRMATION="AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u3059\u308B\u64CD\u4F5C";function usageOf(op){return`twp agent schedule ${op} help`}function noArgs(input,op){if(input.args.length>0)throw new UsageError(`schedule ${op} \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,
|
|
8
|
+
usageOf(op))}function scheduleId(input,op){const values=input.args.map(arg=>arg.trim());if(values.length>1)throw new UsageError(`schedule ${op} \u304C\u53D7\u3051\u53D6\u308C\u308B\u5F15\u6570\u306F <\u5B9A\u671F\u5B9F\u884C> \u3060\u3051\u3067\u3059: ${values.slice(1).join(" ")}`,usageOf(op));const value=values[0]??"";if(value==="")throw new UsageError("<\u5B9A\u671F\u5B9F\u884C>\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",usageOf(op));if(!isSafePathSegment(value))throw new UsageError(
|
|
9
|
+
`\u5B9A\u671F\u5B9F\u884C ID \u3068\u3057\u3066\u4F7F\u3048\u306A\u3044\u5024\u3067\u3059: ${value}`,"\u5B9A\u671F\u5B9F\u884C ID \u306F twp agent schedule list \u306E schedule_id \u5217\u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002");return value}function schedulePath(id,suffix=""){return`${AGENT_SCHEDULES_PATH}/${encodeURIComponent(id)}${suffix}`}function envelope(body,what){if(!isRecord(body)||body["result"]!==true)throw new ApiResponseError(`${what}\u306E\u5FDC\u7B54\u306E\u5F62\u304C\u60F3\u5B9A\u3068\u9055\u3044\u307E\u3059\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);
|
|
10
|
+
return body}function dataOf(body,what,key){const data=envelope(body,what)["data"];if(!isRecord(data)||typeof data[key]!=="string")throw new ApiResponseError(`${what}\u306E\u5FDC\u7B54\u306B data.${key} \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return data}function scheduleOf(body){return dataOf(body,LABEL,"schedule_id")}function summary(row,columns){const out=pick(row,columns);if(isRecord(row)&&"schedule"in out){const schedule=row["\
|
|
11
|
+
schedule"];out["schedule"]=isRecord(schedule)?schedule["description"]??schedule["type"]??null:schedule??null}return out}function scheduleNotes(body){const data=scheduleOf(body);if(data["enabled"]!==true)return[`\u7121\u52B9\u3067\u3059\u3002\u5B9A\u671F\u5B9F\u884C\u3092\u59CB\u3081\u308B\u306B\u306F twp agent schedule enable ${String(data["schedule_id"])} \u3092\u6253\u3063\u3066\u304F\u3060\u3055\u3044\u3002`];return typeof data["next_run_at"]==="string"?[`\u6B21\u56DE\u306E\u5B9F\u884C\u4E88\u5B9A: ${data["\
|
|
12
|
+
next_run_at"]}`]:[]}function scheduleRows(body){const items=envelope(body,`${LABEL}\u4E00\u89A7`)["items"];if(!Array.isArray(items))throw new ApiResponseError(`${LABEL}\u4E00\u89A7\u306E\u5FDC\u7B54\u306B items \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return items}var OWNER_FLAG={name:"--owner",summary:"\u30AA\u30FC\u30CA\u30FC\u3067\u7D5E\u308A\u8FBC\u3080\uFF08\u30E6\u30FC\u30B6\u30FC\u306E ID\u30FB\u30E1\u30FC\u30EB\u30FB\u6C0F\u540D\u30FBme\uFF09",
|
|
13
|
+
takesValue:true,placeholder:"<\u30E6\u30FC\u30B6\u30FC>"};var listOperation={name:"list",summary:`${LABEL}\u306E\u5B9A\u7FA9\u3092\u4E00\u89A7\u3059\u308B\uFF08\u30C6\u30CA\u30F3\u30C8\u5185\u306E\u5168\u54E1\u5206\u30FB\u6709\u52B9/\u7121\u52B9\u30FB\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u30FB\u6B21\u56DE\u5B9F\u884C\u4E88\u5B9A\uFF09`,usage:"twp agent schedule list [--owner <\u30E6\u30FC\u30B6\u30FC>]",description:`\u30C6\u30CA\u30F3\u30C8\u5185\u306E\u5168\u30E6\u30FC\u30B6\u30FC\u306E\u5B9A\u7FA9\u304C\u51FA\u307E\u3059\uFF08\u4ED6\u4EBA\u306E\u5B9A\u7FA9\u306F\u95B2\u89A7\u306E\u307F\uFF09\u3002\u3053\u306E API \u306F\u30DA\u30FC\u30B8\u30F3\u30B0\u3092\u6301\u305F\u305A\u3001\u5168\u4EF6\u3092\u8FD4\u3057\u307E\u3059\u3002
|
|
14
|
+
--output json \u306F\u5404\u5B9A\u7FA9\u306E\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\uFF08\u6307\u793A\u6587\u30FBschedule \u306E\u5185\u8A33\u3092\u542B\u3080\uFF09\u3092\u51FA\u3057\u307E\u3059\u3002
|
|
15
|
+
--output table / text / tsv \u306F\u8981\u7D04\u5217\uFF08${LIST_COLUMNS.join(" / ")}\uFF09\u3067\u3059\u3002schedule \u5217\u306F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u306E\u8AAC\u660E\u6587\u3067\u3059\u3002`,flags:[OWNER_FLAG],async prepare(input,ctx){noArgs(input,"list");const owner=nonEmpty(input.flags,OWNER_FLAG.name);if(owner===void 0)return input;return withResolved(input,{ownerUserId:(await ctx.resolver.user(owner,OWNER_FLAG.name)).id})},plan:input=>({method:"GET",path:AGENT_SCHEDULES_PATH,
|
|
16
|
+
query:{owner_user_id:input.resolved?.["ownerUserId"]}}),summarize:body=>scheduleRows(body).map(row=>summary(row,LIST_COLUMNS)),raw:scheduleRows,forbidden:FORBIDDEN,notes(body){if(scheduleRows(body).length>0)return[];const limits=isRecord(body)&&isRecord(body["limits"])?body["limits"]:{};const perUser=limits["max_schedules_per_user"];return[`${LABEL}\u306F0\u4EF6\u3067\u3059\u3002${typeof perUser==="number"?`1\u4EBA ${perUser} \u4EF6\u307E\u3067\u4F5C\u308C\u307E\u3059\uFF08twp agent schedule create\uFF09\u3002`:
|
|
17
|
+
""}`]}};var getOperation={name:"get",summary:`${LABEL}1\u4EF6\u306E\u8A73\u7D30\u3092\u8868\u793A\u3059\u308B\uFF08\u6307\u793A\u6587\u30FB\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u30FB\u6B21\u56DE\u5B9F\u884C\u4E88\u5B9A\u30FB\u76F4\u8FD1\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\uFF09`,usage:"twp agent schedule get <\u5B9A\u671F\u5B9F\u884C>",description:`${SCHEDULE_REF_HELP}
|
|
18
|
+
--output json \u306F\u6307\u793A\u6587\uFF08instruction\uFF09\u3068\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u306E\u5185\u8A33\u3092\u542B\u3080\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u51FA\u3057\u307E\u3059\u3002`,flags:[],plan:input=>({method:"GET",path:schedulePath(scheduleId(input,"get"))}),summarize:body=>summary(scheduleOf(body),GET_COLUMNS),raw:scheduleOf,forbidden:FORBIDDEN};var NAME_FLAG={name:"--name",summary:`\u540D\u524D\uFF08${NAME_MAX_CHARS}\u6587\u5B57\u307E\u3067\uFF09`,takesValue:true,
|
|
19
|
+
placeholder:"<\u540D\u524D>"};var REPOSITORY_FLAG={name:"--repository",summary:"\u30EA\u30DD\u30B8\u30C8\u30EA\uFF08owner/repo\u30FB\u540D\u524D\u30FBID\u3002twp agent repository list \u3067\u78BA\u8A8D\u3067\u304D\u308B\uFF09",takesValue:true,placeholder:"<owner/repo>"};var BASE_FLAG={name:"--base",summary:"\u4F5C\u696D\u306E\u8D77\u70B9\u306B\u3059\u308B\u30D6\u30E9\u30F3\u30C1\uFF08\u7701\u7565\u6642\u306F\u30EA\u30DD\u30B8\u30C8\u30EA\u306E\u65E2\u5B9A\u30D6\u30E9\u30F3\u30C1\uFF09",takesValue:true,
|
|
20
|
+
placeholder:"<\u30D6\u30E9\u30F3\u30C1>"};var INSTRUCTIONS_FILE_FLAG={name:"--instructions-file",summary:`\u6307\u793A\u6587\u3092\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u8AAD\u3080\uFF08- \u3067\u6A19\u6E96\u5165\u529B\u30FB${INSTRUCTION_MAX_CHARS.toLocaleString()}\u6587\u5B57\u307E\u3067\uFF09`,takesValue:true,placeholder:"<\u30D1\u30B9|->"};var INSTRUCTIONS_FLAG={name:"--instructions",summary:"\u6307\u793A\u6587\u3092\u5F15\u6570\u3067\u6E21\u3059\uFF08\u6539\u884C\u3092\u542B\u3080\u306A\u3089 --instructions-file\uFF09",
|
|
21
|
+
takesValue:true,placeholder:"<\u6307\u793A\u6587>"};var SCHEDULE_FLAG={name:"--schedule",summary:"\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\uFF08interval:2h / daily:09:00 / weekly:mon,fri@09:00 / monthly:1,15@09:00\uFF09",takesValue:true,placeholder:"<\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB>"};var MODEL_FLAG={name:"--model",summary:"AI \u30E2\u30C7\u30EB\uFF08\u7701\u7565\u6642\u306F\u30B5\u30FC\u30D0\u306E\u65E2\u5B9A\uFF09",takesValue:true,placeholder:"<\u30E2\u30C7\u30EB>"};var PROVIDER_FLAG={name:"-\
|
|
22
|
+
-provider",summary:"AI \u30D7\u30ED\u30D0\u30A4\u30C0\uFF08\u4F5C\u6210\u3067\u306F\u65E2\u5B9A claude\u3002update \u3067 --model \u3092\u5909\u3048\u308B\u306A\u3089\u5FC5\u9808\u30FB\u5358\u72EC\u3067\u5909\u3048\u308B\u3068\u30E2\u30C7\u30EB\u306F\u30B5\u30FC\u30D0\u306E\u65E2\u5B9A\u306B\u623B\u308B\uFF09",takesValue:true,placeholder:"<\u30D7\u30ED\u30D0\u30A4\u30C0>"};var ENABLE_FLAG={name:"--enable",summary:"\u4F5C\u6210\u3068\u540C\u6642\u306B\u6709\u52B9\u5316\u3059\u308B\uFF08\u65E2\u5B9A\u306F\u7121\u52B9\u3067\u4F5C\u6210\uFF09",
|
|
23
|
+
takesValue:false};var INTERVAL_NOTE="\u5B9A\u671F\u5B9F\u884C\u306E\u6700\u5C0F\u9593\u9694\u306F\u30B5\u30FC\u30D0\u306E\u8A2D\u5B9A\u3067\u6C7A\u307E\u308A\uFF082026-10 \u6642\u70B9\u3067 60 \u5206\uFF09\u3001\u4E0A\u306E interval \u306E\u7BC4\u56F2\u3088\u308A\u53B3\u3057\u3044\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002\n\u77ED\u3059\u304E\u308B\u9593\u9694\u306F\u30B5\u30FC\u30D0\u304C 422 \u3067\u65AD\u308A\u307E\u3059\u3002";function checkedName(value,op){const name=value.trim();if(name===
|
|
24
|
+
"")throw new UsageError("\u540D\u524D\u304C\u7A7A\u3067\u3059",usageOf(op));const count=charCount(name);if(count>NAME_MAX_CHARS)throw new UsageError(`\u540D\u524D\u306F ${NAME_MAX_CHARS} \u6587\u5B57\u307E\u3067\u3067\u3059\uFF08${count} \u6587\u5B57\uFF09`,usageOf(op));return name}async function buildBody(input,op,repositoryRef){const body={};const name=input.flags.get(NAME_FLAG.name);if(name!==void 0)body["name"]=checkedName(name,op);if(repositoryRef!==void 0)body["repository_id"]=repositoryRef;
|
|
25
|
+
const base=input.flags.get(BASE_FLAG.name);if(base!==void 0)body["base_branch"]=base.trim()===""?null:base.trim();const instruction=await readBody(input,{flag:INSTRUCTIONS_FLAG.name,fileFlag:INSTRUCTIONS_FILE_FLAG.name,label:"\u6307\u793A\u6587",maxChars:INSTRUCTION_MAX_CHARS,usage:usageOf(op)});if(instruction!==void 0)body["instruction"]=instruction;const schedule=nonEmpty(input.flags,SCHEDULE_FLAG.name);if(schedule!==void 0)body["schedule"]=parseSchedule(schedule);const model=nonEmpty(input.flags,
|
|
26
|
+
MODEL_FLAG.name);const provider=nonEmpty(input.flags,PROVIDER_FLAG.name);if(model!==void 0&&provider===void 0&&op==="update"){throw new UsageError("update \u3067 --model \u3092\u5909\u3048\u308B\u3068\u304D\u306F --provider \u3082\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u4F8B: --provider claude\uFF09",usageOf(op))}if(provider!==void 0&&model===void 0&&op==="create")throw new UsageError("--provider \u306F --model \u3068\u4E00\u7DD2\u306B\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
27
|
+
usageOf(op));if(model!==void 0)body["ai_model"]=model.trim();if(model!==void 0||provider!==void 0)body["ai_provider"]=(provider??"claude").trim();if(op==="create"){const missing=[["name","--name"],["repository_id","--repository"],["instruction","--instructions-file"],["schedule","--schedule"]].filter(([key])=>body[key]===void 0);if(missing.length>0)throw new UsageError(`\u4F5C\u6210\u306B\u306F ${missing.map(([,flag])=>flag).join(" / ")} \u304C\u5FC5\u8981\u3067\u3059`,usageOf(op));body["enabled"]=
|
|
28
|
+
input.flags.has(ENABLE_FLAG.name)}else if(Object.keys(body).length===0){throw new UsageError("\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u4EE5\u4E0A\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",usageOf(op))}return body}function bodyOf(input){return JSON.parse(requireResolved(input,"body"))}async function bodyWithRepository(input,ctx,op){const ref=nonEmpty(input.flags,REPOSITORY_FLAG.name);const body=await buildBody(input,op,ref);if(ref===void 0)return body;const repo=await ctx.resolver.
|
|
29
|
+
agentRepository(ref,REPOSITORY_FLAG.name);if(!isSafePathSegment(repo.id))throw new UsageError(`\u30EA\u30DD\u30B8\u30C8\u30EA ID \u3068\u3057\u3066\u4F7F\u3048\u306A\u3044\u5024\u3067\u3059: ${repo.id}`);return{...body,repository_id:repo.id}}function limitGuidance(server){return server.includes("\u4E0A\u9650")?"\u4E0D\u8981\u306A\u5B9A\u7FA9\u3092 twp agent schedule delete <\u5B9A\u671F\u5B9F\u884C> --yes \u3067\u6D88\u3057\u3066\u304B\u3089\u4F5C\u308A\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u4E00\u89A7\u306F twp agent schedule list\uFF09\u3002":
|
|
30
|
+
void 0}var createOperation={name:"create",summary:`${LABEL}\u3092\u4F5C\u6210\u3059\u308B\uFF08\u30EA\u30DD\u30B8\u30C8\u30EA\u30FB\u6307\u793A\u6587\u30FB\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u3002\u65E2\u5B9A\u306F\u7121\u52B9\u3067\u4F5C\u6210\u30FB--enable \u306F --yes \u304C\u8981\u308B\uFF09`,usage:"twp agent schedule create --name <\u540D\u524D> --repository <owner/repo> --instructions-file <\u30D1\u30B9> --schedule <\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB> [--base <\u30D6\u30E9\u30F3\u30C1>] [--model <\u30E2\u30C7\u30EB> [--provider <\u30D7\u30ED\u30D0\u30A4\u30C0>]] [--enable --yes]",
|
|
31
|
+
description:`\u5B9A\u671F\u5B9F\u884C\u306F\u3001\u30AA\u30FC\u30CA\u30FC\uFF08\u3042\u306A\u305F\uFF09\u306E\u540D\u7FA9\u30FB\u6A29\u9650\u30FBAI \u30AF\u30EC\u30B8\u30C3\u30C8\u3067\u3001\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u3069\u304A\u308A\u306B\u7121\u4EBA\u3067\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u8D77\u52D5\u3057\u307E\u3059\uFF08\u6BCE\u56DE\u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3\uFF09\u3002
|
|
32
|
+
--enable \u3092\u4ED8\u3051\u306A\u3051\u308C\u3070\u7121\u52B9\u3067\u4F5C\u6210\u3057\u307E\u3059\uFF08\u4F5C\u6210\u5F8C\u306B twp agent schedule enable \u3067\u6709\u52B9\u5316\uFF09\u3002--enable \u3092\u4ED8\u3051\u308B\u306A\u3089 --yes \u304C\u8981\u308A\u307E\u3059\u3002
|
|
33
|
+
\u6307\u793A\u6587\u306F --instructions-file \u3067\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u5F15\u6570\u3067\u306F\u6539\u884C\u30FB\u5F15\u7528\u7B26\u304C\u58CA\u308C\u307E\u3059\uFF09\u3002
|
|
34
|
+
|
|
35
|
+
${SCHEDULE_HELP}
|
|
36
|
+
${INTERVAL_NOTE}`,flags:[NAME_FLAG,REPOSITORY_FLAG,BASE_FLAG,INSTRUCTIONS_FILE_FLAG,INSTRUCTIONS_FLAG,SCHEDULE_FLAG,MODEL_FLAG,PROVIDER_FLAG,ENABLE_FLAG],async prepare(input,ctx){noArgs(input,"create");return withResolved(input,{body:JSON.stringify(await bodyWithRepository(input,ctx,"create"))})},plan:input=>({method:"POST",path:AGENT_SCHEDULES_PATH,body:bodyOf(input)}),preview:async input=>bodyOf(input)["enabled"]===true?{notes:[],warnings:["\u6709\u52B9\u3067\u4F5C\u6210\u3057\u307E\u3059\u3002\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u3069\u304A\u308A\u306B\u3042\u306A\u305F\u306E\u540D\u7FA9\u3067\u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u8D77\u52D5\u3057\u3001\u30C6\u30CA\u30F3\u30C8\u306E AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\
|
|
37
|
+
\u3057\u307E\u3059\u3002"]}:{notes:[],warnings:[]},summarize:body=>summary(scheduleOf(body),GET_COLUMNS),raw:scheduleOf,forbidden:FORBIDDEN,rejected:limitGuidance,notes:scheduleNotes};var updateOperation={name:"update",summary:`${LABEL}\u306E\u8A2D\u5B9A\u3092\u5909\u3048\u308B\uFF08\u6307\u5B9A\u3057\u305F\u9805\u76EE\u3060\u3051\u3002\u30AA\u30FC\u30CA\u30FC\u306E\u307F\uFF09`,usage:"twp agent schedule update <\u5B9A\u671F\u5B9F\u884C> [--name <\u540D\u524D>] [--repository <owner/repo>] [--base <\u30D6\u30E9\u30F3\u30C1>] [--instructions-file\
|
|
38
|
+
<\u30D1\u30B9>] [--schedule <\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB>] [--model <\u30E2\u30C7\u30EB> --provider <\u30D7\u30ED\u30D0\u30A4\u30C0> | --provider <\u30D7\u30ED\u30D0\u30A4\u30C0>]",description:`${SCHEDULE_REF_HELP}
|
|
39
|
+
\u6307\u5B9A\u3057\u305F\u9805\u76EE\u3060\u3051\u3092\u9001\u308A\u307E\u3059\u3002--base "" \u3067\u65E2\u5B9A\u30D6\u30E9\u30F3\u30C1\u3078\u623B\u305B\u307E\u3059\u3002\u6709\u52B9/\u7121\u52B9\u306F enable / disable \u3067\u5207\u308A\u66FF\u3048\u307E\u3059\u3002
|
|
40
|
+
\u4ED6\u4EBA\u306E\u5B9A\u7FA9\u306F\u7BA1\u7406\u8005\u3067\u3082\u7DE8\u96C6\u3067\u304D\u307E\u305B\u3093\uFF08\u30B5\u30FC\u30D0\u304C 403 \u3092\u8FD4\u3057\u307E\u3059\uFF09\u3002
|
|
41
|
+
|
|
42
|
+
${SCHEDULE_HELP}
|
|
43
|
+
${INTERVAL_NOTE}`,flags:[NAME_FLAG,REPOSITORY_FLAG,BASE_FLAG,INSTRUCTIONS_FILE_FLAG,INSTRUCTIONS_FLAG,SCHEDULE_FLAG,MODEL_FLAG,PROVIDER_FLAG],async prepare(input,ctx){scheduleId(input,"update");return withResolved(input,{body:JSON.stringify(await bodyWithRepository(input,ctx,"update"))})},plan:input=>({method:"PATCH",path:schedulePath(scheduleId(input,"update")),body:bodyOf(input)}),summarize:body=>summary(scheduleOf(body),GET_COLUMNS),raw:scheduleOf,forbidden:FORBIDDEN,notes:scheduleNotes};function toggleOperation(enable){
|
|
44
|
+
const op=enable?"enable":"disable";return{name:op,summary:enable?`${LABEL}\u3092\u6709\u52B9\u306B\u3059\u308B\uFF08\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u3069\u304A\u308A\u306E\u81EA\u52D5\u8D77\u52D5\u304C\u59CB\u307E\u308B\u30FBAI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u30FB--yes \u304C\u8981\u308B\u30FB\u30AA\u30FC\u30CA\u30FC\u306E\u307F\uFF09`:`${LABEL}\u3092\u7121\u52B9\u306B\u3059\u308B\uFF08\u81EA\u52D5\u8D77\u52D5\u3092\u6B62\u3081\u308B\u30FB\u30AA\u30FC\u30CA\u30FC\u304B\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u7BA1\u7406\u8005\uFF09`,
|
|
45
|
+
usage:`twp agent schedule ${op} <\u5B9A\u671F\u5B9F\u884C>${enable?" --yes":""}`,description:`${SCHEDULE_REF_HELP}
|
|
46
|
+
`+(enable?"\u6709\u52B9\u5316\u3059\u308B\u3068\u3001\u30AA\u30FC\u30CA\u30FC\uFF08\u3042\u306A\u305F\uFF09\u306E\u540D\u7FA9\u3067\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u3069\u304A\u308A\u306B\u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u8D77\u52D5\u3057\u3001\u30C6\u30CA\u30F3\u30C8\u306E AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u3057\u307E\u3059\u3002":"\u30AA\u30FC\u30CA\u30FC\u304B\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u7BA1\u7406\u8005\u304C\u7121\u52B9\u5316\u3067\u304D\u307E\u3059\u3002\u52D5\u3044\u3066\u3044\u308B\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u6B62\u3081\u307E\u305B\u3093\uFF08\u6B62\u3081\u308B\u306E\u306F twp agent session cancel\uFF09\u3002"),
|
|
47
|
+
...enable?{destructive:true,confirmation:CREDIT_CONFIRMATION}:{},flags:[],plan:input=>({method:"POST",path:schedulePath(scheduleId(input,op),`/${op}`)}),summarize:body=>summary(scheduleOf(body),GET_COLUMNS),raw:scheduleOf,forbidden:FORBIDDEN,notes:enable?scheduleNotes:void 0}}function messageOf(body){const data=envelope(body,`${LABEL}\u306E\u524A\u9664`);return{message:typeof data["message"]==="string"?data["message"]:null}}var deleteOperation={name:"delete",summary:`${LABEL}\u3092\u524A\u9664\u3059\u308B\uFF08\u53D6\u308A\u6D88\u305B\u306A\u3044\u30FB--yes \u304C\
|
|
48
|
+
\u8981\u308B\u30FB\u30AA\u30FC\u30CA\u30FC\u306E\u307F\uFF09`,usage:"twp agent schedule delete <\u5B9A\u671F\u5B9F\u884C> --yes",description:`${SCHEDULE_REF_HELP}
|
|
49
|
+
\u524A\u9664\u306F\u53D6\u308A\u6D88\u305B\u307E\u305B\u3093\u3002\u6B62\u3081\u305F\u3044\u3060\u3051\u306A\u3089 twp agent schedule disable \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002\u8D77\u52D5\u6E08\u307F\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u30FB\u4F5C\u6210\u3055\u308C\u305F PR \u306F\u6B8B\u308A\u307E\u3059\u3002`,destructive:true,flags:[],plan:input=>({method:"DELETE",path:schedulePath(scheduleId(input,"delete"))}),summarize:messageOf,raw:messageOf,forbidden:FORBIDDEN};function runOf(body){
|
|
50
|
+
return dataOf(body,"\u4ECA\u3059\u3050\u5B9F\u884C","run_id")}var runOperation={name:"run",summary:`${LABEL}\u3092\u4ECA\u3059\u30501\u56DE\u5B9F\u884C\u3059\u308B\uFF08AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u30FB--yes \u304C\u8981\u308B\u30FB\u30AA\u30FC\u30CA\u30FC\u306E\u307F\uFF09`,usage:"twp agent schedule run <\u5B9A\u671F\u5B9F\u884C> --yes",description:`${SCHEDULE_REF_HELP}
|
|
51
|
+
\u5B9A\u671F\u8D77\u52D5\u3068\u540C\u3058\u7D4C\u8DEF\u3067\u30BB\u30C3\u30B7\u30E7\u30F3\u30921\u3064\u8D77\u52D5\u3057\u307E\u3059\uFF08\u6B21\u56DE\u306E\u4E88\u5B9A\u306F\u52D5\u304D\u307E\u305B\u3093\u3002\u7121\u52B9\u306A\u5B9A\u7FA9\u3067\u3082\u5B9F\u884C\u3067\u304D\u307E\u3059\uFF09\u3002
|
|
52
|
+
\u524D\u56DE\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u307E\u3060\u52D5\u3044\u3066\u3044\u308B\u30FB\u65E5\u6B21\u4E0A\u9650\u30FB\u30AF\u30EC\u30B8\u30C3\u30C8\u4E0D\u8DB3\u306E\u3068\u304D\u306F\u898B\u9001\u3089\u308C\u3001\u7406\u7531\u3092\u51FA\u3057\u3066\u7D42\u4E86\u30B3\u30FC\u30C9 3 \u3067\u7D42\u308F\u308A\u307E\u3059\uFF08\u5B9F\u884C\u5C65\u6B74\u306B\u306F\u6B8B\u308A\u307E\u3059\uFF09\u3002
|
|
53
|
+
\u8D77\u52D5\u3057\u305F\u30BB\u30C3\u30B7\u30E7\u30F3\u306F twp agent session get <\u30BB\u30C3\u30B7\u30E7\u30F3> \u3067\u8FFD\u3048\u307E\u3059\u3002`,destructive:true,confirmation:CREDIT_CONFIRMATION,flags:[],async execute(input,ctx){let body;try{body=await ctx.send({method:"POST",path:schedulePath(scheduleId(input,"run"),"/run")})}catch(err){if(!(err instanceof ApiError&&err.status>=400&&err.status<500)&&!(err instanceof NotLoggedInError)&&!(err instanceof SessionExpiredError)){ctx.warn(`\u9001\u4FE1\
|
|
54
|
+
\u306E\u7D50\u679C\u3092\u53D7\u3051\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30B5\u30FC\u30D0\u3067\u8D77\u52D5\u6E08\u307F\u306E\u3053\u3068\u304C\u3042\u308A\u307E\u3059\uFF08\u6253\u3061\u76F4\u3059\u3068\u4E8C\u91CD\u306B\u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u3057\u3046\u308B\uFF09\u3002twp agent schedule runs ${scheduleId(input,"run")} --limit 1 \u3067\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044\u3002`)}throw err}const run=runOf(body);if(run["result"]==="skippe\
|
|
55
|
+
d"){throw new ApiRejectedError(`\u898B\u9001\u3089\u308C\u307E\u3057\u305F\uFF08skip_reason=${String(run["skip_reason"]??"\u4E0D\u660E")}\u30FBrun=${String(run["run_id"])}\uFF09\u3002\u7406\u7531\u306F twp agent schedule runs ${scheduleId(input,"run")} \u3067\u3082\u78BA\u8A8D\u3067\u304D\u307E\u3059`)}if(run["result"]!=="started"){const reason=typeof run["error_message"]==="string"&&run["error_message"]!==""?`: ${run["error_message"]}`:"";throw new ApiRejectedError(`\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08result=${String(
|
|
56
|
+
run["result"])}\u30FBrun=${String(run["run_id"])}\uFF09${reason}`)}return body},plan:input=>({method:"POST",path:schedulePath(scheduleId(input,"run"),"/run")}),summarize:body=>pick(runOf(body),RUN_COLUMNS),raw:runOf,forbidden:FORBIDDEN,notes:body=>{const id=runOf(body)["session_id"];return typeof id==="string"?[`\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u8D77\u52D5\u3057\u307E\u3057\u305F\u3002\u9032\u307F\u5177\u5408\u306F twp agent session get ${id}\u3001\u4F1A\u8A71\u306F twp agent session chat ${id}\
|
|
57
|
+
\u3067\u8AAD\u3081\u307E\u3059\u3002`]:[]}};var runPaging=envelopePaging({label:`${LABEL}\u306E\u5B9F\u884C\u5C65\u6B74`});function runRows(body){envelope(body,`${LABEL}\u306E\u5B9F\u884C\u5C65\u6B74`);return runPaging.items(body)}var runsOperation={name:"runs",summary:`${LABEL}\u306E\u5B9F\u884C\u5C65\u6B74\u3092\u65B0\u3057\u3044\u9806\u306B\u4E00\u89A7\u3059\u308B\uFF08\u8D77\u52D5\u30FB\u898B\u9001\u308A\u30FB\u5931\u6557\u3068\u7406\u7531\u30FB\u30BB\u30C3\u30B7\u30E7\u30F3\u30FBPR\uFF09`,
|
|
58
|
+
usage:"twp agent schedule runs <\u5B9A\u671F\u5B9F\u884C> [--all] [--limit <\u4EF6\u6570>] [--cursor <\u30AB\u30FC\u30BD\u30EB>]",description:`${SCHEDULE_REF_HELP}
|
|
59
|
+
1\u5B9F\u884C\uFF1D1\u884C\u3067\u3059\u3002result \u306F started\uFF08\u8D77\u52D5\uFF09/ skipped\uFF08\u898B\u9001\u308A\u30FBskip_reason \u306B\u7406\u7531\uFF09/ start_failed\uFF08\u8D77\u52D5\u5931\u6557\uFF09\u3067\u3059\u3002
|
|
60
|
+
--output json \u306F API \u304C\u8FD4\u3059\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\uFF08\u6D88\u8CBB\u30AF\u30EC\u30B8\u30C3\u30C8\u7B49\uFF09\u3092\u51FA\u3057\u307E\u3059\u3002--output table / text / tsv \u306F\u8981\u7D04\u5217\uFF08${RUN_COLUMNS.join(" / ")}\uFF09\u3067\u3059\u3002
|
|
61
|
+
|
|
62
|
+
`+LIST_PAGING_HELP,flags:[...LIST_FLAGS],paging:runPaging,plan(input){const limit=positiveInteger(input.flags,"--limit");if(limit!==void 0&&limit>RUNS_MAX_LIMIT)throw new UsageError(`--limit \u306F 1\u301C${RUNS_MAX_LIMIT} \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${limit}`,"\u5168\u4EF6\u306F --all \u3067\u8FBF\u308C\u307E\u3059\u3002");return{method:"GET",path:schedulePath(scheduleId(input,"runs"),"/runs"),query:{limit,cursor:nonEmpty(input.flags,"--cursor")}}},summarize:body=>runRows(
|
|
63
|
+
body).map(row=>pick(row,RUN_COLUMNS)),raw:runRows,forbidden:FORBIDDEN,notes:body=>runRows(body).length===0?["\u5B9F\u884C\u5C65\u6B74\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002"]:[]};var scheduleResource={name:"schedule",summary:"\u5B9A\u671F\u5B9F\u884C\uFF08\u5B9A\u7FA9\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u30FB\u6709\u52B9\u5316/\u7121\u52B9\u5316\u30FB\u524A\u9664\u30FB\u4ECA\u3059\u3050\u5B9F\u884C\u30FB\u5B9F\u884C\u5C65\u6B74\uFF09",operations:[listOperation,getOperation,createOperation,
|
|
64
|
+
updateOperation,toggleOperation(true),toggleOperation(false),deleteOperation,runOperation,runsOperation]};var SESSION_COLUMNS=["sessionId","status","repositoryFullName","baseBranch","workBranch","prUrl","aiModel","myRole","createdAt"];var SESSION_GET_COLUMNS=["sessionId","status","repositoryFullName","repositoryId","baseBranch","workBranch","branchName","prUrl","errorMessage","aiProvider","aiModel","sessionMode","executionMode","masterUserName","myRole","createdAt","updatedAt","completedAt","instructions"];var CHAT_COLUMNS=["timestamp","role","user_name","content"];var REPOSITORY_COLUMNS=["id","full\
|
|
65
|
+
_name","default_branch","private"];var BRANCH_COLUMNS=["name","protected"];var DIFF_COLUMNS=["path","status","additions","deletions"];var INSTRUCTION_MAX_CHARS2=1e4;var ACTIVE=new Set(["created","pending","provisioning","running"]);var FAILED=new Set(["failed","cancelled","expired"]);var WAIT_POLL_INTERVAL_MS=5e3;var WAIT_DEFAULT_SECONDS=300;var WAIT_MAX_SECONDS=540;var WAIT_CHAT_SCAN_LIMIT=2e3;var sleep=ms=>new Promise(resolve=>setTimeout(resolve,ms));var SESSION_REF_HELP="<\u30BB\u30C3\u30B7\u30E7\u30F3> \u306F\u30BB\u30C3\u30B7\u30E7\u30F3 ID\uFF08twp\
|
|
66
|
+
agent session list \u306E sessionId \u5217\uFF09\u3067\u3059\u3002";var CREDIT_CONFIRMATION2="AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u3059\u308B\u64CD\u4F5C";function usageOf2(op){return`twp agent ${op} help`}function noArgs2(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(" ")}`,usageOf2(op))}function single(input,op,label,hint){const values=input.args.map(arg=>arg.trim());if(values.
|
|
67
|
+
length>1)throw new UsageError(`${op} \u304C\u53D7\u3051\u53D6\u308C\u308B\u5F15\u6570\u306F ${label} \u3060\u3051\u3067\u3059: ${values.slice(1).join(" ")}`,usageOf2(op));const value=values[0]??"";if(value==="")throw new UsageError(`${label}\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044`,usageOf2(op));if(!isSafePathSegment(value))throw new UsageError(`${label}\u3068\u3057\u3066\u4F7F\u3048\u306A\u3044\u5024\u3067\u3059: ${value}`,hint);return value}function sessionId(input,op){return single(
|
|
68
|
+
input,`session ${op}`,"<\u30BB\u30C3\u30B7\u30E7\u30F3>","\u30BB\u30C3\u30B7\u30E7\u30F3 ID \u306F twp agent session list \u306E sessionId \u5217\u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002")}function sessionPath(id,suffix=""){return`${AGENT_SESSIONS_PATH}/${encodeURIComponent(id)}${suffix}`}function envelope2(body,what){if(!isRecord(body)||body["result"]!==true)throw new ApiResponseError(`${what}\u306E\u5FDC\u7B54\u306E\u5F62\u304C\u60F3\u5B9A\u3068\u9055\u3044\u307E\u3059\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);
|
|
69
|
+
return body}function sessionOf(body,what){const session=envelope2(body,what)["session"];if(!isRecord(session)||typeof session["sessionId"]!=="string"){throw new ApiResponseError(`${what}\u306E\u5FDC\u7B54\u306B session.sessionId \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return session}function listOf(body,key,what){const value=envelope2(body,what)[key];if(!Array.isArray(value))throw new ApiResponseError(`${what}\u306E\u5FDC\u7B54\u306B\
|
|
70
|
+
${key} \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return value}function limitIn(input,max){const limit=positiveInteger(input.flags,"--limit");if(limit!==void 0&&limit>max)throw new UsageError(`--limit \u306F 1\u301C${max} \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${limit}`);return limit}function refusedBeforeSending(err){return err instanceof ApiError&&err.status>=400&&err.status<500||err instanceof
|
|
71
|
+
NotLoggedInError||err instanceof SessionExpiredError}var WAIT_FLAG={name:"--wait",summary:"runner \u306E\u4F5C\u696D\u304C\u6B62\u307E\u308B\uFF08\u5B8C\u4E86\u30FB\u5931\u6557\u30FB\u5165\u529B\u5F85\u3061\uFF09\u307E\u3067\u5F85\u3061\u3001\u6700\u5F8C\u306E\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u767A\u8A00\u30FB\u4F5C\u696D\u30D6\u30E9\u30F3\u30C1\u30FBPR URL \u3092\u51FA\u3059",takesValue:false};var TIMEOUT_FLAG={name:"--timeout",summary:`--wait \u3067\u5F85\u3064\u4E0A\u9650\u306E\u79D2\u6570\uFF08\u65E2\u5B9A ${WAIT_DEFAULT_SECONDS}\
|
|
72
|
+
\u30FB\u6700\u5927 ${WAIT_MAX_SECONDS}\uFF09`,takesValue:true,placeholder:"<\u79D2>"};function waitSeconds(input,op){const timeout=positiveInteger(input.flags,TIMEOUT_FLAG.name);if(!input.flags.has(WAIT_FLAG.name)){if(timeout!==void 0)throw new UsageError("--timeout \u306F --wait \u3068\u4E00\u7DD2\u306B\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",usageOf2(op));return void 0}if(timeout!==void 0&&timeout>WAIT_MAX_SECONDS){throw new UsageError(`--timeout \u306F ${WAIT_MAX_SECONDS} \u79D2\u4EE5\u4E0B\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\
|
|
73
|
+
\u3044\uFF08\u305D\u308C\u3088\u308A\u9577\u304F\u5F85\u3064\u306A\u3089 --wait \u3092\u5916\u3057\u3001\u3042\u3068\u3067 twp agent session get \u3067\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044\uFF09`,usageOf2(op))}return timeout??WAIT_DEFAULT_SECONDS}function chatRows(body){return listOf(body,"messages","\u30C1\u30E3\u30C3\u30C8")}function lastAssistant(rows){for(let i=rows.length-1;i>=0;i--){const row=rows[i];if(isRecord(row)&&row["role"]==="assistant"&&typeof row["content"]==="string"){
|
|
74
|
+
return{role:"assistant",content:row["content"],timestamp:typeof row["timestamp"]==="string"?row["timestamp"]:""}}}return null}function isAfter(timestamp,since){if(since===null)return true;const a=Date.parse(timestamp);const b=Date.parse(since);return!Number.isNaN(a)&&!Number.isNaN(b)&&a>b}async function waitForSession(ctx,id,seconds,since){const deadline=Date.now()+seconds*1e3;const hint=`twp agent session get ${id}`;ctx.warn(`runner \u306E\u4F5C\u696D\u304C\u6B62\u307E\u308B\u306E\u3092\u5F85\u3061\u307E\u3059\uFF08${WAIT_POLL_INTERVAL_MS/
|
|
75
|
+
1e3} \u79D2\u304A\u304D\u30FB\u6700\u5927 ${seconds} \u79D2\uFF09\u3002`);for(;;){await sleep(WAIT_POLL_INTERVAL_MS);let session;try{session=sessionOf(await ctx.send({method:"GET",path:sessionPath(id)}),"\u30BB\u30C3\u30B7\u30E7\u30F3");const status=String(session["status"]);if(FAILED.has(status)){const reason=typeof session["errorMessage"]==="string"&&session["errorMessage"]!==""?`: ${session["errorMessage"]}`:"";throw new ApiRejectedError(`\u30BB\u30C3\u30B7\u30E7\u30F3\u304C ${status} \u3067\u7D42\u308F\u308A\u307E\u3057\u305F${reason}\
|
|
76
|
+
\u3002\u4F1A\u8A71\u306F twp agent session chat ${id} \u3067\u8AAD\u3081\u307E\u3059`)}if(!ACTIVE.has(status)){const last=lastAssistant(chatRows(await ctx.send({method:"GET",path:sessionPath(id,"/chat-messages"),query:{limit:WAIT_CHAT_SCAN_LIMIT}})));if(last!==null&&isAfter(last.timestamp,since))return{session,last};if(since===null)return{session,last}}}catch(err){if(err instanceof ApiRejectedError)throw err;ctx.warn(`\u6307\u793A\u306F\u53D7\u3051\u4ED8\u3051\u6E08\u307F\u3067\u3059\u304C\u3001\u5F85\u3064\u9014\u4E2D\u3067\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u6253\u3061\u76F4\u3059\u524D\u306B ${hint}\
|
|
77
|
+
\u3067\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044\u3002`);if(err instanceof NetworkError||err instanceof ApiResponseError||err instanceof ApiError&&(err.status>=500||err.status===429)){throw new WaitTimeoutError(`\u5F85\u3064\u9014\u4E2D\u3067\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${err.message}\uFF09\u3002\u4F5C\u696D\u306F\u53D7\u3051\u4ED8\u3051\u6E08\u307F\u3067\u3059\u3002\u6253\u3061\u76F4\u3055\u305A ${hint} \u3067\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044`)}
|
|
78
|
+
throw err}if(Date.now()>=deadline){const status=String(session["status"]);throw new WaitTimeoutError(ACTIVE.has(status)?`${seconds} \u79D2\u5F85\u3061\u307E\u3057\u305F\u304C\u4F5C\u696D\u304C\u6B62\u307E\u308A\u307E\u305B\u3093\u3067\u3057\u305F\uFF08status=${status}\uFF09\u3002\u3042\u3068\u3067 ${hint} \u3068 twp agent session chat ${id} \u3067\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044\uFF08\u4F5C\u696D\u306F runner \u4E0A\u3067\u7D9A\u3044\u3066\u3044\u307E\u3059\uFF09`:`${seconds} \u79D2\u5F85\u3061\
|
|
79
|
+
\u307E\u3057\u305F\u304C\u3001\u9001\u3063\u305F\u6307\u793A\u3088\u308A\u5F8C\u306E\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u767A\u8A00\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08status=${status}\uFF09\u3002twp agent session chat ${id} \u3067\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044\uFF08\u6B62\u307E\u3063\u305F\u307E\u307E\u306A\u3089 twp agent session resume \u3067\u518D\u958B\u3067\u304D\u307E\u3059\uFF09`)}}}function startedOf(body,what){const data=envelope2(body,
|
|
80
|
+
what);const session=data["session"];if(session!==void 0&&session!==null&&!isRecord(session))throw new ApiResponseError(`${what}\u306E\u5FDC\u7B54\u306E session \u304C\u60F3\u5B9A\u3068\u9055\u3044\u307E\u3059\u3002`);const ts=data["timestamp"];return{session:isRecord(session)?session:null,timestamp:typeof ts==="string"?ts:null,last_assistant_message:typeof data["last_assistant_message"]==="string"?data["last_assistant_message"]:null,last_assistant_at:typeof data["last_assistant_at"]==="string"?data["\
|
|
81
|
+
last_assistant_at"]:null}}function startedRaw(what){return body=>startedOf(body,what)}function startedSummary(what){return body=>{const started=startedOf(body,what);const session=started.session??{};return{sessionId:session["sessionId"]??null,status:session["status"]??null,workBranch:session["workBranch"]??session["branchName"]??null,prUrl:session["prUrl"]??null,last_assistant_message:started.last_assistant_message}}}function startedDocument(what){return body=>{const started=startedOf(body,what);
|
|
82
|
+
const session=started.session??{};const lines=[started.last_assistant_message??"\uFF08\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u306E\u767A\u8A00\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\uFF09",""];for(const key of["sessionId","status","workBranch","branchName","prUrl","errorMessage"]){const value=session[key];if(value!==null&&value!==void 0&&value!=="")lines.push(`${key}: ${String(value)}`)}return`${lines.join("\n")}
|
|
83
|
+
`}}function startedNotes(op){return(body,input)=>{const started=startedOf(body,op);const id=started.session?.["sessionId"]??input.args[0]??"<\u30BB\u30C3\u30B7\u30E7\u30F3>";if(input.flags.has(WAIT_FLAG.name))return[];return[`runner \u306F\u975E\u540C\u671F\u3067\u52D5\u304D\u307E\u3059\u3002\u9032\u307F\u5177\u5408\u306F twp agent session get ${String(id)}\u3001\u4F1A\u8A71\u306F twp agent session chat ${String(id)} \u3067\u8AAD\u3081\u307E\u3059\uFF08--wait \u3092\u4ED8\u3051\u308B\u3068\u6B62\u307E\u308B\u307E\u3067\u5F85\u3061\u307E\u3059\uFF09\u3002`]}}
|
|
84
|
+
function waitPlannedNotes(input,idHint){return["\u9001\u308B\u3068\u30C6\u30CA\u30F3\u30C8\u306E AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u3057\u307E\u3059\uFF08runner \u304C AI \u3092\u547C\u3076\u305F\u3081\uFF09",...input.flags.has(WAIT_FLAG.name)?[`\u7D9A\u3051\u3066 GET ${AGENT_SESSIONS_PATH}/${idHint} \u3092 ${WAIT_POLL_INTERVAL_MS/1e3} \u79D2\u304A\u304D\u306B\u9001\u308A\u3001\u6B62\u307E\u3063\u305F\u3089\u30C1\u30E3\u30C3\u30C8\u30921\u56DE\u8AAD\u307F\u307E\u3059`]:[]]}async function sendAndMaybeWait(input,ctx,plan,op,idFrom){
|
|
85
|
+
const seconds=waitSeconds(input,op);let sent;try{sent=await ctx.send(plan)}catch(err){if(op==="session instruct"&&err instanceof ApiError&&err.status===400&&String(err.body?.error_description??"").includes("\u53D7\u3051\u4ED8\u3051\u3089\u308C\u308B\u72B6\u614B\u3067\u306F\u3042\u308A\u307E\u305B\u3093")){ctx.warn("\u7D42\u308F\u3063\u305F\u30BB\u30C3\u30B7\u30E7\u30F3\u306B\u306F\u6307\u793A\u3092\u9001\u308C\u307E\u305B\u3093\u3002twp agent session resume <\u30BB\u30C3\u30B7\u30E7\u30F3> --body-file <\u30D1\u30B9> --yes \u3067\u518D\u958B\u306E\u6307\u793A\u3068\u3057\u3066\u9001\u308C\u307E\u3059\u3002")}
|
|
86
|
+
if(!refusedBeforeSending(err)){ctx.warn("\u9001\u4FE1\u306E\u7D50\u679C\u3092\u53D7\u3051\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30B5\u30FC\u30D0\u3067\u53D7\u3051\u4ED8\u3051\u6E08\u307F\u306E\u3053\u3068\u304C\u3042\u308A\u307E\u3059\uFF08\u6253\u3061\u76F4\u3059\u3068\u4E8C\u91CD\u306B\u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u3057\u3046\u308B\uFF09\u3002twp agent session list \u3067\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044\u3002")}throw err}const data=envelope2(
|
|
87
|
+
sent,op);if(isRecord(data["session"])&&FAILED.has(String(data["session"]["status"]))){const failed=data["session"];const reason=typeof failed["errorMessage"]==="string"&&failed["errorMessage"]!==""?`: ${failed["errorMessage"]}`:"";throw new ApiRejectedError(`\u30BB\u30C3\u30B7\u30E7\u30F3\u306F ${String(failed["status"])} \u3067\u3059${reason}\uFF08session=${String(failed["sessionId"])}\uFF09`)}const base={result:true,session:isRecord(data["session"])?data["session"]:null,timestamp:typeof data["\
|
|
88
|
+
timestamp"]==="string"?data["timestamp"]:null,last_assistant_message:null,last_assistant_at:null};if(seconds===void 0)return base;const id=idFrom(data);const since=op==="session create"?null:base["timestamp"]??new Date().toISOString();const{session,last}=await waitForSession(ctx,id,seconds,since);return{...base,session,last_assistant_message:last?.content??null,last_assistant_at:last?.timestamp??null}}var sessionPaging=envelopePaging({label:"\u30BB\u30C3\u30B7\u30E7\u30F3\u4E00\u89A7"});function sessionRows(body){
|
|
89
|
+
envelope2(body,"\u30BB\u30C3\u30B7\u30E7\u30F3\u4E00\u89A7");return sessionPaging.items(body)}var REPOSITORY_FLAG2={name:"--repository",summary:"\u30EA\u30DD\u30B8\u30C8\u30EA\uFF08owner/repo\u30FB\u540D\u524D\u30FBID\u3002twp agent repository list \u3067\u78BA\u8A8D\u3067\u304D\u308B\uFF09",takesValue:true,placeholder:"<owner/repo>"};async function resolveRepository(input,ctx,ref,flag){const repo=await ctx.resolver.agentRepository(ref,flag);if(!isSafePathSegment(repo.id))throw new UsageError(`\u30EA\
|
|
90
|
+
\u30DD\u30B8\u30C8\u30EA ID \u3068\u3057\u3066\u4F7F\u3048\u306A\u3044\u5024\u3067\u3059: ${repo.id}`);return withResolved(input,{repositoryId:repo.id})}var sessionListOperation={name:"list",summary:"\u30B3\u30F3\u30C6\u30CA\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u4E00\u89A7\u3059\u308B\uFF08\u81EA\u5206\u304C\u30DE\u30B9\u30BF\u30FC\u304B\u30E1\u30F3\u30D0\u30FC\u306E\u3082\u306E\u30FB\u65B0\u3057\u3044\u9806\uFF09",usage:"twp agent session list [--status \
|
|
91
|
+
<\u72B6\u614B>] [--repository <owner/repo>] [--all] [--limit <\u4EF6\u6570>] [--cursor <\u30AB\u30FC\u30BD\u30EB>]",description:`\u81EA\u5206\u304C\u30DE\u30B9\u30BF\u30FC\uFF08\u8D77\u52D5\u3057\u305F\u4EBA\uFF09\u304B\u30E1\u30F3\u30D0\u30FC\u3068\u3057\u3066\u53C2\u52A0\u3057\u3066\u3044\u308B\u30BB\u30C3\u30B7\u30E7\u30F3\u3060\u3051\u304C\u51FA\u307E\u3059\u3002
|
|
92
|
+
--status \u306F pending / provisioning / running / completed / failed / cancelled \u7B49\u306E\u72B6\u614B\u3067\u7D5E\u308A\u307E\u3059\u3002
|
|
93
|
+
|
|
94
|
+
--output json \u306F API \u304C\u8FD4\u3059\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u51FA\u3057\u307E\u3059\uFF08\u6307\u793A\u6587\u30FB\u30B7\u30B9\u30C6\u30E0\u30D7\u30ED\u30F3\u30D7\u30C8\u30FB\u6DFB\u4ED8\u306E\u4E00\u89A7\u3092\u542B\u3080\uFF09\u3002
|
|
95
|
+
--output table / text / tsv \u306F\u8981\u7D04\u5217\uFF08${SESSION_COLUMNS.join(" / ")}\uFF09\u3067\u3059\u3002
|
|
96
|
+
|
|
97
|
+
`+LIST_PAGING_HELP,flags:[...LIST_FLAGS,{name:"--status",summary:"\u72B6\u614B\u3067\u7D5E\u308A\u8FBC\u3080",takesValue:true,placeholder:"<\u72B6\u614B>"},REPOSITORY_FLAG2],paging:sessionPaging,async prepare(input,ctx){noArgs2(input,"session list");limitIn(input,100);const repo=nonEmpty(input.flags,REPOSITORY_FLAG2.name);return repo===void 0?input:resolveRepository(input,ctx,repo,REPOSITORY_FLAG2.name)},plan:input=>({method:"GET",path:AGENT_SESSIONS_PATH,query:{status:nonEmpty(input.flags,"--st\
|
|
98
|
+
atus"),repositoryId:input.resolved?.["repositoryId"],limit:limitIn(input,100),cursor:nonEmpty(input.flags,"--cursor")}}),summarize:body=>sessionRows(body).map(row=>pick(row,SESSION_COLUMNS)),raw:sessionRows,notes:body=>sessionRows(body).length===0?["\u6761\u4EF6\u306B\u4E00\u81F4\u3059\u308B\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093\u3002"]:[]};var sessionGetOperation={name:"get",summary:"\u30BB\u30C3\u30B7\u30E7\u30F31\u4EF6\u306E\u72B6\u614B\u30FB\u4F5C\u696D\u30D6\u30E9\u30F3\u30C1\u30FBPR \u3092\u8868\u793A\u3059\u308B",
|
|
99
|
+
usage:"twp agent session get <\u30BB\u30C3\u30B7\u30E7\u30F3>",description:`${SESSION_REF_HELP}
|
|
100
|
+
\u53C2\u52A0\u3057\u3066\u3044\u306A\u3044\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u300C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u300D\u306B\u306A\u308A\u307E\u3059\u3002
|
|
101
|
+
|
|
102
|
+
--output json \u306F API \u304C\u8FD4\u3059\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u51FA\u3057\u307E\u3059\u3002`,flags:[],plan:input=>({method:"GET",path:sessionPath(sessionId(input,"get"))}),summarize:body=>pick(sessionOf(body,"\u30BB\u30C3\u30B7\u30E7\u30F3"),SESSION_GET_COLUMNS),raw:body=>sessionOf(body,"\u30BB\u30C3\u30B7\u30E7\u30F3")};var INSTRUCTIONS_SPEC={flag:"--instructions",fileFlag:"--instructions-file",label:"\u521D\u671F\u6307\u793A",maxChars:INSTRUCTION_MAX_CHARS2,usage:"twp a\
|
|
103
|
+
gent session create --repository <owner/repo> --instructions-file <\u30D1\u30B9> --yes"};var BODY_SPEC={flag:"--body",fileFlag:"--body-file",label:"\u6307\u793A",maxChars:INSTRUCTION_MAX_CHARS2,usage:"twp agent session instruct <\u30BB\u30C3\u30B7\u30E7\u30F3> --body-file <\u30D1\u30B9> --yes"};var sessionCreateOperation={name:"create",summary:"\u30EA\u30DD\u30B8\u30C8\u30EA\u3067\u4F5C\u696D\u3059\u308B\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u8D77\u52D5\u3059\u308B\uFF08AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u30FB--yes \u304C\u8981\u308B\u30FB--wait \u3067\u6B62\u307E\u308B\u307E\u3067\u5F85\u3064\uFF09",
|
|
104
|
+
usage:"twp agent session create --repository <owner/repo> (--instructions-file <\u30D1\u30B9> | --instructions <\u6587>) [--base <\u30D6\u30E9\u30F3\u30C1>] [--model <\u30E2\u30C7\u30EB>] [--wait [--timeout <\u79D2>]] --yes",description:`\u753B\u9762\u306E\u300C\u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3\u300D\u3068\u540C\u3058 POST /api/v2/agent/sessions \u3092\u9001\u308A\u307E\u3059\u3002runner \u304C\u8D77\u52D5\u3057\u3066\u30EA\u30DD\u30B8\u30C8\u30EA\u3092\u53D6\u5F97\u3057\u3001
|
|
105
|
+
\u4F5C\u696D\u30D6\u30E9\u30F3\u30C1\uFF08agent/task-<\u30BB\u30C3\u30B7\u30E7\u30F3ID>\uFF09\u3067\u6307\u793A\u3069\u304A\u308A\u306B\u4F5C\u696D\u3057\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u306E AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u3057\u307E\u3059\u3002
|
|
106
|
+
--repository \u306F twp agent repository list \u306E full_name\uFF08owner/repo\uFF09\u304B id \u3067\u3059\u3002
|
|
107
|
+
--base \u3092\u7701\u304F\u3068\u3001\u30B5\u30FC\u30D0\u304C\u30EA\u30DD\u30B8\u30C8\u30EA\u306E\u65E2\u5B9A\u306E\u30D6\u30E9\u30F3\u30C1\u3092\u4F7F\u3044\u307E\u3059\u3002--model \u3092\u7701\u304F\u3068\u30B5\u30FC\u30D0\u306E\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3067\u3059\u3002
|
|
108
|
+
--wait \u3092\u4ED8\u3051\u308B\u3068 5 \u79D2\u304A\u304D\u306B\u72B6\u614B\u3092\u5F15\u304D\u3001\u4F5C\u696D\u304C\u6B62\u307E\u3063\u305F\u3089\u6700\u5F8C\u306E\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u767A\u8A00\u30FB\u4F5C\u696D\u30D6\u30E9\u30F3\u30C1\u30FBPR URL \u3092\u51FA\u3057\u307E\u3059
|
|
109
|
+
\uFF08failed / cancelled / expired \u306A\u3089\u7D42\u4E86\u30B3\u30FC\u30C9 3\u3001--timeout \u79D2\u3067\u6B62\u307E\u3089\u306A\u3051\u308C\u3070\u7D42\u4E86\u30B3\u30FC\u30C9 6\uFF1D\u672A\u5B8C\u4E86\u30FB\u6253\u3061\u76F4\u3055\u306A\u3044\u3002\u65E2\u5B9A ${WAIT_DEFAULT_SECONDS} \u79D2\u30FB\u6700\u5927 ${WAIT_MAX_SECONDS} \u79D2\uFF09\u3002
|
|
110
|
+
\u6307\u793A\u6587\u306F\u6539\u884C\u3084 Markdown \u3092\u58CA\u3055\u306A\u3044\u3088\u3046 --instructions-file \u3067\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\uFF08- \u3067\u6A19\u6E96\u5165\u529B\uFF09\u3002`,destructive:true,confirmation:CREDIT_CONFIRMATION2,flags:[REPOSITORY_FLAG2,{name:"--base",summary:"\u4F5C\u696D\u306E\u8D77\u70B9\u306B\u3059\u308B\u30D6\u30E9\u30F3\u30C1\uFF08twp agent repository branches \u3067\u78BA\u8A8D\u3067\u304D\u308B\uFF09",takesValue:true,placeholder:"<\u30D6\u30E9\u30F3\u30C1\
|
|
111
|
+
>"},{name:INSTRUCTIONS_SPEC.fileFlag,summary:"\u521D\u671F\u6307\u793A\u3092\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u8AAD\u3080\uFF08- \u3067\u6A19\u6E96\u5165\u529B\uFF09",takesValue:true,placeholder:"<\u30D1\u30B9>"},{name:INSTRUCTIONS_SPEC.flag,summary:"\u521D\u671F\u6307\u793A\u3092\u76F4\u63A5\u6E21\u3059\uFF08\u6539\u884C\u3092\u542B\u3080\u306A\u3089 --instructions-file\uFF09",takesValue:true,placeholder:"<\u6587>"},{name:"--model",summary:"AI \u30E2\u30C7\u30EB\uFF08claude \u306E\u30E2\u30C7\u30EB\u306E\u307F\u30FB\u7701\u7565\u6642\u306F\u30B5\u30FC\u30D0\u306E\u65E2\u5B9A\uFF09",
|
|
112
|
+
takesValue:true,placeholder:"<\u30E2\u30C7\u30EB>"},WAIT_FLAG,TIMEOUT_FLAG],async prepare(input,ctx){noArgs2(input,"session create");waitSeconds(input,"session create");const repo=nonEmpty(input.flags,REPOSITORY_FLAG2.name);if(repo===void 0)throw new UsageError("--repository \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","\u30EA\u30DD\u30B8\u30C8\u30EA\u306F twp agent repository list \u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002");const instructions=await readBody(input,INSTRUCTIONS_SPEC);
|
|
113
|
+
if(instructions===void 0)throw new UsageError("\u521D\u671F\u6307\u793A\u3092 --instructions-file \u304B --instructions \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",INSTRUCTIONS_SPEC.usage);return withResolved(await resolveRepository(input,ctx,repo,REPOSITORY_FLAG2.name),{instructions})},plan:input=>({method:"POST",path:AGENT_SESSIONS_PATH,body:{repositoryId:requireResolved(input,"repositoryId"),instructions:requireResolved(input,"instructions"),...nonEmpty(input.flags,"--base")!==void 0?
|
|
114
|
+
{baseBranch:nonEmpty(input.flags,"--base")}:{},...nonEmpty(input.flags,"--model")!==void 0?{aiModel:nonEmpty(input.flags,"--model")}:{}}}),plannedNotes:input=>waitPlannedNotes(input,"{\u4F5C\u6210\u3057\u305F\u30BB\u30C3\u30B7\u30E7\u30F3ID}"),execute:(input,ctx)=>sendAndMaybeWait(input,ctx,sessionCreateOperation.plan(input),"session create",data=>{const session=data["session"];const id=isRecord(session)?session["sessionId"]:void 0;if(typeof id!=="string"||!isSafePathSegment(id))throw new ApiResponseError(
|
|
115
|
+
"\u30BB\u30C3\u30B7\u30E7\u30F3\u4F5C\u6210\u306E\u5FDC\u7B54\u306B session.sessionId \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002");return id}),summarize:startedSummary("\u30BB\u30C3\u30B7\u30E7\u30F3\u4F5C\u6210"),raw:startedRaw("\u30BB\u30C3\u30B7\u30E7\u30F3\u4F5C\u6210"),document:startedDocument("\u30BB\u30C3\u30B7\u30E7\u30F3\u4F5C\u6210"),notes:startedNotes("\u30BB\u30C3\u30B7\u30E7\u30F3\u4F5C\u6210")};var sessionInstructOperation={
|
|
116
|
+
name:"instruct",summary:"\u52D5\u3044\u3066\u3044\u308B\u30BB\u30C3\u30B7\u30E7\u30F3\u3078\u8FFD\u52A0\u306E\u6307\u793A\u3092\u9001\u308B\uFF08AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u30FB--yes \u304C\u8981\u308B\u30FB--wait \u3067\u7B54\u3048\u3092\u5F85\u3064\uFF09",usage:"twp agent session instruct <\u30BB\u30C3\u30B7\u30E7\u30F3> (--body-file <\u30D1\u30B9> | --body <\u6587>) [--wait [--timeout <\u79D2>]] --yes",description:`${SESSION_REF_HELP}
|
|
117
|
+
\u753B\u9762\u306E\u30C1\u30E3\u30C3\u30C8\u6B04\u304B\u3089\u9001\u308B\u306E\u3068\u540C\u3058 POST /api/v2/agent/sessions/{id}/instructions \u3067\u3059\u3002\u767A\u8A00\u8005\u306F\u3042\u306A\u305F\u3068\u3057\u3066\u8A18\u9332\u3055\u308C\u307E\u3059\u3002
|
|
118
|
+
\u30BB\u30C3\u30B7\u30E7\u30F3\u304C running / pending / \u5165\u529B\u5F85\u3061\u306E\u3068\u304D\u3060\u3051\u53D7\u3051\u4ED8\u3051\u307E\u3059\uFF08\u7D42\u308F\u3063\u305F\u30BB\u30C3\u30B7\u30E7\u30F3\u306F twp agent session resume \u3067\u518D\u958B\u3057\u307E\u3059\uFF09\u3002
|
|
119
|
+
--wait \u3092\u4ED8\u3051\u308B\u3068\u3001\u9001\u3063\u305F\u6642\u523B\u3088\u308A\u5F8C\u306E\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u767A\u8A00\u304C\u51FA\u3066\u4F5C\u696D\u304C\u6B62\u307E\u308B\u307E\u3067\u5F85\u3061\u307E\u3059\u3002`,destructive:true,confirmation:CREDIT_CONFIRMATION2,flags:[{name:BODY_SPEC.fileFlag,summary:"\u6307\u793A\u3092\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u8AAD\u3080\uFF08- \u3067\u6A19\u6E96\u5165\u529B\uFF09",takesValue:true,placeholder:"<\u30D1\u30B9>"},{name:BODY_SPEC.
|
|
120
|
+
flag,summary:"\u6307\u793A\u3092\u76F4\u63A5\u6E21\u3059\uFF08\u6539\u884C\u3092\u542B\u3080\u306A\u3089 --body-file\uFF09",takesValue:true,placeholder:"<\u6587>"},WAIT_FLAG,TIMEOUT_FLAG],async prepare(input){sessionId(input,"instruct");waitSeconds(input,"session instruct");const body=await readBody(input,BODY_SPEC);if(body===void 0)throw new UsageError("\u6307\u793A\u3092 --body-file \u304B --body \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",BODY_SPEC.usage);return withResolved(input,
|
|
121
|
+
{instruction:body})},plan:input=>({method:"POST",path:sessionPath(sessionId(input,"instruct"),"/instructions"),body:{instruction:requireResolved(input,"instruction")}}),plannedNotes:input=>waitPlannedNotes(input,input.args[0]??"<\u30BB\u30C3\u30B7\u30E7\u30F3>"),execute:(input,ctx)=>sendAndMaybeWait(input,ctx,sessionInstructOperation.plan(input),"session instruct",()=>sessionId(input,"instruct")),summarize:startedSummary("\u6307\u793A\u306E\u9001\u4FE1"),raw:startedRaw("\u6307\u793A\u306E\u9001\u4FE1"),
|
|
122
|
+
document:startedDocument("\u6307\u793A\u306E\u9001\u4FE1"),notes:startedNotes("\u6307\u793A\u306E\u9001\u4FE1")};var RESUME_SPEC={...BODY_SPEC,label:"\u518D\u958B\u306E\u6307\u793A",usage:"twp agent session resume <\u30BB\u30C3\u30B7\u30E7\u30F3> [--body-file <\u30D1\u30B9>] --yes"};var sessionResumeOperation={name:"resume",summary:"\u6B62\u307E\u3063\u305F\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u518D\u958B\u3059\u308B\uFF08AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u30FB--yes \u304C\u8981\u308B\u30FB--body-file \u3067\u518D\u958B\u306E\u6307\u793A\uFF09",
|
|
123
|
+
usage:"twp agent session resume <\u30BB\u30C3\u30B7\u30E7\u30F3> [--body-file <\u30D1\u30B9> | --body <\u6587>] [--wait [--timeout <\u79D2>]] --yes",description:`${SESSION_REF_HELP}
|
|
124
|
+
\u753B\u9762\u306E\u300C\u518D\u958B\u300D\u3068\u540C\u3058 POST /api/v2/agent/sessions/{id}/resume \u3067\u3059\u3002runner \u3092\u8D77\u52D5\u3057\u76F4\u3057\u3001\u4F5C\u696D\u30D6\u30E9\u30F3\u30C1\u306E\u7D9A\u304D\u304B\u3089\u4F5C\u696D\u3057\u307E\u3059\u3002
|
|
125
|
+
\u518D\u958B\u306E\u6307\u793A\u306F\u4EFB\u610F\u3067\u3059\uFF08\u7701\u304F\u3068\u524D\u56DE\u306E\u7D9A\u304D\u3092\u518D\u958B\u3057\u307E\u3059\uFF09\u3002`,destructive:true,confirmation:CREDIT_CONFIRMATION2,flags:[{name:BODY_SPEC.fileFlag,summary:"\u518D\u958B\u306E\u6307\u793A\u3092\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u8AAD\u3080\uFF08- \u3067\u6A19\u6E96\u5165\u529B\uFF09",takesValue:true,placeholder:"<\u30D1\u30B9>"},{name:BODY_SPEC.flag,summary:"\u518D\u958B\u306E\u6307\u793A\u3092\u76F4\u63A5\u6E21\u3059",
|
|
126
|
+
takesValue:true,placeholder:"<\u6587>"},WAIT_FLAG,TIMEOUT_FLAG],async prepare(input){sessionId(input,"resume");waitSeconds(input,"session resume");const body=await readBody(input,RESUME_SPEC);return body===void 0?input:withResolved(input,{resumeInstruction:body})},plan:input=>{const instruction=input.resolved?.["resumeInstruction"];return{method:"POST",path:sessionPath(sessionId(input,"resume"),"/resume"),body:instruction===void 0?{}:{resumeInstruction:instruction}}},plannedNotes:input=>waitPlannedNotes(
|
|
127
|
+
input,input.args[0]??"<\u30BB\u30C3\u30B7\u30E7\u30F3>"),execute:(input,ctx)=>sendAndMaybeWait(input,ctx,sessionResumeOperation.plan(input),"session resume",()=>sessionId(input,"resume")),summarize:startedSummary("\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u518D\u958B"),raw:startedRaw("\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u518D\u958B"),document:startedDocument("\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u518D\u958B"),notes:startedNotes("\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u518D\u958B")};function messageOf2(body,what){
|
|
128
|
+
const data=envelope2(body,what);return{message:typeof data["message"]==="string"?data["message"]:null}}var sessionCancelOperation={name:"cancel",summary:"\u52D5\u3044\u3066\u3044\u308B\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u6B62\u3081\u308B\uFF08runner \u3092\u505C\u6B62\u3059\u308B\u3002\u8A18\u9332\u306F\u6B8B\u308A\u3001resume \u3067\u518D\u958B\u3067\u304D\u308B\uFF09",usage:"twp agent session cancel <\u30BB\u30C3\u30B7\u30E7\u30F3>",description:`${SESSION_REF_HELP}
|
|
129
|
+
\u753B\u9762\u306E\u300C\u505C\u6B62\u300D\u3068\u540C\u3058 DELETE /api/v2/agent/sessions/{id} \u3067\u3059\u3002\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u8A18\u9332\u306F\u6D88\u3048\u307E\u305B\u3093\uFF08\u6D88\u3059\u306E\u306F delete\uFF09\u3002`,flags:[],plan:input=>({method:"DELETE",path:sessionPath(sessionId(input,"cancel"))}),summarize:body=>messageOf2(body,"\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u505C\u6B62"),raw:body=>messageOf2(body,"\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u505C\u6B62")};var sessionDeleteOperation={
|
|
130
|
+
name:"delete",summary:"\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u524A\u9664\u3059\u308B\uFF08\u30DE\u30B9\u30BF\u30FC\u306E\u307F\u30FB\u53D6\u308A\u6D88\u305B\u306A\u3044\u30FB--yes \u304C\u8981\u308B\uFF09",usage:"twp agent session delete <\u30BB\u30C3\u30B7\u30E7\u30F3> --yes",description:`${SESSION_REF_HELP}
|
|
131
|
+
DELETE /api/v2/agent/sessions/{id}/delete\u3002\u8D77\u52D5\u3057\u305F\u672C\u4EBA\uFF08\u30DE\u30B9\u30BF\u30FC\uFF09\u3060\u3051\u304C\u524A\u9664\u3067\u304D\u307E\u3059\u3002\u4F5C\u696D\u30D6\u30E9\u30F3\u30C1\u30FBPR \u306F GitHub \u306B\u6B8B\u308A\u307E\u3059\u3002`,destructive:true,flags:[],plan:input=>({method:"DELETE",path:sessionPath(sessionId(input,"delete"),"/delete")}),summarize:body=>messageOf2(body,"\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u524A\u9664"),raw:body=>messageOf2(body,"\u30BB\
|
|
132
|
+
\u30C3\u30B7\u30E7\u30F3\u306E\u524A\u9664")};var logPaging=envelopePaging({label:"\u30BB\u30C3\u30B7\u30E7\u30F3\u30ED\u30B0",itemsKey:"logs",readCursor:body=>{const record=isRecord(body)?body:{};return{hasMore:record["hasMore"],cursor:record["nextCursor"]}}});function logRows(body){envelope2(body,"\u30BB\u30C3\u30B7\u30E7\u30F3\u30ED\u30B0");return logPaging.items(body)}var sessionLogsOperation={name:"logs",summary:"\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u5B9F\u884C\u30ED\u30B0\uFF08runner \u306E\u30A4\u30D9\u30F3\u30C8\uFF09\u3092\u4E00\u89A7\u3059\u308B",
|
|
133
|
+
usage:"twp agent session logs <\u30BB\u30C3\u30B7\u30E7\u30F3> [--all] [--limit <\u4EF6\u6570>] [--cursor <\u30AB\u30FC\u30BD\u30EB>]",description:`${SESSION_REF_HELP}
|
|
134
|
+
--output json \u306F API \u304C\u8FD4\u3059\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u51FA\u3057\u307E\u3059\u3002
|
|
135
|
+
|
|
136
|
+
${LIST_PAGING_HELP}`,flags:[...LIST_FLAGS],paging:logPaging,plan:input=>({method:"GET",path:sessionPath(sessionId(input,"logs"),"/logs"),query:{limit:positiveInteger(input.flags,"--limit"),cursor:nonEmpty(input.flags,"--cursor")}}),summarize:body=>logRows(body),raw:logRows,notes:body=>logRows(body).length===0?["\u30ED\u30B0\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002"]:[]};function chatSummary(row){const metadata=isRecord(row)&&isRecord(row["metadata"])?row["metadata"]:{};return{...pick(
|
|
137
|
+
row,["timestamp","role","content"]),user_name:metadata["userName"]??null}}var sessionChatOperation={name:"chat",summary:"\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u4F1A\u8A71\uFF08\u6307\u793A\u3068\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u306E\u767A\u8A00\u30FB\u30D5\u30A1\u30A4\u30EB\u5909\u66F4\uFF09\u3092\u53E4\u3044\u9806\u306B\u8868\u793A\u3059\u308B",usage:"twp agent session chat <\u30BB\u30C3\u30B7\u30E7\u30F3> [--limit <\u4EF6\u6570>]",description:`${SESSION_REF_HELP}
|
|
138
|
+
--limit \u306F\u30B5\u30FC\u30D0\u304C**\u53E4\u3044\u5074\u304B\u3089**\u8D70\u67FB\u3059\u308B\u30ED\u30B0\u306E\u4EF6\u6570\u3067\u3059\uFF08\u65E2\u5B9A 100\uFF09\u3002\u30C4\u30FC\u30EB\u306E\u30ED\u30B0\u3082\u6570\u3048\u3066\u304B\u3089\u4F1A\u8A71\u3060\u3051\u3092\u6B8B\u3059\u306E\u3067\u3001
|
|
139
|
+
\u9577\u3044\u30BB\u30C3\u30B7\u30E7\u30F3\u3067\u306F\u65E2\u5B9A\u306E\u307E\u307E\u3060\u3068\u6700\u8FD1\u306E\u767A\u8A00\u307E\u3067\u5C4A\u304D\u307E\u305B\u3093\u3002\u6700\u5F8C\u307E\u3067\u8AAD\u3080\u306B\u306F --limit \u3092\u5927\u304D\u304F\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u306EAPI\u306B\u30DA\u30FC\u30B8\u30F3\u30B0\u306F\u3042\u308A\u307E\u305B\u3093\u3002
|
|
140
|
+
--output text \u306F1\u767A\u8A00\u30921\u6BB5\u843D\u306B\u3057\u3066\u8AAD\u3081\u308B\u5F62\u3067\u51FA\u3057\u307E\u3059\u3002
|
|
141
|
+
|
|
142
|
+
--output json \u306F API \u304C\u8FD4\u3059\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u51FA\u3057\u307E\u3059\u3002--output table / tsv \u306F\u8981\u7D04\u5217\uFF08${CHAT_COLUMNS.join(" / ")}\uFF09\u3067\u3059\u3002`,flags:[{name:"--limit",summary:"\u30B5\u30FC\u30D0\u304C\u53E4\u3044\u5074\u304B\u3089\u8D70\u67FB\u3059\u308B\u30ED\u30B0\u306E\u4EF6\u6570\uFF08\u65E2\u5B9A 100\uFF09",takesValue:true,placeholder:"<\u4EF6\u6570>"}],plan:input=>({method:"GET",path:sessionPath(sessionId(input,"cha\
|
|
143
|
+
t"),"/chat-messages"),query:{limit:positiveInteger(input.flags,"--limit")}}),summarize:body=>chatRows(body).map(chatSummary).map(row=>pick(row,CHAT_COLUMNS)),raw:chatRows,document(body){const blocks=chatRows(body).map(row=>{const s=chatSummary(row);const who=s["role"]==="user"?`user${s["user_name"]!==null?`\uFF08${String(s["user_name"])}\uFF09`:""}`:String(s["role"]??"");return`[${String(s["timestamp"]??"")}] ${who}
|
|
144
|
+
${String(s["content"]??"")}`});return blocks.length===0?"\uFF08\u4F1A\u8A71\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\uFF09\n":`${blocks.join("\n\n")}
|
|
145
|
+
`},notes:body=>chatRows(body).length===0?["\u4F1A\u8A71\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\uFF08runner \u304C\u8D77\u52D5\u4E2D\u304B\u3001\u4F1A\u8A71\u306E\u4FDD\u5B58\u5148\u306B\u5C4A\u3044\u3066\u3044\u307E\u305B\u3093\uFF09\u3002"]:[]};function diffOf(body){return envelope2(body,"Git \u306E\u5DEE\u5206")["gitDiff"]??null}function diffFiles(body){const diff=diffOf(body);if(diff===null)return[];if(Array.isArray(diff))return diff;if(isRecord(diff)&&Array.isArray(diff["files"]))return diff["\
|
|
146
|
+
files"];throw new ApiResponseError("Git \u306E\u5DEE\u5206\u306E\u5FDC\u7B54\u306B files \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}var sessionDiffOperation={name:"diff",summary:"\u4F5C\u696D\u30D6\u30E9\u30F3\u30C1\u306E\u5909\u66F4\u30D5\u30A1\u30A4\u30EB\uFF08\u8D77\u70B9\u30D6\u30E9\u30F3\u30C1\u3068\u306E\u5DEE\u5206\uFF09\u3092\u8868\u793A\u3059\u308B",usage:"twp agent session diff <\u30BB\u30C3\u30B7\u30E7\u30F3>",
|
|
147
|
+
description:`${SESSION_REF_HELP}
|
|
148
|
+
--output table / tsv \u306F\u5909\u66F4\u30D5\u30A1\u30A4\u30EB1\u4EF6\uFF1D1\u884C\uFF08${DIFF_COLUMNS.join(" / ")}\uFF09\u3001--output text \u306F unified diff \u306E\u672C\u6587\u3067\u3059\u3002
|
|
149
|
+
--output json \u306F API \u306E gitDiff\uFF08diff \u672C\u6587\u30FBfiles\u30FBbaseBranch\uFF09\u3092\u305D\u306E\u307E\u307E\u51FA\u3057\u307E\u3059\uFF08runner \u304C\u307E\u3060\u5DEE\u5206\u3092\u5831\u544A\u3057\u3066\u3044\u306A\u3051\u308C\u3070 null\uFF09\u3002`,flags:[],plan:input=>({method:"GET",path:sessionPath(sessionId(input,"diff"),"/git-diff")}),summarize:body=>diffFiles(body).map(row=>pick(row,DIFF_COLUMNS)),raw:diffOf,document(body){const diff=diffOf(body);const text=isRecord(diff)&&
|
|
150
|
+
typeof diff["diff"]==="string"?diff["diff"]:"";return text===""?"\uFF08\u5DEE\u5206\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\n":text.endsWith("\n")?text:`${text}
|
|
151
|
+
`},notes:body=>diffOf(body)===null?["\u5DEE\u5206\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\uFF08runner \u304C\u307E\u3060\u5909\u66F4\u3092\u5831\u544A\u3057\u3066\u3044\u307E\u305B\u3093\uFF09\u3002"]:diffFiles(body).length===0?["\u5909\u66F4\u30D5\u30A1\u30A4\u30EB\u306F\u3042\u308A\u307E\u305B\u3093\u3002"]:[]};function repositoryRows(body){return listOf(body,"list","\u30EA\u30DD\u30B8\u30C8\u30EA\u4E00\u89A7")}var repositoryListOperation={name:"list",summary:"\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u8D77\u52D5\u3067\u304D\u308B\u30EA\u30DD\u30B8\u30C8\u30EA\u3092\u4E00\u89A7\u3059\u308B\uFF08\u53C2\u52A0\u30D7\
|
|
152
|
+
\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u7D10\u3065\u3044\u305F\u3082\u306E\uFF09",usage:"twp agent repository list",description:`\u30C6\u30CA\u30F3\u30C8\u306B\u9023\u643A\u3057\u305F GitHub \u30EA\u30DD\u30B8\u30C8\u30EA\u306E\u3046\u3061\u3001\u3042\u306A\u305F\u304C\u53C2\u52A0\u3059\u308B\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u7D10\u3065\u3044\u305F\u3082\u306E\u3060\u3051\u304C\u51FA\u307E\u3059\u3002
|
|
153
|
+
\u3053\u306E API \u306F\u30DA\u30FC\u30B8\u30F3\u30B0\u3092\u6301\u305F\u305A\u3001\u5168\u4EF6\u3092\u8FD4\u3057\u307E\u3059\u3002
|
|
154
|
+
|
|
155
|
+
--output table / text / tsv \u306F\u8981\u7D04\u5217\uFF08${REPOSITORY_COLUMNS.join(" / ")}\uFF09\u3067\u3059\u3002`,flags:[],plan(input){noArgs2(input,"repository list");return{method:"GET",path:AGENT_REPOSITORIES_PATH}},summarize:body=>repositoryRows(body).map(row=>pick(row,REPOSITORY_COLUMNS)),raw:repositoryRows,notes:body=>repositoryRows(body).length===0?["\u8D77\u52D5\u3067\u304D\u308B\u30EA\u30DD\u30B8\u30C8\u30EA\u306F\u3042\u308A\u307E\u305B\u3093\uFF08GitHub \u9023\u643A\u304C\u672A\u8A2D\u5B9A\u304B\u3001\u53C2\u52A0\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u30EA\u30DD\u30B8\u30C8\u30EA\u304C\u7D10\u3065\u3044\u3066\u3044\u307E\u305B\u3093\uFF09\u3002"]:
|
|
156
|
+
[]};var repositoryBranchesOperation={name:"branches",summary:"\u30EA\u30DD\u30B8\u30C8\u30EA\u306E\u30D6\u30E9\u30F3\u30C1\u3092\u4E00\u89A7\u3059\u308B\uFF08--base \u306B\u6E21\u305B\u308B\u540D\u524D\uFF09",usage:"twp agent repository branches <\u30EA\u30DD\u30B8\u30C8\u30EA>",description:"<\u30EA\u30DD\u30B8\u30C8\u30EA> \u306F twp agent repository list \u306E full_name\uFF08owner/repo\uFF09\u304B id \u3067\u3059\u3002",flags:[],async prepare(input,ctx){const values=input.args.map(arg=>arg.trim());
|
|
157
|
+
if(values.length!==1||values[0]==="")throw new UsageError("<\u30EA\u30DD\u30B8\u30C8\u30EA>\u30921\u3064\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",usageOf2("repository branches"));return resolveRepository(input,ctx,values[0],"<\u30EA\u30DD\u30B8\u30C8\u30EA>")},plan:input=>({method:"GET",path:`${AGENT_REPOSITORIES_PATH}/${encodeURIComponent(requireResolved(input,"repositoryId"))}/branches`}),summarize:body=>listOf(body,"list","\u30D6\u30E9\u30F3\u30C1\u4E00\u89A7").map(row=>pick(row,BRANCH_COLUMNS)),
|
|
158
|
+
raw:body=>listOf(body,"list","\u30D6\u30E9\u30F3\u30C1\u4E00\u89A7")};var sessionResource={name:"session",summary:"\u30BB\u30C3\u30B7\u30E7\u30F3\uFF08\u8D77\u52D5\u30FB\u6307\u793A\u30FB\u518D\u958B\u30FB\u505C\u6B62\u30FB\u524A\u9664\u30FB\u72B6\u614B\u30FB\u4F1A\u8A71\u30FB\u30ED\u30B0\u30FB\u5DEE\u5206\uFF09",operations:[sessionListOperation,sessionGetOperation,sessionCreateOperation,sessionInstructOperation,sessionResumeOperation,sessionCancelOperation,sessionDeleteOperation,sessionLogsOperation,
|
|
159
|
+
sessionChatOperation,sessionDiffOperation]};var repositoryResource={name:"repository",summary:"\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u8D77\u52D5\u3067\u304D\u308B\u30EA\u30DD\u30B8\u30C8\u30EA\u3068\u305D\u306E\u30D6\u30E9\u30F3\u30C1",operations:[repositoryListOperation,repositoryBranchesOperation]};var agentDomain={name:"agent",summary:"\u30B3\u30F3\u30C6\u30CA\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\uFF08\u30EA\u30DD\u30B8\u30C8\u30EA\u3067\u4F5C\u696D\u3059\u308B AI \u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u8D77\u52D5\u30FB\u6307\u793A\u30FB\u76E3\u8996\u3068\u5B9A\u671F\u5B9F\u884C\uFF09",
|
|
160
|
+
operations:[],subresources:[sessionResource,repositoryResource,scheduleResource]};export{WAIT_POLL_INTERVAL_MS,agentDomain};
|