---
# ai_support_agent_k8s ロールの既定値。
#
# 秘匿値・環境固有の必須値（token / project）は既定を持たせず空にする。
# ssh_key / tailscale ロールと同じ流儀で、呼び出し側が ANSIBLE# 変数から
# 供給し、未設定は tasks/main.yml の assert が名指しで案内する。

# 必須。エージェントトークン（ANSIBLE# 変数から供給する秘匿値）。
ai_support_agent_k8s_token: ''

# 必須。`tenantCode/projectCode`（例: mbc/MBC_01）。
ai_support_agent_k8s_project: ''

# レプリカ数。契約プランの上限を超えた分は起動後 standby で待機し、
# 稼働中レプリカが停止した時点で自動的に引き継ぐ。
ai_support_agent_k8s_replicas: 1

# ワークスペースの永続化。既定はオプトイン（オフ）。
# 有効にすると volumeClaimTemplates によりレプリカごとに専用 PVC が発行される
# （1つの PVC を共有する構成にはしない。RWO は Multi-Attach で衝突し、RWX でも
# 全レプリカが同じ git ワークツリーを踏み合って壊れるため）。
ai_support_agent_k8s_persistence: false
ai_support_agent_k8s_storage_class: longhorn
ai_support_agent_k8s_storage_size: 20Gi

# Pod 終了時の猶予（秒）。SIGTERM を受けたエージェントは実行中コマンドの drain
# （SHUTDOWN_DRAIN_TIMEOUT_MS = 300 秒）を待ってからレプリカ枠を release する。
# **明示しないと Kubernetes の既定 30 秒**で SIGKILL され、drain の途中で殺されて
# 実行中コマンドを見捨てたまま枠が残り、サーバーが別レプリカへ再割当して二重実行する。
#
# 値は同じエージェントを配置する別経路と揃える: src/manifest/manifest-generator.ts の
# TERMINATION_GRACE_PERIOD_SECONDS（= src/constants.ts の SHUTDOWN_GRACE_PERIOD_SECONDS、
# drain 300 秒 + release と終了処理のための 20 秒）。片方だけ変えると
# __tests__/server-setup/ai-support-agent-k8s-role.spec.ts が失敗する。
ai_support_agent_k8s_termination_grace_period_seconds: 320

# 実行中のエージェント自身の instance id。runner（src/server-setup/server-setup-runner.ts の
# SELF_INSTANCE_ID_VAR）が extra-vars で渡す**予約変数**であり、レシピ側から指定する
# ものではない（指定しても runner の値が必ず優先される）。
#
# StatefulSet の Pod 名は `<StatefulSet名>-<序数>` なので、ロールはこの値を
# `^<item.name>-[0-9]+$`（vars/main.yml の ai_support_agent_k8s_item_is_self）と
# 突き合わせて「このエントリは自分自身か」を判定する。序数まで検証するのは、単なる
# 前方一致だと名前が接頭辞で重なる別プロジェクト（例: `agent` と `agent-canary`）を
# 取り違えるため。既定の空文字は「自己ターゲットではない」（K8s 以外の実行経路）を意味する。
ai_support_agent_k8s_self_instance_id: ''

# 自己再起動待ちの申告に使うハンドシェイク用パス。runner（src/server-setup/
# server-setup-runner.ts の SELF_RESTART_MARKER_VAR / SELF_RESTART_ACK_VAR）が
# extra-vars で渡す**予約変数**であり、レシピ側から指定するものではない。
#
# 自己ターゲットの StatefulSet を触ると自 Pod が置き換わり、この実行の結果は
# 報告されないまま終わる。そこで再起動へ進む**前**に marker ファイルをコントローラ
# （＝実行中のエージェント自身）へ置き、エージェントがサーバーへ「自己再起動待ち」を
# 申告してから書く ack ファイルを待つ。待つことで「申告 → 再起動」の順序が保証される
# （1秒ポーリングと kubectl apply の競争にしない）。
#
# 既定の空文字は「誰も見ていない＝ハンドシェイクしない」を意味する（ローカル実行など
# 進捗の監視が無い経路）。空のまま待つと、答える者がいない ack を待ち続けることになる。
ai_support_agent_k8s_self_restart_marker_file: ''
ai_support_agent_k8s_self_restart_ack_file: ''

