Module: Chocomint::EditHandlers

Included in:
Server
Defined in:
lib/chocomint/edit_handlers.rb,
lib/chocomint/edit_html.rb

Overview

/edit AI エディタの HTTP ハンドラ群 (Server に include して使う)。

提供機能:

GET  /edit            エディタ画面 (メニュー/ファイル一覧/Monaco/AIチャット/コンソール)
GET  /edit/assets/*   Monaco / xterm.js のローカル同梱アセット配信
GET  /edit/static/*   自前の CSS/JS 配信 (public/edit/)
GET  /edit/files      workspace のファイル一覧 (JSON)
GET  /edit/file?path= ファイル内容 (JSON)
POST /edit/save       ファイル保存 (PathGuard で workspace 内に限定)
POST /edit/chat       自然言語指示で AI 編集 (Planner が提案→実行→検証→再試行)

ファイルアクセスはすべて @path_guard 経由で許可ディレクトリ内に制限する。

Constant Summary collapse

EDIT_HTML_TEMPLATE =

/edit のシングルページ HTML。実体は public/edit/index.html (CSS/JS も同ディレクトリ) で、 ここでは読み込むだけ。__WS_CONFIG__ はサーバー側で WebSocket 接続情報 (JSON) に置換される。

File.read(File.expand_path("../../public/edit/index.html", __dir__))
EXCLUDED_TREE_DIRS =

中身を展開しない VCS メタデータ・依存パッケージ等 (一覧を埋め尽くすため除外する)。 ディレクトリ名 (basename) で判定するため、"vendor/bundle" のようなパス階層は含めない。

%w[.git .hg .svn .venv venv node_modules .bundle].freeze
MAX_DIR_ENTRIES =

1ディレクトリあたりの列挙上限。通常は到達しないが、数万エントリを持つ異常な ディレクトリでブラウザを固めないための安全弁。到達時は capped=true を返す。

5000
RAW_CONTENT_TYPES =

拡張子から Content-Type を推定する。未知の拡張子は octet-stream。

{
  # 画像 (ラスター)
  ".png" => "image/png", ".jpg" => "image/jpeg", ".jpeg" => "image/jpeg",
  ".gif" => "image/gif", ".webp" => "image/webp", ".bmp" => "image/bmp",
  ".ico" => "image/x-icon", ".avif" => "image/avif", ".apng" => "image/apng",
  ".tif" => "image/tiff", ".tiff" => "image/tiff",
  # 画像 (ベクター)
  ".svg" => "image/svg+xml",
  # 文書
  ".pdf" => "application/pdf",
  # 動画
  ".mp4" => "video/mp4", ".m4v" => "video/mp4", ".webm" => "video/webm",
  ".ogv" => "video/ogg", ".mkv" => "video/x-matroska", ".mov" => "video/quicktime",
  ".avi" => "video/x-msvideo",
  # 音声
  ".mp3" => "audio/mpeg", ".wav" => "audio/wav", ".ogg" => "audio/ogg",
  ".oga" => "audio/ogg", ".m4a" => "audio/mp4", ".aac" => "audio/aac",
  ".flac" => "audio/flac", ".opus" => "audio/opus", ".weba" => "audio/webm"
}.freeze
MEDIA_KINDS =

拡張子 → メディア種別 ("image" / "pdf" / "video" / "audio")。フロントはこの値で 表示ウィジェット ( /