Commit Graph

8347 Commits

Author SHA1 Message Date
Karl Seguin
93d2e9689b Merge pull request #2522 from lightpanda-io/WebDriver_getComputedLabel
Add WebDriver getComputedLabel
2026-05-23 07:49:44 +08:00
Adrià Arrufat
70b9b6f958 Merge branch 'main' into agent 2026-05-22 23:34:36 +02:00
Adrià Arrufat
f8d12cf4b5 schema: test parseValue with embedded single quotes 2026-05-22 22:38:48 +02:00
Adrià Arrufat
1bb506761c tools: support selector and backendNodeId in html tool
Allows dumping a specific element's outerHTML instead of the full
document when a selector or backendNodeId is provided.
2026-05-22 22:35:54 +02:00
Adrià Arrufat
2defc0e829 tools: add html tool to dump raw page HTML
Adds a new `html` tool to dump the full raw HTML of the current page.
This is useful for debugging and capturing fixtures.
2026-05-22 22:31:34 +02:00
Adrià Arrufat
056912bbee browser: add waitForScript tool
Adds a new `waitForScript` tool to wait for a JS expression to
evaluate to truthy. This allows synchronization beyond what CSS
selectors can express.
2026-05-22 22:23:50 +02:00
Adrià Arrufat
312276f968 browser: normalize keys and support form submit in press
- Map common key shorthand aliases to canonical KeyboardEvent keys.
- Trigger implicit form submission when pressing Enter on inputs.
- Add CSS selector support to the press tool.
2026-05-22 22:16:56 +02:00
Adrià Arrufat
4e69be8543 tools: add filtering options to getCookies
Allows filtering cookies by URL or dumping all cookies. Defaults to
cookies matching the current page's host.
2026-05-22 22:05:36 +02:00
Adrià Arrufat
f917a7adfc terminal: simplify print API and add printDimmed
Unifies printInfo/printInfoFmt and printError/printErrorFmt into
single functions accepting format arguments. Adds printDimmed for
dimmed output and supports highlighting quoted slash arguments.
2026-05-22 21:49:41 +02:00
Adrià Arrufat
5454f2b2c2 terminal: disable completions inside triple quotes 2026-05-22 21:15:14 +02:00
Adrià Arrufat
4d283ae21c terminal: improve colors and help formatting
- Remove automatic dimming from `printInfoFmt`
- Add explicit ANSI formatting to slash command help
- Adjust syntax highlighting colors for terminal output
2026-05-22 20:56:35 +02:00
Adrià Arrufat
005e489870 schema: make argument keys case-insensitive
Normalizes parsed keys to their canonical casing defined in the schema
for both KV and JSON inputs.
2026-05-22 20:29:45 +02:00
Adrià Arrufat
d4f4be704d repl: categorize help and centralize LLM checks
- Group `/help` output into Browser, LLM, and Meta commands.
- Only show LLM commands in help if an LLM client is configured.
- Centralize the check for commands requiring an LLM in the REPL loop.
- Add descriptions to meta and LLM commands.
2026-05-22 20:24:24 +02:00
Adrià Arrufat
0049480f04 Merge pull request #2528 from lightpanda-io/parseargs-error-detail
terminal: better error diagnostics
2026-05-22 20:10:07 +02:00
Adrià Arrufat
91916b7aae repl: sort slash commands alphabetically in help 2026-05-22 20:09:56 +02:00
Adrià Arrufat
c30ccae5fb terminal: improve log routing and navigation error reporting
- Route logs through a terminal sink to avoid trampling the spinner.
- Track and format the last navigation error in browser tools.
2026-05-22 19:58:02 +02:00
Adrià Arrufat
0219ee66b7 tools: add argument diagnostics
Validate tool arguments like `waitUntil` before parsing to provide
clearer error messages with expected enum values.
2026-05-22 19:33:53 +02:00
Adrià Arrufat
2669e3223f browser: add cooperative cancellation support
Allows SIGINT to abort in-flight browser operations and V8 execution.
2026-05-22 19:22:46 +02:00
Adrià Arrufat
aef2c1326d Merge pull request #2527 from lightpanda-io/waitforselector-notfound
tools: map waitForSelector timeout to NodeNotFound
2026-05-22 19:13:17 +02:00
Adrià Arrufat
f7a4d1f6e2 terminal: unify tool and action result printing
Replaces `printActionResult` and `printToolResult` with a single
`printToolOutcome` function. This unifies the output path and adds
red/green color coding for tool failures and successes.
2026-05-22 19:05:46 +02:00
Adrià Arrufat
db14d0be1b tools: map waitForSelector timeout to NodeNotFound
When a selector times out without matching, the outcome is the same as
/hover or /click against a missing node. Returning InternalError instead
gave inconsistent feedback to the agent.

