2.6 KiB
2.6 KiB
Scope の再設計
背景
Scope は Pod の作業ディレクトリとアクセス権限を定義するもの。全ての Pod が必ず持つ。
現状の問題:
Pod.scopeがOption<Scope>— scope なしの Pod が存在しうる(ツールが登録されない)Scopeがroot: PathBufしか持たない — 書き込み許可/禁止の概念がない- Scope なしの場合、Glob/Grep のデフォルト検索パスがない
- マニフェストで
[scope]省略時のフォールバックが定義されていない
方針
Scope の拡張
pub struct Scope {
pwd: PathBuf, // 作業ディレクトリ
writable: bool, // false = 読み取り専用 Pod
}
writable: true(デフォルト): Read/Write/Edit/Glob/Grep 全て使えるwritable: false: Read/Glob/Grep のみ。Write/Edit はエラーpwdは Glob/Grep のデフォルト検索パスとしても使われる
Pod で必須化
pub struct Pod<C, St> {
scope: Scope, // Option ではない
// ...
}
マニフェスト
# 明示指定
[scope]
pwd = "./src"
writable = false # 省略時 true
# [scope] 省略時 → マニフェストファイルの親ディレクトリが pwd、writable = true
Pod::new()(マニフェストなし構築)では Scope を引数で必須にする。
ScopedFs の変更
pub fn write(&self, path: &Path, content: &[u8]) -> Result<WriteOutcome, ToolsError> {
if !self.inner.scope.writable() {
return Err(ToolsError::ReadOnly);
}
if !self.inner.scope.contains(path) {
return Err(ToolsError::OutOfScope(path.to_path_buf()));
}
// ...
}
Controller 統合
// 今: scope が Some のときだけツール登録
if let Some(scope) = scope_for_tools { ... }
// 後: 常にツール登録(scope は必須)
let fs = tools::ScopedFs::new(pod.scope().clone());
let tracker = tools::ReadTracker::new();
worker.register_tools(tools::builtin_tools(fs, tracker));
影響範囲
manifest::Scope—root→pwd、writableフィールド追加manifest::ScopeConfig—root→pwd、writableの serde 対応manifest::PodManifest— [scope] 省略時のフォールバック解決Pod—scope: Option<Scope>→scope: ScopePod::new(),Pod::restore(),Pod::from_manifest()— シグネチャ変更ScopedFs— writable チェック追加Controller— scope の Optional 分岐を削除tools::error::ToolsError—ReadOnlyvariant 追加Scope::contains—root→pwdのリネーム