@tocca-systems/twp-cli 0.92.0 → 0.94.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.public.md +12 -0
  2. package/README.md +81 -3
  3. package/dist/{agent-SX7Z5BVN.js → agent-JNWPWVHF.js} +1 -1
  4. package/dist/{agent-loop-QV7WHT7B.js → agent-loop-ED3PVMVI.js} +2 -2
  5. package/dist/{ai-dispatch-YPQGMOBK.js → ai-dispatch-FVHIWBCX.js} +2 -2
  6. package/dist/{analysis-6MPLKJUS.js → analysis-UP5QD5OD.js} +2 -2
  7. package/dist/{announcement-4ZK63ONY.js → announcement-A3J2DYSQ.js} +1 -1
  8. package/dist/{api-command-K6I3WSI4.js → api-command-VZRYCDYJ.js} +3 -3
  9. package/dist/api-key-YSHTZPY2.js +66 -0
  10. package/dist/{app-Z6NIVNWQ.js → app-VDQDKYEU.js} +5 -5
  11. package/dist/{attendance-correct-X67ITW3J.js → attendance-correct-GBJUPRTU.js} +2 -2
  12. package/dist/{attendance-lists-RVJIQAAM.js → attendance-lists-BIGQFPVN.js} +1 -1
  13. package/dist/{backlog-ZHON6HED.js → backlog-VJWLVDSM.js} +1 -1
  14. package/dist/{budget-FEEEYUX2.js → budget-VUMWU762.js} +2 -2
  15. package/dist/{capacity-list-command-GFHEKY47.js → capacity-list-command-CPUOR57V.js} +1 -1
  16. package/dist/{chunk-SZOEBJGI.js → chunk-24AJQUDZ.js} +1 -1
  17. package/dist/{chunk-NELPXRBC.js → chunk-3E7QVTKD.js} +1 -1
  18. package/dist/{chunk-RZA3PZNH.js → chunk-42XM4ZF6.js} +1 -1
  19. package/dist/{chunk-VROESTZQ.js → chunk-4557EX6E.js} +1 -1
  20. package/dist/{chunk-3UOVTIM6.js → chunk-45WIRMGL.js} +1 -1
  21. package/dist/{chunk-6DM366P6.js → chunk-4DOPQ74T.js} +51 -47
  22. package/dist/{chunk-Y4U3F4UM.js → chunk-4JJFIPTI.js} +2 -2
  23. package/dist/{chunk-RY27USNC.js → chunk-4YCX5UNV.js} +1 -1
  24. package/dist/{chunk-IXT2X5BZ.js → chunk-5TKHN3A5.js} +6 -6
  25. package/dist/{chunk-PBMHUH73.js → chunk-5WJWURQT.js} +1 -1
  26. package/dist/chunk-5YJSWKQG.js +18 -0
  27. package/dist/{chunk-N3I76TL6.js → chunk-6CALO6LE.js} +1 -1
  28. package/dist/{chunk-FLLSRBFZ.js → chunk-6FPW6T4P.js} +1 -1
  29. package/dist/{chunk-VBIZ6U7C.js → chunk-6HR26FNC.js} +1 -1
  30. package/dist/{chunk-M763HXDH.js → chunk-A3VGBVQP.js} +1 -1
  31. package/dist/{chunk-NXPLTDN4.js → chunk-BABZL52A.js} +9 -9
  32. package/dist/chunk-C7MCP63I.js +51 -0
  33. package/dist/{chunk-JBAVETQP.js → chunk-DMMSNDDD.js} +1 -1
  34. package/dist/{chunk-BPLDHTAS.js → chunk-EOXGQHZA.js} +1 -1
  35. package/dist/{chunk-HZNC2UFL.js → chunk-FLIY4GM2.js} +1 -1
  36. package/dist/{chunk-GLOGPK4Y.js → chunk-ILEV32T6.js} +1 -1
  37. package/dist/{chunk-6EQLA56A.js → chunk-INS77QHY.js} +1 -1
  38. package/dist/chunk-MP36JZRV.js +12 -0
  39. package/dist/{settings-command-TEVH2MNY.js → chunk-MTK4WY54.js} +12 -11
  40. package/dist/{chunk-BROJYH74.js → chunk-MZB4KA26.js} +1 -1
  41. package/dist/chunk-NJL3H2BB.js +7 -0
  42. package/dist/{chunk-D6MAASMD.js → chunk-O6GAIXHJ.js} +1 -1
  43. package/dist/{chunk-3D734ED2.js → chunk-P54LCXEY.js} +1 -1
  44. package/dist/{chunk-4DUZIRGL.js → chunk-PTLUNRQS.js} +10 -10
  45. package/dist/chunk-QBUVJBZ2.js +13 -0
  46. package/dist/{chunk-MQOHOOJP.js → chunk-SPQJNTAK.js} +1 -1
  47. package/dist/{chunk-NB2GXB27.js → chunk-SQMJ7XKE.js} +1 -1
  48. package/dist/{chunk-ELW4VTSK.js → chunk-TUFWQYKB.js} +1 -1
  49. package/dist/{chunk-3S52X3Z7.js → chunk-VHKZ6RUA.js} +1 -1
  50. package/dist/{chunk-IQL7NZKM.js → chunk-VRRDGI2I.js} +1 -1
  51. package/dist/chunk-X3F7DOP5.js +4 -0
  52. package/dist/{chunk-VOSADZUE.js → chunk-XG2MNO5M.js} +3 -3
  53. package/dist/{chunk-7UAJ3ZY7.js → chunk-YB4ZDJXR.js} +1 -1
  54. package/dist/cli.js +52 -12
  55. package/dist/{commands-MNYRRJBT.js → commands-G3KAD2J7.js} +2 -2
  56. package/dist/{commands-23GMSCTQ.js → commands-VUDISST6.js} +37 -34
  57. package/dist/{company-YFHD4RLP.js → company-HUP72FGC.js} +2 -2
  58. package/dist/{completion-KPMCNLV2.js → completion-INVEPDAF.js} +6 -5
  59. package/dist/{contract-C7PTM573.js → contract-WE37KVDC.js} +2 -2
  60. package/dist/{department-JZVWFUCI.js → department-5V4W37PU.js} +1 -1
  61. package/dist/{deposit-NUWEBC7M.js → deposit-VI3KTO7N.js} +2 -2
  62. package/dist/{dispatch-GSBMRWQ4.js → dispatch-ZRC3TVFT.js} +1 -1
  63. package/dist/{domain-knowledge-QDSWQW4E.js → domain-knowledge-NOORBHDM.js} +1 -1
  64. package/dist/{estimate-GJEDV3D5.js → estimate-5GPJ33DO.js} +4 -4
  65. package/dist/{evaluation-KQPTG4G3.js → evaluation-5Q5GHKM3.js} +2 -2
  66. package/dist/{expense-NFQY5NZN.js → expense-F5UUXTGV.js} +1 -1
  67. package/dist/faq-QBCNTMXP.js +122 -0
  68. package/dist/{fiscal-year-GL3RFX6H.js → fiscal-year-CVYFYGRR.js} +1 -1
  69. package/dist/{holiday-FUYMZVGX.js → holiday-UPF22P5V.js} +2 -2
  70. package/dist/{inquiry-XMM6EHNJ.js → inquiry-57RLTCK2.js} +1 -1
  71. package/dist/{invoice-MLJEVQA4.js → invoice-FL42M3A4.js} +2 -2
  72. package/dist/{job-title-JHTVL7OO.js → job-title-LEHO7TBW.js} +1 -1
  73. package/dist/{knowledge-MROBIUE5.js → knowledge-CELSHUX6.js} +2 -2
  74. package/dist/{leave-GXVOULRK.js → leave-7BXZEIEQ.js} +2 -2
  75. package/dist/{license-XUPFMAGX.js → license-YOBNOTSR.js} +1 -1
  76. package/dist/{login-history-JIWV62KF.js → login-history-RCUHEEYE.js} +1 -1
  77. package/dist/{logout-guard-HUCILXP7.js → logout-guard-PEETWT4A.js} +1 -1
  78. package/dist/{media-FKKQA223.js → media-3NPBMB7J.js} +3 -3
  79. package/dist/{notification-YAT6O2TK.js → notification-BE6KRW5R.js} +1 -1
  80. package/dist/{oneshot-HV5VMNFX.js → oneshot-2V5GL6OA.js} +1 -1
  81. package/dist/orientation-command-PQ3QXDPE.js +25 -0
  82. package/dist/{outlook-GXWQLCR6.js → outlook-RWEUIFAI.js} +2 -2
  83. package/dist/{plan-submit-I5QAVNZN.js → plan-submit-7724A3OV.js} +2 -2
  84. package/dist/{position-33HC7ETC.js → position-YAC32O37.js} +1 -1
  85. package/dist/{project-O6TQKZBJ.js → project-EQQEF622.js} +2 -2
  86. package/dist/{prospect-LQ2RLIBN.js → prospect-C3OWZPUJ.js} +1 -1
  87. package/dist/{purchase-E25SBHR2.js → purchase-7NN4SIER.js} +3 -3
  88. package/dist/{receivable-M3IUSRB7.js → receivable-4UCQ5G4R.js} +1 -1
  89. package/dist/{redmine-OIBKHGK3.js → redmine-THH5YMND.js} +1 -1
  90. package/dist/{registry-QHNBNSNA.js → registry-Z6LO3TZY.js} +1 -1
  91. package/dist/{render-BY4KHD5D.js → render-XILFR4N3.js} +1 -1
  92. package/dist/{report-TS7D6YF5.js → report-TQRJJEGK.js} +1 -1
  93. package/dist/{run-AHNWMLZ4.js → run-EJT5I7NM.js} +2 -2
  94. package/dist/{runner-command-GN45H7TL.js → runner-command-PIHQW65P.js} +1 -1
  95. package/dist/{sales-ai-review-KYYUF5HG.js → sales-ai-review-JH6UAUHC.js} +2 -2
  96. package/dist/{sales-master-UNKMFZDV.js → sales-master-QF4ZGAGF.js} +3 -3
  97. package/dist/{sales-numbering-URGXUTUX.js → sales-numbering-I4CGWWLF.js} +2 -2
  98. package/dist/{search-OEOAUIW3.js → search-65MA22AA.js} +1 -1
  99. package/dist/{segment-H7FFI52Z.js → segment-PTTW7IJM.js} +1 -1
  100. package/dist/server-settings-DR3KPUCD.js +4 -0
  101. package/dist/settings-command-3SLINN5N.js +3 -0
  102. package/dist/{setup-FX2IUBHT.js → setup-ICJPTYKW.js} +1 -1
  103. package/dist/{skill-BJFHENEO.js → skill-J2HXRXLF.js} +2 -2
  104. package/dist/{skill-manage-command-Z4MLSACA.js → skill-manage-command-RKQHSPRJ.js} +2 -2
  105. package/dist/{staffing-board-2ZV2Q6TC.js → staffing-board-FSZ6WM2E.js} +3 -3
  106. package/dist/{status-command-XOELHUCV.js → status-command-5G7ZNGN2.js} +2 -2
  107. package/dist/{supplier-payment-2OVDNHBD.js → supplier-payment-OOX5NQH5.js} +3 -3
  108. package/dist/{support-6NZCSDPJ.js → support-LWKDMVP7.js} +2 -2
  109. package/dist/{task-GLFAR4GN.js → task-XF3MUGDE.js} +4 -4
  110. package/dist/{teams-KNXVEWMD.js → teams-J66HFCF5.js} +1 -1
  111. package/dist/{user-L6NYXPV6.js → user-PWZUOZGI.js} +43 -22
  112. package/dist/{user-contract-type-2PUE2JQL.js → user-contract-type-XM4G3TX5.js} +1 -1
  113. package/dist/{user-group-EIYVFUTB.js → user-group-5V3L7WYR.js} +1 -1
  114. package/dist/{worker-agent-2BARDPDL.js → worker-agent-G6MC436V.js} +1 -1
  115. package/dist/{workflow-P4SJX6YR.js → workflow-KTXVWCPN.js} +2 -2
  116. package/package.json +1 -1
  117. package/dist/chunk-EOXTDZTA.js +0 -13
  118. package/dist/chunk-ISLZWSHN.js +0 -17
  119. package/dist/chunk-JQQP7JLQ.js +0 -4
  120. package/dist/chunk-LGNYEROA.js +0 -12
  121. package/dist/chunk-UVTOBRHP.js +0 -49
  122. package/dist/faq-QVRTJ3KS.js +0 -68
  123. package/dist/server-settings-TFVXMOJB.js +0 -4
