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.
- opencode/__init__.py +14 -0
- opencode/_aiohttp.py +44 -0
- opencode/_base_client.py +237 -11
- opencode/_client.py +115 -3
- opencode/_logs.py +29 -0
- opencode/_pagination.py +14 -0
- opencode/_response.py +316 -0
- opencode/_service.py +1018 -0
- opencode/resources/agent.py +63 -0
- opencode/resources/command.py +59 -0
- opencode/resources/config.py +93 -20
- opencode/resources/credential.py +149 -56
- opencode/resources/debug.py +156 -20
- opencode/resources/event.py +59 -0
- opencode/resources/experimental.py +210 -36
- opencode/resources/file.py +71 -0
- opencode/resources/form.py +59 -0
- opencode/resources/generate.py +59 -0
- opencode/resources/integration.py +538 -128
- opencode/resources/location.py +87 -18
- opencode/resources/mcp.py +252 -82
- opencode/resources/message.py +59 -0
- opencode/resources/migration.py +126 -0
- opencode/resources/model.py +63 -0
- opencode/resources/permission.py +272 -38
- opencode/resources/plugin.py +95 -22
- opencode/resources/project.py +63 -0
- opencode/resources/provider.py +63 -0
- opencode/resources/pty.py +172 -20
- opencode/resources/reference.py +59 -0
- opencode/resources/rpc.py +59 -0
- opencode/resources/server.py +67 -0
- opencode/resources/session.py +1159 -405
- opencode/resources/shell.py +101 -20
- opencode/resources/skill.py +59 -0
- opencode/resources/vcs.py +172 -20
- opencode/resources/voice.py +59 -0
- opencode/resources/websearch.py +63 -0
- opencode/resources/worktree.py +123 -40
- opencode/service.py +50 -0
- {opencode_python_sdk-0.2.0.dist-info → opencode_python_sdk-0.2.3.dist-info}/METADATA +111 -2
- opencode_python_sdk-0.2.3.dist-info/RECORD +67 -0
- opencode_python_sdk-0.2.0.dist-info/RECORD +0 -62
- {opencode_python_sdk-0.2.0.dist-info → opencode_python_sdk-0.2.3.dist-info}/WHEEL +0 -0
- {opencode_python_sdk-0.2.0.dist-info → opencode_python_sdk-0.2.3.dist-info}/licenses/LICENSE +0 -0
opencode/resources/websearch.py
CHANGED
|
@@ -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)
|
opencode/resources/worktree.py
CHANGED
|
@@ -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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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.
|
|
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,,
|
|
File without changes
|
{opencode_python_sdk-0.2.0.dist-info → opencode_python_sdk-0.2.3.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|