opencode-python-sdk 0.2.0__py3-none-any.whl → 0.2.3__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 (45) hide show
  1. opencode/__init__.py +14 -0
  2. opencode/_aiohttp.py +44 -0
  3. opencode/_base_client.py +237 -11
  4. opencode/_client.py +115 -3
  5. opencode/_logs.py +29 -0
  6. opencode/_pagination.py +14 -0
  7. opencode/_response.py +316 -0
  8. opencode/_service.py +1018 -0
  9. opencode/resources/agent.py +63 -0
  10. opencode/resources/command.py +59 -0
  11. opencode/resources/config.py +93 -20
  12. opencode/resources/credential.py +149 -56
  13. opencode/resources/debug.py +156 -20
  14. opencode/resources/event.py +59 -0
  15. opencode/resources/experimental.py +210 -36
  16. opencode/resources/file.py +71 -0
  17. opencode/resources/form.py +59 -0
  18. opencode/resources/generate.py +59 -0
  19. opencode/resources/integration.py +538 -128
  20. opencode/resources/location.py +87 -18
  21. opencode/resources/mcp.py +252 -82
  22. opencode/resources/message.py +59 -0
  23. opencode/resources/migration.py +126 -0
  24. opencode/resources/model.py +63 -0
  25. opencode/resources/permission.py +272 -38
  26. opencode/resources/plugin.py +95 -22
  27. opencode/resources/project.py +63 -0
  28. opencode/resources/provider.py +63 -0
  29. opencode/resources/pty.py +172 -20
  30. opencode/resources/reference.py +59 -0
  31. opencode/resources/rpc.py +59 -0
  32. opencode/resources/server.py +67 -0
  33. opencode/resources/session.py +1159 -405
  34. opencode/resources/shell.py +101 -20
  35. opencode/resources/skill.py +59 -0
  36. opencode/resources/vcs.py +172 -20
  37. opencode/resources/voice.py +59 -0
  38. opencode/resources/websearch.py +63 -0
  39. opencode/resources/worktree.py +123 -40
  40. opencode/service.py +50 -0
  41. {opencode_python_sdk-0.2.0.dist-info → opencode_python_sdk-0.2.3.dist-info}/METADATA +111 -2
  42. opencode_python_sdk-0.2.3.dist-info/RECORD +67 -0
  43. opencode_python_sdk-0.2.0.dist-info/RECORD +0 -62
  44. {opencode_python_sdk-0.2.0.dist-info → opencode_python_sdk-0.2.3.dist-info}/WHEEL +0 -0
  45. {opencode_python_sdk-0.2.0.dist-info → opencode_python_sdk-0.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -5,10 +5,17 @@
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
+ from functools import cached_property
8
9
  from typing import TYPE_CHECKING, cast
9
10
 
10
11
  from .._base_client import RequestOptions
11
12
  from .._resource import AsyncAPIResource, SyncAPIResource
13
+ from .._response import (
14
+ async_to_raw_response_wrapper,
15
+ async_to_streamed_response_wrapper,
16
+ to_raw_response_wrapper,
17
+ to_streamed_response_wrapper,
18
+ )
12
19
  from .._types import NOT_GIVEN, Body, Headers, NotGiven, Query, Timeout
13
20
 
14
21
  if TYPE_CHECKING:
@@ -25,6 +32,16 @@ __all__ = ["WebsearchResource", "AsyncWebsearchResource"]
25
32
  class WebsearchResource(SyncAPIResource):
26
33
  """Operations under ``client.websearch`` (OpenCode ``websearch``)."""
27
34
 
35
+ @cached_property
36
+ def with_raw_response(self) -> WebsearchResourceWithRawResponse:
37
+ """Same methods, returning the raw HTTP response; call ``.parse()`` on it for the usual value."""
38
+ return WebsearchResourceWithRawResponse(self)
39
+
40
+ @cached_property
41
+ def with_streaming_response(self) -> WebsearchResourceWithStreamingResponse:
42
+ """Same methods, returning a context manager over the HTTP response without reading the body."""
43
+ return WebsearchResourceWithStreamingResponse(self)
44
+
28
45
  def providers(
29
46
  self,
30
47
  *,
@@ -103,9 +120,37 @@ class WebsearchResource(SyncAPIResource):
103
120
  )
104
121
 
105
122
 
123
+ class WebsearchResourceWithRawResponse:
124
+ """``client.websearch.with_raw_response``."""
125
+
126
+ def __init__(self, resource: WebsearchResource) -> None:
127
+ self._resource = resource
128
+ self.providers = to_raw_response_wrapper(resource.providers)
129
+ self.query = to_raw_response_wrapper(resource.query)
130
+
131
+
132
+ class WebsearchResourceWithStreamingResponse:
133
+ """``client.websearch.with_streaming_response``."""
134
+
135
+ def __init__(self, resource: WebsearchResource) -> None:
136
+ self._resource = resource
137
+ self.providers = to_streamed_response_wrapper(resource.providers)
138
+ self.query = to_streamed_response_wrapper(resource.query)
139
+
140
+
106
141
  class AsyncWebsearchResource(AsyncAPIResource):
107
142
  """Operations under ``client.websearch`` (OpenCode ``websearch``)."""
108
143
 
144
+ @cached_property
145
+ def with_raw_response(self) -> AsyncWebsearchResourceWithRawResponse:
146
+ """Same methods, returning the raw HTTP response; call ``.parse()`` on it for the usual value."""
147
+ return AsyncWebsearchResourceWithRawResponse(self)
148
+
149
+ @cached_property
150
+ def with_streaming_response(self) -> AsyncWebsearchResourceWithStreamingResponse:
151
+ """Same methods, returning a context manager over the HTTP response without reading the body."""
152
+ return AsyncWebsearchResourceWithStreamingResponse(self)
153
+
109
154
  async def providers(
110
155
  self,
111
156
  *,
@@ -182,3 +227,21 @@ class AsyncWebsearchResource(AsyncAPIResource):
182
227
  response_type="WebsearchQueryResponse",
183
228
  ),
184
229
  )
