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.
- package/dist/chrome-client.js +2 -29
- package/dist/chrome.css +0 -19
- package/dist/cli.mjs +2 -2
- package/package.json +1 -1
- package/plugin.json +1 -1
package/dist/chrome-client.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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 & 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.
|
|
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
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.
|
|
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",
|