ente-cli 0.4.99 → 0.4.101

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
@@ -92,12 +92,46 @@ fallback. CLI pairing without `--agent`
92
92
  creates a named connection agent. MCP authorization creates a connection agent
93
93
  named for the client.
94
94
 
95
- Named profiles are optional. Use one only when a person or process deliberately
96
- switches between several credentials. `--profile` overrides `ENTE_PROFILE`.
97
- Profiles do not activate from the current directory and are not a security
98
- boundary. Use a separate OS account or container when operators on the same
99
- machine must not read each other's keys. Never commit a key or put it in a
100
- project `.env` file.
95
+ Named profiles are optional when one global default is sufficient.
96
+ Profile selection uses `--profile`, then `ENTE_PROFILE`, then the nearest bound
97
+ ancestor of the current directory, then the global `config.toml` default.
98
+ Folder bindings are machine-local in the Ente config directory's `bindings.json`;
99
+ no repository file selects an identity. Paths resolve symlinks before matching.
100
+ A selected missing profile fails instead of falling back to another identity.
101
+ Complete `ENTE_API_URL` / `ENTE_API_KEY` overrides still replace file credentials;
102
+ partial overrides fail closed. `auth status` reports credential source separately
103
+ from `profileSource` and `boundDirectory`.
104
+
105
+ ```bash
106
+ ente auth bind /absolute/operator/folder operator-name
107
+ ente auth bindings --json
108
+ ente auth status --profile operator-name --json
109
+ ente auth unbind /absolute/operator/folder
110
+ ```
111
+
112
+ Bind an existing authenticated profile. Nested bindings override their parents.
113
+ Platform administration credentials stay separate and ignore folder bindings.
114
+ Bindings are defaults, not a security boundary. Use a separate OS account or
115
+ container when operators must not read each other's keys. Never commit a key
116
+ or put it in a project `.env` file.
117
+
118
+ Inspect the selected credential before work:
119
+
120
+ ```bash
121
+ ente auth whoami --json
122
+ ente agent permissions --json
123
+ ente agent permissions --check "Work" --action write --json
124
+ ```
125
+
126
+ `whoami` reports the selected profile and its resolution `source`, the agent ID,
127
+ name, icon, mailbox, active state, home space, and live scopes. The permission
128
+ list includes account-visible spaces denied to the key, with `access` of `none`,
129
+ `read`, or `write`, and server-derived `canRead`/`canWrite` flags. Scopes and OAuth
130
+ consent can restrict those flags independently. Account panel visibility is
131
+ separate from operational access. `--check` accepts an exact space name or ID
132
+ and `--action read|write`; denial exits nonzero and names the web app's
133
+ **Agent actions** and Connections scope settings. These commands never grant
134
+ rights, invoke a provider, or print keys.
101
135
 
102
136
  ## Usage
103
137
 
@@ -142,7 +176,7 @@ Every command supports `--json`. Run `ente --help` or `ente <group> --help`.
142
176
 
143
177
  | Group | Commands |
144
178
  |---|---|
145
- | `auth` | `pair`, `login`, `status`, `logout`, `profiles` |
179
+ | `auth` | `pair`, `login`, `status`, `whoami`, `logout`, `profiles`, `bind`, `unbind`, `bindings` |
146
180
  | `entity` | `list`, `create`, `get`, `update` (`--name`, `--tag`, `--description`), `rename`, `archive`, `restore` (`--share-parents` plus the returned grant fingerprint), `pin` (`--role`, optional confirmed parent grants), `unpin`, `add-to-space`, `remove-from-space` (`--remove-from-activities` optional) |
147
181
  | `activity` | `list`, `create`, `search`, `get`, `transcript` (`--grep`, `--context`), `update`, `delete`, `restore`, `message add`, `attachment upload` |
148
182
  | `agenda` | `create-point`, `link-task` |
@@ -155,7 +189,7 @@ Every command supports `--json`. Run `ente --help` or `ente <group> --help`.
155
189
  | `canvas` | `boards`, `html list`, `html get`, `html create`, `html update`, `html delete` |
156
190
  | `files` | `list`, `upload` (local file at most 10 MiB, or an activity attachment), `link`, `create-folder` — the entity's Nextcloud folder via your own connection; personal agent key only (MCP: `entity_files_list`, `entity_file_upload`, `entity_folder_link`, `entity_folder_create`) |
