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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentgui",
3
- "version": "1.0.1080",
3
+ "version": "1.0.1082",
4
4
  "description": "Multi-agent ACP client with real-time communication",
5
5
  "type": "module",
6
6
  "main": "electron/main.js",
@@ -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 {