toolplane-python-client 0.1.0__py3-none-any.whl

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 (81) hide show
  1. toolplane/__init__.py +106 -0
  2. toolplane/common/__init__.py +93 -0
  3. toolplane/common/base_config.py +129 -0
  4. toolplane/common/base_connection_manager.py +171 -0
  5. toolplane/common/base_session_manager.py +321 -0
  6. toolplane/common/base_tool_manager.py +347 -0
  7. toolplane/common/constants.py +47 -0
  8. toolplane/common/utils.py +310 -0
  9. toolplane/core/__init__.py +67 -0
  10. toolplane/core/config.py +107 -0
  11. toolplane/core/connection.py +285 -0
  12. toolplane/core/errors.py +298 -0
  13. toolplane/core/machine.py +480 -0
  14. toolplane/core/request.py +775 -0
  15. toolplane/core/session.py +332 -0
  16. toolplane/core/session_context.py +514 -0
  17. toolplane/core/task.py +130 -0
  18. toolplane/core/tool.py +329 -0
  19. toolplane/http_core/__init__.py +37 -0
  20. toolplane/http_core/http_config.py +97 -0
  21. toolplane/http_core/http_connection.py +409 -0
  22. toolplane/http_core/http_machine.py +298 -0
  23. toolplane/http_core/http_request.py +748 -0
  24. toolplane/http_core/http_session.py +348 -0
  25. toolplane/http_core/http_session_context.py +491 -0
  26. toolplane/http_core/http_task.py +101 -0
  27. toolplane/http_core/http_tool.py +400 -0
  28. toolplane/interfaces/__init__.py +27 -0
  29. toolplane/interfaces/client_interface.py +122 -0
  30. toolplane/interfaces/connection_interface.py +193 -0
  31. toolplane/interfaces/event_interface.py +290 -0
  32. toolplane/interfaces/request_interface.py +439 -0
  33. toolplane/interfaces/session_interface.py +288 -0
  34. toolplane/interfaces/tool_interface.py +441 -0
  35. toolplane/proto/__init__.py +0 -0
  36. toolplane/proto/service_pb2.py +315 -0
  37. toolplane/proto/service_pb2_grpc.py +2240 -0
  38. toolplane/provider_cli.py +268 -0
  39. toolplane/provider_registry.py +77 -0
  40. toolplane/provider_runtime.py +302 -0
  41. toolplane/toolkits/__init__.py +0 -0
  42. toolplane/toolkits/standalone_tools/__init__.py +0 -0
  43. toolplane/toolkits/standalone_tools/create_directory.py +94 -0
  44. toolplane/toolkits/standalone_tools/create_file.py +124 -0
  45. toolplane/toolkits/standalone_tools/file_search.py +229 -0
  46. toolplane/toolkits/standalone_tools/grep_search.py +372 -0
  47. toolplane/toolkits/standalone_tools/launcher.py +146 -0
  48. toolplane/toolkits/standalone_tools/list_dir.py +395 -0
  49. toolplane/toolkits/standalone_tools/read_file.py +346 -0
  50. toolplane/toolkits/standalone_tools/replace_string_in_file.py +407 -0
  51. toolplane/toolkits/standalone_tools/run_tests.py +66 -0
  52. toolplane/toolkits/standalone_tools/semantic_search.py +485 -0
  53. toolplane/toolkits/standalone_tools/standalone_toolkit.py +979 -0
  54. toolplane/toolkits/standalone_tools/test_failure_analysis.py +618 -0
  55. toolplane/toolkits/standalone_tools/test_standalone_toolkit.py +517 -0
  56. toolplane/toolkits/swe/__init__.py +35 -0
  57. toolplane/toolkits/swe/create_directory.py +15 -0
  58. toolplane/toolkits/swe/create_file.py +15 -0
  59. toolplane/toolkits/swe/descriptions.py +273 -0
  60. toolplane/toolkits/swe/execute_bash.py +93 -0
  61. toolplane/toolkits/swe/file_editor.py +775 -0
  62. toolplane/toolkits/swe/file_search.py +16 -0
  63. toolplane/toolkits/swe/finish.py +50 -0
  64. toolplane/toolkits/swe/grep_search.py +19 -0
  65. toolplane/toolkits/swe/list_dir.py +407 -0
  66. toolplane/toolkits/swe/read_file.py +18 -0
  67. toolplane/toolkits/swe/replace_string_in_file.py +17 -0
  68. toolplane/toolkits/swe/search.py +260 -0
  69. toolplane/toolkits/swe/semantic_search.py +20 -0
  70. toolplane/toolkits/swe/str_replace_editor.py +647 -0
  71. toolplane/toolkits/swe/submit.py +29 -0
  72. toolplane/toolkits/swe/swe_toolkit.py +1296 -0
  73. toolplane/toolplane_client.py +686 -0
  74. toolplane/toolplane_http_client.py +681 -0
  75. toolplane/utils/__init__.py +3 -0
  76. toolplane/utils/schema.py +146 -0
  77. toolplane_python_client-0.1.0.dist-info/METADATA +543 -0
  78. toolplane_python_client-0.1.0.dist-info/RECORD +81 -0
  79. toolplane_python_client-0.1.0.dist-info/WHEEL +5 -0
  80. toolplane_python_client-0.1.0.dist-info/entry_points.txt +2 -0
  81. toolplane_python_client-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,543 @@
