From efcd50d051af303739bd1bed7614c0dbf3f4afe6 Mon Sep 17 00:00:00 2001 From: yanny-sec Date: Thu, 11 Jun 2026 11:45:51 +0100 Subject: [PATCH 1/3] refactor: split SDK into sdk/python + sdk/typescript, move proto to repo root Updates all mentioned references of the existing Python SDK to the new path --- .pre-commit-config.yaml | 10 +++++----- CONTRIBUTING.md | 6 +++--- Makefile | 14 +++++++------- backend/Makefile | 6 +++--- backend/proto/README.md | 6 +++--- {sdk/adrian/proto => proto}/event.proto | 0 sdk/adrian/proto/buf.gen.yaml | 6 ------ sdk/adrian/proto/buf.lock | 6 ------ sdk/adrian/proto/buf.yaml | 5 ----- sdk/{ => python}/adrian/__init__.py | 10 ++++++++-- sdk/{ => python}/adrian/adapters/__init__.py | 0 sdk/{ => python}/adrian/adapters/langgraph.py | 0 sdk/{ => python}/adrian/callbacks.py | 0 sdk/{ => python}/adrian/config.py | 0 sdk/{ => python}/adrian/context.py | 0 sdk/{ => python}/adrian/format/__init__.py | 0 sdk/{ => python}/adrian/format/types.py | 0 sdk/{ => python}/adrian/handler.py | 0 sdk/{ => python}/adrian/handlers/__init__.py | 0 sdk/{ => python}/adrian/handlers/jsonl.py | 0 sdk/{ => python}/adrian/hooks.py | 0 sdk/{ => python}/adrian/identity.py | 0 sdk/{ => python}/adrian/mcp.py | 0 sdk/{ => python}/adrian/pairing.py | 0 sdk/{ => python}/adrian/pii/__init__.py | 0 sdk/{ => python}/adrian/pii/_engine.py | 0 sdk/{ => python}/adrian/pii/_patterns.py | 0 sdk/{ => python}/adrian/pii/_redactor.py | 0 sdk/{ => python}/adrian/pii/_strategies.py | 0 sdk/{ => python}/adrian/proto/__init__.py | 0 sdk/{ => python}/adrian/proto/buf/__init__.py | 0 .../adrian/proto/buf/validate/__init__.py | 0 .../adrian/proto/buf/validate/validate_pb2.py | 0 .../proto/buf/validate/validate_pb2.pyi | 0 sdk/{ => python}/adrian/proto/event_pb2.py | 0 sdk/{ => python}/adrian/proto/event_pb2.pyi | 0 sdk/{ => python}/adrian/py.typed | 0 .../adrian/session_persistence.py | 0 sdk/{ => python}/adrian/types.py | 0 sdk/{ => python}/adrian/ws.py | 0 sdk/{ => python}/pyproject.toml | 0 sdk/{ => python}/pyrightconfig.json | 2 +- sdk/{ => python}/tests/__init__.py | 0 sdk/{ => python}/tests/test_block_mode.py | 0 .../tests/test_block_mode_races.py | 0 sdk/{ => python}/tests/test_exec_modes.py | 0 .../tests/test_extract_tool_calls.py | 18 ++++++++++++++---- sdk/{ => python}/tests/test_handler.py | 0 sdk/{ => python}/tests/test_init.py | 0 sdk/{ => python}/tests/test_mcp.py | 0 .../tests/test_parent_context_scenarios.py | 0 sdk/{ => python}/tests/test_pii_engine.py | 0 .../tests/test_pii_integration.py | 0 sdk/{ => python}/tests/test_pii_patterns.py | 0 sdk/{ => python}/tests/test_pii_redactor.py | 0 sdk/{ => python}/tests/test_resilience.py | 0 .../tests/test_session_persistence.py | 0 sdk/{ => python}/tests/test_ws.py | 0 sdk/{ => python}/tools/regen-proto.sh | 8 ++++++-- sdk/{ => python}/uv.lock | 0 sdk/typescript/package.json | 19 +++++++++++++++++++ sdk/typescript/packages/core/.gitkeep | 0 sdk/typescript/packages/openai/.gitkeep | 0 sdk/typescript/tsconfig.base.json | 14 ++++++++++++++ 64 files changed, 83 insertions(+), 47 deletions(-) rename {sdk/adrian/proto => proto}/event.proto (100%) delete mode 100644 sdk/adrian/proto/buf.gen.yaml delete mode 100644 sdk/adrian/proto/buf.lock delete mode 100644 sdk/adrian/proto/buf.yaml rename sdk/{ => python}/adrian/__init__.py (99%) rename sdk/{ => python}/adrian/adapters/__init__.py (100%) rename sdk/{ => python}/adrian/adapters/langgraph.py (100%) rename sdk/{ => python}/adrian/callbacks.py (100%) rename sdk/{ => python}/adrian/config.py (100%) rename sdk/{ => python}/adrian/context.py (100%) rename sdk/{ => python}/adrian/format/__init__.py (100%) rename sdk/{ => python}/adrian/format/types.py (100%) rename sdk/{ => python}/adrian/handler.py (100%) rename sdk/{ => python}/adrian/handlers/__init__.py (100%) rename sdk/{ => python}/adrian/handlers/jsonl.py (100%) rename sdk/{ => python}/adrian/hooks.py (100%) rename sdk/{ => python}/adrian/identity.py (100%) rename sdk/{ => python}/adrian/mcp.py (100%) rename sdk/{ => python}/adrian/pairing.py (100%) rename sdk/{ => python}/adrian/pii/__init__.py (100%) rename sdk/{ => python}/adrian/pii/_engine.py (100%) rename sdk/{ => python}/adrian/pii/_patterns.py (100%) rename sdk/{ => python}/adrian/pii/_redactor.py (100%) rename sdk/{ => python}/adrian/pii/_strategies.py (100%) rename sdk/{ => python}/adrian/proto/__init__.py (100%) rename sdk/{ => python}/adrian/proto/buf/__init__.py (100%) rename sdk/{ => python}/adrian/proto/buf/validate/__init__.py (100%) rename sdk/{ => python}/adrian/proto/buf/validate/validate_pb2.py (100%) rename sdk/{ => python}/adrian/proto/buf/validate/validate_pb2.pyi (100%) rename sdk/{ => python}/adrian/proto/event_pb2.py (100%) rename sdk/{ => python}/adrian/proto/event_pb2.pyi (100%) rename sdk/{ => python}/adrian/py.typed (100%) rename sdk/{ => python}/adrian/session_persistence.py (100%) rename sdk/{ => python}/adrian/types.py (100%) rename sdk/{ => python}/adrian/ws.py (100%) rename sdk/{ => python}/pyproject.toml (100%) rename sdk/{ => python}/pyrightconfig.json (94%) rename sdk/{ => python}/tests/__init__.py (100%) rename sdk/{ => python}/tests/test_block_mode.py (100%) rename sdk/{ => python}/tests/test_block_mode_races.py (100%) rename sdk/{ => python}/tests/test_exec_modes.py (100%) rename sdk/{ => python}/tests/test_extract_tool_calls.py (85%) rename sdk/{ => python}/tests/test_handler.py (100%) rename sdk/{ => python}/tests/test_init.py (100%) rename sdk/{ => python}/tests/test_mcp.py (100%) rename sdk/{ => python}/tests/test_parent_context_scenarios.py (100%) rename sdk/{ => python}/tests/test_pii_engine.py (100%) rename sdk/{ => python}/tests/test_pii_integration.py (100%) rename sdk/{ => python}/tests/test_pii_patterns.py (100%) rename sdk/{ => python}/tests/test_pii_redactor.py (100%) rename sdk/{ => python}/tests/test_resilience.py (100%) rename sdk/{ => python}/tests/test_session_persistence.py (100%) rename sdk/{ => python}/tests/test_ws.py (100%) rename sdk/{ => python}/tools/regen-proto.sh (91%) rename sdk/{ => python}/uv.lock (100%) create mode 100644 sdk/typescript/package.json create mode 100644 sdk/typescript/packages/core/.gitkeep create mode 100644 sdk/typescript/packages/openai/.gitkeep create mode 100644 sdk/typescript/tsconfig.base.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6583433..92d4048 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ # Adrian pre-commit hooks. Run on every `git commit` once `pre-commit # install` has been run from this repo's root (see CONTRIBUTING.md). -# Scoped to Python files under `sdk/` and `scripts/`. +# Scoped to Python files under `sdk/python/` and `scripts/`. default_install_hook_types: [pre-commit] default_language_version: @@ -22,9 +22,9 @@ repos: rev: v0.15.12 hooks: - id: ruff-format - files: ^(sdk|scripts)/.*\.py$ + files: ^(sdk/python|scripts)/.*\.py$ - id: ruff-check - files: ^(sdk|scripts)/.*\.py$ + files: ^(sdk/python|scripts)/.*\.py$ args: [--fix] - repo: local @@ -34,6 +34,6 @@ repos: entry: basedpyright language: system types: [python] - files: ^sdk/adrian/.*\.py$ + files: ^sdk/python/adrian/.*\.py$ pass_filenames: false - args: [-p, sdk, sdk/adrian] + args: [-p, sdk/python, sdk/python/adrian] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 337d04a..e5d2dfb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,7 @@ Thanks for considering a contribution. Adrian is open-source under the [Apache 2 ## Local dev setup -The Python SDK lives at `sdk/`. From the repo root: +The Python SDK lives at `sdk/python/` (the TypeScript SDK lives at `sdk/typescript/`). From the repo root: ```sh make sdk-install # creates .venv and installs sdk + dev deps via uv @@ -31,7 +31,7 @@ pre-commit install # wires the git hook After `pre-commit install`, every `git commit` runs the configured hooks on staged files: `ruff format`, `ruff check --fix`, `basedpyright` on -`sdk/adrian/`, plus the standard whitespace / YAML / TOML checks. Hooks that +`sdk/python/adrian/`, plus the standard whitespace / YAML / TOML checks. Hooks that modify files (formatter, autofix) leave the commit aborted; re-stage the files and commit again. @@ -42,7 +42,7 @@ pre-commit run --all-files ``` The config lives at [`.pre-commit-config.yaml`](.pre-commit-config.yaml). -Only Python files under `sdk/` and `scripts/` are in scope. +Only Python files under `sdk/python/` and `scripts/` are in scope. ## Style diff --git a/Makefile b/Makefile index e84cc91..af6d231 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ # Adrian OSS — top-level developer Makefile # # Local-dev convention: every Python entry point goes through the -# project-local ``.venv`` so the bundled ``sdk/`` install (``pip -# install -e ./sdk``) cannot collide with a system-wide ``adrian-sdk`` -# wheel from PyPI. ``make sdk-install`` creates the venv and the -# editable install in one shot. +# project-local ``.venv`` so the bundled ``sdk/python/`` install (``pip +# install -e ./sdk/python``) cannot collide with a system-wide +# ``adrian-sdk`` wheel from PyPI. ``make sdk-install`` creates the venv +# and the editable install in one shot. .PHONY: sdk-install sdk-test sdk-clean help @@ -16,7 +16,7 @@ ifndef UV @exit 1 endif uv venv --allow-existing - uv pip install -e ./sdk[dev] + uv pip install -e ./sdk/python[dev] @echo "" @echo "Adrian SDK installed in .venv. Activate with:" @echo " source .venv/bin/activate" @@ -24,10 +24,10 @@ endif @echo "Or run anything via uv: 'uv run python ...'" sdk-test: ## Run the bundled SDK test suite - uv run --project ./sdk pytest sdk/tests + uv run --project ./sdk/python pytest sdk/python/tests sdk-clean: ## Remove .venv and SDK build artefacts - rm -rf .venv sdk/.venv sdk/dist sdk/build sdk/*.egg-info + rm -rf .venv sdk/python/.venv sdk/python/dist sdk/python/build sdk/python/*.egg-info help: ## Show this help @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \ diff --git a/backend/Makefile b/backend/Makefile index ed899cc..8a00e50 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -24,16 +24,16 @@ tidy: clean: rm -rf ./bin -# Sync proto/event.proto from the SDK's canonical copy and regenerate +# Sync proto/event.proto from the repo-root canonical copy and regenerate # the Go bindings. Strips the buf.validate import and field annotations # (see proto/README.md). Requires protoc + protoc-gen-go on PATH. proto-sync: - @echo "Syncing proto/event.proto from sdk/adrian/proto/..." + @echo "Syncing proto/event.proto from ../proto/..." @sed \ -e '/^import "buf\/validate\/validate.proto";$$/d' \ -e 's| \[(buf\.validate\.field)[^]]*\]||g' \ -e '/^package adrian\.core_api\.v1;$$/a\option go_package = "github.com/secureagentics/Adrian/backend/internal/proto;proto";' \ - ../sdk/adrian/proto/event.proto > proto/event.proto + ../proto/event.proto > proto/event.proto @$(MAKE) proto-regen # Regenerate Go bindings from proto/event.proto. diff --git a/backend/proto/README.md b/backend/proto/README.md index a6fd1fa..db15bf0 100644 --- a/backend/proto/README.md +++ b/backend/proto/README.md @@ -4,7 +4,7 @@ The wire schema for SDK <-> backend WebSocket frames. ## Layout -- `event.proto` is the Go-side copy of the wire schema. The single source of truth is `sdk/adrian/proto/event.proto` at the repo root. +- `event.proto` is the Go-side copy of the wire schema. The single source of truth is `proto/event.proto` at the repo root. - The Go-side copy is **stripped** of the `buf.validate` import and field annotations: - The `import "buf/validate/validate.proto";` line is removed. - Every `[(buf.validate.field).*]` annotation is removed. @@ -15,8 +15,8 @@ The wire schema for SDK <-> backend WebSocket frames. When the wire schema changes: -1. Edit `sdk/adrian/proto/event.proto` (the source of truth). -2. Regenerate the SDK's Python bindings: `cd sdk && uv run bash tools/regen-proto.sh`. +1. Edit `proto/event.proto` (the source of truth). +2. Regenerate the SDK's Python bindings: `cd sdk/python && uv run bash tools/regen-proto.sh`. 3. Sync the backend copy and regenerate the Go bindings: `cd backend && make proto-sync`. 4. Commit both. diff --git a/sdk/adrian/proto/event.proto b/proto/event.proto similarity index 100% rename from sdk/adrian/proto/event.proto rename to proto/event.proto diff --git a/sdk/adrian/proto/buf.gen.yaml b/sdk/adrian/proto/buf.gen.yaml deleted file mode 100644 index 5845eec..0000000 --- a/sdk/adrian/proto/buf.gen.yaml +++ /dev/null @@ -1,6 +0,0 @@ -version: v2 -plugins: - - remote: buf.build/protocolbuffers/python - out: . - - remote: buf.build/protocolbuffers/pyi - out: . diff --git a/sdk/adrian/proto/buf.lock b/sdk/adrian/proto/buf.lock deleted file mode 100644 index 709ae02..0000000 --- a/sdk/adrian/proto/buf.lock +++ /dev/null @@ -1,6 +0,0 @@ -# Generated by buf. DO NOT EDIT. -version: v2 -deps: - - name: buf.build/bufbuild/protovalidate - commit: 50325440f8f24053b047484a6bf60b76 - digest: b5:74cb6f5c0853c3c10aafc701614194bbd63326bdb8ef4068214454b8894b03ba4113e04b3a33a8321cdf05336e37db4dc14a5e2495db8462566914f36086ba31 diff --git a/sdk/adrian/proto/buf.yaml b/sdk/adrian/proto/buf.yaml deleted file mode 100644 index 25426d9..0000000 --- a/sdk/adrian/proto/buf.yaml +++ /dev/null @@ -1,5 +0,0 @@ -version: v2 -modules: - - path: . -deps: - - buf.build/bufbuild/protovalidate diff --git a/sdk/adrian/__init__.py b/sdk/python/adrian/__init__.py similarity index 99% rename from sdk/adrian/__init__.py rename to sdk/python/adrian/__init__.py index ea8fdc8..03b7fd4 100644 --- a/sdk/adrian/__init__.py +++ b/sdk/python/adrian/__init__.py @@ -762,7 +762,7 @@ async def patched_astream( def _extract_tool_calls( state: dict[str, Any] | list[BaseMessage], -) -> list[dict[str, str]]: +) -> list[dict[str, Any]]: """Extract tool_calls from the ToolNode input. ``ToolNode`` is reached with three input shapes: @@ -789,7 +789,13 @@ def _extract_tool_calls( return [tc] tc_id = getattr(tc, "id", None) if tc_id: - return [{"id": tc_id, "name": getattr(tc, "name", ""), "args": getattr(tc, "args", {})}] + return [ + { + "id": tc_id, + "name": getattr(tc, "name", ""), + "args": getattr(tc, "args", {}), + } + ] return [] if isinstance(state, dict): diff --git a/sdk/adrian/adapters/__init__.py b/sdk/python/adrian/adapters/__init__.py similarity index 100% rename from sdk/adrian/adapters/__init__.py rename to sdk/python/adrian/adapters/__init__.py diff --git a/sdk/adrian/adapters/langgraph.py b/sdk/python/adrian/adapters/langgraph.py similarity index 100% rename from sdk/adrian/adapters/langgraph.py rename to sdk/python/adrian/adapters/langgraph.py diff --git a/sdk/adrian/callbacks.py b/sdk/python/adrian/callbacks.py similarity index 100% rename from sdk/adrian/callbacks.py rename to sdk/python/adrian/callbacks.py diff --git a/sdk/adrian/config.py b/sdk/python/adrian/config.py similarity index 100% rename from sdk/adrian/config.py rename to sdk/python/adrian/config.py diff --git a/sdk/adrian/context.py b/sdk/python/adrian/context.py similarity index 100% rename from sdk/adrian/context.py rename to sdk/python/adrian/context.py diff --git a/sdk/adrian/format/__init__.py b/sdk/python/adrian/format/__init__.py similarity index 100% rename from sdk/adrian/format/__init__.py rename to sdk/python/adrian/format/__init__.py diff --git a/sdk/adrian/format/types.py b/sdk/python/adrian/format/types.py similarity index 100% rename from sdk/adrian/format/types.py rename to sdk/python/adrian/format/types.py diff --git a/sdk/adrian/handler.py b/sdk/python/adrian/handler.py similarity index 100% rename from sdk/adrian/handler.py rename to sdk/python/adrian/handler.py diff --git a/sdk/adrian/handlers/__init__.py b/sdk/python/adrian/handlers/__init__.py similarity index 100% rename from sdk/adrian/handlers/__init__.py rename to sdk/python/adrian/handlers/__init__.py diff --git a/sdk/adrian/handlers/jsonl.py b/sdk/python/adrian/handlers/jsonl.py similarity index 100% rename from sdk/adrian/handlers/jsonl.py rename to sdk/python/adrian/handlers/jsonl.py diff --git a/sdk/adrian/hooks.py b/sdk/python/adrian/hooks.py similarity index 100% rename from sdk/adrian/hooks.py rename to sdk/python/adrian/hooks.py diff --git a/sdk/adrian/identity.py b/sdk/python/adrian/identity.py similarity index 100% rename from sdk/adrian/identity.py rename to sdk/python/adrian/identity.py diff --git a/sdk/adrian/mcp.py b/sdk/python/adrian/mcp.py similarity index 100% rename from sdk/adrian/mcp.py rename to sdk/python/adrian/mcp.py diff --git a/sdk/adrian/pairing.py b/sdk/python/adrian/pairing.py similarity index 100% rename from sdk/adrian/pairing.py rename to sdk/python/adrian/pairing.py diff --git a/sdk/adrian/pii/__init__.py b/sdk/python/adrian/pii/__init__.py similarity index 100% rename from sdk/adrian/pii/__init__.py rename to sdk/python/adrian/pii/__init__.py diff --git a/sdk/adrian/pii/_engine.py b/sdk/python/adrian/pii/_engine.py similarity index 100% rename from sdk/adrian/pii/_engine.py rename to sdk/python/adrian/pii/_engine.py diff --git a/sdk/adrian/pii/_patterns.py b/sdk/python/adrian/pii/_patterns.py similarity index 100% rename from sdk/adrian/pii/_patterns.py rename to sdk/python/adrian/pii/_patterns.py diff --git a/sdk/adrian/pii/_redactor.py b/sdk/python/adrian/pii/_redactor.py similarity index 100% rename from sdk/adrian/pii/_redactor.py rename to sdk/python/adrian/pii/_redactor.py diff --git a/sdk/adrian/pii/_strategies.py b/sdk/python/adrian/pii/_strategies.py similarity index 100% rename from sdk/adrian/pii/_strategies.py rename to sdk/python/adrian/pii/_strategies.py diff --git a/sdk/adrian/proto/__init__.py b/sdk/python/adrian/proto/__init__.py similarity index 100% rename from sdk/adrian/proto/__init__.py rename to sdk/python/adrian/proto/__init__.py diff --git a/sdk/adrian/proto/buf/__init__.py b/sdk/python/adrian/proto/buf/__init__.py similarity index 100% rename from sdk/adrian/proto/buf/__init__.py rename to sdk/python/adrian/proto/buf/__init__.py diff --git a/sdk/adrian/proto/buf/validate/__init__.py b/sdk/python/adrian/proto/buf/validate/__init__.py similarity index 100% rename from sdk/adrian/proto/buf/validate/__init__.py rename to sdk/python/adrian/proto/buf/validate/__init__.py diff --git a/sdk/adrian/proto/buf/validate/validate_pb2.py b/sdk/python/adrian/proto/buf/validate/validate_pb2.py similarity index 100% rename from sdk/adrian/proto/buf/validate/validate_pb2.py rename to sdk/python/adrian/proto/buf/validate/validate_pb2.py diff --git a/sdk/adrian/proto/buf/validate/validate_pb2.pyi b/sdk/python/adrian/proto/buf/validate/validate_pb2.pyi similarity index 100% rename from sdk/adrian/proto/buf/validate/validate_pb2.pyi rename to sdk/python/adrian/proto/buf/validate/validate_pb2.pyi diff --git a/sdk/adrian/proto/event_pb2.py b/sdk/python/adrian/proto/event_pb2.py similarity index 100% rename from sdk/adrian/proto/event_pb2.py rename to sdk/python/adrian/proto/event_pb2.py diff --git a/sdk/adrian/proto/event_pb2.pyi b/sdk/python/adrian/proto/event_pb2.pyi similarity index 100% rename from sdk/adrian/proto/event_pb2.pyi rename to sdk/python/adrian/proto/event_pb2.pyi diff --git a/sdk/adrian/py.typed b/sdk/python/adrian/py.typed similarity index 100% rename from sdk/adrian/py.typed rename to sdk/python/adrian/py.typed diff --git a/sdk/adrian/session_persistence.py b/sdk/python/adrian/session_persistence.py similarity index 100% rename from sdk/adrian/session_persistence.py rename to sdk/python/adrian/session_persistence.py diff --git a/sdk/adrian/types.py b/sdk/python/adrian/types.py similarity index 100% rename from sdk/adrian/types.py rename to sdk/python/adrian/types.py diff --git a/sdk/adrian/ws.py b/sdk/python/adrian/ws.py similarity index 100% rename from sdk/adrian/ws.py rename to sdk/python/adrian/ws.py diff --git a/sdk/pyproject.toml b/sdk/python/pyproject.toml similarity index 100% rename from sdk/pyproject.toml rename to sdk/python/pyproject.toml diff --git a/sdk/pyrightconfig.json b/sdk/python/pyrightconfig.json similarity index 94% rename from sdk/pyrightconfig.json rename to sdk/python/pyrightconfig.json index 5458466..8706629 100644 --- a/sdk/pyrightconfig.json +++ b/sdk/python/pyrightconfig.json @@ -1,7 +1,7 @@ { "include": ["adrian", "tests"], "exclude": ["**/__pycache__", "adrian/proto"], - "venvPath": "..", + "venvPath": "../..", "venv": ".venv", "pythonVersion": "3.12", "pythonPlatform": "Linux", diff --git a/sdk/tests/__init__.py b/sdk/python/tests/__init__.py similarity index 100% rename from sdk/tests/__init__.py rename to sdk/python/tests/__init__.py diff --git a/sdk/tests/test_block_mode.py b/sdk/python/tests/test_block_mode.py similarity index 100% rename from sdk/tests/test_block_mode.py rename to sdk/python/tests/test_block_mode.py diff --git a/sdk/tests/test_block_mode_races.py b/sdk/python/tests/test_block_mode_races.py similarity index 100% rename from sdk/tests/test_block_mode_races.py rename to sdk/python/tests/test_block_mode_races.py diff --git a/sdk/tests/test_exec_modes.py b/sdk/python/tests/test_exec_modes.py similarity index 100% rename from sdk/tests/test_exec_modes.py rename to sdk/python/tests/test_exec_modes.py diff --git a/sdk/tests/test_extract_tool_calls.py b/sdk/python/tests/test_extract_tool_calls.py similarity index 85% rename from sdk/tests/test_extract_tool_calls.py rename to sdk/python/tests/test_extract_tool_calls.py index 9f089bf..9910673 100644 --- a/sdk/tests/test_extract_tool_calls.py +++ b/sdk/python/tests/test_extract_tool_calls.py @@ -6,13 +6,18 @@ Covers all three ToolNode input shapes. Shape 3 (per-tool-call dispatch) is the one that previously returned ``[]`` and silently un-gated the tool. """ -from __future__ import annotations -from langchain_core.messages import AIMessage, HumanMessage +from __future__ import annotations from adrian import _extract_tool_calls +from langchain_core.messages import AIMessage, HumanMessage -_TC = {"name": "read_file", "args": {"path": "/etc/shadow"}, "id": "call_1", "type": "tool_call"} +_TC = { + "name": "read_file", + "args": {"path": "/etc/shadow"}, + "id": "call_1", + "type": "tool_call", +} def test_shape1_state_dict_with_messages() -> None: @@ -36,4 +41,9 @@ def test_shape3_per_tool_call_dict() -> None: def test_no_tool_calls_returns_empty() -> None: assert _extract_tool_calls({"messages": [HumanMessage("hi")]}) == [] - assert _extract_tool_calls({"__type": "tool_call", "tool_call": {"name": "x"}, "state": {}}) == [] + assert ( + _extract_tool_calls( + {"__type": "tool_call", "tool_call": {"name": "x"}, "state": {}} + ) + == [] + ) diff --git a/sdk/tests/test_handler.py b/sdk/python/tests/test_handler.py similarity index 100% rename from sdk/tests/test_handler.py rename to sdk/python/tests/test_handler.py diff --git a/sdk/tests/test_init.py b/sdk/python/tests/test_init.py similarity index 100% rename from sdk/tests/test_init.py rename to sdk/python/tests/test_init.py diff --git a/sdk/tests/test_mcp.py b/sdk/python/tests/test_mcp.py similarity index 100% rename from sdk/tests/test_mcp.py rename to sdk/python/tests/test_mcp.py diff --git a/sdk/tests/test_parent_context_scenarios.py b/sdk/python/tests/test_parent_context_scenarios.py similarity index 100% rename from sdk/tests/test_parent_context_scenarios.py rename to sdk/python/tests/test_parent_context_scenarios.py diff --git a/sdk/tests/test_pii_engine.py b/sdk/python/tests/test_pii_engine.py similarity index 100% rename from sdk/tests/test_pii_engine.py rename to sdk/python/tests/test_pii_engine.py diff --git a/sdk/tests/test_pii_integration.py b/sdk/python/tests/test_pii_integration.py similarity index 100% rename from sdk/tests/test_pii_integration.py rename to sdk/python/tests/test_pii_integration.py diff --git a/sdk/tests/test_pii_patterns.py b/sdk/python/tests/test_pii_patterns.py similarity index 100% rename from sdk/tests/test_pii_patterns.py rename to sdk/python/tests/test_pii_patterns.py diff --git a/sdk/tests/test_pii_redactor.py b/sdk/python/tests/test_pii_redactor.py similarity index 100% rename from sdk/tests/test_pii_redactor.py rename to sdk/python/tests/test_pii_redactor.py diff --git a/sdk/tests/test_resilience.py b/sdk/python/tests/test_resilience.py similarity index 100% rename from sdk/tests/test_resilience.py rename to sdk/python/tests/test_resilience.py diff --git a/sdk/tests/test_session_persistence.py b/sdk/python/tests/test_session_persistence.py similarity index 100% rename from sdk/tests/test_session_persistence.py rename to sdk/python/tests/test_session_persistence.py diff --git a/sdk/tests/test_ws.py b/sdk/python/tests/test_ws.py similarity index 100% rename from sdk/tests/test_ws.py rename to sdk/python/tests/test_ws.py diff --git a/sdk/tools/regen-proto.sh b/sdk/python/tools/regen-proto.sh similarity index 91% rename from sdk/tools/regen-proto.sh rename to sdk/python/tools/regen-proto.sh index 6192983..3ba08bb 100755 --- a/sdk/tools/regen-proto.sh +++ b/sdk/python/tools/regen-proto.sh @@ -20,6 +20,10 @@ set -euo pipefail SDK_ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$SDK_ROOT" +# Canonical proto lives at the repo-root proto/ (single source of truth); +# the generated bindings are committed under adrian/proto/. +PROTO_DIR="$(cd "$SDK_ROOT/../.." && pwd)/proto" + DEP_DIR="$(mktemp -d)" trap 'rm -rf "$DEP_DIR"' EXIT @@ -48,9 +52,9 @@ protoc \ --plugin=protoc-gen-mypy="$PLUGIN" \ --python_out=adrian/proto \ --mypy_out=adrian/proto \ - -I adrian/proto \ + -I "$PROTO_DIR" \ -I "$DEP_DIR" \ - adrian/proto/event.proto + "$PROTO_DIR/event.proto" # 5. Rewrite the protoc-generated `from buf.validate import ...` to a relative # import, so the vendored stubs under adrian/proto/buf/validate/ resolve diff --git a/sdk/uv.lock b/sdk/python/uv.lock similarity index 100% rename from sdk/uv.lock rename to sdk/python/uv.lock diff --git a/sdk/typescript/package.json b/sdk/typescript/package.json new file mode 100644 index 0000000..c9a6ace --- /dev/null +++ b/sdk/typescript/package.json @@ -0,0 +1,19 @@ +{ + "name": "adrian-typescript", + "private": true, + "description": "Adrian TypeScript SDK monorepo (npm workspaces).", + "workspaces": [ + "packages/*" + ], + "scripts": { + "build": "npm run build --workspaces --if-present", + "typecheck": "npm run typecheck --workspaces --if-present", + "test": "npm run test --workspaces --if-present" + }, + "devDependencies": { + "@types/node": "^25.9.1", + "tsup": "^8.5.1", + "typescript": "^6.0.3", + "vitest": "^4.1.7" + } +} diff --git a/sdk/typescript/packages/core/.gitkeep b/sdk/typescript/packages/core/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/sdk/typescript/packages/openai/.gitkeep b/sdk/typescript/packages/openai/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/sdk/typescript/tsconfig.base.json b/sdk/typescript/tsconfig.base.json new file mode 100644 index 0000000..e1cd4d1 --- /dev/null +++ b/sdk/typescript/tsconfig.base.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es2022", + "module": "nodenext", + "moduleResolution": "nodenext", + "lib": ["es2023"], + "strict": true, + "declaration": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "verbatimModuleSyntax": true + } +} From 419578059e632485aef57198458cb6bfa0009363 Mon Sep 17 00:00:00 2001 From: yanny-sec Date: Thu, 11 Jun 2026 11:52:52 +0100 Subject: [PATCH 2/3] ci: repoint sdk-lint paths to sdk/python after restructure --- .github/workflows/sdk-lint.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/sdk-lint.yml b/.github/workflows/sdk-lint.yml index 604891e..c75c765 100644 --- a/.github/workflows/sdk-lint.yml +++ b/.github/workflows/sdk-lint.yml @@ -9,7 +9,7 @@ name: SDK Lint on: pull_request: paths: - - "sdk/**" + - "sdk/python/**" - "scripts/**" - ".github/workflows/sdk-lint.yml" @@ -22,16 +22,16 @@ jobs: with: enable-cache: true # Install into a repo-root .venv (same as `make sdk-install`), which - # is where sdk/pyrightconfig.json's `venvPath: ".."` expects it. A - # sdk/.venv (uv sync --project) would make basedpyright fail to find - # the venv and exit 3. + # is where sdk/python/pyrightconfig.json's `venvPath: "../.."` expects + # it. A sdk/python/.venv (uv sync --project) would make basedpyright + # fail to find the venv and exit 3. - name: Install SDK + dev deps run: | uv venv - uv pip install -e "./sdk[dev]" + uv pip install -e "./sdk/python[dev]" - name: Ruff format - run: .venv/bin/ruff format --check sdk scripts + run: .venv/bin/ruff format --check sdk/python scripts - name: Ruff lint - run: .venv/bin/ruff check sdk scripts + run: .venv/bin/ruff check sdk/python scripts - name: Basedpyright - run: .venv/bin/basedpyright -p sdk sdk/adrian + run: .venv/bin/basedpyright -p sdk/python sdk/python/adrian From 488ef20d42f3d8ffb7a75662b23ec9a3cafc136a Mon Sep 17 00:00:00 2001 From: yanny-sec Date: Thu, 11 Jun 2026 14:24:01 +0100 Subject: [PATCH 3/3] test(tests): fix test_adapter_sessions_bindings_are_patched regressed test --- sdk/python/tests/test_mcp.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/sdk/python/tests/test_mcp.py b/sdk/python/tests/test_mcp.py index d026ee8..fdd456f 100644 --- a/sdk/python/tests/test_mcp.py +++ b/sdk/python/tests/test_mcp.py @@ -321,12 +321,23 @@ class TestRebindAcrossModules: """ def test_adapter_sessions_bindings_are_patched(self) -> None: - for attr in ("stdio_client", "streamablehttp_client", "sse_client"): + for attr in ("stdio_client", "sse_client"): fn = getattr(adapter_sessions, attr, None) assert fn is not None, f"{attr} not present in adapter sessions" assert getattr(fn, "_adrian_mcp_patched", False), ( f"{attr} in langchain_mcp_adapters.sessions was not rebound" ) + http_names = [ + name + for name in ("streamable_http_client", "streamablehttp_client") + if getattr(adapter_sessions, name, None) is not None + ] + assert http_names, "no streamable-http client present in adapter sessions" + for name in http_names: + fn = getattr(adapter_sessions, name) + assert getattr(fn, "_adrian_mcp_patched", False), ( + f"{name} in langchain_mcp_adapters.sessions was not rebound" + ) class TestPatchIdempotency: