Skip to content
8 changes: 5 additions & 3 deletions src/pyob/autoreviewer.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,16 +344,18 @@ def run_pipeline(self, current_iteration: int):
logger.info(
f"Found pending {PR_FILE_NAME} and/or {FEATURE_FILE_NAME} from a previous run."
)
proposals_handled = self._handle_pending_proposals(
proposals_outcome = self._handle_pending_proposals(
"Hit ENTER to PROCEED, type 'SKIP' to ignore",
allow_delete=True,
)
if not proposals_handled:
if proposals_outcome == "SKIPPED":
logger.info(
"Pending proposals were not applied or deleted. Halting current pipeline iteration to await user action."
)
return
changes_made = True
elif proposals_outcome == "APPLIED":
changes_made = True
# If proposals_outcome is "DELETED", changes_made remains False, allowing the scan to proceed.

if not changes_made:
logger.info("==================================================")
Expand Down
25 changes: 25 additions & 0 deletions src/pyob/cascade_queue_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ class CascadeControllerProtocol(Protocol):
def add_to_cascade_queue(self, item: str) -> None: ...
def remove_cascade_queue_item(self, item_id: str) -> None: ...
def move_cascade_queue_item(self, item_id: str, direction: str) -> None: ...
def process_next_cascade_item(
self,
) -> (
str | None
): ... # Returns the ID of the processed item, or None if queue is empty


class CascadeQueueHandler:
Expand All @@ -27,6 +32,26 @@ def handle_add_to_cascade_queue(self, item: str):
except Exception as e:
return json.dumps({"error": f"Internal server error: {str(e)}"}).encode()

def handle_process_next_cascade_item(self):
try:
processed_item_id = self.controller.process_next_cascade_item()
if processed_item_id:
return json.dumps(
{"message": f"Item '{processed_item_id}' processed successfully"}
).encode()
else:
return json.dumps(
{"message": "Cascade queue is empty, no item to process"}
).encode()
except AttributeError:
return json.dumps(
{
"error": "Controller method 'process_next_cascade_item' not found. Ensure entrance.py is updated."
}
).encode()
except Exception as e:
return json.dumps({"error": f"Internal server error: {str(e)}"}).encode()

def handle_remove_from_cascade_queue(self, item_id: str):
try:
self.controller.remove_cascade_queue_item(item_id)
Expand Down
25 changes: 19 additions & 6 deletions src/pyob/dashboard_html.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
</style>
<!-- Add Chart.js -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="/static/dashboard_utils.js"></script>
</head>
<body>
<h1>
Expand Down Expand Up @@ -122,10 +123,22 @@
</div>

<script>
async function updateStats() {
try {
const response = await fetch('/api/status');
const data = await response.json();
// [Most JavaScript logic moved to dashboard_utils.js]

async function setManualTarget() {
const targetFile = document.getElementById('manualTargetFile').value;
if (!targetFile) return;
await fetch('/api/set_target_file', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ target_file: targetFile })
});
document.getElementById('manualTargetFile').value = '';
}

setInterval(updateStats, 3000);
updateStats();
</script>
document.getElementById('iteration').innerText = data.iteration || "0";
document.getElementById('ledger').innerText = (data.ledger_stats?.definitions || 0) + " SYM";
document.getElementById('queue-count').innerText = data.cascade_queue?.length || "0";
Expand Down Expand Up @@ -292,10 +305,10 @@
async function reviewPatch(patchId, action) {
try {
if (action === 'approved') {
await fetch('/api/approve_patch', {
await fetch('/api/review_patch', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ patch_id: patchId })
body: JSON.stringify({ patch_id: patchId, action: 'approved' })
});
} else {
await fetch('/api/review_patch', {
Expand Down
Loading
Loading