diff --git a/worker/orca-agent/src/server/routes/task.py b/worker/orca-agent/src/server/routes/task.py index 5be0a4d..c53d41f 100644 --- a/worker/orca-agent/src/server/routes/task.py +++ b/worker/orca-agent/src/server/routes/task.py @@ -69,6 +69,7 @@ def start_task(): swarmBountyId=swarmBountyId, repo_url=repo_url, db=db, # Pass db instance + podcall_signature=podcall_signature, ) return jsonify(result) else: diff --git a/worker/orca-agent/src/server/services/repo_summary_service.py b/worker/orca-agent/src/server/services/repo_summary_service.py index 4e57006..aa1d8b2 100644 --- a/worker/orca-agent/src/server/services/repo_summary_service.py +++ b/worker/orca-agent/src/server/services/repo_summary_service.py @@ -11,7 +11,7 @@ from src.database.models import Submission load_dotenv() -def handle_task_creation(task_id, swarmBountyId, repo_url, db=None): +def handle_task_creation(task_id, swarmBountyId, repo_url, db=None, podcall_signature=None): """Handle task creation request.""" try: if db is None: @@ -22,6 +22,8 @@ def handle_task_creation(task_id, swarmBountyId, repo_url, db=None): client=client, prompts=PROMPTS, repo_url=repo_url, + podcall_signature=podcall_signature, + task_id=task_id, ) result = workflow.run() diff --git a/worker/orca-agent/src/workflows/repoSummarizer/workflow.py b/worker/orca-agent/src/workflows/repoSummarizer/workflow.py index 282d6f1..0c5ced4 100644 --- a/worker/orca-agent/src/workflows/repoSummarizer/workflow.py +++ b/worker/orca-agent/src/workflows/repoSummarizer/workflow.py @@ -2,6 +2,7 @@ import os from github import Github +import requests from prometheus_swarm.workflows.base import Workflow from prometheus_swarm.utils.logging import log_section, log_key_value, log_error from src.workflows.repoSummarizer import phases @@ -54,6 +55,8 @@ class RepoSummarizerWorkflow(Workflow): client, prompts, repo_url, + podcall_signature=None, + task_id=None, ): # Extract owner and repo name from URL # URL format: https://github.com/owner/repo @@ -67,8 +70,30 @@ class RepoSummarizerWorkflow(Workflow): repo_url=repo_url, repo_owner=repo_owner, repo_name=repo_name, + podcall_signature=podcall_signature, + task_id=task_id, ) + def submit_draft_pr(self, pr_url): + """Submit the draft PR.""" + try: + response = requests.post( + f"http://host.docker.internal:30017/task/{self.task_id}/add-todo-draft-pr", + json={ + "prUrl": pr_url, + "signature": self.podcall_signature, + "swarmBountyId": self.swarmBountyId, + "success": True, + "message": "", + }, + ) + except Exception as e: + log_error(e, "Failed to submit draft PR") + return { + "success": False, + "message": "Failed to submit draft PR", + "data": None, + } def setup(self): """Set up repository and workspace.""" check_required_env_vars(["GITHUB_TOKEN", "GITHUB_USERNAME"]) @@ -153,7 +178,17 @@ class RepoSummarizerWorkflow(Workflow): log_key_value("Branch created", self.context["head"]) try: commit_and_push(message="empty commit", allow_empty=True) - self.create_pull_request() + draft_pr_result = self.create_pull_request() + if draft_pr_result.get("success"): + + print("DRAFT PR RESULT", draft_pr_result) + self.submit_draft_pr(draft_pr_result.get("data").get("pr_url")) + else: + return { + "success": False, + "message": "Failed to create pull request", + "data": None, + } except Exception as e: log_error(e, "Failed to commit and push") return { @@ -274,6 +309,9 @@ class RepoSummarizerWorkflow(Workflow): readme_result = generate_readme_section_phase.execute() # Check README Generation Result + + + log_key_value("README RESULT", readme_result) if not readme_result or not readme_result.get("success"): log_error( Exception(readme_result.get("error", "No result")), diff --git a/worker/src/task/5-routes.ts b/worker/src/task/5-routes.ts index f61729f..08fa538 100644 --- a/worker/src/task/5-routes.ts +++ b/worker/src/task/5-routes.ts @@ -54,6 +54,68 @@ export async function routes() { const submitDistributionResult = await taskRunner.submitDistributionList(Number(roundNumber)); res.status(200).json({ result: submitDistributionResult }); }); + app.post("/add-todo-draft-pr", async (req, res) => { + const signature = req.body.signature; + const prUrl = req.body.prUrl; + const swarmBountyId = req.body.swarmBountyId; + console.log("[TASK] req.body", req.body); + try { + const publicKey = await namespaceWrapper.getMainAccountPubkey(); + const stakingKeypair = await namespaceWrapper.getSubmitterAccount(); + if (!stakingKeypair) { + throw new Error("No staking key found"); + } + const stakingKey = stakingKeypair.publicKey.toBase58(); + const secretKey = stakingKeypair.secretKey; + + + if (!publicKey) { + throw new Error("No public key found"); + } + + const payload = await namespaceWrapper.verifySignature(signature, stakingKey); + if (!payload) { + throw new Error("Invalid signature"); + } + console.log("[TASK] payload: ", payload); + const data = payload.data; + if (!data) { + throw new Error("No signature data found"); + } + const jsonData = JSON.parse(data); + if (jsonData.taskId !== TASK_ID) { + throw new Error(`Invalid task ID from signature: ${jsonData.taskId}. Actual task ID: ${TASK_ID}`); + } + + const middleServerPayload = { + taskId: jsonData.taskId, + swarmBountyId, + prUrl, + stakingKey, + publicKey, + action: "add-todo-draft-pr", + }; + const middleServerSignature = await namespaceWrapper.payloadSigning(middleServerPayload, secretKey); + const middleServerResponse = await fetch(`${middleServerUrl}/summarizer/worker/add-todo-draft-pr`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ signature: middleServerSignature, stakingKey: stakingKey }), + }); + + console.log("[TASK] Add Draft PR Response: ", middleServerResponse); + + if (middleServerResponse.status !== 200) { + throw new Error(`Posting to middle server failed: ${middleServerResponse.statusText}`); + } + res.status(200).json({ result: "Successfully saved PR" }); + } catch (error) { + console.error("[TASK] Error adding PR to summarizer todo:", error); + // await namespaceWrapper.storeSet(`result-${roundNumber}`, status.SAVING_TODO_PR_FAILED); + res.status(400).json({ error: "Failed to save PR" }); + } + }); app.post("/add-todo-pr", async (req, res) => { const signature = req.body.signature;