# ack を待つ上限（秒）。エージェント側はポーリング間隔 1 秒 + API リクエストの
# タイムアウト（API_REQUEST_TIMEOUT = 10 秒）で応答するため十分に長い。無期限には
# しない: エージェントが応答できない状態でも配置そのものは進めるべきで、待ち続けると
# ansible 全体の 30 分上限を食い潰す。
ai_support_agent_k8s_self_restart_ack_timeout_seconds: 60

# エージェントのデータディレクトリ。永続ボリュームのマウント先であり、同時に
# AI_SUPPORT_AGENT_CONFIG_DIR としてコンテナへ渡す。
#
# エージェントは既定で `$HOME/.ai-support-agent/projects/<tenant>/<project>/workspace/...`
# へ書き込む（config-manager.ts の getConfigDir / project-dir.ts の
# getDefaultProjectDirTemplate）。無関係なパスへ PVC をマウントすると「PVC は作られる
# が中身は空、実データは Pod 再作成で消える」という、成功したように見える無効化に
# なるため、CONFIG_DIR をこのパスへ明示的に向ける。
#
# 永続化がオフでも同じ値を渡す（後から有効化しても保存先が変わらないようにするため）。
# なお `~/.claude` 等、エージェントのデータディレクトリ外にある状態は永続化対象外。
ai_support_agent_k8s_data_dir: /data

# Kubernetes リソース名（DNS-1123 ラベル）。1クラスタに複数プロジェクトの
# エージェントを同居させる場合は、include_role ごとに別名を与える。
ai_support_agent_k8s_name: ai-support-agent
ai_support_agent_k8s_namespace: ai-support-agent

# コンテナイメージ。tasks/main.yml の assert が公式リポジトリに限定する
# （許可リストは assert 内のインラインリテラルであり、この変数ではない）。
ai_support_agent_k8s_image: ghcr.io/mbc-net/ai-support-agent-cli:latest

# 接続先 API。既定は CLI の DEFAULT_API_URL（src/constants.ts）と同じ本番 API。
ai_support_agent_k8s_api_url: https://api.ai-support-agent.com

# クラスタへの接続手段。既定は k3s の標準パス。
ai_support_agent_k8s_kubectl: /usr/local/bin/kubectl
ai_support_agent_k8s_kubeconfig: /etc/rancher/k3s/k3s.yaml

# 適用したマニフェストの保存先（監査・再適用用。秘匿値は含まない）。
ai_support_agent_k8s_manifest_dir: /etc/ai-support-agent/k8s

# 複数プロジェクトを1クラスタへ配置する場合のリスト。
#
# エントリごとに独立した StatefulSet と Secret を作る。`agentId` はトークンの
# tokenId から導出される（src/agent-runner.ts の resolveAgentId）ため、複数
# プロジェクトで1つのトークンを共有すると agentId が衝突し、サーバー側の TOFU
# バインディングが "Agent ID does not match the token binding" で接続を拒否する。
# したがって token はエントリごとに必須である。
#
# エントリのキー:
#   project   必須。`tenantCode/projectCode`（例: mbc/MBC_01）
#   name      必須。StatefulSet / Secret 名（DNS-1123 ラベル）。projectCode は
#             MBC_01 のようにアンダースコアを含み K8s 名に使えないため、コードから
#             機械的に導出せず明示させる
#   token     必須。そのプロジェクト専用のトークン（ANSIBLE# 変数から供給）
#   replicas / persistence / storage_class / storage_size
#             任意。省略時はこのファイルのトップレベル既定値を継承する
#
# 単数指定（ai_support_agent_k8s_project / _token）とは排他である。両方を指定した
# 場合は tasks/main.yml の assert が失敗する（どちらが効いているか分からない状態を
# 作らないため）。
ai_support_agent_k8s_projects: []
