Skip to content

Releases: mandalacomputer/python-sdk

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 03 Oct 19:42
b86e1ce

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

Choose a tag to compare

@github-actions github-actions released this 01 Oct 04:16
8ab17ac

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

Choose a tag to compare

@github-actions github-actions released this 29 Sep 17:14
fd98470

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

Choose a tag to compare

@github-actions github-actions released this 27 Sep 20:58
e6ab30a

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 running as 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

Choose a tag to compare

@github-actions github-actions released this 25 Sep 03:44
6d997b6

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

Choose a tag to compare

@github-actions github-actions released this 23 Sep 20:01
239c6ab

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

Choose a tag to compare

@github-actions github-actions released this 14 Sep 16:43
5748841

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

Choose a tag to compare

@github-actions github-actions released this 10 Sep 16:13
5052058

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 understands resume_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 a 409 whose
    code is template_image_preparing (#83). The refusal carries
    body["preparation"] — the preparation's own state and error, failure
    included, which deserves diagnosis before any retry. The token requires the
    original nonempty template, cannot be combined with size, 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-After as seconds, HTTP-date form
    included, None when the header is absent or malformed (#83). It now reaches
    every refusal that carries one; before, only RateLimitError had 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() raised TimeoutError when 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
    reporting building throughout, is waited for as well.