@deepdockai/cli 1.0.11 → 1.0.13

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.13
4
+
5
+ - A device carries `lastKnownAt`: the time of its last report while it is not connected, `null` while it is connected. Every system of a device carries `lockedActions`: the actions the device reports locked because its database account lacks a right they need, under the spec set it runs now, or `null` when there is no verdict or the verdict is for an older spec set. Both are in the device list and, for `lockedActions`, in `GET /v1/devices/{deviceId}/systems`. The agent skill's TypeScript client types them, and its concepts reference explains them.
6
+
7
+ ## 1.0.12
8
+
9
+ - 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.
10
+
3
11
  ## 1.0.11
4
12
 
5
13
  - 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.
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.11";
11431
+ var VERSION = "1.0.13";
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.11",
3
+ "version": "1.0.13",
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",
@@ -84,7 +84,7 @@ curl -X POST "$BASE/v1/devices" \
84
84
  ```
85
85
 
86
86
  `label` is optional, 1 to 100 characters. The device must be online. Answer: `201` with the device
87
- (`id`, `label`, `hostname`, `os`, `clientVersion`, `status`, `lastSeenAt`, `claimedAt`, `outdated`, `systems`,
87
+ (`id`, `label`, `hostname`, `os`, `clientVersion`, `status`, `lastSeenAt`, `lastKnownAt`, `claimedAt`, `outdated`, `systems`,
88
88
  and `updateAvailable` when it runs an older build); `hostname`, `os` and `clientVersion` are `null`
89
89
  until the device has reported them. Keep `id`: it is the `deviceId` of every later call.
90
90
  `GET /v1/devices` lists your devices a page at a time (`{ items, nextCursor }`; pass `nextCursor` back as `cursor` until it is `null`, `limit` 1 to 500, default 100), and `GET /v1/devices/{deviceId}` reads one; each device has the same shape. `GET /v1/incidents` pages the same way.
@@ -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
 
@@ -70,6 +70,8 @@ export type Device = {
70
70
  clientVersion: string | null
71
71
  status: 'connected' | 'offline' | 'inactive'
72
72
  lastSeenAt: string | null
73
+ /** While the device is not connected: when it last reported. `null` while connected. */
74
+ lastKnownAt: string | null
73
75
  claimedAt: string | null
74
76
  /** True when an action assigned to you needs a newer client: that action answers device_outdated. */
75
77
  outdated: boolean
@@ -81,6 +83,7 @@ export type Device = {
81
83
  access: SystemAccess
82
84
  /** Set when `access` is the last known value (the device could not read it): when it last did. */
83
85
  accessLastCheckedAt: string | null
86
+ lockedActions: string[] | null
84
87
  reportedAt: string
85
88
  writes: SystemWrites
86
89
  }[]
@@ -100,6 +103,8 @@ export type DeviceSystem = {
100
103
  access: SystemAccess
101
104
  /** Set when `access` is the last known value (the device could not read it): when it last did. */
102
105
  accessLastCheckedAt: string | null
106
+ /** Actions the device reports locked because its database account lacks a right they need; `null` when there is no verdict for the spec set it runs now. */
107
+ lockedActions: string[] | null
103
108
  actions: ActionState[]
104
109
  }
105
110
 
@@ -24,7 +24,7 @@ Details: [auth-and-keys.md](auth-and-keys.md).
24
24
  The Deepdock client installed on the customer's Windows PC next to their system. It connects
25
25
  outwards to Deepdock; nothing in the customer's network is opened to the internet. A device is
26
26
  identified by a UUID (`id`), carries a `label`, `hostname`, `os`, `clientVersion`, `status`
27
- (`connected`, `offline` or `inactive`), `lastSeenAt`, `claimedAt` (may be `null`), `outdated` (an
27
+ (`connected`, `offline` or `inactive`), `lastSeenAt`, `lastKnownAt`, `claimedAt` (may be `null`), `outdated` (an
28
28
  assigned action needs a newer client: it answers `device_outdated`) and the `systems` it reported (each with a `writes` state; reads always work). `verified`: writes run. `unknown`: no version was reported, and writes go through. `partial`: some writes run and some are refused. `unverified`: a write answers `system_version_unverified`; with `reason: unverified_version` it works once Deepdock has verified that version, with `reason: unparseable` retrying does not help and you contact Deepdock.
29
29
 
30
30
  - **Pair**: claim a device for your organisation with the 6-character code it shows while unpaired.
@@ -48,12 +48,14 @@ has a display `label` (may be `null`), a `version` the device reported (may be a
48
48
  | device `status` | `connected` | the device is online and can run actions | normal |
49
49
  | device `status` | `offline` | the device is not connected right now (PC off, no network) | calls answer `device_offline`; retry later, show "offline" |
50
50
  | device `status` | `inactive` | not connected for 7 days; still paired | as offline; check with the site whether the PC still exists |
51
+ | device `lastKnownAt` | ISO time or `null` | the time of the device's last report while it is not connected. `null` while it is connected | show the last known state with this time; it may be out of date |
51
52
  | system `status` | `running` | the customer's program is running on the device | normal |
52
53
  | system `status` | `stopped` | the program is installed but not running | calls answer `system_unavailable`; the site starts the program |
53
54
  | system `status` | `missing` | the program was not found where the device expects it | calls answer `system_unavailable`; contact the site and Deepdock |
54
55
  | 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
56
  | 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
57
  | 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 |
58
+ | system `lockedActions` | list of action names or `null` | the actions the device reports locked because its database account lacks a right they need, under the spec set it runs now. `null`: no verdict yet, or the verdict is for an older spec set | do not offer a locked action as available; it answers `access_outdated` until the customer repeats "Erneut einrichten" |
57
59
  | action state | `active` | the action can be called | normal |
58
60
  | 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 |
59
61
  | 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