Conversation
…dError Offline mode now activates when no daemon is running and no API key is set — calls succeed with an audit log entry instead of raising DaemonNotFoundError. Update the e2e test to assert the new behavior. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Resolve README.md merge conflict - NODE9_SKIP=1 now emits a warning and writes an audit entry (no silent bypass) - configure() is now thread-safe via threading.Lock - DLP scan covers all string args, not just params named filename/content - _dispatch() renamed to dispatch() — public API should not have underscore (_dispatch kept as deprecated alias with DeprecationWarning) - workspace validated at __init__ time with clear error if path doesn't exist - @internal docstring clarifies it logs to stdout, not to audit trail - README: shell=True examples now include sanitization warning - README: _dispatch references updated to dispatch()
- DLP now checks every string arg as a path candidate, not just params named filename/path — fixes silent bypass on dest/target/output params - tool() annotation uses Union[str, Callable] instead of str | Callable — fixes TypeError on Python 3.9 - Docstring examples: shell=False + shlex.split(), write_code uses safe_path - dispatch referenced consistently (not _dispatch) in all docstrings - Node9Agent.new_session() added for server deployments with multiple users - __all__ documents build_tools_anthropic/openai/dispatch/new_session
…ning, 13 new tests - safe_path(filename, *, workspace=...) — workspace is now keyword-only to prevent silent positional arg swaps; all call sites updated - NODE9_SKIP=1 now warns at import time (not just per-call) so it's harder to accidentally leave enabled in production - new_session() docstring explicitly documents the one-instance-per-request requirement - 13 new tests: dispatch() unknown tool (returns string, never raises), new_session() UUID validity and concurrent calls, _build_tools() unannotated/int/bool/float params and *args/**kwargs exclusion, safe_path symlink traversal rejection, configure() called twice (second wins) and empty args don't overwrite Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nv var tests - Path safety now checks ALL path-like args in @tool methods, not just the first; a method with src+dest params now validates both (removed the break) - dispatch() docstring clarifies the lookup is strictly registry-based (@tool marker) - README run_shell example gets explicit warning that shlex.split still allows arbitrary executables — callers must allowlist commands in production - NODE9_SKIP env var table entry strengthened: "Never set in production" - Git hooks now use the active virtualenv Python instead of hardcoded python3 - New tests: traversal in second path arg is caught, configure() wins over env var, env var sets baseline before configure() is called Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
🤖 Claude Code ReviewCode Review: Node9 Python SDK PRWhat's in This DiffThe diff shows only a version bump from Issues1. Missing Context — Cannot Meaningfully ReviewA version bump to Specific concerns given the nature of this library:
2. Security Library Versioning Requires a ChangelogFor a security-focused library, a major version bump with no visible changelog or migration guide is a red flag. Consumers of this library need to know:
Without this, users may defer upgrading or upgrade blindly — both are bad outcomes for a security tool. 3. Version-Only PRs Are High Risk to Merge Without Review GatesMerging a
...creates an undocumented release artifact. If the PyPI publish pipeline is triggered on merge or tag, this ships immediately. What Should Be in This PR Before Approval
RecommendationDo not approve. Request the author either:
If this is the complete change — a standalone version bump with no code changes — that is itself a bug: the version should only increment when behavior changes, and Automated review by Claude Sonnet |
Auto-generated PR
Merge latest
devchanges intomainto trigger a release.