Map error.Timeout to NodeNotFound and leave the catch-all log +
InternalError for genuinely unexpected errors. Tighten the existing
MCP - waitForSelector: timeout test to pin the specific error name.
2026-05-22 18:47:46 +02:00
Adrià Arrufat
033df65c53 Merge pull request #2526 from lightpanda-io/reset-node-registry
browser: reset node registry on navigation
2026-05-22 18:18:58 +02:00
Adrià Arrufat
3b285df432 browser: reset node registry on navigation
When an action triggers a navigation that swaps the root frame, the
previous page is torn down, leaving dangling DOMNode pointers in the
registry.

Reset the registry in `finalizeAction` if the frame changes to prevent
subsequent actions from dereferencing freed memory.
2026-05-22 17:32:17 +02:00
Adrià Arrufat
9c3d470ad2 Merge pull request #2520 from lightpanda-io/unify-pandascript-repl
script: unify PandaScript to slash commands
2026-05-22 17:05:58 +02:00
Adrià Arrufat
96c16defdd refactor: apply minor cleanups and improvements
- Add `/.lp-history` to `.gitignore`.
- Make `SlashCommand.MetaCommand.Tag` private.
- Simplify loop in `tools.zig` using `while ... else`.
- Use `trimStart` instead of `trim` in `Schema.splitNameRest`.
2026-05-22 16:38:46 +02:00
Adrià Arrufat
1309407e01 script: unify heal formatting and move TTY helpers
- Merge `formatHealReplacement` and `formatHealReplacementLines` using
  a new `HealBody` union.
- Move `interactiveTty` and `promptNumberedChoice` to `Terminal.zig`.
- Relocate and consolidate tests for `canHeal` and `isRecorded`.
- Make internal `Schema` functions private.
2026-05-22 16:19:46 +02:00
Pierre Tachoire
9619738111 Merge pull request #2517 from navidemad/makefile/download-v8
Add `make download-v8` to fetch prebuilt V8 and skip the source build
2026-05-22 15:53:48 +02:00
Adrià Arrufat
486d0d53a9 agent: inline CommandRunner and simplify Command union 2026-05-22 15:50:36 +02:00
Navid EMAD
6df1dfe238 Replace active page on synthetic root navigation (about:blank, blob:)
Page.navigate("about:blank") (and blob:) issued against a non-blank tab
routed through Session.initiateRootNavigation, which always allocated a
pending Page. A pending Page is promoted to active only by
frameHeaderDoneCallback when HTTP response headers arrive — but synthetic
navigations ZIGFLAGS= make no HTTP request, so the pending Page was never committed
and the previous document stayed active (window.location.href, document.URL
and Page.getFrameTree all kept reporting the old page).

Route synthetic URLs through the existing immediate-swap path
(replaceRootImmediate) from initiateRootNavigation, mirroring what
processRootQueuedNavigation already does for JS-initiated synthetic
navigations. replaceRootImmediate now takes (frame_id, url, opts) so both
call sites share it.

Fixes #2363
2026-05-22 15:41:15 +02:00
Adrià Arrufat
3a792c7c1c command: centralize slash command parsing and retry logic 2026-05-22 15:17:59 +02:00
Navid EMAD
47bebded55 Point download-v8 at the cache directly, drop the v8/ symlink
The prebuilt archive already lives at .lp-cache/prebuilt-v8/<version>.a;
the v8/libc_v8.a symlink was redundant indirection. build.zig has no
implicit lookup, so the Makefile passes -Dprebuilt_v8_path explicitly
anyway. Point it straight at the cached file, dropping the symlink step,
the v8/ dir, and its .gitignore entry. Keep the version-keyed filename so
bumping the V8 pin fetches a new file instead of clobbering.
2026-05-22 15:16:57 +02:00
Karl Seguin
aeba861d69 Add WebDriver getComputedLabel
Used by https://github.com/lightpanda-io/wpt/pull/68

