(ctx context.Context, out chan<- StreamEvent, req skills.SkillShellPermissionRequest)
| 290 | extraContext := coretools.ExecutionContext{ |
| 291 | "_session_id": sid, |
| 292 | "_agent_id": q.CoreEngine.sessionMemoryAgentID(), |
| 293 | "runtime_dir": q.Config.ProjectRuntimeDir, |
| 294 | "_skill_persistence": q.CoreEngine.skillPersistence, |
| 295 | "_skill_agent_scope": "main", |
| 296 | "_turn_count": state.TurnCount, |
| 297 | "_permission_runtime": q.CoreEngine, |
| 298 | } |
| 299 | return executor.Execute(ctx, skill, args, sid, func(req skills.SkillShellPermissionRequest) bool { |
| 300 | return q.requestSkillShellPermission(ctx, out, req) |
| 301 | }, q.CoreEngine.Registry, state, extraContext) |
| 302 | } |
| 303 | |
| 304 | func (q *QueryEngine) requestSkillShellPermission(ctx context.Context, out chan<- StreamEvent, req skills.SkillShellPermissionRequest) bool { |
| 305 | if q != nil && q.Config.Yolo { |
| 306 | return true |
| 307 | } |
| 308 | ch := make(chan bool, 1) |
| 309 | q.skillPermissionMu.Lock() |
| 310 | if q.skillPermissionCh != nil { |
| 311 | q.skillPermissionMu.Unlock() |
| 312 | return false |
| 313 | } |
| 314 | q.skillPermissionCh = ch |
| 315 | q.skillPermissionMu.Unlock() |
| 316 | defer func() { |
| 317 | q.skillPermissionMu.Lock() |
| 318 | if q.skillPermissionCh == ch { |
| 319 | q.skillPermissionCh = nil |
| 320 | } |
| 321 | q.skillPermissionMu.Unlock() |
| 322 | }() |
| 323 | |
| 324 | event := NewStreamEvent("permission_needed", "", map[string]any{ |
| 325 | "skill_shell_request": req, |
| 326 | "dangerous": true, |
| 327 | "risk": "high", |
| 328 | }) |
| 329 | if !sendStream(ctx, out, event) { |
no test coverage detected