agentic-dev-loop 0.9.1__py3-none-any.whl → 0.9.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -456,6 +456,10 @@ PAGE = """<!doctype html>
456
456
  border-radius: 6px; margin-top: 10px; display: none; }
457
457
  .banner-success { background: #e8f5e9; color: #2e7d32; }
458
458
  .banner-failure { background: #ffebee; color: #c62828; }
459
+ #stream-banner { display: none; position: fixed; top: 0; left: 0; right: 0;
460
+ z-index: 9999; background: #b26a00; color: #ffffff;
461
+ text-align: center; padding: 8px 12px; font-size: 14px;
462
+ font-weight: 700; }
459
463
  #divider { flex: 0 0 6px; cursor: col-resize; background: #e0e0e0; }
460
464
  #divider:hover, #divider.dragging { background: #9e9e9e; }
461
465
  #sidebar { flex: 0 0 320px; border-left: 1px solid #e0e0e0; padding: 16px;
@@ -525,6 +529,7 @@ PAGE = """<!doctype html>
525
529
  onerror="window.__mermaidFailed=true"></script>
526
530
  </head>
527
531
  <body>
532
+ <div id="stream-banner">connection lost, reconnecting...</div>
528
533
  <div id="graph-panel">
529
534
  <div id="mermaid-container"><p>Loading graph…</p></div>
530
535
  <div id="run-banner"></div>
@@ -561,6 +566,9 @@ PAGE = """<!doctype html>
561
566
  var liveElapsed = {};
562
567
  var runStartWall = null;
563
568
  var totalTimer = null;
569
+ var lastEventAt = 0;
570
+ var reconnectAttempts = 0;
571
+ var runActive = false;
564
572
  var topologyReady = false;
565
573
  var pendingEvents = [];
566
574
  var MAX_CONSOLE = 500;
@@ -614,11 +622,12 @@ PAGE = """<!doctype html>
614
622
  if (runStartWall === null) {
615
623
  line.textContent = "";
616
624
  line.style.display = "none";
617
- return;
625
+ } else {
626
+ line.textContent = "total " + mmss(Math.max(0,
627
+ Math.round(Date.now() / 1000 - runStartWall)));
628
+ line.style.display = "block";
618
629
  }
619
- line.textContent = "total " + mmss(Math.max(0,
620
- Math.round(Date.now() / 1000 - runStartWall)));
621
- line.style.display = "block";
630
+ if (runActive && Date.now() - lastEventAt > 10000) { recover(); }
622
631
  }
623
632
 
