File size: 1,691 Bytes
7d4338a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from agent import AgentContext, UserMessage
from helpers.api import ApiHandler, Input, Output, Request, Response
from helpers import guids, message_queue as mq
from helpers.persist_chat import remove_chat
from plugins._plugin_scan.helpers.prompt import build_prompt


class PluginScanRun(ApiHandler):
    """
    POST /api/plugins/_plugin_scan/plugin_scan_run
    Body:    { "git_url": "https://github.com/...", "checks": [...] }  # checks optional, defaults to all
    Returns: { "ok": true, "verdict": "safe|caution|dangerous|unknown", "report": "<markdown>" }

    Combines plugin_scan_queue + plugin_scan_start into one synchronous call and awaits the result.
    No server-side timeout - set an appropriate client-side timeout (repos can take 5+ min to scan).
    """

    async def process(self, input: Input, request: Request) -> Output:
        git_url: str = input.get("git_url", "").strip()
        if not git_url:
            return Response("Missing 'git_url'.", 400)

        ctxid = guids.generate_id()
        report = ""
        try:
            context = self.use_context(ctxid)
            prompt = build_prompt(git_url, input.get("checks"))
            mq.log_user_message(context, prompt, [])
            task = context.communicate(UserMessage(prompt, []))
            report: str = await task.result()
        except Exception as e:
            return Response(f"Scan failed: {e}", 500)
        finally:
            try:
                AgentContext.remove(ctxid)
                remove_chat(ctxid)
            except Exception:
                pass

        return {
            "ok": True,
            "git_url": git_url,
            "report": report or "",
        }