@@ -11,6 +11,18 @@
11
11
  `CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
12
12
  -->
13
13
 
14
+ ## 0.94.0
15
+
16
+ `twp task-loop orientation` で、計画AIへ渡す「志向性」(軸ごとの重み 0〜100 と全体の ON/OFF)を表示・変更できるようになりました。OFF にしても値は保持され、ON に戻すと元の値で渡ります。`settings pull|push` でも扱えます。
17
+
18
+ ## 0.93.0
19
+
20
+ `twp faq notion-import` で、Notion のデータベースから社内FAQを取り込めるようになりました(対応付けの確認・変換結果のプレビュー・進捗の確認・キャンセルを含みます)。
21
+
22
+ `twp user default-permission` で、新しく入るユーザーに付く既定の機能権限を確認・変更できるようになりました(組織管理者のみ)。指定しなかった機能は変わらず、既存ユーザーの権限も変わりません。
23
+
24
+ `twp api-key` で、テナントの API キー(外部システム連携用)の一覧・作成・更新・有効/無効の切り替え・削除ができるようになりました(組織管理者のみ)。作成したキーはファイルに保存するか画面に表示するかを選べます。
25
+
14
26
  ## 0.92.0
15
27
 
16
28
  `twp user-group` で、ユーザーグループの一覧・作成・更新と、メンバーの追加・削除ができるようになりました(管理者のみ)。指定しなかった項目やほかのメンバーは変わりません。
package/README.md CHANGED
@@ -23,6 +23,7 @@ TWP(Tocca Working Platform)を、ターミナルから使うための CLI
23
23
  | **できる** | `twp user` によるテナントのユーザーの作成・更新・失効(退社)と招待(1件・CSV 一括・再送・取消)、ユーザーと所属(部署・役職)の参照(一覧・取得・所属の履歴)、所属の付け替え(異動)・作成・更新・終了・削除、在籍者の棚卸と人事台帳 CSV との突き合わせ、`twp login-history` によるログイン履歴の一覧(期間・ユーザー・IP・結果で絞り込み)と集計、`twp audit-log` による監査ログ(誰がいつ何を変えたか)の一覧・集計・CSV 出力。作成・更新・招待と取得、所属の書き込み、他人の所属の参照、棚卸、ログイン履歴、監査ログは組織管理者の権限が要ります |
24
24
  | **できる** | `twp skill` / `twp qualification` によるスキルマスタ・資格マスタの一覧、スキル・スキルカテゴリの作成・更新・削除とカテゴリ内の並び替え、資格マスタの作成・更新・削除と CSV 一括登録・資格制度の説明文の更新(いずれも管理者のみ)、スキルマップの表示(部署で絞り込める)とスキル保有者の横断検索(所属付き)、自分のスキルプロファイルへの自己評価の提出(`--yes` が要ります)、`twp user skills` / `qualifications` / `trainings` / `contracts` によるユーザーのスキル評価・保有資格・研修受講履歴・雇用契約の参照。スキルマップと横断検索は HR管理者、雇用契約は原価管理者か管理者、研修履歴は人事管理の権限が要ります |
25
25
  | **できる** | `twp department` / `twp position` / `twp job-title` / `twp segment` / `twp user-contract-type` / `twp fiscal-year` による組織マスタ(部署・役職・職位・セグメント・契約形態・事業年度設定)の一覧・取得・作成・更新・削除、`twp holiday` / `twp business-hours` によるカレンダーマスタ(祝日・営業日)の読み書きと CSV の出し入れと、部署ツリー・部署の所属者の表示。作成・更新・削除は管理者の権限が要ります |
26
+ | **できる** | `twp api-key` によるテナント API キー(外部システムが `X-API-Key` で問い合わせ作成・CMS 公開 API を呼ぶためのキー)の一覧・詳細・作成・更新・有効/無効・削除と、付与できる権限の一覧。組織管理者の権限が要ります |
26
27
  | **できる** | `twp user-group` によるユーザーグループの一覧・取得・作成・更新と、メンバーの一覧・追加・外す操作。取得・作成・更新とメンバーの操作は管理者の権限が要ります(グループの削除はサーバに無いので、表示区分を非表示にして外します) |
27
28
  | **できる** | `twp inquiry category` による問い合わせカテゴリの一覧・取得・作成・更新(通知先の設定・末尾への並べ替えを含む)。取得・作成・更新は問い合わせ機能の管理者の権限が要ります |
28
29
  | **できる** | `twp evaluation` / `twp goal-sheet` による人事評価と目標シートの読み取り(評価期間・見てよい範囲の評価と目標シートの一覧・部下の評価の状況・評価の詳細とプロジェクト別評価・自分の目標シート・受け取ったフィードバック)と書き込み(目標シートの書き換え・提出、評価段の入力、フィードバックの下書き保存・送信・公開、`twp project evaluation create` によるプロジェクトでの要員評価の作成)、評価期間の作成・変更・削除・締め・締め解除、評価基準(A〜E の説明)の表示・置き換え、`twp role-template` による役割テンプレートの一覧・作成・変更・削除。評価期間・評価基準・役割テンプレートの書き込みは管理者の権限が要ります |
@@ -31,7 +32,7 @@ TWP(Tocca Working Platform)を、ターミナルから使うための CLI
31
32
  | **できる** | `twp worker-agent` によるワーカーエージェント(AIエージェント)の参照(一覧・詳細・スケジュールと次回実行予定・許可できるツールのカタログ・実行回数の上限と今日の使用数)と、実行履歴・実行結果(最終要約を先頭に)・ステップログ・ステップの集計の読み取りと、作成・更新(スケジュール指定込み)・削除・有効化/無効化・今すぐ実行(`--wait` で終わるまで待つ)・実行の取消 |
32
33
  | **できる** | `twp search` による TWP 内のコンテンツ(タスク・Wiki・ノート・議事録・FAQ・サポート・ワークフロー等)の横断検索(通常検索と `--ai` の AI検索・種類/プロジェクト/タグ/状態/カテゴリで絞り込み)と、検索できる種類の一覧。閲覧権限の無いものは出ません |
33
34
  | **できる** | `twp announcement` による自分に届いているお知らせ(運営・組織)の一覧(未読・確認待ち・語で絞り込み)・本文と返信の表示・未読件数、既読化(1件ずつ・まとめて)・「確認しました」の記録・返信の一覧と投稿 |
34
- | **できる** | `twp faq` による社内FAQの一覧(語・カテゴリで絞り込み)・質問と回答の表示・質問文からの検索(根拠のFAQまで。回答文は作りません)・カテゴリの一覧と、登録・更新・削除・添付(添付ファイル欄・本文へ差し込む画像/PDF)。公開対象に含まれるFAQだけが見え、書き込みは「社内FAQ管理」の管理者の権限が要ります |
35
+ | **できる** | `twp faq` による社内FAQの一覧(語・カテゴリで絞り込み)・質問と回答の表示・質問文からの検索(根拠のFAQまで。回答文は作りません)・カテゴリの一覧と、登録・更新・削除・添付(添付ファイル欄・本文へ差し込む画像/PDF)・Notion データベースからの取り込み(`twp faq notion-import`)。公開対象に含まれるFAQだけが見え、書き込みは「社内FAQ管理」の管理者の権限が要ります |
35
36
  | **できる** | `twp agent session` によるコンテナエージェント(リポジトリで作業する AI セッション)の起動・追加の指示・再開・停止・削除と、状態・作業ブランチ・PR・会話・実行ログ・変更ファイル(差分)の参照、`twp agent repository` による起動できるリポジトリとブランチの一覧、`twp agent schedule` による定期実行の定義の作成・更新・有効化/無効化・削除・今すぐ実行と実行履歴の参照。`--wait` で作業が止まるまで待ち、最後のアシスタント発言・作業ブランチ・PR URL を出します。起動・指示・再開は AI クレジットを消費します |
36
37
  | **できる** | `twp estimate` / `twp invoice` による販売管理の見積・請求の一覧(語・ステータス・取引先・プロジェクト・担当者・日付・回収状況で絞り込み)と詳細。販売管理・顧客管理の権限が要ります |
37
38
  | **できる** | `twp estimate` による見積の作成・更新・削除・社内共有メモ・既存の請求の紐づけ・関連入金・部署按分・案件書類(注文書・個別契約書など)の登録・版の差替え・ダウンロードと、注文書からの注文書番号の読み取り・見積書/注文書/注文請書の PDF の書き出し。販売管理・顧客管理の権限が要ります |
@@ -63,6 +64,7 @@ TWP(Tocca Working Platform)を、ターミナルから使うための CLI
63
64
  | **できる** | `twp media duplicate list` による内容が同じファイルの検出とアップロード前の同名検査 |
64
65
  | **できる** | `twp storage get` によるストレージ使用量の確認(管理者) |
65
66
  | **できる** | `twp user permission list` / `twp user permission update` による機能権限の参照と変更(1人・CSV 一括。送る前に変更内容とライセンスの増減を表示し、空きが足りなければ止まる。組織管理者) |
67
+ | **できる** | `twp user default-permission list` / `twp user default-permission update` による、新しく入る人(作成・招待・SSO の自動作成)に付く既定の機能権限の参照と変更(指定しない機能はいまの値のまま。既存ユーザーの権限は変わらない。組織管理者) |
66
68
  | **できる** | `twp license list` / `twp license assignments` によるシートライセンスの棚卸(機能ごとの枠・使用数・空き・削減予約、割当者の所属・最終ログインと「失効済み・権限 none・長期未ログインなのに割当が残っている」の判定。組織管理者) |
67
69
  | **できる** | `twp attendance` による自分の勤怠の参照(いまの打刻状態・打刻の履歴・月の勤怠表)と打刻・打刻修正(過去の時刻での打刻・メモの変更・取り消し・プロジェクトの付け替え)、勤怠連絡の一覧・登録・変更・削除、チームの勤怠状況・フレックス精算の参照、管理者向けの残業サマリ(36協定を含む)・締め状況の参照 |
68
70
  | **できる** | `twp leave` による有給の残日数・取得履歴・付与履歴の参照と有給の申請(`twp leave request`)、`twp workchange list` / `twp shift list` による月の勤務変更・シフトの参照(`--me` で自分の分・無ければ全員分=勤怠の管理者) |
@@ -473,6 +475,22 @@ E0012,Wiki管理,editor
473
475
  - 権限は変わったがサーバがライセンスの更新に失敗した件があれば、結果を出したうえで終了コード 3 で終わります
474
476
  - 変更が本人の画面・API に効くまで最大5分ほどかかります(サーバの設定により最長30分)
475
477
 
478
+ ### 新しく入る人の既定の機能権限を変える
479
+
480
+ 組織管理者向けです。画面の「テナント設定 > 認証連携」の「ユーザー作成時デフォルト利用機能」と同じ値を読み書きします(同じ API を使います)。`twp user create` / `twp user invite` と SSO の自動作成で入る人に、この既定が付きます。
481
+
482
+ ```
483
+ twp user default-permission list # 機能ごとの既定・取れるレベル
484
+ twp user default-permission update --feature <機能> --level <レベル> [--dry-run]
485
+ twp user default-permission update --feature inquiry=member --feature workflow=none
486
+ ```
487
+
488
+ - **既定を変えても、いまいるユーザーの権限は変わりません。** 1人ずつ変えるときは `twp user permission update` を使います
489
+ - サーバの API は全機能をまとめて置き換えるため、いまの既定を読んでから**指定した機能だけを差し替えて全機能を送ります**。指定しなかった機能は変わりません(いまの既定が読めない・欠けているときは送らずに止まります)
490
+ - 機能・レベルの指定の仕方は `twp user permission update` と同じです。送る前に「どの機能が何から何へ」を stderr に出し、`--dry-run` は送る本文の全体を出して止まります
491
+ - 送ったあとはサーバが保存した値を**全機能で**確かめ、元に戻すコマンドを出します。保存された値が送った値と違う機能があれば(指定しなかった機能を含む)終了コード 3 で終わります
492
+ - 読んでから送るまでの間に別の管理者が画面で変えた値は、読んだ時点の値で上書きされます(サーバに競合の検出はありません)
493
+
476
494
  ### テナントの操作記録(監査ログ)を見る・CSV に書き出す
477
495
 
478
496
  組織管理者向けです。画面の「組織管理 > 監査ログ」と同じ記録(タスクの作成・更新・削除とコメント、プロジェクト本体・メンバーの変更)を引きます。CLI 自身の判断記録(下の「監査ログ」= `~/.twp/logs/`)とは別物です。
@@ -556,6 +574,31 @@ twp user-group member delete <グループ> --user <ユーザー> [--user <ユ
556
574
  - **グループの削除はできません**(サーバにも画面にも削除が無い)。使わなくなったグループは `update --display hidden` で選択肢から外してください
557
575
  - ヘルプは `twp user-group help` / `twp user-group member help`
558
576
 
577
+ ### テナント API キーを扱う
578
+
579
+ 外部システム(問い合わせフォーム・CMS の公開 API を呼ぶサイト等)に渡すキーです。組織管理者だけが使えます。個人の API キーとは別物です。
580
+
581
+ ```
582
+ twp api-key list [--status active|inactive]
583
+ twp api-key get <キー>
584
+ twp api-key create --name <キー名> --permission <権限> [--permission <権限>…] [--description <説明>] [--expires-at <日時>] (--key-file <パス> | --no-redact)
585
+ twp api-key update <キー> [--name <キー名>] [--description <説明> | --clear-description] [--permission <権限>…] [--expires-at <日時>]
586
+ twp api-key enable <キー>
587
+ twp api-key disable <キー>
588
+ twp api-key delete <キー> --yes
589
+
590
+ twp api-key permission list
591
+ ```
592
+
593
+ - **作成したキーの値(`twpk_…`)は作成時に1回だけ返り、あとから取り出せません。** `--key-file <パス>` でファイル(パーミッション 0600・既存のファイルは上書きしない)に書くか、`--no-redact` で画面に出すかを必ず指定してください。どちらも無いと送らずに止めます(伏字のまま作ると、値を誰も持たないキーが残るため)。`--key-file` なら画面・ログには伏字だけが残ります
594
+ - `--permission` の値は `twp api-key permission list` の `value` です。送る前に照合します。`update --permission` は権限を**指定したものだけに置き換えます**
595
+ - `disable` で止め、`enable` で戻します(状態を明示して送るので、打ち直しても逆向きにはなりません)。止めるだけでよければ `delete` ではなく `disable` を使ってください。**無効化・削除が外部 API に効くまで最大60秒かかります**
596
+ - `<キー>` は ID・名前・キーの先頭8文字(`key_prefix`。例 `twpk_AbC`)で指定できます
597
+ - **棚卸しの限界**: 作成者はサーバの応答に含まれないため表示できません。`last_used_at` は外部 API での利用では更新されず、キーを使っても空のままです(2026-10-16 実測)。退社した人が作ったキーは、名前と作成日時から割り出してください
598
+ - `--expires-at` に日付だけ(`2026-12-31`)を渡すと、**その日の 0 時(サーバの時刻)に失効します**。その日いっぱい使うなら翌日を指定するか、`2026-12-31T23:59:59+09:00` のようにタイムゾーン付きで指定してください。`update` は過去の日時も受け付けます(すぐ失効します)
599
+ - CLI からは無期限へ戻せません(期限を消しても旧期限でキーが削除されるため)。作り直してください
600
+ - ヘルプは `twp api-key help` / `twp api-key permission help`
601
+
559
602
  ### カレンダーマスタ(祝日・営業日)を扱う
560
603
 
561
604
  ```bash
@@ -1112,6 +1155,24 @@ twp faq attachment embed --file <パス> # 回答本文へ差し込む画
1112
1155
  - `--targets-file` は公開対象の JSON 配列です(`get --output json` の `visibility_targets` をそのまま使えます)
1113
1156
  - ヘルプは `twp faq help`
1114
1157
 
1158
+ ### Notion から社内FAQを取り込む
1159
+
1160
+ ```
1161
+ twp faq notion-import workspaces # 自分の Notion 連携(ワークスペースID)
1162
+ twp faq notion-import databases <ワークスペースID>
1163
+ twp faq notion-import schema <ワークスペースID> <データベースID> [--template]
1164
+ twp faq notion-import preview --workspace <ID> --database <ID> --file <対応付けJSON> [--limit <1〜5>]
1165
+ twp faq notion-import start --workspace <ID> --database <ID> --file <対応付けJSON> --yes
1166
+ twp faq notion-import tasks
1167
+ twp faq notion-import status <task_id> [--wait [--wait-timeout <秒>]]
1168
+ twp faq notion-import cancel <task_id> --yes
1169
+ ```
1170
+
1171
+ - 画面の「社内FAQ」→「Notionから取り込み」と同じ手順です。`workspaces` 以外は「社内FAQ管理」の管理者の権限が要ります
1172
+ - 対応付け(どの Notion プロパティを質問・カテゴリ・公開対象・担当者にするか、選択肢をどのカテゴリ・公開対象にするか)は `schema --template` で画面と同じ候補を JSON で出し、書き足して `--file` に渡します。知らないキー・対象が空の「対象を指定」は送る前に止めます
1173
+ - `start` は送る前に先頭5件の変換結果を表示します。同じ Notion ページから前に取り込んだ FAQ は上書き更新されます。取り込みは非同期で、`status --wait` で終わるまで待てます(0=完了・3=失敗/キャンセル・6=待機の上限)
1174
+ - ヘルプは `twp faq notion-import help`
1175
+
1115
1176
  ### メディアライブラリのファイルを扱う
1116
1177
 
1117
1178
  ```bash
@@ -2210,7 +2271,7 @@ twp task-loop charter pull --project <キー|UUID> [--out CONSTITUTION.md] #
2210
2271
 
2211
2272
  ### 憲章以外のループ設定をファイルとサーバで受け渡す
2212
2273
 
2213
- AI 割当(`ai`)・注入文面(`prompts`。憲章を除く)・ループ間隔(`loop.interval_sec`)・契約結果の意味づけ(`outcomes`)を、JSON ファイルとの間で登録・展開できます。作法は憲章(`charter`)と同じです。
2274
+ AI 割当(`ai`)・注入文面(`prompts`。憲章を除く)・ループ間隔(`loop.interval_sec`)・契約結果の意味づけ(`outcomes`)・志向性(`orientation`)を、JSON ファイルとの間で登録・展開できます。作法は憲章(`charter`)と同じです。
2214
2275
 
2215
2276
  ```bash
2216
2277
  twp task-loop settings pull --project <キー|UUID> [--out loop-settings.json] # サーバ → ファイル
