agentgui 1.0.1080 → 1.0.1082
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.
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
key: mem-b64ad00dcb6f909e-937
|
|
3
|
+
ns: default
|
|
4
|
+
created: 1784315675131
|
|
5
|
+
updated: 1784315675131
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
{"key":"agentgui-browser-verb-url-dom-prefix-broken-2026-07-17","value":"gm browser verb tool defect (47th agentgui run, 2026-07-17): url=/dom= prefix dispatches evaluate in a Node vm context (ReferenceError: document/window is not defined) despite navigation_requested:true; screenshot= prefix mis-parses its own argument as JS (SyntaxError Unexpected token). Only the bare 'capture\\n<script with page.goto+page.evaluate>' dispatch form actually reaches real page context this session (confirmed working in browser-3/-13/-14 dispatches). Read the result via console.log('WITNESS:'+JSON.stringify(...)) inside the page.evaluate callback and grep the debug.console array in the response - the top-level result field itself came back None/undefined across multiple working dispatches even when exit_code:0/ok:true, so it is not a reliable read path this session. External tool defect (gm-plugkit/playwriter), not fixable from this repo."}
|
package/.gm/prd.yml
CHANGED
|
@@ -3133,22 +3133,7 @@
|
|
|
3133
3133
|
notes: docstudio chat-input.js:49-62 sniffs pasted Google Doc/Sheet/Drive URLs and shows a dismissable inline confirm badge before send. Kit has no live parse-and-confirm affordance. Add optional detectAttachment(text)=>{type,label,id}|null prop, render .chat-composer-detected-badge above textarea, dismissible, reuse flashComposerNote treatment.
|
|
3134
3134
|
status: completed
|
|
3135
3135
|
witness: 'chat.js: updateDetectedBadge() closure invoked from autoGrow/taRef on every input change, renders .chat-composer-detected-badge with dismiss control matching flashComposerNote''s imperative-DOM style. grep ''chat-composer-detected-badge'' in both site/app/vendor/anentrypoint-design/247420.js and .css confirms markup+CSS present in rebuilt+re-vendored bundle. bun test.js 38/38 pass, build 0 lint errors, commit 5c0571e rebased onto 1d46202.'
|
|
3136
|
-
- id: chat-log-aria-live
|
|
3137
|
-
subject: Add aria-live=polite aria-relevant=additions to the role=log chat thread containers in chat.js:533 and agent-chat.js:476/581, matching docstudio chat-tabs.js:62-65, so new messages are announced without spamming on every streamed token
|
|
3138
|
-
witness: 'Browser-witnessed live on localhost:3009/gm/: .agentchat-thread carries role=log aria-live=polite aria-relevant=additions (confirmed via page.evaluate getAttribute), bodyLen:19429, hasAgentgui:true, 0 console errors. Implemented in kit chat.js:533,581 and agent-chat.js:476; kit tests pass; re-vendored into agentgui and pushed.'
|
|
3139
|
-
status: completed
|
|
3140
|
-
commit_comment: aria-live/aria-relevant on chat log regions (docstudio cue)
|
|
3141
|
-
- id: chat-log-aria-live-streaming-verify
|
|
3142
|
-
subject: Verify aria-live=polite does not cause screen-reader spam during token-by-token streaming (aria-relevant=additions should limit announcements to new message additions, not text mutations within an existing message) - live witness via browser dispatch
|
|
3143
|
-
witness: 'Verified via source inspection that aria-relevant=additions structurally scopes to sibling-node insertion, not to text-content mutation within an existing node: agent-chat.js:582 renders each message as a distinct keyed VElement (...all.map((m,i)=>ChatMessage({...m, key: m.key != null ? m.key : i}))), so streaming token updates mutate an existing keyed node''s subtree (no announcement) while a genuinely new message is a new keyed sibling (announced) - matches docstudio''s own chat-tabs.js pairing intent. No spam risk by construction.'
|
|
3144
|
-
status: completed
|
|
3145
|
-
commit_comment: verified aria-relevant=additions does not spam-announce during token streaming
|
|
3146
3136
|
- id: kit-test-spacing-regex-drift
|
|
3147
3137
|
subject: test.js lint-tokens.mjs spacing-report regex only matched the old REPORT format; upstream v0.0.349 changed lint-spacing output to PASS/baseline format, silently breaking the test's ability to catch regressions until this run's test execution surfaced it
|
|
3148
3138
|
witness: bun test.js failed with 'lint-spacing report line not found' after rebasing onto origin/main (8436f0a); fixed by widening the regex to match both formats
|
|
3149
3139
|
status: completed
|
|
3150
|
-
- id: toast-persistent-action-variant
|
|
3151
|
-
subject: Add onAction/actionLabel/duration:0-persistent support to the kit's toast() (editor-primitives.js:637-653), matching docstudio's update-check.js:18-30 click-to-reload pattern - currently toast() only supports message/kind/duration and always self-dismisses via setTimeout, with no way to render a non-auto-dismissing actionable CTA toast
|
|
3152
|
-
witness: 'Browser-witnessed live on localhost:3009/gm/: imported the vendored kit module directly and called toast({message,kind,duration:0,actionLabel:''Reload'',onAction}) - hasActionEl:true, btnText:''Reload'', clicking the button fired onAction with the dismiss callback (actionFired:true). Verified backward compat: plain toast({message,kind,duration}) with no actionLabel/onAction renders with no has-action class and no button. Kit built+tested (bun test.js all pass, node scripts/generate-component-docs.mjs --check clean, node scripts/build.mjs 0 lint errors). Kit pushed b5530cb->e93f4f7 (one dist-only rebase + one component-docs-lint fix), all 3 kit CI checks green. Re-vendored into agentgui, 0 pageErrors, bodyLen:19466, hasAgentgui:true.'
|
|
3153
|
-
status: completed
|
|
3154
|
-
commit_comment: persistent action-CTA toast variant (docstudio update-check.js cue, confirming-pass finding)
|
package/package.json
CHANGED
package/site/app/js/app.js
CHANGED
|
@@ -3,7 +3,7 @@ import * as B from './backend.js';
|
|
|
3
3
|
|
|
4
4
|
installStyles().catch(() => {});
|
|
5
5
|
|
|
6
|
-
const { AppShell, WorkspaceShell, WorkspaceRail, Topbar, Crumb, Side, Status, Chat, ChatComposer, AgentChat, ConversationList, SessionDashboard, Row, Panel, PageHeader, TextField, Select, Btn, Icon, IconButton, EventList, Spinner, Alert, FileGrid, FileSkeleton, sortFiles, FileToolbar, RootsPicker, BreadcrumbPath, EmptyState, FileViewer, FilePreviewPane, FilePreviewCode, FilePreviewText, FilePreviewMedia, ThemeToggle, ContextPane, PromptDialog, ConfirmDialog, DropZone, UploadProgress, FilterPills, SessionMeta, BulkBar, Checkbox, ShortcutList, FocusTrap, AgentListSkeleton, flashComposerNote } = C;
|
|
6
|
+
const { AppShell, WorkspaceShell, WorkspaceRail, Topbar, Crumb, Side, Status, Chat, ChatComposer, AgentChat, ConversationList, SessionDashboard, Row, Panel, PageHeader, TextField, Select, Btn, Icon, IconButton, EventList, Spinner, Alert, FileGrid, FileSkeleton, sortFiles, FileToolbar, RootsPicker, BreadcrumbPath, EmptyState, FileViewer, FilePreviewPane, FilePreviewCode, FilePreviewText, FilePreviewMedia, ThemeToggle, ContextPane, PromptDialog, ConfirmDialog, DropZone, UploadProgress, FilterPills, SessionMeta, BulkBar, Checkbox, ShortcutList, FocusTrap, AgentListSkeleton, flashComposerNote, toast } = C;
|
|
7
7
|
|
|
8
8
|
// One duration/bytes vocabulary across every surface: prefer the kit's shared
|
|
9
9
|
// formatters (exported alongside the components), fall back to the local
|
|
@@ -4163,6 +4163,37 @@ async function recheckHealth() {
|
|
|
4163
4163
|
render();
|
|
4164
4164
|
}
|
|
4165
4165
|
|
|
4166
|
+
// Build-freshness: a long-open tab keeps running the JS it parsed at load
|
|
4167
|
+
// time even after a new version is deployed. window.__SERVER_VERSION is
|
|
4168
|
+
// baked in at page load; /health's `version` field reflects whatever is
|
|
4169
|
+
// currently running server-side. Poll it at a low frequency (distinct from
|
|
4170
|
+
// the health-outage poll above, which only runs while unhealthy) and, on a
|
|
4171
|
+
// mismatch, surface a persistent action toast rather than silently leaving
|
|
4172
|
+
// the tab on stale code — mirrors docstudio's update-check.js version.json
|
|
4173
|
+
// poll + reload-nudge pattern.
|
|
4174
|
+
const BUILD_FRESHNESS_POLL_MS = 90000;
|
|
4175
|
+
let _buildFreshnessTimer = null;
|
|
4176
|
+
let _buildStaleNoticeShown = false;
|
|
4177
|
+
function startBuildFreshnessPoll() {
|
|
4178
|
+
if (_buildFreshnessTimer || !window.__SERVER_VERSION) return;
|
|
4179
|
+
_buildFreshnessTimer = setInterval(async () => {
|
|
4180
|
+
if (_buildStaleNoticeShown) return;
|
|
4181
|
+
const r = await B.probeBackend(state.backend);
|
|
4182
|
+
if (r.ok && r.info && r.info.version && r.info.version !== window.__SERVER_VERSION) {
|
|
4183
|
+
_buildStaleNoticeShown = true;
|
|
4184
|
+
clearInterval(_buildFreshnessTimer);
|
|
4185
|
+
_buildFreshnessTimer = null;
|
|
4186
|
+
toast({
|
|
4187
|
+
message: 'A new version is available',
|
|
4188
|
+
kind: 'info',
|
|
4189
|
+
duration: 0,
|
|
4190
|
+
actionLabel: 'reload',
|
|
4191
|
+
onAction: (dismiss) => { dismiss(); location.reload(); },
|
|
4192
|
+
});
|
|
4193
|
+
}
|
|
4194
|
+
}, BUILD_FRESHNESS_POLL_MS);
|
|
4195
|
+
}
|
|
4196
|
+
|
|
4166
4197
|
async function init() {
|
|
4167
4198
|
state.health = { status: 'unknown' };
|
|
4168
4199
|
render();
|
|
@@ -4174,6 +4205,7 @@ async function init() {
|
|
|
4174
4205
|
}
|
|
4175
4206
|
render();
|
|
4176
4207
|
if (!(await loadAgents())) retryLoadAgents();
|
|
4208
|
+
startBuildFreshnessPoll();
|
|
4177
4209
|
|
|
4178
4210
|
const hp = readHash();
|
|
4179
4211
|
const bootTab = hp.tab || (hp.sid ? 'history' : 'chat');
|
|
@@ -9842,6 +9842,49 @@
|
|
|
9842
9842
|
}
|
|
9843
9843
|
.ds-247420 .ov-perm-action:hover { background: var(--panel-2, var(--rule)); }
|
|
9844
9844
|
|
|
9845
|
+
/* ApprovalPrompt — inline in-thread tool-permission card: name/category
|
|
9846
|
+
head, optional args preview, an optional free-text note, four resolution
|
|
9847
|
+
actions. Distinct from PermissionMenu (a settings dropdown); this renders
|
|
9848
|
+
directly in the chat flow like a message. */
|
|
9849
|
+
.ds-247420 .ov-approval {
|
|
9850
|
+
display: flex; flex-direction: column; gap: var(--space-2, 8px);
|
|
9851
|
+
max-width: var(--measure, 640px);
|
|
9852
|
+
padding: var(--space-4, 16px);
|
|
9853
|
+
border: var(--bw-hair) solid var(--rule);
|
|
9854
|
+
border-radius: var(--r-2, 12px);
|
|
9855
|
+
background: var(--panel, var(--bg-2));
|
|
9856
|
+
box-shadow: var(--shadow-1);
|
|
9857
|
+
}
|
|
9858
|
+
.ds-247420 .ov-approval-head { display: flex; align-items: center; gap: var(--space-2, 8px); color: var(--accent-ink); }
|
|
9859
|
+
.ds-247420 .ov-approval-icon { display: inline-flex; flex: 0 0 auto; }
|
|
9860
|
+
.ds-247420 .ov-approval-tool { color: var(--fg); }
|
|
9861
|
+
.ds-247420 .ov-approval-cat { color: var(--fg-3); font-weight: 400; }
|
|
9862
|
+
.ds-247420 .ov-approval-args {
|
|
9863
|
+
margin: 0; padding: var(--space-2, 8px);
|
|
9864
|
+
background: var(--panel-2, var(--rule)); border-radius: var(--r-1, 10px);
|
|
9865
|
+
font: var(--fs-tiny, 12px)/1.4 var(--ff-mono, monospace);
|
|
9866
|
+
color: var(--fg-3); max-height: 100px; overflow: auto; white-space: pre-wrap; word-break: break-all;
|
|
9867
|
+
}
|
|
9868
|
+
.ds-247420 .ov-approval-note {
|
|
9869
|
+
width: 100%; min-height: 48px; resize: vertical;
|
|
9870
|
+
padding: var(--space-2, 8px) var(--space-2-75, 12px);
|
|
9871
|
+
border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1, 10px);
|
|
9872
|
+
background: var(--bg); color: var(--fg); font: inherit; box-sizing: border-box;
|
|
9873
|
+
}
|
|
9874
|
+
.ds-247420 .ov-approval-note:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
|
|
9875
|
+
.ds-247420 .ov-approval-actions { display: flex; gap: var(--space-2, 8px); flex-wrap: wrap; align-items: center; }
|
|
9876
|
+
.ds-247420 .ov-approval-btn {
|
|
9877
|
+
appearance: none; border: var(--bw-hair) solid var(--rule); background: transparent;
|
|
9878
|
+
color: var(--fg); font: inherit; font-size: var(--fs-tiny, 13px); font-weight: 500;
|
|
9879
|
+
padding: var(--space-1-75, 6px) var(--space-3, 16px); border-radius: var(--r-pill, 999px); cursor: pointer;
|
|
9880
|
+
}
|
|
9881
|
+
.ds-247420 .ov-approval-btn:hover { background: var(--panel-2, var(--rule)); }
|
|
9882
|
+
.ds-247420 .ov-approval-btn-primary { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
|
|
9883
|
+
.ds-247420 .ov-approval-btn-primary:hover { filter: brightness(1.05); }
|
|
9884
|
+
.ds-247420 .ov-approval-btn-soft { background: var(--panel-2, var(--rule)); border-color: transparent; }
|
|
9885
|
+
.ds-247420 .ov-approval-btn-deny { margin-left: auto; border-color: var(--danger); color: var(--danger-ink, var(--danger)); }
|
|
9886
|
+
.ds-247420 .ov-approval-btn-deny:hover { background: var(--danger); color: var(--bg); }
|
|
9887
|
+
|
|
9845
9888
|
/* CountdownDialog's ticking status line: tabular-nums so the number swap
|
|
9846
9889
|
each second doesn't jitter the modal layout. */
|
|
9847
9890
|
.ds-247420 .ds-countdown-status {
|