langchain-quickjs 0.3.2__tar.gz → 0.3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/CHANGELOG.md +7 -0
  2. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/PKG-INFO +6 -6
  3. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/langchain_quickjs/_prompt.py +2 -1
  4. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/langchain_quickjs/_repl.py +3 -0
  5. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/langchain_quickjs/_subagent.py +6 -1
  6. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/pyproject.toml +9 -9
  7. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/smoke_tests/snapshots/quickjs_system_prompt_mixed_foreign_functions.md +2 -1
  8. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/smoke_tests/snapshots/quickjs_system_prompt_mixed_foreign_functions_call.md +2 -1
  9. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/smoke_tests/snapshots/quickjs_system_prompt_mixed_foreign_functions_turn.md +2 -1
  10. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/smoke_tests/snapshots/quickjs_system_prompt_no_tools.md +2 -1
  11. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/smoke_tests/snapshots/quickjs_system_prompt_no_tools_call.md +2 -1
  12. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/smoke_tests/snapshots/quickjs_system_prompt_no_tools_turn.md +2 -1
  13. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/smoke_tests/test_system_prompt.py +19 -14
  14. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/test_prompt_modes.py +2 -0
  15. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/test_repl_middleware.py +72 -1
  16. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/uv.lock +99 -90
  17. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/.gitignore +0 -0
  18. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/LICENSE +0 -0
  19. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/Makefile +0 -0
  20. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/README.md +0 -0
  21. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/langchain_quickjs/__init__.py +0 -0
  22. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/langchain_quickjs/_format.py +0 -0
  23. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/langchain_quickjs/_ptc.py +0 -0
  24. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/langchain_quickjs/_snapshot.py +0 -0
  25. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/langchain_quickjs/middleware.py +0 -0
  26. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/langchain_quickjs/py.typed +0 -0
  27. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/__init__.py +0 -0
  28. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/_common.py +0 -0
  29. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/benchmarks/_common.py +0 -0
  30. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/benchmarks/test_quickjs_memory.py +0 -0
  31. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/benchmarks/test_quickjs_throughput.py +0 -0
  32. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/integration_tests/__init__.py +0 -0
  33. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/integration_tests/test_postgres.py +0 -0
  34. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/integration_tests/test_rlm.py +0 -0
  35. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/__init__.py +0 -0
  36. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  37. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  38. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/test_end_to_end.py +0 -0
  39. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/test_end_to_end_async.py +0 -0
  40. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/test_ptc.py +0 -0
  41. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/test_snapshot.py +0 -0
  42. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/test_snapshot_persistence.py +0 -0
  43. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/test_subagent_events.py +0 -0
  44. {langchain_quickjs-0.3.2 → langchain_quickjs-0.3.3}/tests/unit_tests/test_thread_affinity.py +0 -0