Helps many /accname/ WPT tests pass
2026-05-22 20:16:09 +08:00
Karl Seguin
9d6dcb71ab Merge pull request #2521 from lightpanda-io/multi_remove_assert_attributes
Add more attributes to multi_remove assertion failure
2026-05-22 20:12:53 +08:00
Adrià Arrufat
8fb3c7baed tools: restructure browser tools and script schemas
- Replace `Action` enum with `Tool` enum using exhaustive switches
- Extract `ScriptIterator` to `Iterator.zig`
- Refactor `schema.zig` into `Schema.zig`
- Move string substitution logic into `tools.zig`
- Clean up `SlashCommand.zig` to only handle REPL meta-commands
2026-05-22 13:41:04 +02:00
Pierre Tachoire
8b2a79d93a Merge pull request #2515 from lightpanda-io/cdp_watchdog 2026-05-22 13:19:48 +02:00
Karl Seguin
38a4a334fd Add more attributes to multi_remove assertion failure
Saw this assertion catch for the first time today. Hoping the extra data will
help identity the issue. No URL or other identifiable data is logged.
2026-05-22 16:10:11 +08:00
Adrià Arrufat
6cd75c454e script: optimize hint allocation and inline helper
Calculate the exact size needed for hint slots in schema.zig to avoid
overallocating. Also inline the single-use helper isDefaultTrueBool in
command.zig.
2026-05-22 09:23:52 +02:00
Adrià Arrufat
fec1909aa1 script: strip backendNodeId and fix error line reporting
- Allow recording commands with backendNodeId if they also have a
  selector, stripping backendNodeId during formatting.
- Point UnterminatedQuote errors to the opening line instead of EOF.
- Fix buildHints allocation when fields is empty but required is not.
- Update docs to clarify positional argument rules.
2026-05-22 09:18:32 +02:00
Adrià Arrufat
df42d18d6d command: check required fields for null-arg tool calls
Tool calls with null arguments are now only considered recorded if the
tool schema has no required fields. This prevents generating invalid,
unreplayable commands for tools like `goto` or `fill`.
2026-05-22 09:09:19 +02:00
Karl Seguin
9621db2e5e Merge pull request #2514 from lightpanda-io/worker_performance
Performance WebAPI on Worker
2026-05-22 12:39:23 +08:00
Karl Seguin
0c9b07ab0f Add exposed option to bridge functions/accessors
While both Window and WorkerGlobalState expose the same "Performance" object,
some getters are window specific (e.g. eventCounts). I thought the same object
would always have the same shape and, when not possible, they'd be different
types (e.g. Location vs WorkerLocation). But that isn't always the case. So
.exposed = .window (or .worker, defaulting to .both) can not be defined on the
bridge mapping.
2026-05-22 11:32:37 +08:00
Karl Seguin
4b5d0109c5 Merge pull request #2513 from lightpanda-io/syncRequest_uaf
Protect against dangling pointer in syncRequest
2026-05-22 11:02:49 +08:00
Karl Seguin
05a373dccc zig fmt 2026-05-22 09:40:06 +08:00
Karl Seguin
5c20a79c08 improve comments 2026-05-22 09:38:58 +08:00
Karl Seguin
c0c1ae286f Merge pull request #2512 from lightpanda-io/about_blank_frame_visibility
Ensure about:blank frame visibility
2026-05-22 09:30:56 +08:00
Karl Seguin
f713d9561b Handle potentially unsorted frames pre-navigate 2026-05-22 08:48:52 +08:00
Karl Seguin
0f11736d3a Update src/browser/Frame.zig
Co-authored-by: Pierre Tachoire <pierre@lightpanda.io>
2026-05-22 08:39:06 +08:00
Karl Seguin
abdfd443e1 On CDP client disconnect, terminate Env
Protects against a stuck worker. This works even if the worker isn't currently
in JS but then enters JS.
2026-05-22 07:13:46 +08:00
Karl Seguin
3fc75dfe85 Revert "Add watchdog to Network thread for abandoned & stuck workers"
This reverts commit 8da7657d4c.
2026-05-22 07:09:57 +08:00
Adrià Arrufat
a3eeec0b26 agent: use global tools and simplify meta commands
- Initialize tools once globally instead of allocating per-agent.
- Refactor meta commands to use an enum for cleaner dispatch.
- Remove unused `findSchemaCanonical` and simplify command parsing.
2026-05-21 23:24:21 +02:00