- browser close now removes the Chrome profile directory after killing
the process, preventing disk accumulation from test runs
- Remove --test-threads=1 from CI — each test already uses a unique
session/profile via unique_session(), so parallel execution is safe
- Profile isolation: each test gets its own Chrome user-data-dir,
no shared state between concurrent tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add `if: github.event_name == 'push'` to e2e-tests job so E2E only runs
on merge to main/release branches. PRs only run lint and unit tests,
reducing CI time and avoiding flaky external-site dependencies in PR checks.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Only trigger on packages/cli-v2/** changes
- Simplify to lint + unit tests + E2E tests
- Remove actionbook-rs specific jobs (coverage, cargo-deny, allure)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[.github/workflows]feat: add 70% line coverage gate to UT Coverage job
Use cargo-llvm-cov --fail-under-lines 70 on the report step so CI fails
if line coverage drops below the 70% threshold.
* [packages/actionbook-rs]fix: E2E hover page-load race and session cleanup escalation
Fix two E2E blockers:
1. int_hover: add wait-for-page-load before hovering to prevent
"element 'body' not found" caused by DOM not being ready after
navigation to example.com.
2. ensure_no_sessions(): escalate to `daemon stop` after 2 failed
graceful close attempts. The daemon auto-restarts on the next CLI
command, guaranteeing a clean slate even after test panics leave
browser processes hung.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: correct CLI arg order in select/type E2E tests
Fix CLI argument bugs causing test failures and cascades:
1. int_select_dropdown: add --selector flag and put positional value
first — was passing selector as positional arg
2. int_type_text: swap text and selector args — was typing the selector
string into the wrong element
3. ensure_no_sessions: increase post-daemon-stop delay to 1s for CI
reliability
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: parse list-sessions envelope in e2e cleanup
* [root]fix: serialize E2E test execution with nextest -j 1
nextest's --test-threads=1 only limits threads within a single test
process, but nextest can still launch multiple test processes
concurrently. Since all E2E tests share a single daemon instance
(via HOME/.actionbook/), concurrent processes cause session conflicts.
Adding -j 1 ensures truly sequential execution.
Root cause identified by Dev-Codex (#t19).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: remove duplicate --test-threads flag in E2E nextest command
In nextest, -j and --test-threads are aliases. Remove --test-threads=1
since -j 1 already provides the same serialization.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: correct CLI arg formats for last 4 failing E2E tests
- int_upload: use --selector flag instead of positional for selector
- obs_inspect_point: pass x and y as separate positional args, not "x,y"
- obs_console_logs: use logs-console (single command), not logs console
- obs_error_logs: use logs-errors (single command), not logs errors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: add timing delays for last 3 E2E test failures
- obs_console_logs/obs_error_logs: add 500ms delay after eval to let
browser collect console messages before reading logs
- obs_query_nth: wait for page load (document.readyState === 'complete')
before querying DOM elements
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: add page-load waits to all E2E tests to eliminate flakiness
Add `wait condition "document.readyState === 'complete'"` after every
`browser start --open-url` across all E2E test files. This ensures the
page is fully loaded before any DOM query, eval, or browser action,
preventing intermittent failures from CI network latency.
Also increase console/error log collection delay from 500ms to 1000ms.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: eliminate E2E flakiness with about:blank and polling
Switch 4 flaky tests from example.com to about:blank to remove network
dependency. Add page-load waits after all start commands across all test
files to prevent timing issues.
- obs_eval_dom: use about:blank, set title via eval instead of reading
example.com's title
- obs_pdf_produces_file: use about:blank, inject minimal HTML for PDF
- obs_console_logs: use about:blank, poll logs-console (up to 3s)
instead of fixed sleep
- obs_error_logs: use about:blank, poll logs-errors (up to 3s)
instead of fixed sleep
- All test files: add wait condition "document.readyState === 'complete'"
after every browser start --open-url
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: add missing set_body_html_js import
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: TrustedTypes try/catch and tab_switch wait
- Wrap TrustedTypes default policy creation in try/catch to handle
edge cases where the policy check passes but creation still throws
- Add wait for page load on t1 in tab_switch_changes_active to prevent
Chrome internal URL flake
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]chore: cargo fmt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: initialize log capture before eval
* [packages/actionbook-rs]fix: update eval UT mock for log capture init
The log capture fix (2fabcaa) added an extra backend call before eval.
Update eval_returns_value mock to provide results for both the log
capture initialization call and the actual eval call.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: robust TrustedTypes handling and tab_switch goto
TrustedHTML fix:
- Replace innerHTML-based approach with setHTMLUnsafe() (Chrome 124+)
as primary method, which bypasses TrustedTypes entirely
- Fall back to TrustedTypes policy (reuse existing default or create
new one), then to document.implementation.createHTMLDocument
- Eliminates "Policy 'default' disallowed" errors in shared daemon
tab_switch fix:
- Add explicit goto after open to ensure t1 navigates to example.org
- Chrome sometimes opens internal URLs on new tab; goto forces correct
navigation before asserting URL
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: add wait for t1 load in int_fill_s1t2_isolation
Wait for page load on t1 after open to ensure the page is ready
before injecting HTML via set_body_html_js.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
[packages/actionbook-rs]ci: add cargo-audit security scan
Add security-audit CI job running cargo-audit against the RustSec
Advisory Database. Update quinn-proto (0.11.13->0.11.14) and
rustls-webpki (0.103.9->0.103.10) to resolve RUSTSEC-2026-0037
and RUSTSEC-2026-0049. Integrate audit status into test-summary.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
[root]fix: enable E2E and macOS unit tests on pull requests
Remove `if: github.event_name == 'push'` from e2e-tests and
unit-tests-macos jobs so they run on both push and pull_request
events. Previously these jobs were skipped on PRs, meaning test
failures were only caught after merge.
Allure report job remains push-only since it deploys to gh-pages.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
[packages/actionbook-rs]ci: add cargo-deny for license and vulnerability scanning
Add deny.toml with allowed licenses (MIT, Apache-2.0, BSD, ISC, MPL-2.0,
CDLA-Permissive-2.0, Unicode, OpenSSL, Zlib) and advisory ignore for
unmaintained number_prefix (via indicatif). Add cargo-deny CI job to
test workflow with summary integration. Update rustls-webpki to fix
RUSTSEC-2026-0049.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [root]feat: add cargo-machete CI check for unused dependency detection
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: handle cargo-machete false positives for anyhow and tower
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [root]feat: add clippy + fmt lint check to CI
Add a new Lint job that runs cargo fmt --check and cargo clippy -D warnings
as a code quality gate. Lint status is included in test summary.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: format all code and fix clippy warnings
- Run cargo fmt --all to enforce consistent formatting
- Fix clippy warnings: use clamp(), if-let, contains_key, unwrap_or_default
- Add targeted #[allow] for structural patterns (too_many_arguments,
large_enum_variant, result_large_err, never_loop)
- CI clippy config: -D warnings with -A dead_code/unused-imports/deprecated
to allow TDD-style development while catching real quality issues
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: remove dead depth_cache allocation in benchmark
Remove unused HashMap allocation that was silenced with _ prefix.
Addresses review feedback on PR #261.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Replace manual actions/cache with Swatinem/rust-cache@v2 for both
unit-tests and e2e-tests jobs. Swatinem/rust-cache auto-detects
Cargo.lock, caches target dir and registry, and handles cache
invalidation — simpler config and 50-70% build speedup on cache hits.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
PR events now only run Unit Tests (fast feedback for developers).
Push events to main/release/** run the full suite: Unit Tests + E2E +
Test Summary + Allure Report.
This follows the agent-browser pattern where PRs get lightweight checks
and push triggers comprehensive verification.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add a macOS runner job that runs unit tests on push events only
(cross-platform testing is expensive, skip on PRs). Results are
included in the test summary with skip/pass/fail status.
Follows agent-browser's pattern of cross-platform testing on push.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [root]feat: integrate Allure Report with GitHub Pages deployment
Add Allure Report job to CI pipeline:
- Downloads JUnit XML artifacts from UT and E2E jobs
- Generates interactive HTML report with Allure
- Preserves history across runs for trend charts (up to 20 reports)
- Deploys to GitHub Pages on push events (not PRs)
- Adds report URL to GitHub Actions summary
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: replace deprecated Docker-based Allure action with direct CLI
simple-elf/allure-report-action uses openjdk:8-jre-alpine which was
removed from Docker Hub. Switch to installing Allure CLI directly
via tarball + setup-java. Also add report artifact upload for
preview before GitHub Pages is configured.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: use find for JUnit XML paths and add job timeout
download-artifact preserves the upload directory structure, so
junit.xml is nested deeper than expected. Use find to locate
files regardless of nesting. Add 5-min timeout to allure-report job.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]feat: deploy Allure report to /test-report/ subpath
Deploy to destination_dir: test-report so the Pages root is
available for other content in the future.
Report URL: https://actionbook.github.io/actionbook/test-report/
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: correct Allure history path for /test-report/ subdir
History is deployed under gh-pages/test-report/, not gh-pages/.
Without this fix, trend charts would never populate.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]feat: switch Allure report to artifact-only (no GitHub Pages)
Per mcfeng's preference, remove GitHub Pages deployment and use
CI artifact download instead. Simpler setup, no gh-pages branch
needed. Report available as downloadable artifact with 30-day
retention.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]feat: switch from Allure to xunit-viewer for test report
Allure reports require HTTP server to view (JavaScript CORS
restriction with file:// protocol). Switch to xunit-viewer which
generates a self-contained single HTML file that works when
opened directly in browser — no server needed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]feat: switch back to Allure Report with GitHub Pages deployment
mcfeng prefers Allure's UI over xunit-viewer. Allure requires HTTP
to work, so deploy to GitHub Pages at /test-report/ subpath.
Report URL: https://actionbook.github.io/actionbook/test-report/
Includes history preservation for trend charts across runs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [root]feat: comprehensive CI/CD with UT, E2E, and test reports
Rewrote test.yml to include:
- Unit tests job: lib tests (245), CLI integration tests (131), CDP parsing tests
- E2E tests job: browser tests with headless Chrome
- Test summary job: aggregates results with pass/fail table
- JUnit XML reports via cargo2junit + mikepenz/action-junit-report
- Test artifacts uploaded for debugging
- Parallel execution: UT and E2E jobs run concurrently
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: switch CI from cargo2junit to cargo-nextest for test reports
cargo2junit requires nightly-only --format json flag, which fails on
stable Rust. Switched to cargo-nextest which natively supports JUnit
XML output on stable via profile config.
Changes:
- Replace cargo2junit with cargo-nextest (taiki-e/install-action)
- Add .config/nextest.toml with ci profile for JUnit output
- Simplify test steps using nextest's built-in reporting
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: remove duplicate test run in CI, consolidate into single step
Removed the redundant "Generate JUnit report" step that re-ran all tests.
Consolidated lib + cli_test + cdp_message_parsing into a single nextest
run, which generates junit.xml in one pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]feat: add detailed test summary with test counts from JUnit XML
Each job now writes a summary table to GITHUB_STEP_SUMMARY with test
counts (total, passed, failed, errors, time) parsed from JUnit XML.
Test Summary job also shows aggregated results with counts per suite.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: stop_bridge SIGTERM self-kill and CI exit code masking
1. stop_bridge no longer kills unverified processes found via lsof
fallback — prevents the test from SIGTERMing itself when no PID
file exists.
2. Add `set -o pipefail` to CI test steps so `| tee` does not
swallow non-zero exit codes from cargo-nextest.
3. Set nextest CI profile to fail-fast=false for complete JUnit XML.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Actionbook <actionbook@Junliangs-MacBook-Air.local>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]feat: add E2E test framework with browser_basic tests
New E2E test infrastructure:
- tests/e2e/main.rs: single binary entry point (avoids per-file link overhead)
- tests/e2e/harness.rs: shared env isolation, CLI runners, assertions
- tests/e2e/browser_basic.rs: 4 tests (open/goto arxiv.org/snapshot/close)
- .github/workflows/test.yml: CI workflow (Ubuntu + headless Chrome)
Gated by RUN_E2E_TESTS=true, run with --test-threads=1.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: address review feedback on E2E tests
1. Remove unnecessary `unsafe impl Sync for IsolatedEnv` — all fields
already implement Sync automatically.
2. Merge 4 sequential browser_basic tests into a single test function
to guarantee execution order (Rust does not guarantee test ordering).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]fix: fix E2E harness HOME override breaking Chrome CDP
On macOS, overriding HOME causes Chrome to fail to bind its CDP port.
Changed harness to only override XDG_CONFIG_HOME and XDG_DATA_HOME for
actionbook config isolation, and added --no-daemon flag to avoid daemon
process env inheritance issues.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Actionbook <actionbook@Junliangs-MacBook-Air.local>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add version comparison before npm publish for platform packages and
CLI main package, matching the existing pattern in publish-js job.
Prevents 403 "cannot publish over previously published versions" on rerun.
- Add discord-release-notify.yml workflow triggered on GitHub Release events
- CLI releases: green embed with install instructions (macOS/Linux, Windows, npm)
- Extension releases: blue embed
- Dify Plugin releases: purple embed
- Cleans PR attribution links and Full Changelog from release body
- Truncates to Discord 4096 char embed limit
- Add npm publish Discord notification step to release.yml publish-js job
- Orange embed listing all published packages with versions
- Only fires when packages are actually published
npm publish does not resolve workspace:* dependencies, causing
@actionbookdev/openclaw-plugin to ship with unresolvable deps on npm.
Switch to pnpm publish --no-git-checks which auto-resolves workspace
references to actual version numbers.
The linux-x64 binary was built on ubuntu-latest (Ubuntu 24.04, glibc 2.39),
causing "GLIBC_2.39 not found" errors on Debian 12 (glibc 2.36) and other
older but still-supported distributions.
Pin the runner to ubuntu-22.04 (glibc 2.35) to support Debian 12+ and
Ubuntu 22.04+.
* ci(release): use uv tool run for dify packaging
* ci(release): add workflow_dispatch dry-run path for dify release validation
* ci(release): install official dify cli before packaging
* ci(release): create dist directory before dify packaging
* ci(release): keep only dify packaging fix and drop debug flow
* [packages/dify-plugin]feat: add Dify plugin for browser automation
- Implement search_actions and get_action_by_area_id tools
- Support API key authentication via Dify plugin SDK
- Add comprehensive tests (34 tests, 99% coverage)
- Add documentation (README, PRIVACY)
- Phase 1: Query action manuals via API
Tools:
- search_actions: Find website elements by keyword/domain filter
- get_action_by_area_id: Get complete selector details by area ID
Testing:
- Unit tests: provider, search_actions, get_action_by_area_id
- Coverage: 99% (412 statements, 3 missed)
- Linting: ruff with zero errors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/dify-plugin]fix: align SDK interface, fix API issues and improve reliability
- Fix API endpoint and parameter alignment with Actionbook API
- Align with Dify SDK interface (provider structure, tool signatures)
- Restructure provider: replace provider.yaml with provider/ package
- Add test infrastructure: unit tests, integration tests, E2E checklist
- Improve error handling and remove legacy provider.yaml
- Resolve empty response issue in Dify Cloud
- Pin dify-plugin>=0.5.1,<0.6.0 to prevent breaking changes
- Add *.difypkg, .coverage, .alma-snapshots to root .gitignore
* [packages/dify-plugin]fix: address code review issues in source code
- C4: Add insecure CDP URL warning for non-localhost ws:// connections
- C5: Replace print(stderr) with proper logger in search/get tools
- C6: Re-raise exception after logging in HyperbrowserSession.stop()
- W8: Make API_BASE_URL configurable via ACTIONBOOK_API_URL env var
- W-limit: Fix float limit validation with int() cast
- W-except: Narrow bare Exception to PlaywrightTimeout in operator
- W-use_proxy: Fix bool comparison for string/bool/whitespace inputs
- W7: Document _get_active_page tab selection behavior
- Fix type annotation in providers/__init__.py
- Update misleading comment in provider/actionbook.py
- Add cleanup warning in browser_create_session.yaml
* [packages/dify-plugin]fix: correct integration tests to match tool behavior
Tools yield error messages instead of raising exceptions.
Fix tests that incorrectly used pytest.raises(ValueError) to
instead assert on the returned message content.
* [packages/dify-plugin]test: add missing unit tests for improved coverage
- New test_browser_stop_session.py (6 tests)
- Add HTTP 403, SSL/connection error branch tests for search/get tools
- Add use_proxy edge cases and default provider tests
- Add malformed cdp_url test for browser operator
- Add insecure CDP URL warning tests
- Update operator tests for PlaywrightTimeout narrowing
- Add provider re-raise test
184 tests pass at 86% coverage.
* [packages/dify-plugin]test: add E2E browser tests with Hyperbrowser
- Add verify_hyperbrowser.py manual verification script
- Add 8 E2E tests: tool wrappers (create/stop/navigate/screenshot)
and Playwright direct (multi-step, form fill, nav history, HTML)
- Add retry logic for intermittent gevent SSL errors
- Add tenacity to dev dependencies
Run: HYPERBROWSER_API_KEY=hb-xxx uv run pytest -m e2e -v --timeout=120 --no-cov
* [packages/dify-plugin]feat: add connection pool, playwright worker and API key resolver
- api_key.py: resolve provider key from params or env vars with placeholder filtering
- connection_pool.py: in-process pool of browser workers keyed by session_id,
using subprocess-based Playwright workers to avoid asyncio conflicts
- playwright_worker.py: standalone Playwright worker process supporting
CSS, XPath, and snapshot ref selectors (@eN / [ref=eN])
* [packages/dify-plugin]refactor: simplify cdp_client to URL validation only
Remove CDP connection logic (cdp_page, _get_active_page, CdpConnectionError)
since connections are now managed by the connection pool and playwright worker.
Retain only validate_cdp_url for input validation.
* [packages/dify-plugin]feat: add snapshot action, connection pool integration and improved error handling
browser_operator:
- Add snapshot action with accessibility tree (ported from actionbook-rs)
- Replace cdp_page with connection pool for persistent sessions
- Add SSRF protection for CDP URLs
- Improve click/type/fill error messages with recovery hints
- Remove screenshot action in favor of snapshot
browser_create_session:
- Integrate connection pool (pre-connect on session create)
- Add profile_id fallback retry logic
- Support API key from env vars via resolve_provider_api_key
- Validate provider name against SUPPORTED_PROVIDERS
browser_stop_session:
- Disconnect pooled connection before stopping provider session
- Improved error messages with troubleshooting hints
hyperbrowser provider:
- Add profile_id UUID normalization (uuid5 for non-UUID inputs)
actionbook provider:
- Add API health check in _validate_credentials
* [packages/dify-plugin]fix: improve search/get_action tools with validation and fallback hints
- Add area_id character validation regex to prevent injection
- Add snapshot fallback guidance in tool descriptions
- Reduce debug log verbosity (avoid logging raw parameters)
* [packages/dify-plugin]docs: update README workflow guide, manifest version and difyignore
- README: add snapshot-based recovery workflow and troubleshooting section
- manifest: set version to 0.1.0 (initial release)
- difyignore: add scripts/, dist/, .docs/, .DS_Store exclusions
* [packages/dify-plugin]chore: remove verify_hyperbrowser script
No longer needed — verification is covered by E2E tests.
* [packages/dify-plugin]test: update tests for connection pool, snapshot and improved tools
- Add test_connection_pool.py: pool connect/disconnect/execute lifecycle
- Add test_playwright_worker.py: worker process smoke test
- Add test_workflow_snapshot_recovery.py: snapshot-based selector recovery
- Update browser_operator tests for snapshot action and error handling
- Update browser_create/stop session tests for pool integration
- Update cdp_client tests (simplified to URL validation only)
- Update provider/search/get_action tests for new validation logic
- Replace screenshot references with snapshot in E2E tests
* [packages/dify-plugin]refactor: cache provider info in connection pool so stop_session auto-resolves credentials
browser_stop_session no longer requires provider/api_key params — they are
looked up from the pool via get_session_info(). api_key field in
browser_create_session changed to secret-input with form-level input.
* [packages/dify-plugin]docs: update README with browser tools and remove unused import
- Add documentation for browser_create_session, browser_stop_session,
browser_operator tools
- Update features list and use cases to reflect browser automation
- Remove outdated Phase 2 roadmap (already implemented)
- Fix provider names (Hyperbrowser/Steel.dev, not Browserbase)
- Note that browser_stop_session auto-resolves provider/api_key
- Remove unused SUPPORTED_PROVIDERS import from browser_stop_session.py
* [packages/dify-plugin]fix: correct YAML descriptions and add zh_Hans translations
- Fix browser_create_session llm_description referencing non-existent
tool names (browser_navigate → browser_operator)
- Remove Steel.dev mention from descriptions (not yet available)
- Update manifest description to reflect browser automation capabilities
- Add proper zh_Hans translations for search_actions, get_action_by_area_id,
manifest and provider YAML files
* [packages/dify-plugin]fix: address CodeQL URL sanitization and logging findings
* [packages/dify-plugin]fix: remove dynamic data from error logs
* [packages/dify-plugin]feat: add tag-based release workflow and version sync
Add automated dify-plugin release pipeline:
- release.yml: tag detection (actionbook-dify-plugin-v{VERSION}) and
release job that packages .difypkg via uv + creates GitHub Release
- sync-versions.js: sync package.json version to manifest.yaml (root +
meta.version) and pyproject.toml with exact equality checks and
fail-loud on missing fields
* [packages/dify-plugin]fix: handle stop/create session failure recovery
* [packages/dify-plugin]fix: resolve critical review findings — deadlock, exception safety, timeout handling
- Fix connection pool deadlock: move worker.stop() outside pool lock to
prevent deadlock when _io_lock is held by another thread in call()/readline().
All call sites (disconnect, disconnect_all, cleanup_stale, connect eviction,
get_page health check) now pop under lock and stop outside lock.
- Fix BaseException swallowing: re-raise KeyboardInterrupt, SystemExit, and
GeneratorExit in search_actions and get_action_by_area_id generators.
Only non-Exception BaseException subclasses (e.g. gevent.Timeout) are caught.
- Fix timeout exception misclassification: add WorkerTimeoutError exception
class. SubprocessWorker.call() now detects timeout errors in worker responses
and raises WorkerTimeoutError instead of RuntimeError, so browser_operator
handlers can show proper "element not found" hints instead of generic errors.
- Document SSRF DNS rebinding TOCTOU limitation in _is_ssrf_target with
explanation of cloud browser architecture mitigation.
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [root]chore: add changeset for CLI patch to test release workflow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: align CLI and platform package versions to npm (0.7.2)
Local versions were 0.3.1 while npm had 0.7.2 (CI used to overwrite
versions at publish time without committing back). Align to 0.7.2 so
changeset can manage versions going forward.
Also revert pnpm-workspace.yaml to keep platform packages in workspace
(avoids npm resolution failures) and let them pass changeset validation
by not being in the ignore list.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: add CHANGELOG.md to platform packages for changesets/action
changesets/action reads CHANGELOG.md of all modified packages when
composing the Version PR. Platform packages are modified by
sync-versions.js but lacked CHANGELOG.md files, causing ENOENT.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: update lockfile after sync-versions to prevent frozen-lockfile failure
sync-versions.js rewrites CLI optionalDependencies versions, making
the lockfile stale. Add pnpm install after sync to keep it in sync.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: use workspace:* for CLI platform deps to avoid lockfile staleness
- CLI optionalDependencies changed from exact versions to workspace:*
so pnpm resolves locally instead of from npm registry
- Remove optionalDependencies sync from sync-versions.js (no longer needed)
- Add workspace:* → actual version replacement step in publish-cli job
before npm publish
- Remove pnpm install from version-packages (lockfile stays stable with
workspace links)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: add workflow permissions and restrict changeset scope
- Add contents:write and pull-requests:write permissions to release
workflow so changesets/action can create PRs and push commits
- Expand ignore list to exclude all non-releasable packages (services,
playground) to prevent accidental npm publishes
- Add build:release script that only builds changeset-managed packages
to avoid CI failures from unrelated build errors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]feat: unify CLI & extension releases under changeset workflow
Replace 3 separate release flows (changesets for JS, tag-triggered for
CLI, tag-triggered for extension) with a single unified workflow driven
by Version PRs.
- Add scripts/sync-versions.js to sync CLI version to platform packages
and extension version to manifest.json after changeset version
- Rewrite release.yml with 5 conditional jobs: version-or-release,
publish-js, build-cli, publish-cli, release-extension
- Remove platform binary packages from pnpm workspace (pure containers)
- Enable privatePackages versioning for extension in changeset config
- Delete release-cli.yml and release-extension.yml
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]chore: ignore json-ui-site and knowledge-builder-any in changesets
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Set up @changesets/cli with GitHub changelog integration for managing
versioning and npm publishing of SDK, MCP, tools-ai-sdk, and json-ui
packages. CLI and extension packages are excluded as they have their
own release workflows.
- Install @changesets/cli and @changesets/changelog-github
- Add .changeset/config.json with public access and ignore rules
- Add changeset, version-packages, and release scripts
- Add GitHub Actions workflow for automated release PR and publishing
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Add CWS build variant that strips the `key` field from manifest.json
- Update release workflow to produce both sideloading and CWS zips
- Bump extension version to 0.1.2
* [packages/actionbook-extension]feat: add independent release infrastructure
- Add GitHub Actions workflow for tag-triggered releases (actionbook-extension-v*)
- Add package.json with npm run package script for local zip packaging
- Add scripts/package.js to build distributable .zip from extension files
- Add .gitignore for dist/ and node_modules/
- Rewrite README with install/release/troubleshooting docs
The extension now has its own independent release cycle via GitHub Releases,
decoupled from the CLI binary release process.
* [packages/actionbook-rs]refactor: replace embedded extension with GitHub download installer
Remove all include_str!/include_bytes! compile-time embedding of the Chrome
extension. The CLI now downloads the extension from GitHub Releases at install
time via `actionbook extension install`.
Key changes:
- Rename embedded_extension.rs → extension_installer.rs
- Add download_and_install() using reqwest with HTTPS-only, timeouts
- Add extract_zip() with zip-slip and zip-bomb protection
- Add download URL host validation (github.com whitelist)
- Add post-extraction manifest version verification
- Use semver crate for proper version comparison
- Add zip crate dependency for safe extraction
- Update extension command to use new installer module
Security measures:
- HTTPS-only with 30s request / 10s connect timeouts
- 10MB max download size, 50MB max uncompressed size
- Zip-slip protection via enclosed_name()
- Download host whitelist (github.com, githubusercontent.com)
- Manifest version verification after extraction
* [packages/actionbook-rs]fix: atomic install, better error display, and real zip test
- Display errors with thiserror format instead of Rust Debug
("Extension error: ..." not "ExtensionError("...")")
- Atomic install: extract to temp dir, verify manifest, then swap
(existing install survives if download/extract fails)
- Move tempfile from dev-dependencies to dependencies
- Add test_extract_real_extension_zip using actual packaged zip
* [packages/actionbook-rs,actionbook-extension]fix: address review findings from dual review
- Remove early return in install command that blocked automatic upgrades;
let download_and_install() handle semver comparison via new
ExtensionAlreadyUpToDate error variant
- Remove redundant zip -j9 call in package.js, keep only zip -r9
- Add pagination NOTE on fetch_latest_release()
- Make test_extract_real_extension_zip read version from manifest.json
dynamically instead of hardcoding "0.2.0"
cross mounts only the cwd into Docker. By running from the repo root
with --manifest-path, the sibling actionbook-extension directory
becomes accessible for include_str!() at compile time.