157
191
  | `notification` | `send` (emails only your own Ente account address; optional HTML, file attachments, and CID inline images) |
158
- | `agent` | `list`, `threads`, `show`, `new`, `send`, `config show`, `config set-prompt`, `schedules configure` |
192
+ | `agent` | `permissions`, `list`, `threads`, `show`, `new`, `send`, `config show`, `config set-prompt`, `schedules configure` |
159
193
  | `agent mail` | `address`, `threads`, `show`, `send`, `reply`, `mark` |
160
194
  | top-level | `search`, `ask`, `query`, `tasks`, `guide` |
161
195
 
@@ -353,6 +387,17 @@ at most 20 address candidates with continuation. For example:
353
387
  ente agent user-mailbox --request '{"operation":"recipients","connectionId":"<permitted-private-connection>","query":"Alex Morgan"}'
354
388
  ```
355
389
 
390
+ When asked to write a new email from the inbox with no message selected, open
391
+ the draft first with one `editVisible` patch. Use an explicit address or a clear,
392
+ explicitly requested contact already in the authorized captured context. Otherwise
393
+ leave `draft.to` empty, including ambiguous, missing, incomplete or unavailable
394
+ matches. Keep the requested subject and body; all fields may be empty for a blank
395
+ email. Do not delay opening for lookup, history, provider research or clarification.
396
+ Never pick an arbitrary candidate. Explain an unresolved name after preparing the
397
+ draft. Later explicit recipient research retains the existing recency and access
398
+ checks. Opening and autosaving a draft never authorizes sending.
399
+
400
+ Outside inbox composition, use recipient resolution for missing requested names.
356
401
  For interactive name resolution, add `"resolve":true` (without `cursor`). The
357
402
  server discovers names and updates all candidate addresses in one recency pass.
358
403
  It uses a shared ceiling of 20 cached pages of at most 200 records (4000 reads
@@ -360,7 +405,8 @@ across both passes, with a separate byte bound per page), or 4 provider pages
360
405
  of at most 20 matching headers (80 fetched headers; native searches, metadata
361
406
  requests and retries are additional network operations). It returns terminal
362
407
  `resolutionComplete`, `discoveryComplete`, `recencyComplete` and budget metadata.
363
- If incomplete or truncated, ask for an explicit address or selection. Do not
408
+ If incomplete or truncated, ask for an explicit address or selection before choosing
409
+ a recipient; this does not block opening an inbox draft with an empty recipient. Do not
364
410
  claim uniqueness or latest contact, automatically restart resolution, or expand
365
411
  to provider research. Preserve all requested recipients. Provider source is for
366
412
  explicitly requested or necessary provider/older correspondence searches.
@@ -565,3 +611,16 @@ ente entity field remove <valueId>
565
611
  replaces that field's values; `"value":null` removes them. Entity `--attr` is
566
612
  retained only to report the moved-to-fields error. Activity/task/list attributes
567
613
  are unchanged. Entity reads expose field/value IDs, labels, types and text.
614
+
615
+ ### Experimental Ask availability
616
+
617
+ Hosted `ente ask` is an opt-in beta for the existing private cohort, not a general
618
+ AI chat or included-model execution API. Most accounts receive an explanation
619
+ without model execution. Explicit own/instance Ask model slots retain their route.
620
+ Use `ente search`, `ente entity get`, `ente activity search/list/get` and summarize
621
+ records with your agent. Do not change provider/model settings to repair beta
622
+ unavailability. Ask exits nonzero unless `synthesisStatus` is `answered`.
623
+
624
+ Default/lexical `ente query` remains deterministic and available without AI.
625
+ Hybrid/semantic query requires private beta enrollment and separate passage
626
+ consent; unavailable responses point to ordinary commands and lexical query.
package/dist/SKILL.md CHANGED
@@ -68,12 +68,43 @@ including cached JWT calls. There is no unrestricted user-key fallback. Create
68
68
  and manage keys from the agent’s Connections settings in `/agents`; several
69
69
  credentials can belong to the same agent.
70
70
 
71
- Named profiles are optional and only needed to switch deliberately between
72
- credentials. `--profile` overrides `ENTE_PROFILE`. Profiles do not activate
73
- from the current directory and do not isolate secrets from other processes
74
- running as the same operating-system user. Use a separate OS account or
75
- container when that isolation matters. Never store a key in the repository or
76
- a project `.env` file.
71
+ Named profiles are optional when one global default is sufficient.
72
+ Resolve the profile in this order: `--profile`, `ENTE_PROFILE`, the nearest
73
+ bound canonical ancestor of the current directory, then the global default.
74
+ Machine-local `bindings.json` in the Ente config directory stores folder bindings;
75
+ repositories carry no binding file. Symlinked folders resolve to their real path.
76
+ A selected missing profile fails closed. Complete API URL/key environment overrides
77
+ still replace stored credentials; check these separately from profile selection.
78
+ `auth status --json` reports `profileSource` and `boundDirectory` separately from
79
+ credential `source`. Bind only an existing authenticated profile:
80
+
81
+ ```bash
82
+ ente auth bind /absolute/operator/folder operator-name
83
+ ente auth bindings --json
84
+ ente auth unbind /absolute/operator/folder
85
+ ```
86
+
87
+ Bindings do not isolate secrets from other processes under the same OS user.
88
+ Use separate OS accounts or containers for that isolation. Platform keys ignore
89
+ folder bindings. Never store a key in a repository or project `.env` file.
90
+
91
+ Inspect the selected credential before work:
92
+
93
+ ```bash
94
+ ente auth whoami --json
95
+ ente agent permissions --json
96
+ ente agent permissions --check "Work" --action write --json
97
+ ```
98
+
99
+ `whoami` reports the selected profile and its resolution `source`, the agent ID,
100
+ name, icon, mailbox, active state, home space, and live scopes. The permission
101
+ list includes account-visible spaces denied to the key, with `access` of `none`,
102
+ `read`, or `write`, and server-derived `canRead`/`canWrite` flags. Scopes and OAuth
103
+ consent can restrict those flags independently. Account panel visibility is
104
+ separate from operational access. `--check` accepts an exact space name or ID
105
+ and `--action read|write`; denial exits nonzero and names the web app's
106
+ **Agent actions** and Connections scope settings. These commands never grant
107
+ rights, invoke a provider, or print keys.
77
108
 
78
109
  Verify server access with `ente entity list --limit 1 --json`.
79
110
 
@@ -150,19 +181,24 @@ ente auth login --url <convex-site-url> --key-stdin
150
181
  ente auth status
151
182
  ente auth logout
152
183
  ente auth profiles
184
+ ente auth bind <path> <profile>
185
+ ente auth unbind <path>
186
+ ente auth bindings [--json]
153
187
 
154
188
  # Search & ask
155
- # Ask keeps scoped evidence on synthesis failure; check synthesisStatus.
189
+ # Ask is an experimental opt-in beta, not a general AI chat or included-model execution API.
190
+ # Prefer ordinary search/entity/activity commands; unavailable beta is not a provider setup task.
191
+ # Check the exit code and synthesisStatus; never present a failed/evidence-only result as an AI answer.
156
192
  # Optional sourceHash/sourceFingerprint/passage metadata binds citations to a source version.
157
193
  # query remains deterministic and never starts embedding/indexing. See guide ask-the-graph.
158
194
  ente search "Alice" [--type person] [--space <name>] [--limit 5] [--projection compact|full] [--json]
159
- ente ask "What's open with Erik?" [--space <name>] [--entity <name>] [--evidence] [--json] # AI answer + citations
195
+ ente ask "What's open with Erik?" [--space <name>] [--entity <name>] [--evidence] [--json] # enrolled beta only: AI answer + citations
160
196
  ente query "QM system export" [--space <name>] [--entity <name>] [--since <epoch-ms>] [--until <epoch-ms>] [--limit 12] [--verbose] [--json] # evidence only, no AI
161
197
 
162
198
  # Entities
163
199
  ente entity list [--query <text>] [--type person|org|project|topic|place|object] [--space <name>] [--limit <count>] [--projection compact|full] [--archived] [--json]
164
200
  ente entity create "Jane Doe" --type person [--pin "Acme Corp"] [--share-parents --parent-space-grant-fingerprint <token>] [--alias "JD"] [--field '{"label":"E-Mail","type":"email","value":"jane@acme.com"}'] [--tag vip] [--description "CTO at Acme"] [--json]
165
- ente entity create "Leistungsphase 1" --type topic --space "Studio" --parent "Building A" [--json]
201
+ ente entity create "Leistungsphase 1" --type topic --space "Studio" --parent "Building A" [--parent-role "Mandant"] [--json]
166
202
  ente entity duplicate <name-or-id> --space <space> [--name "New project"] [--include-exclusive-children] [--json]
167
203
  ente entity get "Jane Doe" [--limit 20] [--hours-back <hours>] [--min-count 5] [--projection compact|full] [--json]
168
204
  ente entity update "Jane Doe" [--allow-non-exclusive-children | --disallow-non-exclusive-children] [--name "Jane A. Doe"] [--alias-add "Jane"] [--alias-remove "JD"] [--field '{"label":"Job title","type":"job-title","value":"CEO"}'] [--tag vip] [--description "…"] [--json]
@@ -216,7 +252,7 @@ ente canvas html delete <boardId> <elementId> [--json]
216
252
  # Entity files: the entity's linked Nextcloud folder, through YOUR own Nextcloud
217
253
  # connection. Works only with your personal agent's key; shared agents are refused.
218
254
  # MCP/REST: entity_files_list, entity_file_upload, entity_folder_link, entity_folder_create.
219
- ente files list <entityId> [--path "03 Unterlagen"] [--json]
255
+ ente files list <entityId> [--path "03 Unterlagen"] [--json] # --json: linkedFolderPath = the linked folder's path from your Nextcloud root; join it with an item path for the exact file
220
256
  ente files upload <entityId> <local-file> [--folder "03 Unterlagen"] [--name "Vertrag.pdf"] [--mime-type application/pdf] [--json] # at most 10 MiB
221
257
  ente files upload <entityId> --activity <activityId> --storage-id <storageId> --name "Vertrag.pdf" [--folder …] [--json] # copy an activity attachment
222
258
  ente files link <entityId> "Mandate/2026-017 Zebrafink" [--space <spaceId>] [--json]
@@ -396,7 +432,9 @@ not enter another browser's local undo stack.
396
432
  For entity files, `files list` returns a `status` (`ok`, `not_linked`, `not_connected`,
397
433
  `reconnect_required`, `no_access`, `folder_deleted`, `unreachable`, `unavailable`) instead of an
398
434
  empty list; tell the user to connect or reconnect Nextcloud in settings rather than retrying.
399
- Paths for `link`/`create-folder` are relative to the user's Nextcloud root; `--path`/`--folder`
435
+ Paths for `link`/`create-folder` are relative to the user's Nextcloud root (where the space has a
436
+ Nextcloud space folder they must lie inside it, e.g. `Kanzlei/Mandate/2026-017`; otherwise the
437
+ reason is `outside_space_folder`); `--path`/`--folder`
400
438
  are relative to the entity's linked folder. Inline uploads are limited to 10 MiB; for an
401
439
  existing activity attachment pass `--activity` and `--storage-id` (from `activity get --json`).
402
440
  A taken file name gets a numbered suffix, nothing is overwritten. `--space` is needed only when
@@ -568,6 +606,17 @@ at most 20 address candidates with continuation. For example:
568
606
  ente agent user-mailbox --request '{"operation":"recipients","connectionId":"<permitted-private-connection>","query":"Alex Morgan"}'
569
607
  ```