@@ -2218,7 +2279,7 @@ twp task-loop settings push --project <キー|UUID> --file loop-settings.json
2218
2279
  ```
2219
2280
 
2220
2281
  - **pull は全キーを書き出します**(未設定のキーは `null`)。取得時点の `revision` も書きます。憲章は含みません(`charter pull` を使います)。既存ファイルと違うときは差分を表示し、`--yes` を付けたときだけ上書きします
2221
- - **push はファイルに書いたキーだけを変えます(部分更新)。** `ai.<キー>`・`prompts.<キー>`・`loop.<キー>` は書かれていれば置き換え、`null` なら未設定に戻します。書いていないキーと憲章は変えません。`outcomes` は書かれていれば配列全体を置き換えます
2282
+ - **push はファイルに書いたキーだけを変えます(部分更新)。** `ai.<キー>`・`prompts.<キー>`・`loop.<キー>` は書かれていれば置き換え、`null` なら未設定に戻します。書いていないキーと憲章は変えません。`outcomes` は書かれていれば配列全体を置き換えます。`orientation` は書かれていれば全体を置き換え、`null` なら未設定に戻します
2222
2283
  - `prompts.charter` を書いたファイルは受け付けません(`charter push` を使います)。サーバが知らないキー(綴り間違い等)があるときも、送る前に止めます
2223
2284
  - **push は `--yes` なしでは登録しません。** 変わるキーごとの差分(注入文面は行単位)と revision を表示し、確定用のコマンド(`--yes --revision <番号>`)を案内します。その後サーバが更新されていれば 409 で止まります
2224
2285
  - **ファイルの `revision` より後にサーバが更新されていると、`--revision` なしの `--yes` では登録しません。** pull したファイルは全キーを持つので、そのまま送ると取得後に他で直されたキーを元に戻すためです。差分を確認して案内どおり `--revision` を付けるか、pull し直してください(`revision` を書いていないファイルはこの確認をしません)
@@ -2226,6 +2287,23 @@ twp task-loop settings push --project <キー|UUID> --file loop-settings.json
2226
2287
  - `ai` の `_comment` で始まるキーは注記として無視します
2227
2288
  - 実行中のループは次のサイクルで新しい revision を読みます。書き込みの権限・終了コードは憲章と同じ規約です
2228
2289
 
2290
+ ### 志向性(計画AIへ渡す重み)を操作する
2291
+
2292
+ 計画AIに「いまどこに重みを置くか」を、軸ごとの重み(各 0〜100 の独立した値。合計100の配分ではありません)で渡せます。軸とスキルの対応は持たず、軸の意味をどう計画へ反映するかは計画AIが判断します。
2293
+
2294
+ ```bash
2295
+ twp task-loop orientation show --project <キー|UUID> # 現在の ON/OFF と各軸
2296
+ twp task-loop orientation add <key> <ラベル> <0-100> [説明] --project <キー|UUID> # 軸を足す
2297
+ twp task-loop orientation set <key> <0-100> --project <キー|UUID> # 重みを変える
2298
+ twp task-loop orientation remove <key> --project <キー|UUID> # 軸を外す
2299
+ twp task-loop orientation on|off --project <キー|UUID> # 全体の ON/OFF
2300
+ ```
2301
+
2302
+ - **ON のときだけ**計画のプロンプトに志向性の節が入ります。OFF・未設定・軸0件では何も渡しません。**OFF にしても軸と値は残り、ON に戻すと元の値で渡ります**。渡した回の志向性は計画の実行記録(`twp task-loop plan-history`)に残ります
2303
+ - 未設定のプロジェクトで `add` すると OFF の志向性が作られます。渡し始めるには `on` を実行してください
2304
+ - `key` は英小文字で始まる英小文字・数字・ハイフン(64文字まで)、ラベルは50文字・説明は500文字まで、軸は20件までです
2305
+ - 書き込みの作法は `settings push` と同じです。`--yes` なしでは変更前後と revision を表示して止まり、確定用のコマンド(`--yes --revision <番号>`)を案内します。その後サーバが更新されていれば 409 で止まります
2306
+
2229
2307
  ### スキル定義をファイルとサーバで受け渡す
2230
2308
 
2231
2309
  ループ用のスキル定義(`.claude/commands/<名前>.md` と同じ markdown)を、プロジェクト単位でサーバに登録・展開できます。サーバのスキル名 `<名前>` はファイル `<ディレクトリ>/<名前>.md` に対応します(既定のディレクトリは `.claude/commands`、`--dir` で変更)。
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{SCHEDULE_HELP,parseSchedule}from"./chunk-BPLDHTAS.js";import"./chunk-WVCEKC7V.js";import"./chunk-RX5HWI4L.js";import{charCount,readBody}from"./chunk-M763HXDH.js";import"./chunk-W4NLJ2YK.js";import{AGENT_REPOSITORIES_PATH,AGENT_SCHEDULES_PATH,AGENT_SESSIONS_PATH}from"./chunk-6DM366P6.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{ApiError}from"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";
3
+ import{SCHEDULE_HELP,parseSchedule}from"./chunk-EOXGQHZA.js";import"./chunk-WVCEKC7V.js";import{charCount,readBody}from"./chunk-A3VGBVQP.js";import"./chunk-W4NLJ2YK.js";import"./chunk-5TKHN3A5.js";import"./chunk-RX5HWI4L.js";import{AGENT_REPOSITORIES_PATH,AGENT_SCHEDULES_PATH,AGENT_SESSIONS_PATH}from"./chunk-4DOPQ74T.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{ApiError}from"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";
4
4
  import"./chunk-II5RVJQN.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiRejectedError,ApiResponseError,NetworkError,UsageError,WaitTimeoutError}from"./chunk-VFPY2A23.js";import{NotLoggedInError,SessionExpiredError}from"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";
5
5
  import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var LABEL="\u5B9A\u671F\u5B9F\u884C";var LIST_COLUMNS=["schedule_id","name","enabled","schedule","repository_full_name","next_run_at","last_run_at","disabled_reason","owner_user_id"];var GET_COLUMNS=["schedule_id","name","enabled","schedule","repository_full_name","base_branch","ai_provider","ai_model","next_run_at","last_run_at","last_session_id","consecutive_failures","disabled_reason","owner_user_id","can_edit","can_disable","created_at","updated_at"];var RUN_COLUMNS=["run_id","created_at","t\
6
6
  rigger","result","skip_reason","session_id","pr_url","error_message"];var NAME_MAX_CHARS=100;var INSTRUCTION_MAX_CHARS=1e4;var RUNS_MAX_LIMIT=100;var FORBIDDEN="AI\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u6A5F\u80FD\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\uFF08agent\uFF09\u304C\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u5272\u308A\u5F53\u3066\u3089\u308C\u3066\u3044\u306A\u3044\u304B\u3001\u4ED6\u30E6\u30FC\u30B6\u30FC\u306E\u5B9A\u671F\u5B9F\u884C\u3092\u5909\u66F4\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307E\u3059\u3002\u7DE8\u96C6\u30FB\u524A\u9664\u30FB\u6709\u52B9\u5316\u30FB\u4ECA\u3059\u3050\u5B9F\u884C\u306F\u30AA\u30FC\u30CA\u30FC\u672C\u4EBA\u3060\u3051\u3001\u7121\u52B9\u5316\u306F\u30AA\u30FC\u30CA\u30FC\u3068\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u7BA1\u7406\u8005\u304C\u3067\u304D\u307E\u3059\u3002";
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{stepToItem}from"./chunk-3D734ED2.js";import{loadLocalConfig}from"./chunk-6EQLA56A.js";import"./chunk-VYDPW2YO.js";import{parseOperations}from"./chunk-CVX2YWHC.js";import"./chunk-TTST7UDR.js";import"./chunk-NXPLTDN4.js";import{loadAiConfig}from"./chunk-FABDZBDZ.js";import{SKILL_PREFIX_RE,setSkillPrefix}from"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-UZUV5FYG.js";import{PRIVATE_PROJECT_PREFIX,PRIVATE_PROJECT_REF,
4
- isPrivateProjectRef}from"./chunk-RMFLTSOV.js";import"./chunk-IXT2X5BZ.js";import"./chunk-II5RVJQN.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{acknowledgement,isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";
3
+ import{stepToItem}from"./chunk-P54LCXEY.js";import{loadLocalConfig}from"./chunk-INS77QHY.js";import{parseOperations}from"./chunk-CVX2YWHC.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import"./chunk-BABZL52A.js";import{loadAiConfig}from"./chunk-FABDZBDZ.js";import{SKILL_PREFIX_RE,setSkillPrefix}from"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-UZUV5FYG.js";import{PRIVATE_PROJECT_PREFIX,PRIVATE_PROJECT_REF,
4
+ isPrivateProjectRef}from"./chunk-RMFLTSOV.js";import"./chunk-5TKHN3A5.js";import"./chunk-II5RVJQN.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{acknowledgement,isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";
5
5
  import"./chunk-5WGOHFAS.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var LABEL="\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30EB\u30FC\u30D7\u306E\u30A2\u30A4\u30C6\u30E0";var STATUSES=["pending","processing","completed","failed"];var AI_TYPES=["claude","gemini","codex","copilot"];var EFFORTS=["low","medium","high","xhigh","max"];var PRIORITIES=["P0","P1","P2","P3"];var LIST_COLUMNS=["item_id","status","task_key","label","ai_type","ai_effort","runner_id","created_at"];var GET_COLUMNS=["item_id","status","task_key","label","prompt","ai_type","ai_model","ai_effort","runn\
6
6
  er_id","attempt_count","reclaim_count","error_message","created_by_name","created_at","started_at","completed_at"];var HISTORY_COLUMNS=["item_id","status","task_key","skill","ai_type","runner_id","duration_ms","cost_usd","created_at"];var PLAN_RESULTS=["enqueued","empty","json_not_found","ai_failed","error","skipped","gated","locked","abandoned"];var PLAN_HISTORY_COLUMNS=["plan_run_id","result","runner_id","ai_type","duration_ms","cost_usd","step_count","started_at"];var PROJECT_FLAG={name:"--pr\
7
7
  oject",summary:"\u30AD\u30E5\u30FC\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\uFF08\u30B3\u30FC\u30C9\u307E\u305F\u306F ID\u3002\u7701\u7565\u6642\u306F TWP_PROJECT / .twp/config.json / ~/.twp/config.json\uFF09",takesValue:true,placeholder:"<\u30B3\u30FC\u30C9|ID>"};var ITEM_FLAG={name:"--item",summary:"\u30A2\u30A4\u30C6\u30E0\u306E ID\uFF08item_id\uFF09\u3002\u4F4D\u7F6E\u5F15\u6570\u3068\u540C\u3058\u610F\u5473\uFF08\u4E21\u65B9\u6307\u5B9A\u306F\u30A8\u30E9\u30FC\uFF09",takesValue:true,placeholder:"\
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-MBPJV745.js";import{detectAiClis}from"./chunk-5SONMN6K.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-3OCV6SOR.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{ClaudeStreamRenderer}from"./chunk-NXPLTDN4.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,
4
- detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import"./chunk-UZUV5FYG.js";import"./chunk-RMFLTSOV.js";import"./chunk-IXT2X5BZ.js";import"./chunk-VFPY2A23.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";
3
+ import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-MBPJV745.js";import{detectAiClis}from"./chunk-5SONMN6K.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-3OCV6SOR.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{ClaudeStreamRenderer}from"./chunk-BABZL52A.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,
4
+ detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import"./chunk-UZUV5FYG.js";import"./chunk-RMFLTSOV.js";import"./chunk-5TKHN3A5.js";import"./chunk-VFPY2A23.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";
5
5
  import"./chunk-5WGOHFAS.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{spawnSync}from"child_process";import fs2 from"fs";import path2 from"path";import{spawn}from"child_process";import fs from"fs";import path from"path";var DEFAULT_AI_TIMING={abortGraceMs:5e3,abortReapMs:2e3,pollIntervalMs:5e3};function resolveTiming(over){return{abortGraceMs:over?.abortGraceMs??DEFAULT_AI_TIMING.abortGraceMs,abortReapMs:over?.abortReapMs??DEFAULT_AI_TIMING.abortReapMs,pollIntervalMs:over?.pollIntervalMs??DEFAULT_AI_TIMING.pollIntervalMs}}var MAX_RETAINED_BYTES=4*1024*1024;function closeStream(stream){return new Promise(resolve=>{if(stream===null)return resolve();stream.once("error",()=>resolve());stream.end(()=>resolve())})}function buildArgs(req,cfg,env,workspace){
6
6
  const warnings=[];const requested=(req.model??"").trim();const usable=requested!==""&&isUsableModelId(requested);if(requested!==""&&!usable){warnings.push(`ai_model '${requested}' \u306F\u4F7F\u3048\u306A\u3044\u5F62\u3067\u3059 \u2192 \u30AB\u30C6\u30B4\u30EA\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3092\u4F7F\u3044\u307E\u3059`)}const fitsRoute=!usable||!isClaudeAi(req.ai)||modelFitsRoute(requested,env);if(usable&&!fitsRoute){warnings.push(`ai_model '${requested}' \u306F\u73FE\u5728\u306E\u5B9F\u884C\u7D4C\u8DEF\u3067\u306F\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\uFF08\u3053\u306E\u6A5F\u4F53\u306F ${usesBedrock(
7
7
  env)?"Bedrock":"Anthropic \u76F4"}\uFF09 \u2192 \u30AB\u30C6\u30B4\u30EA\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3092\u4F7F\u3044\u307E\u3059`)}const fallback=cfg.modelFor(req.ai,req.category,env);const safeFallback=fallback===""||!isClaudeAi(req.ai)||modelFitsRoute(fallback,env)?fallback:"";if(fallback!==""&&safeFallback===""){warnings.push(`CLAUDE_MODEL '${fallback}' \u3082\u73FE\u5728\u306E\u5B9F\u884C\u7D4C\u8DEF\u3067\u306F\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093 \u2192 \u30E2\u30C7\u30EB\u3092\u6307\u5B9A\u3057\u307E\u305B\u3093`)}
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{DEPARTMENT_FLAG,FROM_FLAG,MANHOUR_DESCRIPTION,MANHOUR_FROM_FLAG,MANHOUR_TO_FLAG,MONTH_FLAG,TO_FLAG,USER_FLAG,analysisDomain,analysisForbidden,currentMonth,dataOf,levelGuidance,listIn,manhourNotes,manhourQuery,manhourRows,monthColumns,monthRange,monthsBetween,noArgs,periodNote,profitRows,rangeNotes,recordOf,resolveFilters,resolvedOrUndefined,responseMonths,staffKpiRows,workloadDistributionNotes,workloadDistributionRows}from"./chunk-NB2GXB27.js";import"./chunk-MQOHOOJP.js";import"./chunk-UVCJXHWN.js";
4
- import"./chunk-EXT4AIDF.js";import"./chunk-3UOVTIM6.js";import"./chunk-RX5HWI4L.js";import"./chunk-JJSBBWJ5.js";import"./chunk-M763HXDH.js";import"./chunk-W4NLJ2YK.js";import"./chunk-6DM366P6.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";import"./chunk-II5RVJQN.js";import"./chunk-MI6HVYR2.js";import"./chunk-PS5QFKHB.js";import"./chunk-3ZRMMBP5.js";
3
+ import{DEPARTMENT_FLAG,FROM_FLAG,MANHOUR_DESCRIPTION,MANHOUR_FROM_FLAG,MANHOUR_TO_FLAG,MONTH_FLAG,TO_FLAG,USER_FLAG,analysisDomain,analysisForbidden,currentMonth,dataOf,levelGuidance,listIn,manhourNotes,manhourQuery,manhourRows,monthColumns,monthRange,monthsBetween,noArgs,periodNote,profitRows,rangeNotes,recordOf,resolveFilters,resolvedOrUndefined,responseMonths,staffKpiRows,workloadDistributionNotes,workloadDistributionRows}from"./chunk-SQMJ7XKE.js";import"./chunk-SPQJNTAK.js";import"./chunk-UVCJXHWN.js";
4
+ import"./chunk-45WIRMGL.js";import"./chunk-EXT4AIDF.js";import"./chunk-JJSBBWJ5.js";import"./chunk-A3VGBVQP.js";import"./chunk-W4NLJ2YK.js";import"./chunk-5TKHN3A5.js";import"./chunk-RX5HWI4L.js";import"./chunk-4DOPQ74T.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-II5RVJQN.js";import"./chunk-MI6HVYR2.js";import"./chunk-PS5QFKHB.js";import"./chunk-3ZRMMBP5.js";
5
5
  import"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{DEPARTMENT_FLAG,FROM_FLAG,MANHOUR_DESCRIPTION,MANHOUR_FROM_FLAG,MANHOUR_TO_FLAG,MONTH_FLAG,TO_FLAG,USER_FLAG,analysisDomain,analysisForbidden,currentMonth,dataOf,levelGuidance,listIn,manhourNotes,manhourQuery,manhourRows,monthColumns,monthRange,monthsBetween,noArgs,periodNote,profitRows,rangeNotes,recordOf,resolveFilters,resolvedOrUndefined,responseMonths,staffKpiRows,workloadDistributionNotes,workloadDistributionRows};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{composeDocument,htmlToText,metaLine}from"./chunk-62GRAKUD.js";import{boundedText}from"./chunk-JJSBBWJ5.js";import{readBody}from"./chunk-M763HXDH.js";import"./chunk-W4NLJ2YK.js";import{ANNOUNCEMENTS_PATH}from"./chunk-6DM366P6.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";import"./chunk-II5RVJQN.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,
3
+ import{composeDocument,htmlToText,metaLine}from"./chunk-62GRAKUD.js";import{boundedText}from"./chunk-JJSBBWJ5.js";import{readBody}from"./chunk-A3VGBVQP.js";import"./chunk-W4NLJ2YK.js";import"./chunk-5TKHN3A5.js";import{ANNOUNCEMENTS_PATH}from"./chunk-4DOPQ74T.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-II5RVJQN.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,
4
4
  positiveInteger}from"./chunk-MI6HVYR2.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var LABEL="\u304A\u77E5\u3089\u305B";var LIST_COLUMNS=["id","publish_start_at","sender_name","category_name","title","is_read","require_confirmation","is_confirmed"];var UNCONFIRMED_COLUMNS=["id","publish_start_at","publish_end_at","importance","title"];var GET_COLUMNS=["id","title","sender_name","category_name","importance_name","publish_start_at","publish_end_at","is_organization","is_read","require_confirmation","is_confirmed","allow_replies","link_url"];var REPLY_COLUMNS=["id","created_at","\
5
5
  user_name","is_mine","content"];var REPLY_MAX_CHARS=2e3;function noArgs(input,op){if(input.args.length>0){throw new UsageError(`${op} \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,`twp announcement ${op} help`)}}function checkId(raw,help){const id=raw.trim();if(id==="")throw new UsageError("\u304A\u77E5\u3089\u305B\u306E ID \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",help);if(!isSafePathSegment(id)){throw new UsageError(`\u304A\u77E5\u3089\u305B\u306E ID \u3068\u3057\u3066\u4F7F\u3048\u306A\u3044\
6
6
  \u5024\u3067\u3059: ${id}`,"\u304A\u77E5\u3089\u305B\u306E ID \u306F twp announcement list \u306E id \u5217\u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002")}return id}function announcementId(input,op){const help=`twp announcement ${op} help`;const[raw,...rest]=input.args;if(rest.length>0)throw new UsageError(`${op} \u304C\u53D7\u3051\u53D6\u308C\u308B\u304A\u77E5\u3089\u305B ID \u306F1\u3064\u3060\u3051\u3067\u3059: ${rest.join(" ")}`,help);return checkId(raw??"",help)}function announcementIds(input){
@@ -1,9 +1,9 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{CommandModelMissingError,MAX_REPORTED_VIOLATIONS,loadCommandModelDomain,loadCommandModelRoutes,validateBody,validateQuery}from"./chunk-NZ7WI4RZ.js";import{exitCodeFor,fetchAllPages,reportError}from"./chunk-VOSADZUE.js";import"./chunk-LGNYEROA.js";import"./chunk-Q3B65OFC.js";import{evaluateQuery}from"./chunk-GFLGXGWE.js";import{renderOutput}from"./chunk-SZOEBJGI.js";import{describeWaitResult,parseWaitOptions,waitUntilTerminal}from"./chunk-WVCEKC7V.js";
4
- import{parseOperationArgs,repeatedValues}from"./chunk-RX5HWI4L.js";import{readBody}from"./chunk-M763HXDH.js";import{ALLOW_REDACTED_FLAG,NO_REDACT_FLAG,NO_REDACT_NOTICE}from"./chunk-W4NLJ2YK.js";import"./chunk-6DM366P6.js";import"./chunk-HVZUXLQ4.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import{redactSecretValues,redactSecrets,withDebug}from"./chunk-IXT2X5BZ.js";import"./chunk-II5RVJQN.js";
3
+ import{CommandModelMissingError,MAX_REPORTED_VIOLATIONS,loadCommandModelDomain,loadCommandModelRoutes,validateBody,validateQuery}from"./chunk-NZ7WI4RZ.js";import{exitCodeFor,fetchAllPages,reportError}from"./chunk-XG2MNO5M.js";import"./chunk-MP36JZRV.js";import"./chunk-Q3B65OFC.js";import{evaluateQuery}from"./chunk-GFLGXGWE.js";import{renderOutput}from"./chunk-24AJQUDZ.js";import{describeWaitResult,parseWaitOptions,waitUntilTerminal}from"./chunk-WVCEKC7V.js";
4
+ import{readBody}from"./chunk-A3VGBVQP.js";import{ALLOW_REDACTED_FLAG,NO_REDACT_FLAG,NO_REDACT_NOTICE}from"./chunk-W4NLJ2YK.js";import{redactSecretValues,redactSecrets,withDebug}from"./chunk-5TKHN3A5.js";import{parseOperationArgs,repeatedValues}from"./chunk-RX5HWI4L.js";import"./chunk-4DOPQ74T.js";import"./chunk-HVZUXLQ4.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-II5RVJQN.js";
5
5
  import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,isPageNumberEnvelope,pageRangeNotes,positiveInteger,readEnvelopeCursor,readPageNumberCursor,shellQuote}from"./chunk-MI6HVYR2.js";import"./chunk-3ZRMMBP5.js";import{ApiResponseError,EXIT_OK,EXIT_WAIT_TIMEOUT,NetworkError,UsageError}from"./chunk-VFPY2A23.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-PECIBNFD.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{