1
+ Metadata-Version: 2.4
2
+ Name: toolplane-python-client
3
+ Version: 0.1.0
4
+ Summary: Python client for the Toolplane control plane
5
+ Author-email: Abhishek Chohan <54611095+Abhishek-chohan@users.noreply.github.com>
6
+ License: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/Abhishek-chohan/tool-control-plane
8
+ Project-URL: Repository, https://github.com/Abhishek-chohan/tool-control-plane
9
+ Project-URL: Bug Tracker, https://github.com/Abhishek-chohan/tool-control-plane/issues
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: Apache Software License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Requires-Python: >=3.9
20
+ Description-Content-Type: text/markdown
21
+ Requires-Dist: grpcio>=1.80.0
22
+ Requires-Dist: grpcio-tools>=1.80.0
23
+ Requires-Dist: protobuf<7.0.0,>=6.31.1
24
+ Requires-Dist: googleapis-common-protos>=1.63.0
25
+ Requires-Dist: requests>=2.25.0
26
+ Requires-Dist: typing-extensions>=4.0.0
27
+ Requires-Dist: pydantic>=2.0.0
28
+ Provides-Extra: dev
29
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
30
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
31
+ Requires-Dist: black>=23.0.0; extra == "dev"
32
+ Requires-Dist: isort>=5.10.0; extra == "dev"
33
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
34
+ Requires-Dist: flake8>=6.0.0; extra == "dev"
35
+ Requires-Dist: flake8-docstrings>=1.7.0; extra == "dev"
36
+ Requires-Dist: flake8-builtins>=2.0.0; extra == "dev"
37
+ Requires-Dist: flake8-annotations>=3.0.0; extra == "dev"
38
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
39
+ Requires-Dist: coverage>=7.0.0; extra == "dev"
40
+ Requires-Dist: pre-commit>=3.0.0; extra == "dev"
41
+ Requires-Dist: mkdocs>=1.4.0; extra == "dev"
42
+ Requires-Dist: mkdocs-material>=9.0.0; extra == "dev"
43
+ Provides-Extra: docs
44
+ Requires-Dist: mkdocs>=1.4.0; extra == "docs"
45
+ Requires-Dist: mkdocs-material>=9.0.0; extra == "docs"
46
+ Requires-Dist: mkdocstrings[python]>=0.20.0; extra == "docs"
47
+ Provides-Extra: lint
48
+ Requires-Dist: black>=23.0.0; extra == "lint"
49
+ Requires-Dist: isort>=5.10.0; extra == "lint"
50
+ Requires-Dist: mypy>=1.0.0; extra == "lint"
51
+ Requires-Dist: flake8>=6.0.0; extra == "lint"
52
+ Requires-Dist: flake8-docstrings>=1.7.0; extra == "lint"
53
+ Requires-Dist: flake8-builtins>=2.0.0; extra == "lint"
54
+ Requires-Dist: flake8-annotations>=3.0.0; extra == "lint"
55
+
56
+ # Toolplane Python Client
57
+
58
+ The Python package is the primary maintained SDK for Toolplane's durable remote tool-execution control plane. Python is the richest current client surface and the baseline for the repo's end-to-end provider, consumer, and admin capability.
59
+
60
+ ## Decision Rule
61
+
62
+ Use Toolplane when one remote tool may outlive the caller, needs inspection or bounded replay after disconnect, needs explicit provider ownership or drain behavior, or is queue-backed enough that request lifecycle control matters. If the work is quick, in-process, same-lifecycle, and not operationally sensitive, direct tool calling is simpler.
63
+
64
+ A concrete first offload candidate is one sandboxed code-execution worker. The Python provider-consumer path is the maintained starting point for that shape because it covers explicit provider ownership, request lifecycle control, and the maintained HTTP gateway compatibility layer on the richest SDK surface.
65
+
66
+ ## Support Status
67
+
68
+ - Primary maintained SDK and current completeness baseline.
69
+ - gRPC is the primary transport for the repo's control-plane story.
70
+ - `ToolplaneHTTP` is a maintained compatibility surface over the same session, tool, machine, request, and task flows.
71
+ - Python exposes a broader public surface than the current Go and TypeScript SDKs; confirm cross-SDK portability in [SDK_MAP.md](../../SDK_MAP.md) before assuming parity.
72
+
73
+ ## First Offload Path
74
+
75
+ Start with the maintained provider-consumer pair before exploring the full API. The sample tools are intentionally simple, but this is the same lifecycle you would reuse to offload one sandboxed code-execution tool or another environment-bound worker:
76
+
77
+ 1. Run `example_client.py` — connects via gRPC, creates a session through the explicit `ProviderRuntime`, registers machine-backed tools, and starts the provider loop.
78
+ 2. Copy the printed `TOOLPLANE_SESSION_ID`.
79
+ 3. Run `example_user.py` with that session ID — lists tools, invokes provider-backed work, and polls request state.
80
+
81
+ See [README_EXAMPLES.md](README_EXAMPLES.md) for environment defaults and the full example flow. For runtime semantics — request lifecycle, streaming, recovery windows, machine drain — see [server/DOCUMENTATION.md](../../server/DOCUMENTATION.md).
82
+
83
+ ### Scope Categories
84
+
85
+ The Python public surface spans three scope categories (see [SDK_MAP.md](../../SDK_MAP.md) for the full matrix):
86
+
87
+ - **Consumer scope** — session/machine/task lifecycle, tool discovery, and remote invocation (`create_session`, `invoke`, `stream`, etc.). These methods are portable across maintained SDKs.
88
+ - **Provider scope** — tool registration, request claiming, heartbeat, and result submission through the explicit `ProviderRuntime` surface. The client also exposes convenience aliases `tool()`, `start()`, and `stop()` over that same runtime surface.
89
+ - **Admin scope** — session administration helpers (`list_user_sessions`, `bulk_delete_sessions`, `get_session_stats`, `invalidate_session`). These are currently exposed only in the Python SDK.
90
+
91
+ ## Installation
92
+
93
+ The package is not published to PyPI yet; install it from the repository.
94
+
95
+ ```bash
96
+ # Clone the repository
97
+ git clone https://github.com/Abhishek-chohan/tool-control-plane.git
98
+ cd tool-control-plane/clients/python-client
99
+
100
+ # Install in development mode
101
+ pip install -e .
102
+
103
+ # Install with all development dependencies
104
+ pip install -e ".[dev]"
105
+ ```
106
+
107
+ Requirements: Python 3.8+ with grpcio, protobuf, requests, googleapis-common-protos, and pydantic. The optional toolkits under `toolplane/toolkits/` have heavier dependencies; install their requirements only if you use them. `grpcio-tools` is needed only for proto regeneration (`cd server && make gen-proto-python`).
108
+
109
+ ## Quick Start
110
+
111
+ ### Consumer Usage with gRPC Client
112
+
113
+ ```python
114
+ from toolplane import Toolplane
115
+
116
+ # Initialize a consumer-oriented client
117
+ client = Toolplane(
118
+ server_host="localhost",
119
+ server_port=9001,
120
+ api_key="your-api-key-here",
121
+ )
122
+
123
+ client.connect()
124
+
125
+ # Attach to an existing provider-backed session
126
+ session_id = "provider-session-123"
127
+ tools = client.get_available_tools(session_id)
128
+ print(tools)
129
+
130
+ # Execute a tool synchronously
131
+ result = client.invoke("echo-tool", session_id, text="Hello World")
132
+ print(result) # Output: Echo: Hello World
133
+
134
+ # Submit a tool invocation without blocking; awaits the request ID
135
+ import asyncio
136
+ request_id = asyncio.run(
137
+ client.ainvoke("echo-tool", session_id, text="Async Test")
138
+ )
139
+ print(f"Request ID: {request_id}")
140
+ # Poll client.get_request_status(session_id, request_id) for the outcome.
141
+
142
+ # Stream tool execution
143
+ def stream_callback(chunk, is_final):
144
+ if is_final:
145
+ print("Stream completed")
146
+ else:
147
+ print(f"Received chunk: {chunk}")
148
+
149
+ client.stream("echo-tool", stream_callback, session_id, text="Streaming Test")
150
+ ```
151
+
152
+ ### Explicit Provider Runtime with gRPC Client
153
+
154
+ ```python
155
+ from toolplane import Toolplane
156
+
157
+ client = Toolplane(
158
+ server_host="localhost",
159
+ server_port=9001,
160
+ api_key="your-api-key-here",
161
+ user_id="provider-user",
162
+ )
163
+
164
+ provider = client.provider_runtime()
165
+ session = provider.create_session(
166
+ name="My Provider Session",
167
+ description="Session backed by the explicit provider runtime",
168
+ namespace="development",
169
+ )
170
+
171
+ @provider.tool(
172
+ session_id=session.session_id,
173
+ name="echo-tool",
174
+ description="Echo back the input text",
175
+ tags=["utility", "testing"],
176
+ )
177
+ def echo_tool(text: str) -> str:
178
+ return f"Echo: {text}"
179
+
180
+ provider.run_forever()
181
+ ```
182
+
183
+ ### Explicit Provider Runtime with HTTP Client
184
+
185
+ ```python
186
+ from toolplane import ToolplaneHTTP
187
+
188
+ # Initialize HTTP client against the gateway (default port 8080)
189
+ client = ToolplaneHTTP(
190
+ server_host="localhost",
191
+ server_port=8080,
192
+ api_key="your-api-key-here",
193
+ )
194
+
195
+ # Create an explicit provider runtime
196
+ provider = client.provider_runtime()
197
+ session = provider.create_session(
198
+ user_id="user123",
199
+ name="My HTTP Provider Session",
200
+ )
201
+
202
+ # Register a tool
203
+ @provider.tool(
204
+ session_id=session.session_id,
205
+ name="http-tool",
206
+ description="HTTP-based tool execution",
207
+ )
208
+ def http_tool(text: str) -> str:
209
+ return f"HTTP Processed: {text}"
210
+
211
+ provider.run_forever()
212
+ ```
213
+
214
+ Tools are session-scoped: a consumer can only invoke tools registered into the same session, so separate provider and consumer processes must share a session ID (this is what the examples arrange through `TOOLPLANE_SESSION_ID`).
215
+
216
+ ## Session Management
217
+
218
+ ```python
219
+ # Consumer-side session creation does not imply machine registration
220
+ session = client.create_session(
221
+ session_id="my-unique-session-id",
222
+ user_id="user123",
223
+ name="My Application Session",
224
+ description="Session for my application",
225
+ namespace="production",
226
+ register_machine=False,
227
+ )
228
+
229
+ # Provider-side session creation uses the explicit runtime and attaches a machine
230
+ provider = client.provider_runtime()
231
+ provider_session = provider.create_session(
232
+ user_id="user123",
233
+ name="Provider Session",
234
+ namespace="production",
235
+ )
236
+
237
+ # Get an existing session
238
+ session_context = client.get_session("my-unique-session-id")
239
+
240
+ # List user sessions with pagination (page_token is the opaque cursor
241
+ # returned by the previous page; it is a string, not an offset)
242
+ user_sessions = client.list_user_sessions(
243
+ user_id="user123",
244
+ page_size=10,
245
+ page_token="",
246
+ )
247
+
248
+ # Get session statistics
249
+ stats = client.get_session_stats(user_id="user123")
250
+ print(f"Total sessions: {stats['total_sessions']}")
251
+
252
+ # Bulk delete sessions
253
+ bulk_delete_result = client.bulk_delete_sessions(
254
+ user_id="user123",
255
+ session_ids=["session-1", "session-2"],
256
+ )
257
+
258
+ # Invalidate a session (revokes every live API key of the session)
259
+ success = client.invalidate_session("session-123", reason="Session expired")
260
+ print(f"Session invalidated: {success}")
261
+ ```
262
+
263
+ ## Tool Management
264
+
265
+ ```python
266
+ # Registration uses the explicit provider runtime
267
+ provider = client.provider_runtime(["session-123"])
268
+ provider.attach_session("session-123", register_machine=True)
269
+
270
+ # Register a tool with automatic schema generation
271
+ @provider.tool(
272
+ session_id="session-123",
273
+ name="process-data",
274
+ description="Process and transform data",
275
+ tags=["data-processing", "utility"],
276
+ )
277
+ def process_data(input: str, format: str = "json") -> dict:
278
+ return {"input": input, "format": format, "processed": True}
279
+
280
+ # Register a streaming tool
281
+ @provider.tool(
282
+ session_id="session-123",
283
+ name="stream-data",
284
+ description="Stream data processing",
285
+ stream=True,
286
+ )
287
+ def stream_data(input: str):
288
+ for char in input:
289
+ yield f"Processing: {char}"
290
+
291
+ # Discover tools in the session
292
+ available_tools = client.get_available_tools("session-123")
293
+ print(f"Available tools: {available_tools}")
294
+ ```
295
+
296
+ ## Machine Management
297
+
298
+ ```python
299
+ # Consumer sessions are not machine-backed by default; attach through
300
+ # the provider runtime to register a machine
301
+ provider = client.provider_runtime(["session-123"])
302
+ session_context = provider.attach_session("session-123", register_machine=True)
303
+ machine_id = session_context.machine_id
304
+ print(f"Registered machine ID: {machine_id}")
305
+
306
+ # Public machine-management helpers stay on the client
307
+ machine_status = client.get_machine("session-123", machine_id)
308
+ print(f"Machine status: {machine_status}")
309
+
310
+ # Drain the machine gracefully before shutdown, then unregister
311
+ client.drain_machine("session-123", machine_id)
312
+ client.unregister_machine("session-123", machine_id)
313
+ ```
314
+
315
+ Heartbeats are owned by the explicit provider runtime (`heartbeat_interval` on the client constructor configures the cadence); you never send them yourself.
316
+
317
+ ## Request Processing
318
+
319
+ ```python
320
+ # Create a request directly (the same path invoke() uses)
321
+ request_id = client.create_request(
322
+ session_id="session-123",
323
+ tool_name="process-data",
324
+ input_data='{"input": "test", "format": "json"}',
325
+ )
326
+
327
+ # Poll request status: arguments are (session_id, request_id)
328
+ status = client.get_request_status("session-123", request_id)
329
+ print(f"Request status: {status['status']}")
330
+
331
+ # List requests in a session; page_token is the cursor from the previous page
332
+ requests = client.list_requests("session-123", status="done", limit=10, page_token="")
333
+
334
+ # Cancel a request
335
+ client.cancel_request("session-123", request_id)
336
+ ```
337
+
338
+ ## Configuration Parameters
339
+
340
+ #### `Toolplane` (gRPC facade)
341
+
342
+ | Parameter | Type | Default | Description |
343
+ | --- | --- | --- | --- |
344
+ | `server_host` | str | "localhost" | Server hostname |
345
+ | `server_port` | int | 9001 | Server port |
346
+ | `use_tls` | bool | False | Enable TLS encryption |
347
+ | `tls_cert_path` | str | None | Optional client TLS certificate for mutual TLS |
348
+ | `tls_key_path` | str | None | Optional client TLS private key for mutual TLS |
349
+ | `tls_ca_cert_path` | str | None | Optional CA bundle for direct gRPC TLS |
350
+ | `tls_server_name` | str | None | Optional TLS server name override |
351
+ | `api_key` | str | None | Authentication API key |
352
+ | `user_id` | str | None | User identifier |
353
+ | `session_name` | str | None | Session name |
354
+ | `session_description` | str | None | Session description |
355
+ | `session_namespace` | str | None | Session namespace |
356
+ | `heartbeat_interval` | int | 60 | Heartbeat interval in seconds |
357
+ | `max_workers` | int | 10 | Maximum worker threads |
358
+ | `request_timeout` | int | 30 | Request timeout in seconds |
359
+ | `max_retries` | int | 3 | Maximum retry attempts |
360
+ | `retry_base_delay` | float | 1.0 | Base retry delay in seconds |
361
+ | `retry_max_delay` | float | 60.0 | Maximum retry delay in seconds |
362
+ | `retry_backoff_factor` | float | 2.0 | Exponential backoff factor |
363
+ | `debug` | bool | False | Enable debug logging |
364
+ | `log_level` | str | "INFO" | Logging level |
365
+
366
+ #### `ToolplaneHTTP` (HTTP gateway facade)
367
+
368
+ | Parameter | Type | Default | Description |
369
+ | --- | --- | --- | --- |
370
+ | `server_host` | str | "localhost" | Gateway hostname |
371
+ | `server_port` | int | 8080 | Gateway port |
372
+ | `api_key` | str | None | Authentication API key |
373
+ | `user_id` | str | None | User identifier |
374
+ | `session_name` | str | None | Session name |
375
+ | `session_description` | str | None | Session description |
376
+ | `session_namespace` | str | None | Session namespace |
377
+ | `max_buffer_size` | int | 4194304 | Buffer size (4MB) |
378
+ | `max_retries` | int | 3 | Maximum retry attempts |
379
+ | `request_timeout` | int | 30 | Request timeout in seconds |
380
+ | `retry_backoff_ms` | int | 250 | Retry backoff in milliseconds |
381
+ | `heartbeat_interval` | int | 60 | Heartbeat interval in seconds |
382
+ | `max_workers` | int | 10 | Maximum worker threads |
383
+
384
+ Configuration commonly comes from the environment; the examples read `TOOLPLANE_SERVER_HOST`, `TOOLPLANE_SERVER_PORT`, `TOOLPLANE_API_KEY`, `TOOLPLANE_USER_ID`, `TOOLPLANE_USE_TLS`, `TOOLPLANE_TLS_CA_CERT_PATH`, and `TOOLPLANE_TLS_SERVER_NAME`, defaulting the port to 9001 and the API key to `toolplane-conformance-fixture-key`.
385
+
386
+ ## Error Handling
387
+
388
+ The client raises a typed hierarchy rooted at `ToolplaneError`:
389
+
390
+ ```python
391
+ from toolplane import ToolplaneError, ToolplaneNotFoundError
392
+
393
+ try:
394
+ client.invoke("missing-tool", session_id)
395
+ except ToolplaneNotFoundError as e:
396
+ print(f"Tool not found: {e}")
397
+ except ToolplaneError as e:
398
+ print(f"Toolplane error: {e}")
399
+ ```
400
+
401
+ | Exception | Raised for |
402
+ | --- | --- |
403
+ | `ToolplaneError` | Base class for every client error |
404
+ | `ConnectionError` | The server is unreachable or the channel dropped |
405
+ | `ToolError` / `SessionError` / `MachineError` / `RequestError` / `TaskError` | Domain-level failures in the matching resource |
406
+ | `ToolplaneAPIError` | Base for gRPC status-mapped server errors |
407
+ | `ToolplaneNotFoundError`, `ToolplaneInvalidArgumentError`, `ToolplaneFailedPreconditionError`, `ToolplaneResourceExhaustedError`, `ToolplaneUnauthenticatedError`, `ToolplanePermissionDeniedError`, `ToolplaneAlreadyExistsError`, `ToolplaneTimeoutError`, `ToolplaneUnavailableError`, `ToolplaneCancelledError`, `ToolplaneInternalError` | The matching gRPC status returned by the server |
408
+
409
+ ## API Reference
410
+
411
+ <!-- BEGIN GENERATED: api-surface -- tooling: tools/gen_sdk_readmes.py; edits inside this block are overwritten -->
412
+ #### `Toolplane`
413
+
414
+ Public methods parsed from `toolplane/toolplane_client.py`:
415
+
416
+ | Method | Description |
417
+ | --- | --- |
418
+ | `connect() -> bool` | Connect to Toolplane server. |
419
+ | `disconnect() -> None` | Disconnect from Toolplane server. |
420
+ | `ensure_session_context(session_id: str, create_if_missing: bool=False, register_machine: bool=False) -> SessionContext` | Ensure a local session context exists without implying provider startup. |
421
+ | `create_session(session_id: Optional[str]=None, user_id: Optional[str]=None, name: Optional[str]=None, description: Optional[str]=None, namespace: Optional[str]=None, register_machine: bool=False) -> SessionContext` | Create a new session. |
422
+ | `get_session(session_id: str) -> Optional[SessionContext]` | Get session context by ID. |
423
+ | `list_sessions() -> List[SessionContext]` | List all session contexts. |
424
+ | `list_user_sessions(user_id: str, page_size: int=10, page_token: str='', filter: str='') -> Dict[str, Any]` | List user sessions with pagination and filtering. |
425
+ | `bulk_delete_sessions(user_id: str, session_ids: Optional[List[str]]=None, filter: str='') -> Dict[str, Any]` | Bulk delete sessions for a user. |
426
+ | `get_session_stats(user_id: str) -> Dict[str, int]` | Get session statistics for a user. |
427
+ | `invalidate_session(session_id: str, reason: str='') -> bool` | Invalidate a session. |
428
+ | `update_session(session_id: str, name: Optional[str]=None, description: Optional[str]=None, namespace: Optional[str]=None) -> Dict[str, Any]` | Update session metadata. |
429
+ | `create_request(session_id: str, tool_name: str, input_data: str, idempotency_key: str='') -> str` | Create a new request in a session. |
430
+ | `list_requests(session_id: str, status: str='', tool_name: str='', limit: int=10, page_token: str='') -> List[Dict[str, Any]]` | List requests in a session. |
431
+ | `list_requests_page(session_id: str, status: str='', tool_name: str='', limit: int=10, page_token: str='') -> Dict[str, Any]` | List one page of requests, with the continuation cursor. |
432
+ | `cancel_request(session_id: str, request_id: str) -> bool` | Cancel a request in a session. |
433
+ | `create_task(session_id: str, tool_name: str, input_data: str) -> Dict[str, Any]` | Create a new task in a session. |
434
+ | `get_task(session_id: str, task_id: str) -> Dict[str, Any]` | Get a task by ID in a session. |
435
+ | `list_tasks(session_id: str) -> List[Dict[str, Any]]` | List tasks in a session. |
436
+ | `cancel_task(session_id: str, task_id: str) -> bool` | Cancel a task in a session. |
437
+ | `list_machines(session_id: str) -> List[Dict[str, Any]]` | List machines in a session. |
438
+ | `get_machine(session_id: str, machine_id: str) -> Dict[str, Any]` | Get a machine by ID. |
439
+ | `unregister_machine(session_id: str, machine_id: Optional[str]=None) -> bool` | Unregister a machine from a session. |
440
+ | `drain_machine(session_id: str, machine_id: Optional[str]=None) -> bool` | Drain a machine from a session. |
441
+ | `create_api_key(session_id: str, name: str, capabilities: List[str]) -> Dict[str, Any]` | Create a new API key for a session. |
442
+ | `list_api_keys(session_id: str) -> List[Dict[str, Any]]` | List active API keys for a session. |
443
+ | `revoke_api_key(session_id: str, key_id: str) -> bool` | Revoke an API key for a session. |
444
+ | `tool(session_id: str, name: Optional[str]=None, description: Optional[str]=None, stream: bool=False, tags: Optional[List[str]]=None) -> Callable[[Callable], Callable]` | Decorator to register a tool for a session. |
445
+ | `invoke(tool_name: str, session_id: str, timeout_seconds: int=0, wait_timeout: Optional[int]=None, **params) -> Any` | Invoke a tool in a session and return the tool result value. |
446
+ | `async ainvoke(tool_name: str, session_id: str, timeout_seconds: int=0, **params) -> str` | Submit a tool invocation without blocking; awaits the request ID. |
447
+ | `stream(tool_name: str, callback: Callable[[Any, bool], None], session_id: str, timeout_seconds: int=0, **params) -> List[Any]` | Stream tool execution. |
448
+ | `async astream(tool_name: str, callback: Callable[[Any, bool], None], session_id: str, timeout_seconds: int=0, **params) -> List[Any]` | Awaitable stream: resolves with the collected chunks. |
449
+ | `get_available_tools(session_id: str) -> Dict[str, Any]` | Get available tools for a session. |
450
+ | `list_tools(session_id: str) -> List[Dict[str, Any]]` | List tools for a session. |
451
+ | `get_tool_by_id(session_id: str, tool_id: str) -> Dict[str, Any]` | Get a tool by ID. |
452
+ | `get_tool_by_name(session_id: str, tool_name: str) -> Dict[str, Any]` | Get a tool by name. |
453
+ | `delete_tool(session_id: str, tool_id: str) -> bool` | Delete a tool by ID. |
454
+ | `get_request_status(session_id: str, request_id: str) -> Dict[str, Any]` | Get request status (session-scoped, like every other facade method). |
455
+ | `provider_runtime(session_ids: Optional[List[str]]=None)` | Return the explicit provider runtime for this client. |
456
+ | `start() -> None` | Backward-compatible alias for the explicit provider runtime. |
457
+ | `stop() -> None` | Stop the explicit provider runtime if it is active. |
458
+
459
+ #### `ToolplaneHTTP`
460
+
461
+ Public methods parsed from `toolplane/toolplane_http_client.py`:
462
+
463
+ | Method | Description |
464
+ | --- | --- |
465
+ | `connect() -> bool` | Connect to HTTP server. |
466
+ | `disconnect()` | Disconnect from HTTP server. |
467
+ | `ensure_session_context(session_id: str, create_if_missing: bool=False, register_machine: bool=False) -> HTTPSessionContext` | Ensure a local session context exists without implying provider startup. |
468
+ | `create_session(session_id: Optional[str]=None, user_id: Optional[str]=None, name: Optional[str]=None, description: Optional[str]=None, namespace: Optional[str]=None, register_machine: bool=False) -> HTTPSessionContext` | Create a new session. |
469
+ | `get_session(session_id: str) -> Optional[HTTPSessionContext]` | Get session context by ID. |
470
+ | `list_sessions() -> List[HTTPSessionContext]` | List all session contexts. |
471
+ | `get_primary_session_context() -> Optional[HTTPSessionContext]` | Get primary session context. |
472
+ | `tool(session_id: str, name: Optional[str]=None, description: Optional[str]=None, stream: bool=False, tags: Optional[List[str]]=None)` | Decorator to register a tool for a session. |
473
+ | `invoke(tool_name: str, session_id: str, timeout_seconds: int=0, wait_timeout: Optional[int]=None, **params) -> Any` | Invoke a tool in a session and return the tool result value. |
474
+ | `async ainvoke(tool_name: str, session_id: str, timeout_seconds: int=0, **params) -> str` | Submit a tool invocation without blocking; awaits the request ID. |
475
+ | `stream(tool_name: str, callback: Callable[[Any, bool], None], session_id: str, **params) -> List[Any]` | Stream tool execution. |
476
+ | `async astream(tool_name: str, callback: Callable[[Any, bool], None], session_id: str, **params) -> List[Any]` | Awaitable stream: resolves with the collected chunks. |
477
+ | `get_available_tools(session_id: str) -> Dict[str, Any]` | Get available tools for a session. |
478
+ | `list_tools(session_id: str) -> List[Dict[str, Any]]` | List tools for a session. |
479
+ | `get_tool_by_id(session_id: str, tool_id: str) -> Dict[str, Any]` | Get a tool by ID. |
480
+ | `get_tool_by_name(session_id: str, tool_name: str) -> Dict[str, Any]` | Get a tool by name. |
481
+ | `delete_tool(session_id: str, tool_id: str) -> bool` | Delete a tool by ID. |
482
+ | `get_request_status(session_id: str, request_id: str) -> Dict[str, Any]` | Get request status (session-scoped, like every other facade method). |
483
+ | `list_user_sessions(user_id: str, page_size: int=10, page_token: str='', filter: str='') -> Dict[str, Any]` | List user sessions with pagination and filtering. |
484
+ | `bulk_delete_sessions(user_id: str, session_ids: List[str]=None, filter: str='') -> Dict[str, Any]` | Bulk delete sessions for a user. |
485
+ | `get_session_stats(user_id: str) -> Dict[str, int]` | Get session statistics for a user. |
486
+ | `invalidate_session(session_id: str, reason: str='') -> bool` | Invalidate a session. |
487
+ | `update_session(session_id: str, name: Optional[str]=None, description: Optional[str]=None, namespace: Optional[str]=None) -> Dict[str, Any]` | Update session metadata. |
488
+ | `create_request(session_id: str, tool_name: str, input_data: str, idempotency_key: str='') -> str` | Create a new request in a session. |
489
+ | `list_requests(session_id: str, status: str='', tool_name: str='', limit: int=10, page_token: str='') -> List[Dict[str, Any]]` | List requests in a session. |
490
+ | `list_requests_page(session_id: str, status: str='', tool_name: str='', limit: int=10, page_token: str='') -> Dict[str, Any]` | List one page of requests, with the continuation cursor. |
491
+ | `cancel_request(session_id: str, request_id: str) -> bool` | Cancel a request in a session. |
492
+ | `create_task(session_id: str, tool_name: str, input_data: str) -> Dict[str, Any]` | Create a new task in a session. |
493
+ | `get_task(session_id: str, task_id: str) -> Dict[str, Any]` | Get a task by ID in a session. |
494
+ | `list_tasks(session_id: str) -> List[Dict[str, Any]]` | List tasks in a session. |
495
+ | `cancel_task(session_id: str, task_id: str) -> bool` | Cancel a task in a session. |
496
+ | `list_machines(session_id: str) -> List[Dict[str, Any]]` | List machines in a session. |
497
+ | `get_machine(session_id: str, machine_id: str) -> Dict[str, Any]` | Get a machine by ID. |
498
+ | `unregister_machine(session_id: str, machine_id: Optional[str]=None) -> bool` | Unregister a machine from a session. |
499
+ | `drain_machine(session_id: str, machine_id: Optional[str]=None) -> bool` | Drain a machine from a session. |
500
+ | `create_api_key(session_id: str, name: str, capabilities: List[str]) -> Dict[str, Any]` | Create a new API key for a session. |
501
+ | `list_api_keys(session_id: str) -> List[Dict[str, Any]]` | List active API keys for a session. |
502
+ | `revoke_api_key(session_id: str, key_id: str) -> bool` | Revoke an API key for a session. |
503
+ | `provider_runtime(session_ids: Optional[List[str]]=None)` | Return the explicit provider runtime for this client. |
504
+ | `start()` | Backward-compatible alias for the explicit provider runtime. |
505
+ | `stop()` | Stop the explicit provider runtime if it is active. |
506
+ | `health()` | Check server health. |
507
+
508
+ #### `ProviderRuntime`
509
+
510
+ Public methods parsed from `toolplane/provider_runtime.py`:
511
+
512
+ | Method | Description |
513
+ | --- | --- |
514
+ | `running -> bool` | Property. |
515
+ | `add_sessions(session_ids: Optional[Iterable[str]]) -> None` | |
516
+ | `managed_session_ids() -> List[str]` | |
517
+ | `attach_session(session_id: str, register_machine: bool=True)` | |
518
+ | `create_session(session_id: Optional[str]=None, user_id: Optional[str]=None, name: Optional[str]=None, description: Optional[str]=None, namespace: Optional[str]=None, register_machine: bool=True)` | |
519
+ | `register_tool(session_id: str, name: str, func: Callable, schema: Optional[dict]=None, description: Optional[str]=None, stream: bool=False, tags: Optional[List[str]]=None) -> Callable` | |
520
+ | `tool(session_id: Optional[str]=None, name: Optional[str]=None, description: Optional[str]=None, stream: bool=False, tags: Optional[List[str]]=None)` | Queue a tool for registration at runtime start. |
521
+ | `poll_once() -> None` | |
522
+ | `start_in_background(session_ids: Optional[Iterable[str]]=None) -> 'ProviderRuntime'` | |
523
+ | `run_forever(session_ids: Optional[Iterable[str]]=None) -> None` | |
524
+ | `stop() -> None` | |
525
+ | `close() -> None` | |
526
+ <!-- END GENERATED: api-surface -->
527
+
528
+ ## Contributing
529
+
530
+ Contributions are welcome — see the [repository-level README](../../README.md) Contributing section for the required checks. Run the Python suites locally with:
531
+
532
+ ```bash
533
+ cd server
534
+ make python-unit # unit tests
535
+ make conformance-python # shared-fixture conformance
536
+ ```
537
+
538
+ ## Support
539
+
540
+ - Advanced API reference: [MANUAL.md](MANUAL.md)
541
+ - Example walkthrough: [README_EXAMPLES.md](README_EXAMPLES.md)
542
+ - Package architecture: [ARCHITECTURE.md](ARCHITECTURE.md)
543
+ - Issues: [open one on the GitHub repository](https://github.com/Abhishek-chohan/tool-control-plane/issues)
@@ -0,0 +1,81 @@
1
+ toolplane/__init__.py,sha256=VOb4oztCIfY5GP-yccU4lpbgqeFSWhvBgg2gZSJ6pjs,2666
2
+ toolplane/provider_cli.py,sha256=87hYn9snp6z7XTXuWxAQKGECC-tXihsrQUq-jnlgvvU,9176
3
+ toolplane/provider_registry.py,sha256=_7ZKKBOGn-vvr24gfwF03t6d4268qt8J2AvEAL3iSeU,2094
4
+ toolplane/provider_runtime.py,sha256=IfB5ofss_MvcNBZZqxv_J1Ui2WvXoB7Q4Dzc5f3yWqw,10455
5
+ toolplane/toolplane_client.py,sha256=nWAl-7ezD36oEDHGVeeQ5u5ZU3P5FddY6PjPGeGIF0s,25369
6
+ toolplane/toolplane_http_client.py,sha256=ZWA3SkzH-VciTvW6MXq6b7-maZR1iGobZCv_E_y21yY,25148
7
+ toolplane/common/__init__.py,sha256=lYa6uC-D7ldacgJjSiImwqlDuU1GwAMnw-BdWNoy-lM,2352
8
+ toolplane/common/base_config.py,sha256=SapLuCMxdZLg2vvpUqs_KC8keQIrLNDagSZMCA6sp3w,4537
9
+ toolplane/common/base_connection_manager.py,sha256=qz-sS8b4rkTSKpjBR63Bbj5jd27ODJ4ODmXX5PzF5TU,5214
10
+ toolplane/common/base_session_manager.py,sha256=37a65TWzLV0hLnmC0IhZbf0P0NgFpVvwBg4HgHWpnG0,10608
11
+ toolplane/common/base_tool_manager.py,sha256=o6J69U5xthfBH4MyeXbywv6rGSMUSoyloTt0W9kfeGM,11951
12
+ toolplane/common/constants.py,sha256=VMVseqhhQTEEMBcMGhJ1m6ZSPs6U8f5bKi_tQ46yw4g,1582
13
+ toolplane/common/utils.py,sha256=eRpGoMBLrlk4eBqDFmVIupeGUBcbHfGYIz7MOpgEEhI,9111
14
+ toolplane/core/__init__.py,sha256=Q8N7n9sf9-8WTA2BStExeJuB6K-y2lt2C_AUEHULXT4,1781
15
+ toolplane/core/config.py,sha256=jRoMVc_hoeqfwaav8UwVYdWoVvPiBYBG82w3AluJkkk,3858
16
+ toolplane/core/connection.py,sha256=pD0zicdVQGY6rNNNsmGAE66rIfoCpNkTCifkFgw4MDI,10790
17
+ toolplane/core/errors.py,sha256=ddeZ32RdGSwlgQKw8JyFtKnrmbxEcMYhq05cRorVEY8,9562
18
+ toolplane/core/machine.py,sha256=ksG8JdK0QmBOPd0zwjdq4BPOfE4w5-lS6S57E4wazyU,17484
19
+ toolplane/core/request.py,sha256=XjtjHjaJ42lBShXCXqwRWX-pr9gIzyfmSy5sLrV34fA,26630
20
+ toolplane/core/session.py,sha256=WiuwZl6r80NwRRxjMJIOC8ylyiT7w8RIL4TUx60eOo0,11802
21
+ toolplane/core/session_context.py,sha256=VLwyle33cA6oeE-Pam-zapPUj5rU7Im-ok2vEiV5kL0,18506
22
+ toolplane/core/task.py,sha256=COuxyoERoAioQbkjXj7pwqNtmzYBSWR099kADjWtE8M,4951
23
+ toolplane/core/tool.py,sha256=DFeKMdNC5_Y5bF5Q2gkditCqRywBIHiUUxFjb1Q9CVc,12620
24
+ toolplane/http_core/__init__.py,sha256=CESVsLFujKeufk8TT7JtKe-A9B0aO6LJEemCplymyf8,927
25
+ toolplane/http_core/http_config.py,sha256=JUdeElZtYmmypjlWZF9JSyKDzIe1W3W-nt6G7YiBGdg,3314
26
+ toolplane/http_core/http_connection.py,sha256=AxrJIOIXxG0IC5B6itTj80N9YxeSkutJV1r6jvQDpNs,14356
27
+ toolplane/http_core/http_machine.py,sha256=uhJo5JnwpS5Yxl3tgiqFPpNGXZPyDplyuknWhMIXbWY,10823
28
+ toolplane/http_core/http_request.py,sha256=4VBWmVztpEh-HjFHX96aHLbLNaSMQNkUN-nIt8HrNvA,25999
29
+ toolplane/http_core/http_session.py,sha256=zdKgB5rRkgWDYnLcocnIKg-Wg-kXnIoetbfeUatk4DI,12681
30
+ toolplane/http_core/http_session_context.py,sha256=ulounQrxX20uzE3BYGJaFdprdbJHtcGqTJcDPCIuXNY,18121
31
+ toolplane/http_core/http_task.py,sha256=L-E7cjd4rA73Bzj98TpDuYdzREgEMqSSqe4RywW4iL0,4079
32
+ toolplane/http_core/http_tool.py,sha256=Te_QprfpO22JqUnf7YI4FcPFwN7e1Jf9qnyuNw-7Als,14659
33
+ toolplane/interfaces/__init__.py,sha256=rdV6dJ_REiZMbq2m2LlmDhlKPq1h7ym9IRDEeOvwuUI,846
34
+ toolplane/interfaces/client_interface.py,sha256=umlv0tG8B9Wt02ObK3jIPMtJdPJOpcpdebWMvWSd6ME,3797
35
+ toolplane/interfaces/connection_interface.py,sha256=FS5NSGoUuSL5H_Se5Na04Rchx3nVUOJO1TqpArfktR0,5526
36
+ toolplane/interfaces/event_interface.py,sha256=z6H0v0lio0pPWPkkXDLr_NbZScDJMZuK2ojyl7g7G7M,9107
37
+ toolplane/interfaces/request_interface.py,sha256=YP6V22jx5V6xSCHeZr26fgWyj8mGhox9cmRk78Hstxo,13340
38
+ toolplane/interfaces/session_interface.py,sha256=XNvBp965x94N2d-kGTGhEMOg0G1tdfL3WToqjyG2yU8,9430
39
+ toolplane/interfaces/tool_interface.py,sha256=aVN7nWZTIhlVEcbCy1MEJaodoPUbjIWysyjTDETzNbY,14220
40
+ toolplane/proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ toolplane/proto/service_pb2.py,sha256=ZlFtsXIjetDYw9uizIOyc5w5Du9eAt4G5E_CAoT9ITA,44670
42
+ toolplane/proto/service_pb2_grpc.py,sha256=Jd-PeE8VVKvtp3k9XP-hZBFYtlB8q5ieUZ2b0JDDJRY,88951
43
+ toolplane/toolkits/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ toolplane/toolkits/standalone_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ toolplane/toolkits/standalone_tools/create_directory.py,sha256=jxdXpE-GclcRLp_kfxVvaMVkT9EbB0WUHbUT1Cr4Ej4,2890
46
+ toolplane/toolkits/standalone_tools/create_file.py,sha256=_9iXmXt1GyxgqqSoPzOLkWpTVXaBbyMgWMdc-YTBIDQ,3964
47
+ toolplane/toolkits/standalone_tools/file_search.py,sha256=wlu4tUD2MW2crsWvfORZhTV2hiLuJ7dRlP5-GZaAxL4,7262
48
+ toolplane/toolkits/standalone_tools/grep_search.py,sha256=4NF5FdVNdRfcN8XctXBYbtcTOlu2YGotCeXlxsliK5Q,10687
49
+ toolplane/toolkits/standalone_tools/launcher.py,sha256=DjMFENQQhZzPgwCHZ58ecCV7akV6rbu_PON_Yg4Ani0,4365
50
+ toolplane/toolkits/standalone_tools/list_dir.py,sha256=ampfoYEvJq9NNsy__sjzChpB70_5Mgyc9Q1DjM6nFSk,13006
51
+ toolplane/toolkits/standalone_tools/read_file.py,sha256=oFCMCS6JGm65dG0o7NUDSsZH2g1ghUZwDOgWY8nqj1k,10506
52
+ toolplane/toolkits/standalone_tools/replace_string_in_file.py,sha256=_2Rz-dlCRyMnH12KpVnWCLPhuqgZq66dZOD-iIpBt9g,13516
53
+ toolplane/toolkits/standalone_tools/run_tests.py,sha256=wY6nZWIMXV2CZAEQ1Q7jnKuQVUSf-0EgGL349Bt5GBM,1813
54
+ toolplane/toolkits/standalone_tools/semantic_search.py,sha256=AuLenPHDW00NGPL7ILqhDYqdcZLjLABYUYEy31GpcQs,14443
55
+ toolplane/toolkits/standalone_tools/standalone_toolkit.py,sha256=AWVS4ap1OKxPs67aiLNhLEWw7KbENiKGUJQav12OCuA,35141
56
+ toolplane/toolkits/standalone_tools/test_failure_analysis.py,sha256=O1Z7Z5266iOW5uIpUF0aXVF74vAt_hnRSp0zRTrCo4k,20898
57
+ toolplane/toolkits/standalone_tools/test_standalone_toolkit.py,sha256=XQRgXnfYCYu_ahzX2y4KBSaIfDH1pittdSEsBeaVhgg,18112
58
+ toolplane/toolkits/swe/__init__.py,sha256=Ql-hdU6jPWIdwwZQblfJu5qlkwiW6VDKrbo7OGg9Imw,664
59
+ toolplane/toolkits/swe/create_directory.py,sha256=CCrJ2t7-NrWMQvB3d110PDRu4wIgN5oU96lNglrg98A,400
60
+ toolplane/toolkits/swe/create_file.py,sha256=1DVsvJx4uPjXnGC1C8u2wDQ2ndrvfbUN1CNmGTSzPik,390
61
+ toolplane/toolkits/swe/descriptions.py,sha256=D9pYfZ2WZjWpeg3jJm3yKCGq-2_cFnG1BKboD7jRm-U,11766
62
+ toolplane/toolkits/swe/execute_bash.py,sha256=ettykydDNEjYd78vdABhxQAwxDI2-YyccimrauybPXU,2932
63
+ toolplane/toolkits/swe/file_editor.py,sha256=l2HRFvgN5zFAXlVExPBmHcgaiJzi59ppVLCEVSgdrkI,29405
64
+ toolplane/toolkits/swe/file_search.py,sha256=JKltNkySi_HbUvWw7Ct2jFcHxbfJH1GeKt64iwXYzoo,407
65
+ toolplane/toolkits/swe/finish.py,sha256=lJkTclzO1YLUFiaFnjfY2nYp46Q38o6Ky2D3axZ3idE,1494
66
+ toolplane/toolkits/swe/grep_search.py,sha256=eRc7vtVoV_Wmo9hiO034TKVbBqWYU7sxgTgzhyWb-3E,475
67
+ toolplane/toolkits/swe/list_dir.py,sha256=-wOSxQ-2k4sRYIfCKkZaQqW9mDYeBGp9i5m8RqFf7cY,13451
68
+ toolplane/toolkits/swe/read_file.py,sha256=NeI8z6ztsiCk0ccHIY8UIgJuFXR200pfMYmDJ05_HY4,449
69
+ toolplane/toolkits/swe/replace_string_in_file.py,sha256=_wgmKiSlgogznhg4QAToi_AuHqk627f3TwRN7p7tB6w,472
70
+ toolplane/toolkits/swe/search.py,sha256=b_Z9HWy1FPFn1YAg-B-3nUeiTbd2G8GJy-jSZUIG3yk,9370
71
+ toolplane/toolkits/swe/semantic_search.py,sha256=Zcd5Ls3FwJKr8lWGZDBzMylBYMn5-oPQB4ENGL87Aa8,523
72
+ toolplane/toolkits/swe/str_replace_editor.py,sha256=Q43mJonOUbFiothzGa10eSN-89FA7_AdhlCwxv5WLs4,23630
73
+ toolplane/toolkits/swe/submit.py,sha256=pRRjofidgf24RcWD2vhwgjFLr7bBOAAV9NSvqYbwlL8,547
74
+ toolplane/toolkits/swe/swe_toolkit.py,sha256=Eh9Jrccc-H2D1zEQkGM2IsH_aMGqv0fD6E8ho0ajem8,44835
75
+ toolplane/utils/__init__.py,sha256=w_djmtPagjMs-KyUy9MN09J-x-4ShX2SBRah38pSy2U,139
76
+ toolplane/utils/schema.py,sha256=X2WjsAakymlaV5-dgsUZiciKyzsrw6ErTPYA8ZcYuxI,4406
77
+ toolplane_python_client-0.1.0.dist-info/METADATA,sha256=TRFWd5xwQnOMWko5xTUZPkK-ydsTof8tkuJm58FtIrM,28378
78
+ toolplane_python_client-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
79
+ toolplane_python_client-0.1.0.dist-info/entry_points.txt,sha256=JkR2hs-auiqhLpTqwy4nfUj24WRUn5Fe_rs6us6W2J0,67
80
+ toolplane_python_client-0.1.0.dist-info/top_level.txt,sha256=siTUe6zrWvaqnzl_wEXbc2gEQyGKNCxg3pkzuXP895g,10
81
+ toolplane_python_client-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ toolplane-provider = toolplane.provider_cli:main
@@ -0,0 +1 @@
1
+ toolplane