Commit Graph

7127 Commits

Author SHA1 Message Date
Adrià Arrufat
b35691bc2f script: unwrap only __root sentinel in extract
Only unwrap the `__root` sentinel injected for array schemas, ensuring
single-field object schemas retain their shape. Also update synthesis
prompt instructions for modern JS and tool fidelity.
2026-06-04 09:45:54 +02:00
Adrià Arrufat
b29f68ce82 build: bump zenai dependency 2026-06-04 08:34:32 +02:00
Adrià Arrufat
f7c2e0b886 Merge branch 'main' into agent 2026-06-04 08:34:10 +02:00
Karl Seguin
ccd201a085 Merge pull request #2602 from lightpanda-io/wait_script_cache
Add Script cache to Runner.waitForScript
2026-06-04 13:21:05 +08:00
Karl Seguin
80bf294e1c update v8 dep 2026-06-04 12:49:51 +08:00
Karl Seguin
6a0855bb41 Add Script cache to Runner.waitForScript
This adds script compilation to the Runner.waitForScript loop. The goal here
isn't really to improve waitForScript - we generally expect these scripts to
be very simple. The goal is to introduce script caching so that it could be
used in more important places (e.g. ScriptManager).

Depends on https://github.com/lightpanda-io/zig-v8-fork/pull/181
2026-06-04 12:49:51 +08:00
Karl Seguin
4426b91588 Merge pull request #2630 from rohitsux/feat/node-lookup-prefix
feat(webapi): implement Node.lookupPrefix
2026-06-04 08:26:37 +08:00
Karl Seguin
cfc3fe1443 Merge pull request #2629 from lightpanda-io/cdp-cookie-path
Cookie.PreparedUri: Use only URL.getPathname for target url
2026-06-04 07:01:18 +08:00
Adrià Arrufat
4bdc7862be browser: warn against top-level await in prompt
Updates the synthesis prompt to explicitly state that the output is
executed as a classic script, making top-level `await` a syntax error.
2026-06-03 20:14:24 +02:00
Adrià Arrufat
d06bf747f4 agent: clarify synchronous nature of primitives
Update agent.md and the LLM synthesis prompt to explicitly state
that agent primitives are synchronous and blocking, and should not
use async/await or Promises.
2026-06-03 20:11:55 +02:00
Adrià Arrufat
fded77b3a8 terminal: implement responsive status bar segments
Replaces static left/right status strings with ranked segments.
When the terminal is too narrow, segments are dropped lowest-rank
first to prevent wrapping and layout corruption.
2026-06-03 20:03:11 +02:00
Adrià Arrufat
3514a59236 extract: remove follow option from schema 2026-06-03 19:34:32 +02:00
Adrià Arrufat
585ab9f766 agent: update repl evaluation error message 2026-06-03 17:33:55 +02:00
Rohit
e830d1da4e feat(webapi): implement Node.lookupPrefix
Implement the Node.lookupPrefix(namespace) method per the WHATWG DOM
"locate a namespace prefix" algorithm: match the element's own
namespace and prefix, then scan its xmlns: attribute declarations for
one whose value is the namespace, then recurse to the parent element.

This is the inverse of the existing lookupNamespaceURI and completes
the namespace-introspection trio alongside isDefaultNamespace.
2026-06-03 21:03:27 +05:30
Adrià Arrufat
5dd37af123 tools: rename eval tool to evaluate 2026-06-03 17:30:25 +02:00
Adrià Arrufat
1f85cdf31c Terminal: enable path completions for /save
Enables filesystem path completions and ghost hints for the `/save`
command, matching the behavior of `/load`.
2026-06-03 17:19:12 +02:00
Adrià Arrufat
560897ea89 agent: clean up save mode and terminal prompts
- Use `std.meta.fieldNames` for the save mode prompt.
- Update terminal prompt functions to accept null-terminated strings.
- Respect the resolved save mode in `synthesizeSave`.
2026-06-03 17:13:52 +02:00
Pierre Tachoire
a0ecf9cb7c cookies: use an init for Cookie.PreparedUri 2026-06-03 16:48:55 +02:00
Adrià Arrufat
efb0041c83 Merge pull request #2628 from lightpanda-io/agent-replace-interactive-load
agent: replace -i flag with /save and /load commands
2026-06-03 16:43:54 +02:00
Pierre Tachoire
00a91c7dac cdp: fix network.getCookies url build
When getting cookies from CDP, we musn't apply specific cookies's
path/host extraction for the target URL, but use the simple URL rules.
2026-06-03 16:37:03 +02:00
Adrià Arrufat
ac82551e66 agent: replace -i flag with /save and /load commands
Removes the `-i`/`--interactive` CLI flag and live file-based
recording. Instead, the REPL now supports a `/load <path>` command
to run scripts from disk, and `/save` to export the in-memory
session recording.

The `Recorder` is simplified to be purely in-memory, and the script
runtime is moved to `src/script/Runtime.zig`.

BREAKING CHANGE: The `-i`/`--interactive` flag has been removed. Use
the `/save` and `/load` commands within the REPL instead.
2026-06-03 16:21:10 +02:00
Adrià Arrufat
6bb912716d Merge pull request #2627 from lightpanda-io/agent-repl-improvements
repl: add dynamic status bar
2026-06-03 15:44:26 +02:00
Adrià Arrufat
e208b4b638 repl: add dynamic status bar
Integrates isocline's top and bottom bar APIs to display the active
provider, model, and shortcut hints. Updates the status bar on
terminal resize and mode switches.
2026-06-03 15:09:09 +02:00
Karl Seguin
720e610542 Merge pull request #2625 from lightpanda-io/deferring_layer_error_handling
DeferringLayer correctly handle header stop/errors
2026-06-03 20:57:36 +08:00
Karl Seguin
96548fd8e5 Merge pull request #2624 from lightpanda-io/deferring_layer_fixes
Fix two issues with DeferringLayer
2026-06-03 18:41:44 +08:00
Karl Seguin
205865f96c DeferringLayer correctly handle header stop/errors
When forwardHeader signals not to proceed, fire() should stop.