6
- httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import{HELP_TOKEN}from"./chunk-JQQP7JLQ.js";import"./chunk-QQRJLH6B.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-74BPZOKU.js";import"./chunk-UREA4ZIG.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MIN_SEGMENT_CHARS=3;var parsedCache=new WeakMap;function splitSegments(path){return path.split("/").filter(segment=>segment!=="")}function parseRoutes(routes){const cached=parsedCache.get(routes);if(cached!==void 0)return cached;const parsed=[];for(const[key,domain]of Object.entries(routes.routes)){const space=key.indexOf(" ");if(space<=0)continue;const template=key.slice(space+1);parsed.push({method:key.slice(0,space),template,domain,segments:splitSegments(template).map(segment=>/^\{[^/{}]+\}$/.
6
+ httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import{HELP_TOKEN}from"./chunk-X3F7DOP5.js";import"./chunk-QQRJLH6B.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-74BPZOKU.js";import"./chunk-UREA4ZIG.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MIN_SEGMENT_CHARS=3;var parsedCache=new WeakMap;function splitSegments(path){return path.split("/").filter(segment=>segment!=="")}function parseRoutes(routes){const cached=parsedCache.get(routes);if(cached!==void 0)return cached;const parsed=[];for(const[key,domain]of Object.entries(routes.routes)){const space=key.indexOf(" ");if(space<=0)continue;const template=key.slice(space+1);parsed.push({method:key.slice(0,space),template,domain,segments:splitSegments(template).map(segment=>/^\{[^/{}]+\}$/.
7
7
  test(segment)?null:segment)})}parsedCache.set(routes,parsed);return parsed}function matches(route,segments){if(route.segments.length!==segments.length)return false;return route.segments.every((literal,i)=>literal===null||literal===segments[i])}function compareSpecificity(a,b){const literals=route=>route.segments.filter(segment=>segment!==null).length;const diff=literals(b)-literals(a);if(diff!==0)return diff;for(let i=0;i<a.segments.length;i+=1){const aLiteral=a.segments[i]!==null;const bLiteral=b.
8
8
  segments[i]!==null;if(aLiteral!==bLiteral)return aLiteral?-1:1}return 0}function lookupRoute(routes,method,path){const segments=splitSegments(path);const hits=parseRoutes(routes).filter(route=>matches(route,segments));const sameMethod=hits.filter(route=>route.method===method).sort(compareSpecificity);const best=sameMethod[0];if(best!==void 0)return{kind:"matched",domain:best.domain,template:best.template};if(hits.length>0){const[top]=[...hits].sort(compareSpecificity);const template=top.template;
9
9
  const methods=[...new Set(hits.filter(route=>route.template===template).map(route=>route.method))].sort();return{kind:"method-mismatch",template,methods}}return{kind:"unknown"}}function pickOperation(operations,method,template){return operations.find(op=>op.method===method&&op.path===template)??null}async function suggestRoutes(routes,path,limit=5){const{default:fuzzysort}=await import("./fuzzysort-DFVKV4B4.js");const parsed=parseRoutes(routes);const templates=[...new Set(parsed.map(route=>route.
@@ -0,0 +1,66 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{repeatedValues}from"./chunk-RX5HWI4L.js";import{API_KEYS_PATH}from"./chunk-4DOPQ74T.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-II5RVJQN.js";import{nonEmpty}from"./chunk-MI6HVYR2.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";
4
+ import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import fs from"fs";import path from"path";var LABEL="API \u30AD\u30FC";var FORBIDDEN="\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002\u30C6\u30CA\u30F3\u30C8 API \u30AD\u30FC\u306F\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u6271\u3048\u307E\u3059";var LIST_COLUMNS=["id","name","key_prefix","status","permissions","expires_at","last_used_at","created_at"];var GET_COLUMNS=["id","name","description","key_prefix","status","permissions","expires_at","last_used_at","created_at","updated_at"];var PERMISSION_COLUMNS=[
5
+ "value","label","category","description"];var STATUS_VALUES=["active","inactive"];var REF_HELP="<\u30AD\u30FC> \u306F API \u30AD\u30FC\u306E ID\u30FB\u540D\u524D\u30FB\u30AD\u30FC\u306E\u5148\u982D8\u6587\u5B57\uFF08key_prefix\u3002\u4F8B twpk_AbC\uFF09\u3067\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002\nID \u4EE5\u5916\u306F\u4E00\u89A7\u3068\u7167\u5408\u3057\u307E\u3059\uFF08\u30AD\u30E3\u30C3\u30B7\u30E5\u3057\u306A\u3044\uFF09\u3002\u540D\u524D\u304C\u8907\u6570\u306B\u4E00\u81F4\u3059\u308C\u3070\u5019\u88DC\u3092\u51FA\u3057\u3066\u6B62\u307E\u308A\u307E\u3059\u3002";
6
+ var CREATOR_NOTE="\u4F5C\u6210\u8005\u306F\u30B5\u30FC\u30D0\u306E\u5FDC\u7B54\u306B\u542B\u307E\u308C\u306A\u3044\u305F\u3081\u8868\u793A\u3067\u304D\u307E\u305B\u3093\u3002last_used_at \u306F\u5916\u90E8 API \u3067\u306E\u5229\u7528\u3067\u306F\u66F4\u65B0\u3055\u308C\u307E\u305B\u3093\uFF08\u30AD\u30FC\u3092\u4F7F\u3063\u3066\u3082 null \u306E\u307E\u307E\uFF09\u3002\u68DA\u5378\u3057\u306E\u6839\u62E0\u306B\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002";var PROPAGATION_NOTE="\u5916\u90E8 API \u306F\
7
+ \u6709\u52B9\u306A\u30AD\u30FC\u306E\u691C\u8A3C\u7D50\u679C\u3092\u6700\u592760\u79D2\u30AD\u30E3\u30C3\u30B7\u30E5\u3059\u308B\u305F\u3081\u3001\u53CD\u6620\u307E\u3067\u6700\u592760\u79D2\u304B\u304B\u308A\u307E\u3059\uFF08\u76F4\u5F8C\u306F\u307E\u3060\u901A\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\uFF09\u3002";var EXPIRES_HELP="--expires-at \u306B\u65E5\u4ED8\u3060\u3051\uFF08YYYY-MM-DD\uFF09\u3092\u6E21\u3059\u3068\u3001\u305D\u306E\u65E5\u306E 0 \u6642\uFF08\u30B5\u30FC\u30D0\u306E\u6642\u523B\uFF09\u306B\u5931\u52B9\u3057\u307E\u3059\u3002\u305D\u306E\u65E5\u3044\u3063\u3071\u3044\u4F7F\u3046\u306A\u3089\u7FCC\u65E5\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\u306E\u7121\u3044\u65E5\u6642\u3082\u30B5\u30FC\u30D0\u306E\u6642\u523B\u3068\u3057\u3066\u89E3\u91C8\u3055\u308C\u307E\u3059\u3002\u8FF7\u3046\u306A\u3089 2026-12-31T23:59:59+09:00 \u306E\u3088\u3046\u306B\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\
8
+ \u3044\u3002";var KEY_FLAG={name:"--key",summary:"\u5BFE\u8C61\u306E API \u30AD\u30FC\uFF08\u4F4D\u7F6E\u5F15\u6570\u306E\u4EE3\u308F\u308A\u306B\u4F7F\u3048\u308B\uFF09",takesValue:true,placeholder:"<\u30AD\u30FC>"};var NAME_FLAG={name:"--name",summary:"\u30AD\u30FC\u540D\uFF08255\u6587\u5B57\u307E\u3067\uFF09",takesValue:true,placeholder:"<\u30AD\u30FC\u540D>"};var DESCRIPTION_FLAG={name:"--description",summary:"\u8AAC\u660E\uFF081000\u6587\u5B57\u307E\u3067\uFF09",takesValue:true,placeholder:"\
9
+ <\u8AAC\u660E>"};var PERMISSION_FLAG={name:"--permission",summary:"\u4ED8\u4E0E\u3059\u308B\u6A29\u9650\uFF08\u8907\u6570\u56DE\u6307\u5B9A\u3067\u304D\u308B\u3002\u5024\u306F twp api-key permission list \u306E value\uFF09",takesValue:true,placeholder:"<\u6A29\u9650>",repeatable:true};var EXPIRES_FLAG={name:"--expires-at",summary:"\u6709\u52B9\u671F\u9650\uFF08YYYY-MM-DD \u304B ISO 8601\u3002\u65E5\u4ED8\u3060\u3051\u306A\u3089\u305D\u306E\u65E5\u306E 0 \u6642\u306B\u5931\u52B9\u3059\u308B\uFF09",
10
+ takesValue:true,placeholder:"<\u65E5\u6642>"};var KEY_FILE_FLAG={name:"--key-file",summary:"\u4F5C\u6210\u3057\u305F\u30AD\u30FC\u306E\u5E73\u6587\u3092\u66F8\u304D\u51FA\u3059\u30D5\u30A1\u30A4\u30EB\uFF080600\u30FB\u65E2\u5B58\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u4E0A\u66F8\u304D\u3057\u306A\u3044\uFF09",takesValue:true,placeholder:"<\u30D1\u30B9>"};async function targetId(input,ctx,usage){const ref=singleRef(input,{flag:KEY_FLAG.name,label:LABEL,usage});return(await ctx.resolver.apiKey(ref)).
11
+ id}var itemPath=id=>{if(!isSafePathSegment(id))throw new ApiResponseError(`${LABEL} ID \u3092\u30D1\u30B9\u306B\u4F7F\u3048\u307E\u305B\u3093: ${id}\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return`${API_KEYS_PATH}/${encodeURIComponent(id)}`};function nameValue(input){const name=nonEmpty(input.flags,"--name");if(name!==void 0&&[...name].length>255)throw new UsageError("--name \u306F255\u6587\u5B57\u4EE5\u5185\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044");
12
+ return name}function descriptionValue(input){const description=input.flags.get("--description");if(description!==void 0&&[...description].length>1e3)throw new UsageError("--description \u306F1000\u6587\u5B57\u4EE5\u5185\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044");return description}function expiresValue(input,future=false){const raw=nonEmpty(input.flags,"--expires-at");if(raw===void 0)return void 0;const trimmed=raw.trim();const time=/^\d{4}-\d{2}-\d{2}(?:[T ][0-9:.]+(?:Z|[+-]\d{2}:?\d{2})?)?$/.
13
+ test(trimmed)?Date.parse(trimmed):Number.NaN;if(Number.isNaN(time))throw new UsageError(`--expires-at \u306F YYYY-MM-DD \u304B ISO 8601 \u306E\u65E5\u6642\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${raw}`);if(future&&time<=Date.now())throw new UsageError(`--expires-at \u306F\u73FE\u5728\u3088\u308A\u5F8C\u306E\u65E5\u6642\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${raw}`);return trimmed}async function checkedPermissions(input,ctx){const given=[];for(const raw of repeatedValues(
14
+ input,"--permission")){const value=raw.trim();if(value==="")throw new UsageError("--permission \u306B\u7A7A\u306E\u5024\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093");if(!given.includes(value))given.push(value)}if(given.length===0)return given;const allowed=(await ctx.resolver.apiKeyPermissions()).map(row=>row["value"]).filter(v=>typeof v==="string");const unknown=given.filter(value=>!allowed.includes(value));if(unknown.length>0){throw new UsageError(`\u4ED8\u4E0E\u3067\u304D\u306A\u3044\u6A29\u9650\u3067\u3059: ${unknown.
15
+ join(", ")}`,`\u4ED8\u4E0E\u3067\u304D\u308B\u6A29\u9650: ${allowed.join(", ")}\uFF08twp api-key permission list \u3067\u8AAC\u660E\u3092\u898B\u3089\u308C\u307E\u3059\uFF09`)}return given}function checkKeyFile(file){const target=path.resolve(file);if(fs.existsSync(target))throw new UsageError(`--key-file \u306E\u30D5\u30A1\u30A4\u30EB\u304C\u65E2\u306B\u3042\u308A\u307E\u3059: ${file}`,"\u4E0A\u66F8\u304D\u3057\u307E\u305B\u3093\u3002\u5225\u306E\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002");
16
+ const dir=path.dirname(target);try{fs.accessSync(dir,fs.constants.W_OK)}catch{throw new UsageError(`--key-file \u306E\u66F8\u304D\u51FA\u3057\u5148\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u66F8\u304D\u8FBC\u3081\u307E\u305B\u3093: ${dir}`)}return target}function openKeyFile(file){try{return fs.openSync(file,"wx",384)}catch(error){throw new UsageError(`--key-file \u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093: ${file}\uFF08${error instanceof Error?error.message:String(error)}\uFF09`,"\u30AD\u30FC\
17
+ \u306F\u307E\u3060\u4F5C\u3063\u3066\u3044\u307E\u305B\u3093\u3002\u66F8\u304D\u8FBC\u3081\u308B\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B58\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u4E0A\u66F8\u304D\u3057\u307E\u305B\u3093\uFF09\u3002")}}function discardKeyFile(fd,file){try{fs.closeSync(fd);fs.unlinkSync(file)}catch{}}function listRows(body){const list=isRecord(body)?body["list"]:void 0;if(!Array.isArray(list))throw new ApiResponseError(`${LABEL}\u4E00\u89A7\u306E\u5FDC\u7B54\u306B list \u914D\u5217\
18
+ \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return list}function unwrap(body){const apiKey=isRecord(body)?body["api_key"]:void 0;if(!isRecord(apiKey))throw new ApiResponseError(`${LABEL}\u306E\u5FDC\u7B54\u306B api_key \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return apiKey}function deleted(body){if(!isRecord(body)||body["result"]!==true)
19
+ throw new ApiResponseError(`${LABEL}\u306E\u524A\u9664\u306E\u5FDC\u7B54\u304C result: true \u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return{result:true,message:body["message"]??null}}var listOperation={name:"list",summary:`${LABEL}\u3092\u4E00\u89A7\u3059\u308B\uFF08\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09`,usage:"twp api-key list [--status active|inactive]",description:"\u4F5C\u6210\u65E5\u306E\u65B0\u3057\u3044\u9806\u306B\u5168\u4EF6\u3092\u51FA\u3057\u307E\u3059\uFF08\u30B5\u30FC\u30D0\u306B\u30DA\u30FC\u30B8\u30F3\u30B0\u306F\u3042\u308A\u307E\
20
+ \u305B\u3093\uFF09\u3002\u5E73\u6587\u306E\u30AD\u30FC\u306F\u51FA\u307E\u305B\u3093\uFF08\u5148\u982D8\u6587\u5B57\u306E key_prefix \u3060\u3051\uFF09\u3002\n"+CREATOR_NOTE,forbidden:FORBIDDEN,flags:[{name:"--status",summary:"\u72B6\u614B\u3067\u7D5E\u308B\uFF08active: \u6709\u52B9 / inactive: \u7121\u52B9\uFF09",takesValue:true,placeholder:"<active|inactive>"}],plan(input){if(input.args.length>0)throw new UsageError(`list \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.
21
+ args.join(" ")}`,"twp api-key list help");const status=input.flags.get("--status");if(status===void 0)return{method:"GET",path:API_KEYS_PATH};if(!STATUS_VALUES.includes(status.trim())){throw new UsageError(`--status \u306F active / inactive \u306E\u3069\u3061\u3089\u304B\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${status}`)}return{method:"GET",path:API_KEYS_PATH,query:{status:status.trim()}}},summarize:body=>listRows(body).map(row=>pick(row,LIST_COLUMNS)),raw:body=>listRows(body),notes:()=>[
22
+ CREATOR_NOTE]};var getOperation={name:"get",summary:`${LABEL}1\u4EF6\u306E\u8A73\u7D30\u3092\u8868\u793A\u3059\u308B\uFF08\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09`,usage:"twp api-key get <\u30AD\u30FC>",description:`${REF_HELP}
23
+ \u5E73\u6587\u306E\u30AD\u30FC\u306F\u51FA\u307E\u305B\u3093\uFF08\u4F5C\u6210\u6642\u306B\u3060\u3051\u8FD4\u308A\u307E\u3059\uFF09\u3002
24
+ ${CREATOR_NOTE}`,forbidden:FORBIDDEN,flags:[KEY_FLAG],prepare:async(input,ctx)=>withResolved(input,{id:await targetId(input,ctx,"twp api-key get help")}),plan:input=>({method:"GET",path:itemPath(requireResolved(input,"id"))}),narrow:unwrap,summarize:body=>pick(body,GET_COLUMNS),raw:body=>body};var createOperation={name:"create",summary:`${LABEL}\u3092\u4F5C\u6210\u3059\u308B\uFF08\u5E73\u6587\u306E\u30AD\u30FC\u306F --key-file \u304B --no-redact \u3067\u53D7\u3051\u53D6\u308B\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09`,
25
+ usage:"twp api-key create --name <\u30AD\u30FC\u540D> --permission <\u6A29\u9650> [--permission <\u6A29\u9650>\u2026] [--description <\u8AAC\u660E>] [--expires-at <\u65E5\u6642>] (--key-file <\u30D1\u30B9> | --no-redact)",description:`--name \u3068 --permission\uFF081\u3064\u4EE5\u4E0A\uFF09\u304C\u5FC5\u9808\u3067\u3059\u3002\u6A29\u9650\u306F\u9001\u308B\u524D\u306B twp api-key permission list \u3068\u7167\u5408\u3057\u307E\u3059\u3002
26
+ --expires-at \u3092\u7701\u304F\u3068\u7121\u671F\u9650\u3067\u3059\u3002\u4F5C\u6210\u3057\u305F\u30AD\u30FC\u306F\u6709\u52B9\u306E\u72B6\u614B\u3067\u8FD4\u308A\u307E\u3059\u3002
27
+ ${EXPIRES_HELP}
28
+
29
+ **\u5E73\u6587\u306E\u30AD\u30FC\u306F\u3053\u306E\u5FDC\u7B54\u30671\u56DE\u3060\u3051\u8FD4\u308A\u3001\u3042\u3068\u304B\u3089\u53D6\u308A\u51FA\u305B\u307E\u305B\u3093\u3002** \u53D7\u3051\u53D6\u308A\u65B9\u3092\u6B21\u306E\u3069\u3061\u3089\u304B\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044
30
+ \uFF08\u3069\u3061\u3089\u3082\u7121\u3051\u308C\u3070\u9001\u3089\u305A\u306B\u7D42\u4E86\u30B3\u30FC\u30C9 2 \u3067\u6B62\u3081\u307E\u3059\u3002\u4F0F\u5B57\u306E\u307E\u307E\u4F5C\u308B\u3068\u5024\u3092\u8AB0\u3082\u6301\u305F\u306A\u3044\u30AD\u30FC\u304C\u6B8B\u308B\u305F\u3081\uFF09\u3002
31
+ --key-file <\u30D1\u30B9> \u5E73\u6587\u3092\u30D5\u30A1\u30A4\u30EB\u3078\u66F8\u304F\uFF08\u30D1\u30FC\u30DF\u30C3\u30B7\u30E7\u30F3 0600\u30FB\u65E2\u5B58\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u4E0A\u66F8\u304D\u3057\u306A\u3044\uFF09\u3002stdout \u306F\u4F0F\u5B57\u306E\u307E\u307E
32
+ --no-redact \u5E73\u6587\u3092 stdout \u306B\u51FA\u3059\uFF08\u7AEF\u672B\u30FB\u30ED\u30B0\u30FBAI \u306E\u30C8\u30E9\u30F3\u30B9\u30AF\u30EA\u30D7\u30C8\u306B\u6B8B\u308B\u3053\u3068\u306B\u6CE8\u610F\uFF09
33
+ \u4F5C\u3063\u305F\u30AD\u30FC\u306F\u5916\u90E8\u30B7\u30B9\u30C6\u30E0\u306E X-API-Key \u30D8\u30C3\u30C0\u306B\u8A2D\u5B9A\u3057\u3066\u4F7F\u3044\u307E\u3059\u3002`,forbidden:FORBIDDEN,flags:[NAME_FLAG,PERMISSION_FLAG,DESCRIPTION_FLAG,EXPIRES_FLAG,KEY_FILE_FLAG],async prepare(input,ctx){if(input.args.length>0)throw new UsageError(`create \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,"twp api-key create help");if(nameValue(input)===void 0)throw new UsageError(
34
+ "--name \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","twp api-key create help");if(repeatedValues(input,"--permission").length===0){throw new UsageError("--permission \u30921\u3064\u4EE5\u4E0A\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","\u4ED8\u4E0E\u3067\u304D\u308B\u6A29\u9650\u306F twp api-key permission list \u3067\u898B\u3089\u308C\u307E\u3059\u3002")}descriptionValue(input);expiresValue(input,true);const keyFile=nonEmpty(input.flags,"--key-file");if(keyFile===void 0&&!input.
35
+ flags.has("--no-redact")){throw new UsageError("\u5E73\u6587\u306E\u30AD\u30FC\u306E\u53D7\u3051\u53D6\u308A\u65B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08--key-file <\u30D1\u30B9> \u304B --no-redact\uFF09","\u4F5C\u6210\u3057\u305F\u30AD\u30FC\u306F\u3053\u306E1\u56DE\u3057\u304B\u8FD4\u308A\u307E\u305B\u3093\u3002--key-file \u306A\u3089\u30D5\u30A1\u30A4\u30EB\uFF080600\uFF09\u306B\u66F8\u304D\u3001stdout \u3068\u30ED\u30B0\u306B\u306F\u4F0F\u5B57\u3060\u3051\u3092\u6B8B\u3057\u307E\u3059\u3002")}
36
+ const target=keyFile===void 0?void 0:checkKeyFile(keyFile);return withResolved(input,{permissions:JSON.stringify(await checkedPermissions(input,ctx)),...target===void 0?{}:{keyFile:target}})},plan(input){const body={name:nameValue(input),permissions:JSON.parse(requireResolved(input,"permissions"))};const description=descriptionValue(input);if(description!==void 0)body["description"]=description;const expires=expiresValue(input,true);if(expires!==void 0)body["expires_at"]=expires;return{method:"P\
37
+ OST",path:API_KEYS_PATH,body}},plannedNotes:input=>input.resolved?.["keyFile"]!==void 0?[`\u4F5C\u6210\u3057\u305F\u30AD\u30FC\u306E\u5E73\u6587\u306F ${input.resolved["keyFile"]} \u306B\u66F8\u304D\u51FA\u3057\u307E\u3059\uFF080600\uFF09\u3002`]:[],async execute(input,ctx){const keyFile=input.resolved?.["keyFile"];const fd=keyFile===void 0?void 0:openKeyFile(keyFile);let apiKey;let plain;try{const body=await ctx.send(createOperation.plan(input));apiKey=unwrap(body);plain=isRecord(body)?body["pl\
38
+ ain_text_key"]:void 0;if(typeof plain!=="string"||plain===""){throw new ApiResponseError(`${LABEL}\u306F\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F\u304C\u3001\u5FDC\u7B54\u306B plain_text_key \u304C\u3042\u308A\u307E\u305B\u3093\uFF08ID: ${String(apiKey["id"])}\uFF09\u3002\u5024\u3092\u53D6\u308A\u51FA\u305B\u306A\u3044\u306E\u3067 twp api-key delete ${String(apiKey["id"])} --yes \u3067\u524A\u9664\u3057\u3001\u4F5C\u308A\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}}catch(error){if(fd!==void 0&&
39
+ keyFile!==void 0)discardKeyFile(fd,keyFile);throw error}if(fd!==void 0&&keyFile!==void 0){try{fs.writeFileSync(fd,`${String(plain)}
40
+ `);fs.closeSync(fd)}catch(error){throw new ApiResponseError(`${LABEL}\u306F\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F\u304C\u3001${keyFile} \u306B\u66F8\u304D\u51FA\u305B\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${error instanceof Error?error.message:String(error)}\uFF09\u3002\u5024\u306F\u3082\u3046\u53D6\u308A\u51FA\u305B\u306A\u3044\u306E\u3067 twp api-key delete ${String(apiKey["id"])} --yes \u3067\u524A\u9664\u3057\u3001\u4F5C\u308A\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}ctx.warn(
41
+ `\u4F5C\u6210\u3057\u305F\u30AD\u30FC\u306E\u5E73\u6587\u3092 ${keyFile} \u306B\u66F8\u304D\u51FA\u3057\u307E\u3057\u305F\uFF080600\uFF09\u3002`);if(process.platform==="win32")ctx.warn("Windows \u3067\u306F\u30D1\u30FC\u30DF\u30C3\u30B7\u30E7\u30F3 0600 \u304C\u52B9\u304D\u307E\u305B\u3093\u3002\u30D5\u30A1\u30A4\u30EB\u306E\u7F6E\u304D\u5834\u6240\u3067\u4ED6\u4EBA\u304B\u3089\u8AAD\u3081\u306A\u3044\u3088\u3046\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}return{...apiKey,plain_text_key:plain}},
42
+ summarize:body=>({...pick(body,GET_COLUMNS),plain_text_key:isRecord(body)?body["plain_text_key"]??null:null}),raw:body=>body,notes:()=>["\u5E73\u6587\u306E\u30AD\u30FC\uFF08plain_text_key\uFF09\u306F\u3053\u306E1\u56DE\u3060\u3051\u8FD4\u308A\u307E\u3059\u3002\u3042\u3068\u304B\u3089\u53D6\u308A\u51FA\u3059\u65B9\u6CD5\u306F\u3042\u308A\u307E\u305B\u3093\u3002"]};var updateOperation={name:"update",summary:`${LABEL}\u3092\u66F4\u65B0\u3059\u308B\uFF08\u6307\u5B9A\u3057\u305F\u9805\u76EE\u3060\u3051\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09`,
43
+ usage:"twp api-key update <\u30AD\u30FC> [--name <\u30AD\u30FC\u540D>] [--description <\u8AAC\u660E> | --clear-description] [--permission <\u6A29\u9650>\u2026] [--expires-at <\u65E5\u6642>]",description:`\u6307\u5B9A\u3057\u305F\u9805\u76EE\u3060\u3051\u3092\u5909\u66F4\u3057\u307E\u3059\uFF08\u30B5\u30FC\u30D0\u306E\u66F4\u65B0\u306F\u9001\u3063\u305F\u9805\u76EE\u3060\u3051\u3092\u66F8\u304D\u63DB\u3048\u307E\u3059\uFF09\u3002\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u3082\u6307\u5B9A\u3057\u306A\u3044\u3068\u30A8\u30E9\u30FC\u306B\u306A\u308A\u307E\u3059\u3002
44
+ --permission \u306F\u6A29\u9650\u3092**\u6307\u5B9A\u3057\u305F\u3082\u306E\u3060\u3051\u306B\u7F6E\u304D\u63DB\u3048\u307E\u3059**\uFF08\u8DB3\u3059\u306E\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\u3002\u9001\u308B\u524D\u306B twp api-key permission list \u3068\u7167\u5408\u3057\u307E\u3059\u3002
45
+ --expires-at \u306F\u904E\u53BB\u306E\u65E5\u6642\u3082\u53D7\u3051\u4ED8\u3051\u307E\u3059\uFF08\u3059\u3050\u5931\u52B9\u3057\u307E\u3059\uFF09\u3002
46
+ ${EXPIRES_HELP}
47
+ CLI \u304B\u3089\u306F\u7121\u671F\u9650\u3078\u623B\u305B\u307E\u305B\u3093\uFF08\u671F\u9650\u3092\u6D88\u3057\u3066\u3082\u65E7\u671F\u9650\u3067\u30AD\u30FC\u304C\u524A\u9664\u3055\u308C\u308B\u305F\u3081\u3002\u4F5C\u308A\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\u3002
48
+ \u6709\u52B9\u30FB\u7121\u52B9\u306E\u5207\u308A\u66FF\u3048\u306F twp api-key enable / disable \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002
49
+
50
+ `+REF_HELP,forbidden:FORBIDDEN,flags:[NAME_FLAG,DESCRIPTION_FLAG,{name:"--clear-description",summary:"\u8AAC\u660E\u3092\u7A7A\u306B\u3059\u308B",takesValue:false},PERMISSION_FLAG,EXPIRES_FLAG,KEY_FLAG],async prepare(input,ctx){if(input.flags.has("--description")&&input.flags.has("--clear-description")){throw new UsageError("--description \u3068 --clear-description \u306F\u540C\u6642\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093")}nameValue(input);descriptionValue(input);expiresValue(input);const changes=[
51
+ "--name","--description","--clear-description","--expires-at"].some(flag=>input.flags.has(flag));if(!changes&&repeatedValues(input,"--permission").length===0){throw new UsageError("\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u4EE5\u4E0A\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","twp api-key update help")}const id=await targetId(input,ctx,"twp api-key update help");return withResolved(input,{id,permissions:JSON.stringify(await checkedPermissions(input,ctx))})},plan(input){const body={};
52
+ const name=nameValue(input);if(name!==void 0)body["name"]=name;if(input.flags.has("--clear-description"))body["description"]=null;const description=descriptionValue(input);if(description!==void 0)body["description"]=description;const permissions=JSON.parse(requireResolved(input,"permissions"));if(permissions.length>0)body["permissions"]=permissions;const expires=expiresValue(input);if(expires!==void 0)body["expires_at"]=expires;return{method:"PUT",path:itemPath(requireResolved(input,"id")),body}},
53
+ narrow:unwrap,summarize:body=>pick(body,GET_COLUMNS),raw:body=>body};function statusOperation(status){const enable=status==="active";const name=enable?"enable":"disable";return{name,summary:enable?`${LABEL}\u3092\u6709\u52B9\u306B\u3059\u308B\uFF08\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09`:`${LABEL}\u3092\u7121\u52B9\u306B\u3059\u308B\uFF08\u305D\u306E\u30AD\u30FC\u3067\u306E API \u547C\u3073\u51FA\u3057\u304C\u901A\u3089\u306A\u304F\u306A\u308B\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09`,
54
+ usage:`twp api-key ${name} <\u30AD\u30FC>`,description:(enable?"\u7121\u52B9\u306B\u3057\u305F\u30AD\u30FC\u3092\u6709\u52B9\u306B\u623B\u3057\u307E\u3059\u3002\u6709\u52B9\u671F\u9650\u304C\u904E\u304E\u305F\u30AD\u30FC\u306F\u6709\u52B9\u306B\u3057\u3066\u3082\u4F7F\u3048\u307E\u305B\u3093\uFF08twp api-key update --expires-at \u3067\u5EF6\u3070\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\u3002\n":`\u7121\u52B9\u306B\u3057\u305F\u30AD\u30FC\u3067\u547C\u3093\u3060 API \u306F\u62D2\u5426\u3055\u308C\u307E\u3059\uFF08${PROPAGATION_NOTE}\
55
+ \uFF09\u3002
56
+ twp api-key enable \u3067\u623B\u305B\u307E\u3059\uFF08\u524A\u9664\u3068\u9055\u3044\u3001\u30AD\u30FC\u306E\u5024\u306F\u5909\u308F\u308A\u307E\u305B\u3093\uFF09\u3002
57
+ `)+"\u65E2\u306B\u305D\u306E\u72B6\u614B\u3067\u3082\u9001\u308A\u307E\u3059\uFF08\u72B6\u614B\u3092\u660E\u793A\u3057\u3066\u9001\u308B\u306E\u3067\u3001\u6253\u3061\u76F4\u3057\u3066\u3082\u9006\u5411\u304D\u306B\u306F\u306A\u308A\u307E\u305B\u3093\uFF09\u3002\n\n"+REF_HELP,forbidden:FORBIDDEN,flags:[KEY_FLAG],prepare:async(input,ctx)=>withResolved(input,{id:await targetId(input,ctx,`twp api-key ${name} help`)}),plan:input=>({method:"PUT",path:itemPath(requireResolved(input,"id")),body:{status}}),
58
+ narrow:unwrap,summarize:body=>pick(body,GET_COLUMNS),raw:body=>body,...enable?{}:{notes:()=>[PROPAGATION_NOTE]}}}var deleteOperation={name:"delete",summary:`${LABEL}\u3092\u524A\u9664\u3059\u308B\uFF08--yes \u304C\u8981\u308B\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09`,usage:"twp api-key delete <\u30AD\u30FC> --yes",description:`\u30AD\u30FC\u3092\u524A\u9664\u3057\u307E\u3059\u3002\u305D\u306E\u30AD\u30FC\u3067\u547C\u3093\u3060 API \u306F\u4EE5\u5F8C\u3059\u3079\u3066\u62D2\u5426\u3055\u308C\u3001\u5143\u306B\u623B\u305B\u307E\u305B\u3093\uFF08${PROPAGATION_NOTE}\
59
+ \uFF09\u3002
60
+ \u4E00\u6642\u7684\u306B\u6B62\u3081\u308B\u3060\u3051\u306A\u3089 twp api-key disable \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002
61
+
62
+ `+REF_HELP,destructive:true,confirmation:"API \u30AD\u30FC\u306E\u524A\u9664\uFF08\u305D\u306E\u30AD\u30FC\u3092\u4F7F\u3046\u5916\u90E8\u9023\u643A\u304C\u6B62\u307E\u308A\u3001\u5143\u306B\u623B\u305B\u307E\u305B\u3093\uFF09",forbidden:FORBIDDEN,flags:[KEY_FLAG],prepare:async(input,ctx)=>withResolved(input,{id:await targetId(input,ctx,"twp api-key delete help")}),plan:input=>({method:"DELETE",path:itemPath(requireResolved(input,"id"))}),summarize:deleted,raw:deleted,notes:()=>[PROPAGATION_NOTE]};
63
+ function permissionRows(body){const rows=isRecord(body)?body["permissions"]:void 0;if(!Array.isArray(rows))throw new ApiResponseError(`${LABEL}\u306E\u6A29\u9650\u4E00\u89A7\u306E\u5FDC\u7B54\u306B permissions \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return rows}var permissionListOperation={name:"list",summary:`${LABEL}\u306B\u4ED8\u4E0E\u3067\u304D\u308B\u6A29\u9650\u3092\u4E00\u89A7\u3059\u308B\uFF08\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09`,
64
+ usage:"twp api-key permission list",description:"create / update \u306E --permission \u306B\u306F value \u306E\u5024\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002",forbidden:FORBIDDEN,flags:[],plan(input){if(input.args.length>0)throw new UsageError(`list \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,"twp api-key permission list help");return{method:"GET",path:`${API_KEYS_PATH}/permissions`}},summarize:body=>permissionRows(body).map(row=>pick(row,PERMISSION_COLUMNS)),
65
+ raw:body=>permissionRows(body)};var permissionResource={name:"permission",summary:`${LABEL}\u306B\u4ED8\u4E0E\u3067\u304D\u308B\u6A29\u9650`,operations:[permissionListOperation]};var apiKeyDomain={name:"api-key",summary:`\u30C6\u30CA\u30F3\u30C8\u306E${LABEL}\uFF08\u4E00\u89A7\u30FB\u8A73\u7D30\u30FB\u4F5C\u6210\u30FB\u66F4\u65B0\u30FB\u6709\u52B9/\u7121\u52B9\u30FB\u524A\u9664\u3002\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09`,operations:[listOperation,getOperation,createOperation,updateOperation,
66
+ statusOperation("active"),statusOperation("inactive"),deleteOperation],subresources:[permissionResource]};export{apiKeyDomain};
@@ -1,9 +1,9 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,describeAuditLog,describeToolCatalog,displayCwd,executeTool,findProjectTwpSubdir,localTools,lstatOrNull,parseFrontMatter,parseRule,persistProjectAllow,projectPermissionsPath,projectRootFor,readFileTool,residentInputs,resolveGitExecutable,runTurn,secretReason}from"./chunk-4DUZIRGL.js";import"./chunk-NZ7WI4RZ.js";import{buildDiffLines,
4
- diffStat}from"./chunk-VRBI2NPI.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import"./chunk-N2UVRM3Z.js";import"./chunk-6DM366P6.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";import"./chunk-II5RVJQN.js";import"./chunk-VFPY2A23.js";import{RelayError,builtinCatalog,classifyModelSwitch,createRuntime,loadCachedCatalog,modelLabel,pickModel,specFor,toModelInfos}from"./chunk-LLBLGHHZ.js";
5
- import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-XNLIEUAW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-EDF4U5BT.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.js";import{parseArgv}from"./chunk-UVTOBRHP.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,
6
- nextMode}from"./chunk-2LOT54OO.js";import"./chunk-JQQP7JLQ.js";import"./chunk-EOXTDZTA.js";import"./chunk-QQRJLH6B.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-UREA4ZIG.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{__commonJS,__export,__require,__toESM}from"./chunk-VSJBJXZO.js";var require_react_production=__commonJS({"node_modules/react/cjs/react.production.js"(exports){"use strict";var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element");var REACT_PORTAL_TYPE=Symbol.for("react.portal");var REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");var REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode");var REACT_PROFILER_TYPE=Symbol.for("react.profiler");var REACT_CONSUMER_TYPE=Symbol.for("react.consumer");var REACT_CONTEXT_TYPE=Symbol.for("react.context");var REACT_FORWARD_REF_TYPE=Symbol.
3
+ import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,describeAuditLog,describeToolCatalog,displayCwd,executeTool,findProjectTwpSubdir,localTools,lstatOrNull,parseFrontMatter,parseRule,persistProjectAllow,projectPermissionsPath,projectRootFor,readFileTool,residentInputs,resolveGitExecutable,runTurn,secretReason}from"./chunk-PTLUNRQS.js";import"./chunk-NZ7WI4RZ.js";import{buildDiffLines,
4
+ diffStat}from"./chunk-VRBI2NPI.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import"./chunk-N2UVRM3Z.js";import"./chunk-5TKHN3A5.js";import"./chunk-4DOPQ74T.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-II5RVJQN.js";import"./chunk-VFPY2A23.js";import{RelayError,builtinCatalog,classifyModelSwitch,createRuntime,loadCachedCatalog,modelLabel,pickModel,specFor,toModelInfos}from"./chunk-LLBLGHHZ.js";
5
+ import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-XNLIEUAW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-EDF4U5BT.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.js";import{parseArgv}from"./chunk-C7MCP63I.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,
6
+ nextMode}from"./chunk-2LOT54OO.js";import"./chunk-NJL3H2BB.js";import"./chunk-X3F7DOP5.js";import"./chunk-QBUVJBZ2.js";import"./chunk-QQRJLH6B.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-UREA4ZIG.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{__commonJS,__export,__require,__toESM}from"./chunk-VSJBJXZO.js";var require_react_production=__commonJS({"node_modules/react/cjs/react.production.js"(exports){"use strict";var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element");var REACT_PORTAL_TYPE=Symbol.for("react.portal");var REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");var REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode");var REACT_PROFILER_TYPE=Symbol.for("react.profiler");var REACT_CONSUMER_TYPE=Symbol.for("react.consumer");var REACT_CONTEXT_TYPE=Symbol.for("react.context");var REACT_FORWARD_REF_TYPE=Symbol.
7
7
  for("react.forward_ref");var REACT_SUSPENSE_TYPE=Symbol.for("react.suspense");var REACT_MEMO_TYPE=Symbol.for("react.memo");var REACT_LAZY_TYPE=Symbol.for("react.lazy");var REACT_ACTIVITY_TYPE=Symbol.for("react.activity");var REACT_VIEW_TRANSITION_TYPE=Symbol.for("react.view_transition");var MAYBE_ITERATOR_SYMBOL=Symbol.iterator;function getIteratorFn(maybeIterable){if(null===maybeIterable||"object"!==typeof maybeIterable)return null;maybeIterable=MAYBE_ITERATOR_SYMBOL&&maybeIterable[MAYBE_ITERATOR_SYMBOL]||
8
8
  maybeIterable["@@iterator"];return"function"===typeof maybeIterable?maybeIterable:null}var ReactNoopUpdateQueue={isMounted:function(){return false},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}};var assign=Object.assign;var emptyObject={};function Component(props,context,updater){this.props=props;this.context=context;this.refs=emptyObject;this.updater=updater||ReactNoopUpdateQueue}Component.prototype.isReactComponent={};Component.prototype.setState=
9
9
  function(partialState,callback){if("object"!==typeof partialState&&"function"!==typeof partialState&&null!=partialState)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,partialState,callback,"setState")};Component.prototype.forceUpdate=function(callback){this.updater.enqueueForceUpdate(this,callback,"forceUpdate")};function ComponentDummy(){}ComponentDummy.prototype=Component.prototype;function PureComponent2(props,context,updater){
@@ -1212,7 +1212,7 @@ cwd()){const listed=await gitListFiles(cwd2);const raw=listed??await walkFiles(c
1212
1212
  1;const after=/^[^\s]*/.exec(text.slice(cursor))?.[0]??"";return{query,start,end:cursor+after.length}}var TWP_SLASH_ROUTES={"/tasks":{domain:"task",operation:"list"},"/task":{domain:"task",operation:"get"},"/projects":{domain:"project",operation:"list"}};function isTwpSlashCommand(name){return Object.hasOwn(TWP_SLASH_ROUTES,name)}async function runTwpSlashCommand(name,args,deps){const route=TWP_SLASH_ROUTES[name];if(!Object.hasOwn(TWP_SLASH_ROUTES,name)||route===void 0){return{code:2,out:"",err:`\u4E0D\u660E\u306A\u30B3\u30DE\u30F3\u30C9: ${name}
1213
1213
  `}}const parsed=parseArgv([route.domain,route.operation,...args]);if(parsed.command!=="domain"||parsed.domain!==route.domain){return{code:2,out:"",err:`${name}: \u3053\u306E\u5F15\u6570\u306F\u4F7F\u3048\u307E\u305B\u3093\uFF08${args.join(" ")}\uFF09
1214
1214
  `}}if(parsed.unknown.length>0){return{code:2,out:"",err:`\u4E0D\u660E\u306A\u5F15\u6570: ${parsed.unknown.join(" ")}
1215
- `}}let out="";let err="";const io={out:text=>void(out+=text),err:text=>void(err+=text),isTty:true};const globals={profile:parsed.profile??deps.profile,...parsed.output!==void 0?{output:parsed.output}:{},...parsed.query!==void 0?{query:parsed.query}:{},dryRun:parsed.dryRun,debug:parsed.debug,yes:parsed.yes,refresh:parsed.refresh};const{runDomain}=await import("./run-AHNWMLZ4.js");try{const code=await runDomain({domain:route.domain,...parsed.operation!==void 0?{operation:parsed.operation}:
1215
+ `}}let out="";let err="";const io={out:text=>void(out+=text),err:text=>void(err+=text),isTty:true};const globals={profile:parsed.profile??deps.profile,...parsed.output!==void 0?{output:parsed.output}:{},...parsed.query!==void 0?{query:parsed.query}:{},dryRun:parsed.dryRun,debug:parsed.debug,yes:parsed.yes,refresh:parsed.refresh};const{runDomain}=await import("./run-EJT5I7NM.js");try{const code=await runDomain({domain:route.domain,...parsed.operation!==void 0?{operation:parsed.operation}:
1216
1216
  {},argv:parsed.domainArgv,help:parsed.domainHelp,globals,version:deps.version,io,...deps.fetchImpl!==void 0?{fetchImpl:deps.fetchImpl}:{}});return{code,out,err}}catch(e){return{code:1,out,err:`${err}${e.message}
1217
1217
  `}}}var GIT_LOG_OUTPUT=["9f3c1a2 feat(ui): \u4E00\u89A7\u306E\u30D5\u30A3\u30EB\u30BF\u3092 URL \u30AF\u30A8\u30EA\u3068\u540C\u671F\u3059\u308B","4b8e0d7 fix(ui): \u4EEE\u60F3\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u884C\u9AD8\u3055\u3092\u5B9F\u6E2C\u5024\u306B\u5408\u308F\u305B\u308B","c15a99e refactor(api): \u4E00\u89A7\u53D6\u5F97\u306E\u30DA\u30FC\u30B8\u30F3\u30B0\u51E6\u7406\u3092\u5171\u901A\u5316\u3059\u308B","2d70f4b test: \u4E00\u89A7\u30D5\u30A3\u30EB\u30BF\u306E\u56DE\u5E30\u30C6\u30B9\u30C8\u3092\u8FFD\u52A0\u3059\u308B",
1218
1218
  "a6e2b38 fix(api): \u7A7A\u306E\u691C\u7D22\u6761\u4EF6\u3067\u5168\u4EF6\u8FD4\u3089\u306A\u3044\u3088\u3046\u306B\u3059\u308B","7c40d51 chore(deps): \u958B\u767A\u4F9D\u5B58\u3092\u6700\u65B0\u3078\u66F4\u65B0\u3059\u308B","e83b1c6 docs: \u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u624B\u9806\u306B Node 22 \u306E\u524D\u63D0\u3092\u8FFD\u8A18\u3059\u308B","b91f7a4 fix(ui): \u30E2\u30FC\u30C0\u30EB\u306E\u91CD\u306A\u308A\u9806\u3092\u6307\u5B9A\u3059\u308B","5a2c8e0 perf(api): \u4E00\u89A7\u306E N+1 \u3092\u89E3\u6D88\u3059\u308B",
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{PUNCH_TYPES,assertMonthOpen,attendanceDomain}from"./chunk-MQOHOOJP.js";import"./chunk-UVCJXHWN.js";import{dateFlag,monthFlag}from"./chunk-EXT4AIDF.js";import"./chunk-3UOVTIM6.js";import"./chunk-RX5HWI4L.js";import"./chunk-JJSBBWJ5.js";import"./chunk-M763HXDH.js";import"./chunk-W4NLJ2YK.js";import"./chunk-6DM366P6.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";
4
- import"./chunk-IXT2X5BZ.js";import"./chunk-II5RVJQN.js";import"./chunk-MI6HVYR2.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiRejectedError,ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var CREATE_USAGE="twp attendance record create --date <YYYY-MM-DD> --time <HH:MM> --type <clock-in|clock-out|break-start|break-end|switch> [--project <\u30B3\u30FC\u30C9|ID>] [--task <\u30BF\u30B9\u30AFID>] [--memo <\u30E1\u30E2>]";var UPDATE_USAGE="twp attendance record update <\u8A18\u9332ID> --memo <\u30E1\u30E2> [--month <YYYY-MM>]";var DELETE_USAGE="twp attendance record delete <\u8A18\u9332ID> --reason <\u7406\u7531> --yes [--month <YYYY-MM>]";var MOVE_USAGE="twp attendance record move <\u8A18\u9332\
3
+ import{PUNCH_TYPES,assertMonthOpen,attendanceDomain}from"./chunk-SPQJNTAK.js";import"./chunk-UVCJXHWN.js";import"./chunk-45WIRMGL.js";import{dateFlag,monthFlag}from"./chunk-EXT4AIDF.js";import"./chunk-JJSBBWJ5.js";import"./chunk-A3VGBVQP.js";import"./chunk-W4NLJ2YK.js";import"./chunk-5TKHN3A5.js";import"./chunk-RX5HWI4L.js";import"./chunk-4DOPQ74T.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";
4
+ import"./chunk-MMVXE2CJ.js";import"./chunk-II5RVJQN.js";import"./chunk-MI6HVYR2.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiRejectedError,ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var CREATE_USAGE="twp attendance record create --date <YYYY-MM-DD> --time <HH:MM> --type <clock-in|clock-out|break-start|break-end|switch> [--project <\u30B3\u30FC\u30C9|ID>] [--task <\u30BF\u30B9\u30AFID>] [--memo <\u30E1\u30E2>]";var UPDATE_USAGE="twp attendance record update <\u8A18\u9332ID> --memo <\u30E1\u30E2> [--month <YYYY-MM>]";var DELETE_USAGE="twp attendance record delete <\u8A18\u9332ID> --reason <\u7406\u7531> --yes [--month <YYYY-MM>]";var MOVE_USAGE="twp attendance record move <\u8A18\u9332\
5
5
  ID> --project <\u30B3\u30FC\u30C9|ID> [--month <YYYY-MM>]";var TEXT_MAX=500;var UUID_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;var TIME_PATTERN=/^(\d{2}):(\d{2})(?::(\d{2}))?$/;var CLOSED_REASON="\u30B5\u30FC\u30D0\u306F\u7DE0\u3081\u6E08\u307F\u306E\u6708\u3078\u306E\u4FEE\u6B63\u3092\u62D2\u5426\u305B\u305A\u7DE0\u3081\u306E\u96C6\u8A08\u3092\u6D17\u3044\u66FF\u3048\u308B\u306E\u3067\u3001CLI \u304C\u9001\u308B\u524D\u306B\u6B62\u3081\u3066\u3044\u307E\u3059\u3002";
6
6
  var FORBIDDEN="\u81EA\u5206\u306E\u6253\u523B\u306E\u4FEE\u6B63\u306B\u306F\u6253\u523B\u4FEE\u6B63\u306E\u6A29\u9650\uFF08\u30E6\u30FC\u30B6\u30FC\u8A2D\u5B9A\u306E\u300C\u6253\u523B\u4FEE\u6B63\u300D\uFF09\u3068\u52E4\u6020\u306E\u5229\u7528\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u306E\u7BA1\u7406\u8005\u306B\u4ED8\u4E0E\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044";var RECORD_COLUMNS=["id","type","type_label","recorded_at","year_month","project_id","t\
7
7
  ask_id","memo","is_manual","deleted_at"];var LABELS={clock_in:"\u51FA\u52E4",clock_out:"\u9000\u52E4",break_start:"\u4F11\u61A9\u958B\u59CB",break_end:"\u4F11\u61A9\u7D42\u4E86",switch:"\u5207\u66FF"};var TYPE_ORDER={break_start:1,break_end:2,switch:3,clock_out:4,clock_in:5};function zonedParts(epochMs,timeZone){const parts=new Intl.DateTimeFormat("en-US",{timeZone,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}).formatToParts(new Date(
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{hoursMinutes}from"./chunk-MQOHOOJP.js";import"./chunk-UVCJXHWN.js";import{monthFlag}from"./chunk-EXT4AIDF.js";import"./chunk-3UOVTIM6.js";import"./chunk-RX5HWI4L.js";import"./chunk-JJSBBWJ5.js";import"./chunk-M763HXDH.js";import"./chunk-W4NLJ2YK.js";import"./chunk-6DM366P6.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";import"./chunk-II5RVJQN.js";
3
+ import{hoursMinutes}from"./chunk-SPQJNTAK.js";import"./chunk-UVCJXHWN.js";import"./chunk-45WIRMGL.js";import{monthFlag}from"./chunk-EXT4AIDF.js";import"./chunk-JJSBBWJ5.js";import"./chunk-A3VGBVQP.js";import"./chunk-W4NLJ2YK.js";import"./chunk-5TKHN3A5.js";import"./chunk-RX5HWI4L.js";import"./chunk-4DOPQ74T.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-II5RVJQN.js";
4
4
  import"./chunk-MI6HVYR2.js";import"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MONTH_FLAG={name:"--month",summary:"\u5BFE\u8C61\u306E\u5E74\u6708\uFF08YYYY-MM\uFF09",takesValue:true,placeholder:"<YYYY-MM>"};var ME_FLAG={name:"--me",summary:"\u81EA\u5206\u306E\u5206\u3060\u3051\u3092\u8868\u793A\u3059\u308B\uFF08\u7121\u3051\u308C\u3070\u5168\u54E1\u5206\u30FB\u7BA1\u7406\u8005\uFF09",takesValue:false};var FORBIDDEN_ADMIN="\u6A29\u9650\u304C\u8DB3\u308A\u307E\u305B\u3093\u3002\u5168\u54E1\u5206\uFF08--me \u306A\u3057\uFF09\u306F\u52E4\u6020\u306E\u7BA1\u7406\u8005\u6A29\u9650\uFF08\u52E4\u6020: \u7BA1\u7406\u8005\uFF09\u3001\u81EA\u5206\u306E\u5206\uFF08--me\uFF09\u306F\u52E4\u6020\u306E\u5229\u7528\u6A29\u9650\u304C\u8981\u308A\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u306E\u7BA1\u7406\u8005\u306B\u6A29\u9650\u306E\u4ED8\u4E0E\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044";
5
5
  function listBody(spec,body){if(!isRecord(body)||!Array.isArray(body[spec.key])){throw new ApiResponseError(`${spec.label}\u306E\u5FDC\u7B54\u306B ${spec.key} \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return body}function monthListOperation(spec){const usage=`twp ${spec.domain} list [--month <YYYY-MM>] [--me]`;return{name:"list",summary:`\u6708\u306E${spec.label}\u3092\u4E00\u89A7\u3059\u308B\uFF08--me \u3067\u81EA\u5206\u306E\u5206\u30FB\u7121\u3051\u308C\u3070\u5168\u54E1\u5206\uFF1D\u7BA1\u7406\u8005\uFF09`,
6
6
  usage,description:`GET ${spec.path} \u3092\u8868\u793A\u3057\u307E\u3059\uFF08\u5168\u54E1\u5206\u30FB\u52E4\u6020\u306E\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\uFF09\u3002--me \u3092\u4ED8\u3051\u308B\u3068 GET ${spec.path}/me\uFF08\u81EA\u5206\u306E\u5206\uFF09\u3067\u3059\u3002
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{repeatedValues}from"./chunk-RX5HWI4L.js";import{readBody}from"./chunk-M763HXDH.js";import"./chunk-W4NLJ2YK.js";import{BACKLOG_BASE_PATH,BACKLOG_PROJECT_SCOPE_LABEL,BACKLOG_SCOPE_LABEL,backlogSpacePath,isExactNumericId,resolveNamed}from"./chunk-6DM366P6.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";import"./chunk-II5RVJQN.js";import{LIST_FLAGS}from"./chunk-MI6HVYR2.js";
3
+ import{readBody}from"./chunk-A3VGBVQP.js";import"./chunk-W4NLJ2YK.js";import"./chunk-5TKHN3A5.js";import{repeatedValues}from"./chunk-RX5HWI4L.js";import{BACKLOG_BASE_PATH,BACKLOG_PROJECT_SCOPE_LABEL,BACKLOG_SCOPE_LABEL,backlogSpacePath,isExactNumericId,resolveNamed}from"./chunk-4DOPQ74T.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-II5RVJQN.js";import{LIST_FLAGS}from"./chunk-MI6HVYR2.js";
4
4
  import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var DEFAULT_COUNT=20;var MAX_COUNT=100;var NUMERIC=/^[0-9]+$/;var ISSUE_REF=/^(?:[A-Za-z0-9_]+-[0-9]+|[0-9]+)$/;var DATE=/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;var SPACE_COLUMNS=["id","space_url"];var PROJECT_COLUMNS=["id","projectKey","name"];var ISSUE_LIST_COLUMNS=["issueKey","summary","status","assignee","priority","dueDate","updated","descriptionTruncated"];var ISSUE_GET_COLUMNS=["id","issueKey","projectId","summary","description","descriptionTruncated","status","issueType","priority","assignee","cr\
5
5
  eatedUser","parentIssueId","startDate","dueDate","estimatedHours","actualHours","created","updated"];var ISSUE_JSON_SHAPE_HELP='--output json \u306E\u5F62\uFF08Backlog API \u306E\u5F62\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09:\n TWP \u30B5\u30FC\u30D0\u304C\u6574\u3048\u305F\u5F62\u3067\u8FD4\u308A\u307E\u3059\u3002Backlog API \u306E\u8AB2\u984C\u3092\u305D\u306E\u307E\u307E\u8AAD\u3080\u524D\u63D0\u3067\u66F8\u304F\u3068\u58CA\u308C\u307E\u3059\u3002\n - status / priority / resolution / issueType / assignee / createdUser / updatedUser \u306F\n \u540D\u524D\u306E\u6587\u5B57\u5217\u3067\u3059\uFF08{id, name} \u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\u3002ID \u306F statusId / issueTypeId /\n assigneeId \u2026 \u306E\u3088\u3046\u306B\u672B\u5C3E Id \u306E\u5225\u30AD\u30FC\u306B\u3042\u308A\u307E\u3059\u3002\u672A\u8A2D\u5B9A\u306A\u3089\u4E21\u65B9 null \u3067\u3059\u3002\n - category / versions / milestone \u306F {id, name} \u306E\u914D\u5217\u306E\u307E\u307E\u3067\u3059\uFF08\u8907\u6570\u4ED8\u3051\u3089\u308C\u308B\u305F\u3081\u3001\n \
6
6
  \u540D\u524D\u3068 ID \u3092\u5225\u30AD\u30FC\u3078\u5206\u3051\u308B\u3068\u5BFE\u5FDC\u304C\u5D29\u308C\u307E\u3059\uFF09\u3002customFields \u3082\u914D\u5217\u3067\u3059\u3002\n \u4F8B\uFF081\u4EF6\u30FB\u629C\u7C8B\uFF09:\n {"id": 1234, "issueKey": "PRJ-12", "summary": "\u2026",\n "statusId": 1, "status": "\u672A\u5BFE\u5FDC", "issueTypeId": 56, "issueType": "\u30BF\u30B9\u30AF",\n "assigneeId": 91, "assignee": "\u8C37 \u6A39",\n "category": [{"id": 7, "name": "\u8A2D\u8A08"}], "milestone": [], ...}\n --query \u3082\u3053\u306E\u5F62\u306B\u5F53\u305F\u308A\u307E\u3059\uFF08issue list \u306E\u4F8B: --query "[].{key: issueKey, type: issueType}"\uFF09\u3002';
@@ -1,4 +1,4 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{breakdownRows,budgetDomain,dashboardRows,fiscalYear,importRejection,overwriteLines,parseAllocationRows,parseSplit,parseTargetRows,periodsLabel}from"./chunk-7UAJ3ZY7.js";import"./chunk-NB2GXB27.js";import"./chunk-MQOHOOJP.js";import"./chunk-UVCJXHWN.js";import"./chunk-EXT4AIDF.js";import"./chunk-3UOVTIM6.js";import"./chunk-RX5HWI4L.js";import"./chunk-JJSBBWJ5.js";import"./chunk-M763HXDH.js";import"./chunk-W4NLJ2YK.js";import"./chunk-6DM366P6.js";
4
- import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-IXT2X5BZ.js";import"./chunk-II5RVJQN.js";import"./chunk-MI6HVYR2.js";import"./chunk-PS5QFKHB.js";import"./chunk-3ZRMMBP5.js";import"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{breakdownRows,budgetDomain,dashboardRows,fiscalYear,importRejection,overwriteLines,parseAllocationRows,parseSplit,parseTargetRows,periodsLabel};
3
+ import{breakdownRows,budgetDomain,dashboardRows,fiscalYear,importRejection,overwriteLines,parseAllocationRows,parseSplit,parseTargetRows,periodsLabel}from"./chunk-YB4ZDJXR.js";import"./chunk-SQMJ7XKE.js";import"./chunk-SPQJNTAK.js";import"./chunk-UVCJXHWN.js";import"./chunk-45WIRMGL.js";import"./chunk-EXT4AIDF.js";import"./chunk-JJSBBWJ5.js";import"./chunk-A3VGBVQP.js";import"./chunk-W4NLJ2YK.js";import"./chunk-5TKHN3A5.js";import"./chunk-RX5HWI4L.js";
4
+ import"./chunk-4DOPQ74T.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-MMVXE2CJ.js";import"./chunk-II5RVJQN.js";import"./chunk-MI6HVYR2.js";import"./chunk-PS5QFKHB.js";import"./chunk-3ZRMMBP5.js";import"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{breakdownRows,budgetDomain,dashboardRows,fiscalYear,importRejection,overwriteLines,parseAllocationRows,parseSplit,parseTargetRows,periodsLabel};
@@ -16,7 +16,7 @@ const out=deps.out??(t=>void process.stdout.write(stripTerminalControls(t)));con
16
16
  ${e.hint?`${e.hint}
17
17
  `:""}`);return EXIT_USAGE}const res=await deps.get();if(!res.ok){err(`\u26D4 \u5B9F\u884C\u6A5F\u306E\u72B6\u614B\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\uFF08${errorDetail(res)}\uFF09
18
18
  `);return apiExit(res)}const overview=parseOverview(res,opts,(deps.now??Date.now)());if(overview===null){err(`\u26D4 \u5B9F\u884C\u6A5F\u306E\u72B6\u614B\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}\uFF09
19
- `);return EXIT_API_SERVER}const{evaluateQuery}=await import("./query-XEOVFI4D.js");const{renderOutput}=await import("./render-BY4KHD5D.js");if(format==="json"){const selected2=opts.query===void 0?overview:await evaluateQuery(opts.query,overview);const text2=renderOutput(selected2,"json");out(text2.endsWith("\n")?text2:`${text2}
19
+ `);return EXIT_API_SERVER}const{evaluateQuery}=await import("./query-XEOVFI4D.js");const{renderOutput}=await import("./render-XILFR4N3.js");if(format==="json"){const selected2=opts.query===void 0?overview:await evaluateQuery(opts.query,overview);const text2=renderOutput(selected2,"json");out(text2.endsWith("\n")?text2:`${text2}
20
20
  `);return EXIT_OK}const runnerCount=overview.projects.reduce((n,p)=>n+p.runners.length,0);const hiddenNote=overview.hidden_stopped>0?`\u30FB\u505C\u6B62\u4E2D ${overview.hidden_stopped}\u53F0\u306F\u975E\u8868\u793A\uFF08--include-stopped \u3067\u8868\u793A\uFF09`:"";const serverHidden=overview.projects.filter(p=>(p.hidden_count??0)>0).map(p=>`${projectLabel(p)}: ${p.hide_after_days??"?"}\u65E5\u4EE5\u4E0A\u5FDC\u7B54\u306E\u306A\u3044${p.hidden_count}\u53F0`).join("\u3001");err(`\u5B9F\u884C\u6A5F ${runnerCount}\
21
21
  \u53F0\uFF08${overview.projects.length}\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\uFF09${hiddenNote}\u30FB\u53D6\u5F97 ${overview.generated_at||"\u4E0D\u660E"}
22
22
  `);if(serverHidden!=="")err(`\u30B5\u30FC\u30D0\u5074\u3067\u4E00\u89A7\u304B\u3089\u5916\u308C\u3066\u3044\u308B\u6A5F: ${serverHidden}
@@ -1,3 +1,3 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{redactSecretValues,redactSecrets}from"./chunk-IXT2X5BZ.js";import{formatOutput}from"./chunk-74BPZOKU.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";function renderOutput(value,format,noRedact=false){if(noRedact)return formatOutput(value,format);const formatted=formatOutput(redactSecretValues(value),format);return format==="json"?formatted:redactSecrets(formatted)}function renderDocument(text,noRedact=false){const visible=stripTerminalControls(text);return noRedact?visible:redactSecrets(visible)}export{renderOutput,renderDocument};
3
+ import{redactSecretValues,redactSecrets}from"./chunk-5TKHN3A5.js";import{formatOutput}from"./chunk-74BPZOKU.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";function renderOutput(value,format,noRedact=false){if(noRedact)return formatOutput(value,format);const formatted=formatOutput(redactSecretValues(value),format);return format==="json"?formatted:redactSecrets(formatted)}function renderDocument(text,noRedact=false){const visible=stripTerminalControls(text);return noRedact?visible:redactSecrets(visible)}export{renderOutput,renderDocument};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{CUSTOMER_FLAG,CUSTOMER_LICENSE,childForbidden,levelForbidden,prepareCustomerFlag}from"./chunk-ELW4VTSK.js";import{inspectLocalFile}from"./chunk-WTYIFLVB.js";import{checkUploadQuota}from"./chunk-V64CGX7V.js";import{createFlags,fieldBody,hasAnyField,updateFlags}from"./chunk-3UOVTIM6.js";import{booleanText}from"./chunk-JJSBBWJ5.js";import{CUSTOMERS_PATH,isExactNumericId}from"./chunk-6DM366P6.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{
3
+ import{CUSTOMER_FLAG,CUSTOMER_LICENSE,childForbidden,levelForbidden,prepareCustomerFlag}from"./chunk-TUFWQYKB.js";import{inspectLocalFile}from"./chunk-WTYIFLVB.js";import{checkUploadQuota}from"./chunk-V64CGX7V.js";import{createFlags,fieldBody,hasAnyField,updateFlags}from"./chunk-45WIRMGL.js";import{booleanText}from"./chunk-JJSBBWJ5.js";import{CUSTOMERS_PATH,isExactNumericId}from"./chunk-4DOPQ74T.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{
4
4
  ApiError}from"./chunk-JA5A6UJ2.js";import{nonEmpty}from"./chunk-MI6HVYR2.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import{acknowledgement,isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import{NotLoggedInError,SessionExpiredError}from"./chunk-XNLIEUAW.js";import fs from"fs";import path from"path";var CONTRACT_TYPES=["basic_contract","nda","other"];var CONTRACT_TYPE_HELP="basic_contract\uFF1D\u57FA\u672C\u5951\u7D04\u66F8 / nda\uFF1D\u6A5F\u5BC6\u4FDD\u6301\u5951\u7D04\u66F8 / other\uFF1D\u305D\u306E\u4ED6\u5951\u7D04\u66F8\u985E";var FILE_NAME_MAX_CHARS=255;var PDF_MAGIC="%PDF-";var CONTRACT_FIELDS=[{kind:"text",flag:"--name",key:"document_name",label:"\u66F8\u985E\u540D",maxChars:255,summary:"\u66F8\u985E\u540D\uFF08create \u3067\u306F\u5FC5\u9808\uFF09"},{kind:"enum",flag:"--type",key:"\
5
5
  document_type",values:CONTRACT_TYPES,summary:`\u66F8\u985E\u7A2E\u5225\uFF08${CONTRACT_TYPE_HELP}\u30FBcreate \u3067\u306F\u5FC5\u9808\uFF09`}];var CONTRACT_COLUMNS=["document_id","company_id","document_type","document_name","current_version","updated_by_name","updated_at"];var VERSION_COLUMNS=["version_number","file_name","file_size","is_current","created_by_name","created_at"];var CASE_COLUMNS=["document_id","document_type_label","document_name","estimate_no","estimate_title","project_name","c\
6
6
  urrent_version","updated_at"];var FILE_FLAG={name:"--file",summary:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3059\u308B PDF \u30D5\u30A1\u30A4\u30EB\u306E\u30D1\u30B9\uFF08\u5FC5\u9808\uFF09",takesValue:true,placeholder:"<\u30D1\u30B9.pdf>"};var OUT_FLAG={name:"--out",summary:"\u66F8\u304D\u51FA\u3057\u5148\u306E\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\uFF08\u5FC5\u9808\u3002\u6A19\u6E96\u51FA\u529B\u3078\u306F\u51FA\u3057\u307E\u305B\u3093\uFF09",takesValue:true,placeholder:"<\u30D1\u30B9>"};var FORCE_FLAG={
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{placeholderTaskKey,stepToItem}from"./chunk-3D734ED2.js";import{localDate}from"./chunk-6EQLA56A.js";import{redactLoopOutput}from"./chunk-NXPLTDN4.js";import{normalizeSkillName,skillOfItem}from"./chunk-FABDZBDZ.js";import{DEFAULT_SKILL_PREFIX,SKILL_PREFIX_RE,setSkillPrefix,skillCommand,skillPrefix}from"./chunk-6CS5L24D.js";import{describeError,pick,pickString}from"./chunk-UZUV5FYG.js";import{isTaskKey}from"./chunk-II5RVJQN.js";import{createHash,randomBytes}from"crypto";import fs from"fs";import path from"path";var INFLIGHT_STALE_HOURS=3;function staleFloorHours(aiTimeoutSec){return Math.ceil(aiTimeoutSec*2/3600)}function inflightStaleHours(aiTimeoutSec,baseHours=INFLIGHT_STALE_HOURS){const base=Number.isFinite(baseHours)&&baseHours>0?baseHours:INFLIGHT_STALE_HOURS;return Math.max(base,staleFloorHours(aiTimeoutSec))}function ageMinutesOf(item,now){for(const raw of[item.started_at,item.updated_at,item.dequeued_at,item.created_at]){if(!raw)continue;const ts=Date.parse(raw);if(Number.isNaN(ts))continue;return Math.
3
+ import{placeholderTaskKey,stepToItem}from"./chunk-P54LCXEY.js";import{localDate}from"./chunk-INS77QHY.js";import{redactLoopOutput}from"./chunk-BABZL52A.js";import{normalizeSkillName,skillOfItem}from"./chunk-FABDZBDZ.js";import{DEFAULT_SKILL_PREFIX,SKILL_PREFIX_RE,setSkillPrefix,skillCommand,skillPrefix}from"./chunk-6CS5L24D.js";import{describeError,pick,pickString}from"./chunk-UZUV5FYG.js";import{isTaskKey}from"./chunk-II5RVJQN.js";import{createHash,randomBytes}from"crypto";import fs from"fs";import path from"path";var INFLIGHT_STALE_HOURS=3;function staleFloorHours(aiTimeoutSec){return Math.ceil(aiTimeoutSec*2/3600)}function inflightStaleHours(aiTimeoutSec,baseHours=INFLIGHT_STALE_HOURS){const base=Number.isFinite(baseHours)&&baseHours>0?baseHours:INFLIGHT_STALE_HOURS;return Math.max(base,staleFloorHours(aiTimeoutSec))}function ageMinutesOf(item,now){for(const raw of[item.started_at,item.updated_at,item.dequeued_at,item.created_at]){if(!raw)continue;const ts=Date.parse(raw);if(Number.isNaN(ts))continue;return Math.
4
4
  floor((now.getTime()-ts)/6e4)}return null}function inflightEntries(items,now=new Date,staleHours=INFLIGHT_STALE_HOURS){const staleMinutes=staleHours*60;const byKey=new Map;for(const item of items){const key=(item.task_key??"").trim();if(!key)continue;const ageMinutes=ageMinutesOf(item,now);if(ageMinutes!==null&&ageMinutes>staleMinutes)continue;const entry={key,runner:item.runner_id??"-",ageMinutes,label:(item.label??"").slice(0,60)};const prev=byKey.get(key);if(!prev||(entry.ageMinutes??-1)>(prev.
5
5
  ageMinutes??-1))byKey.set(key,entry)}return[...byKey.values()].sort((a,b)=>a.key.localeCompare(b.key))}function formatInflightEntry(entry){const age=entry.ageMinutes===null?"\u4E0D\u660E":`${entry.ageMinutes}\u5206`;return`${entry.key} runner=${entry.runner} \u7D4C\u904E=${age}`}async function createItem(api,body){const res=await api.create(redactItemBody(body));if(!res.ok)return{itemId:null,detail:describeError(res)};for(const p of["item_id","id","item.item_id","item.id","data.item_id","data.id"]){const v=pickString(res.json,p);if(v)return{itemId:v,detail:""}}return{itemId:null,detail:`item_id \u3092\u8AAD\u3081\u307E\u305B\u3093: ${res.raw.slice(0,200)}`}}function redactItemBody(body){const out={...body};for(const key of["prompt","label"]){if(typeof out[key]==="string")
6
6
  out[key]=redactLoopOutput(out[key])}return out}function reorderSucceeded(targetId,json){if(pick(json,"result")===true)return true;const raw=Array.isArray(json)?json:pick(json,"items");if(!Array.isArray(raw)||raw.length===0)return false;const items=raw;const orderOf=it=>typeof it.sort_order==="number"?it.sort_order:Number.POSITIVE_INFINITY;const hit=items.find(it=>(it.item_id??"")===targetId);if(!hit)return false;return orderOf(hit)===Math.min(...items.map(orderOf))}function queueContainsKey(items,key){