Repository navigation
Releases
Releases · deepdockai/devkit
v1.4.1
v1.4.0
- Device API format 11: the error code
system_version_unverifiedand the error fieldsversionandreasonare gone, and a system'swritesstate inGET /v1/devices/{deviceId}is replaced byblockedActions(the actions this device's client cannot run yet; each answersdevice_outdateduntil the client updates). An action whose system runs a program version Deepdock has not yet approved for it answers the new409 version_not_covered(CLI exit 2): nothing ran, retrying gets the same answer, and it works once Deepdock approves that version or the customer runs an approved one. The bundled TypeScript and Python clients, the skill's error reference and the device types follow. This needs the API from the Deepdock release that carries these changes. deepdock devicesanddeepdock incidents listread the organisation's lists as{ "data": [...], "nextCursor": ... }, the form/v1already uses (was{ "data": { "items": [...], "nextCursor": ... } }). They need the API from the next Deepdock release; an older API answers the old form, which this version does not read.- The CLI follows the API's British spelling and its renamed code:
GET /partner/organisations(was/partner/orgs), the error codeorganisation_required(wasorganization_required) andcli_outdated(wasclient_outdated, still exit 4). The bundled device types and the skill's error reference include them. These need the API from the next Deepdock release. - The command group
orgis noworgs(deepdock orgs list,deepdock orgs select); the old name is gone, with no alias. - A device is named
<deviceId>in every usage string, help text, the README and the bundled skill (devices rename|release|systems <deviceId>,actions list <deviceId> <system>). - The README and the bundled skill advise reusing one HTTP connection for calls (keep-alive), because a fresh connection can hit a cold start.
- The docs, the bundled skill and the device API pin say "pair" for taking a device into your organisation (was "claim"); the
rate_limitedandpairing_code_invalidtexts follow, andrequestIdis described as present on every error body. Field names and error codes are unchanged (claimedAtstays).
v1.2.0
- Every
/v1answer uses onedataenvelope. A list (amanyaction read,GET /v1/devices) answers{ "data": [...], "nextCursor": ... }(was{ "data": { "items": [...], "nextCursor": ... } });nextCursorsits besidedataand appears only on a list that pages. A single-record read (cardinality: one) answers{ "data": { ...record } }and a record that is not found answers404 not_found. Writes and error bodies are unchanged. - Every refused action input (type, length, enum, bounds, a missing or unknown field, a bad
limitorcursor) answers422 invalid_inputwitherror.fields;400 invalid_requestis for a malformed request only. - The bundled TypeScript and Python clients read the new shape (
Page.itemskeeps its name and holdsdata) and gainreadOne/read_onefor a single-record read. The skill and its references show the new answers. - The bundled TypeScript and Python clients gain
downloadfor a file action (file: truein the action index): it posts the inputs like a read and returns the bytes, the content type and the file name fromContent-Disposition(filename*first). A body shorter than itsContent-LengththrowsDeepdockTransportError; a refusal is aDeepdockErroras for any action, and503 target_busyis retried the same way. The skill describes file actions incalling-actions.md.
v1.1.2
- The bundled TypeScript and Python clients wait 35 seconds per attempt (was 30): a call can wait up to 10 seconds for the device's slot and then up to 20 seconds on the device. They also retry
503 target_busyup to three attempts (maxAttempts/max_attempts), waiting theRetry-Afterseconds (at most 15, one second without the header) and sending the same request, so a write keeps its idempotency key.DeepdockErrorcarries the header asretryAfter/retry_after.
v1.1.1
- A new error code,
partner_deactivated(403): Deepdock has deactivated the organisation, so none of its keys work and its devices are disconnected until Deepdock reactivates it. The CLI exits with 2 on it, as onpartner_not_approved. The bundled device types and the skill's error reference include it.
v1.1.0
- Each system in a device's
systemsanswer carriesconnectors: the connectors the device runs for that system, each with anameand akind(databaseorhttp). The bundled device types and the client'sDeviceSysteminclude it.
v1.0.29
- A paused action's
reasoncan also readcredentials_rejected(the program no longer accepts the stored sign-in) orcertificate_changed(the program's server certificate changed). Both are fixed by the customer choosing "Anmeldung erneuern" in the Deepdock client, and the action resumes by itself. Calls answeraction_pausedmeanwhile, as for any pause. The bundled device types and the skill's concepts list include them.
v1.0.28
- The device API's
Error.codelist no longer namesorganization_required,forbidden,conflictandalready_member: only the dashboard tree (/partner) answers them, never/v1. The CLI still meets them on its own/partnercalls and keeps their exit codes (organization_required1, the other three 2), now from a list of its own. Nothing changes for a script that reads--jsonor the exit code.
v1.0.27
- An update is called with
PATCHagain; a read and a create stayPOST. All three take a flat JSON body and nothing in the URL. The method must be the action's own: any other answers405 invalid_requestwithAllownaming the one method (POSTorPATCH), so aPOSTto an update is refused and does nothing. A query string on an action path is still400 invalid_request. A write still needs anIdempotency-Key; a read ignores it. - Each entry of the action index has a
method(POSTorPATCH) beside itsoperation(read,createorupdate). - The bundled clients'
writetakes the action's operation after the action name (write(deviceId, system, action, 'create' | 'update', key, input)) and sendsPOSTfor a create andPATCHfor an update;PendingWritecarries it asoperation. Reads are unchanged. Idempotency handling is unchanged. - The skill's references describe the contract.
v1.0.26
- Every action is called with
POST /v1/devices/{deviceId}/systems/{system}/actions/{action}and its inputs in a flat JSON body, reads and updates included. There is noGETread and noPATCHupdate any more: any other method answers405 invalid_requestwithAllow: POST, and a query string on an action path answers400 invalid_request("inputs go in the JSON body, not in the URL"), so no value reaches a URL, a request log or a proxy. A read takeslimit(a JSON integer) andcursor(a string) in the same body; a write still needs anIdempotency-Key, a read ignores it. Values are typed as given: an integer input is a JSON number, and"1001"is refused where it is declared as one. - The action index keeps its route, but each entry's
methodis replaced byoperation(read,createorupdate).actions listderives its read/write column from it. - The bundled TypeScript and Python clients send reads as
POSTwith a JSON body, includinglimitandcursor.writealways sendsPOST, so itsmethodparameter (andPendingWrite.method) is gone; input values are typed (string | number | boolean) instead of text only. Idempotency handling is unchanged. - The skill's references describe the new contract.