230
+
231
+
232
+ class AsyncWebsearchResourceWithRawResponse:
233
+ """``client.websearch.with_raw_response``."""
234
+
235
+ def __init__(self, resource: AsyncWebsearchResource) -> None:
236
+ self._resource = resource
237
+ self.providers = async_to_raw_response_wrapper(resource.providers)
238
+ self.query = async_to_raw_response_wrapper(resource.query)
239
+
240
+
241
+ class AsyncWebsearchResourceWithStreamingResponse:
242
+ """``client.websearch.with_streaming_response``."""
243
+
244
+ def __init__(self, resource: AsyncWebsearchResource) -> None:
245
+ self._resource = resource
246
+ self.providers = async_to_streamed_response_wrapper(resource.providers)
247
+ self.query = async_to_streamed_response_wrapper(resource.query)
@@ -5,10 +5,17 @@
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
+ from functools import cached_property
8
9
  from typing import TYPE_CHECKING, cast
9
10
 
10
11
  from .._base_client import RequestOptions
11
12
  from .._resource import AsyncAPIResource, SyncAPIResource
13
+ from .._response import (
14
+ async_to_raw_response_wrapper,
15
+ async_to_streamed_response_wrapper,
16
+ to_raw_response_wrapper,
17
+ to_streamed_response_wrapper,
18
+ )
12
19
  from .._types import NOT_GIVEN, Body, Headers, NotGiven, Query, Timeout
13
20
 
14
21
  if TYPE_CHECKING:
@@ -25,6 +32,16 @@ __all__ = ["WorktreeResource", "AsyncWorktreeResource"]
25
32
  class WorktreeResource(SyncAPIResource):
26
33
  """Operations under ``client.worktree`` (OpenCode ``worktree``)."""
27
34
 
