跳转至

Permission Decision Tree

目的:权限决策树 关联docs/PERMISSIONS.mdtopics/deep-dive-bash-permissions.md


1. 完整决策树

graph TD
    A[Tool call] --> B{mode}
    B -->|bypassPermissions| C[allow]
    B -->|plan| D{non-Read?}
    D -->|yes| E[ask]
    D -->|no| F[allow Read]
    B -->|default/acceptEdits/auto| G[bashToolCheckPermission]
    G --> H{exact match rule}
    H -->|deny| I[deny]
    H -->|allow| C
    H -->|ask| E
    H -->|no match| J{wildcard rule}
    J -->|deny| I
    J -->|allow| C
    J -->|ask| E
    J -->|no match| K{sandbox}
    K -->|auto allow| C
    K -->|no| L{early deny patterns}
    L -->|yes| I
    L -->|no| M{semantic deny}
    M -->|yes| I
    M -->|no| N[LLM classifier]
    N -->|approve| C
    N -->|deny| I
    N -->|uncertain| E

完整


2. 5 mode 状态机

stateDiagram-v2
    [*] --> default
    default --> acceptEdits: --permission-mode
    default --> plan: --permission-mode
    default --> bypassPermissions: --permission-mode
    default --> auto: --permission-mode
    acceptEdits --> default: Tab
    plan --> default: Tab
    bypassPermissions --> default: Tab
    auto --> default: Tab
    default --> default: 循环 (默认)

5 状态 + 循环


3. 3 规则优先级

graph TD
    A[Tool call] --> B{deny rule?}
    B -->|yes| C[deny]
    B -->|no| D{ask rule?}
    D -->|yes| E[ask]
    D -->|no| F{allow rule?}
    F -->|yes| G[allow]
    F -->|no| H{mode check}
    H -->|plan| I{non-Read?}
    I -->|yes| E
    I -->|no| J[allow]
    H -->|bypass| G
    H -->|default| K[classifier]
    K -->|approve| G
    K -->|deny| C
    K -->|uncertain| E

deny > ask > allow > mode > classifier


4. 4 步 Bash 决策

graph TD
    A[Bash command] --> B[parse with bashParser]
    B -->|success| C[walk AST]
    B -->|timeout 50ms| D[return null, fail safe]
    B -->|exceed 50K nodes| E[return null, fail safe]
    C --> F[isPathAllowed]
    F -->|deny path| G[deny]
    F -->|allow path| H{wildcard rule}
    H -->|allow| I[allow]
    H -->|deny| G
    H -->|no match| J[isDangerousRemovalRawPath]
    J -->|yes| G
    J -->|no| K[validate 25+]
    K -->|reject| G
    K -->|pass| L[stripSafeWrappers]
    L --> M[LLM classifier]
    M -->|allow| I
    M -->|deny| G
    M -->|uncertain| N[ask user]

4 步


5. 5 步 Edit 决策

graph TD
    A[Edit file_path] --> B{path in deny?}
    B -->|yes| C[deny]
    B -->|no| D{path in allow?}
    D -->|yes| E[allow]
    D -->|no| F{mode}
    F -->|bypass| E
    F -->|plan| G[ask]
    F -->|acceptEdits| E
    F -->|default| G

5 步


6. 4 步 WebFetch 决策

graph TD
    A[WebFetch url] --> B[extract domain]
    B --> C{domain in deny?}
    C -->|yes| D[deny]
    C -->|no| E{domain in allow?}
    E -->|yes| F[allow]
    E -->|no| G{mode}
    G -->|bypass| F
    G -->|plan| H[ask]
    G -->|default| H
    H -->|approve| F

4 步


7. 3 步 Agent 决策

graph TD
    A[Agent name] --> B{Agent in allow?}
    B -->|yes| C[allow]
    B -->|no| D{Agent in deny?}
    D -->|yes| E[deny]
    D -->|no| F{mode}
    F -->|bypass| C
    F -->|default| G[ask]
    F -->|plan| G

3 步


8. 5 步 Bash stripSafeWrappers

graph TD
    A[command] --> B[stripSafeWrappers]
    B --> C{time/nohup/env/sudo -n?}
    C -->|yes| D[strip + return inner]
    C -->|no| E[return as-is]
    D --> F[recheck rules]
    E --> F
    F --> G{allow rule?}
    G -->|yes| H[allow]
    G -->|no| I[classifier]
    H --> J[execute]
    I -->|allow| J
    I -->|deny| K[deny]

5 步


9. 4 步 shellRuleMatching

graph TD
    A[Bash git status] --> B[parse command]
    B --> C{first word = git?}
    C -->|no| D[no match]
    C -->|yes| E{rule 'Bash(git:*)'?}
    E -->|yes| F[match]
    E -->|no| G{rule 'Bash(*)'?}
    G -->|yes| H[match]
    G -->|no| D

4 步


10. 5 步 Classifier 流程

