opencode-python-sdk 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 (55) hide show
  1. opencode/.generated.json +39 -0
  2. opencode/__init__.py +156 -0
  3. opencode/_base_client.py +518 -0
  4. opencode/_client.py +167 -0
  5. opencode/_constants.py +27 -0
  6. opencode/_errors.py +547 -0
  7. opencode/_exceptions.py +249 -0
  8. opencode/_models.py +54 -0
  9. opencode/_pagination.py +192 -0
  10. opencode/_qs.py +95 -0
  11. opencode/_resource.py +42 -0
  12. opencode/_server.py +327 -0
  13. opencode/_streaming.py +227 -0
  14. opencode/_types.py +77 -0
  15. opencode/_unions.py +46 -0
  16. opencode/_version.py +8 -0
  17. opencode/py.typed +0 -0
  18. opencode/resources/__init__.py +364 -0
  19. opencode/resources/agent.py +177 -0
  20. opencode/resources/command.py +98 -0
  21. opencode/resources/config.py +238 -0
  22. opencode/resources/credential.py +382 -0
  23. opencode/resources/debug.py +174 -0
  24. opencode/resources/event.py +84 -0
  25. opencode/resources/experimental.py +760 -0
  26. opencode/resources/file.py +353 -0
  27. opencode/resources/form.py +98 -0
  28. opencode/resources/generate.py +108 -0
  29. opencode/resources/integration.py +1023 -0
  30. opencode/resources/location.py +160 -0
  31. opencode/resources/mcp.py +488 -0
  32. opencode/resources/message.py +151 -0
  33. opencode/resources/migration.py +118 -0
  34. opencode/resources/model.py +175 -0
  35. opencode/resources/permission.py +698 -0
  36. opencode/resources/plugin.py +248 -0
  37. opencode/resources/project.py +185 -0
  38. opencode/resources/provider.py +181 -0
  39. opencode/resources/pty.py +517 -0
  40. opencode/resources/reference.py +98 -0
  41. opencode/resources/rpc.py +111 -0
  42. opencode/resources/server.py +228 -0
  43. opencode/resources/session.py +3553 -0
  44. opencode/resources/shell.py +410 -0
  45. opencode/resources/skill.py +98 -0
  46. opencode/resources/vcs.py +496 -0
  47. opencode/resources/voice.py +111 -0
  48. opencode/resources/websearch.py +182 -0
  49. opencode/resources/worktree.py +334 -0
  50. opencode/types/__init__.py +1462 -0
  51. opencode/types/_generated.py +8540 -0
  52. opencode_python_sdk-0.1.0.dist-info/METADATA +317 -0
  53. opencode_python_sdk-0.1.0.dist-info/RECORD +55 -0
  54. opencode_python_sdk-0.1.0.dist-info/WHEEL +4 -0
  55. opencode_python_sdk-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,317 @@
