Releases: mandalacomputer/python-sdk
Releases · mandalacomputer/python-sdk
Release list
v0.10.0
What's Changed
- OPL-5536: Poll the secrets, proxy and desktop waits fast first by @mboyd1 in #184
- OPL-5573: Say a key added through the API reaches only its credential's account by @mboyd1 in #185
- OPL-5617: Decode SshKey.reach, and stop ssh --setup reporting success with a key bound to another account by @mboyd1 in #186
- OPL-5543: Create a computer in a workspace and list one workspace's computers by @mboyd1 in #187
- OPL-5614: Say builds and template writes need an account-wide key by @mboyd1 in #188
- OPL-5544: Decode the page in a focused Chromium window from an input action's context by @mboyd1 in #189
- OPL-5618: Let a credential remove only SSH keys bound to its own account by @mboyd1 in #190
- OPL-5639: Say only an empty workspace can be deleted, not that its computers are kept by @mboyd1 in #191
- OPL-5640: Correct the SSH docstrings: removing a key closes its sessions, and only some members' keys log in by @mboyd1 in #192
- OPL-5645: Raise RequestTimeoutError, a ConnectionInterruptedError that is still a TimeoutError, for a request timeout by @mboyd1 in #193
- OPL-5646: Refuse a value typed as the NAME in mandala-py secrets, retry rm on a revision conflict, show the revision in list by @mboyd1 in #194
- OPL-5647: Document the "plan" disabled reason on Webhook by @mboyd1 in #195
- OPL-5648: Name what mandala lacks in the README instead of claiming full parity by @mboyd1 in #196
- OPL-5649: Accept --json on every mandala-py command, report mandala's error codes, and print the computer's record for a proxy change by @mboyd1 in #197
- OPL-5652: Say dashboard lifecycle calls are recorded and listed in operations, except a move by @mboyd1 in #198
- OPL-5653: Show an SSH key's reach, explain a 404 on ssh-key rm, and stop ssh when every key is refused by @mboyd1 in #199
- OPL-5655: Refuse an id-less computer answer, refresh after an id-less PATCH, and reset operation_id on every PATCH by @mboyd1 in #200
- OPL-5656: Anchor wait_for_move on the started move's started_at, and pass it from move --wait by @mboyd1 in #201
- OPL-5658: Take --idempotency-key on mandala-py's keyed commands, and say how to resend under a failure's key by @mboyd1 in #202
- OPL-5660: Say mandala-py exits 2 for a usage error and 1 otherwise, and pin it for an unknown command by @mboyd1 in #203
- OPL-5662: Say a computer without xclip needs a new one created from an image that includes it by @mboyd1 in #204
- OPL-5664: Name wl-clipboard beside xclip as the clipboard's image requirement by @mboyd1 in #205
- OPL-5665: Release 0.10.0 by @mboyd1 in #206
Full Changelog: v0.9.0...v0.10.0
v0.9.0
What's Changed
- OPL-5459: Wait for the desktop session before launch returns by @mboyd1 in #171
- OPL-5471: Error-shape and CLI polish from the 9/29 API scan by @mboyd1 in #172
- OPL-5472: Click repeat count and post-action window context by @mboyd1 in #173
- OPL-5473: Workspace create, rename and delete by API, SDKs, CLI and MCP by @mboyd1 in #174
- OPL-5499: Add workspaces use and current with a per-profile default workspace by @mboyd1 in #175
- OPL-5489: Point to Settings → Credentials → API keys by @mboyd1 in #176
- OPL-5506: Point to Settings → Credentials → Secrets and Connected apps by @mboyd1 in #177
- OPL-5521: Python SDK parity fixes from the pre-release audit by @mboyd1 in #178
- OPL-5523: Take context on every input action and send a User-Agent naming the SDK by @mboyd1 in #179
- OPL-5524: CLI coverage gaps from the pre-release audit (python-sdk) by @mboyd1 in #180
- OPL-5519: Name each operation across the clients, and say what the CLIs have no command for by @mboyd1 in #181
- OPL-5531: Name the dashboard's Allow managing keys control in the api-keys help and docs by @mboyd1 in #182
- OPL-5532: Release 0.9.0 by @mboyd1 in #183
Full Changelog: v0.8.0...v0.9.0
v0.8.0
What's Changed
- OPL-5331: Name the idempotency key in mandala-py's text errors and let launch() take one by @mboyd1 in #157
- OPL-5334: Stop schedule() overwriting snapshot_schedule with a phantom 00:00 UTC window by @mboyd1 in #158
- OPL-5335: Refuse modifiers given as one string instead of holding each letter by @mboyd1 in #159
- OPL-5308, OPL-5309: Escape the TypeScript CLI's full bidi set in its spelling, and every whoami field by @mboyd1 in #160
- OPL-5367: Escape every name, id and timestamp the CLI prints, not only whoami's (OPL-5366) by @mboyd1 in #161
- OPL-5392: Explain in the README when ssh-config uses the computer id as the Host by @mboyd1 in #162
- OPL-5399: Say to re-run ssh-config --write to replace a block an earlier version wrote under a shadowing name by @mboyd1 in #163
- OPL-5396: Use the id as ssh-config's Host for every IPv4 form macOS reads and for a name a written block uses (OPL-5398) by @mboyd1 in #164
- OPL-5422: Find ssh-config's written blocks in any config, under every Host alias, and let a mutual name clash converge (OPL-5421, OPL-5423, OPL-5424) by @mboyd1 in #165
- OPL-5431: Collapse duplicate ssh-config blocks on --write by @mboyd1 in #166
- OPL-5436: Fix agent 402 mapping, a silent open(), idempotency 5xx guidance and parity gaps by @mboyd1 in #167
- OPL-5441: Stop describing the platform budget on a relayed model 429, and raise a relayed model 404/413 as ModelProviderError (OPL-5442) by @mboyd1 in #168
- OPL-5446: Stop calling a relayed model 429 transient after the agent run took steps by @mboyd1 in #169
- OPL-5451: Release 0.8.0 by @mboyd1 in #170
Full Changelog: v0.7.0...v0.8.0
v0.7.0
What's Changed
- OPL-5048: Wait for bound secrets in launch, return write_file's byte count, and give mandala-py error codes by @mboyd1 in #133
- OPL-5051: list the screenshot's format, quality, region and scale parameters, not yet sent by @mboyd1 in #134
- OPL-5057: list the account's workspace routes, not yet sent by @mboyd1 in #135
- OPL-5053: API keys and whoami in the SDK; whoami, api-keys, logout and --version in mandala-py by @mboyd1 in #136
- OPL-5089: send the screenshot's region, scale, format and quality by @mboyd1 in #137
- OPL-5070, OPL-5073: count words after -- as operands, and repeat nothing typed under secrets by @mboyd1 in #138
- OPL-5071, OPL-5072: refuse a secrets wait nothing will satisfy, and wait after restart by @mboyd1 in #139
- OPL-5105: say an early option belongs after its command when typed with its value by @mboyd1 in #141
- OPL-5055: list the operations routes, not yet sent by @mboyd1 in #140
- OPL-5056: list the browser_proxy body field on create and update, not yet sent by @mboyd1 in #142
- OPL-5144: send a browser proxy on create and change, and wait for it by @mboyd1 in #143
- OPL-5118, OPL-5129: say secrets_delivering may read false or be absent after a restart; rewrap CHANGELOG by @mboyd1 in #144
- OPL-5124: operations.get, list and wait, and the operation id on lifecycle answers by @mboyd1 in #145
- OPL-5142: list the egress_proxy body field on create and update, not yet sent by @mboyd1 in #146
- OPL-5240: Refuse a raw key passed to api_keys.revoke before it reaches a URL by @mboyd1 in #147
- OPL-5237, OPL-5239, OPL-5242, OPL-5189: Keep and set a browser proxy's credentials_secret_id by @mboyd1 in #148
- OPL-5259: Treat the 409 reason
runningas permanent by @mboyd1 in #149 - OPL-5264: Escape control characters in key and account names the CLI prints by @mboyd1 in #150
- OPL-5127: Send an Idempotency-Key on every lifecycle call by @mboyd1 in #151
- OPL-5300: Name what a workspace-scoped key's whoami withholds instead of printing it empty by @mboyd1 in #152
- OPL-5304: Say a resend after a 5xx answers idempotency_outcome_unknown by @mboyd1 in #153
- OPL-5246: Expose egress_proxy on create, update and the computer by @mboyd1 in #154
- OPL-5322: Fix SDK parity and docs before 0.7.0 by @mboyd1 in #155
- OPL-5338: Release 0.7.0 by @mboyd1 in #156
Full Changelog: v0.6.0...v0.7.0
v0.6.0
What's Changed
- OPL-4985: Install the Python command as mandala-py, so mandala is the npm CLI by @mboyd1 in #127
- OPL-4994: list the file upload's overwrite parameter, not yet sent by @mboyd1 in #128
- OPL-4984: list the account secret store routes, not yet sent by @mboyd1 in #130
- OPL-4994: send overwrite=false for a create-only upload by @mboyd1 in #129
- OPL-5026: Audit the Python SDK against the API docs and add the secret store by @mboyd1 in #131
- OPL-5029: release 0.6.0 by @mboyd1 in #132
Full Changelog: v0.5.0...v0.6.0
v0.5.0
What's Changed
- Track file browser API surface gaps (OPL-4871) by @mboyd1 in #101
- test: track execution result API surface gaps by @mboyd1 in #102
- test: track retained activity history API surface by @mboyd1 in #103
- test: track passive platform signals API surface by @mboyd1 in #104
- Add stable execution metadata and independent output reads by @mboyd1 in #105
- Track retained execution output API surface by @mboyd1 in #106
- Track explicit artifact API surface (OPL-4899) by @mboyd1 in #107
- Track synchronous retention and Activities result API (OPL-4899) by @mboyd1 in #108
- Add retained output and artifact client helpers (OPL-4899) by @mboyd1 in #109
- feat: launch a ready computer in one call (OPL-4893) by @mboyd1 in #110
- feat: add opt-in retries for safe reads (OPL-4895) by @mboyd1 in #111
- test: mirror the account quota API operation (OPL-4886) by @mboyd1 in #112
- fix: preserve HTTP error classification and response metadata (OPL-4888) by @mboyd1 in #113
- feat: add typed account quota reads (OPL-4886) by @mboyd1 in #114
- OPL-4892: Read shared credential profiles in Python clients by @mboyd1 in #115
- OPL-4894: Document and test the Python BYOK OpenAI example by @mboyd1 in #116
- test: mirror the SSH key and per-computer SSH routes (OPL-4905) by @mboyd1 in #117
- feat: rename the CLI shell to mandala terminal (OPL-4909) by @mboyd1 in #118
- feat: mandala ssh runs OpenSSH through the gateway, with key and access commands (OPL-4909) by @mboyd1 in #119
- OPL-4880: list the create body's secrets parameter, not yet sent by @mboyd1 in #120
- OPL-4964: list the snapshot clone's memory parameter, not yet sent by @mboyd1 in #121
- OPL-4964: list the snapshot clone's inherit_secrets parameter, not yet sent by @mboyd1 in #122
- OPL-4965: clone a memory snapshot from its disk, or with its secrets by @mboyd1 in #123
- OPL-4963: list the computer secret binding routes, not yet sent by @mboyd1 in #124
- OPL-4974: bind secrets at create, and read and replace a computer's bindings by @mboyd1 in #125
- OPL-4965: release 0.5.0 by @mboyd1 in #126
Full Changelog: v0.4.0...v0.5.0
v0.4.0
What's Changed
- OPL-4666: the documented install fails on a Homebrew Python by @mboyd1 in #87
- Allow empty clipboard writes to clear the selection (OPL-4726) by @mboyd1 in #88
- Clarify webhook idempotency and API usage guidance (OPL-4727) by @mboyd1 in #89
- Make surface inventory parsing fail closed (OPL-4732) by @mboyd1 in #90
- Fix review follow-ups from the fix sweep (OPL-4782) by @mboyd1 in #91
- fix: keep a mid-run refusal's partial agent run (OPL-4804) by @mboyd1 in #92
- fix: read a mirrored constant from code, not from prose (OPL-4805) by @mboyd1 in #93
- fix: carry the strict slash reader's state across a line break (OPL-4824) by @mboyd1 in #94
- Classify the revoked refusal word as permanent (OPL-4826) by @mboyd1 in #95
- Adopt the platform's surface manifest and delete the source scanner (OPL-4837) by @mboyd1 in #96
- docs: a step is an action on the desktop, not a model call and a screenshot (OPL-4858) by @mboyd1 in #98
- read_text_file, the decode read_file deliberately does not do (OPL-4857) by @mboyd1 in #99
- Release 0.4.0 (OPL-4864) by @mboyd1 in #100
Full Changelog: v0.3.0...v0.4.0
v0.3.0
Upgrade if you are on 0.1.0 or 0.2.0
0.1.0 and 0.2.0 are yanked and their releases withdrawn. 0.3.0 is the release to
install.
Breaking
Two behaviours callers may be relying on are different, which is why this is
0.3.0 and not 0.2.1.
| 0.2.0 | 0.3.0 | |
|---|---|---|
wait_until_running(), wait_for_guest() |
refused a suspended or stopped computer outright | refuse only one the platform is holding nothing for; a start it has already admitted is waited for |
wait_for_guest() at its deadline |
raised TimeoutError, whatever the probe had hit |
re-raises a permanent error — authentication, permission, billing, a missing computer, TLS; only transient failures become a readiness timeout |
is_transient() |
answered True for every ConflictError but MoveRequiredError |
also answers False for a template_image_preparing conflict, which wants a deliberate continuation rather than a blind retry |
Added
start(resume_only=True)resumes a saved session without cold-booting a
stopped computer (#80). If no saved session remains, the request succeeds and
the computer stays stopped — the method refreshes and returns the computer, so
read its state when you need to know which of the two happened. Both clients
take the keyword. It needs a platform that understandsresume_only; an older
one may ignore it and cold-boot, and a successful response does not say which
happened.create(template_transfer=...)continues onto an image the platform has
already prepared, rather than starting a fresh build, after a409whose
codeistemplate_image_preparing(#83). The refusal carries
body["preparation"]— the preparation's ownstateanderror, failure
included, which deserves diagnosis before any retry. The token requires the
original nonempty template, cannot be combined withsize, and is not a
create idempotency key: stop after success, and never replay an ambiguous or
lost response. The README works both the sync and async shape end to end.APIError.retry_after—Retry-Afteras seconds, HTTP-date form
included,Nonewhen the header is absent or malformed (#83). It now reaches
every refusal that carries one; before, onlyRateLimitErrorhad it. A delay
is not permission to replay the request.
Fixed
- A valid event stream could fail when several small events arrived in one
decompressed chunk (#85). The decoder applied its size limit to the chunk
before splitting it into events, so a burst past the limit was rejected
although no single frame was near it. The bound now applies per normalized
frame and to the incomplete tail, UTF-8 flush output included, and the scan
advances a cursor rather than recopying the rest of the burst. Oversized
frames, complete or not, are still refused; order, delimiter accounting,
UTF-8, BOM, CRLF and terminal-event handling are unchanged. - A permanent failure at a guest-readiness deadline is no longer buried
(#84).wait_for_guest()raisedTimeoutErrorwhen its last probe had been
refused outright, hiding the error the caller had to handle. Both clients keep
it; only transient failures become a readiness timeout. - A start already under way is no longer refused (#81). The two waits told a
computer nobody is starting apart from one whose start has been admitted using
the running-pool figure the platform publishes, and treat its absence as
unknown rather than as nothing coming: a host too old to report it, or one that
could not be reached, has not said a start is not happening. Waiting there
costs a timeout; refusing costs a machine. A memory fork, which reserves its
RAM at the start of its disk copy and resumes itself at the end while
reportingbuildingthroughout, is waited for as well.