从 merged dict 中解析 feature config。 源码: config.rs:230-239 CC 里每个字段都有独立的 parse_optional_xxx() 函数。 我们简化为一个函数,但保持"显式提取+验证"的精神。
(merged: dict)
| 105 | |
| 106 | |
| 107 | def parse_feature_config(merged: dict) -> RuntimeFeatureConfig: |
| 108 | """从 merged dict 中解析 feature config。 |
| 109 | |
| 110 | 源码: config.rs:230-239 |
| 111 | CC 里每个字段都有独立的 parse_optional_xxx() 函数。 |
| 112 | 我们简化为一个函数,但保持"显式提取+验证"的精神。 |
| 113 | """ |
| 114 | hooks = merged.get("hooks", {}) |
| 115 | if not isinstance(hooks, dict): |
| 116 | raise ConfigError("hooks: expected JSON object", kind="parse") |
| 117 | |
| 118 | pre = hooks.get("PreToolUse", []) |
| 119 | post = hooks.get("PostToolUse", []) |
| 120 | if not isinstance(pre, list) or not isinstance(post, list): |
| 121 | raise ConfigError("hooks.PreToolUse/PostToolUse: must be arrays", kind="parse") |
| 122 | |
| 123 | # permission_mode: CC 支持多种别名 (config.rs:511-518) |
| 124 | raw_mode = merged.get("permissionMode") |
| 125 | permission_mode = None |
| 126 | if isinstance(raw_mode, str): |
| 127 | mode_map = { |
| 128 | "default": "read-only", "plan": "read-only", "read-only": "read-only", |
| 129 | "acceptEdits": "workspace-write", "auto": "workspace-write", |
| 130 | "workspace-write": "workspace-write", |
| 131 | "dontAsk": "danger-full-access", "danger-full-access": "danger-full-access", |
| 132 | } |
| 133 | if raw_mode not in mode_map: |
| 134 | raise ConfigError(f"permissionMode: unsupported mode '{raw_mode}'", kind="parse") |
| 135 | permission_mode = mode_map[raw_mode] |
| 136 | |
| 137 | return RuntimeFeatureConfig( |
| 138 | hooks_pre_tool_use=pre, |
| 139 | hooks_post_tool_use=post, |
| 140 | model=merged.get("model"), |
| 141 | permission_mode=permission_mode, |
| 142 | timeout=merged.get("timeout", 30), |
| 143 | max_iterations=merged.get("maxIterations", 10), |
| 144 | token_budget=merged.get("tokenBudget", 200_000), |
| 145 | ) |
| 146 | |
| 147 | |
| 148 | # ============================================================ |
no test coverage detected