sequenceDiagram
    participant User
    participant Sys as System
    participant Spec as speculativeChecks Map
    participant LLM

    User->>Sys: Bash tool call
    Sys->>Spec: peekSpeculativeClassifierCheck(cmd)?
    alt cache hit
        Spec-->>Sys: cached result
    else cache miss
        Sys->>LLM: startSpeculativeClassifierCheck(cmd)
        LLM-->>Spec: result
    end
    Sys->>Sys: consumeSpeculativeClassifierCheck(cmd)
    alt approve
        Sys->>User: allow
    else deny
        Sys->>User: deny
    else uncertain
        Sys->>User: ask
    end

5 步


11. 4 步 Permission Update

graph TD
    A[User: 'allow Bash(git:*)'] --> B[PermissionUpdate]
    B --> C{type}
    C -->|addRules| D[add to allow]
    C -->|removeRules| E[remove from allow/deny]
    C -->|setMode| F[change mode]
    C -->|addDirectories| G[add to context]
    D --> H[settings.json]
    E --> H
    F --> H
    G --> H

4 步


12. 6 步 User 决策流

sequenceDiagram
    participant U as User
    participant Sys as System
    participant UI

    Sys->>U: Allow Bash(rm -rf /tmp/*)?
    U->>UI: Choice?
    alt Yes (once)
        U->>Sys: Yes
        Sys->>U: execute
    else Yes (file)
        U->>Sys: Yes (file)
        Sys->>U: add file rule
    else Yes (session)
        U->>Sys: Yes (session)
        Sys->>U: add session rule
    else No
        U->>Sys: No
        Sys->>U: deny
    end

4 选项


13. 5 步 Session 启动权限

graph TD
    A[session start] --> B[load settings]
    B --> C[merge 4 sources]
    C --> D[policy > local > project > user]
    D --> E[default mode]
    E --> F{mode}
    F -->|default| G[normal]
    F -->|bypass| H[no check]
    F -->|plan| I[read only]
    F -->|auto| J[classifier]
    F -->|acceptEdits| K[auto accept edit]

5 步


14. 3 步 Tool 范围匹配

graph TD
    A[Tool call] --> B{tool name}
    B -->|Bash| C[bash 6 层决策]
    B -->|Edit/Write/Read| D[path 检查]
    B -->|WebFetch| E[domain 检查]
    B -->|Agent| F[name 检查]
    B -->|TodoWrite/Skill/...| G[allow]
    C -->|allow/deny/ask| H[return]
    D --> H
    E --> H
    F --> H
    G --> H

3 步 dispatch


15. 5 步 沙箱 auto-allow

graph TD
    A[bash in sandbox] --> B{sandbox mode}
    B -->|strict| C[only allow list]
    B -->|permissive| D[allow most]
    B -->|off| E[normal check]
    C --> F{cmd in allow list?}
    F -->|yes| G[allow]
    F -->|no| H[ask]
    D --> I{cmd in deny list?}
    I -->|yes| J[deny]
    I -->|no| G
    E --> K[normal 6 层]
    K -->|allow/deny/ask| L[return]

5 步


16. 4 步 Plugin 权限

graph TD
    A[Plugin hook] --> B{plugin in allowlist?}
    B -->|no| C[deny]
    B -->|yes| D{hook in plugin?}
    D -->|no| E[deny]
    D -->|yes| F[match rules]
    F -->|allow| G[allow]
    F -->|deny| H[deny]
    F -->|ask| I[ask]

4 步


17. 5 步 MCP 权限

graph TD
    A[MCP tool call] --> B{MCP server trusted?}
    B -->|no| C[deny]
    B -->|yes| D{tool in MCP list?}
    D -->|no| E[deny]
    D -->|yes| F{mode}
    F -->|bypass| G[allow]
    F -->|default| H[match rules]
    F -->|plan| I[ask]
    H -->|allow| G
    H -->|deny| J[deny]
    H -->|ask| I

5 步


18. 6 步 Plan Mode 流

graph TD
    A[plan mode] --> B[user in plan]
    B --> C[Claude can only Read]
    C --> D{user in plan?}
    D -->|yes| E[block Edit/Write/Bash]
    D -->|no| F[normal check]
    E --> G[show plan only]
    G --> H{user approve exit?}
    H -->|yes| I[switch to default]
    H -->|no| J[stay in plan]

6 步


19. 4 步 Auto Mode 流

graph TD
    A[auto mode] --> B[classifier for all]
    B --> C[LLM classifier]
    C -->|approve| D[allow]
    C -->|deny| E[deny]
    C -->|uncertain| F[ask user]
    D --> G[log]
    E --> G
    F --> G

4 步


20. 4 步 Bypass 警告

graph TD
    A[--permission-mode bypassPermissions] --> B{warning}
    B --> C[显示警告]
    C --> D{user 确认?}
    D -->|yes| E[启用]
    D -->|no| F[退出]
    E --> G[所有 tool 不检查]
    G --> H[风险: 任意执行]

4 步


21. 总结

Permission Decision Tree = 6 层 + 5 mode + 3 规则

核心: - 22 mermaid 图 - 完整决策树 - 各 tool 决策 - Classifier 流 - Plan / Auto / Bypass mode

下一步: - 渲染 SVG - 加到 mkdocs