624
633
  function statusOf(n) {
@@ -1055,10 +1064,11 @@ PAGE = """<!doctype html>
1055
1064
  flushPending();
1056
1065
  stepTimes = {};
1057
1066
  liveElapsed = {};
1067
+ runActive = true;
1058
1068
  if (totalTimer !== null) { clearInterval(totalTimer); totalTimer = null; }
1059
1069
  runStartWall = (typeof ev.started_at === "number")
1060
1070
  ? ev.started_at : null;
1061
- if (runStartWall !== null) { totalTimer = setInterval(renderTotal, 1000); }
1071
+ totalTimer = setInterval(renderTotal, 1000);
1062
1072
  renderTotal();
1063
1073
  clearConsoles();
1064
1074
  resetVerdicts();
@@ -1137,6 +1147,7 @@ PAGE = """<!doctype html>
1137
1147
  updateAttempt();
1138
1148
  break;
1139
1149
  case "run_finished":
1150
+ runActive = false;
1140
1151
  if (totalTimer !== null) { clearInterval(totalTimer); totalTimer = null; }
1141
1152
  if (ev.elapsed_seconds !== undefined) {
1142
1153
  runStartWall = null;
@@ -1194,16 +1205,42 @@ PAGE = """<!doctype html>
1194
1205
  }
1195
1206
  }, 5000);
1196
1207
 
1197
- var es = new EventSource("/events");
1198
- es.onmessage = function (e) {
1199
- var ev;
1200
- try { ev = JSON.parse(e.data); }
1201
- catch (err) { logLine("bad event: " + e.data); return; }
1202
- if (!topologyReady) { pendingEvents.push(ev); return; }
1203
- try { handle(ev); }
1204
- catch (err) { logLine("bad event: " + e.data); }
1205
- };
1206
- es.onerror = function () { logLine("event stream interrupted"); };
1208
+ var es = null;
1209
+
1210
+ function connectStream() {
1211
+ var stream = new EventSource("/events");
1212
+ stream.onmessage = function (e) {
1213
+ lastEventAt = Date.now();
1214
+ reconnectAttempts = 0;
1215
+ el("stream-banner").style.display = "none";
1216
+ var ev;
1217
+ try { ev = JSON.parse(e.data); }
1218
+ catch (err) { logLine("bad event: " + e.data); return; }
1219
+ if (!topologyReady) { pendingEvents.push(ev); return; }
1220
+ try { handle(ev); }
1221
+ catch (err) { logLine("bad event: " + e.data); }
1222
+ };
1223
+ stream.onerror = function () { logLine("event stream interrupted"); };
1224
+ return stream;
1225
+ }
1226
+
1227
+ es = connectStream();
1228
+
1229
+ function recover() {
1230
+ el("stream-banner").style.display = "block";
1231
+ reconnectAttempts++;
1232
+ if (reconnectAttempts > 3) {
1233
+ location.reload();
1234
+ return;
1235
+ }
1236
+ es.close();
1237
+ es = connectStream();
1238
+ lastEventAt = Date.now();
1239
+ }
1240
+
1241
+ document.addEventListener("visibilitychange", function () {
1242
+ if (runActive && Date.now() - lastEventAt > 10000) { recover(); }
1243
+ });
1207
1244
 
1208
1245
  // Grab-handle between the graph and the sidebar: drag to resize the
1209
1246
  // sidebar (and with it the console panels, which stretch with its width).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-dev-loop
3
- Version: 0.9.1
3
+ Version: 0.9.2
4
4
  Summary: Turn an LLM into a gated, sandboxed, resumable construction loop over your codebase.
5
5
  Author: Luke Wilson
6
6
  License-Expression: Apache-2.0
@@ -41,10 +41,10 @@ agentic_dev_loop/engine/seccomp/__init__.py,sha256=6U8K6rZ0Ha22F7Uk4i9bXrir5eyLv
41
41
  agentic_dev_loop/engine/seccomp/chromium-userns.json,sha256=ahmqvWprLe_oG_oLXFMUnJdl8cqtG1IY_g48g36TUlQ,8472
42
42
  agentic_dev_loop/viz/__init__.py,sha256=eoRfcUCC3-j7JhShft7Ruk8ruT5oFUoMKEKClO45B4I,520
43
43
  agentic_dev_loop/viz/__main__.py,sha256=baycB1QwQtM-B2bXo4Du5lwvItcMgJwJlAzsHACxM-4,1409
44
- agentic_dev_loop/viz/server.py,sha256=VhdKK6KnuTWDRlk-9M5V6ZExyBkCNGbM4LVpBHTO4e8,46506
45
- agentic_dev_loop-0.9.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
46
- agentic_dev_loop-0.9.1.dist-info/METADATA,sha256=qlguRx4qYT6zDlFRBiZe2Fxm8HSWajDP4miCKHeUzHk,41543
47
- agentic_dev_loop-0.9.1.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
48
- agentic_dev_loop-0.9.1.dist-info/entry_points.txt,sha256=Us59oHX6NBy-7ZN3LW5w3HAjnvOPJBfgNiv6ftnmHWw,70
49
- agentic_dev_loop-0.9.1.dist-info/top_level.txt,sha256=n1ktP1gXxGN6DJAnACR0mt276GRJB9PVDezf9DVPwaw,17
50
- agentic_dev_loop-0.9.1.dist-info/RECORD,,
44
+ agentic_dev_loop/viz/server.py,sha256=-7lHiBCBQx3h0g-TfQyIaWG1tIfrWrqfLJco1-4GJOI,47637
45
+ agentic_dev_loop-0.9.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
46
+ agentic_dev_loop-0.9.2.dist-info/METADATA,sha256=s1Tql2vpok3i6dMdByJcLMkhgTH-yEBRgLrYe3NDwYI,41543
47
+ agentic_dev_loop-0.9.2.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
48
+ agentic_dev_loop-0.9.2.dist-info/entry_points.txt,sha256=Us59oHX6NBy-7ZN3LW5w3HAjnvOPJBfgNiv6ftnmHWw,70
49
+ agentic_dev_loop-0.9.2.dist-info/top_level.txt,sha256=n1ktP1gXxGN6DJAnACR0mt276GRJB9PVDezf9DVPwaw,17
50
+ agentic_dev_loop-0.9.2.dist-info/RECORD,,