35
+ @cached_property
36
+ def with_raw_response(self) -> WorktreeResourceWithRawResponse:
37
+ """Same methods, returning the raw HTTP response; call ``.parse()`` on it for the usual value."""
38
+ return WorktreeResourceWithRawResponse(self)
39
+
40
+ @cached_property
41
+ def with_streaming_response(self) -> WorktreeResourceWithStreamingResponse:
42
+ """Same methods, returning a context manager over the HTTP response without reading the body."""
43
+ return WorktreeResourceWithStreamingResponse(self)
44
+
28
45
  def list(
29
46
  self,
30
47
  *,
@@ -131,17 +148,20 @@ class WorktreeResource(SyncAPIResource):
131
148
 
132
149
  ``DELETE /api/worktree``
133
150
  """
134
- self._client.request(
135
- RequestOptions(
136
- method="DELETE",
137
- path="/api/worktree",
138
- body={"projectID": project_id, "directory": directory, "force": force},
139
- extra_headers=extra_headers,
140
- extra_query=extra_query,
141
- extra_body=extra_body,
142
- timeout=timeout,
151
+ return cast(
152
+ "None",
153
+ self._client.request(
154
+ RequestOptions(
155
+ method="DELETE",
156
+ path="/api/worktree",
157
+ body={"projectID": project_id, "directory": directory, "force": force},
158
+ extra_headers=extra_headers,
159
+ extra_query=extra_query,
160
+ extra_body=extra_body,
161
+ timeout=timeout,
162
+ ),
163
+ kind="void",
143
164
  ),
144
- kind="void",
145
165
  )
146
166
 
147
167
  def refresh(
@@ -165,23 +185,58 @@ class WorktreeResource(SyncAPIResource):
165
185
 
166
186
  ``POST /api/worktree/refresh``
167
187
  """
168
- self._client.request(
169
- RequestOptions(
170
- method="POST",
171
- path="/api/worktree/refresh",
172
- body={"projectID": project_id},
173
- extra_headers=extra_headers,
174
- extra_query=extra_query,
175
- extra_body=extra_body,
176
- timeout=timeout,
188
+ return cast(
189
+ "None",
190
+ self._client.request(
191
+ RequestOptions(
192
+ method="POST",
193
+ path="/api/worktree/refresh",
194
+ body={"projectID": project_id},
195
+ extra_headers=extra_headers,
196
+ extra_query=extra_query,
197
+ extra_body=extra_body,
198
+ timeout=timeout,
199
+ ),
200
+ kind="void",
177
201
  ),
178
- kind="void",
179
202
  )
180
203
 
181
204
 
205
+ class WorktreeResourceWithRawResponse:
206
+ """``client.worktree.with_raw_response``."""
207
+
208
+ def __init__(self, resource: WorktreeResource) -> None:
209
+ self._resource = resource
210
+ self.list = to_raw_response_wrapper(resource.list)
211
+ self.create = to_raw_response_wrapper(resource.create)
212
+ self.remove = to_raw_response_wrapper(resource.remove)
213
+ self.refresh = to_raw_response_wrapper(resource.refresh)
214
+
215
+
216
+ class WorktreeResourceWithStreamingResponse:
217
+ """``client.worktree.with_streaming_response``."""
218
+
219
+ def __init__(self, resource: WorktreeResource) -> None:
220
+ self._resource = resource
221
+ self.list = to_streamed_response_wrapper(resource.list)
222
+ self.create = to_streamed_response_wrapper(resource.create)
223
+ self.remove = to_streamed_response_wrapper(resource.remove)
224
+ self.refresh = to_streamed_response_wrapper(resource.refresh)
225
+
226
+
182
227
  class AsyncWorktreeResource(AsyncAPIResource):
183
228
  """Operations under ``client.worktree`` (OpenCode ``worktree``)."""
184
229
 
230
+ @cached_property
231
+ def with_raw_response(self) -> AsyncWorktreeResourceWithRawResponse:
232
+ """Same methods, returning the raw HTTP response; call ``.parse()`` on it for the usual value."""
233
+ return AsyncWorktreeResourceWithRawResponse(self)
234
+
235
+ @cached_property
236
+ def with_streaming_response(self) -> AsyncWorktreeResourceWithStreamingResponse:
237
+ """Same methods, returning a context manager over the HTTP response without reading the body."""
238
+ return AsyncWorktreeResourceWithStreamingResponse(self)
239
+
185
240
  async def list(
186
241
  self,
187
242
  *,
@@ -288,17 +343,20 @@ class AsyncWorktreeResource(AsyncAPIResource):
288
343
 
289
344
  ``DELETE /api/worktree``
290
345
  """
291
- await self._client.request(
292
- RequestOptions(
293
- method="DELETE",
294
- path="/api/worktree",
295
- body={"projectID": project_id, "directory": directory, "force": force},
296
- extra_headers=extra_headers,
297
- extra_query=extra_query,
298
- extra_body=extra_body,
299
- timeout=timeout,
346
+ return cast(
347
+ "None",
348
+ await self._client.request(
349
+ RequestOptions(
350
+ method="DELETE",
351
+ path="/api/worktree",
352
+ body={"projectID": project_id, "directory": directory, "force": force},
353
+ extra_headers=extra_headers,
354
+ extra_query=extra_query,
355
+ extra_body=extra_body,
356
+ timeout=timeout,
357
+ ),
358
+ kind="void",
300
359
  ),
301
- kind="void",
302
360
  )
303
361
 
304
362
  async def refresh(
@@ -322,15 +380,40 @@ class AsyncWorktreeResource(AsyncAPIResource):
322
380
 
323
381
  ``POST /api/worktree/refresh``
324
382
  """
325
- await self._client.request(
326
- RequestOptions(
327
- method="POST",
328
- path="/api/worktree/refresh",
329
- body={"projectID": project_id},
330
- extra_headers=extra_headers,
331
- extra_query=extra_query,
332
- extra_body=extra_body,
333
- timeout=timeout,
383
+ return cast(
384
+ "None",
385
+ await self._client.request(
386
+ RequestOptions(
387
+ method="POST",
388
+ path="/api/worktree/refresh",
389
+ body={"projectID": project_id},
390
+ extra_headers=extra_headers,
391
+ extra_query=extra_query,
392
+ extra_body=extra_body,
393
+ timeout=timeout,
394
+ ),
395
+ kind="void",
334
396
  ),
335
- kind="void",
336
397
  )
398
+
399
+
400
+ class AsyncWorktreeResourceWithRawResponse:
401
+ """``client.worktree.with_raw_response``."""
402
+
403
+ def __init__(self, resource: AsyncWorktreeResource) -> None:
404
+ self._resource = resource
405
+ self.list = async_to_raw_response_wrapper(resource.list)
406
+ self.create = async_to_raw_response_wrapper(resource.create)
407
+ self.remove = async_to_raw_response_wrapper(resource.remove)
408
+ self.refresh = async_to_raw_response_wrapper(resource.refresh)
409
+
410
+
411
+ class AsyncWorktreeResourceWithStreamingResponse:
412
+ """``client.worktree.with_streaming_response``."""
413
+
414
+ def __init__(self, resource: AsyncWorktreeResource) -> None:
415
+ self._resource = resource
416
+ self.list = async_to_streamed_response_wrapper(resource.list)
417
+ self.create = async_to_streamed_response_wrapper(resource.create)
418
+ self.remove = async_to_streamed_response_wrapper(resource.remove)
419
+ self.refresh = async_to_streamed_response_wrapper(resource.refresh)
opencode/service.py ADDED
@@ -0,0 +1,50 @@
1
+ """Find, start and stop the local OpenCode background service.
2
+
3
+ Example::
4
+
5
+ from opencode import Opencode, service
6
+
7
+ endpoint = service.ensure() # or service.discover(), which never starts one
8
+ print(endpoint.url)
9
+
10
+ with Opencode.from_service() as client:
11
+ print(client.server.info().version)
12
+
13
+ See :mod:`opencode._service` for how this follows the TypeScript client.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ from ._service import (
19
+ BasicAuth,
20
+ Endpoint,
21
+ EnsureReason,
22
+ PtyMode,
23
+ ServiceError,
24
+ Version,
25
+ async_discover,
26
+ async_ensure,
27
+ async_stop,
28
+ default_file,
29
+ discover,
30
+ ensure,
31
+ headers,
32
+ stop,
33
+ )
34
+
35
+ __all__ = [
36
+ "BasicAuth",
37
+ "Endpoint",
38
+ "EnsureReason",
39
+ "PtyMode",
40
+ "ServiceError",
41
+ "Version",
42
+ "async_discover",
43
+ "async_ensure",
44
+ "async_stop",
45
+ "default_file",
46
+ "discover",
47
+ "ensure",
48
+ "headers",
49
+ "stop",
50
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: opencode-python-sdk
3
- Version: 0.2.0
3
+ Version: 0.2.3
4
4
  Summary: Typed Python client for the OpenCode 2.x server API
5
5
  Project-URL: Homepage, https://github.com/shrijayan/opencode-python-sdk
6
6
  Project-URL: Documentation, https://shrijayan.github.io/opencode-python-sdk/
@@ -31,6 +31,8 @@ Requires-Dist: anyio<5,>=4.4
31
31
  Requires-Dist: httpx<1,>=0.27
32
32
  Requires-Dist: pydantic<3,>=2.12
33
33
  Requires-Dist: typing-extensions>=4.12
34
+ Provides-Extra: aiohttp
35
+ Requires-Dist: httpx-aiohttp<0.3,>=0.1.9; extra == 'aiohttp'
34
36
  Provides-Extra: pty
35
37
  Requires-Dist: websockets<17,>=14; extra == 'pty'
36
38
  Description-Content-Type: text/markdown
@@ -116,6 +118,27 @@ async def main() -> None:
116
118
  asyncio.run(main())
117
119
  ```
118
120
 
121
+ ### aiohttp transport
122
+
123
+ For high-concurrency asyncio code you can swap httpx's networking for [aiohttp](https://docs.aiohttp.org). Install
124
+ the extra and pass `DefaultAioHttpClient` as `http_client`:
125
+
126
+ ```bash
127
+ pip install 'opencode-python-sdk[aiohttp]'
128
+ ```
129
+
130
+ ```python
131
+ from opencode import AsyncOpencode, DefaultAioHttpClient
132
+
133
+
134
+ async def main() -> None:
135
+ async with DefaultAioHttpClient() as http, AsyncOpencode("http://127.0.0.1:4096", http_client=http) as client:
136
+ info = await client.server.info()
137
+ ```
138
+
139
+ Retries, timeouts and event streams work the same. aiohttp runs on asyncio only, not trio. The client does not close
140
+ an `http_client` you pass in, so close it yourself as above.
141
+
119
142
  ## Calling the API
120
143
 
121
144
  Methods mirror the official TypeScript client: `client.<group>.<operation>()`, with names in `snake_case`. Path
@@ -350,6 +373,15 @@ client.session.get("ses_...", timeout=5.0) # per call
350
373
 
351
374
  The default timeout is 10 minutes with a 10 second connect timeout.
352
375
 
376
+ `with_options` (alias `copy`) returns a client with some options changed: `timeout`, `max_retries`, `base_url`,
377
+ `password`, `directory`, `default_headers` and `default_query` (headers and query are merged over the current
378
+ ones). The copy shares the original's connection pool, and closing it leaves the pool open.
379
+
380
+ ```python
381
+ client.with_options(max_retries=0).session.create() # no retries for this call
382
+ scoped = client.with_options(directory="/other/repo", default_headers={"X-Trace": "1"})
383
+ ```
384
+
353
385
  ## Running an agent headless
354
386
 
355
387
  `client.session.run` does the usual "prompt an agent and wait" round trip in one call: it creates a session (or
@@ -419,6 +451,27 @@ with server:
419
451
  The server runs in `--stdio` mode, so it also exits when the Python process dies. `AsyncOpencodeServer` is the
420
452
  async equivalent.
421
453
 
454
+ ### The background service
455
+
456
+ OpenCode can also run one shared background server per user (`opencode serve --service`), which registers itself in
457
+ `$XDG_STATE_HOME/opencode/service.json`. `Opencode.from_service()` connects to it, starting it first if it is not
458
+ running:
459
+
460
+ ```python
461
+ from opencode import Opencode, service
462
+
463
+ with Opencode.from_service(version="2.1.2") as client: # replaces a service running another version
464
+ print(client.server.info().version)
465
+
466
+ endpoint = service.discover() # an Endpoint, or None; never starts anything
467
+ service.stop(pty="handoff") # hand persistent terminals to the next service instead of closing them
468
+ ```
469
+
470
+ `service.ensure()` returns the `Endpoint` (URL and credentials) without creating a client, and `service.headers()`
471
+ gives its `Authorization` header for other HTTP clients. Concurrent callers are safe: they race to start the service
472
+ and all get the one that won. `await AsyncOpencode.from_service()`, `service.async_discover()`,
473
+ `service.async_ensure()` and `service.async_stop()` are the async equivalents.
474
+
422
475
  ## Advanced
423
476
 
424
477
  ```python
@@ -436,7 +489,63 @@ client.session.create(title="t", extra_headers={"X-Trace": "1"}, extra_body={"fu
436
489
  ```
437
490
 
438
491
  Logs go to the `opencode` logger. `logging.getLogger("opencode").setLevel(logging.DEBUG)` shows every request and
439
- retry; credentials are never logged.
492
+ retry; credentials are never logged. Set `OPENCODE_LOG=debug` (or `info`) to have the SDK attach a stderr handler at
493
+ that level on import, without touching your own logging config.
494
+
495
+ ### Accessing raw response data
496
+
497
+ Prefix any method with `.with_raw_response` to get the HTTP response (headers, status, request) instead of the
498
+ parsed value. `.parse()` returns what the plain call would have returned:
499
+
500
+ ```python
501
+ response = client.session.with_raw_response.get("ses_...")
502
+ print(response.status_code, response.headers.get("content-type"))
503
+ session = response.parse() # SessionInfo
504
+ ```
505
+
506
+ `.with_raw_response` reads the body before returning. `.with_streaming_response` does not: it is a context manager
507
+ that sends the request on entry and closes the connection on exit, so you can read large bodies incrementally with
508
+ `iter_bytes()`, `iter_text()` or `iter_lines()`, or still call `parse()`:
509
+
510
+ ```python
511
+ with client.file.with_streaming_response.read("big.log") as response:
512
+ for line in response.iter_lines():
513
+ ...
514
+ ```
515
+
516
+ Both exist on every resource and sub-resource of both clients (`async with` and `await response.parse()` on
517
+ `AsyncOpencode`). `APIResponse` also has `.http_response`, `.request`, `.text`, `.json()` and `.read()`.
518
+
519
+ - **List methods** give the response of the first page; `parse()` returns a `SyncCursorPage` / `AsyncCursorPage`
520
+ that fetches the following pages as usual.
521
+ - **Event streams** are never read eagerly: `parse()` returns the `Stream` / `AsyncStream`, which reads events as
522
+ you iterate. Close the stream (or the response) when done.
523
+ - Error statuses still raise `APIStatusError` subclasses; the response is on the exception as `error.response`.
524
+ - Hand-written helpers such as `client.session.run()` and `client.pty.attach()` are not wrapped.
525
+
526
+ ### Making custom/undocumented requests
527
+
528
+ Undocumented parameters go through `extra_headers`, `extra_query` and `extra_body` on every method (see above). For
529
+ an endpoint the client has no method for, `client.get`, `post`, `put`, `patch` and `delete` send a request relative
530
+ to `base_url` with the client's authentication, retries and typed errors, and return the decoded JSON:
531
+
532
+ ```python
533
+ data = client.post("/api/new-endpoint", body={"key": "value"}, query={"directory": "/repo"})
534
+
535
+ # Validate into a type, e.g. a response wrapped in {"data": ...}:
536
+ from opencode.types import SessionInfo
537
+
538
+ payload = client.get("/api/session/ses_...", cast_to=dict[str, SessionInfo])
539
+ ```
540
+
541
+ ### Determining the installed version
542
+
543
+ ```python
544
+ import opencode
545
+
546
+ print(opencode.__version__) # this package
547
+ print(opencode.API_VERSION) # the OpenCode server version it was generated from
548
+ ```
440
549
 
441
550
  ## Versioning
442
551
 
@@ -0,0 +1,67 @@
1
+ opencode/.generated.json,sha256=QNCFazAYhcwsGf0l4A2EeSpm2HOM7TRBE648Zyoeq_s,1383
2
+ opencode/__init__.py,sha256=uFhaydHB2cVpDXMBigE7BuQdfworI6SrLd-cqQQuQck,5996
3
+ opencode/_aiohttp.py,sha256=XQFDyjGD-yusekbWS3wO-_IvgooMY-vI3-_fUHHy3VM,1650
4
+ opencode/_base_client.py,sha256=UKK8NKgimaKJYktUeJpQfYECOQYedeOQilwk58DBiuI,30816
5
+ opencode/_client.py,sha256=NOrxaarGFg5XH5_B2bJ6AJQi1mpPIe2eWEwcEu1l6lM,15658
6
+ opencode/_constants.py,sha256=-B_D8RHElL4mYN__WVf4bag4D12dJHbL69_EMfi7bXo,1132
7
+ opencode/_errors.py,sha256=dWjsyGV0aDBKsvJrGNKGJn41Yue66yBBwGTT2pTV7E8,16431
8
+ opencode/_events.py,sha256=Pg6zgPT37GHRITM5HvuxC6hmdZVrd2msyfsFQPoOAcQ,30179
9
+ opencode/_exceptions.py,sha256=kqQiaSM6zbfyiXXddwapIymW7J61ZlAa767Yko5Y9EI,8720
10
+ opencode/_logs.py,sha256=hLGaKLZLmZRM78yZU5_5YxdvYy7Ax0nmlK5DEr1_8kw,1079
11
+ opencode/_models.py,sha256=2esvD2CmslOHCbuLNkN0sGDcgMAqeoMmB7hZMPzo1uA,1988
12
+ opencode/_pagination.py,sha256=LKHRgB0yfHjeBuzT5UiC9I5epyJZPjVXPeDRe2JNSYI,7622
13
+ opencode/_pty.py,sha256=wdqBF7K40ikzas8i203pem2iov8nbgYDC-RqH6ZX41E,23429
14
+ opencode/_qs.py,sha256=8EWbLzd-iLComngGRyO95f_z76j4tUeBihYJdHI5NP8,3643
15
+ opencode/_resource.py,sha256=ovuG85mWcuXNTu5m6H9FKPN2rrD5o52oRFAGBHimPyg,1263
16
+ opencode/_response.py,sha256=6I7tDD_1g62AVI669dvEQQJQJim1UsJ_LB-LbG6-Vsw,10968
17
+ opencode/_rpc.py,sha256=WrPQ_hRhsneXLvYj7WwEADC6_OCMRE5muuWVoysKPok,17708
18
+ opencode/_server.py,sha256=O-yVWU-v7HDJuVav1xXTil96BtvvbYMsHm1zLhneWKk,12849
19
+ opencode/_service.py,sha256=LtkGdZBbRH6I7F6PYnzMNNOqXudze_Uy3HO_ghnCPf4,36622
20
+ opencode/_streaming.py,sha256=TfnfZaNucjLrpfOB9m1i_sRtjYoACztTflavrhwvnDE,8861
21
+ opencode/_types.py,sha256=Z8bYxzpZhPRtisvPUv9R5g4oBlC23iXR70fFzReTOc0,2194
22
+ opencode/_unions.py,sha256=dW0dTmP2QK2lL6RhyK2YsjD2yNbO8Ah6pk-i5ySW3lo,1518
23
+ opencode/_version.py,sha256=zNErHu8z_g6ScOeYcO8QAiktg036FVPaUiIIZefeoLU,259
24
+ opencode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ opencode/service.py,sha256=kFjQ4mjV30-VXx5B22ZPUs0V0e__fyTZ2Yj2VAoUrbU,921
26
+ opencode/testing.py,sha256=_EGoh9SwC5WCwbXjm5AtbyAzB4zyO5xX2N-skMLHzR4,21069
27
+ opencode/lib/__init__.py,sha256=mWBVu6RUOqMNJHHZPLq2nkks7QdsWJgLPN44BmfDv9s,120
28
+ opencode/lib/_ready.py,sha256=dhX-n6DDjRWsYJ95paxt1i5WnlU_KsFsTqgkJEt01Q4,3286
29
+ opencode/lib/_session.py,sha256=SCmBOYWdDyoCGKJ5YF2eQPxu8R0TmVhcV4C_xl1jFKA,9212
30
+ opencode/resources/__init__.py,sha256=wNPQqEDgNYedtWhub2wVWL85jEoE2qCQQHks5WHyAoM,13239
31
+ opencode/resources/agent.py,sha256=NGGpfmC-qN5ffhAmHDFbr9uqal4UrFFoV_q95sXDDog,8110
32
+ opencode/resources/command.py,sha256=3BuQAEdPZxl-ZbVlLd7g_HM71VW2vCIJter-TRjuCXI,5349
33
+ opencode/resources/config.py,sha256=M5l-SNKypzpnZ4NYRfrRQQeGUum3idt4GcqfoAwWV0s,10695
34
+ opencode/resources/credential.py,sha256=TIqLzDHxI9HNJGTmh7owONbWB5ec_HO6fu_A6S40Ejw,16116
35
+ opencode/resources/debug.py,sha256=eN5jQq2PhM8cSo6xLODaGRUCC2ro0jjVLwuinIr8jms,11083
36
+ opencode/resources/event.py,sha256=PKMsZJWqW4SsZunkahfvCR92JRynWwkDPYPXGL_leWE,5039
37
+ opencode/resources/experimental.py,sha256=o9nAG9ZtCwwSaEqJqvbZcrLFJMFWVCzyArvec-XJd5k,36738
38
+ opencode/resources/file.py,sha256=Nd4jM2sAGbLSCUE0JVSyWKOQ1vPqRF2NHXGc8Myw1Zo,16011
39
+ opencode/resources/form.py,sha256=ojUOq03eafhDD8uHi3sz5ikI3cndfCqN7Bj2RsryrVQ,5237
40
+ opencode/resources/generate.py,sha256=Fe5rSZEGXoSxUCLqI488nbSP0rugbPsFY4eaTZysxc8,6105
41
+ opencode/resources/integration.py,sha256=wSnvumY5uClDLUH0Zn8BnUVFLZMB8auvLMzClB3feF0,56595
42
+ opencode/resources/location.py,sha256=vGm2Q5CQzeIWjcaEBZYdSWQZWohTlrvfx8TtsO3pFW8,8111
43
+ opencode/resources/mcp.py,sha256=xoNbPrGDg5nJd-iZbngTWQVBi_d9d90OvBPsYZGae6w,23579
44
+ opencode/resources/message.py,sha256=ijfUZeu2yW8blfvK0GMTi6A5XIAo7lkMynmocuKwlo4,8247
45
+ opencode/resources/migration.py,sha256=3Zziv3qaNz0xagVE6bVE_ixdT7n9uSZBMKPyaDVaF2o,9316
46
+ opencode/resources/model.py,sha256=mBlFdz0hptyiAKsgky3gDaCW3PuLXdL4fI2UA_44hAI,8393
47
+ opencode/resources/permission.py,sha256=d4eZ95g6Z2urkESB1NhPh6y5kVWnF98Ph3ldB1G8uT8,35004
48
+ opencode/resources/plugin.py,sha256=odLQI9ew6xprws6ee5oSNJXY6i2brQpsMUNlopBLhgM,11225
49
+ opencode/resources/project.py,sha256=Uc2xjtvETOEBGIcZ7iQnrWQmA7hnOlhwIaDviXQFkV8,8734
50
+ opencode/resources/provider.py,sha256=zgJleoyUVtxEyFH2AAYRDcvx587P8itZEQgnyafqNX4,8746
51
+ opencode/resources/pty.py,sha256=MffZdlyazDh-xW8YYwCzH5WivLRmEy_8wi-TC7bGwCk,24105
52
+ opencode/resources/reference.py,sha256=TNQEspW00Rt4nc8E5JMkl8cRCCrFcFcxUxaPWaYAnFk,5459
53
+ opencode/resources/rpc.py,sha256=IOEeFCl86emHp_Tt0wdIoX2TxTSikEv8B3acs2GX8Fo,5880
54
+ opencode/resources/server.py,sha256=ApzkIhOEotm3b9fttg-_rtvluYdK_LdbEIF0yGwlohc,9794
55
+ opencode/resources/session.py,sha256=kzfU2V-uPGRl4Iwx_1VKyFzNLKIwLVj_RG3o4pRrNuA,162305
56
+ opencode/resources/shell.py,sha256=2TCGlcjpMTcDIfLxPcCpTUKg51UJemuxFsIzKSsObb8,17419
57
+ opencode/resources/skill.py,sha256=JVKatvZqccjCiDfSPlXEU-ZsmkdiBGOYVGSQ2gR5r5E,5261
58
+ opencode/resources/vcs.py,sha256=Pls1NtM2a5QbSmp4FCxdkohYP2KYziPi6Zl4jOGsNv8,24205
59
+ opencode/resources/voice.py,sha256=0zrS6qHVy2zdNB1q7IA3b8hV7VmojIzvqjZYPzS6pPY,6248
60
+ opencode/resources/websearch.py,sha256=zff0HjcK_jfiWj08zW-SQ_Cp4oBZQPk7MZIPP2q3O_Y,8893
61
+ opencode/resources/worktree.py,sha256=rc7kLpxlzJgbZw4pwqmNZqofgZCf4l6D-Xm2Rafa7vU,14542
62
+ opencode/types/__init__.py,sha256=5JEAe89RPSwJw1yz0kufBxtEJgRsMpZXj7KTbzGX45A,60935
63
+ opencode/types/_generated.py,sha256=c3zBAfVpZGJ9TX4FqrMZASmoxRntel_QzVuP85BOJwU,235015
64
+ opencode_python_sdk-0.2.3.dist-info/METADATA,sha256=SEyW2qi5J-n1KGeY7m6qjqMmMkiEWiGHhubkQ1zt-7I,22905
65
+ opencode_python_sdk-0.2.3.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
66
+ opencode_python_sdk-0.2.3.dist-info/licenses/LICENSE,sha256=SbiOG1an_-gZ0gwGLS0tsbUnMHA7tYX22FgP1EqzrH4,1093
67
+ opencode_python_sdk-0.2.3.dist-info/RECORD,,
@@ -1,62 +0,0 @@
1
- opencode/.generated.json,sha256=QNCFazAYhcwsGf0l4A2EeSpm2HOM7TRBE648Zyoeq_s,1383
2
- opencode/__init__.py,sha256=pOp2V1rsw6AXX5sfjq6BHcntuVzq2ZOC3-O9x-wfWFo,5641
3
- opencode/_base_client.py,sha256=oA7Yah1WYyw16WrF_x76T1uZE5Arwt4jQMK8gyrL_4Y,21008
4
- opencode/_client.py,sha256=cVJmxAZR9TGvQ9zb4glmxcLHQcbyL3kFI56yYPAzQhA,10722
5
- opencode/_constants.py,sha256=-B_D8RHElL4mYN__WVf4bag4D12dJHbL69_EMfi7bXo,1132
6
- opencode/_errors.py,sha256=dWjsyGV0aDBKsvJrGNKGJn41Yue66yBBwGTT2pTV7E8,16431
7
- opencode/_events.py,sha256=Pg6zgPT37GHRITM5HvuxC6hmdZVrd2msyfsFQPoOAcQ,30179
8
- opencode/_exceptions.py,sha256=kqQiaSM6zbfyiXXddwapIymW7J61ZlAa767Yko5Y9EI,8720
9
- opencode/_models.py,sha256=2esvD2CmslOHCbuLNkN0sGDcgMAqeoMmB7hZMPzo1uA,1988
10
- opencode/_pagination.py,sha256=uvB-0IwfkGqbYIYiUW_ax_oAE-ldZJSWHtjluVcZlNk,7052
11
- opencode/_pty.py,sha256=wdqBF7K40ikzas8i203pem2iov8nbgYDC-RqH6ZX41E,23429
12
- opencode/_qs.py,sha256=8EWbLzd-iLComngGRyO95f_z76j4tUeBihYJdHI5NP8,3643
13
- opencode/_resource.py,sha256=ovuG85mWcuXNTu5m6H9FKPN2rrD5o52oRFAGBHimPyg,1263
14
- opencode/_rpc.py,sha256=WrPQ_hRhsneXLvYj7WwEADC6_OCMRE5muuWVoysKPok,17708
15
- opencode/_server.py,sha256=O-yVWU-v7HDJuVav1xXTil96BtvvbYMsHm1zLhneWKk,12849
16
- opencode/_streaming.py,sha256=TfnfZaNucjLrpfOB9m1i_sRtjYoACztTflavrhwvnDE,8861
17
- opencode/_types.py,sha256=Z8bYxzpZhPRtisvPUv9R5g4oBlC23iXR70fFzReTOc0,2194
18
- opencode/_unions.py,sha256=dW0dTmP2QK2lL6RhyK2YsjD2yNbO8Ah6pk-i5ySW3lo,1518
19
- opencode/_version.py,sha256=zNErHu8z_g6ScOeYcO8QAiktg036FVPaUiIIZefeoLU,259
20
- opencode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- opencode/testing.py,sha256=_EGoh9SwC5WCwbXjm5AtbyAzB4zyO5xX2N-skMLHzR4,21069
22
- opencode/lib/__init__.py,sha256=mWBVu6RUOqMNJHHZPLq2nkks7QdsWJgLPN44BmfDv9s,120
23
- opencode/lib/_ready.py,sha256=dhX-n6DDjRWsYJ95paxt1i5WnlU_KsFsTqgkJEt01Q4,3286
24
- opencode/lib/_session.py,sha256=SCmBOYWdDyoCGKJ5YF2eQPxu8R0TmVhcV4C_xl1jFKA,9212
25
- opencode/resources/__init__.py,sha256=wNPQqEDgNYedtWhub2wVWL85jEoE2qCQQHks5WHyAoM,13239
26
- opencode/resources/agent.py,sha256=6vQC__e3cZxkJG-Xeqj66wh4kH1zOpGS9662N2dSa3s,5624
27
- opencode/resources/command.py,sha256=60itt-z1mhUlJEHY7aUy6kUerIdostbhZf7y0I6EK74,3073
28
- opencode/resources/config.py,sha256=L6FbrXeegplUsTjHQZX1KsAaGA0Yy0_w8MP8V5dRo7Q,7699
29
- opencode/resources/credential.py,sha256=Z464vfgOSXMB-pi4LCCnUR4mWRtmFpefqlZ9rWQP_Fk,12084
30
- opencode/resources/debug.py,sha256=sZvMb7WsiB65O-B3-U4DablrUWctOOvd6BWY_t6SW3w,5537
31
- opencode/resources/event.py,sha256=zsaY6bmBt5zYCxxghJzWCyG342_2uAAP1xsVgyTaYwc,2763
32
- opencode/resources/experimental.py,sha256=zfIBB_4TtVdFqBgksk5jmQ-9a_5hpPhPRT1f0vlPQoY,28172
33
- opencode/resources/file.py,sha256=3J06QXIQT5_WLdPse3OLQqMN8ypCR6VsadndAQnHQEg,13013
34
- opencode/resources/form.py,sha256=Lc4Ko_01ABZZTIQi8UOfmSO_xfhWP8UoAr5wBUNdAqY,3021
35
- opencode/resources/generate.py,sha256=RFjg4dBXDhzhxGz5bO50igZZ5-W7bT6PIEw_ED45Su0,3809
36
- opencode/resources/integration.py,sha256=q59coZDkdVcRk53q3wwffrySYAsPT_GMIjbirT7aAXY,37919
37
- opencode/resources/location.py,sha256=Idd0K174jkzJvpEqoucSII1sP8ibuHZIfsz6X5id8_U,5357
38
- opencode/resources/mcp.py,sha256=aC6jLoS18Ez_4nMRsUmxbMGSR2jGFMAPurRuoPKFL10,16401
39
- opencode/resources/message.py,sha256=D5IF_mAD2GnFH8_Ggy7tEXECsm6Jx6dt3CO0haGPfic,5971
40
- opencode/resources/migration.py,sha256=aqwIG6vcFZ1zzKwRR731ZOpLJeUMG7E9f1dIc8YOR4o,4252
41
- opencode/resources/model.py,sha256=1SXCA7r6rukxUC6iar9I33Zs01gNGl92-J3p1LfRo38,5875
42
- opencode/resources/permission.py,sha256=KjcppKC5VwYFB8RvrOO8-tAcERyQtMd-IvNQn-lOigY,24528
43
- opencode/resources/plugin.py,sha256=_wa0UfT-_TGgE1lo3nkODXjyb26EXXB_WHgX8DTcGVQ,8221
44
- opencode/resources/project.py,sha256=HfMDFqKbpzPqmmKg4WAxkM7_J7RfWr1QiWBKuZg-CPU,6184
45
- opencode/resources/provider.py,sha256=f0z-nLqtGzvHSGIHj7LR7eVzLTT60D6Jw2aR7IkMtWs,6200
46
- opencode/resources/pty.py,sha256=dReNx2ETWMhJHmZ53x4JhkkjXRWxVP_kfa5eQYlo3EU,17631
47
- opencode/resources/reference.py,sha256=ovKtRm4vCMD0ulWJncXZIkuCQacBDQYKwOk5QOOHjMg,3143
48
- opencode/resources/rpc.py,sha256=aBTeAvDyBK5NQeO-Yt9mZrqiOB4u4_8dQD082t4pO9s,3684
49
- opencode/resources/server.py,sha256=Vr-uTexG20gtt53c23ny-iGy_BeXYCKJWAnu0P6Uauc,6998
50
- opencode/resources/session.py,sha256=xQXN9_Af3OIlqEDQZPSCiByZkyn3ZXut9GD041Yk0ig,126883
51
- opencode/resources/shell.py,sha256=-VzSkaVOaVM1GZdjM2rz9mAWffg9fnxy9KCseYzti-I,13911
52
- opencode/resources/skill.py,sha256=R44XZaWeSyVZNbHHVUnLsqL81Mlg1cvqMkTYqHSRv_c,3025
53
- opencode/resources/vcs.py,sha256=vZzdowfs4CbCMDDQ_uF48d5P4ym8qw4DZ3Q-_sjbDw8,17811
54
- opencode/resources/voice.py,sha256=cM3eEBopD-DSfwPdiuwSzapeGZyvhroCA97WRrLXXT0,3988
55
- opencode/resources/websearch.py,sha256=hqXcTPq-lGnqB34VMcFL59KbS2vvfwd-JntgUozKAw4,6271
56
- opencode/resources/worktree.py,sha256=rRDysFG4zncjlIgjkwxT2UKkUgLXMr2DxeEfg5j2YrE,11016
57
- opencode/types/__init__.py,sha256=5JEAe89RPSwJw1yz0kufBxtEJgRsMpZXj7KTbzGX45A,60935
58
- opencode/types/_generated.py,sha256=c3zBAfVpZGJ9TX4FqrMZASmoxRntel_QzVuP85BOJwU,235015
59
- opencode_python_sdk-0.2.0.dist-info/METADATA,sha256=Pu1aWz-xygADujt8yWZxXiGeMDR6iLJPNKcTaNU1rdI,17972
60
- opencode_python_sdk-0.2.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
61
- opencode_python_sdk-0.2.0.dist-info/licenses/LICENSE,sha256=SbiOG1an_-gZ0gwGLS0tsbUnMHA7tYX22FgP1EqzrH4,1093
62
- opencode_python_sdk-0.2.0.dist-info/RECORD,,