Commit Graph
432 Commits
Author SHA1 Message Date
SirKentutandClaude Opus 4.8 8cf868784f [pierre] fix/app-agent: re-attach app controls on every task
Run AppDescribe and front-load the app's controls each task in app mode,
not just on fresh conversations. The bridge can appear between runs and a
resumed history may carry a stale screenshot-it strategy; re-reading the
controls re-points the agent at the bridge instead of inheriting old fumbling.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 00:52:00 -07:00
SirKentutandClaude Opus 4.8 a35bfaaf7d [pierre] feat/app-agent: drive web apps through the OPENSWARM_APP bridge
Browser agent gains app-control logic + schema, app-builder skill doc,
run.sh agent-bridge presence check, and app-agent tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 15:06:10 -07:00
SirKentut f90975f006 feat(webapp-template): ship agent bridge (window.OPENSWARM_APP) as a hook, not a doc
Add agentBridge.ts and import it FIRST in index.tsx so the bridge is
installed on the window before any app code runs.

The visitor / door / doorbell analogy:

- The visitor is the agent. It shows up wanting to operate the app:
  read the rules, see the controls, take an action, check what happened.
- The door is window.OPENSWARM_APP. A single, always-present surface the
  visitor can knock on: describe() to learn the app, getState() to read a
  snapshot, invoke(name, args) to act.
- The doorbell is register({ rules, controls, getState, invoke }). The app
  presses it on mount to say "I'm home, here's how to talk to me." Until it
  does, describe()/getState() answer { __ready: false } so the visitor
  knows the app is still booting and waits, instead of concluding nobody
  lives here.

Why a hook and not just an .md:

