lavish-axi 0.1.46 → 0.1.47

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.
@@ -8,7 +8,6 @@ const queueStorageKey = "lavish-axi:queued:" + key;
8
8
  // Review-chrome state that must survive a browser refresh. Keyed per session so one review's
9
9
  // triage can never leak into another artifact's.
10
10
  const warningSelectionStorageKey = "lavish-axi:warning-selection:" + key;
11
- const warningAckStorageKey = "lavish-axi:warning-ack:" + key;
12
11
  const internalQueueKeyField = "_lavishQueueKey";
13
12
  const initialChat = Array.isArray(sessionData.initialChat) ? sessionData.initialChat : [];
14
13
  const MODE_TOGGLE_HOTKEY_KEY = String(sessionData.modeToggleHotkeyKey || "").toLowerCase();
@@ -57,7 +56,6 @@ const layoutGateOverlay = /** @type {HTMLDivElement} */ (document.getElementById
57
56
  const layoutGateTitle = /** @type {HTMLDivElement} */ (document.getElementById("layoutGateTitle"));
58
57
  const layoutGateCopy = /** @type {HTMLParagraphElement} */ (document.getElementById("layoutGateCopy"));
59
58
  const layoutGateAction = /** @type {HTMLButtonElement} */ (document.getElementById("layoutGateAction"));
60
- const layoutIssueBanner = /** @type {HTMLDivElement} */ (document.getElementById("layoutIssueBanner"));
61
59
  const warningsWrap = /** @type {HTMLDivElement} */ (document.getElementById("warningsWrap"));
62
60
  const warningsButton = /** @type {HTMLButtonElement} */ (document.getElementById("warningsButton"));
63
61
  const warningsCount = /** @type {HTMLSpanElement} */ (document.getElementById("warningsCount"));
@@ -96,7 +94,6 @@ let layoutGateTimer;
96
94
  let layoutWarnings = Array.isArray(sessionData.initialLayoutWarnings) ? sessionData.initialLayoutWarnings : [];
97
95
  const selectedWarningIds = new Set(loadJsonState(warningSelectionStorageKey, []));
98
96
  let warningsDrawerOpen = false;
99
- let warningsAcknowledged = loadJsonState(warningAckStorageKey, false) === true;
100
97
  const snapshotRequests = [];
101
98
  let endAfterSubmit = false;
102
99
  let workingBubble = null;
@@ -482,17 +479,6 @@ function normalizeLayoutFindings(value) {
482
479
  : [];
483
480
  }
484
481
 
485
- function setLayoutIssueBanner(visible) {
486
- if (!layoutIssueBanner) return;
487
- layoutIssueBanner.hidden = !visible;
488
- }
489
-
490
- // The banner is a one-time "there is unresolved work" cue for the top-bar inbox. Once the user
491
- // has opened the drawer it stays out of the way; the badge remains the standing signal.
492
- function refreshLayoutIssueBanner() {
493
- setLayoutIssueBanner(!ended && !warningsAcknowledged && !layoutGateVisible && activeWarnings().length > 0);
494
- }
495
-
496
482
  function clearLayoutGateTimer() {
497
483
  if (layoutGateTimer) clearTimeout(layoutGateTimer);
498
484
  layoutGateTimer = undefined;
@@ -522,7 +508,6 @@ function revealLayoutGate() {
522
508
  clearLayoutGateTimer();
523
509
  layoutGateArmed = false;
524
510
  setLayoutGateActive(false);
525
- refreshLayoutIssueBanner();
526
511
  }
527
512
 
528
513
  function forceRevealLayoutGate(reason) {
@@ -536,7 +521,6 @@ function startLayoutGateCycle() {
536
521
 
537
522
  layoutGateCycle += 1;
538
523
  layoutGateArmed = true;
539
- setLayoutIssueBanner(false);
540
524
  setLayoutGateCard("checking");
541
525
  setLayoutGateActive(true);
542
526
  clearLayoutGateTimer();
@@ -553,21 +537,14 @@ function startLayoutGateCycle() {
553
537
  // pending an agent repair: findings are the user's to triage, so a completed pass always reveals
554
538
  // and hands the result to the passive inbox.
555
539
  function handleLayoutGatePass() {
556
- if (!layoutGateEnabled || layoutGateManuallyBypassed) {
557
- refreshLayoutIssueBanner();
558
- return;
559
- }
560
- if (!layoutGateArmed && !layoutGateVisible) {
561
- refreshLayoutIssueBanner();
562
- return;
563
- }
540
+ if (!layoutGateEnabled || layoutGateManuallyBypassed) return;
541
+ if (!layoutGateArmed && !layoutGateVisible) return;
564
542
  revealLayoutGate();
565
543
  }
566
544
 
567
545
  function initializeLayoutGate() {
568
546
  if (!layoutGateEnabled) {
569
547
  setLayoutGateActive(false);
570
- setLayoutIssueBanner(false);
571
548
  return;
572
549
  }
573
550
 
@@ -821,7 +798,6 @@ function renderWarnings() {
821
798
  for (const warning of active) warningsList.appendChild(createWarningRow(warning));
822
799
  }
823
800
  updateWarningSelectionState();
824
- refreshLayoutIssueBanner();
825
801
  }
826
802
 
827
803
  function updateWarningSelectionState() {
@@ -854,9 +830,6 @@ function setWarningsDrawerOpen(open) {
854
830
  warningsButton.setAttribute("aria-expanded", String(warningsDrawerOpen));
855
831
  if (warningsDrawerOpen) {
856
832
  closeMenus();
857
- warningsAcknowledged = true;
858
- saveJsonState(warningAckStorageKey, true);
859
- refreshLayoutIssueBanner();
860
833
  warningsSelectAll.focus();
861
834
  }
862
835
  }
package/dist/chrome.css CHANGED
@@ -880,7 +880,6 @@ body.lavish {
880
880
  min-width: 0;
881
881
  min-height: 0;
882
882
  background: #fff;
883
- position: relative;
884
883
  overflow: hidden;
885
884
  }
886
885
  .panel {
@@ -1194,24 +1193,6 @@ body.lavish {
1194
1193
  .ended-action {
1195
1194
  margin-top: var(--space-8);
1196
1195
  }
1197
- .layout-issue-banner {
1198
- position: absolute;
1199
- top: var(--space-8);
1200
- left: var(--space-8);
1201
- right: var(--space-8);
1202
- z-index: 20;
1203
- border: 1px solid rgba(244, 201, 93, 0.35);
1204
- border-radius: var(--radius-lg);
1205
- background: rgba(37, 35, 15, 0.92);
1206
- color: var(--brass-400);
1207
- padding: var(--space-6) var(--space-8);
1208
- font-size: var(--text-sm);
1209
- line-height: var(--lh-sm);
1210
- box-shadow: var(--shadow-tooltip);
1211
- }
1212
- .layout-issue-banner[hidden] {
1213
- display: none;
1214
- }
1215
1196
  iframe {
1216
1197
  width: 100%;
1217
1198
  height: 100%;
package/dist/cli.mjs CHANGED
@@ -8430,7 +8430,7 @@ ${faviconTag}
8430
8430
  </head>
8431
8431
  <body class="${bodyClass}">
8432
8432
  <div class="bar"><div class="brand"><span class="brand-mark">Lavish</span><span class="brand-support">Editor</span></div><div class="spacer" aria-hidden="true"></div><div class="warnings-wrap" id="warningsWrap" hidden><button class="warnings-button" id="warningsButton" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="warningsDrawer">${chromeIcons.warning}<span class="warnings-count" id="warningsCount">0</span></button><div class="menu warnings-drawer" id="warningsDrawer" role="dialog" aria-labelledby="warningsTitle" aria-describedby="warningsSummary" hidden><div class="warnings-head"><h2 class="warnings-title" id="warningsTitle">Layout issues</h2><p class="warnings-summary" id="warningsSummary"></p></div><div class="warnings-toolbar"><label class="warnings-selectall"><input type="checkbox" id="warningsSelectAll"><span>Select all</span></label><span class="warnings-selected" id="warningsSelected" role="status" aria-live="polite"></span></div><div class="warnings-list" id="warningsList"></div><div class="warnings-foot"><p class="warnings-note">Queueing sends a repair request with your next feedback. An issue is marked resolved only after a newer artifact load and a complete check at the same viewport no longer finds it.</p><button class="button" id="warningsQueueButton" type="button" disabled>Queue selected fixes</button></div></div></div><button class="annotate-switch" id="annotation" type="button" aria-pressed="true" title="${escapeHtml(modeToggleHint)}"><span class="switch-track" aria-hidden="true"><span class="switch-knob"></span></span><span>Annotate</span></button><div class="more-wrap" id="moreWrap"><button class="more-button" id="moreButton" type="button" title="More" aria-haspopup="menu" aria-expanded="false">${chromeIcons.more}</button><div class="menu more-menu" id="moreMenu" hidden><div class="menu-head"><div class="menu-label">Editing</div><button class="menu-file" id="copyPath" type="button" title="Copy path \xB7 ${escapeHtml(session.file)}">${chromeIcons.file}<span class="menu-file-text"><span class="path-head">${escapeHtml(pathHead)}</span><span class="path-tail">${escapeHtml(pathTail)}</span></span><span class="copy-hint" id="copyHint"><span class="icon-copy">${chromeIcons.copy}</span><span class="icon-check">${chromeIcons.check}</span><span id="copyHintText">Copy</span></span></button></div><div class="menu-rule"></div><button class="menu-item" id="reloadArtifact" type="button">${chromeIcons.refresh}<span>Reload artifact</span></button><button class="menu-item" id="copySnapshot" type="button">${chromeIcons.camera}<span>Copy DOM snapshot</span></button><button class="menu-item" id="exportArtifact" type="button">${chromeIcons.download}<span>Export standalone HTML</span></button><button class="menu-item" id="shareArtifact" type="button">${chromeIcons.globe}<span>Publish link</span></button><div class="menu-rule"></div><button class="menu-item danger" id="end" type="button">${chromeIcons.exit}<span>End session</span></button></div></div></div>
8433
- <div class="layout"><div class="frame"><iframe id="artifact" sandbox="allow-scripts allow-forms allow-popups allow-downloads" data-artifact-src="/artifact/${session.key}/index.html"></iframe><div class="layout-issue-banner" id="layoutIssueBanner" hidden>Layout issues detected. Open <strong>Layout issues</strong> in the top bar to review and queue fixes.</div></div><aside class="panel"><h2>Conversation</h2><div class="panel-scroll" id="panelScroll"><div class="chat" id="chatLog"></div><div class="annotation-pills" id="annotationPills"></div></div><div class="composer"><div class="presence-banner handoff-banner" id="handoffBanner" hidden><span>This review is open in another Lavish tab.</span><button class="handoff-takeover" id="handoffTakeover" type="button">Take over here</button></div><div class="presence-banner" id="presenceBanner" hidden>Your agent is not listening. If this persists, ask your agent to poll for updates from Lavish.</div><textarea id="chatInput" placeholder="Write a message for the agent..."></textarea><div class="send-hint" id="sendHint" hidden>Write a message or annotate an element first.</div><div class="actions" id="sendActions"><button class="button button-danger" id="sendAndEnd" type="button">${chromeIcons.exit}<span>Send &amp; End</span></button><button class="button" id="send">Send to Agent</button></div></div></aside></div>
8433
+ <div class="layout"><div class="frame"><iframe id="artifact" sandbox="allow-scripts allow-forms allow-popups allow-downloads" data-artifact-src="/artifact/${session.key}/index.html"></iframe></div><aside class="panel"><h2>Conversation</h2><div class="panel-scroll" id="panelScroll"><div class="chat" id="chatLog"></div><div class="annotation-pills" id="annotationPills"></div></div><div class="composer"><div class="presence-banner handoff-banner" id="handoffBanner" hidden><span>This review is open in another Lavish tab.</span><button class="handoff-takeover" id="handoffTakeover" type="button">Take over here</button></div><div class="presence-banner" id="presenceBanner" hidden>Your agent is not listening. If this persists, ask your agent to poll for updates from Lavish.</div><textarea id="chatInput" placeholder="Write a message for the agent..."></textarea><div class="send-hint" id="sendHint" hidden>Write a message or annotate an element first.</div><div class="actions" id="sendActions"><button class="button button-danger" id="sendAndEnd" type="button">${chromeIcons.exit}<span>Send &amp; End</span></button><button class="button" id="send">Send to Agent</button></div></div></aside></div>
8434
8434
  <div class="share-overlay" id="shareDialog" role="dialog" aria-modal="true" aria-labelledby="shareTitleText" hidden><form class="share-card" id="shareForm"><div class="share-head"><div><div class="share-kicker">Publish to <a class="share-link" href="https://ht-ml.app" target="_blank" rel="noopener noreferrer">ht-ml.app</a></div><h2 id="shareTitleText">Publish artifact</h2></div><button class="share-close" id="shareClose" type="button" aria-label="Close publish dialog"><svg width="14" height="14" viewBox="0 0 10 10" fill="none" aria-hidden="true" focusable="false"><path d="M1 1L9 9M9 1L1 9" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg></button></div><p class="share-note">ht-ml.app is a separate, third-party hosting service, not part of Lavish. Publishing sends this artifact to its servers.</p><p class="share-copy">This uploads this artifact to ht-ml.app with local assets inlined. Without a password, the page is PUBLIC and anyone with the link can open it. With a password, the page is PRIVATE and viewers must supply the password to view.</p><p class="share-note">Do not publish secrets. The Lavish annotation SDK is not included.</p><div class="share-grid"><label>Password (optional)<input id="sharePassword" name="password" type="password" autocomplete="new-password" placeholder="Leave blank for a public page"></label></div><div class="share-status" id="shareStatus" role="status"></div><div class="share-result" id="shareResult" hidden><label>Share URL<div class="share-copy-row"><input id="shareUrl" readonly><button class="share-copy-btn" id="copyShareUrl" type="button">Copy URL</button></div></label><label>Update key (secret)<div class="share-copy-row"><input id="shareUpdateKey" readonly><button class="share-copy-btn" id="copyUpdateKey" type="button">Copy key</button></div></label><p class="share-note">Keep the update key private. ht-ml.app returns it once and it is the only way to update or delete this page later.</p></div><div class="share-actions"><button class="share-cancel" id="shareCancel" type="button">Cancel</button><button class="button" id="sharePublish" type="submit">Publish</button></div></form></div>
8435
8435
  <div class="ended-overlay layout-gate-overlay" id="layoutGateOverlay"${layoutGateHidden}><div class="ended-card"><div class="ended-title" id="layoutGateTitle">Checking layout.<br>One moment.</div><p class="ended-copy" id="layoutGateCopy">Lavish is waiting for fonts and final geometry before revealing this artifact.</p><button class="button ended-action" id="layoutGateAction" type="button">Show anyway</button></div></div>
8436
8436
  <div class="ended-overlay" id="endedOverlay" hidden><div class="ended-card"><div class="ended-title">Session ended.<br>Return to your agent to continue.</div><p class="ended-copy">${escapeHtml(session.file)}</p></div></div>
@@ -8674,7 +8674,7 @@ var POLL_WAKE_PATH_RULES = Object.freeze([
8674
8674
  ]);
8675
8675
  var POLL_SEND_AND_END_RULE = "`Send & End` ends the session. Its final feedback is still delivered once. After that response, polling stops, and the agent must not reopen the session uninvited.";
8676
8676
  var CODEX_POLL_WAKE_PATH_GUIDANCE = "Codex detected: completed background tasks may not resume Codex automatically, so keep the poll attached to the active turn.";
8677
- var VERSION = "0.1.46";
8677
+ var VERSION = "0.1.47";
8678
8678
  function detectInvokingAgent(env = process.env) {
8679
8679
  return ["CODEX_SANDBOX", "CODEX_THREAD_ID"].some((key) => Object.hasOwn(env, key)) ? "codex" : "generic";
8680
8680
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lavish-axi",
3
- "version": "0.1.46",
3
+ "version": "0.1.47",
4
4
  "packageManager": "pnpm@11.1.1",
5
5
  "description": "HTML is the new markdown. Lavish is the new editor for your HTML artifacts.",
6
6
  "type": "module",
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "lavish-axi",
4
- "version": "0.1.46",
4
+ "version": "0.1.47",
5
5
  "description": "HTML is the new markdown. Lavish is the new editor for your HTML artifacts.",
6
6
  "author": {
7
7
  "name": "Kun Chen",