ente-cli 0.4.60 → 0.4.62

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`.
@@ -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
 
@@ -287,6 +296,14 @@ Never put secrets in chat, repositories, project `.env` files, or logs.
287
296
 
288
297
  ### Process a permitted user mailbox
289
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
+
290
307
  A user's Gmail/IMAP inbox is separate from the agent's own email address. In
291
308
  Ente `/agents`, the owner selects the mailboxes this personal agent can read,
292
309
  classification/reply permissions, destination spaces, and full conversation
@@ -318,3 +335,37 @@ and 100 per UTC day. A successful operation acknowledges only its own purpose.
318
335
  Published conversations remain durable after provider cache expiry/disconnect.
319
336
  Their individual messages appear in entity activity feeds; activity content reads
320
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.
370
+
371
+ Scheduled runs also accept `runCondition: "new_chats"`: skip model execution unless this agent has new manual or recording chats since its previous scheduled check. Scheduled/reflection chats do not trigger it; explicit Run now bypasses the condition.
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]
@@ -189,11 +193,24 @@ ente agent mail reply <thread-id> --message <message-id> --reply-all (--text "Re
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
@@ -248,6 +265,11 @@ ambiguous timeout, retry the exact operation with the same
248
265
 
249
266
  For a focused update to an existing long body, use `activity content read`, select the returned
250
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.
251
273
  The operations file is either a JSON array or `{ "operations": [...] }`; supported operation types
252
274
  are `replaceBlock`, `insertBefore`, `insertAfter`, `deleteBlock`, `replaceText`, and `append`.
253
275
  Use `replaceText` with a unique exact Markdown substring for file-patch-like changes inside a large
@@ -295,11 +317,14 @@ ente recording list [--user <email|id>] [--status error] [--limit 20] [--json]
295
317
  ente recording show <recordingId> [--json] # status, error, transcript size, activity count
296
318
  ente recording inspect <recordingId> [--json] # audio container: brands, fragmented?, box counts
297
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
298
322
  ```
299
323
 
300
324
  - Admin-only (`api.admin.recordings.*`); the ordinary `recordings.*` API is creator-scoped.
301
325
  - `rerun` never modifies or deletes the stored audio; `--wait` polls to `done`/`error` and exits non-zero on failure.
302
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`.
303
328
 
304
329
  ### Feedback board
305
330
 
@@ -361,6 +386,14 @@ Parent relationships are spaceless. Both entities must be accessible. Every acti
361
386
 
362
387
  ## User mailbox processing
363
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
+
364
397
  `ente agent user-mailbox --request JSON` or `--request-file PATH` uses the mailbox
365
398
  permission granted to the agent bound to this operator credential. This is
366
399
  separate from `ente agent mail`, which manages the agent's own inbox. The owner
@@ -382,7 +415,7 @@ through old backlog. Read starts with the newest message and returns
382
415
  minutes and fail after new arrivals or manual corrections. Re-read and claim
383
416
  again rather than forcing a stale write. Default change limits are 20 per agent
384
417
  execution and 100 per UTC day. Classification and replies are acknowledged
385
- 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.
386
419
 
387
420
  Optional schedules accept `intervalHours: 1 | 24` and
388
421
  `mailPurpose: classification | replies`; empty queues skip model execution.
@@ -410,3 +443,42 @@ are ready immediately and confirmation completes the move atomically. Bulk jobs
410
443
  continue server-side; track with status. A stale plan fails closed; completed batches remain applied.
411
444
  Prepare a new review for remaining contents. Cancel only before execution.
412
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.
483
+
484
+ Scheduled runs also accept `runCondition: "new_chats"`: skip model execution unless this agent has new manual or recording chats since its previous scheduled check. Scheduled/reflection chats do not trigger it; explicit Run now bypasses the condition.