1
+ Metadata-Version: 2.5
2
+ Name: opencode-python-sdk
3
+ Version: 0.1.0
4
+ Summary: Typed Python client for the OpenCode 2.x server API
5
+ Project-URL: Homepage, https://github.com/shrijayan/opencode-python-sdk
6
+ Project-URL: Documentation, https://github.com/shrijayan/opencode-python-sdk#readme
7
+ Project-URL: Repository, https://github.com/shrijayan/opencode-python-sdk
8
+ Project-URL: Issues, https://github.com/shrijayan/opencode-python-sdk/issues
9
+ Project-URL: Changelog, https://github.com/shrijayan/opencode-python-sdk/blob/main/CHANGELOG.md
10
+ Author: Shrijayan Rajendran
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: agents,ai,client,coding-agent,opencode,sdk
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Framework :: AsyncIO
16
+ Classifier: Framework :: Pydantic :: 2
17
+ Classifier: Framework :: Trio
18
+ Classifier: Intended Audience :: Developers
19
+ Classifier: Operating System :: OS Independent
20
+ Classifier: Programming Language :: Python :: 3
21
+ Classifier: Programming Language :: Python :: 3 :: Only
22
+ Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Programming Language :: Python :: 3.14
27
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
+ Classifier: Typing :: Typed
29
+ Requires-Python: >=3.10
30
+ Requires-Dist: anyio<5,>=4.4
31
+ Requires-Dist: httpx<1,>=0.27
32
+ Requires-Dist: pydantic<3,>=2.12
33
+ Requires-Dist: typing-extensions>=4.12
34
+ Description-Content-Type: text/markdown
35
+
36
+ # opencode-python-sdk
37
+
38
+ [![CI](https://github.com/shrijayan/opencode-python-sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/shrijayan/opencode-python-sdk/actions/workflows/ci.yml)
39
+ [![PyPI](https://img.shields.io/pypi/v/opencode-python-sdk.svg)](https://pypi.org/project/opencode-python-sdk/)
40
+ [![Python](https://img.shields.io/pypi/pyversions/opencode-python-sdk.svg)](https://pypi.org/project/opencode-python-sdk/)
41
+
42
+ Typed Python client for the [OpenCode](https://github.com/anomalyco/opencode) 2.x server API.
43
+
44
+ > **Unofficial, community-maintained.** This package is not affiliated with or endorsed by the OpenCode team.
45
+ > If the OpenCode maintainers want to take it over, we are happy to transfer this repository and the `opencode-python-sdk`
46
+ > name on PyPI. Open an issue and we will hand it over.
47
+
48
+ - **Complete.** All 142 operations of the OpenCode 2.1 API, sync and async, with typed models for every request,
49
+ response and event (96 event types).
50
+ - **Generated from the source of truth.** The contract is exported from the same Effect `HttpApi` the official
51
+ TypeScript client is built from, so method names and request shapes match it exactly.
52
+ - **Safe to run in production.** Retries only when a request cannot have changed server state, bounded backoff that
53
+ honors `Retry-After`, typed errors for every declared server error, and timeouts on everything.
54
+ - **Forward compatible.** New fields, enum values, union variants and event types from newer servers are kept, not
55
+ rejected, so an older client keeps working after a server upgrade.
56
+ - **Batteries included.** Starts and stops `opencode serve` for you, auto-paginates lists, and streams events.
57
+
58
+ ## Install
59
+
60
+ ```bash
61
+ pip install opencode-python-sdk
62
+ ```
63
+
64
+ The package imports as `opencode`. Requires Python 3.10 or newer. To start a server from Python, install the [OpenCode CLI](https://opencode.ai) too.
65
+
66
+ ## Quick start
67
+
68
+ ```python
69
+ from opencode import OpencodeServer
70
+
71
+ with OpencodeServer(cwd="/path/to/repo") as server, server.client() as client:
72
+ session = client.session.create(title="Review")
73
+ client.session.prompt(session.id, text="Summarize the open TODOs in this repository")
74
+ client.session.wait(session.id)
75
+
76
+ for message in client.message.list(session.id):
77
+ print(message.type)
78
+ ```
79
+
80
+ To connect to a server that is already running:
81
+
82
+ ```python
83
+ from opencode import Opencode
84
+
85
+ client = Opencode("http://127.0.0.1:4096", password="...")
86
+ print(client.server.info().version)
87
+ ```
88
+
89
+ `base_url` and `password` default to the `OPENCODE_BASE_URL` and `OPENCODE_PASSWORD` environment variables. The
90
+ password variable is the same one the OpenCode CLI reads.
91
+
92
+ ## Async
93
+
94
+ `AsyncOpencode` has the same methods. It works with asyncio and trio.
95
+
96
+ ```python
97
+ import asyncio
98
+
99
+ from opencode import AsyncOpencode
100
+
101
+
102
+ async def main() -> None:
103
+ async with AsyncOpencode("http://127.0.0.1:4096", password="...") as client:
104
+ session = await client.session.create(title="Async")
105
+ await client.session.prompt(session.id, text="Hello")
106
+
107
+ async for message in client.message.list(session.id):
108
+ print(message.type)
109
+
110
+
111
+ asyncio.run(main())
112
+ ```
113
+
114
+ ## Calling the API
115
+
116
+ Methods mirror the official TypeScript client: `client.<group>.<operation>()`, with names in `snake_case`. Path
117
+ parameters are positional; everything else is keyword-only.
118
+
119
+ ```python
120
+ client.session.get("ses_...")
121
+ client.session.prompt("ses_...", text="Fix the failing test", resume=True)
122
+ client.session.revert.stage("ses_...", message_id="msg_...")
123
+ client.mcp.list()
124
+ ```
125
+
126
+ The full list is in [api.md](api.md).
127
+
128
+ ### Optional and null arguments
129
+
130
+ The server distinguishes a field that is absent from a field set to `null`. Optional arguments default to
131
+ `NOT_GIVEN` and are left out of the request; passing `None` sends `null`:
132
+
133
+ ```python
134
+ client.session.update("ses_...", title="New title") # sends {"title": "New title"}
135
+ client.session.list(parent_id=None) # only root sessions: parentID=null
136
+ ```
137
+
138
+ ### Models
139
+
140
+ Responses are [pydantic](https://docs.pydantic.dev) models. Attributes are `snake_case`; the wire names stay
141
+ available as aliases, so a model validates server JSON and serializes back to it unchanged.
142
+
143
+ ```python
144
+ from opencode.types import ModelRef
145
+
146
+ session = client.session.create(model=ModelRef(id="claude-sonnet-5-5", provider_id="anthropic"))
147
+ session.project_id # attribute access
148
+ session.to_dict() # {"id": "...", "projectID": "...", ...}
149
+ ```
150
+
151
+ Unions are discriminated, so `isinstance` and `match` narrow them:
152
+
153
+ ```python
154
+ from opencode.types import SessionMessageAssistant, SessionMessageUser
155
+
156
+ for message in client.message.list(session.id):
157
+ match message:
158
+ case SessionMessageUser(text=text):
159
+ print("user:", text)
160
+ case SessionMessageAssistant():
161
+ print("assistant replied")
162
+ case _:
163
+ pass # includes variants added by newer servers
164
+ ```
165
+
166
+ ### Project directory
167
+
168
+ Most endpoints take a `location`. Set a default for the client once:
169
+
170
+ ```python
171
+ client = Opencode("http://127.0.0.1:4096", directory="/path/to/repo")
172
+ client.agent.list() # uses /path/to/repo
173
+ client.agent.list(location={"directory": "/other"}) # per call
174
+ ```
175
+
176
+ ## Pagination
177
+
178
+ List endpoints with cursors return a page. Iterating it fetches the following pages as needed.
179
+
180
+ ```python
181
+ for session in client.session.list(limit=50):
182
+ print(session.title)
183
+
184
+ page = client.session.list(limit=50)
185
+ page.data # this page only
186
+ page.has_next_page()
187
+ next_page = page.next_page()
188
+ ```
189
+
190
+ Async list methods return a paginator: `await` it for the first page, or `async for` over every item.
191
+
192
+ ## Events
193
+
194
+ ```python
195
+ with client.event.subscribe() as events:
196
+ for event in events:
197
+ print(event.type)
198
+ ```
199
+
200
+ Events are typed (`SessionCreatedEvent`, `SessionTextDeltaEvent`, and so on). Event types this client version does
201
+ not know arrive as `UnknownEvent` with all their fields kept. Streams apply only the connect timeout by default, since
202
+ they stay open between events.
203
+
204
+ ## Errors
205
+
206
+ Every error derives from `opencode.OpencodeError`. Errors the server declares are raised as their own class, with a
207
+ typed body:
208
+
209
+ ```python
210
+ import opencode
211
+
212
+ try:
213
+ client.session.get("ses_missing")
214
+ except opencode.SessionNotFoundError as error:
215
+ print(error.error.session_id, error.status_code)
216
+ except opencode.NotFoundError:
217
+ ... # any other 404
218
+ except opencode.APIConnectionError:
219
+ ... # server unreachable
220
+ ```
221
+
222
+ | Status | Class |
223
+ | --- | --- |
224
+ | 400 | `BadRequestError` |
225
+ | 401 | `AuthenticationError` |
226
+ | 403 | `PermissionDeniedError` |
227
+ | 404 | `NotFoundError` |
228
+ | 409 | `ConflictError` |
229
+ | 413 | `ContentTooLargeError` |
230
+ | 429 | `RateLimitError` |
231
+ | 5xx | `InternalServerError` |
232
+ | No response | `APIConnectionError`, `APITimeoutError` |
233
+ | Unexpected body | `APIResponseValidationError` |
234
+
235
+ ## Retries and timeouts
236
+
237
+ The client retries twice by default, with exponential backoff and jitter, and honors `Retry-After` up to 60 seconds.
238
+
239
+ - `GET`, `PUT` and `DELETE` are retried on connection errors and on 408, 429, 500, 502, 503 and 504.
240
+ - `POST` and `PATCH` are retried only when the request cannot have run: when the connection could not be opened, or
241
+ on 429 and 503. A prompt is never sent twice because a response was slow.
242
+
243
+ ```python
244
+ client = Opencode(max_retries=5, timeout=30.0)
245
+ client.with_options(timeout=None).session.wait(session.id) # wait as long as it takes
246
+ client.session.get("ses_...", timeout=5.0) # per call
247
+ ```
248
+
249
+ The default timeout is 10 minutes with a 10 second connect timeout.
250
+
251
+ ## Running a server
252
+
253
+ `OpencodeServer` runs `opencode serve` as a child process on a free local port with a random password:
254
+
255
+ ```python
256
+ from opencode import OpencodeServer
257
+
258
+ server = OpencodeServer(
259
+ cwd="/path/to/repo",
260
+ isolated=True, # ignore project opencode.json, AGENTS.md and Claude Code files
261
+ config={"model": "anthropic/claude-sonnet-5-5"}, # passed as OPENCODE_CONFIG_CONTENT
262
+ )
263
+ with server:
264
+ client = server.client()
265
+ ...
266
+ ```
267
+
268
+ The server runs in `--stdio` mode, so it also exits when the Python process dies. `AsyncOpencodeServer` is the
269
+ async equivalent.
270
+
271
+ ## Advanced
272
+
273
+ ```python
274
+ import httpx
275
+
276
+ from opencode import Opencode
277
+
278
+ client = Opencode(
279
+ "https://opencode.internal.example.com",
280
+ http_client=httpx.Client(proxy="http://proxy:8080", verify="/etc/ssl/ca.pem"),
281
+ default_headers={"X-Team": "platform"},
282
+ )
283
+
284
+ client.session.create(title="t", extra_headers={"X-Trace": "1"}, extra_body={"future": True})
285
+ ```
286
+
287
+ Logs go to the `opencode` logger. `logging.getLogger("opencode").setLevel(logging.DEBUG)` shows every request and
288
+ retry; credentials are never logged.
289
+
290
+ ## Versioning
291
+
292
+ | `opencode-python-sdk` (this package) | OpenCode server |
293
+ | --- | --- |
294
+ | 0.1.x | 2.1.x |
295
+
296
+ `opencode.API_VERSION` is the server version the client was generated from. The package follows semantic
297
+ versioning and releases automatically on every merge to `main`; until 1.0, minor versions may contain breaking
298
+ changes. See the [releases page](https://github.com/shrijayan/opencode-python-sdk/releases).
299
+
300
+ ## How it is built
301
+
302
+ ```
303
+ @opencode/protocol (npm) ──bun codegen/extract──▶ spec/contract.json ──python -m codegen──▶ src/opencode
304
+ ```
305
+
306
+ 1. `codegen/extract/extract.ts` loads `ClientApi` from the published `@opencode/protocol` package and exports
307
+ every endpoint, its inputs, outputs and declared errors, and every schema as JSON Schema.
308
+ 2. `python -m codegen` turns the contract into pydantic models (`opencode/types`), resources
309
+ (`opencode/resources`), error classes (`opencode/_errors.py`) and [api.md](api.md).
310
+ 3. The transport, retries, streaming, pagination and server launcher are written by hand.
311
+
312
+ Generated code is committed. CI regenerates it and fails if anything changed. See
313
+ [CONTRIBUTING.md](CONTRIBUTING.md).
314
+
315
+ ## License
316
+
317
+ MIT
@@ -0,0 +1,55 @@
1
+ opencode/.generated.json,sha256=QNCFazAYhcwsGf0l4A2EeSpm2HOM7TRBE648Zyoeq_s,1383
2
+ opencode/__init__.py,sha256=UGraxBEfh90WBSAQ7ccwxJsXE5AxYDDTyKlcXhqzykc,4106
3
+ opencode/_base_client.py,sha256=3BwhIXL-cFGoRUuwDzTeFH21O7pihUR5CryOlS1Wylo,20108
4
+ opencode/_client.py,sha256=ip-UhWyHTViMnqgX3jhUmCkscahFtXnIWM2Jd2zn61I,6723
5
+ opencode/_constants.py,sha256=-B_D8RHElL4mYN__WVf4bag4D12dJHbL69_EMfi7bXo,1132
6
+ opencode/_errors.py,sha256=dWjsyGV0aDBKsvJrGNKGJn41Yue66yBBwGTT2pTV7E8,16431
7
+ opencode/_exceptions.py,sha256=-a4nw3bKU239kn6boBAcw7Fszw6nF1mqzHFJKEcX-Pc,7996
8
+ opencode/_models.py,sha256=2esvD2CmslOHCbuLNkN0sGDcgMAqeoMmB7hZMPzo1uA,1988
9
+ opencode/_pagination.py,sha256=uvB-0IwfkGqbYIYiUW_ax_oAE-ldZJSWHtjluVcZlNk,7052
10
+ opencode/_qs.py,sha256=8EWbLzd-iLComngGRyO95f_z76j4tUeBihYJdHI5NP8,3643
11
+ opencode/_resource.py,sha256=ovuG85mWcuXNTu5m6H9FKPN2rrD5o52oRFAGBHimPyg,1263
12
+ opencode/_server.py,sha256=o_YgzX8x2gUuWXbOKptgF-7AJPhjN8T-1pCzmUSKelw,12297
13
+ opencode/_streaming.py,sha256=OJJNoFdvx6degaVnnQNhv9augigImoYjGzEdnI3FVkk,7905
14
+ opencode/_types.py,sha256=Z8bYxzpZhPRtisvPUv9R5g4oBlC23iXR70fFzReTOc0,2194
15
+ opencode/_unions.py,sha256=dW0dTmP2QK2lL6RhyK2YsjD2yNbO8Ah6pk-i5ySW3lo,1518
16
+ opencode/_version.py,sha256=zNErHu8z_g6ScOeYcO8QAiktg036FVPaUiIIZefeoLU,259
17
+ opencode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ opencode/resources/__init__.py,sha256=wNPQqEDgNYedtWhub2wVWL85jEoE2qCQQHks5WHyAoM,13239
19
+ opencode/resources/agent.py,sha256=Dm1RUA00EiF2nh4GBMjPj-dDxfN_cplcpV0fvokwnzw,5194
20
+ opencode/resources/command.py,sha256=XWclziA5le4bwXhgGP3FDvBL-n8SECqT3qCtZlUn6Bk,2863
21
+ opencode/resources/config.py,sha256=o8Ep5qkD5Dz3P7_Q7j2rmkWLo1iky3tgcfTLAZusnec,7169
22
+ opencode/resources/credential.py,sha256=fTaS-Zz48U6QN0rKuMIVF4mn_7YO5BKoJxmpEr5GoNc,11446
23
+ opencode/resources/debug.py,sha256=PK9BAURu_E66wgrS_8NgWvoviFnwBM5w0ZQgED_3UAs,5159
24
+ opencode/resources/event.py,sha256=1r0lWil6rbN-NOWhZlLmrxrvoAeqtMpqyBrHqXgEAKo,2590
25
+ opencode/resources/experimental.py,sha256=MijdyFk6cYyFNFmigb6eBdWtiKaRJyismTWCpbMzAHo,25947
26
+ opencode/resources/file.py,sha256=cDn1cMCXBUY8EMImvpRwdzLIUBwbOIeRGNVuBsnMa04,12215
27
+ opencode/resources/form.py,sha256=AunzhyF3zBT8Y_e8vZlDKe8EVAHLO5kaKTI2QYwIYAk,2811
28
+ opencode/resources/generate.py,sha256=pSRD_s0vAe2EOfRndXCwauG63l-u0WKVNXQQM0tS700,3547
29
+ opencode/resources/integration.py,sha256=dQIjpRt2SPPFhgIDijjFTSKRGJEhWv2-xFqwYawYR1g,34861
30
+ opencode/resources/location.py,sha256=ZbuH1IGRBI84VeIg6QYTPBZk7BX0SOuemzIs6_VEYhQ,4991
31
+ opencode/resources/mcp.py,sha256=IDSfsLNGUEDWRZOXKo5cKosUge42MyQLT1_vdbXvlEU,15131
32
+ opencode/resources/message.py,sha256=6noqDNBLqOsqXye5ijU-aAKhY8yjLeb3Y9531oDcx24,5686
33
+ opencode/resources/migration.py,sha256=6GjaHwj1wGpOjjkbYc-G-32EdwiZZc0V_CIUxKu-KvY,4042
34
+ opencode/resources/model.py,sha256=QcpIcE4kLumV8RhFlz4nq0UqoXLgOCq71RON8wFFIos,5397
35
+ opencode/resources/permission.py,sha256=wMi2ifGzazbQ3AJ1uuVYrqbpLbf5Bqx9HZpjVwuQkqQ,22506
36
+ opencode/resources/plugin.py,sha256=2yVeINHnwNVHi6YQPqcCJ7uJnUwfEdwSqvaPOiLzi0k,7639
37
+ opencode/resources/project.py,sha256=ZCRWQdSSk6YvVz_J98Rs92woe6Ts8sTEmfJxVUqQSvU,5750
38
+ opencode/resources/provider.py,sha256=SBJdP0SDf7qiDwxYGlu45-jTuppU4yYyg52WEtHZvVs,5666
39
+ opencode/resources/pty.py,sha256=jOX2CrFO-grFz3kr5BCr-dVIivj1JDulkMGOIQqceVw,16174
40
+ opencode/resources/reference.py,sha256=iiDzB6rfooys1O6rZIGL4dW07HpS8nYu0-G83AsUtIo,2933
41
+ opencode/resources/rpc.py,sha256=4Q7jkLWa4dKG8n-foWtMp-b9QU5S8B3xi_qFc7t7GXA,3370
42
+ opencode/resources/server.py,sha256=hGtDtm3vPzghvR_U5CihpdIr5sEbdcdxz_4EbdqgCJU,6620
43
+ opencode/resources/session.py,sha256=9adcy6D0I7cFlpntOyxxEHX2CdDEyJz0SJlfjWfykgI,116310
44
+ opencode/resources/shell.py,sha256=UHQvJCGJWKkywsRx-5-wriGaczr9NIkYuy1ZArZeMxA,12945
45
+ opencode/resources/skill.py,sha256=w06gWcoempzGaFqVFMQZJ3EOyga6q6-gEbACAcRw9JQ,2815
46
+ opencode/resources/vcs.py,sha256=_00yFMlt6SjSft7GRBdhdr0KAruLjFmuNGk5cMFadU4,16417
47
+ opencode/resources/voice.py,sha256=N6v_Eeg3G5PCAzCgup2CnIAuZD-0-JNMqAIV5dsFYmQ,3726
48
+ opencode/resources/websearch.py,sha256=spYgRg0SoC6bhvk7ZVKzrPkRJ9UZvY9DSTT7hRmNHxE,5789
49
+ opencode/resources/worktree.py,sha256=jlBa4RuocApapVAMLr4qnUhc2e_AdFeVoPXGxJPIGiM,10170
50
+ opencode/types/__init__.py,sha256=5JEAe89RPSwJw1yz0kufBxtEJgRsMpZXj7KTbzGX45A,60935
51
+ opencode/types/_generated.py,sha256=c3zBAfVpZGJ9TX4FqrMZASmoxRntel_QzVuP85BOJwU,235015
52
+ opencode_python_sdk-0.1.0.dist-info/METADATA,sha256=VuwTwpUpnuei27jYXrDjUHRvRskei1k4bKv5BtsUBFA,11316
53
+ opencode_python_sdk-0.1.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
54
+ opencode_python_sdk-0.1.0.dist-info/licenses/LICENSE,sha256=SbiOG1an_-gZ0gwGLS0tsbUnMHA7tYX22FgP1EqzrH4,1093
55
+ opencode_python_sdk-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.4
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Shrijayan Rajendran and contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.