ente-cli 0.4.59 → 0.4.61

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/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # ente CLI
2
2
 
3
3
  Command-line interface for [ente](https://github.com/valentindoering/ente) — a
4
- relationship manager and knowledge graph (people, orgs, projects, topics and the
4
+ relationship manager and knowledge graph (people, orgs, projects, topics, places, objects and the
5
5
  notes/calls/tasks/conversations logged against them).
6
6
 
7
7
  TypeScript, built on [clipanion](https://clipanion.dev/), bundled with esbuild
@@ -57,14 +57,16 @@ ente auth pair --url https://your-deployment.convex.site --email you@example.com
57
57
  One Ente approval page lists all profiles and scopes. Existing local profiles
58
58
  are never overwritten unless `--replace` is supplied. A stopped or expired CLI
59
59
  run must be started again. Pending requests expire after ten minutes.
60
- Both agent access modes can read and change Ente data and manage spaces.
61
- With `read`, the key can inspect the bound agent and inbox, mark inbox threads
62
- read/unread, and change their workflow state. `write` also permits agent
63
- changes and sending email. The CLI saves approved profiles before
60
+ Every external credential is bound to an Ente agent. With `read`, it can read
61
+ allowed space content and inspect the bound agent. It can also mark inbox threads
62
+ read/unread, and change their workflow state when an inbox is enabled. `write`
63
+ additionally permits changes within the agent’s current space policy, agent
64
+ configuration changes, and sending email from its active permitted inbox. The CLI saves approved profiles before
64
65
  activating their keys, so a failed local save cannot leave active keys behind.
65
66
 
66
- For headless integrations or a legacy key, generate an API key in the web app
67
- and enter it directly in the terminal:
67
+ For headless integrations, create or select an agent in `/agents`, issue a
68
+ credential from its Connections settings, and enter it directly in the terminal.
69
+ Several credentials may belong to one agent. Existing migrated keys remain valid:
68
70
 
69
71
  ```bash
70
72
  ente auth login --url https://your-deployment.convex.site --key-stdin
@@ -82,10 +84,12 @@ ENTE_PROFILE=mail-operator ente agent config show
82
84
  ENTE_PROFILE=mail-operator ente agent mail threads --unread
83
85
  ```
84
86
 
85
- Operator keys use the CLI's scoped REST commands. They cannot be exchanged for
86
- the legacy full-account CLI session token, so the bound-agent restriction
87
- cannot be bypassed through direct Convex commands. Use a normal account key for
88
- legacy administrative CLI commands that require that session token.
87
+ Agent keys use scoped REST calls and signed CLI JWTs carrying the agent and
88
+ credential IDs. Content calls recheck the live key and agent policy, including
89
+ cached JWT calls. Human-only settings and administration stay in the web app;
90
+ there is no unrestricted account-key fallback. CLI pairing without `--agent`
91
+ creates a named connection agent. MCP authorization creates a connection agent
92
+ named for the client.
89
93
 
90
94
  Named profiles are optional. Use one only when a person or process deliberately
91
95
  switches between several credentials. `--profile` overrides `ENTE_PROFILE`.
@@ -114,7 +118,7 @@ ente notification send --subject "Weekly brief" --text "Your brief is ready." --
114
118
  ente agent config show
115
119
  ente agent threads
116
120
  ente agent mail threads --unread
117
- ente agent mail send --to person@example.net --subject "Update" --text "Plain fallback" --attachment ./handoff.md --html "<p><strong>Update</strong></p>" --idempotency-key agent-update-2026-09-01
121
+ ente agent mail send --to person@example.net --cc owner@example.net --subject "Update" --text "Plain fallback" --attachment ./handoff.md --html "<p><strong>Update</strong></p>" --idempotency-key agent-update-2026-09-01
118
122
  ente tasks
119
123
  ente guide # concepts; `ente guide <topic>`: entities, tasks, activities, search, patterns, limits
120
124
  ```
@@ -151,6 +155,11 @@ lets the bound external agent start, claim, and reply to external threads withou
151
155
  calling an Ente-hosted model. Ente prompt and scheduled runs configure the Ente agent
152
156
  counterpart; they are not instructions or schedules for the external operator.
153
157
  The caller cannot select another agent, mailbox, or sender.
158
+ `ente agent list` shows the agent bound to this credential, including migrated
159
+ connection keys. Migrated keys keep their original scopes: listing that identity
160
+ does not grant prompt or conversation access. History needs `agent:read`;
161
+ `agent new` and `agent send` need `agent:communicate` and post messages as the
162
+ agent. They do not invoke a hosted model or impersonate a human user.
154
163
  The corresponding scopes are `agent:read`, `agent:write`, `mail:read`, and
155
164
  `mail:send`, and `agent:communicate`.
156
165
 
@@ -173,8 +182,8 @@ ente agent schedules configure --file ./schedules.json
173
182
  ente agent mail address
174
183
  ente agent mail threads --unread --limit 20
175
184
  ente agent mail show <thread-id>
176
- ente agent mail send --to person@example.net --subject "Update" --text "Plain fallback" --html "<p>Rich update</p>" --attachment ./reference.pdf --idempotency-key update-2026-09-01
177
- ente agent mail reply <thread-id> --message <message-id> --text-file ./reply.txt --html-file ./reply.html --attachment ./handoff.docx --idempotency-key reply-2026-09-01
185
+ ente agent mail send --to person@example.net --cc owner@example.net --subject "Update" --text "Plain fallback" --html "<p>Rich update</p>" --attachment ./reference.pdf --idempotency-key update-2026-09-01
186
+ ente agent mail reply <thread-id> --message <message-id> --reply-all --text-file ./reply.txt --html-file ./reply.html --attachment ./handoff.docx --idempotency-key reply-2026-09-01
178
187
  ente agent mail mark <thread-id> --state-version 4 --handled
179
188
  ```
180
189
 
@@ -192,6 +201,18 @@ deleted:
192
201
  ]
193
202
  ```
194
203
 
204
+ Send and reply accept repeatable `--cc ADDRESS`, up to 24 CC addresses and 25
205
+ recipients total. Ente normalizes and deduplicates addresses and checks every
206
+ recipient against the owner's sending policy. Add a person only when the owner
207
+ has authorized that conversation and its content for them.
208
+
209
+ Replies default to the exact inbound sender. `--reply-all` resumes recipients
210
+ from prior outbound mail in the same thread; it never copies inbound To, CC, or
211
+ Bcc headers. On a new inbound thread, use explicit `--cc` to add an authorized
212
+ person. All resumed recipients are checked again, so a removed sending grant
213
+ blocks the reply. Keep CC and reply-all choices unchanged when retrying an
214
+ ambiguous send with the same idempotency key.
215
+
195
216
  Send and reply support repeatable `--inline-image CONTENT_ID=PATH` alongside
196
217
  `--attachment PATH`. Supply HTML containing `<img src="cid:readiness">` and
197
218
  `--inline-image readiness=./readiness.png`. The CLI embeds local file bytes in
@@ -211,7 +232,7 @@ For example:
211
232
 
212
233
  ```bash
213
234
  ente agent mail send --to owner@example.net --subject "Readiness" --text-file ./report.txt --html-file ./report.html --inline-image readiness=./readiness.png --idempotency-key readiness-report-v1
214
- ente agent mail reply <thread-id> --message <message-id> --text-file ./report.txt --html-file ./report.html --inline-image readiness=./readiness.png --attachment ./notes.txt --idempotency-key readiness-reply-v1
235
+ ente agent mail reply <thread-id> --message <message-id> --reply-all --text-file ./report.txt --html-file ./report.html --inline-image readiness=./readiness.png --attachment ./notes.txt --idempotency-key readiness-reply-v1
215
236
  ```
216
237
 
217
238
  Retries must keep filenames, MIME types, Content-IDs, file order, and exact file
@@ -275,6 +296,14 @@ Never put secrets in chat, repositories, project `.env` files, or logs.
275
296
 
276
297
  ### Process a permitted user mailbox
277
298
 
299
+ Existing provider drafts retain their attachments when edited or sent through
300
+ `user-mailbox`, including the web composer's 25 MB combined raw-file budget
301
+ (25,000,000 bytes, at most 24 files). The complete MIME message must fit 35 MiB;
302
+ providers can allow less. `loadDraft` returns file metadata and a reviewed draft
303
+ version, without file bytes or private storage references. Attach new files in
304
+ the web composer. The agent's own inbox keeps its separate attachment limits.
305
+
306
+
278
307
  A user's Gmail/IMAP inbox is separate from the agent's own email address. In
279
308
  Ente `/agents`, the owner selects the mailboxes this personal agent can read,
280
309
  classification/reply permissions, destination spaces, and full conversation
@@ -306,3 +335,35 @@ and 100 per UTC day. A successful operation acknowledges only its own purpose.
306
335
  Published conversations remain durable after provider cache expiry/disconnect.
307
336
  Their individual messages appear in entity activity feeds; activity content reads
308
337
  return bounded, read-only email blocks with continuation cursors.
338
+
339
+ ### Guardian health (global admin)
340
+
341
+ `ente health page --profile default --source toolMessages --since <epoch-ms> --until <epoch-ms> --json`
342
+ reads one content-free aggregate page. Use `--source threads --status idle|running|error`
343
+ or `--source recordings --status pending|transcribing|structuring|reflecting|done|error`
344
+ for current job counts. Use `--since 0` for active jobs; terminal recording statuses require a positive
345
+ `--since` and a window of at most seven days. Legacy terminal rows without update
346
+ timestamps are outside that coverage.
347
+ `--stale-after-ms` defaults to 1800000; `--limit` accepts 1–100. Follow
348
+ `data.continueCursor` with `--cursor` and unchanged arguments until `data.isDone`.
349
+ Counts are page-local. Tool windows are at most seven days. This is a human-only
350
+ global administration endpoint. Agent-bound CLI credentials cannot call it,
351
+ including credentials sponsored by an administrator. Use the web administration
352
+ interface for these operations; creating a broader agent key does not grant access.
353
+ No customer content or record IDs are returned. Unknown tool names become `other`.
354
+ See `docs/admin-health-monitoring.md` for collector continuity and limits.
355
+
356
+ ### Assigned tasks and replies
357
+
358
+ Assigned agent work is available through `ente agent tasks <operation>`. Start
359
+ with `ente agent tasks list --view attention --json`, inspect each assignment,
360
+ read its discussion, optionally reply with a stable idempotency key, and
361
+ acknowledge only the returned version you processed. Newer replies remain
362
+ pending. The shipped skill documents pagination, long-message chunks and
363
+ optional five-minute claims. Your prompt and schedule control the workflow.
364
+
365
+ Task assignment accepts multiple agents alongside humans. Use repeatable
366
+ `ente activity create --type task --agent-assignee <agentId>` with the usual entity,
367
+ space and title arguments, or `ente activity update <activityId> --agent-assignee <agentId>`.
368
+ Updating replaces agent assignees and preserves human assignees. Use
369
+ `--clear-agent-assignees` to remove them. Only active agents with write access qualify.
package/dist/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: m:ente-cli
3
- description: "Cli: drives the ente CRM and knowledge graph over its Convex API as the signed-in user — entities (people, organisations, projects, topics), activities (notes, calls, meetings, tasks), relationships, spaces, full-text and AI-backed search, agent threads and mail, plus Excalidraw canvas prototypes. Use when context about a person, an organisation or a meeting has to be stored, looked up or updated from the shell. Not for splitting shared costs, which is schnorrer-cli."
3
+ description: "Cli: drives the ente CRM and knowledge graph over its Convex API as the signed-in user — entities (people, organisations, projects, topics, places, objects), activities (notes, calls, meetings, tasks), relationships, spaces, full-text and AI-backed search, agent threads and mail, plus Excalidraw canvas prototypes. Use when context about a person, an organisation or a meeting has to be stored, looked up or updated from the shell. Not for splitting shared costs, which is schnorrer-cli."
4
4
  when_to_use: "Remembering what was said in a call or meeting; looking up open tasks, deadlines or follow-ups for a person or project; creating or renaming an entity and pinning it to a parent; linking an activity to several entities or moving it between spaces; asking a question over the whole graph and getting citations; reviewing the voice-recording prompt or debugging a failed recording; sending a notification mail or an agent-inbox reply; posting to the in-app feedback board; managing Excalidraw canvas HTML prototypes on an entity board."
5
5
  metadata:
6
6
  short-description: Relationship memory through ente
@@ -8,7 +8,7 @@ metadata:
8
8
 
9
9
  # ente-cli - CRM & Relationship Manager CLI Skill
10
10
 
11
- ente is a CRM / relationship manager that tracks people, organisations, projects, and topics (entities), and logs notes, calls, tasks, and conversations (activities) against them. This skill wraps the `ente` CLI so an agent can manage entities, activities, tasks, pins, and search end-to-end.
11
+ ente is a CRM / relationship manager that tracks people, organisations, projects, topics, places, and objects (entities), and logs notes, calls, tasks, and conversations (activities) against them. This skill wraps the `ente` CLI so an agent can manage entities, activities, tasks, pins, and search end-to-end.
12
12
 
13
13
  ---
14
14
 
@@ -48,10 +48,12 @@ For an agent operator, pair a named profile with the exact agent ID and scope.
48
48
  For several operators, pass a JSON manifest with up to ten `{ profile, agentId,
49
49
  access }` entries. The Ente page shows the complete set for one approval:
50
50
 
51
- Both agent access modes can read and change Ente data and manage spaces. With
52
- `read`, the key can inspect the bound agent and inbox, mark inbox threads
53
- read/unread, and change their workflow state. `write` also permits agent
54
- changes and email sending.
51
+ Every external credential is bound to an Ente agent. `read` permits reading
52
+ allowed space content and the bound agent. `write` additionally permits changes
53
+ within the agent’s current space policy. A mailbox is optional; mailbox
54
+ capabilities require an active mailbox and the relevant scopes. Read keys may
55
+ mark inbox threads read/unread, and change their workflow state. A CLI pairing
56
+ without `--agent` creates a named connection agent rather than a user API key.
55
57
 
56
58
  ```bash
57
59
  ente auth pair --url <convex-site-url> --email <account-email> --profile operator-name --agent <agent-id> --access write
@@ -60,10 +62,11 @@ ENTE_PROFILE=operator-name ente agent config show --json
60
62
  ENTE_PROFILE=operator-name ente agent mail threads --unread --json
61
63
  ```
62
64
 
63
- Operator keys use scoped REST commands and cannot mint the legacy full-account
64
- CLI session token. This preserves the one-agent boundary. A normal account key
65
- is still required for legacy administrative commands that call Convex
66
- functions directly.
65
+ Agent keys use a signed agent binding and credential reference for CLI
66
+ authentication. Current permissions and revocation are checked on each call,
67
+ including cached JWT calls. There is no unrestricted user-key fallback. Create
68
+ and manage keys from the agent’s Connections settings in `/agents`; several
69
+ credentials can belong to the same agent.
67
70
 
68
71
  Named profiles are optional and only needed to switch deliberately between
69
72
  credentials. `--profile` overrides `ENTE_PROFILE`. Profiles do not activate
@@ -89,7 +92,8 @@ npm i -g ente-cli --registry https://registry.npmjs.org
89
92
  - **Space resolution**: Space names work the same way — exact match first, then substring. Use `--space` to target a workspace.
90
93
  - **--json flag**: Every command supports `--json`. Always use `--json` when parsing output programmatically.
91
94
  - **Deadlines**: stored as millisecond epochs; displayed as `DD.MM.YYYY` / `DD.MM.YYYY, HH:MM` in Europe/Berlin.
92
- - **Entity types**: `person`, `org`, `project`, `topic`
95
+ - **Entity types**: `person`, `org`, `project`, `topic`, `place`, `object`
96
+ - **Place vs Object**: use `place` for a specific location (city, apartment, room), `object` for a specific physical thing (device, furniture), and `topic` for a general subject. Create entities only when their identity or relationships will be useful later.
93
97
  - **Activity types**: `note`, `conversation`, `meeting`, `call`, `message`, `task`
94
98
 
95
99
  ---
@@ -110,7 +114,7 @@ ente ask "What's open with Erik?" [--space <name>] [--entity <name>] [--evidence
110
114
  ente query "QM system export" [--space <name>] [--entity <name>] [--verbose] [--json] # evidence only, no AI
111
115
 
112
116
  # Entities
113
- ente entity list [--query <text>] [--type person|org|project|topic] [--space <name>] [--limit 50] [--archived] [--json]
117
+ ente entity list [--query <text>] [--type person|org|project|topic|place|object] [--space <name>] [--limit 50] [--archived] [--json]
114
118
  ente entity create "Jane Doe" --type person [--pin "Acme Corp"] [--share-parents --parent-space-grant-fingerprint <token>] [--alias "JD"] [--attr email=jane@acme.com] [--tag vip] [--description "CTO at Acme"] [--json]
115
119
  ente entity get "Jane Doe" [--json]
116
120
  ente entity update "Jane Doe" [--name "Jane A. Doe"] [--alias-add "Jane"] [--alias-remove "JD"] [--attr role=CEO] [--tag vip] [--description "…"] [--json]
@@ -128,7 +132,7 @@ ente activity list [--entity "Jane"] [--type note|conversation|meeting|call|mess
128
132
  ente activity create --type meeting --title "Call with Jane" --entity "Jane Doe" --entity "Acme Corp" --space "Work" [--content "…"] [--content-file ./notes.md] [--auto-link --entity-space-grant-fingerprint <token>] [--json]
129
133
  ente activity search "quarterly review" [--entity "Acme"] [--type meeting] [--limit 10] [--json]
130
134
  ente activity get <activityId> [--json] # complete detail: body, full nested agenda, messages/replies, entities, attachments
131
- ente activity update <activityId> [--title "…"] [--content "…"] [--entity-add "Bob"] [--entity-remove "Carol"] [--json]
135
+ ente activity update <activityId> [--title "…"] [--content "…"] [--entity-add "Bob"] [--entity-remove "Carol"] [--agent-assignee <agentId> ... | --clear-agent-assignees] [--json]
132
136
  ente activity content read <activityId> [--cursor <cursor> --expected-version <version>] [--max-blocks 20] [--max-characters 12000] [--json]
133
137
  ente activity content edit <activityId> --expected-version <version> --operations-file ./operations.json [--json]
134
138
  ente activity message add <activityId> (--content "…" | --content-file ./update.md) [--json]
@@ -184,22 +188,47 @@ ente agent schedules configure --file ./schedules.json [--json]
184
188
  ente agent mail address [--profile <name>] [--json]
185
189
  ente agent mail threads [--profile <name>] [--unread] [--needs-reply] [--limit 20] [--cursor <cursor>] [--json]
186
190
  ente agent mail show <thread-id> [--cursor <cursor>] [--json]
187
- ente agent mail send --to person@example.net --subject "Update" --text "Plain fallback" [--html "<p>Rich update</p>" | --html-file ./message.html] [--attachment ./reference.pdf] [--idempotency-key <stable-key>] [--json]
188
- ente agent mail reply <thread-id> --message <message-id> (--text "Reply" | --text-file ./reply.txt) [--html "<p>Reply</p>" | --html-file ./reply.html] [--attachment ./handoff.docx] [--idempotency-key <stable-key>] [--json]
191
+ ente agent mail send --to person@example.net --cc owner@example.net --subject "Update" --text "Plain fallback" [--html "<p>Rich update</p>" | --html-file ./message.html] [--attachment ./reference.pdf] [--idempotency-key <stable-key>] [--json]
192
+ ente agent mail reply <thread-id> --message <message-id> --reply-all (--text "Reply" | --text-file ./reply.txt) [--html "<p>Reply</p>" | --html-file ./reply.html] [--attachment ./handoff.docx] [--idempotency-key <stable-key>] [--json]
189
193
  ente agent mail mark <thread-id> --state-version <version> (--handled | --open | --needs-reply | --read | --unread) [--json]
190
194
  ```
191
195
 
192
- Agent operator credentials are bound server-side to one exact agent. Agent read
196
+ Agent operator credentials are bound server-side to one exact agent.
197
+ `agent list` shows only that bound identity, including for migrated connection
198
+ keys. Migrated keys retain their original scopes. History requires `agent:read`;
199
+ `agent new` and `agent send` require `agent:communicate`, author messages as the
200
+ agent, and never invoke a hosted model or fall back to a human identity.
201
+ Agent read
193
202
  adds `agent:read` and, while the inbox is active, `mail:read`. Agent write adds
194
203
  `agent:write`, `agent:communicate`, and, while the inbox is active, `mail:send`.
195
204
  Use `agent threads --attention agent`, then `agent send`; the CLI claims the current
196
205
  attention version before replying so concurrent cron workers cannot duplicate work.
206
+ For a user-authorized Dream/maintenance run, use `agent config show`,
207
+ `agent threads --include-archived --limit 20`, and `agent show <thread-id>`.
208
+ Choose messages by their timestamps, including recent messages in older threads.
209
+ Skip scheduled-run and reflection summaries as sources for new durable lessons.
210
+ Compare the existing prompt before writing; `agent config set-prompt` replaces
211
+ the entire prompt, so preserve all unrelated instructions and context. Leave
212
+ the prompt unchanged when there is nothing useful to retain. The user's own
213
+ scheduler and prompt determine whether to perform this maintenance.
197
214
  The prompt and
198
215
  scheduled runs are Ente configuration for the Ente agent counterpart. They are
199
216
  not work instructions or scheduler settings for the external operator. The key
200
217
  cannot select a different agent, mailbox, or sender. All authenticated commands
201
218
  accept optional `--profile <name>`; use `ENTE_PROFILE` only when a launcher must
202
219
  select one of several stored credentials.
220
+ Send and reply accept repeatable `--cc ADDRESS`, up to 24 CC addresses and 25
221
+ recipients total. Ente normalizes and deduplicates addresses and checks every
222
+ recipient against the owner's sending policy. Add a person only when the owner
223
+ has authorized that conversation and its content for them.
224
+
225
+ Replies default to the exact inbound sender. `--reply-all` resumes recipients
226
+ from prior outbound mail in the same thread; it never copies inbound To, CC, or
227
+ Bcc headers. On a new inbound thread, use explicit `--cc` to add an authorized
228
+ person. All resumed recipients are checked again, so a removed sending grant
229
+ blocks the reply. Keep CC and reply-all choices unchanged when retrying an
230
+ ambiguous send with the same idempotency key.
231
+
203
232
  Send and reply support repeatable `--inline-image CONTENT_ID=PATH` alongside
204
233
  `--attachment PATH`. Supply HTML containing `<img src="cid:readiness">` and
205
234
  `--inline-image readiness=./readiness.png`. The CLI embeds local file bytes in
@@ -219,7 +248,7 @@ For example:
219
248
 
220
249
  ```bash
221
250
  ente agent mail send --to owner@example.net --subject "Readiness" --text-file ./report.txt --html-file ./report.html --inline-image readiness=./readiness.png --idempotency-key readiness-report-v1
222
- ente agent mail reply <thread-id> --message <message-id> --text-file ./report.txt --html-file ./report.html --inline-image readiness=./readiness.png --attachment ./notes.txt --idempotency-key readiness-reply-v1
251
+ ente agent mail reply <thread-id> --message <message-id> --reply-all --text-file ./report.txt --html-file ./report.html --inline-image readiness=./readiness.png --attachment ./notes.txt --idempotency-key readiness-reply-v1
223
252
  ```
224
253
 
225
254
  Retries must keep filenames, MIME types, Content-IDs, file order, and exact file
@@ -236,6 +265,11 @@ ambiguous timeout, retry the exact operation with the same
236
265
 
237
266
  For a focused update to an existing long body, use `activity content read`, select the returned
238
267
  version-scoped block targets, then call `activity content edit` with the exact `contentVersion`.
268
+ Activity mentions use `[activity](ente://activity/<activityId>?display=card)` or
269
+ `display=inline`. Copy the exact activity ID returned by Ente without changing
270
+ any characters. Newly introduced malformed or wrong-table mention IDs are
271
+ rejected with `INVALID_INPUT` by activity, agenda, and message writes. Existing
272
+ broken references remain editable and render as unavailable.
239
273
  The operations file is either a JSON array or `{ "operations": [...] }`; supported operation types
240
274
  are `replaceBlock`, `insertBefore`, `insertAfter`, `deleteBlock`, `replaceText`, and `append`.
241
275
  Use `replaceText` with a unique exact Markdown substring for file-patch-like changes inside a large
@@ -283,11 +317,14 @@ ente recording list [--user <email|id>] [--status error] [--limit 20] [--json]
283
317
  ente recording show <recordingId> [--json] # status, error, transcript size, activity count
284
318
  ente recording inspect <recordingId> [--json] # audio container: brands, fragmented?, box counts
285
319
  ente recording rerun <recordingId> [--wait] [--timeout 900] [--json]
320
+ ente recording backups [--state failed|joining|capturing] [--user <email|id>] [--json] # server backups of browser recordings
321
+ ente recording backups join <backupId> [--now] # retry a failed join; --now joins one still waiting for its device
286
322
  ```
287
323
 
288
324
  - Admin-only (`api.admin.recordings.*`); the ordinary `recordings.*` API is creator-scoped.
289
325
  - `rerun` never modifies or deletes the stored audio; `--wait` polls to `done`/`error` and exits non-zero on failure.
290
326
  - `--status` scans newest-first and says so when the sweep is capped.
327
+ - A backup in `failed` holds the only server copy of audio whose device never came back; read `error`, fix the cause, then `backups join`.
291
328
 
292
329
  ### Feedback board
293
330
 
@@ -349,6 +386,14 @@ Parent relationships are spaceless. Both entities must be accessible. Every acti
349
386
 
350
387
  ## User mailbox processing
351
388
 
389
+ Existing provider drafts retain their attachments when edited or sent through
390
+ `user-mailbox`, including the web composer's 25 MB combined raw-file budget
391
+ (25,000,000 bytes, at most 24 files). The complete MIME message must fit 35 MiB;
392
+ providers can allow less. `loadDraft` returns file metadata and a reviewed draft
393
+ version, without file bytes or private storage references. Attach new files in
394
+ the web composer. The agent's own inbox keeps its separate attachment limits.
395
+
396
+
352
397
  `ente agent user-mailbox --request JSON` or `--request-file PATH` uses the mailbox
353
398
  permission granted to the agent bound to this operator credential. This is
354
399
  separate from `ente agent mail`, which manages the agent's own inbox. The owner
@@ -370,7 +415,7 @@ through old backlog. Read starts with the newest message and returns
370
415
  minutes and fail after new arrivals or manual corrections. Re-read and claim
371
416
  again rather than forcing a stale write. Default change limits are 20 per agent
372
417
  execution and 100 per UTC day. Classification and replies are acknowledged
373
- independently. Mailbox permission levels are read/draft, read/draft/assign, and full access including sending and inbox changes. `accounts` lists allowed connections; `search` returns bounded cursor pages; `context` reads a captured mail scope; `editVisible` queues a revision-bound editor patch; the browser must receive it before insertion. Interactive IMAP reply reads cover the retained mailbox conversation and report `historyScope`; `purpose: classification` always reads complete provider history. `draft`, `loadDraft`, and `discardDraft` use provider drafts. `send` requires full permission, an exact draftVersion returned by loadDraft, and a unique requestId. Writes also require the active agentThreadId. Reuse requestId for the same operation; uncertain provider outcomes block automatic retries.
418
+ independently. Mailbox permission levels are read/draft, read/draft/assign, and full access including sending and inbox changes. `accounts` lists allowed connections; `search` returns bounded cursor pages; `context` reads a captured mail scope; `editVisible` queues a revision-bound editor patch; the browser must receive it before insertion. Its canonical patch is `{revision,operation:"draft",draft:{body:"text"}}`. The exact shorthand `{draft:{body:"text"}}` binds to the active agent thread’s captured revision. Omitted draft fields are preserved; an explicit connectionId must match the captured scope. Unknown fields, partial bindings, stale revisions and edits without draft permission are rejected. Interactive IMAP reply reads cover the retained mailbox conversation and report `historyScope`; `purpose: classification` always reads complete provider history. `draft`, `loadDraft`, and `discardDraft` use provider drafts. `send` requires full permission, an exact draftVersion returned by loadDraft, and a unique requestId. Writes also require the active agentThreadId. Reuse requestId for the same operation; uncertain provider outcomes block automatic retries.
374
419
 
375
420
  Optional schedules accept `intervalHours: 1 | 24` and
376
421
  `mailPurpose: classification | replies`; empty queues skip model execution.
@@ -398,3 +443,40 @@ are ready immediately and confirmation completes the move atomically. Bulk jobs
398
443
  continue server-side; track with status. A stale plan fails closed; completed batches remain applied.
399
444
  Prepare a new review for remaining contents. Cancel only before execution.
400
445
  `restore --source SPACE_ID` restores an archived space for an owner/admin.
446
+
447
+ ### Guardian health (global admin)
448
+
449
+ `ente health page --profile default --source toolMessages --since <epoch-ms> --until <epoch-ms> --json`
450
+ reads one content-free aggregate page. Use `--source threads --status idle|running|error`
451
+ or `--source recordings --status pending|transcribing|structuring|reflecting|done|error`
452
+ for current job counts. Use `--since 0` for active jobs; terminal recording statuses require a positive
453
+ `--since` and a window of at most seven days. Legacy terminal rows without update
454
+ timestamps are outside that coverage.
455
+ `--stale-after-ms` defaults to 1800000; `--limit` accepts 1–100. Follow
456
+ `data.continueCursor` with `--cursor` and unchanged arguments until `data.isDone`.
457
+ Counts are page-local. Tool windows are at most seven days. This is a human-only
458
+ global administration endpoint. Agent-bound CLI credentials cannot call it,
459
+ including credentials sponsored by an administrator. Use the web administration
460
+ interface for these operations; creating a broader agent key does not grant access.
461
+ No customer content or record IDs are returned. Unknown tool names become `other`.
462
+ See `docs/admin-health-monitoring.md` for collector continuity and limits.
463
+
464
+ ## Assigned tasks and replies
465
+
466
+ Use your bound agent's task queue independently of its mailbox:
467
+
468
+ - `ente agent tasks list --json` lists open assignments, including undated tasks.
469
+ - `ente agent tasks list --view attention --json` lists unseen changes, including closed or deleted tasks.
470
+ - `ente agent tasks inspect --assignment <id> --json` returns durable events, `observationId`, `observedVersion`, `snapshotVersion` and `hasMore`. Continue with `--observation <id>` while `hasMore` is true. Reading does not acknowledge anything.
471
+ - `ente agent tasks get --assignment <id> --json` reads task metadata and a body excerpt. Use the ordinary activity content read tool with its stable activity ID for the full body.
472
+ - `ente agent tasks discussion --assignment <id> --json` pages through comments using `--cursor`. Long messages are marked `truncated`; finish them with `ente agent tasks message --assignment <id> --message <message-id> --offset <next-offset> --expected-updated-at <timestamp> --json`. Restart if the message changes.
473
+ - `ente agent tasks comment --assignment <id> --content "..." --idempotency-key <stable-run-operation-id> --json` posts as your agent. Reuse a key only for the identical payload. A conflicting retry fails.
474
+ - `ente agent tasks acknowledge --assignment <id> --observation <id> --version <observed-version> --json` acknowledges only processed input. Observations expire after 15 minutes. A later reply stays pending.
475
+ - `claim`, `renew` and `release` accept `--assignment`; renew/release require `--claim-token`. Claims expire after five minutes and are optional. They do not grant write access or hide work permanently.
476
+
477
+ Each assignment ID identifies one enrollment. After unassignment/reassignment, use the new ID. Assignment never grants space access. Completion uses the ordinary task operations; the user-provided prompt decides when to close a task. These tools neither start a worker nor impose a response policy.
478
+
479
+ Assign agents to tasks with repeatable `activity create --agent-assignee <agentId>` or
480
+ `activity update <activityId> --agent-assignee <agentId>`. Updating replaces only agent
481
+ assignees and preserves humans. `--clear-agent-assignees` removes the agent assignments.
482
+ Assignment requires the agent to have write access in the task space; it grants no access.