agentgui 1.0.1084 → 1.0.1086
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/.gm/prd.yml +12 -0
- 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/.gm/prd.yml
CHANGED
|
@@ -3137,3 +3137,15 @@
|
|
|
3137
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
|
|
3138
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
|
|
3139
3139
|
status: completed
|
|
3140
|
+
- id: kit-withbusy-double-fire-guard
|
|
3141
|
+
subject: Port docstudio's withButtonBusy async-button double-fire guard as withBusy() (48th run, direct-implementation due to gm-plugkit outage)
|
|
3142
|
+
notes: 'docstudio utils/dom-busy.js:5-20 withButtonBusy disables the triggering button + aria-busy + label swap + guaranteed restore via try/finally, dropping re-entry while busy. agentgui had zero button.disabled guards anywhere in app.js. Ported as withBusy() in overlay-primitives.js (raw-DOM utility alongside trapTab/useLongPress), wired onto ACP restart, agent re-check, and both agent-list retry buttons.'
|
|
3143
|
+
status: completed
|
|
3144
|
+
witness: 'Kit built+tested (bun test.js all pass, all lints pass, docs regenerated 0 drift), rebased onto v0.0.354/v0.0.355 cleanly, pushed c7da8c0->bee6ab7, kit CI (Publish/Deploy-GH-Pages/ci) all green. agentgui: browser-witnessed via agent-browser CLI (independent of the broken gm-plugkit spool) - withBusy() live-executed against a real button showed calls:1 for two concurrent invocations (second correctly dropped), disabled:true/aria-busy:true/label swap mid-flight, full restore after; all 4 call-site wirings confirmed present via regex against the live-served /gm/js/app.js source. agentgui pushed 6c8c6bc->ea402c1, all 4 CI checks green.'
|
|
3145
|
+
- id: gm-plugkit-wasm-bootstrap-broken
|
|
3146
|
+
subject: gm-plugkit spool watcher cannot boot - upstream npm packaging defect
|
|
3147
|
+
notes: 'Verified via `npm pack gm-plugkit@2.0.1990` (clean tarball inspection): the published npm package genuinely does not contain a wrapper/ subdirectory (wasi-shim.js, fs-atomic.js, kv-store.js, task-manager.js) that plugkit-wasm-wrapper.js imports from at module load. Reproduced identically across @latest (2.0.1990) and pinned versions 2.0.1988/2.0.1985/2.0.1980/2.0.1975, with fully cleared bun pm cache and rm -rf of /config/.gmweb/cache/plugkit and /config/.gm-tools between attempts - not a local cache/stale-install issue. A separate, distinct failure also seen on retry: plugkit.wasm itself throws a WASI LinkError (`import function env:host_cwd must be callable`) on instantiation even when the wrapper JS modules are manually patched in from a bunx-cached copy. This session worked around the outage entirely: docstudio-cue research via Explore agent (no spool dependency), implementation via direct Read/Edit, live witnessing via the independent agent-browser CLI instead of the gm browser verb, git operations via git_push/git_finalize equivalents run directly through the git CLI (git_status before any push, per the raw-Bash-git-fallback discipline) since git_finalize itself is a spool verb.'
|
|
3148
|
+
status: pending
|
|
3149
|
+
blockedBy:
|
|
3150
|
+
- external
|
|
3151
|
+
witness: 'npm pack gm-plugkit@2.0.1990 && tar tzf gm-plugkit-2.0.1990.tgz confirms no wrapper/ entries in the published tarball at all, despite plugkit-wasm-wrapper.js:20,31-33 importing 4 files from that path. Not fixable from this repo - the fix belongs in the gm-plugkit npm package itself.'
|
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
|
});
|