@@ -2,6 +2,13 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## [0.3.3](https://github.com/langchain-ai/deepagents/compare/langchain-quickjs==0.3.2...langchain-quickjs==0.3.3) (2026-07-16)
6
+
7
+ ### Bug Fixes
8
+
9
+ * Propagate JS `task()` subagent interrupts ([#4401](https://github.com/langchain-ai/deepagents/issues/4401)) ([0b30e49](https://github.com/langchain-ai/deepagents/commit/0b30e494d59187de2e6e23db062abbf835a6d265))
10
+ * Correct `eval` await description ([#4371](https://github.com/langchain-ai/deepagents/issues/4371)) ([4ab860f](https://github.com/langchain-ai/deepagents/commit/4ab860f007832821bd303809d7c2c1d2c86a6528))
11
+
5
12
  ## [0.3.2](https://github.com/langchain-ai/deepagents/compare/langchain-quickjs==0.3.1...langchain-quickjs==0.3.2) (2026-06-25)
6
13
 
7
14
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langchain-quickjs
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: JavaScript REPL middleware for deepagents
5
5
  Project-URL: Homepage, https://github.com/langchain-ai/deepagents/tree/main/libs/partners/quickjs
6
6
  Project-URL: Repository, https://github.com/langchain-ai/deepagents
@@ -17,11 +17,11 @@ Classifier: Programming Language :: Python :: 3.12
17
17
  Classifier: Programming Language :: Python :: 3.13
18
18
  Requires-Python: <4.0,>=3.11
19
19
  Requires-Dist: bsdiff4<2.0.0,>=1.2.6
20
- Requires-Dist: deepagents<0.8.0,>=0.6.8
21
- Requires-Dist: langchain-core<2.0.0,>=1.4.7
22
- Requires-Dist: langchain<2.0.0,>=1.3.9
23
- Requires-Dist: langgraph<2.0.0,>=1.2.5
24
- Requires-Dist: quickjs-rs<0.3.0,>=0.2.3
20
+ Requires-Dist: deepagents<0.8.0,>=0.6.12
21
+ Requires-Dist: langchain-core<2.0.0,>=1.4.9
22
+ Requires-Dist: langchain<2.0.0,>=1.3.14
23
+ Requires-Dist: langgraph<2.0.0,>=1.2.9
24
+ Requires-Dist: quickjs-rs<0.3.0,>=0.2.4
25
25
  Description-Content-Type: text/markdown
26
26
 
27
27
  # langchain-quickjs
@@ -364,7 +364,8 @@ def render_eval_tool_description(*, mode: Literal["thread", "turn", "call"]) ->
364
364
  return (
365
365
  "Execute JavaScript in a sandboxed REPL. "
366
366
  f"{state_line} No filesystem, network, or real clock. "
367
- "Synchronous only — top-level `await` will not resolve."
367
+ "Top-level `await` is supported; a final-expression Promise resolves "
368
+ "before the call returns."
368
369
  )
369
370
 
370
371
 
@@ -16,6 +16,7 @@ import uuid
16
16
  from dataclasses import dataclass, field, replace
17
17
  from typing import TYPE_CHECKING, Any
18
18
 
19
+ from langgraph.errors import GraphInterrupt
19
20
  from quickjs_rs import (
20
21
  UNDEFINED,
21
22
  ConcurrentEvalError,
@@ -633,6 +634,8 @@ class _ThreadREPL:
633
634
  payload,
634
635
  state=state,
635
636
  )
637
+ except GraphInterrupt:
638
+ raise
636
639
  except Exception as e:
637
640
  # Subagent dispatches are part of the eval language, not
638
641
  # PTC calls. Surface their validation/runtime failures as
@@ -10,6 +10,7 @@ from dataclasses import replace
10
10
  from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, TypedDict
11
11
 
12
12
  from langchain.agents.structured_output import AutoStrategy
13
+ from langgraph.errors import GraphInterrupt
13
14
 
14
15
  from langchain_quickjs._format import coerce_tool_output_for_ptc
15
16
 
@@ -239,8 +240,12 @@ async def call_subagent_task_tool(
239
240
  "description": description,
240
241
  "subagent_type": subagent_type,
241
242
  "runtime": runtime,
242
- }
243
+ },
244
+ config=getattr(runtime, "config", None),
245
+ tool_call_id=subagent_id,
243
246
  )
247
+ except GraphInterrupt:
248
+ raise
244
249
  except Exception as e:
245
250
  error_event: SubagentErrorEvent = {
246
251
  "type": SUBAGENT_STREAM_EVENT_TYPE,
@@ -18,16 +18,16 @@ classifiers = [
18
18
  "Programming Language :: Python :: 3.13",
19
19
  ]
20
20
 
21
- version = "0.3.2"
21
+ version = "0.3.3"
22
22
  requires-python = ">=3.11,<4.0"
23
23
  keywords = ["deepagents", "langchain", "langgraph", "repl", "javascript", "quickjs", "middleware"]
24
24
 
25
25
  dependencies = [
26
- "deepagents>=0.6.8,<0.8.0",
27
- "quickjs-rs>=0.2.3,<0.3.0",
28
- "langchain>=1.3.9,<2.0.0",
29
- "langchain-core>=1.4.7,<2.0.0",
30
- "langgraph>=1.2.5,<2.0.0",
26
+ "deepagents>=0.6.12,<0.8.0",
27
+ "quickjs-rs>=0.2.4,<0.3.0",
28
+ "langchain>=1.3.14,<2.0.0",
29
+ "langchain-core>=1.4.9,<2.0.0",
30
+ "langgraph>=1.2.9,<2.0.0",
31
31
  "bsdiff4>=1.2.6,<2.0.0",
32
32
  ]
33
33
 
@@ -43,7 +43,7 @@ Documentation = "https://github.com/langchain-ai/deepagents/tree/main/libs/partn
43
43
  test = [
44
44
  "langgraph-checkpoint-postgres>=3.1.0,<4.0.0",
45
45
  "psycopg[binary]>=3.3.4,<4.0.0",
46
- "pytest>=9.0.3,<10.0.0",
46
+ "pytest>=9.1.1,<10.0.0",
47
47
  "pytest-benchmark",
48
48
  "pytest-codspeed>=5.0.3,<6.0.0",
49
49
  "pytest-cov",
@@ -52,9 +52,9 @@ test = [
52
52
  "pytest-timeout>=2.4.0,<3.0.0",
53
53
  "pytest-asyncio>=1.4.0",
54
54
  "pytest-watcher>=0.6.3,<1.0.0",
55
- "ruff>=0.15.16,<0.16.0",
55
+ "ruff>=0.15.20,<0.16.0",
56
56
  "testcontainers[postgres]>=4.14.2,<5.0.0",
57
- "ty>=0.0.46,<1.0.0",
57
+ "ty>=0.0.54,<1.0.0",
58
58
  "twine",
59
59
  "build",
60
60
  ]
@@ -66,7 +66,7 @@ When you finish all work, write your final answer in the message AFTER your last
66
66
  - Read files before editing — understand existing content before making changes
67
67
  - Mimic existing style, naming conventions, and patterns
68
68
 
69
- ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `glob`, `grep`
69
+ ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `delete`, `glob`, `grep`
70
70
 
71
71
  You have access to a filesystem which you can interact with using these tools.
72
72
  All file paths must start with a /. Follow the tool docs for the available tools, and use pagination (offset/limit) when reading large files.
@@ -75,6 +75,7 @@ All file paths must start with a /. Follow the tool docs for the available tools
75
75
  - read_file: read a file from the filesystem
76
76
  - write_file: write to a file in the filesystem
77
77
  - edit_file: edit a file in the filesystem
78
+ - delete: delete a file or directory (recursively) from the filesystem
78
79
  - glob: find files matching a pattern (e.g., "**/*.py")
79
80
  - grep: search for text within files
80
81
 
@@ -66,7 +66,7 @@ When you finish all work, write your final answer in the message AFTER your last
66
66
  - Read files before editing — understand existing content before making changes
67
67
  - Mimic existing style, naming conventions, and patterns
68
68
 
69
- ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `glob`, `grep`
69
+ ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `delete`, `glob`, `grep`
70
70
 
71
71
  You have access to a filesystem which you can interact with using these tools.
72
72
  All file paths must start with a /. Follow the tool docs for the available tools, and use pagination (offset/limit) when reading large files.
@@ -75,6 +75,7 @@ All file paths must start with a /. Follow the tool docs for the available tools
75
75
  - read_file: read a file from the filesystem
76
76
  - write_file: write to a file in the filesystem
77
77
  - edit_file: edit a file in the filesystem
78
+ - delete: delete a file or directory (recursively) from the filesystem
78
79
  - glob: find files matching a pattern (e.g., "**/*.py")
79
80
  - grep: search for text within files
80
81
 
@@ -66,7 +66,7 @@ When you finish all work, write your final answer in the message AFTER your last
66
66
  - Read files before editing — understand existing content before making changes
67
67
  - Mimic existing style, naming conventions, and patterns
68
68
 
69
- ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `glob`, `grep`
69
+ ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `delete`, `glob`, `grep`
70
70
 
71
71
  You have access to a filesystem which you can interact with using these tools.
72
72
  All file paths must start with a /. Follow the tool docs for the available tools, and use pagination (offset/limit) when reading large files.
@@ -75,6 +75,7 @@ All file paths must start with a /. Follow the tool docs for the available tools
75
75
  - read_file: read a file from the filesystem
76
76
  - write_file: write to a file in the filesystem
77
77
  - edit_file: edit a file in the filesystem
78
+ - delete: delete a file or directory (recursively) from the filesystem
78
79
  - glob: find files matching a pattern (e.g., "**/*.py")
79
80
  - grep: search for text within files
80
81
 
@@ -66,7 +66,7 @@ When you finish all work, write your final answer in the message AFTER your last
66
66
  - Read files before editing — understand existing content before making changes
67
67
  - Mimic existing style, naming conventions, and patterns
68
68
 
69
- ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `glob`, `grep`
69
+ ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `delete`, `glob`, `grep`
70
70
 
71
71
  You have access to a filesystem which you can interact with using these tools.
72
72
  All file paths must start with a /. Follow the tool docs for the available tools, and use pagination (offset/limit) when reading large files.
@@ -75,6 +75,7 @@ All file paths must start with a /. Follow the tool docs for the available tools
75
75
  - read_file: read a file from the filesystem
76
76
  - write_file: write to a file in the filesystem
77
77
  - edit_file: edit a file in the filesystem
78
+ - delete: delete a file or directory (recursively) from the filesystem
78
79
  - glob: find files matching a pattern (e.g., "**/*.py")
79
80
  - grep: search for text within files
80
81
 
@@ -66,7 +66,7 @@ When you finish all work, write your final answer in the message AFTER your last
66
66
  - Read files before editing — understand existing content before making changes
67
67
  - Mimic existing style, naming conventions, and patterns
68
68
 
69
- ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `glob`, `grep`
69
+ ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `delete`, `glob`, `grep`
70
70
 
71
71
  You have access to a filesystem which you can interact with using these tools.
72
72
  All file paths must start with a /. Follow the tool docs for the available tools, and use pagination (offset/limit) when reading large files.
@@ -75,6 +75,7 @@ All file paths must start with a /. Follow the tool docs for the available tools
75
75
  - read_file: read a file from the filesystem
76
76
  - write_file: write to a file in the filesystem
77
77
  - edit_file: edit a file in the filesystem
78
+ - delete: delete a file or directory (recursively) from the filesystem
78
79
  - glob: find files matching a pattern (e.g., "**/*.py")
79
80
  - grep: search for text within files
80
81
 
@@ -66,7 +66,7 @@ When you finish all work, write your final answer in the message AFTER your last
66
66
  - Read files before editing — understand existing content before making changes
67
67
  - Mimic existing style, naming conventions, and patterns
68
68
 
69
- ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `glob`, `grep`
69
+ ## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`, `delete`, `glob`, `grep`
70
70
 
71
71
  You have access to a filesystem which you can interact with using these tools.
72
72
  All file paths must start with a /. Follow the tool docs for the available tools, and use pagination (offset/limit) when reading large files.
@@ -75,6 +75,7 @@ All file paths must start with a /. Follow the tool docs for the available tools
75
75
  - read_file: read a file from the filesystem
76
76
  - write_file: write to a file in the filesystem
77
77
  - edit_file: edit a file in the filesystem
78
+ - delete: delete a file or directory (recursively) from the filesystem
78
79
  - glob: find files matching a pattern (e.g., "**/*.py")
79
80
  - grep: search for text within files
80
81
 
@@ -1,6 +1,23 @@
1
+ """Snapshot smoke tests for the quickjs system prompt.
2
+
3
+ These tests render the system prompt that `CodeInterpreterMiddleware` injects
4
+ into a `create_deep_agent` agent and compare it against committed snapshots in
5
+ `snapshots/`. Their purpose is to catch *drift in the deepagents SDK* that
6
+ silently changes the prompt the quickjs middleware composes — wording the
7
+ middleware does not own but depends on (e.g. the built-in `write_todos`
8
+ prompt, tool-listing format, or harness scaffolding).
9
+
10
+ Because the quickjs partner can be untouched while the SDK changes, CI runs
11
+ this file as a dedicated `test-quickjs-sdk-smoke` job (see `ci.yml`) whenever
12
+ the SDK changes but quickjs does not — the full quickjs suite would otherwise
13
+ not run and the drift would land unnoticed.
14
+
15
+ Run `pytest ... --update-snapshots` to regenerate the snapshots after an
16
+ intentional prompt change.
17
+ """
18
+
1
19
  from __future__ import annotations
2
20
 
3
- import re
4
21
  from collections.abc import (
5
22
  Iterator, # noqa: TC003 — pydantic resolves field annotations at runtime
6
23
  )
@@ -114,18 +131,6 @@ def _system_message_as_text(message: SystemMessage) -> str:
114
131
  )
115
132
 
116
133
 
117
- # Insert a blank line after a `##` heading when the next line is non-blank.
118
- # The released `langchain==1.3.0` `WRITE_TODOS_SYSTEM_PROMPT` is missing this
119
- # blank line; the fix is on `langchain` `main` and will land in the next
120
- # release. Drop this normalization once we pin a `langchain` version that
121
- # includes it.
122
- _HEADING_NO_BLANK = re.compile(r"(?m)^(#+ [^\n]*)\n(?=[^\n])")
123
-
124
-
125
- def _normalize_heading_blanks(text: str) -> str:
126
- return _HEADING_NO_BLANK.sub(r"\1\n\n", text)
127
-
128
-
129
134
  def _assert_snapshot(
130
135
  snapshot_path: Path, actual: str, *, update_snapshots: bool
131
136
  ) -> None:
@@ -137,7 +142,7 @@ def _assert_snapshot(
137
142
  raise AssertionError(msg)
138
143
 
139
144
  expected = snapshot_path.read_text(encoding="utf-8")
140
- assert _normalize_heading_blanks(actual) == _normalize_heading_blanks(expected)
145
+ assert actual == expected
141
146
 
142
147
 
143
148
  def _invoke_for_snapshot(agent: object, payload: dict[str, Any]) -> None:
@@ -89,4 +89,6 @@ def test_render_eval_tool_description_mode_specific(
89
89
  ) -> None:
90
90
  description = render_eval_tool_description(mode=mode)
91
91
  assert expected_fragment in description
92
+ assert "Top-level `await` is supported" in description
93
+ assert "will not resolve" not in description
92
94
  assert description.startswith("Execute JavaScript in a sandboxed REPL.")
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import threading
7
- from typing import TYPE_CHECKING, Any
7
+ from typing import TYPE_CHECKING, Any, cast
8
8
  from unittest.mock import MagicMock, patch
9
9
 
10
10
  import pytest
@@ -22,6 +22,8 @@ from langchain_core.language_models.fake_chat_models import GenericFakeChatModel
22
22
  from langchain_core.messages import AIMessage, SystemMessage
23
23
  from langchain_core.runnables import RunnableLambda
24
24
  from langchain_core.tools import BaseTool, StructuredTool
25
+ from langgraph.errors import GraphInterrupt
26
+ from langgraph.types import Interrupt
25
27
  from pydantic import BaseModel, Field
26
28
  from quickjs_rs import Runtime, ThreadWorker
27
29
 
@@ -31,6 +33,7 @@ from langchain_quickjs._repl import _clear_exception_references, _Registry, _Thr
31
33
  from langchain_quickjs._subagent import (
32
34
  _ensure_schema_title,
33
35
  _runtime_with_response_format,
36
+ call_subagent_task_tool,
34
37
  )
35
38
 
36
39
  if TYPE_CHECKING:
@@ -872,6 +875,74 @@ def _subagent_runtime(
872
875
  return _subagent_runtime_from_task_tool(_task_tool_for_runnable(runnable))
873
876
 
874
877
 
878
+ async def test_call_subagent_task_tool_forwards_config_and_tool_call_id() -> None:
879
+ calls: list[dict[str, Any]] = []
880
+
881
+ class _TaskTool:
882
+ name = "task"
883
+
884
+ async def arun(
885
+ self,
886
+ tool_input: dict[str, Any],
887
+ *,
888
+ config: dict[str, Any] | None = None,
889
+ tool_call_id: str | None = None,
890
+ ) -> str:
891
+ calls.append(
892
+ {
893
+ "tool_input": tool_input,
894
+ "config": config,
895
+ "tool_call_id": tool_call_id,
896
+ }
897
+ )
898
+ return "ok"
899
+
900
+ runtime = ToolRuntime(
901
+ state={},
902
+ context={},
903
+ config={"configurable": {"thread_id": "parent-thread"}},
904
+ stream_writer=lambda _chunk: None,
905
+ tools=[],
906
+ tool_call_id="outer_eval_call",
907
+ store=None,
908
+ )
909
+
910
+ result = await call_subagent_task_tool(
911
+ cast("BaseTool", _TaskTool()),
912
+ description="work",
913
+ subagent_type="worker",
914
+ response_schema=None,
915
+ runtime=runtime,
916
+ )
917
+
918
+ assert result == "ok"
919
+ assert calls
920
+ assert calls[0]["config"] == runtime.config
921
+ assert calls[0]["tool_call_id"].startswith("ptc_task_")
922
+ assert calls[0]["tool_input"]["runtime"].tool_call_id == calls[0]["tool_call_id"]
923
+
924
+
925
+ async def test_async_task_global_propagates_graph_interrupt(repl: _ThreadREPL) -> None:
926
+ interrupt = GraphInterrupt([Interrupt(value={"action_requests": []})])
927
+
928
+ async def _async(state: dict[str, Any], config: Any) -> dict[str, Any]:
929
+ del state, config
930
+ raise interrupt
931
+
932
+ runnable = RunnableLambda(
933
+ lambda state, config: {"messages": [AIMessage(content="sync")]},
934
+ afunc=_async,
935
+ )
936
+
937
+ with pytest.raises(GraphInterrupt) as exc_info:
938
+ await repl.eval_async(
939
+ "await task({description: 'work', subagentType: 'worker'})",
940
+ outer_runtime=_subagent_runtime(runnable),
941
+ )
942
+
943
+ assert exc_info.value is interrupt
944
+
945
+
875
946
  def test_runtime_with_response_format_uses_configurable() -> None:
876
947
  runtime = _subagent_runtime(
877
948
  RunnableLambda(lambda _state, _config: {"messages": [AIMessage(content="ok")]})
@@ -467,7 +467,7 @@ wheels = [
467
467
 
468
468
  [[package]]
469
469
  name = "deepagents"
470
- version = "0.6.11"
470
+ version = "0.6.12"
471
471
  source = { editable = "../../deepagents" }
472
472
  dependencies = [
473
473
  { name = "langchain" },
@@ -480,21 +480,26 @@ dependencies = [
480
480
 
481
481
  [package.metadata]
482
482
  requires-dist = [
483
- { name = "langchain", specifier = ">=1.3.10,<2.0.0" },
484
- { name = "langchain-anthropic", specifier = ">=1.4.6,<2.0.0" },
485
- { name = "langchain-core", specifier = ">=1.4.7,<2.0.0" },
486
- { name = "langchain-google-genai", specifier = ">=4.2.5,<5.0.0" },
487
- { name = "langchain-quickjs", marker = "extra == 'quickjs'" },
488
- { name = "langsmith", specifier = ">=0.8.11" },
483
+ { name = "av", marker = "extra == 'video'", specifier = ">=17.0.0,<18.0.0" },
484
+ { name = "langchain", specifier = ">=1.3.12,<2.0.0" },
485
+ { name = "langchain-anthropic", specifier = ">=1.4.8,<2.0.0" },
486
+ { name = "langchain-aws", marker = "extra == 'aws'", specifier = ">=1.6.2,<2.0.0" },
487
+ { name = "langchain-core", specifier = ">=1.4.9,<2.0.0" },
488
+ { name = "langchain-google-genai", specifier = ">=4.2.7,<5.0.0" },
489
+ { name = "langchain-quickjs", marker = "extra == 'quickjs'", specifier = ">=0.3.2" },
490
+ { name = "langsmith", specifier = ">=0.9.3" },
491
+ { name = "pillow", marker = "extra == 'video'", specifier = ">=10.0.0,<13.0.0" },
489
492
  { name = "wcmatch", specifier = ">=10.1" },
490
493
  ]
491
- provides-extras = ["quickjs"]
494
+ provides-extras = ["aws", "quickjs", "video"]
492
495
 
493
496
  [package.metadata.requires-dev]
494
497
  test = [
498
+ { name = "av", specifier = ">=17.0.0,<18.0.0" },
495
499
  { name = "build" },
496
500
  { name = "langchain-openai" },
497
501
  { name = "langchain-tests", specifier = ">=1.1.9" },
502
+ { name = "pillow", specifier = ">=10.0.0,<13.0.0" },
498
503
  { name = "pytest" },
499
504
  { name = "pytest-asyncio", specifier = ">=1.4.0" },
500
505
  { name = "pytest-benchmark" },
@@ -504,9 +509,9 @@ test = [
504
509
  { name = "pytest-timeout", specifier = ">=2.4.0,<3.0.0" },
505
510
  { name = "pytest-watcher", specifier = ">=0.6.3,<1.0.0" },
506
511
  { name = "pytest-xdist" },
507
- { name = "ruff", specifier = ">=0.15.16,<0.16.0" },
512
+ { name = "ruff", specifier = ">=0.15.20,<0.16.0" },
508
513
  { name = "twine" },
509
- { name = "ty", specifier = ">=0.0.46,<1.0.0" },
514
+ { name = "ty", specifier = ">=0.0.54,<1.0.0" },
510
515
  ]
511
516
 
512
517
  [[package]]
@@ -862,35 +867,35 @@ wheels = [
862
867
 
863
868
  [[package]]
864
869
  name = "langchain"
865
- version = "1.3.10"
870
+ version = "1.3.14"
866
871
  source = { registry = "https://pypi.org/simple" }
867
872
  dependencies = [
868
873
  { name = "langchain-core" },
869
874
  { name = "langgraph" },
870
875
  { name = "pydantic" },
871
876
  ]
872
- sdist = { url = "https://files.pythonhosted.org/packages/3b/f6/e351d85c7828b9b90c5729de66170457c882c754efef0712904cfcd3192d/langchain-1.3.10.tar.gz", hash = "sha256:fd6ac9da86c479e4ff376e772d9e17a9232bd3113e9f2ddcb70cdc4bf7afc119", size = 632522, upload-time = "2026-06-18T19:43:00.86Z" }
877
+ sdist = { url = "https://files.pythonhosted.org/packages/29/68/a6dbad9c22df4087a0f9e79ddd46226c442b30128bfeee538d5889492a73/langchain-1.3.14.tar.gz", hash = "sha256:1b6696c72ba3bbbce54d745e0180742c9f6ece8bbc59ed5a46c3e20b9a435929", size = 645181, upload-time = "2026-07-16T13:28:18.29Z" }
873
878
  wheels = [
874
- { url = "https://files.pythonhosted.org/packages/59/f6/a682e68d004a2e23cae6c5c42e3c0d071bc0e7768167bd12277992f096f9/langchain-1.3.10-py3-none-any.whl", hash = "sha256:5da67f21aa56119744ad51b3e46ffac570c88f4fae0876e3b1c6a1c4bc0e344e", size = 133038, upload-time = "2026-06-18T19:42:58.918Z" },
879
+ { url = "https://files.pythonhosted.org/packages/a9/ec/0f942e78a621f8e3162ff1ed24284f469aaf51fb4607ee5831c626f2b2bc/langchain-1.3.14-py3-none-any.whl", hash = "sha256:4d10dbe91005952cddd56d0dc77aa108964da6bae90ab20063653957e901f782", size = 139560, upload-time = "2026-07-16T13:28:16.498Z" },
875
880
  ]
876
881
 
877
882
  [[package]]
878
883
  name = "langchain-anthropic"
879
- version = "1.4.6"
884
+ version = "1.4.8"
880
885
  source = { registry = "https://pypi.org/simple" }
881
886
  dependencies = [
882
887
  { name = "anthropic" },
883
888
  { name = "langchain-core" },
884
889
  { name = "pydantic" },
885
890
  ]
886
- sdist = { url = "https://files.pythonhosted.org/packages/e1/f5/cd397b94aeed5fa0e8ab9595b9fb578ac99f424d42220defe6626e6a1a7b/langchain_anthropic-1.4.6.tar.gz", hash = "sha256:78942d4458d883b7d362438a095ed501ed84f44d402622404482481fc973b9da", size = 706540, upload-time = "2026-06-12T16:54:15.352Z" }
891
+ sdist = { url = "https://files.pythonhosted.org/packages/98/22/40ab129b08329ca295b391aa1d48267692b42594757084c6918e22b655ac/langchain_anthropic-1.4.8.tar.gz", hash = "sha256:c76891b2044d56105ff13c106ed12650637b53bd598a4bdf15b4796eefa2a4ec", size = 708524, upload-time = "2026-06-26T21:28:46.916Z" }
887
892
  wheels = [
888
- { url = "https://files.pythonhosted.org/packages/26/af/927dbbc5a1f5fea1a69adc2883f034cbd1430004e36f4eacd302d500393a/langchain_anthropic-1.4.6-py3-none-any.whl", hash = "sha256:dbd412a956b6b8b0716d9d8460ef71f834a6731cdbfc59e6160482a4a9fb5200", size = 51797, upload-time = "2026-06-12T16:54:14.159Z" },
893
+ { url = "https://files.pythonhosted.org/packages/b7/14/746235c4da89d9bc6a608c5f489f628e03feb8f697195c146e452c8f23c8/langchain_anthropic-1.4.8-py3-none-any.whl", hash = "sha256:778e9301b6fd517824f76ec1776975ce8add97a1f6a36c50ae3c2f4b03a66f7f", size = 52366, upload-time = "2026-06-26T21:28:45.535Z" },
889
894
  ]
890
895
 
891
896
  [[package]]
892
897
  name = "langchain-core"
893
- version = "1.4.7"
898
+ version = "1.4.9"
894
899
  source = { registry = "https://pypi.org/simple" }
895
900
  dependencies = [
896
901
  { name = "jsonpatch" },
@@ -903,14 +908,14 @@ dependencies = [
903
908
  { name = "typing-extensions" },
904
909
  { name = "uuid-utils" },
905
910
  ]
906
- sdist = { url = "https://files.pythonhosted.org/packages/ee/2b/fffaff399d20a56d40b9562fa19701e91abd72d8c9d9bc8c2673077b56b6/langchain_core-1.4.7.tar.gz", hash = "sha256:7a825d77de0a3f39adbd9d09612a75e85527e14a52c1601089bcc062972d9f2b", size = 952522, upload-time = "2026-06-12T19:23:57.588Z" }
911
+ sdist = { url = "https://files.pythonhosted.org/packages/2a/b9/e937d0a90b26540bff07e7a7c64349f3b29c2dcc36257cd1cd3fdce17f2a/langchain_core-1.4.9.tar.gz", hash = "sha256:f8078901145bed0466755277500a5a22822a7b628808c4c0a28d4fc88895fcf2", size = 967294, upload-time = "2026-07-08T20:06:54.191Z" }
907
912
  wheels = [
908
- { url = "https://files.pythonhosted.org/packages/de/3e/dcdffa60078ae7b3a00ebb4cbbf1a204a14c3609983c604886523a7d4418/langchain_core-1.4.7-py3-none-any.whl", hash = "sha256:bcadd51951140ecdcba98311dbd931ba5de02a5ba8a2288dad5069c1eea2a13d", size = 554941, upload-time = "2026-06-12T19:23:55.826Z" },
913
+ { url = "https://files.pythonhosted.org/packages/84/70/ade2fada52772798ef815b6352b59e71b116aa0c32c3aef5be3dc2cbed12/langchain_core-1.4.9-py3-none-any.whl", hash = "sha256:28e3909e2a10cc81504952d795ac0a9e014c0018121ef89d48dd396fa09ec624", size = 558293, upload-time = "2026-07-08T20:06:52.382Z" },
909
914
  ]
910
915
 
911
916
  [[package]]
912
917
  name = "langchain-google-genai"
913
- version = "4.2.5"
918
+ version = "4.2.7"
914
919
  source = { registry = "https://pypi.org/simple" }
915
920
  dependencies = [
916
921
  { name = "filetype" },
@@ -918,26 +923,26 @@ dependencies = [
918
923
  { name = "langchain-core" },
919
924
  { name = "pydantic" },
920
925
  ]
921
- sdist = { url = "https://files.pythonhosted.org/packages/5e/4b/a1acdba3a86f861d379cb654f234d334c04a4c93178c8c7b0182ddeb9966/langchain_google_genai-4.2.5.tar.gz", hash = "sha256:2abab4be22699a9cc29948b2bf012946f51a0bbf10ab3a4a9a129047234829f8", size = 271850, upload-time = "2026-06-10T01:48:57.06Z" }
926
+ sdist = { url = "https://files.pythonhosted.org/packages/1d/0c/bc60dabc362ca7c6ffe8c4bcc2f724c7e566b43eb230cee51419f88f784c/langchain_google_genai-4.2.7.tar.gz", hash = "sha256:03b1463ffe4d42435f43c7870467f2215f684bb46400d2543435d10157c80ac7", size = 281605, upload-time = "2026-07-06T13:51:58.724Z" }
922
927
  wheels = [
923
- { url = "https://files.pythonhosted.org/packages/6a/82/3d4d3dc181ea1756f323dad4d5936239c2f404ea0acb5102316224280634/langchain_google_genai-4.2.5-py3-none-any.whl", hash = "sha256:289699ddb8e1076a76144f83e25e0086e4ce629b196fc103251f2a629e0756e5", size = 69404, upload-time = "2026-06-10T01:48:56.09Z" },
928
+ { url = "https://files.pythonhosted.org/packages/b2/f9/d73d1e712591723aaddb7a7b1e94978cd2320c29acfe0d26b6169a2f26f0/langchain_google_genai-4.2.7-py3-none-any.whl", hash = "sha256:0d9c388d0e6c629718fca6abb19c6fdca728a9a7873d0324c1ec821288b5b571", size = 70702, upload-time = "2026-07-06T13:51:57.499Z" },
924
929
  ]
925
930
 
926
931
  [[package]]
927
932
  name = "langchain-protocol"
928
- version = "0.0.16"
933
+ version = "0.0.18"
929
934
  source = { registry = "https://pypi.org/simple" }
930
935
  dependencies = [
931
936
  { name = "typing-extensions" },
932
937
  ]
933
- sdist = { url = "https://files.pythonhosted.org/packages/36/e7/8300ba22d968653051fd06e3117d783872dddf3dcebdd6b1d386836eb43c/langchain_protocol-0.0.16.tar.gz", hash = "sha256:806c7cdd951b1c4f692fa40fce60821ff0f221d4360e27673ddf2c2b99c2b7ff", size = 5969, upload-time = "2026-05-28T23:05:11.121Z" }
938
+ sdist = { url = "https://files.pythonhosted.org/packages/d2/59/b5959aea96faa9146e2e49a7a22882b3528c62efafe9a6a95beab30c2305/langchain_protocol-0.0.18.tar.gz", hash = "sha256:ec3e11782f1ed0c9db38e5a9ed01b0e7a0d3fba406faa8aef6594b73c56a63e6", size = 6150, upload-time = "2026-06-18T17:08:26.959Z" }
934
939
  wheels = [
935
- { url = "https://files.pythonhosted.org/packages/1f/9c/06dfcc88d02a6364e8d864c421ddd3736305cb0a6c853f75c302c80fe17c/langchain_protocol-0.0.16-py3-none-any.whl", hash = "sha256:3658c142c5d0fb3a023a4be442ce4c15c6d626aab6135eb79a76dc64ad19c3c3", size = 7037, upload-time = "2026-05-28T23:05:10.163Z" },
940
+ { url = "https://files.pythonhosted.org/packages/99/2e/d82db9eec13ad0f72e7aaad5c4bc730ab111934fdc83c85523206eb9b0a0/langchain_protocol-0.0.18-py3-none-any.whl", hash = "sha256:70b53a86fbf9cedc863555effe44da192ab02d556ddbf2cf95b8873adcf41b5a", size = 7221, upload-time = "2026-06-18T17:08:25.996Z" },
936
941
  ]
937
942
 
938
943
  [[package]]
939
944
  name = "langchain-quickjs"
940
- version = "0.3.2"
945
+ version = "0.3.3"
941
946
  source = { editable = "." }
942
947
  dependencies = [
943
948
  { name = "bsdiff4" },
@@ -972,10 +977,10 @@ test = [
972
977
  requires-dist = [
973
978
  { name = "bsdiff4", specifier = ">=1.2.6,<2.0.0" },
974
979
  { name = "deepagents", editable = "../../deepagents" },
975
- { name = "langchain", specifier = ">=1.3.9,<2.0.0" },
976
- { name = "langchain-core", specifier = ">=1.4.7,<2.0.0" },
977
- { name = "langgraph", specifier = ">=1.2.5,<2.0.0" },
978
- { name = "quickjs-rs", specifier = ">=0.2.3,<0.3.0" },
980
+ { name = "langchain", specifier = ">=1.3.14,<2.0.0" },
981
+ { name = "langchain-core", specifier = ">=1.4.9,<2.0.0" },
982
+ { name = "langgraph", specifier = ">=1.2.9,<2.0.0" },
983
+ { name = "quickjs-rs", specifier = ">=0.2.4,<0.3.0" },
979
984
  ]
980
985
 
981
986
  [package.metadata.requires-dev]
@@ -983,7 +988,7 @@ test = [
983
988
  { name = "build" },
984
989
  { name = "langgraph-checkpoint-postgres", specifier = ">=3.1.0,<4.0.0" },
985
990
  { name = "psycopg", extras = ["binary"], specifier = ">=3.3.4,<4.0.0" },
986
- { name = "pytest", specifier = ">=9.0.3,<10.0.0" },
991
+ { name = "pytest", specifier = ">=9.1.1,<10.0.0" },
987
992
  { name = "pytest-asyncio", specifier = ">=1.4.0" },
988
993
  { name = "pytest-benchmark" },
989
994
  { name = "pytest-codspeed", specifier = ">=5.0.3,<6.0.0" },
@@ -992,15 +997,15 @@ test = [
992
997
  { name = "pytest-timeout", specifier = ">=2.4.0,<3.0.0" },
993
998
  { name = "pytest-watcher", specifier = ">=0.6.3,<1.0.0" },
994
999
  { name = "pytest-xdist" },
995
- { name = "ruff", specifier = ">=0.15.16,<0.16.0" },
1000
+ { name = "ruff", specifier = ">=0.15.20,<0.16.0" },
996
1001
  { name = "testcontainers", extras = ["postgres"], specifier = ">=4.14.2,<5.0.0" },
997
1002
  { name = "twine" },
998
- { name = "ty", specifier = ">=0.0.46,<1.0.0" },
1003
+ { name = "ty", specifier = ">=0.0.54,<1.0.0" },
999
1004
  ]
1000
1005
 
1001
1006
  [[package]]
1002
1007
  name = "langgraph"
1003
- version = "1.2.5"
1008
+ version = "1.2.9"
1004
1009
  source = { registry = "https://pypi.org/simple" }
1005
1010
  dependencies = [
1006
1011
  { name = "langchain-core" },
@@ -1010,22 +1015,22 @@ dependencies = [
1010
1015
  { name = "pydantic" },
1011
1016
  { name = "xxhash" },
1012
1017
  ]
1013
- sdist = { url = "https://files.pythonhosted.org/packages/77/9d/7c9ebd17b95569122e2d2e641f535cf086c870d66bb8e59be33cdba856b3/langgraph-1.2.5.tar.gz", hash = "sha256:09a3bdec6fdb3228623fc78b6f69a1400d383f66348d0b04d0efb692022cc6ef", size = 712532, upload-time = "2026-06-12T20:30:58.498Z" }
1018
+ sdist = { url = "https://files.pythonhosted.org/packages/41/4b/0d1130e26b41a99dcc88353bbe7162a1f255c4db746bd94024268e6af27b/langgraph-1.2.9.tar.gz", hash = "sha256:385f87bc1802c35af7e0aa479278ecba8582d103515eb48256cb2ddcd42d0bd4", size = 722869, upload-time = "2026-07-10T01:30:14.985Z" }
1014
1019
  wheels = [
1015
- { url = "https://files.pythonhosted.org/packages/a2/03/187281cf61845c5a9c397ae6cd9cd73bb54b39435e5575a7b83c853e5b76/langgraph-1.2.5-py3-none-any.whl", hash = "sha256:9286bb5def82fc865959c14378fe473518dc097d586225f622f029637a2a4bb9", size = 246150, upload-time = "2026-06-12T20:30:57.018Z" },
1020
+ { url = "https://files.pythonhosted.org/packages/41/16/0b8dc48823f1326f3e0c8012a3c07a40da6f194299e2ec080df236287baf/langgraph-1.2.9-py3-none-any.whl", hash = "sha256:c2d98ad94333937922ba04148641c1da2bfe45b5b8e55d7b6dcb0bb2df809e76", size = 247473, upload-time = "2026-07-10T01:30:13.733Z" },
1016
1021
  ]
1017
1022
 
1018
1023
  [[package]]
1019
1024
  name = "langgraph-checkpoint"
1020
- version = "4.1.0"
1025
+ version = "4.1.1"
1021
1026
  source = { registry = "https://pypi.org/simple" }
1022
1027
  dependencies = [
1023
1028
  { name = "langchain-core" },
1024
1029
  { name = "ormsgpack" },
1025
1030
  ]
1026
- sdist = { url = "https://files.pythonhosted.org/packages/02/b4/6005c5dd88ad484fe6235d4c43a0d2cee7e91b08ad85a180985c2662df87/langgraph_checkpoint-4.1.0.tar.gz", hash = "sha256:e5bb304e30fc1363ac8fcb5f7dee5ca2185d77fe475b0d01de2c5f91324c2c21", size = 181942, upload-time = "2026-05-12T03:33:49.888Z" }
1031
+ sdist = { url = "https://files.pythonhosted.org/packages/83/47/886af6f886f0bff2273164a45f008694e48a96ff3cd25ff0228f2aa9480e/langgraph_checkpoint-4.1.1.tar.gz", hash = "sha256:6c2bdb530c91f91d7d9c1bd100925d0fc4f498d418c17f3587d1526279482a25", size = 184020, upload-time = "2026-05-22T16:57:38.503Z" }
1027
1032
  wheels = [
1028
- { url = "https://files.pythonhosted.org/packages/93/74/d3be2b41955e20ccd624dba5f6fe9d38dcee385ba470a6e13ed86732fc86/langgraph_checkpoint-4.1.0-py3-none-any.whl", hash = "sha256:8bc2a0466a20c38b865ce6671b42093fd5c041133f32351cae4222e0eeaf7fb5", size = 56047, upload-time = "2026-05-12T03:33:48.548Z" },
1033
+ { url = "https://files.pythonhosted.org/packages/bd/b4/71425e3e38be92611300b9cc5e46a5bf98ab23f5ea8a75b73d02a2f1413c/langgraph_checkpoint-4.1.1-py3-none-any.whl", hash = "sha256:25d29144b082827218e7bc3f1e9b0566a4bb007895cd6cc26f66a8428739f56e", size = 56212, upload-time = "2026-05-22T16:57:37.203Z" },
1029
1034
  ]
1030
1035
 
1031
1036
  [[package]]
@@ -1074,23 +1079,27 @@ wheels = [
1074
1079
 
1075
1080
  [[package]]
1076
1081
  name = "langsmith"
1077
- version = "0.9.0"
1082
+ version = "0.9.3"
1078
1083
  source = { registry = "https://pypi.org/simple" }
1079
1084
  dependencies = [
1085
+ { name = "anyio" },
1086
+ { name = "distro" },
1080
1087
  { name = "httpx" },
1081
1088
  { name = "orjson", marker = "platform_python_implementation != 'PyPy'" },
1082
1089
  { name = "packaging" },
1083
1090
  { name = "pydantic" },
1084
1091
  { name = "requests" },
1085
1092
  { name = "requests-toolbelt" },
1093
+ { name = "sniffio" },
1094
+ { name = "typing-extensions" },
1086
1095
  { name = "uuid-utils" },
1087
1096
  { name = "websockets" },
1088
1097
  { name = "xxhash" },
1089
1098
  { name = "zstandard" },
1090
1099
  ]
1091
- sdist = { url = "https://files.pythonhosted.org/packages/92/34/a77abacdece10440fa04d8b2afd884708a98f62ff271ee79d75bcb8bb9bc/langsmith-0.9.0.tar.gz", hash = "sha256:21b381462ee44713dd5e2163b7db44fb28fde65146aad27aeabd778c464da0f0", size = 4556365, upload-time = "2026-06-22T15:37:18.733Z" }
1100
+ sdist = { url = "https://files.pythonhosted.org/packages/7e/b7/43f80940a758ceb48714ccc10c7acb9564be4f0d4786e8ed5d46deb0be39/langsmith-0.9.3.tar.gz", hash = "sha256:868a007b3ecda002914b21212a953c77fcb1d71a8a09a94562c3b57941d3df3a", size = 4577380, upload-time = "2026-06-26T15:56:30.45Z" }
1092
1101
  wheels = [
1093
- { url = "https://files.pythonhosted.org/packages/c6/64/d411be633d1c976955a09f6b3c58fbe70592d1370d262d171f7daf7e3793/langsmith-0.9.0-py3-none-any.whl", hash = "sha256:5eeccc36ff956946df8510a2b3b5a87d36c44f11bfb2e5205e9cf03d7b65ec9c", size = 578496, upload-time = "2026-06-22T15:37:16.42Z" },
1102
+ { url = "https://files.pythonhosted.org/packages/9e/fb/dc9f70b5581371fba7b01ba0704fe859bfcd12c4dad82b42ec12bd4160b1/langsmith-0.9.3-py3-none-any.whl", hash = "sha256:aac85686868a7e61d77858b880230e510583c61ea48ac0a197e6ceff64ffb22b", size = 619927, upload-time = "2026-06-26T15:56:28.301Z" },
1094
1103
  ]
1095
1104
 
1096
1105
  [[package]]
@@ -1548,7 +1557,7 @@ wheels = [
1548
1557
 
1549
1558
  [[package]]
1550
1559
  name = "pytest"
1551
- version = "9.0.3"
1560
+ version = "9.1.1"
1552
1561
  source = { registry = "https://pypi.org/simple" }
1553
1562
  dependencies = [
1554
1563
  { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -1557,9 +1566,9 @@ dependencies = [
1557
1566
  { name = "pluggy" },
1558
1567
  { name = "pygments" },
1559
1568
  ]
1560
- sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" }
1569
+ sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
1561
1570
  wheels = [
1562
- { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" },
1571
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
1563
1572
  ]
1564
1573
 
1565
1574
  [[package]]
@@ -1779,14 +1788,14 @@ wheels = [
1779
1788
 
1780
1789
  [[package]]
1781
1790
  name = "quickjs-rs"
1782
- version = "0.2.3"
1791
+ version = "0.2.4"
1783
1792
  source = { registry = "https://pypi.org/simple" }
1784
1793
  dependencies = [
1785
1794
  { name = "wasmtime" },
1786
1795
  ]
1787
- sdist = { url = "https://files.pythonhosted.org/packages/46/d5/3657636d9cdff1b2e76e17c210a52704158f13149e7f8175cb533bb64ca2/quickjs_rs-0.2.3.tar.gz", hash = "sha256:5715bb3b6c7583999a4f053a4547fb149c70a9ef0962aa93884cbfb89fb5a471", size = 829047, upload-time = "2026-06-22T20:40:56.372Z" }
1796
+ sdist = { url = "https://files.pythonhosted.org/packages/61/34/1b63bc3db8d950139618d1d38eff5648e5aaa53b2982da5ec121fcf72c63/quickjs_rs-0.2.4.tar.gz", hash = "sha256:7226d18bfa05d97fd629348b7d71512dab4da12bfbe29bdd50486bfc10858cc9", size = 829056, upload-time = "2026-06-24T19:42:21.6Z" }
1788
1797
  wheels = [
1789
- { url = "https://files.pythonhosted.org/packages/b7/fe/637b4128ee76febedc18350329099a764024736eafa79b72635b928a7b80/quickjs_rs-0.2.3-py3-none-any.whl", hash = "sha256:52879678d62dea10f7f30c5821f217a75a2c6d51a3f4c3059d0eacf319b9a889", size = 799751, upload-time = "2026-06-22T20:40:54.697Z" },
1798
+ { url = "https://files.pythonhosted.org/packages/9d/5f/38a30bdfc4fd0a369f1cfe394ea51fbb43a7e492ffe4006f212d24ab05c5/quickjs_rs-0.2.4-py3-none-any.whl", hash = "sha256:3b497b712c4e94401d5617a4c5808b290e2d6bac8e147b315e880306145ae734", size = 799749, upload-time = "2026-06-24T19:42:19.707Z" },
1790
1799
  ]
1791
1800
 
1792
1801
  [[package]]
@@ -1854,27 +1863,27 @@ wheels = [
1854
1863
 
1855
1864
  [[package]]
1856
1865
  name = "ruff"
1857
- version = "0.15.16"
1858
- source = { registry = "https://pypi.org/simple" }
1859
- sdist = { url = "https://files.pythonhosted.org/packages/a6/bd/5f7ec371001337d8fa61701c186ff8b613ecac1651848c5950f4c4d5f2e9/ruff-0.15.16.tar.gz", hash = "sha256:d05e78d38c78caf020b03789e25106c93017db5a0cb6e2819885018c61343b78", size = 4714267, upload-time = "2026-06-04T16:33:09.974Z" }
1860
- wheels = [
1861
- { url = "https://files.pythonhosted.org/packages/0c/42/53ef1c3953f157956db9bf7861e3bc50b9b887ce93300aa48cdba8336fe6/ruff-0.15.16-py3-none-linux_armv6l.whl", hash = "sha256:6ac3c0b3969cc6cf6b158c4e2f8f682acb58e7d700d8a44b65ecdc72d66ab0b2", size = 10709025, upload-time = "2026-06-04T16:32:51.935Z" },
1862
- { url = "https://files.pythonhosted.org/packages/93/9a/a79159346f19134a956607754e57d8d128f7a4c00f4ad2f7514d224c172c/ruff-0.15.16-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:197c207ed75ffba54a0dec23db4aa939a27a3053073e085e0042433cbdc58e4a", size = 11063550, upload-time = "2026-06-04T16:32:42.24Z" },
1863
- { url = "https://files.pythonhosted.org/packages/bc/72/3ce2ac000a5299ec238e01f51397b3b653c93b077d9b1bfe8715bb895f20/ruff-0.15.16-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3a39fec45ab316cc23e7558f23fea4a70403ddb5648ea9a4a3854a16973d0071", size = 10421345, upload-time = "2026-06-04T16:32:37.251Z" },
1864
- { url = "https://files.pythonhosted.org/packages/b0/c2/cc7fad3ec9169373f5b6a18f1917b91080feec40c3f9658334a1d28e2f03/ruff-0.15.16-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba93191d79003116b95128c9d306e045200fdbd0bccb782b110f3cd1d4abc5cf", size = 10757217, upload-time = "2026-06-04T16:32:54.722Z" },
1865
- { url = "https://files.pythonhosted.org/packages/69/d2/3474009eaa0a65b31fa7152a2fad5e2f050c640ceb1e6b02ee6922e94c82/ruff-0.15.16-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6ee4b90520630120ef032aa5cc10db483852dff950e78b1d717e2993a61ac8d", size = 10507035, upload-time = "2026-06-04T16:33:05.343Z" },
1866
- { url = "https://files.pythonhosted.org/packages/ca/81/b7ae6ccbd11f0c8dc3d5d67fc4be9b57ff57ca86ba56152021378e1277f2/ruff-0.15.16-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e4215bc938bc3c8215c1472c1aa437e310fee20cd427335fec9d7e609563628", size = 11255291, upload-time = "2026-06-04T16:32:49.49Z" },
1867
- { url = "https://files.pythonhosted.org/packages/d9/e1/46e526f1a7cc90857ce6ddf25fbb77eb6568651ac38d71b033af07076dd5/ruff-0.15.16-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c8d26be963b090f10e29abc8b3e74a2a321f6fa34e02424e30b5af89350ecbb", size = 12124922, upload-time = "2026-06-04T16:33:07.821Z" },
1868
- { url = "https://files.pythonhosted.org/packages/1a/da/5c791b088b596b24d0deb967fa28ae02ad751a140c0b9ea81c5ab915d6c0/ruff-0.15.16-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f198cf4123602a2280ed46c307bcbafe41758d6fee5b456b6b6058ca1514b3b4", size = 11332186, upload-time = "2026-06-04T16:33:02.971Z" },
1869
- { url = "https://files.pythonhosted.org/packages/72/11/5da87abe20047c8962361473923ebb2f62b595250126aadfad8c20649c1e/ruff-0.15.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb27515fa6240fb586ae82b901a59e67d24acff86f2190b433dc542fe0435aeb", size = 11373541, upload-time = "2026-06-04T16:32:47.007Z" },
1870
- { url = "https://files.pythonhosted.org/packages/fe/2a/8554754c23a854ae3fd6b507e36ad61ddb121e298c6d5d617dec94ed0f14/ruff-0.15.16-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a267c46ba1593fc26b8eecbea050b39d40c0b6bb7781ee11c90a02cd10032951", size = 11353014, upload-time = "2026-06-04T16:32:34.795Z" },
1871
- { url = "https://files.pythonhosted.org/packages/62/25/62ea41529ec89f742ea3fed9cb1059c72877ec7cf9b9e99ac9cf3294d1d9/ruff-0.15.16-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:528c68f39a91498a8d50e91ff5985df3d105782bab49cc378e73ac26bff083e8", size = 10737467, upload-time = "2026-06-04T16:32:26.348Z" },
1872
- { url = "https://files.pythonhosted.org/packages/90/17/334d3ad9de4d40f9dd58fdd09e35ce64553bb501e2f19a839e2fb6be14fc/ruff-0.15.16-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7ed55c58950df60589a9a7a5d2f8fa5f54ebd287163be805adfe6ee95a9de123", size = 10521910, upload-time = "2026-06-04T16:32:32.54Z" },
1873
- { url = "https://files.pythonhosted.org/packages/4d/bd/3ac7c6ae77a885c1004b3dda2446ea401768d24f851c14b4ad4b24f6639c/ruff-0.15.16-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d482feaf51512b50f9790ceb417a56a61dd1e9d9bf967662b9ed27c01b34f53a", size = 10979190, upload-time = "2026-06-04T16:32:57.492Z" },
1874
- { url = "https://files.pythonhosted.org/packages/33/d7/609546e6a413c3f216fbf2a50c928f97c80939154f6a0503114094a86191/ruff-0.15.16-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1e15bc8c94513dae2a40cc9ef07c94fdd4ecc9e29dabebeebe170f952322c9e3", size = 11477014, upload-time = "2026-06-04T16:32:44.687Z" },
1875
- { url = "https://files.pythonhosted.org/packages/74/0d/f2cd247ad32633a5c36e97141a2c21b11c6279f7957bc2ff360b1e08fddd/ruff-0.15.16-py3-none-win32.whl", hash = "sha256:580378f7bd4aa25f72e74aa54948a9622f142b1e509521dd10902e886681cc1e", size = 10735541, upload-time = "2026-06-04T16:32:30.145Z" },
1876
- { url = "https://files.pythonhosted.org/packages/8b/9e/02e845ef151b1dee585e55c4739f8e1734ae1d9f1221dff65761c162208b/ruff-0.15.16-py3-none-win_amd64.whl", hash = "sha256:408256017284eddf98fff77b29aa4fb30f586042d535b2d9befc6512f400aaec", size = 11843403, upload-time = "2026-06-04T16:32:39.76Z" },
1877
- { url = "https://files.pythonhosted.org/packages/15/19/016553f86f207450aebebc2b2b5088d086b901cc8186c02ac4284db3bd88/ruff-0.15.16-py3-none-win_arm64.whl", hash = "sha256:8cd61783afb39638a7133ef0d2dfb1e91277593962f81b5a8423eb0b888a6121", size = 11134555, upload-time = "2026-06-04T16:33:00.136Z" },
1866
+ version = "0.15.20"
1867
+ source = { registry = "https://pypi.org/simple" }
1868
+ sdist = { url = "https://files.pythonhosted.org/packages/43/dc/35b341fc554ba02f217fc10da57d1a75168cfbcf75b0ef2202176d4c4f2d/ruff-0.15.20.tar.gz", hash = "sha256:1416eb04349192646b54de98f146c4f59afe37d0decfc02c3cbbf396f3a28566", size = 4755489, upload-time = "2026-06-25T17:20:37.578Z" }
1869
+ wheels = [
1870
+ { url = "https://files.pythonhosted.org/packages/94/d9/2d5014f0253ba541d2061d9fa7193f48e941c8b21bb88a7ff9bbe0bd0596/ruff-0.15.20-py3-none-linux_armv6l.whl", hash = "sha256:00e188c53e499c3c1637f73c91dcf2fb56d576cab76ce1be50a27c4e80e37078", size = 10839665, upload-time = "2026-06-25T17:19:44.702Z" },
1871
+ { url = "https://files.pythonhosted.org/packages/c6/d3/ac1798ba64f670698867fcfc591d50e7e421bef137db564858f619a30fcf/ruff-0.15.20-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9ebd1fd9b9c95fc0bd7b2761aebec1f030013d2e193a2901b224af68fe47251b", size = 11208649, upload-time = "2026-06-25T17:19:48.787Z" },
1872
+ { url = "https://files.pythonhosted.org/packages/47/47/d3ac899991202095dfcf3d5176be4272642be3cf981a2f1a30f72a2afb95/ruff-0.15.20-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5b16cdd67ca108185cd36dce98c576350c03b1660a751de725fb049193a0632", size = 10622638, upload-time = "2026-06-25T17:19:51.354Z" },
1873
+ { url = "https://files.pythonhosted.org/packages/33/13/4e043fe30aa94d4ff5213a9881fc296d12960f5971b234a5263fdc225312/ruff-0.15.20-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3413bb3c3d2ca6a8208f1f4809cd2dca3c6de6d0b491c0e70847672bde6e6efd", size = 10984227, upload-time = "2026-06-25T17:19:54.044Z" },
1874
+ { url = "https://files.pythonhosted.org/packages/76/e6/92e7bf40388bc5800073b96564f56264f7e48bfd1a498f5ced6ae6d5a769/ruff-0.15.20-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd7ec42b3bb3da066488db093308a69c4ac5ee6d2af333a86ba6e2eb2e7dd44b", size = 10622882, upload-time = "2026-06-25T17:19:57.037Z" },
1875
+ { url = "https://files.pythonhosted.org/packages/13/7a/43460be3f24495a3aa46d4b16873e2c4941b3b5f0b00cf88c03b7b94b339/ruff-0.15.20-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1a36ad0eb77fba9aabfb69ede54de6f376d04ac18ebea022847046d340a8267", size = 11474808, upload-time = "2026-06-25T17:20:00.357Z" },
1876
+ { url = "https://files.pythonhosted.org/packages/27/a0/f37077884873221c6b33b4ab49eb18f9f88e54a16a25a5bca59bef46dd66/ruff-0.15.20-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6df3b1e4610432f0386dba04d853b5f08cbbc903410c6fcc02f620f05aff53c", size = 12293094, upload-time = "2026-06-25T17:20:03.446Z" },
1877
+ { url = "https://files.pythonhosted.org/packages/a6/74/165545b60256a9704c21ac0ec4a0d07933b320812f9584836c9f4aca4292/ruff-0.15.20-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e89f198a1ea6ef0d727c1cf16088bc91a6cb0ab947dedc966715691647186eae", size = 11526176, upload-time = "2026-06-25T17:20:06.301Z" },
1878
+ { url = "https://files.pythonhosted.org/packages/86/b1/a976a136d40ade83ce743578399865f57001003a409acadc0ecbb3051082/ruff-0.15.20-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309809086c2acb67624950a3c8133e80f32d0d3e27106c0cd60ff26657c9f24b", size = 11520767, upload-time = "2026-06-25T17:20:09.191Z" },
1879
+ { url = "https://files.pythonhosted.org/packages/19/0f/f032696cb01c9b54c0263fa393474d7758f1cdc021a01b04e3cbc2500999/ruff-0.15.20-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2d2374caa2f2c2f9e2b7da0a50802cfb8b79f55a9b5e49379f564544fbf56487", size = 11500132, upload-time = "2026-06-25T17:20:13.602Z" },
1880
+ { url = "https://files.pythonhosted.org/packages/4b/f4/51b1a14bc69e8c224b15dab9cce8e99b425e0455d462caa2b3c9be2b6a8e/ruff-0.15.20-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a1ed17b65293e0c2f22fc387bc13198a5de94bf4429589b0ff6946b0feaf21a3", size = 10943828, upload-time = "2026-06-25T17:20:16.635Z" },
1881
+ { url = "https://files.pythonhosted.org/packages/71/4b/fe267640783cd02bf6c5cc290b1df1051be2ec294c678b5c15fe19e52343/ruff-0.15.20-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f701305e66b38ea6c91882490eb73459796808e4c6362a1b765255e0cdcd4053", size = 10645418, upload-time = "2026-06-25T17:20:19.4Z" },
1882
+ { url = "https://files.pythonhosted.org/packages/b0/c0/a65aa4ec2f5e87a1df32dc3ec1fede434fe3dfd5cbcf3b503cafc676ab54/ruff-0.15.20-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b9c0c367ad8e5d0d5b5b8537864c469a0a0e55417aadfbeca41fa61333be9f4", size = 11211770, upload-time = "2026-06-25T17:20:22.033Z" },
1883
+ { url = "https://files.pythonhosted.org/packages/5a/a4/0caa331d954ae2723d729d351c989cb4ca8b6077d5c6c2cb6de75e98c041/ruff-0.15.20-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:01cc00dd58f0df339d0e902219dd53990ea99996a0344e5d9cc8d45d5307e460", size = 11618698, upload-time = "2026-06-25T17:20:25.259Z" },
1884
+ { url = "https://files.pythonhosted.org/packages/10/9b/5f14927848d2fd4aa891fd88d883788c5a7baba561c7874732364045708c/ruff-0.15.20-py3-none-win32.whl", hash = "sha256:ed65ef510e43a137207e0f01cfcf998aeddb1aeeda5c9d35023e910284d7cf21", size = 10857322, upload-time = "2026-06-25T17:20:28.612Z" },
1885
+ { url = "https://files.pythonhosted.org/packages/fa/f0/fe47c501f9dea92a26d788ff98bb5d92ed4cb4c88792c5c88af6b697dc8e/ruff-0.15.20-py3-none-win_amd64.whl", hash = "sha256:a525c81c70fb0380344dd1d8745d8cc1c890b7fc94a58d5a07bd8eb9557b8415", size = 11993274, upload-time = "2026-06-25T17:20:31.871Z" },
1886
+ { url = "https://files.pythonhosted.org/packages/d7/2b/9555445e1201d92b3195f45cdb153a0b68f24e0a4273f6e3d5ab46e212bb/ruff-0.15.20-py3-none-win_arm64.whl", hash = "sha256:2f5b2a6d614e8700388806a14996c40fab2c47b819ef57d790a34878858ed9ca", size = 11343498, upload-time = "2026-06-25T17:20:35.03Z" },
1878
1887
  ]
1879
1888
 
1880
1889
  [[package]]
@@ -2000,27 +2009,27 @@ wheels = [
2000
2009
 
2001
2010
  [[package]]
2002
2011
  name = "ty"
2003
- version = "0.0.46"
2004
- source = { registry = "https://pypi.org/simple" }
2005
- sdist = { url = "https://files.pythonhosted.org/packages/5a/7d/d95b5a9dea83472006be3ce5e480028c44b34138d84d0172e910f287fb69/ty-0.0.46.tar.gz", hash = "sha256:c6c2d7105b5633b49950b4c3a90d1ed2613eb9d794ad582bbbf6c4ffcb93accf", size = 5832380, upload-time = "2026-06-09T03:28:05.056Z" }
2006
- wheels = [
2007
- { url = "https://files.pythonhosted.org/packages/0e/24/f9f7533c391610521f4164e6b8e37ef72d0c1ee8651bc0d9ce9e658b953b/ty-0.0.46-py3-none-linux_armv6l.whl", hash = "sha256:5e716337994699cbc1a1a7b7a3e6622306f2574c710330f9d9691c2c3d8391b0", size = 11756264, upload-time = "2026-06-09T03:28:20.112Z" },
2008
- { url = "https://files.pythonhosted.org/packages/66/49/ff3d13655b9b5cc8176f4c3446bf7ec2df43c8ad9e5272d4adc5d952fa45/ty-0.0.46-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:51d618dec5403635690d0e3e298cd0ad3d84ebc6a576652939ef30ce96fce4b2", size = 11492723, upload-time = "2026-06-09T03:28:13.23Z" },
2009
- { url = "https://files.pythonhosted.org/packages/82/4a/e7e3209e353c5835c7756339bbcdfda10852407b80fbb9ed46c17241873a/ty-0.0.46-py3-none-macosx_11_0_arm64.whl", hash = "sha256:acbafd6a2351b07a6cf4c945b0b1d47f6d2826faac2526a351dfa74d3a3cc664", size = 10892822, upload-time = "2026-06-09T03:27:51.179Z" },
2010
- { url = "https://files.pythonhosted.org/packages/6c/20/4390c90434a9ddefcecb65e8df00e4c2700e9739dc0baf58bed36d25f713/ty-0.0.46-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de5df602ffd760612ae36602bbad69b0123ff6cffd92e62aa92b7709317d69e3", size = 11408745, upload-time = "2026-06-09T03:27:58.049Z" },
2011
- { url = "https://files.pythonhosted.org/packages/75/0c/f13a1bf9c6798530c773667095a6cf8f73ec9721db359423e7249bff7fbc/ty-0.0.46-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7abf5a10b30d8641faad90f6a19989daec941bb90261159e05cfeb04d2012046", size = 11544432, upload-time = "2026-06-09T03:27:53.519Z" },
2012
- { url = "https://files.pythonhosted.org/packages/56/69/eb3710c13dff846a0362df04fadd8a39b64ccc244c0d02ce5285ede8eae5/ty-0.0.46-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8770404139c6ccee2ce2fc226478cfa4100915133c876c257e52197b8b92051d", size = 12031228, upload-time = "2026-06-09T03:28:29.816Z" },
2013
- { url = "https://files.pythonhosted.org/packages/e9/68/5f5db9c84c1d44acdc67281089b372d9d818ee68123a60c59c66187095e2/ty-0.0.46-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f960d5a6e4860076924d2b86891d9872c4a3daa4663fb416e640b22cf3dbf68e", size = 12596073, upload-time = "2026-06-09T03:28:25.204Z" },
2014
- { url = "https://files.pythonhosted.org/packages/14/be/cfd0bb272e6a1491f6de30c60da1f39c2b3c3524ec64a5c92b71365c9185/ty-0.0.46-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d9000a4a3ed08fc37e8a2ff0b801cde06e1c2af3bc053677744bb5a1b751030", size = 12284885, upload-time = "2026-06-09T03:28:10.58Z" },
2015
- { url = "https://files.pythonhosted.org/packages/a8/3a/2cd541f6320f5d6f70a45725c4e1016efedd5545348bb23b47ffb3e4c724/ty-0.0.46-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1160e6dc86536109ab755f7142f36f4dda5333c8330cf230d61819494d27125", size = 12079480, upload-time = "2026-06-09T03:27:55.847Z" },
2016
- { url = "https://files.pythonhosted.org/packages/de/91/8e0075bc6568fb477e7ef4d805c67fa6902b692cb4419e0bf5ce3c04c5bc/ty-0.0.46-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:b619c0efe007731f8221fa787701bfa4402da7a83eb26c61ae25e77b6ace6384", size = 12316547, upload-time = "2026-06-09T03:28:08.28Z" },
2017
- { url = "https://files.pythonhosted.org/packages/00/28/b96cbfeda019a4044c6a8cd06ff84d08b631d4ba7d9a1e6dc0311df3563a/ty-0.0.46-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ad98fccb6a8a94c4121b993761a0deee602f5826c4162e0a91f4f8118ddadd42", size = 11392846, upload-time = "2026-06-09T03:28:00.418Z" },
2018
- { url = "https://files.pythonhosted.org/packages/3b/d0/4d77f699a95ac7a13b94ca1a58682667cfe974f91557d9e2a9fc0b808a7f/ty-0.0.46-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:74536b13c3cc3f5944408669c202d4c57c3d19ff154732df8e6145718aef9191", size = 11559017, upload-time = "2026-06-09T03:28:17.619Z" },
2019
- { url = "https://files.pythonhosted.org/packages/88/62/1d6f6b51c2b132da8011c6a41ead0c1fd2a0b17ea72304bcf6ce084d581a/ty-0.0.46-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5e50b1e96ced41b609e24ed27d9e4f508584ed7f4d0bb717ca8c8d75d2fd1b7c", size = 11666509, upload-time = "2026-06-09T03:28:22.454Z" },
2020
- { url = "https://files.pythonhosted.org/packages/fe/9a/6643894bc12cb30c281f4c8bf37f6d30c1fbd9484ef39a12b0ea6dae3c1c/ty-0.0.46-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0a7d9f58d26d938e5d2f607481b7a412d8c00d675a1ec72004fa9d6b3b9def99", size = 12180448, upload-time = "2026-06-09T03:28:32.329Z" },
2021
- { url = "https://files.pythonhosted.org/packages/86/68/0f3b7bb03a7da676ef51b1c0af0bde1e500d69d5f0c807ed63b6f30b66dd/ty-0.0.46-py3-none-win32.whl", hash = "sha256:26db0ce89c573e60132d14e9688c9329a1633b1a8c26fe457025c7c406f7d5e6", size = 10960002, upload-time = "2026-06-09T03:28:02.832Z" },
2022
- { url = "https://files.pythonhosted.org/packages/b1/f4/91ff618b2dee39d0633d23e1adac0174aa1de80df17e270acac534034dbc/ty-0.0.46-py3-none-win_amd64.whl", hash = "sha256:90e8e6d446b9cb7cb4bede9fca7b3c99fd1e2355605ecf431c131a51db2a5e93", size = 12097413, upload-time = "2026-06-09T03:28:27.495Z" },
2023
- { url = "https://files.pythonhosted.org/packages/e5/2e/300174fca375a27a7c28dd80e990d857d7b3e3b25980c65063f980aa2f17/ty-0.0.46-py3-none-win_arm64.whl", hash = "sha256:ebd320d82605079b901a095dc4711037a0c488b4ace79a602fef4df0d3f4cf74", size = 11439595, upload-time = "2026-06-09T03:28:15.355Z" },
2012
+ version = "0.0.54"
2013
+ source = { registry = "https://pypi.org/simple" }
2014
+ sdist = { url = "https://files.pythonhosted.org/packages/ae/c6/2ea90406d82cf82b0a68725130da2cc9de161bfa883c7dee4f0d94dbf3ce/ty-0.0.54.tar.gz", hash = "sha256:b6b3cfe174f27744413c898b2488ca52ea76070637095de131698e506b455055", size = 6009000, upload-time = "2026-06-25T17:53:17.098Z" }
2015
+ wheels = [
2016
+ { url = "https://files.pythonhosted.org/packages/b8/26/a83e688e108a29a8630d7075bae47b72614cfa275c88b3166575ca0a8af0/ty-0.0.54-py3-none-linux_armv6l.whl", hash = "sha256:0365ea133d6b028952c22e6412a00da9739bc3b538df3c0a61972bf64d8558f1", size = 11616164, upload-time = "2026-06-25T17:52:29.174Z" },
2017
+ { url = "https://files.pythonhosted.org/packages/85/89/9f3374f9eef0267aed5efbd5544e47cfa6affc94236d929e878a780cf7d7/ty-0.0.54-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0de0cf48918609a3996cc2a4e18e8028fc4d2446bb82df822e9737f53bb9afee", size = 11351250, upload-time = "2026-06-25T17:52:32.181Z" },
2018
+ { url = "https://files.pythonhosted.org/packages/28/11/e0e3f542a6de0e0dd5f503215527f8d9fc141426bd52dbe98fce927ff831/ty-0.0.54-py3-none-macosx_11_0_arm64.whl", hash = "sha256:57c7c6c1fcd2aa29cd40117142c0d45a2b0e6c42817ef58ea8dcb5f59d6ea802", size = 10872162, upload-time = "2026-06-25T17:52:35.206Z" },
2019
+ { url = "https://files.pythonhosted.org/packages/3a/b0/fa369840f1ccd391971f693a8f86c445eb1a0fad61a6e0e773f0871a7a6f/ty-0.0.54-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc179be5a070c5dc7785a5e108eece2ab216978a91f91e11661308749a6c28ee", size = 11419826, upload-time = "2026-06-25T17:52:37.942Z" },
2020
+ { url = "https://files.pythonhosted.org/packages/62/5f/8fbf9b7147cf08cc96cc9f84b9699ae7c7a0a1eb0a4c3d912261351b1cbb/ty-0.0.54-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a0a764e2261f9292adf14bbc91b9d7ef7ee7c00b8f3d9f2563f19ae3605109b", size = 11411732, upload-time = "2026-06-25T17:52:41.124Z" },
2021
+ { url = "https://files.pythonhosted.org/packages/8a/ce/53aa78828f98ce396d5cc0f0878d990c0d70f6bf7704105232399315952f/ty-0.0.54-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2259e1a1f744a5f20f079dcc4061c1464001c75f255aaca7316e422f8f5e5e09", size = 12039318, upload-time = "2026-06-25T17:52:43.981Z" },
2022
+ { url = "https://files.pythonhosted.org/packages/9e/05/5654d4d20376a73cd2e9df8178515c466ff9b2bda15748ee5810c955a265/ty-0.0.54-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8674617617399d4fdd568b3e3a8f87a913df525c80691d732b0744b571b341c8", size = 12625562, upload-time = "2026-06-25T17:52:46.578Z" },
2023
+ { url = "https://files.pythonhosted.org/packages/37/f7/982be4abde816c821c6aeaba133dc34b5346eebbb29dadbf77b8ee46dad9/ty-0.0.54-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e949f7bbfa80a9fa00968924028aa673a505faa234b0b9d1241b7d34373eae14", size = 12175175, upload-time = "2026-06-25T17:52:49.176Z" },
2024
+ { url = "https://files.pythonhosted.org/packages/6a/8b/371fa3d121a1d9c8806a997ec5aa7b6a91912044d936594e6cf04d197471/ty-0.0.54-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a0ce5af9eefe636888377d8ab8ea817239ed96de64fede62c4e5331ae16db5c", size = 11945921, upload-time = "2026-06-25T17:52:51.983Z" },
2025
+ { url = "https://files.pythonhosted.org/packages/dd/76/cab1ff8f6029b657b3fed59add1a2f188df6af26b6d649a6c789139dd88d/ty-0.0.54-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:ad329d1942e23ee428948e673b2a50249f27e164220075b0a2ef8169029c8423", size = 12269965, upload-time = "2026-06-25T17:52:54.697Z" },
2026
+ { url = "https://files.pythonhosted.org/packages/31/2f/c14b36cacacf7cc5ae40c862c34c07fadeba85cb93fd8f328cdac2029270/ty-0.0.54-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6e43124e6ac4cb9702d99facb28c6b2f2574c8a4b8f59eae2632eef4962e3439", size = 11370742, upload-time = "2026-06-25T17:52:57.233Z" },
2027
+ { url = "https://files.pythonhosted.org/packages/db/1b/9e55bb273d3ea8efe165a73e34ae92220593e4dbfe665b8283be9d3eadea/ty-0.0.54-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:994ede70fc1b6f0efc29d0f1fc0d819630bed1d2610eac2e9dabb2840f3f3bf9", size = 11432346, upload-time = "2026-06-25T17:52:59.898Z" },
2028
+ { url = "https://files.pythonhosted.org/packages/db/16/402e8d2b1ab1020a25774f22ec0ba4378617758197278c1ddbc093b64854/ty-0.0.54-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b1d048df26abb433acc5b3bcef214167c7dc9e3341f8f200a3c59702516a0ed0", size = 11707341, upload-time = "2026-06-25T17:53:02.678Z" },
2029
+ { url = "https://files.pythonhosted.org/packages/3b/ca/220599403e1dc864109402c88e22e8793108ec3be41576cd044772023d94/ty-0.0.54-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:651e90094d41c4add3d616e0f2c1c881c6700a2ae3ac191c023c665050ff2cdc", size = 12053427, upload-time = "2026-06-25T17:53:05.983Z" },
2030
+ { url = "https://files.pythonhosted.org/packages/fc/a9/f08df843e3d4422184a847829eb103c49a6118eed7024969a1a706de1c5e/ty-0.0.54-py3-none-win32.whl", hash = "sha256:7e876c9b5130afc6b6e46035a2eecca9b563b78249030296e1089922428d5415", size = 11044018, upload-time = "2026-06-25T17:53:09.582Z" },
2031
+ { url = "https://files.pythonhosted.org/packages/4c/26/230719333d79fae599e3c2da5ac35e36786cdd6c4b4f2a5d5450ce171dc7/ty-0.0.54-py3-none-win_amd64.whl", hash = "sha256:f478476f3222807b4d92f15c5298a8c242f2ed17c724da75f4a8c6b522b4f29a", size = 12107765, upload-time = "2026-06-25T17:53:12.2Z" },
2032
+ { url = "https://files.pythonhosted.org/packages/28/68/b5fcb35ceebffab3e8898bd25e51d0bb77a0c43c50b7a8e3fae56125e4f5/ty-0.0.54-py3-none-win_arm64.whl", hash = "sha256:01ab9eb8c0802d35ae73fa08e4e037963250ee5ee6aa7ed8c8b994e5495db5ef", size = 11498510, upload-time = "2026-06-25T17:53:14.693Z" },
2024
2033
  ]
2025
2034
 
2026
2035
  [[package]]