@deepdockai/cli 1.0.10 → 1.0.12

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.12
4
+
5
+ - The agent skill describes `rate_limited` for action calls: 600 calls and 120 writes per minute per API key, answered with `Retry-After: 60` and `retryAfterSeconds: 60`. It named only the pairing limit before.
6
+
7
+ ## 1.0.11
8
+
9
+ - Every system of a device carries `accessLastCheckedAt`, in the device list and in `GET /v1/devices/{deviceId}/systems`. It is set when `access` is the last known value because the device could not read it (its database stopped or unreachable), and then says when the device last read it. It is `null` whenever the latest report read the access. The agent skill's TypeScript client types it, and its concepts reference explains it.
10
+
3
11
  ## 1.0.10
4
12
 
5
13
  - `GET /v1/devices` and `GET /v1/incidents` page with a cursor: the answer is `{ items, nextCursor }`, with `limit` (1 to 500, default 100) and `cursor` query parameters. The agent skill's key and pairing reference says how to loop over the pages, and the pinned device API carries the new shape. The CLI lists devices through `/partner`, which is unchanged.
package/dist/deepdock.js CHANGED
@@ -11428,7 +11428,7 @@ import { spawn } from "node:child_process";
11428
11428
  import { homedir, hostname } from "node:os";
11429
11429
 
11430
11430
  // src/version.ts
11431
- var VERSION = "1.0.10";
11431
+ var VERSION = "1.0.12";
11432
11432
 
11433
11433
  // src/runtime.ts
11434
11434
  var DEFAULT_BASE_URL = "https://api.deepdock.ai";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepdockai/cli",
3
- "version": "1.0.10",
3
+ "version": "1.0.12",
4
4
  "description": "Deepdock partner CLI: pair devices, see systems and actions, create the API key your code runs them with.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -98,9 +98,12 @@ Never invent an id, copy one from another device, or hard-code one from a test r
98
98
 
99
99
  ## Rate limits
100
100
 
101
- The only documented limit is on pairing: 5 failed claim attempts per key per rolling 60 seconds
102
- (`429 rate_limited`). Handle `429` generically anyway (honour `Retry-After` when present, back off,
103
- do not loop), since limits can be added additively.
101
+ Each API key has its own budget on every `/v1` call: 600 calls per minute, and 120 writes per
102
+ minute. A write (an action run that needs an `Idempotency-Key`) counts against both. Over a budget
103
+ the call answers `429 rate_limited` with `Retry-After: 60` and `retryAfterSeconds: 60` in the error
104
+ body. Honour it, back off and do not loop; a retried write keeps its `Idempotency-Key`. The numbers
105
+ can change, so treat them as approximate. Pairing has a tighter limit of its own: 5 failed claim
106
+ attempts per key per rolling 60 seconds, whose `429` carries neither the header nor the field.
104
107
 
105
108
  ## Response headers worth reading
106
109
 
@@ -79,6 +79,8 @@ export type Device = {
79
79
  version: string | null
80
80
  status: SystemStatus
81
81
  access: SystemAccess
82
+ /** Set when `access` is the last known value (the device could not read it): when it last did. */
83
+ accessLastCheckedAt: string | null
82
84
  reportedAt: string
83
85
  writes: SystemWrites
84
86
  }[]
@@ -96,6 +98,8 @@ export type DeviceSystem = {
96
98
  version?: string
97
99
  status: SystemStatus
98
100
  access: SystemAccess
101
+ /** Set when `access` is the last known value (the device could not read it): when it last did. */
102
+ accessLastCheckedAt: string | null
99
103
  actions: ActionState[]
100
104
  }
101
105
 
@@ -53,6 +53,7 @@ has a display `label` (may be `null`), a `version` the device reported (may be a
53
53
  | system `status` | `missing` | the program was not found where the device expects it | calls answer `system_unavailable`; contact the site and Deepdock |
54
54
  | system `status` | `unknown` | the device could not tell whether the program runs (its probe failed or is unavailable on that PC) | do not read it as stopped; the device decides when a call arrives |
55
55
  | system `access` | `ok`, `outdated`, `missing`, `not_set_up`, or `null` | the database access the device last reported (`null`: none known yet) | `outdated` refuses the actions that need the missing right with `access_outdated`, `missing` refuses every action with `access_missing`; the customer repeats "Erneut einrichten" in the Deepdock client, the incident closes by itself once `access` is `ok`, nothing to resume |
56
+ | system `accessLastCheckedAt` | ISO time or `null` | set when `access` is the last known value because the device could not read it (its database stopped or unreachable): when it last read it. `null` when the latest report read it | show the access as last known, with this time; nothing to do until the device reads it again |
56
57
  | action state | `active` | the action can be called | normal |
57
58
  | action state | `paused` | the action is paused with a `reason` and `pausedAt` | calls answer `action_paused`; show the feature as paused, poll `GET .../systems` at a low rate |
58
59
  | pause `reason` | `structure_changed` | the system changed in a way the action depends on (for example a vendor update); Deepdock reviews and resumes | wait; nothing to do on your side |
@@ -17,7 +17,7 @@ with the **same** `Idempotency-Key`); **Show** says what the end user should see
17
17
  | `payload_too_large` | 413 | the request body is over 1 MiB | no; send less | nothing; a developer bug, or shorten the text |
18
18
  | `unauthenticated` | 401 | the key is missing, malformed, for the other environment, unknown, revoked or expired | no | "Deepdock API key refused; check it in the dashboard" to an operator |
19
19
  | `not_found` | 404 | no such route; an update whose id matches no record; a write naming a record that does not exist or belongs to another one | no | "record not found" when it is a record; otherwise a bug |
20
- | `rate_limited` | 429 | too many failed pairing attempts with this key (5 per 60 s) | yes, after up to a minute (`Retry-After` when present) | "try again in a minute" |
20
+ | `rate_limited` | 429 | more than 600 calls, or more than 120 writes (counted in both), with this key in a minute; or more than 5 failed pairing claims in 60 s | yes, after `Retry-After: 60` (`retryAfterSeconds: 60` in the body); a write keeps its key. The pairing claim answer has neither: wait up to a minute | "try again in a minute" |
21
21
 
22
22
  Codes your `/v1` code never receives, listed so the enum is complete: `organization_required`
23
23
  (403), `forbidden` (403), `conflict` (409), `already_member` (409) and `client_outdated` (400) are