2310 Commits

Author SHA1 Message Date
Nikhil
e2069bc999 chore: bump server version (#459) 2026-03-16 16:42:54 -07:00
shivammittal274
2d51c82722 fix: detect custom clickable elements in take_snapshot (#452)
take_snapshot only used the AX tree, which misses custom components
(cursor:pointer divs, onclick handlers, etc.) that lack ARIA roles.
These elements appeared as role="generic" and were invisible to the agent.

Changes:
- Merge findCursorInteractiveElements into snapshot() so take_snapshot
  catches cursor:pointer, onclick, and tabindex elements
- Add DisclosureTriangle to INTERACTIVE_ROLES for <summary> elements
- Use aria-label as text fallback in cursor detection for icon-only buttons
- Fix dedup bug in enhancedSnapshot that was silently dropping all
  cursor-detected elements by checking against all AX node IDs instead
  of only already-included output IDs
2026-03-17 02:01:15 +05:30
shivammittal274
29056226bb feat: add eval framework and coordinate-based input tools (#453)
- Add hover_at, type_at, drag_at coordinate tools to server
- Add hoverAt, typeAt, dragAt methods to Browser class
- Export server internals (browser, tool-loop, registry) for eval imports
- Copy eval app from enterprise repo with agents, graders, runner, dashboard
- Nest eval-targets inside apps/eval
- Adapt sessionExecutionDir → workingDir for current server API
- Add biome ignore for dashboard HTML to prevent lint breaking onclick handlers
2026-03-16 23:12:23 +05:30
shivammittal274
d1d2074abc feat: add get_console_logs tool for browser console output (#454)
* feat: add get_console_logs tool to surface browser console output

Captures Runtime.consoleAPICalled, Runtime.exceptionThrown, and
Log.entryAdded CDP events per page with a FIFO ring buffer (500 entries).

- ConsoleCollector: per-page buffers with O(1) session routing via Map lookup
- Session-aware CDP event dispatching (onSessionEvent) in CdpBackend
- Log.enable() added alongside Runtime.enable() in attachToPage
- Single tool with level hierarchy, text search, limit, and clear params
- Buffer clears on main-frame navigation, cleaned up on page close

* fix: address review — handle session re-attach, remove dead code

- ConsoleCollector.attach() now updates session mapping on re-attach
  instead of early-returning, preventing silent event drops after
  target detach/re-attach (e.g. tab crash, cross-process navigation)
- Remove unused clearConsoleLogs() and ConsoleCollector.clear()
2026-03-16 22:20:40 +05:30
shivammittal274
41c9b1547c feat: add per-task LLM provider selection for scheduled tasks (#450)
* feat: add per-task LLM provider selection for scheduled tasks

Allow users to choose which AI provider a scheduled task runs with,
using the same ChatProviderSelector component from the new-tab page.
Falls back to the global default provider when none is selected or
if the selected provider has been deleted.

* fix: lint issues

* chore: updated to latest schema.graphql file

---------

Co-authored-by: Dani Akash <DaniAkash@users.noreply.github.com>
2026-03-16 18:03:21 +05:30
shivammittal274
8b0e6dbfd3 Merge pull request #448 from browseros-ai/fix/filter-empty-conversation-messages
fix: filter empty messages from conversation history
2026-03-16 13:30:42 +05:30
github-actions[bot]
07a2d13f16 docs: shivammittal274 signed the CLA in browseros-ai/BrowserOS#$pullRequestNo 2026-03-15 12:27:03 +00:00
shivammittal274
46031ed573 fix: filter empty messages from conversation history to prevent validation errors
The AI SDK can produce assistant messages with empty parts (parts:[]) when
a stream is aborted, and providers reject assistant messages with empty text
content. This adds a validation utility that filters both cases before
sending messages to createAgentUIStreamResponse and when persisting them.
2026-03-15 17:42:34 +05:30
Nikhil
ecd31efcb0 fix: remove Git LFS tracking for docs images so Mintlify can serve them (#446)
Mintlify deploys docs by cloning the repo but does not run `git lfs
pull`. The `.gitattributes` rule `docs/images/** filter=lfs` caused
all doc images to be stored as ~130-byte LFS pointer files, which
Mintlify served as-is — breaking every image on the site.

Removing the LFS rule and re-adding the files as regular git blobs
fixes all images without changing any paths or MDX files.

Also fixes broken Slack link placeholder in troubleshooting page.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:29:26 -07:00
Nikhil
c79c775fb8 fix: co-locate troubleshooting images to fix broken CDN rendering (#444)
Images in docs/images/ are served as broken 130-byte placeholders by
Mintlify CDN. Co-locating images with the MDX file (matching the
working pattern in features/workflow/ and features/cowork/) bypasses
this issue. Also fixes the Slack link placeholder.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:12:26 -07:00
Felarof
4bee76253d fix: prevent undefined provider in chat requests on fresh install (#442)
* fix: fallback to default BrowserOS provider when provider is null

When the extension first loads, provider config is loaded async from
storage. If a chat request fires before loading completes (race
condition), provider is null and the server receives provider: undefined,
causing a Zod validation error. This adds a fallback to
createDefaultBrowserOSProvider() in both chat paths (sidepanel and
scheduled tasks) so provider.type is always defined.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: fallback to first provider when default provider ID is stale

When defaultProviderId in storage doesn't match any loaded provider
(e.g. after Kimi/Moonshot rollout), selectedProvider was null causing
provider: undefined in chat requests. Now falls back to providers[0].

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: repair stale defaultProviderId in storage on load

When the stored default provider ID doesn't match any loaded provider,
write back the corrected ID (providers[0].id) to storage so it doesn't
silently persist across sessions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 09:05:27 -07:00
Felarof
5b1b4e22cb chore: disable Canva and Exa from Klavis MCP server list
Comment out non-working Canva and Exa integrations from the OAuth MCP
servers list and remove their imports/icon mappings from the UI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 15:30:50 -07:00
Felarof
439acc8b12 feat: add worktrunk setup for browseros-agent development
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 13:17:08 -07:00
Felarof
95c855a091 feat: replace rate limit CTAs with Kimi/Moonshot partnership links (#437)
* feat: replace rate limit CTAs with Kimi/Moonshot partnership links

Comment out old "Learn more" and "take a quick survey" links on the
daily limit error banner. Replace with Kimi API key docs link and
direct Moonshot AI platform link for conversion tracking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: remove partnership tagline from rate limit banner

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:45:41 -07:00
Felarof
5ad6581f6d Merge pull request #436 from browseros-ai/feat/pr1
fix: use BookOpen icon for Docs button in settings sidebar
2026-03-13 09:36:43 -07:00
Felarof
2c04d79830 fix: use BookOpen icon for Docs button in settings sidebar
The Docs link in the settings sidebar was using the Info icon (circle
with "i"). Changed it to BookOpen which is the standard icon for
documentation links.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 09:36:19 -07:00
Nikhil Sonti
304b3b3289 chore: remove update submodule sync 2026-03-13 09:14:57 -07:00
Dani Akash
96b0a7cfc8 Merge pull request #435 from browseros-ai/chore/replace-agent-submodule-with-subtree
chore(repo): replace agent submodule with subtree
2026-03-13 21:30:12 +05:30
Dani Akash
290ee91a8b Add 'packages/browseros-agent/' from commit '90bd4be3008285bf3825aad3702aff98f872671a'
git-subtree-dir: packages/browseros-agent
git-subtree-mainline: 8f148d0918
git-subtree-split: 90bd4be300
2026-03-13 21:22:09 +05:30
Dani Akash
8f148d0918 chore(repo): remove BrowserOS-agent submodule 2026-03-13 21:21:51 +05:30
Dani Akash
e7680d4972 chore(repo): move docs media to LFS and stop tracking downloaded build tools (#434)
- Track docs/images/** and docs/videos/** with Git LFS
- Add packages/browseros/build/tools/ to .gitignore
- Remove appimagetool-x86_64.AppImage from version control (downloaded on demand by build script)
2026-03-13 21:07:22 +05:30
Nikhil Sonti
90bd4be300 chore: Merge branch 'main' 2026-03-13 07:48:40 -07:00
Felarof
6405639d36 chore: rename Chat & Hub Provider to Chat & Council Provider
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 21:25:48 -07:00
Nikhil
2d1e989a1c fix: remove duplicate hidden window and improve scheduled task prompt (#496)
* fix: scheduled task agent not using hidden window for new pages

The agent prompt only told the agent to pass windowId with `new_page`
but not `new_hidden_page`, which the agent prefers for background work.
The agent also had no instruction against closing or replacing its
dedicated hidden window, causing pages to scatter across uncontrolled
windows.

Expanded the scheduled task prompt rules to:
- Cover both `new_page` and `new_hidden_page` windowId requirement
- Forbid closing the dedicated hidden window
- Forbid creating new windows
- Added `new_hidden_page` to tool reference for MCP consumers

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: remove duplicate hidden window creation from scheduled task frontend

The server's ChatService already creates a hidden window for scheduled
tasks (chat-service.ts:99-126), but the frontend (scheduledJobRuns.ts)
was also creating a minimized Chrome window that the server immediately
overwrote. This caused two windows to be created per scheduled task run,
with only one being used.

Removed from scheduledJobRuns.ts:
- chrome.windows.create() call
- 1-second race condition delay hack (FIXME)
- chrome.windows.remove() cleanup
- windowId/activeTab params to getChatServerResponse()

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 17:11:51 -07:00
Nikhil
7c89198dcf fix: remove dead getCdpToolReference and unused prompt exports (#493)
* chore: bump server version

* fix: remove dead getCdpToolReference and unused prompt exports

The getCdpToolReference function was always excluded by the AI SDK agent
(tool schemas are injected by the SDK itself) and never used by the MCP
server (which has its own MCP_INSTRUCTIONS). Also removes unused exports
getSystemPrompt and PROMPT_SECTION_KEYS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 16:49:42 -07:00
Nikhil
8a38e90e24 fix: move session dirs to ~/.browseros/sessions and update skill paths (#494)
* chore: bump server version

* fix: move session dirs to ~/.browseros/sessions and update skill paths

Session directories now live under ~/.browseros/sessions/{conversationId}/
instead of executionDir/sessions/. Adds 30-day cleanup for stale sessions
at server startup. Updates 6 default skills to reference the working
directory instead of hardcoding ~/Downloads/.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: rename sessionExecutionDir to workingDir across server

Consistent naming for the per-conversation working directory:
- ResolvedAgentConfig.sessionExecutionDir → workingDir
- ToolDirectories.executionDir → workingDir
- resolveExecutionPath() → resolveWorkingPath()
- buildBrowserToolSet param: executionDir → workingDir

Server-level executionDir (DB, logs) unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address PR review — restore emoji folder name, refresh session mtime

- Revert "Read Later" back to "📚 Read Later" to avoid creating
  duplicate bookmark folders for existing users
- Touch session dir mtime on each message via utimes() so cleanup
  correctly reflects last activity, not just directory creation time

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address PR review round 2 — remove dead executionDir, fix emoji

- Remove executionDir from ChatServiceDeps and ChatRouteDeps since
  resolveSessionDir now uses getSessionsDir() directly
- Fix missed emoji in notification format template

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 16:41:47 -07:00
Nikhil Sonti
2c8cbbb77f chore: update patch 2026-03-12 14:24:07 -07:00
Nikhil Sonti
b96d8e6c29 chore: bump server version 2026-03-12 14:15:31 -07:00
Nikhil
32dd42cc6b fix: skills CRUD broken on Windows due to hardcoded path separator (#492)
safeSkillDir() used a hardcoded `/` in the startsWith path traversal
check. On Windows, path.resolve() returns backslash paths, so the check
always failed — blocking getSkill, createSkill, updateSkill, deleteSkill.

Replace `${skillsDir}/` with `${skillsDir}${sep}` using path.sep from
node:path, which returns `\` on Windows and `/` on POSIX.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 14:10:20 -07:00
Nikhil
b94e9c411d fix: persist default kimi hub provider to BrowserOS prefs on first load (#491)
* fix: persist default kimi hub provider to BrowserOS prefs on first load

When VITE_PUBLIC_KIMI_LAUNCH is enabled, loadProviders() returned default
Kimi provider in-memory but never saved it to the BrowserOS pref. The
browser's C++ code reads the pref directly and found it empty, so Kimi
didn't appear in the toolbar until the user manually edited and saved.

Now loadProviders() persists defaults and ensureKimiFirst() additions to
the pref, keeping the browser in sync with what the extension UI shows.

Fixes #428

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: use reference equality for ensureKimiFirst change detection

Address PR review: reference check (normalized !== providers) is more
semantically precise than length comparison since ensureKimiFirst returns
the same reference when unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 14:02:17 -07:00
Nikhil
bde80fedd6 feat: add GET /mcp health check endpoint (#490)
Return a friendly JSON response when users curl GET /mcp instead of
an opaque 503. Narrows the catch-all .all() to .post() since the MCP
Streamable HTTP transport only needs POST for stateless servers.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 13:45:26 -07:00
Nikhil
39ddabf3a7 fix: only show skills in 43 (#489) 2026-03-12 13:38:09 -07:00
Felarof
47d32dbc7d chore: reduce kimi k2.5 default context length to 200k
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 13:22:29 -07:00
Felarof
d9b593afa2 feat: redesign sidebar navigation (#487)
* feat: redesign sidebar navigation

* fix: adjust settings sidebar sections

* fix: refine settings sidebar labels

* fix: move docs into settings help
2026-03-12 10:50:21 -07:00
Dani Akash
29356c3df6 feat: docs update for new settings (#427) v0.43.0 2026-03-12 20:56:03 +05:30
Dani Akash
cc5bc3fff7 fix: incorrect tab got the active tab glow (#484) 2026-03-12 18:46:40 +05:30
Dani Akash
f02fecf732 feat: friendlier markdown editing (#483)
* feat: mdxeditor package install

* feat: new markdown editor

* fix: markdown editor ui

* fix: scroll of the markdown editor

* fix: checklist style and tool style

* feat: copy markdown button

* fix: text formatting on paste

* fix: copy markdown button positioning

* fix: markdown display

* fix: markdown editor scroll

* fix: address code reviews

* fix: restore htmlFor label associations for MarkdownEditor

Add id prop to MarkdownEditor and forward it to the outer wrapper div,
so Labels in SkillsPage and Personalize can reference the editor element.

Co-authored-by: Dani Akash <DaniAkash@users.noreply.github.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
2026-03-12 18:21:05 +05:30
Nikhil Sonti
a12b3b4ffc chore: bump PATCH and OFFSET 2026-03-11 17:22:42 -07:00
Nikhil Sonti
038ae259f0 feat: show updates immediaately on macos 2026-03-11 17:01:14 -07:00
Nikhil Sonti
4041aeb01c chore: bump server version 2026-03-11 16:52:14 -07:00
Nikhil Sonti
90400e3fcf fix: sparkle notification for update fix duplication 2026-03-11 16:38:48 -07:00
Nikhil
58a216fde3 fix: sparkle crash + notification fix for macos (#425)
* fix: sparkle crash

* feat: sparkle notification fix

* feat: new tab focus fix
2026-03-11 14:50:54 -07:00
Nikhil
38cc388894 feat: add missing patches and split sparkle in features.yaml (#424)
* feat: add missing patches to features.yaml

Add 37 patch files from chromium_patches/ that were not tracked in
features.yaml. Creates 3 new features (cdp-api, vertical-tabs,
crash-reporter) and adds missing files to 3 existing features
(chromium-ui-fixes, side-panel-fixes, first-run).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test: split sparkle third-party from mac-sparkle-updater

Move third_party/sparkle/ into its own feature since the Sparkle
framework is downloaded on-the-fly during build, not a permanent
patch in the tree.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: minor

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 14:32:53 -07:00
Nikhil
418fa879ee feat: gate skills page behind server version 0.0.73 (#481)
Skills page navigation is now hidden when the server version is below
0.0.73, matching the gating pattern used for Memory, Soul, and Workflows.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 13:39:21 -07:00
Nikhil
bcc1c54ccc fix: remove typed lint warnings from compaction tests (#479) 2026-03-11 13:21:39 -07:00
Nikhil
8173a443ff feat: move skills into main page navigation (#480)
* feat: move skills into main page navigation

Mirror the soul move pattern (166f6e1b) — promote Skills from
settings sidebar to primary navigation at /home/skills. Adds
backward-compat redirect from /settings/skills.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: remove missing dismiss-popups skill reference

The SKILL.md file doesn't exist on disk, causing a module
resolution error at server startup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 13:20:01 -07:00
Nikhil
2da099797e feat: refresh agent skills settings UI + seed skills (#478)
* feat: bootstrap 12 default agent skills for new users

Seed common browser automation skills (summarize, research, extract data,
fill forms, dismiss popups, screenshots, organize tabs, compare prices,
save page, monitor changes, read later, manage bookmarks) into
~/.browseros/skills/ on first startup when no user skills exist.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: populate skill edit dialog with existing content

The edit dialog form fields were empty because Radix Dialog's
onOpenChange doesn't fire when the open prop changes programmatically.
Replace the handleOpenChange wrapper with a useEffect that syncs form
state whenever editingSkill changes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: correct tool names in default skill instructions

- memory_save → memory_write (actual tool name in memory toolset)
- delete_bookmark → remove_bookmark (actual tool name in registry)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: move skill content from TS template literals to separate SKILL.md files

Replace the monolithic defaults.ts (738-line file with escaped template
literals) with individual SKILL.md files per skill. Uses Bun's text
import (`with { type: 'text' }`) to inline content at bundle time.
Adds md.d.ts for TypeScript module resolution.

Much easier to read and edit skill content as plain markdown.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add build:server:test and start:server:test scripts for local binary testing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: refresh agent skills settings UI

* fix: address PR review comments for 0311-skills_ui_refresh

* feat: enhance default skills with file persistence, HTML reports, and add find-alternatives

Rewrite deep-research, extract-data, compare-prices, manage-bookmarks, and
read-later skills to follow a structured phase-based workflow. Key changes:

- All research skills now save data incrementally to disk instead of
  accumulating in memory
- Add HTML report generation (light theme) with source links for
  deep-research, extract-data, and compare-prices
- Use hidden windows and parallel tabs (max 10) for multi-source extraction
- Simplify read-later to just bookmark + PDF save
- Simplify manage-bookmarks to max 3-5 top-level folders with confirmation
- Add new find-alternatives skill for product alternative research with
  1-5 star ranking

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: simplify skills page rendering

* fix: clean-up skill

* fix: address review feedback for PR #478

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 13:05:14 -07:00
Nikhil
d04a1f7e2a feat: add core memory viewer and editor to newtab (#476)
* feat: add core memory viewer and editor to newtab

Adds a new Memory page (/home/memory) that lets users view and
inline-edit their agent's core memories (CORE.md). Includes server
API endpoints (GET/PUT /memory) with Zod validation, React Query
hook with optimistic updates, and example prompts to teach the
agent through conversation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: improve memory examples with browser-aware prompts

Replace tech-specific examples with universal ones that leverage
the agent's browser tools — learning from bookmarks, summarizing
browsing history, reading open tabs, and setting communication
preferences.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: hide focus grid on memory page, same as soul page

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: reword history example to understand user, not just summarize

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: reset stale save error on edit/cancel, surface server errors

Address Greptile review:
- Reset mutation state in handleEdit/handleCancel/handleCreate to
  prevent stale error from reappearing on re-entry to edit mode
- Parse server response body on save failure to show actual error
  message (e.g. Zod validation) instead of generic "Failed to save"



* fix: cap memory viewer height with internal scroll

Long CORE.md content now scrolls within the card (max 480px) instead
of expanding the entire page. Applies to both read and edit modes.


* fix: polish memory viewer scroll UX

- Use viewport-relative max height (60vh) instead of fixed 480px
- Add styled-scrollbar for thin, themed scrollbar in both modes
- Add bottom fade gradient to hint at more content below
- Fixes width misalignment caused by system scrollbar stealing space
2026-03-11 11:45:02 -07:00
Dani Akash
40d0a6982e feat: set personality during onboarding (#477)
* feat: customize agent personality

* fix: reset soul with right types

* chore: use rpc client for setting personality

* fix: validation for new endpoint
2026-03-11 23:45:14 +05:30
Nikhil
ef9eebfd94 feat: refine new tab suggestion overflow (#472) 2026-03-11 09:37:51 -07:00