570
608
 
609
+ When asked to write a new email from the inbox with no message selected, open
610
+ the draft first with one `editVisible` patch. Use an explicit address or a clear,
611
+ explicitly requested contact already in the authorized captured context. Otherwise
612
+ leave `draft.to` empty, including ambiguous, missing, incomplete or unavailable
613
+ matches. Keep the requested subject and body; all fields may be empty for a blank
614
+ email. Do not delay opening for lookup, history, provider research or clarification.
615
+ Never pick an arbitrary candidate. Explain an unresolved name after preparing the
616
+ draft. Later explicit recipient research retains the existing recency and access
617
+ checks. Opening and autosaving a draft never authorizes sending.
618
+
619
+ Outside inbox composition, use recipient resolution for missing requested names.
571
620
  For interactive name resolution, add `"resolve":true` (without `cursor`). The
572
621
  server discovers names and updates all candidate addresses in one recency pass.
573
622
  It uses a shared ceiling of 20 cached pages of at most 200 records (4000 reads
@@ -575,7 +624,8 @@ across both passes, with a separate byte bound per page), or 4 provider pages
575
624
  of at most 20 matching headers (80 fetched headers; native searches, metadata
576
625
  requests and retries are additional network operations). It returns terminal
577
626
  `resolutionComplete`, `discoveryComplete`, `recencyComplete` and budget metadata.
