agentgui 1.0.1084 → 1.0.1085
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/AGENTS.md +4 -0
- package/package.json +1 -1
- package/site/app/js/app.js +5 -5
- package/site/app/vendor/anentrypoint-design/247420.js +14 -14
package/AGENTS.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# AgentGUI — Agent Notes
|
|
2
2
|
|
|
3
|
+
## Docstudio design-cue follow-up (2026-07-19) — forty-eighth run
|
|
4
|
+
|
|
5
|
+
Sixth docstudio-cue pass, user asked to "consider everything we haven't covered yet." A fresh full-tree Explore-agent survey of `/config/docstudio/public/js` (told everything runs 42-47 shipped) found the low-hanging component/prop/a11y gaps genuinely exhausted, but surfaced a real, previously-unexplored subsystem-level gap: agentgui has **zero double-fire protection anywhere** — no `button.disabled` guard on any async click handler in the whole app, unlike docstudio's `utils/dom-busy.js` `withButtonBusy` (disables the button, sets `aria-busy`, swaps the label to a busy string, and guarantees restore via try/finally; a repeat click while already in flight is silently dropped). Ported it as `withBusy()` in `overlay-primitives.js` — a raw-DOM utility (operates on a real `HTMLButtonElement`, not a VElement) living alongside the existing `trapTab`/`useLongPress` DOM utilities. Wired onto the three unguarded async-click sites found in `app.js`: the ACP agent restart button, the "not installed" re-check button, and both agent-list-load retry buttons (the file-mutation dialogs and stop-chat button already had their own state-driven busy guards, so those were correctly left alone). A second candidate — docstudio's `xls-preview.js` tabbed spreadsheet/CSV inline preview — was surveyed and deliberately deferred as a genuinely distinct, larger subsystem (needs a new kit component: tabbed table + truncation banner + error-fallback card) rather than folded in as a rushed partial port; recorded to memory as its own future initiative. **Tooling note: this run's `gm` spool watcher could not boot at all — `npm pack gm-plugkit@2.0.1990` confirmed the published npm tarball is genuinely missing the `wrapper/` subdirectory (`wasi-shim.js`/`fs-atomic.js`/`kv-store.js`/`task-manager.js`) that `plugkit-wasm-wrapper.js` imports from, reproduced identically across `@latest` and 5 pinned versions back to 2.0.1975 — a real upstream packaging defect, not a local/cache issue (verified with fully cleared bun/npm caches). Fell back to direct implementation with the `agent-browser` CLI (an independent tool, unaffected) for live witnessing instead of the gm browser verb.** Kit built+tested (`bun test.js` all pass, all lints pass, docs regenerated 0 drift), rebased cleanly onto a concurrent `v0.0.354`/`v0.0.355` release (`flatspace-theme` kit addition, no conflict). Kit pushed `c7da8c0`→`bee6ab7`. Browser-witnessed live via `agent-browser`: `withBusy` correctly drops a concurrent second call (`calls:1` across two simultaneous invocations), shows `disabled:true`/`aria-busy:true`/swapped label mid-flight, and fully restores after — plus confirmed all four call-site wirings present in the live-served `app.js` bundle by regex against the actual fetched source. agentgui re-vendored, 0 console errors on live reload.
|
|
6
|
+
|
|
3
7
|
## Docstudio design-cue follow-up (2026-07-17) — forty-seventh run, confirming pass
|
|
4
8
|
|
|
5
9
|
Per gm-continue's mandatory first-confirming-pass discipline, a second independent Explore-agent survey (told what the 47th run's main pass just shipped) re-checked docstudio against the kit + app and found one last real, narrow gap: `app.js`'s cross-tab external-update banner still called native `window.confirm()` for the reload-discards-unsent-draft guard — the sole remaining native browser dialog call anywhere in the app, matching docstudio's own `dialog.js` rationale of never using `window.confirm/alert/prompt` for data-loss confirmations. Replaced with a `state.chat.confirmingReloadDiscard` flag rendering the kit's existing `ConfirmDialog` modal, mirroring the same pattern already used for file delete/bulk-delete. Browser-witnessed by fetching the live-served `/gm/js/app.js` directly and regex-confirming `window.confirm` is gone and the new `confreload` dialog key is present. A second confirming pass after this one found nothing further — docstudio's `buildDocAccessPrompt`/`buildScopePrompt` variants are narrow Google-OAuth/Drive-doc-specific flows with no analog in agentgui's domain model, and everything else checked (ApprovalPrompt's focus/a11y semantics, build-freshness poll, modal focus-trap/Escape/backdrop semantics) was already correctly ported.
|
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, toast } = 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, withBusy } = 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
|
|
@@ -2301,7 +2301,7 @@ function chatMain() {
|
|
|
2301
2301
|
banners.push(Alert({ key: 'agerr', kind: 'error', title: 'Could not load agents from the server',
|
|
2302
2302
|
children: [
|
|
2303
2303
|
h('span', { key: 'agtxt', title: state.agentsError }, 'The agent list failed to load - this is a connection issue, not necessarily a sign nothing is installed. '),
|
|
2304
|
-
Btn({ key: 'agretry', onClick: () => loadAgents(), children: 'retry' })] }));
|
|
2304
|
+
Btn({ key: 'agretry', onClick: (e) => withBusy(e.currentTarget, () => loadAgents(), 'retrying…'), children: 'retry' })] }));
|
|
2305
2305
|
}
|
|
2306
2306
|
if (state.chat.loadingTranscript) {
|
|
2307
2307
|
banners.push(Alert({ key: 'transcriptload', kind: 'info', title: 'Loading prior conversation…',
|
|
@@ -3907,12 +3907,12 @@ function agentsPanel() {
|
|
|
3907
3907
|
state: usable ? 'default' : 'disabled',
|
|
3908
3908
|
onClick: usable ? () => { navTo('chat'); selectAgent(a.id); } : undefined,
|
|
3909
3909
|
right: (acp && !acp.healthy)
|
|
3910
|
-
? [Btn({ key: 'acprestart', onClick: (e) => { e.stopPropagation(); B.restartAcpAgent(state.backend, a.id).then(() => loadAgents()); }, children: 'restart' })]
|
|
3910
|
+
? [Btn({ key: 'acprestart', onClick: (e) => { e.stopPropagation(); withBusy(e.currentTarget, () => B.restartAcpAgent(state.backend, a.id).then(() => loadAgents()), 'restarting…'); }, children: 'restart' })]
|
|
3911
3911
|
// Direct-runner agents (claude-code/agy) have no restart, but a
|
|
3912
3912
|
// 'not installed' verdict can go stale if the user installs the
|
|
3913
3913
|
// CLI mid-session - give it the same recheck affordance ACP rows
|
|
3914
3914
|
// get via 'restart', instead of only static prose.
|
|
3915
|
-
: (!avail ? [Btn({ key: 'agrecheck', onClick: (e) => { e.stopPropagation(); loadAgents(); }, children: 're-check' })] : undefined),
|
|
3915
|
+
: (!avail ? [Btn({ key: 'agrecheck', onClick: (e) => { e.stopPropagation(); withBusy(e.currentTarget, () => loadAgents(), 'checking…'); }, children: 're-check' })] : undefined),
|
|
3916
3916
|
});
|
|
3917
3917
|
})
|
|
3918
3918
|
// The empty array means one of three things; never let an in-flight load
|
|
@@ -3922,7 +3922,7 @@ function agentsPanel() {
|
|
|
3922
3922
|
: (state.agentsError
|
|
3923
3923
|
? h('div', { key: 'agfail', class: 't-meta empty-state' },
|
|
3924
3924
|
h('span', { key: 'agfailtxt' }, 'the agent list failed to load'),
|
|
3925
|
-
Btn({ key: 'agretry2', onClick: () => loadAgents(), children: 'retry' }))
|
|
3925
|
+
Btn({ key: 'agretry2', onClick: (e) => withBusy(e.currentTarget, () => loadAgents(), 'retrying…'), children: 'retry' }))
|
|
3926
3926
|
: h('p', { key: 'none', class: 't-meta' }, 'no agents loaded'))]),
|
|
3927
3927
|
].filter(Boolean),
|
|
3928
3928
|
});
|