mirror of
https://github.com/actionbook/actionbook.git
synced 2026-09-19 03:28:06 +08:00
main
7 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
58545129de |
[root]refactor: remove actionbook-rs, promote cli-v2 to packages/cli
- Delete packages/actionbook-rs/ (legacy 0.x CLI) - Delete old packages/cli/ (JS npm wrapper for 0.x) - Rename packages/cli-v2/ → packages/cli/ (git mv) - Merge npm wrapper files (bin/actionbook.js, scripts/postinstall.js) into new cli/ - Update package.json: name → @actionbookdev/cli, private → false, add npm distribution fields - Update sync-versions.js: point Cargo.toml/Cargo.lock sync at packages/cli/ - Update release.yml: build from packages/cli/ instead of packages/actionbook-rs/ - Update test.yml: paths and working-directory from cli-v2 → cli - Update CLAUDE.md, CONTRIBUTING.md, docs, issue templates - Delete stale changeset (fix-screenshot-timeout.md) - Keep 6 platform binary packages unchanged |
||
|
|
fcb4b248be |
[root]fix: keep Cargo.lock in sync with CLI Rust version
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
aea805b320 |
[root]fix: sync CLI Rust version and bump to v0.8.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
2db938d519 |
feat(dify-plugin): v0.1.1 HTTP API migration and serverless hardening (#162)
* chore: align dify plugin manifest and privacy policy * [packages/dify-plugin]refactor: replace hyperbrowser SDK with direct HTTP API Remove hyperbrowser Python SDK dependency and use requests to call Hyperbrowser REST API directly. This eliminates an extra dependency that may not install cleanly in Dify Cloud's serverless runtime. - providers/hyperbrowser.py: HTTP POST/PUT instead of SDK client - pyproject.toml: drop hyperbrowser>=0.1.0 dependency - requirements.txt: add explicit requirements file - tests/test_providers.py: mock requests instead of SDK classes * [packages/dify-plugin]feat: add HTML misroute guard and simplify tool error handling Add utils/http_guard.py to detect when API responses return HTML instead of expected text/JSON — a common symptom of ACTIONBOOK_API_URL pointing to a non-Actionbook endpoint (e.g. Dify app API). - Integrate HTML guard into search_actions, get_action_by_area_id, provider - Simplify verbose error branches into concise messages - Remove debug-level logging from hot paths - Update all related tests with Content-Type headers and new assertions * [packages/dify-plugin]refactor: lazy-load browser deps for serverless compatibility Defer importing playwright and connection_pool until first browser tool invocation. This allows search_actions and get_action_by_area_id to work even when playwright binaries are unavailable (e.g. Dify Cloud serverless runtime). - tools/__init__.py: lazy __getattr__ for browser tool classes - browser_create_session.py: thread-safe lazy pool import - browser_operator.py: lazy import with stub exception fallbacks * [packages/dify-plugin]fix: review fixes — dead code, lazy import, session recovery - Remove unreachable except BaseException blocks in search_actions and get_action_by_area_id (dead code: only re-raised what it caught) - Apply lazy connection_pool import in browser_stop_session, matching browser_create_session and browser_operator pattern for serverless - Preserve provider_name/api_key on session recovery reconnect to prevent remote session leaks when browser_stop_session runs later - Update tests accordingly * [root]chore: use changeset for dify-plugin version bump Revert manual 0.1.1 bump back to 0.1.0 and add a changeset file so CI handles versioning through the standard two-phase flow. Also extend sync-versions.js to run `uv lock` after updating pyproject.toml to keep uv.lock in sync automatically. |
||
|
|
93caf967e0 |
[New Package] Dify Plugin - Browser Automation Manuals (#86)
* [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> |
||
|
|
fef4152fb7 |
fix: add CHANGELOG.md to platform packages (#137)
* [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> |
||
|
|
7cc6a13383 |
feat: unify CLI & extension releases under changeset workflow (#134)
* [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> |