578
- If incomplete or truncated, ask for an explicit address or selection. Do not
627
+ If incomplete or truncated, ask for an explicit address or selection before choosing
628
+ a recipient; this does not block opening an inbox draft with an empty recipient. Do not
579
629
  claim uniqueness or latest contact, automatically restart resolution, or expand
580
630
  to provider research. Preserve all requested recipients. Provider source is for
581
631
  explicitly requested or necessary provider/older correspondence searches.
@@ -633,7 +683,7 @@ blocks. Use existing activity controls to correct thread space/owners.
633
683
 
634
684
  Entity duplication copies the type, name, description, email addresses, icon and enabled bottom-bar tabs in their configured order, database columns/filters/sorts, grouping rules and the calendar-sidebar list/Kanban preference into the selected source space. It never copies activities or existing parents. `--include-exclusive-children` is the compatibility name for recursively recreating branches whose selected parent is each child’s sole regular parent already in that space with exact child names, order and aggregation settings. Selected-child grouping rules refer only to copied aggregation-enabled direct children; excluded children are dropped from the rule. Classifier-parent branches and archived children are excluded. Extra classifier links are never copied. The operation fails atomically above 100 entities including the root. Use parent context or an ID to distinguish same-named phases across projects.
635
685
 
636
- `entity create --parent` atomically creates and attaches a child. Add `--exclusive-parent` to restrict it to that parent. The parent must already belong to the destination space; this path never shares it or its ancestors. Resolve same-named phases by parent context or ID. Do not combine `--parent` with `--pin`; `--pin` retains the older separate-link behavior.
686
+ `entity create --parent` atomically creates and attaches a child. `--parent-role "Gegner"` sets the relationship role on that link in the same write (same rule as `entity pin --role`; requires `--parent`). Add `--exclusive-parent` to restrict it to that parent. The parent must already belong to the destination space; this path never shares it or its ancestors. Resolve same-named phases by parent context or ID. Do not combine `--parent` with `--pin`; `--pin` retains the older separate-link behavior.
637
687
 