A markdown instruction ("please expose your controls on window.X") is a
request the app can forget, half-implement, or drift from, and nothing
fails when it does. The bridge ships WITH the template and is imported
before app code, so the door exists from first paint whether or not the
author thought about agents. The app's only job is to press the doorbell
once; it never wires the plumbing, so it cannot get the plumbing wrong.
The contract is executable, not aspirational, which is the difference
between every generated app being agent-operable by default and hoping
each one remembered to be.
2026-06-14 07:49:13 -07:00
SirKentutandClaude Opus 4.8 eb6278ff5c fix(webapp-template): self-heal half-installed vite warm cache
An npm install killed mid-warm leaves node_modules/ populated but no
.bin/, so _ensure_warm_cache (which only checked the dir exists) trusted
the half-tree forever and every app symlinked to it died with
`vite: command not found`. Gate the cache on .bin/vite existing, and
harden the app's frontend/run.sh skip-install guard the same way.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 02:35:19 -07:00
SirKentut b498ed3097 implemented app-describe for agent use: exposing the command tree of an app 2026-06-13 01:01:11 -07:00
ciregenz 775b24d285 Merge PR #68 [aidan] bug: ui/ux fixes (back/forward disabled-state, browser-card dashboard scoping + resize, selection-overlay clipping, dashboard-duplicate carries chats)
AppShell conflict resolved: kept the lucide/redesign + folded in the back/forward disabled-state logic.
2026-06-11 02:59:30 -07:00
ciregenz 0a81bfa17a Merge PR #70 [Aidan] appbuilder: inject selected-app context into dashboard agent chat 2026-06-11 02:51:05 -07:00
AidanandGitHub d69854520b fix: carry agent chats over when duplicating a dashboard (#73)
duplicate_dashboard cloned the layout but left every browser_card pointing at
the source's browser_id and never copied the sessions, so the new dashboard
showed the browser but no chat. Now we mint fresh browser_ids, duplicate every
session attached to the source dashboard (in-memory + on-disk), remap
browser_id / parent_session_id / spawned_by / cards / expanded_session_ids onto
the new ids, and persist via _save_session. Also restores top-level agent cards
(layout.cards), which were silently dropped on duplicate.
2026-06-11 01:16:00 -07:00
ciregenz ddd0641cac [eric] merge free-trial + value-first onboarding (flag off, reorder gated so no-trial = today's flow)
# Conflicts:
#	frontend/src/app/pages/AgentChat/bubbles/MessageBubble.tsx
2026-06-10 23:20:18 -07:00
ciregenz 6b5f10e287 [eric] bash defaults to always-allow like other actions (catastrophic/scheduling/sensitive-path guards still prompt); drop the working status dot 2026-06-10 23:13:02 -07:00
AidanandGitHub e8e19661e6 Inject selected-app context into dashboard agent chat (#69)
When a user selects an App card on the dashboard via the "Select UI element" picker, thread the selected Output ids to the backend (mirroring the selected_browser_ids path) and inject a per-app context block into the system prompt: each app's absolute workspace path, entry point, meta.json, and a pointer to its SKILL.md. This lets the agent edit existing apps in place from the main view (the dashboard card's Vite runtime live-reloads on save) without switching to the Apps tab.
2026-06-10 21:29:02 -07:00
ciregenz 100d6491f7 [eric] models: track model errors (diagnostic) + friendly 'not on your plan' card for the 1211 unknown-model wall 2026-06-10 19:10:57 -07:00
ciregenz a126c42a07 [eric] free-trial: hand the wheel back when a real model is connected mid-trial (key or 9router sub) 2026-06-10 16:32:25 -07:00
ciregenz 893f016461 [eric] outputs: idle-paused (SIGSTOP) runtimes stop advertising their frozen port, the real fix for the app-switch ERR_FAILED 2026-06-10 01:44:53 -07:00
ciregenz b13cc5c2b9 [eric] outputs: gate preview URL on a live runtime, a crashed vite no longer hands the webview a dead port (ERR_FAILED on reopen) 2026-06-10 01:35:12 -07:00
ciregenz e8692159a3 [eric] outputs: PUT clears session_id on explicit null (exclude_unset), Apps stale-link self-heal finally sticks 2026-06-10 01:16:28 -07:00
ciregenz fb178648df [eric] free-trial: backend dispatch injection, hardware fingerprint, mint/clear, exhaustion upsell 2026-06-09 23:54:10 -07:00
Aidanandciregenz 0a704d4690 [aidan] chat: isolate branch history, fresh session on edit/switch (#62) 2026-06-09 22:29:31 -07:00
ciregenz 1fd32b7bc3 [eric] backend: add Fable 5 subscription (cc/) row, verified live 200 on the Claude sub 2026-06-09 15:58:19 -07:00
ciregenz f728a1e485 [eric] service: spool 429/timeout/5xx instead of dropping, warn on 4xx rejects + spool evictions 2026-06-09 15:50:40 -07:00
ciregenz ed2aa322ca [eric] backend: PUT settings preserves server-owned fields, stale drafts wiped pro bearers 2026-06-09 15:10:55 -07:00
ciregenz 7ab61057df [eric] backend: surface Fable 5 in the model picker on the api-key route + price it $10/$50 2026-06-09 14:55:07 -07:00
ciregenz 1be1ce581d [eric] providers: Fable 5 turns thinking off by omitting the param, not thinking:disabled (which 400s) 2026-06-09 14:06:18 -07:00
ciregenz a774f68b96 [eric] providers: add Claude Fable 5 on the API-key route (sub route held on pinned 9router) 2026-06-09 13:27:45 -07:00
ciregenz 49bd292746 [eric] backend: answer client:ping on /ws/dashboard, the missing pong let the client heartbeat kill the socket every 35s 2026-06-09 12:59:00 -07:00
ciregenz e24a63c13c [eric] browser: steer paginated gathers to sweep in batch (RepeatFlow + sessionStorage / scroll-then-read), not one page per turn 2026-06-09 02:39:31 -07:00
ciregenz bfcad98b76 [eric] browser: BrowserSaveData writes a big page dataset to one sandboxed file, ending the dispatch-per-chunk waste 2026-06-09 02:05:26 -07:00
ciregenz 9eb0e2cb2b [eric] browser: new gathered data resets the spin backstop, so a page-by-page gather runs to completion instead of getting cut with partial results 2026-06-08 23:47:26 -07:00
ciregenz ba41409577 [eric] browser: spin backstop nudges a clean Done wrap-up, not a mid-thought cutoff 2026-06-08 23:26:15 -07:00
ciregenz 438d1e36d4 [eric] browser: arm the send-completion shortcut only for send tasks, not gathers (cookie click faked a send) 2026-06-08 23:02:55 -07:00
ciregenz 07f911d200 [eric] browser: a clean success needs an explicit Done; recognize gather asks, steer them to BrowserExtract 2026-06-08 22:37:33 -07:00
ciregenz 91073becec [eric] browser: finish via a Done(message) tool so the user gets a plain conversational reply, not the OUTCOME tag 2026-06-08 22:15:52 -07:00
ciregenz 1d57ee6680 [eric] settings: new agent chats spawn expanded by default (toggle off in Settings > Interface) 2026-06-08 13:15:48 -07:00
ciregenz 110dc1c745 [eric] browser: fast-path emits a synthetic BrowserAgent tool-call/result so the 'Browser Agent' bubble always shows, even when the orchestrator is skipped 2026-06-08 13:07:12 -07:00
ciregenz b634638677 [eric] browser: poll the interactives list for the real Send button after a composer fill so the handoff actually fires (was 0/10, racing the lazy render) 2026-06-08 12:42:18 -07:00
ciregenz 8d9c75803c [eric] browser: restore the Send-button handoff (points the model at the Send index after a fill); deleting it brought the Send-hunt back, it was NOT redundant with the wait 2026-06-08 00:58:38 -07:00
ciregenz bf5f95573a [eric] browser: wait up to 6s (not 2.5s) for the lazy-rendering Send button after a composer fill, kills the re-list turn and the late-Send miss 2026-06-08 00:44:26 -07:00
ciregenz cdba825277 [eric] browser: final message is ONLY the OUTCOME line in plain human words, no narration preamble or UI jargon 2026-06-08 00:31:27 -07:00
ciregenz 2d59a0fbf1 [eric] browser: stall-path completion text is a plain confirmation, never the raw action-log proof (indices/coords) 2026-06-08 00:15:39 -07:00
ciregenz f8c812353e [eric] browser: agent writes a plain human final message (no UI jargon/OUTCOME mechanics); delete the leaky send-ready advisory, dead prefix flag, and humanize aux experiment 2026-06-08 00:09:50 -07:00
ciregenz ce8e74b96a [eric] browser: skill-replay returns a normal OUTCOME line so the parent translates it, no more 'learned skill replay (N steps, no LLM)' leaking to users 2026-06-07 23:49:21 -07:00
ciregenz 725578b2a8 [eric] browser: orchestrator translates the OUTCOME line into a plain human confirmation; drop hardcoded task-specific examples from prompts 2026-06-07 23:44:39 -07:00
ciregenz d5fc146123 [eric] browser: never leave a tool_use unanswered (backfill mid-turn + validate both directions) so a 30s upstream reset stops 400-killing the run 2026-06-07 23:04:59 -07:00
ciregenz 2409e2d4cd [eric] browser: fire the learning self-audit every 25 finished tasks in a daemon thread (zero hot-path latency) 2026-06-07 21:33:38 -07:00
ciregenz 6ef7b33667 [eric] browser: cross-site meta-playbook (tier 3) + self-audit of the learning machinery (tier 4, proposes for human review, never self-edits) 2026-06-07 21:20:40 -07:00
ciregenz 7ec05613fe [eric] browser: hand the Send button to the model after a composer fill, and commit to an already-open thread instead of re-verifying 2026-06-07 19:28:51 -07:00
ciregenz 1204e733b5 [eric] browser: stall backstop only fires after a real action, never cuts short early orientation 2026-06-07 19:12:43 -07:00
ciregenz e19def1ae5 [eric] browser: a clean Send-class click ends the run; bound the look-only spin even when the send cant be auto-detected 2026-06-07 19:07:34 -07:00
ciregenz 0f63697765 [eric] browser: confirm waits for the target to actually render so a send isnt falsely 'not confirmed' under load 2026-06-07 18:58:43 -07:00
ciregenz 889c7707e4 [eric] browser: a confirmed send ends the run, no more stalling to re-verify what the confirm proved 2026-06-07 18:52:20 -07:00