This is the direct fix to https://github.com/lightpanda-io/browser/issues/2622
2026-06-03 18:13:32 +08:00
Karl Seguin
20555150dd Fix two issues with DeferringLayer
The first is that it can outlive the Transfer and thus has to dupe anything
it'll use (e.g. the frame_id off the request).

The second is that flushFrame is reentrant (flushFrame -> fire -> flushFrame)
and that results in the active list and list pointers becoming invalid.
2026-06-03 17:31:40 +08:00
Adrià Arrufat
8f9175104d agent: enforce recorded tool marshalling at compile time 2026-06-03 10:15:02 +02:00
Adrià Arrufat
393d26cd11 Merge branch 'main' into agent 2026-06-03 10:09:33 +02:00
Adrià Arrufat
df4fb046cd ScriptRuntime: replace Primitive enum with BrowserTool
Removes the redundant `Primitive` enum and uses `BrowserTool` directly,
filtering by `isRecorded()`. This reduces duplication and simplifies
the mapping between JS primitives and browser tools.
2026-06-03 10:09:16 +02:00
Adrià Arrufat
4139252feb mcp: replace recording and healing tools with save
Removes recordStart, recordStop, recordComment, scriptStep, and
scriptHeal MCP tools. Introduces a single 'save' tool that lets
the client synthesize and persist the script directly.
2026-06-03 10:01:38 +02:00
Karl Seguin
85d5e47ffc Merge pull request #2620 from lightpanda-io/better_css_name_parser
Better CSS name selector parser
2026-06-03 15:58:40 +08:00
Karl Seguin
5977242429 Merge pull request #2619 from lightpanda-io/redirect_url_lifetime
On redirect, ensure transfer owns the new url
2026-06-03 15:58:28 +08:00
Karl Seguin
bfad022452 Merge pull request #2618 from lightpanda-io/wait_until_networkalmostidle
Add "networkalmostidle" to --wait-until parameter
2026-06-03 15:58:15 +08:00
Karl Seguin
144e4b1191 Merge pull request #2616 from lightpanda-io/worker_module
Support for "module" type workers.
2026-06-03 15:58:01 +08:00
Karl Seguin
7a54da3c1c Merge pull request #2615 from lightpanda-io/ClientDisconnected_nolog
Don't overlog ClientDisconnected
2026-06-03 15:57:46 +08:00
Karl Seguin
0715bb067c Merge pull request #2614 from lightpanda-io/find_frame_popups
page.findFrame searches popups too
2026-06-03 15:57:29 +08:00
Karl Seguin
3b3ec6c1b0 Merge pull request #2612 from lightpanda-io/intercept_count
Improve / fix InterceptLayer.intercepted count tracking
2026-06-03 15:57:15 +08:00
Adrià Arrufat
5f72a15355 style: clean up comments and convert to doc comments 2026-06-03 09:43:43 +02:00
Adrià Arrufat
eaedc94453 agent: stop forcing external stylesheets for LLM 2026-06-03 09:27:56 +02:00
Adrià Arrufat
ee498feb48 agent: expand and highlight env vars in JS mode 2026-06-03 08:58:47 +02:00
Karl Seguin
841543bab0 Merge pull request #2613 from rohitsux/feat/html-embed-reflection
feat(webapi): reflect src, type, width and height on HTMLEmbedElement
2026-06-03 14:57:27 +08:00
Adrià Arrufat
db385cf4db agent: optimize autocomplete and cache providers 2026-06-03 08:52:25 +02:00
Karl Seguin
50186cb328 Merge pull request #2617 from lightpanda-io/http_proxy_liftime
HttpClient dupes CDP-supplied proxy to ensure lifetime
2026-06-03 14:41:04 +08:00
Adrià Arrufat
4ff4da2ede Merge branch 'main' into agent 2026-06-03 08:35:33 +02:00
Karl Seguin
7bb83ed823 Better CSS name selector parser
Applies the same/similar escaping logic as is already applied to identifiers
and values. Importantly, this allows matching for attribute names with a colon,
e.g. "ng:jq" which can be selected with "ng\:jq".

This fixes real issues with rendering Angular 1.x.
2026-06-03 13:10:34 +08:00
Karl Seguin
97b1dae12a On redirect, ensure transfer owns the new url 2026-06-03 12:05:09 +08:00
Karl Seguin
3ff503bb8b Add "networkalmostidle" to --wait-until parameter
Just config hookup, as the `Frame._notified_network_almost_idle` already exists
(and is used by CDP).
2026-06-03 11:50:48 +08:00
Karl Seguin
244bfbdd27 HttpClient dupes CDP-supplied proxy to ensure lifetime
I'm hoping this is the cause of our flaky CI runs. The existing code kept
a reference to the CDD command-owned proxy address. This commit has HttpClient
dupe/own the proxy to ensure the correct lifetime.
2026-06-03 11:37:52 +08:00
Karl Seguin
2fc9d61070 Support for "module" type workers.
Pretty basic, worker started with the {type: 'module'} option has 2 practical
differences:
1 - importScript isn't allowed (TypeError)
2 - the initial script is loaded as a module

Seen in various WPT tests, but also saw this usage on mastodon.
2026-06-03 11:06:24 +08:00