agentgui 1.0.1011 → 1.0.1013

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # AgentGUI — Agent Notes
2
2
 
3
+ ## Per-row file move + lint tooling fix (2026-07-02) — twenty-sixth run
4
+
5
+ Landed gui-completion #0: single-file move previously required checkbox-select + BulkBar. Kit `FileRow` gains a `move` action (between rename/delete, `arrow-right` icon); app `onAction('move', file)` seeds `state.files.marked` with just that one path and opens the existing bulk-move dialog, reusing `runBulkMove`/`/api/move` as-is — no new dialog kind, no new server surface. **Also fixed a real bug in `../design`'s `scripts/lint-null-children.mjs`**: its bracket-matcher did not understand `//` line comments, so an apostrophe inside ANY comment anywhere in a scanned file (e.g. "the kit's own") was read as opening a string literal, silently corrupting bracket-depth tracking for the rest of that file — a false positive here, but potentially a false NEGATIVE elsewhere (hiding a real missing `.filter(Boolean)` behind an unrelated apostrophe earlier in the file). Added `stripLineComments()` (string-literal-aware) run before the scan; verified by reintroducing the apostrophe and confirming it now lints clean.
6
+
7
+ **CI note: `Deploy GH Pages` repeatedly failed with "Deployment cancelled" / "Timeout reached, aborting!" across this run and the 25th** — GitHub Pages' deployment API appears to self-cancel when a rerun is triggered while a prior attempt for the same commit SHA is still settling (rapid successive `gh run rerun` calls made this worse, not better). Fix: don't rerun repeatedly in quick succession — trigger once (`gh run rerun` or `gh workflow run "Deploy GH Pages" --ref main` for a fresh dispatch if reruns keep reusing a wedged deployment ID) and wait it out with zero concurrent interference; both repos' deploys succeeded the moment reruns stopped racing each other. `npm publish`/`Publish and Release` (the actual consumer-facing artifacts) were green from the first attempt every time — only the docs-site GH Pages deploy flaked.
8
+
3
9
  ## Mid-thread retry (2026-07-02) — twenty-fifth run
4
10
 
5
11
  Landed the highest-severity finding deferred from the 24th run (gui-completion #7): retry was hard-gated to the LAST message only — a user unhappy with an earlier assistant reply had no way to redo it. Kit `AgentChat` now offers the retry action on every settled assistant turn, not just `i === lastIdx`; `onRetryMessage(m)` passes the specific message. App `retryTurn(m)` truncates+resends from `m`'s preceding user turn (falls back to the trailing assistant turn when called with no argument, preserving the old "retry last" behavior). **Retrying anything before the trailing turn discards every later turn too** — it now arms the same confirm banner edit-and-resend already uses (generalized with a `kind: 'retry'` tag: "Retry this turn? Retrying will remove the later turns") instead of firing immediately; retrying the actual last turn (no data loss) still executes immediately. Caught and fixed a real bug while generalizing: the old `retryLastTurn()` never cleared `state.chat.resumeSid`/`resumeNote` on truncation, unlike `confirmEditAndResend()` which already did per the "never `--resume` a diverged tail" rule — both paths now share `executeTruncateAndResend()` so this can't drift apart again. Kit pushed `834c81d`, agentgui pushed `18cd971`. Browser-witnessed end-to-end (mid-thread retry click -> confirm banner armed with the correct index -> confirm -> truncated to exactly the retried turn -> resent -> resumeSid cleared), 0 console errors, 28/28 tests. **Note:** this run's Deploy GH Pages CI step flaked twice ("Timeout reached" / "Deployment cancelled") before succeeding on a 3rd rerun — an infra flake in the docs-site deploy environment, not a code regression (`npm publish`, the actual consumer artifact, was green from the first attempt every time).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentgui",
3
- "version": "1.0.1011",
3
+ "version": "1.0.1013",
4
4
  "description": "Multi-agent ACP client with real-time communication",
5
5
  "type": "module",
6
6
  "main": "electron/main.js",
@@ -1350,7 +1350,7 @@ function filesMain() {
1350
1350
  persistFilesPrefs();
1351
1351
  render();
1352
1352
  } },
1353
- filter: { value: f.filter || '', placeholder: 'Filter files in this directory', onInput: debouncedFilesFilter },
1353
+ filter: { value: f.filter || '', placeholder: 'Filter files', onInput: debouncedFilesFilter },
1354
1354
  onUp: fileUp,
1355
1355
  onOpen: (file) => {
1356
1356
  if (file.permissions === 'EACCES') { announce('no access to ' + file.name); return; }
@@ -3135,17 +3135,26 @@ function serverPanel() {
3135
3135
  // succeeded): 'checking…' reads as progress, 'unknown' reads as a
3136
3136
  // permanent fact about the server - only the first is true here.
3137
3137
  const fallback = (hh.status === 'unknown' && state.healthChecking) ? 'checking…' : 'unknown';
3138
+ // These facts previously each rendered as their own '.lede' paragraph -
3139
+ // .lede is the fs-xl/tall-line-height INTRO-paragraph style, not a metadata
3140
+ // style, so four short facts read as four oversized paragraphs with a lot
3141
+ // of dead vertical space between them. One compact SessionMeta strip
3142
+ // (already used for the roots list right below) gives all server facts a
3143
+ // consistent, denser reading - same information, a fraction of the height.
3144
+ const facts = [
3145
+ { label: 'version', value: hh.version ? 'v' + hh.version : fallback },
3146
+ { label: 'uptime', value: upMs != null ? fmtDuration(upMs) : fallback },
3147
+ { label: 'connected clients', value: wsClients != null ? String(wsClients) : fallback },
3148
+ { label: 'projects folder', value: hh.projectsDir || fallback, title: hh.projectsDir || undefined },
3149
+ ];
3138
3150
  return Panel({
3139
3151
  id: 'server',
3140
3152
  title: 'server',
3141
3153
  children: [
3142
- h('div', { key: 'sv', class: 'lede' }, 'version: ' + (hh.version ? 'v' + hh.version : fallback)),
3143
- h('div', { key: 'sup', class: 'lede' }, 'uptime: ' + (upMs != null ? fmtDuration(upMs) : fallback)),
3144
- h('div', { key: 'swc', class: 'lede' }, 'connected clients: ' + (wsClients != null ? wsClients : fallback)),
3145
- h('div', { key: 'spd', class: 'lede' }, 'projects folder: ' + (hh.projectsDir || fallback)),
3154
+ SessionMeta({ key: 'sfacts', items: facts }),
3146
3155
  roots.length
3147
3156
  ? SessionMeta({ key: 'sroots', items: roots.map((r, i) => ({ label: 'root ' + (i + 1), value: r, title: r, onCopy: () => copyText(r, 'root copied') })) })
3148
- : (hh.status && hh.status !== 'unknown' ? h('div', { key: 'snoroots', class: 'lede' }, 'allowed roots: none configured') : null),
3157
+ : (hh.status && hh.status !== 'unknown' ? h('div', { key: 'snoroots', class: 't-meta' }, 'allowed roots: none configured') : null),
3149
3158
  ],
3150
3159
  });
3151
3160
  }