Skip to content

54 desktop app - #60

Merged
SaifRehman merged 16 commits into
mainfrom
54_desktop_app
Jul 12, 2026
Merged

54 desktop app#60
SaifRehman merged 16 commits into
mainfrom
54_desktop_app

Conversation

@SaifRehman

Copy link
Copy Markdown
Contributor

No description provided.

SaifRehman and others added 16 commits July 9, 2026 15:32
…ation, backfill sweep

- comments.Fetch now honors its context: stream deadline is min(ctx
  deadline, 30s) and ctx cancellation resets the stream, so a stalled
  peer can no longer pin HTTP handlers (~60s) or delay ledger Close
  (~30s) past the caller's bound
- comment-body GET handlers validate CIDs with ParseCIDString (length
  + multihash prefix) for an instant 400 instead of running the full
  miss pipeline on garbage input
- bodyFetcher gains a periodic backfill sweep (1m after start, then
  every 10m, capped per sweep) that re-fetches bodies missed by the
  live queue, healing archive gaps from drops or unreachable authors
- boss bootstrap wires Options.Comments so bosses pre-replicate bodies
  on gossip, making fetch-on-miss the rare path
- findCommentAuthor stops the inbox scan at first match and logs scan
  errors instead of swallowing them

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
…ired fields

The equivocator/reputation-floor gate was only applied on the OpenAI-compat
path, so direct /api/execute and /api/execute/async — including the desktop
Dispatch button — bypassed it entirely. A below-floor or equivocating worker
would execute regardless of --reputation-floor. Both handlers now call
checkTrust before dialing and return 403 with the refusal reason.

Also validate worker_id and prompt up front: an empty/missing worker_id now
returns 400 'worker_id is required' instead of a misleading 404, and a missing
prompt returns 400 instead of reaching the dial.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
The SDK could read comments (comment_body, log) but had no way to POST
/v1/peers/{id}/comments/self, so SDK users couldn't rate or comment on
workers. Add sync + async comment(peer_id, text, rating=None) returning
CommentSubmitResult(cid, ledger_hash).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
Two user-reported bugs:

1. Chat sessions were never persisted. saveSessions writes under a
   per-project key (chat:sessions:<projectId>), but the settings:set IPC
   allowlist only contained the 8 static keys, so every write threw
   'refused settings key'. Navigating away from Chat dropped the
   in-memory state and it could never be reloaded. Extract the guard into
   isAllowedSettingsKey() and permit well-formed chat:sessions:<id> keys.

2. The toolbar was stuck on 'Connecting to relay…'. useAbout() had no
   refetchInterval, so /v1/about was fetched once at boot — before the
   relay was dialed — and never refreshed. Add a 5s poll so relay
   connectedness, ledger size, and uptime stay live.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
On today's mesh the rater-trust label is near-degenerate: a boss only
self-trusts (verified) and every other boss reads unverified, because
nobody rates bosses — so the per-row badge mostly signalled 'mine vs a
stranger's' and read like a signature-verification failure. Remove the
per-row badge; keep the aggregate honesty score, the reputation-floor
dispatch gate, and the 'X verified / Y unverified raters' summary.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
Each entry now displays which boss authored it as a short 12D…xxx chip
(first 3 / last 3 chars, mirroring AgentCard). Click copies the full
peer ID to the clipboard with a toast.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
Drops the last verified/unverified surface. The rater-trust concept is
near-degenerate on today's mesh (nobody rates bosses), so the summary
was low-signal. Aggregate honesty + the dispatch trust gate are unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
The lighthouse was dialed once at startup with no connmgr protection and
no reconnect. After the first drop (idle prune, reservation TTL, or a
network blip) the node lost its relay permanently — the mesh kept working
via mDNS/DHT but boss /v1/about reported the relay unreachable, so the
desktop toolbar was stuck on 'Connecting to relay…' after ~an hour.

Protect the relay peer from connmgr trimming and add a 30s maintenance
loop that re-dials + re-reserves whenever the connection drops. Exits on
context cancellation (no naked goroutine).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
The health banner and all four stat cards used Card live={...}, which
adds an accent glow plus a pulsing green corner dot. Drop live on the
Status surface so the cards render as plain neutral panels. Health is
still conveyed by the banner status dot and the 'Up'/value colors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
Remove the 'public mesh' and 'up HH:MM:SS' segments from the health
banner sub-line; mesh mode still shows on the Relay card and uptime on
the Boss card.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
No app.setName() was called, so dev builds showed 'Electron' in the
macOS menu bar, app switcher, and dock hover. Set it before app ready
and give the window an explicit AgentFM title. Packaged builds already
got this from electron-builder.yml (productName).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
app.setName() fixes the menu bar but not the macOS Dock, which reads
CFBundleName from the running .app bundle — in dev that's Electron's own
bundle ('Electron'). Add a predev script that rewrites the dev bundle's
Info.plist to 'AgentFM' before each npm run dev. Idempotent, macOS-only,
no-op when the bundle is absent. Packaged builds are unaffected (they use
electron-builder productName).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LdtNwxJJ3USeg2pzhb8sR
@SaifRehman
SaifRehman merged commit 5f2a78b into main Jul 12, 2026
3 of 11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant