#!/usr/bin/env python3 """prompt_envelope.py — wraps every dispatched job prompt so agents DO work. Why: agents treated job DMs as informational and replied with prose; swarms and timers never got created. The envelope puts an executable subagent-spawn tool call at the TOP (before the task) and repeats it at the BOTTOM (after the task), with a work-first mandate and explicit tool/curl surface in between. Profiles tune the spawn recipe per job family; add new ones to PROFILES. """ import json import re import hashlib BOX_API = "https://box.muse-dev.online/api/box" def _response_rule(): return ( "\nRESPONSE RULE: Act by EMITTING [TOOL ...] / [DM ...] directive lines verbatim in your reply" " — you do not run them yourself. The Box runtime on bl executes each directive" " (this works from containers with no box CLI or tmux socket) and posts the result back here." " Background tmux commands work too when you have a shell." " When complete, conclude your output with the [RESULT ...] line so the harvester records it.\n" ) def _box_surface_block(agent, job_name, job_id, target): """Clean runtime context block for the agent.""" header = ( "\n---- BOX RUNTIME ----\n" "THREAD: " + str(target) + "\n" "RUNTIME: https://box.muse-dev.online/\n" "JOB: " + str(job_id) + "\n" "AGENT: " + str(agent) + "\n" ) return header + _response_rule() UUID_RE = re.compile(r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}") # profile -> (spawn count, followup minutes, spawn task hint) PROFILES = { "pulse": (2, 30, "execute your scope's standing work: set timers, verify them, report per-slot verdicts"), "health": (2, 60, "run the prescribed health gates read-only and report per-gate verdicts"), "swarm": (2, 20, "sweep swarms and sidechats read-only and report stale or unarchived items"), "work": (2, 15, "split the task above into two independent halves and complete each"), } def pick_profile(job_name): n = job_name or "" if n.startswith("autonomy-pulse"): return "pulse" if "health" in n: return "health" if "swarm" in n: return "swarm" return "work" def _tool(op, args): # the harvester extracts JSON args with balanced-brace scanning, so # ']' and nested objects/arrays inside args are safe return "[TOOL %s %s]" % (op, json.dumps(args, separators=(", ", ": "))) def spawn_call(job_id, job_name, profile): count, _, hint = PROFILES[profile] task = "Subagent for job %s (%s): %s." % (job_id, job_name, hint) return _tool("swarm.spawn", {"count": count, "task": task[:900], "label": (job_name or "job")[:60]}) def dm_call(to, target, message): return "[DM %s]" % json.dumps( {"to": to, "target": target, "message": message[:900]}, separators=(", ", ": ")) def native_followup_call(job_id, job_name, profile, agent): """Muse-native one-shot cron (cron.create runonce) - bridged to followup.create.""" _, mins, _ = PROFILES[profile] return _tool("cron.create", { "kind": "runonce", "agent": agent, "in_m": mins, "prompt": "Continue job %s (%s): verify with cron.runs and swarm.list then act or close." % (job_id, job_name)}) def followup_call(job_id, job_name, profile, agent): _, mins, _ = PROFILES[profile] return _tool("followup.create", { "agent": agent, "in_m": mins, "prompt": "Continue job %s (%s): check swarm results with swarm.list then act or close." % (job_id, job_name)}) def thread_url(target): t = str(target) return "https://box.muse-dev.online/%s/%s" % ("thread" if UUID_RE.fullmatch(t.lower()) else "sidechat", t) def wrap(job_name, job_id, agent, target, rendered, include_kpi: bool = True): """Return the full DM body as a direct, authentic operator directive.""" profile = pick_profile(job_name) spawn = spawn_call(job_id, job_name, profile) follow = native_followup_call(job_id, job_name, profile, agent) parts = job_id.split("-") wo_id = parts[-1] if len(parts) > 1 and len(parts[-1]) >= 8 else hashlib.sha256(job_id.encode()).hexdigest()[:8] session_name = f"work-{agent}-{wo_id}" advisory_section = "" if include_kpi: try: import kpi advisory = kpi.get_live_advisory_block(agent) if advisory: advisory_section = f"\n{advisory}\n" except Exception: pass top = ( f"Operator Directive [ref:{wo_id}]:\n" f"Persistent box runtime is on bl (/tmp/tmux-muse.sock). No worker session exists yet — create yours first: [TOOL tmux.new {{\"session\": \"{session_name}\", \"command\": \"bash\"}}].\n" f" • Subagent assistance: {spawn}\n" f" • Verification schedule: {follow}\n" f"{advisory_section}\n" "--- Task ---\n" ) has_result = "[RESULT" in rendered bottom = ( "\n--- End Task ---\n\n" f"Worker convention: name your tmux session {session_name} when you create it, then inspect via box tmux capture {session_name} 30.\n" "Flow in tmux: [TOOL flow.start {\"flow_id\": \"\", \"command\": \"\"}] | read delta: [TOOL flow.read {\"flow_id\": \"\"}] | advance: [TOOL flow.send {\"flow_id\": \"\", \"command\": \"...\"}].\n" "Tools: flow.start, flow.read, flow.send, cron.create, health.check, swarm.spawn, dm.send, box.exec, tools.list.\n" "Message a peer: [DM {\"to\": \"\", \"target\": \"\", \"message\": \"\"}].\n" "Query box: [TOOL box.exec {\"action\": \"\"}] — [TOOL tools.list {}] lists every op.\n" ) if not has_result: bottom += f"When complete, report your verdict: [RESULT {job_id}] OK: \n" else: bottom += f"Conclude with your [RESULT {job_id}] line reporting outcomes.\n" return top + rendered.strip() + "\n" + bottom def wrap_subagent_task(job_id, task_text): """Format an authentic direct task assignment for a subagent worker without test-traffic meta tags.""" return ( f"Operator assignment for swarm slot {job_id}:\n\n" f"Task:\n" f"{task_text.strip()}\n\n" f"Instructions:\n" f"1. Carry out this task directly using your available tools.\n" f"2. When finished, conclude your final response with your verdict line:\n" f"[RESULT {job_id}] OK: \n" f"(or [RESULT {job_id}] FAIL: if the task could not be completed)\n" )