638
688
  ## Reviewed space changes
639
689
 
@@ -736,8 +786,11 @@ task and relationship retrieval without provider calls. `--mode lexical` is the
736
786
  same default. Keep `ente search` for fuzzy entity lookup and `ente activity search`
737
787
  for ordinary title/body keyword search.
738
788
 
739
- Use `ente query "question" --mode hybrid --space Personal --json` only when semantic
740
- retrieval is wanted and consented. Hybrid retains typed deterministic structured
789
+ Hybrid/semantic query is an experimental private opt-in beta. It is unavailable
790
+ for most accounts; do not change model/provider settings or repeatedly retry to
791
+ obtain enrollment. Use ordinary commands or lexical query instead.
792
+ Use `ente query "question" --mode hybrid --space Personal --json` only when
793
+ explicitly enrolled and semantic retrieval is wanted and consented. Hybrid retains typed deterministic structured
741
794
  results and combines lexical/vector activity passages. `--mode semantic` returns
742
795
  vector activity passages only, for inspection/comparison. Initial vectors cover
743
796
  only the caller's own Personal notes, conversations, meetings and calls. Related
@@ -780,3 +833,16 @@ conflicting children, including archived or inaccessible ones, without removing
780
833
  links. Legacy `--exclusive-parent` is accepted but inert after policy activation;
781
834
  it never sets the new parent setting. Existing Space confirmation and cycle
782
835
  rules still apply.
836
+
837
+ ### Ask beta availability
838
+
839
+ Hosted `ente ask` is restricted to the existing private beta cohort. The local
840
+ fictional equivalent is test@example.com on a loopback backend. This is separate
841
+ from passage-index consent: enabling/disabling semantic retrieval does not enroll
842
+ another account in hosted Ask. Explicitly configured own/instance Ask model slots
843
+ retain their route and permissions. Ordinary paid plans do not enroll an account.
844
+ If unavailable, use `ente search`, `ente entity get`, `ente activity search`,
845
+ `ente activity list` and `ente activity get`, then summarize the returned records
846
+ with your agent. Default/lexical `ente query` remains available without AI.
847
+ `ask` returns a nonzero exit unless synthesisStatus is answered. Do not request
848
+ a Bedrock key, provider access or model change to repair beta unavailability.