ente-cli 0.4.69 → 0.4.70
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 +22 -0
- package/dist/SKILL.md +43 -2
- package/dist/cli.mjs +161 -83
- package/dist/cli.mjs.map +4 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -401,3 +401,25 @@ Updating replaces agent assignees and preserves human assignees. Use
|
|
|
401
401
|
`--clear-agent-assignees` to remove them. Only active agents with write access qualify.
|
|
402
402
|
|
|
403
403
|
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.
|
|
404
|
+
|
|
405
|
+
## Bounded retrieval and machine failures
|
|
406
|
+
|
|
407
|
+
Use `query --space <name-or-id> --entity <name-or-id> --since <epoch-ms>
|
|
408
|
+
--until <epoch-ms> --limit 8 --json` for deterministic evidence without a model.
|
|
409
|
+
Time filters apply to activity evidence. Resolve entity identity globally first.
|
|
410
|
+
|
|
411
|
+
`activity list --entity <id> --compact --limit 10 --json` returns one compact
|
|
412
|
+
history page. Follow `nextCursor` with `--cursor` and the same entity/time
|
|
413
|
+
filters until `hasMore` is false. Compact pages retain the space/member envelope,
|
|
414
|
+
record IDs, time/assignment metadata and continuation. Long bodies become
|
|
415
|
+
240-character excerpts; attributes, derived data, attachments and content hashes
|
|
416
|
+
are omitted. The `projection.fullDetail` references point to `activity get <id>`
|
|
417
|
+
(CLI), `activities_get` (MCP), and `getActivity` (internal tools). Defaults stay
|
|
418
|
+
unchanged. REST uses `compact=true`; MCP `activities_forEntity` and internal
|
|
419
|
+
`listRecentActivities` use `compact: true`. These options apply to active
|
|
420
|
+
entity-scoped pages, without client-side type/attribute/open/deadline filters.
|
|
421
|
+
|
|
422
|
+
JSON failures use stdout `{ "error": { "message": "..." } }` with a nonzero
|
|
423
|
+
exit. REST status and structured error fields survive. Check the exit before
|
|
424
|
+
parsing; see [Retrieve bounded context](playbooks/retrieve-bounded-context.md).
|
|
425
|
+
The unsupported `entity show` spelling gives a targeted `entity get` correction.
|
package/dist/SKILL.md
CHANGED
|
@@ -98,6 +98,47 @@ npm i -g ente-cli --registry https://registry.npmjs.org
|
|
|
98
98
|
|
|
99
99
|
---
|
|
100
100
|
|
|
101
|
+
## Retrieve a bounded page
|
|
102
|
+
|
|
103
|
+
Search entities globally first to resolve identity. Use the returned ID and an
|
|
104
|
+
explicit space for evidence when the task specifies a space. Preserve `spaces`,
|
|
105
|
+
record `spaceId`/`spaceIds`, scope, warnings and pagination when selecting fields;
|
|
106
|
+
access to a record is not permission to copy it into another space.
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Deterministic evidence; no hosted model. Time filters constrain activities.
|
|
110
|
+
if ente query "launch decisions" --space "Work" --entity "Apollo" --since 1791763200000 --until 1792368000000 --limit 8 --json > evidence.json; then
|
|
111
|
+
jq '{data: {scope: .data.scope, evidence: [.data.evidence[] | {id, title, activityId, entityId, spaceIds, spaceNames}], warnings: .data.warnings, truncated: .data.truncated}, spaces: .data.spaces}' evidence.json
|
|
112
|
+
fi
|
|
113
|
+
# One entity-history page with body excerpts and an explicit full-detail path.
|
|
114
|
+
ente activity list --entity <entity-id> --after 1791763200000 --before 1792368000000 --min-count 0 --limit 10 --compact --json
|
|
115
|
+
# Continue with identical entity/time filters; never replace the cursor with a timestamp.
|
|
116
|
+
ente activity list --entity <entity-id> --after 1791763200000 --before 1792368000000 --min-count 0 --limit 10 --compact --cursor '<nextCursor>' --json
|
|
117
|
+
ente activity get <activity-id> --json
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`--compact` currently applies to active entity-scoped activity pages only. It
|
|
121
|
+
keeps space names, scopes, member emails, record IDs and `hasMore`/`nextCursor`.
|
|
122
|
+
It replaces long bodies with 240-character excerpts and omits attributes,
|
|
123
|
+
derived payloads, attachments and content hashes. `projection.fullDetail` names
|
|
124
|
+
the complete read on each interface. Omit `--compact` for the existing output.
|
|
125
|
+
Do not combine compact/cursor pages with client-side `--type`, `--attr`,
|
|
126
|
+
`--only-open` or deadline sorting. Those filters need full reads.
|
|
127
|
+
|
|
128
|
+
`--json` failures return `{ "error": { "message": "..." } }` on stdout and a
|
|
129
|
+
nonzero exit; REST failures also retain `statusCode` and structured error fields.
|
|
130
|
+
Check the exit before parsing. Do not append a successful help command and treat
|
|
131
|
+
its exit as the preceding command's result. `entity show` reports the supported
|
|
132
|
+
`entity get` command and fails without making a request.
|
|
133
|
+
|
|
134
|
+
For inbox coverage, page the unfiltered `agent mail threads` list to completion,
|
|
135
|
+
then inspect thread messages, including updates to older threads. `--unread`
|
|
136
|
+
and `--needs-reply` answer different questions; unread alone misses read but
|
|
137
|
+
unanswered mail. Keep each view's cursor separate and retain workflow versions.
|
|
138
|
+
An unfiltered list is not an atomic merged snapshot with internal agent chats.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
101
142
|
## Quick Reference
|
|
102
143
|
|
|
103
144
|
```bash
|
|
@@ -111,7 +152,7 @@ ente auth profiles
|
|
|
111
152
|
# Search & ask
|
|
112
153
|
ente search "Alice" [--type person] [--json]
|
|
113
154
|
ente ask "What's open with Erik?" [--space <name>] [--entity <name>] [--evidence] [--json] # AI answer + citations
|
|
114
|
-
ente query "QM system export" [--space <name>] [--entity <name>] [--verbose] [--json] # evidence only, no AI
|
|
155
|
+
ente query "QM system export" [--space <name>] [--entity <name>] [--since <epoch-ms>] [--until <epoch-ms>] [--limit 12] [--verbose] [--json] # evidence only, no AI
|
|
115
156
|
|
|
116
157
|
# Entities
|
|
117
158
|
ente entity list [--query <text>] [--type person|org|project|topic|place|object] [--space <name>] [--limit 50] [--archived] [--json]
|
|
@@ -128,7 +169,7 @@ ente entity archive "Old Project" [--json]
|
|
|
128
169
|
ente entity restore <entity-id> [--share-parents --parent-space-grant-fingerprint <token>] [--json]
|
|
129
170
|
|
|
130
171
|
# Activities
|
|
131
|
-
ente activity list [--entity "Jane"] [--type note|conversation|meeting|call|message|task] [--attr k=v] [--only-open] [--hours 168] [--limit 20] [--sort deadline|created] [--json]
|
|
172
|
+
ente activity list [--entity "Jane"] [--compact] [--cursor <nextCursor>] [--min-count 0] [--type note|conversation|meeting|call|message|task] [--attr k=v] [--only-open] [--hours 168] [--limit 20] [--sort deadline|created] [--json]
|
|
132
173
|
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]
|
|
133
174
|
ente activity search "quarterly review" [--entity "Acme"] [--type meeting] [--limit 10] [--json]
|
|
134
175
|
ente activity get <activityId> [--json] # complete detail: body, full nested agenda, messages/replies, entities, attachments
|
package/dist/cli.mjs
CHANGED
|
@@ -3710,8 +3710,97 @@ function warn(opts, latest) {
|
|
|
3710
3710
|
);
|
|
3711
3711
|
}
|
|
3712
3712
|
|
|
3713
|
+
// core/errors.ts
|
|
3714
|
+
var ApiError = class extends Error {
|
|
3715
|
+
statusCode;
|
|
3716
|
+
error;
|
|
3717
|
+
constructor(statusCode, message, error) {
|
|
3718
|
+
super(`HTTP ${statusCode}: ${message}`);
|
|
3719
|
+
this.name = "ApiError";
|
|
3720
|
+
this.statusCode = statusCode;
|
|
3721
|
+
this.detail = message;
|
|
3722
|
+
this.error = error ?? {};
|
|
3723
|
+
}
|
|
3724
|
+
/** The backend's human message, without the `HTTP <code>:` prefix. */
|
|
3725
|
+
detail;
|
|
3726
|
+
};
|
|
3727
|
+
var ExitWithCode = class extends Error {
|
|
3728
|
+
code;
|
|
3729
|
+
constructor(code2) {
|
|
3730
|
+
super(`exit ${code2}`);
|
|
3731
|
+
this.name = "ExitWithCode";
|
|
3732
|
+
this.code = code2;
|
|
3733
|
+
}
|
|
3734
|
+
};
|
|
3735
|
+
|
|
3736
|
+
// core/output.ts
|
|
3737
|
+
function emit(stdout, data, json, rowsFn, headers) {
|
|
3738
|
+
if (json || !rowsFn) {
|
|
3739
|
+
stdout.write(`${JSON.stringify(data, null, 2)}
|
|
3740
|
+
`);
|
|
3741
|
+
return;
|
|
3742
|
+
}
|
|
3743
|
+
stdout.write(`${renderTable(rowsFn(data), headers)}
|
|
3744
|
+
`);
|
|
3745
|
+
}
|
|
3746
|
+
function errorMessage(err) {
|
|
3747
|
+
if (!(err instanceof Error)) return String(err);
|
|
3748
|
+
const data = err.data;
|
|
3749
|
+
if (typeof data === "string" && data.length > 0) return data;
|
|
3750
|
+
if (data && typeof data === "object") {
|
|
3751
|
+
const { message, code: code2 } = data;
|
|
3752
|
+
if (typeof message === "string" && message.length > 0) {
|
|
3753
|
+
return typeof code2 === "string" ? `${message} (${code2})` : message;
|
|
3754
|
+
}
|
|
3755
|
+
return `${err.message}: ${JSON.stringify(data)}`;
|
|
3756
|
+
}
|
|
3757
|
+
return err.message;
|
|
3758
|
+
}
|
|
3759
|
+
function renderTable(rows, headers) {
|
|
3760
|
+
if (rows.length === 0) return "(none)";
|
|
3761
|
+
const cols = headers ?? Object.keys(rows[0] ?? {});
|
|
3762
|
+
const widths = cols.map((c) => Math.max(c.length, ...rows.map((r) => (r[c] ?? "").length)));
|
|
3763
|
+
const line = (cells) => cells.map((cell, i) => cell.padEnd(widths[i] ?? 0)).join(" ").trimEnd();
|
|
3764
|
+
const out = [line(cols), line(cols.map((_, i) => "\u2500".repeat(widths[i] ?? 0)))];
|
|
3765
|
+
for (const r of rows) out.push(line(cols.map((c) => r[c] ?? "")));
|
|
3766
|
+
return out.join("\n");
|
|
3767
|
+
}
|
|
3768
|
+
|
|
3769
|
+
// core/errorOutput.ts
|
|
3770
|
+
function writeCommandError(stdout, stderr, json, error) {
|
|
3771
|
+
if (!json) {
|
|
3772
|
+
stderr.write(`Error: ${errorMessage(error)}
|
|
3773
|
+
`);
|
|
3774
|
+
return;
|
|
3775
|
+
}
|
|
3776
|
+
const data = error instanceof ApiError ? error.error : error instanceof Error && "data" in error ? error.data : void 0;
|
|
3777
|
+
const details = data && typeof data === "object" && !Array.isArray(data) ? data : {};
|
|
3778
|
+
stdout.write(`${JSON.stringify({ error: {
|
|
3779
|
+
...details,
|
|
3780
|
+
message: errorMessage(error),
|
|
3781
|
+
...error instanceof ApiError ? { statusCode: error.statusCode } : {}
|
|
3782
|
+
} }, null, 2)}
|
|
3783
|
+
`);
|
|
3784
|
+
}
|
|
3785
|
+
|
|
3786
|
+
// core/run.ts
|
|
3787
|
+
async function runCli(cli2, argv, context) {
|
|
3788
|
+
try {
|
|
3789
|
+
const command = cli2.process(argv, context);
|
|
3790
|
+
return await cli2.run(command, context);
|
|
3791
|
+
} catch (error) {
|
|
3792
|
+
writeCommandError(
|
|
3793
|
+
context.stdout,
|
|
3794
|
+
context.stderr,
|
|
3795
|
+
argv.includes("--json"),
|
|
3796
|
+
argv.includes("--json") ? new Error("Invalid command or options. Run 'ente <command> --help' for usage.") : error
|
|
3797
|
+
);
|
|
3798
|
+
return 1;
|
|
3799
|
+
}
|
|
3800
|
+
}
|
|
3801
|
+
|
|
3713
3802
|
// ente/version.ts
|
|
3714
|
-
var VERSION = "0.4.
|
|
3803
|
+
var VERSION = "0.4.70";
|
|
3715
3804
|
|
|
3716
3805
|
// ente/branding.ts
|
|
3717
3806
|
var NPM_REGISTRY = "https://registry.npmjs.org";
|
|
@@ -3842,62 +3931,6 @@ function deleteJwt(cacheDir, key) {
|
|
|
3842
3931
|
return true;
|
|
3843
3932
|
}
|
|
3844
3933
|
|
|
3845
|
-
// core/errors.ts
|
|
3846
|
-
var ApiError = class extends Error {
|
|
3847
|
-
statusCode;
|
|
3848
|
-
error;
|
|
3849
|
-
constructor(statusCode, message, error) {
|
|
3850
|
-
super(`HTTP ${statusCode}: ${message}`);
|
|
3851
|
-
this.name = "ApiError";
|
|
3852
|
-
this.statusCode = statusCode;
|
|
3853
|
-
this.detail = message;
|
|
3854
|
-
this.error = error ?? {};
|
|
3855
|
-
}
|
|
3856
|
-
/** The backend's human message, without the `HTTP <code>:` prefix. */
|
|
3857
|
-
detail;
|
|
3858
|
-
};
|
|
3859
|
-
var ExitWithCode = class extends Error {
|
|
3860
|
-
code;
|
|
3861
|
-
constructor(code2) {
|
|
3862
|
-
super(`exit ${code2}`);
|
|
3863
|
-
this.name = "ExitWithCode";
|
|
3864
|
-
this.code = code2;
|
|
3865
|
-
}
|
|
3866
|
-
};
|
|
3867
|
-
|
|
3868
|
-
// core/output.ts
|
|
3869
|
-
function emit(stdout, data, json, rowsFn, headers) {
|
|
3870
|
-
if (json || !rowsFn) {
|
|
3871
|
-
stdout.write(`${JSON.stringify(data, null, 2)}
|
|
3872
|
-
`);
|
|
3873
|
-
return;
|
|
3874
|
-
}
|
|
3875
|
-
stdout.write(`${renderTable(rowsFn(data), headers)}
|
|
3876
|
-
`);
|
|
3877
|
-
}
|
|
3878
|
-
function errorMessage(err) {
|
|
3879
|
-
if (!(err instanceof Error)) return String(err);
|
|
3880
|
-
const data = err.data;
|
|
3881
|
-
if (typeof data === "string" && data.length > 0) return data;
|
|
3882
|
-
if (data && typeof data === "object") {
|
|
3883
|
-
const { message, code: code2 } = data;
|
|
3884
|
-
if (typeof message === "string" && message.length > 0) {
|
|
3885
|
-
return typeof code2 === "string" ? `${message} (${code2})` : message;
|
|
3886
|
-
}
|
|
3887
|
-
return `${err.message}: ${JSON.stringify(data)}`;
|
|
3888
|
-
}
|
|
3889
|
-
return err.message;
|
|
3890
|
-
}
|
|
3891
|
-
function renderTable(rows, headers) {
|
|
3892
|
-
if (rows.length === 0) return "(none)";
|
|
3893
|
-
const cols = headers ?? Object.keys(rows[0] ?? {});
|
|
3894
|
-
const widths = cols.map((c) => Math.max(c.length, ...rows.map((r) => (r[c] ?? "").length)));
|
|
3895
|
-
const line = (cells) => cells.map((cell, i) => cell.padEnd(widths[i] ?? 0)).join(" ").trimEnd();
|
|
3896
|
-
const out = [line(cols), line(cols.map((_, i) => "\u2500".repeat(widths[i] ?? 0)))];
|
|
3897
|
-
for (const r of rows) out.push(line(cols.map((c) => r[c] ?? "")));
|
|
3898
|
-
return out.join("\n");
|
|
3899
|
-
}
|
|
3900
|
-
|
|
3901
3934
|
// core/command.ts
|
|
3902
3935
|
var BaseCommand = class extends Command {
|
|
3903
3936
|
json = options_exports.Boolean("--json", false, {
|
|
@@ -3935,8 +3968,7 @@ var BaseCommand = class extends Command {
|
|
|
3935
3968
|
return typeof code2 === "number" ? code2 : 0;
|
|
3936
3969
|
} catch (err) {
|
|
3937
3970
|
if (err instanceof ExitWithCode) return err.code;
|
|
3938
|
-
this.context.stderr.
|
|
3939
|
-
`);
|
|
3971
|
+
writeCommandError(this.context.stdout, this.context.stderr, this.json, err);
|
|
3940
3972
|
return 1;
|
|
3941
3973
|
}
|
|
3942
3974
|
}
|
|
@@ -4750,6 +4782,12 @@ ${footer}` : body;
|
|
|
4750
4782
|
}
|
|
4751
4783
|
// --- shared: activity list (used by `activity list` and `tasks`) --------
|
|
4752
4784
|
async runActivityList(opts) {
|
|
4785
|
+
if ((opts.compact || opts.cursor !== void 0) && (!opts.entity || opts.typeFilter || opts.onlyOpen || opts.attrFilter?.length || opts.sort && opts.sort !== "created")) {
|
|
4786
|
+
throw new Error("--compact/--cursor require --entity and cannot combine with --type, --only-open, --attr or --sort deadline. Use an unfiltered page, then inspect full details.");
|
|
4787
|
+
}
|
|
4788
|
+
if (opts.minCount !== void 0 && (!Number.isSafeInteger(opts.minCount) || opts.minCount < 0 || !opts.entity || opts.typeFilter || opts.onlyOpen || opts.attrFilter?.length)) {
|
|
4789
|
+
throw new Error("--min-count requires an unfiltered entity-scoped page and a nonnegative integer. Use 0 for a strict time window.");
|
|
4790
|
+
}
|
|
4753
4791
|
if (opts.sort && !VALID_SORT.has(opts.sort)) {
|
|
4754
4792
|
throw new Error(`Invalid --sort value '${opts.sort}'. Allowed: deadline, created`);
|
|
4755
4793
|
}
|
|
@@ -4795,6 +4833,8 @@ ${footer}` : body;
|
|
|
4795
4833
|
const hasClientFilters = !!(opts.typeFilter || opts.onlyOpen || opts.attrFilter && opts.attrFilter.length);
|
|
4796
4834
|
let activities;
|
|
4797
4835
|
let serverHasMore;
|
|
4836
|
+
let nextCursor;
|
|
4837
|
+
let projection;
|
|
4798
4838
|
if (hasClientFilters) {
|
|
4799
4839
|
const hoursCutoff = opts.hours ? Date.now() - opts.hours * 36e5 : void 0;
|
|
4800
4840
|
activities = [];
|
|
@@ -4840,9 +4880,14 @@ ${footer}` : body;
|
|
|
4840
4880
|
if (opts.limit) params.limit = String(opts.limit);
|
|
4841
4881
|
if (opts.before !== void 0) params.before = String(opts.before);
|
|
4842
4882
|
if (opts.after !== void 0) params.after = String(opts.after);
|
|
4883
|
+
if (opts.cursor !== void 0) params.cursor = opts.cursor;
|
|
4884
|
+
if (opts.compact) params.compact = "true";
|
|
4885
|
+
if (opts.minCount !== void 0) params.minCount = String(opts.minCount);
|
|
4843
4886
|
const res = await client.listActivities(params);
|
|
4844
4887
|
activities = res.data ?? [];
|
|
4845
4888
|
serverHasMore = res.hasMore;
|
|
4889
|
+
nextCursor = res.nextCursor;
|
|
4890
|
+
projection = res.projection;
|
|
4846
4891
|
}
|
|
4847
4892
|
if (opts.typeFilter) activities = activities.filter((a) => a.type === opts.typeFilter);
|
|
4848
4893
|
if (opts.onlyOpen) activities = activities.filter((a) => !a.completed);
|
|
@@ -4863,14 +4908,20 @@ ${footer}` : body;
|
|
|
4863
4908
|
const hasMore = hasClientFilters ? void 0 : serverHasMore;
|
|
4864
4909
|
const jsonData = { data: activities };
|
|
4865
4910
|
if (hasMore !== void 0) jsonData.hasMore = hasMore;
|
|
4911
|
+
if (nextCursor !== void 0) jsonData.nextCursor = nextCursor;
|
|
4912
|
+
if (projection !== void 0) jsonData.projection = projection;
|
|
4866
4913
|
this.emitText(jsonWithSpaces(jsonData, spaces), () => {
|
|
4867
4914
|
let body = formatActivityList(activities);
|
|
4868
|
-
if (hasMore &&
|
|
4869
|
-
|
|
4915
|
+
if (hasMore && nextCursor) {
|
|
4916
|
+
body += `
|
|
4917
|
+
|
|
4918
|
+
(more results available \u2014 use --cursor '${nextCursor.replaceAll("'", "'\\''")}' with the same --entity and filters)`;
|
|
4919
|
+
} else if (hasMore && activities.length) {
|
|
4870
4920
|
body += `
|
|
4871
4921
|
|
|
4872
|
-
(more results available \u2014 use --before ${
|
|
4922
|
+
(more results available \u2014 use --before ${activities[activities.length - 1].createdAt})`;
|
|
4873
4923
|
}
|
|
4924
|
+
if (projection) body += "\n\nCompact excerpts. Full detail: ente activity get <activityId> --json";
|
|
4874
4925
|
return this.withFooter(body, spaces);
|
|
4875
4926
|
});
|
|
4876
4927
|
}
|
|
@@ -11115,14 +11166,12 @@ var AuthLogin = class extends BaseCommand {
|
|
|
11115
11166
|
try {
|
|
11116
11167
|
resp = await validateExternalCredential(cleanUrl, key, controller.signal);
|
|
11117
11168
|
} catch {
|
|
11118
|
-
|
|
11119
|
-
return 1;
|
|
11169
|
+
throw new Error(`Could not reach ${cleanUrl}`);
|
|
11120
11170
|
} finally {
|
|
11121
11171
|
clearTimeout(timer);
|
|
11122
11172
|
}
|
|
11123
11173
|
if (resp.status >= 400) {
|
|
11124
|
-
|
|
11125
|
-
return 1;
|
|
11174
|
+
throw new Error(`Authentication failed: ${resp.status} ${resp.statusText}`);
|
|
11126
11175
|
}
|
|
11127
11176
|
const previous = readCredentialsForCleanup(this.profile);
|
|
11128
11177
|
if (previous) {
|
|
@@ -11818,6 +11867,7 @@ var EntityCreate = class extends ProfileCommand {
|
|
|
11818
11867
|
const spaces = await spacesFooterFromMemberships(caller);
|
|
11819
11868
|
const jsonOut = { data: { entityId } };
|
|
11820
11869
|
if (pinFailures.length) {
|
|
11870
|
+
jsonOut.error = { message: "Entity created, but some parent relationships failed.", code: "PARTIAL_SUCCESS" };
|
|
11821
11871
|
jsonOut.data = {
|
|
11822
11872
|
entityId,
|
|
11823
11873
|
pinFailures: pinFailures.map(([target, error]) => ({ target, error })),
|
|
@@ -11843,6 +11893,13 @@ Pinned to: ${pinSucceeded.join(", ")}`;
|
|
|
11843
11893
|
}
|
|
11844
11894
|
}
|
|
11845
11895
|
};
|
|
11896
|
+
var EntityShowCorrection = class extends ProfileCommand {
|
|
11897
|
+
static paths = [["entity", "show"]];
|
|
11898
|
+
nameOrId = options_exports.String();
|
|
11899
|
+
async run() {
|
|
11900
|
+
throw new Error("Use 'ente entity get <name-or-id>' to read entity details.");
|
|
11901
|
+
}
|
|
11902
|
+
};
|
|
11846
11903
|
var EntityGet = class extends ProfileCommand {
|
|
11847
11904
|
static paths = [["entity", "get"]];
|
|
11848
11905
|
static usage = Command.Usage({ category: "Entity", description: "Get entity details" });
|
|
@@ -11926,10 +11983,9 @@ var EntityUpdate = class extends ProfileCommand {
|
|
|
11926
11983
|
didSomething = true;
|
|
11927
11984
|
}
|
|
11928
11985
|
if (!didSomething) {
|
|
11929
|
-
|
|
11986
|
+
throw new Error(
|
|
11930
11987
|
"Nothing to update. Specify --name, --alias-add, --alias-remove, --attr, --tag, or --description."
|
|
11931
11988
|
);
|
|
11932
|
-
return 1;
|
|
11933
11989
|
}
|
|
11934
11990
|
const spaces = await spacesFooterFromMemberships(caller);
|
|
11935
11991
|
this.emitText(
|
|
@@ -12215,6 +12271,7 @@ var EntityHtmlUpdate = class extends ProfileCommand {
|
|
|
12215
12271
|
}
|
|
12216
12272
|
};
|
|
12217
12273
|
var ENTITY_COMMANDS = [
|
|
12274
|
+
EntityShowCorrection,
|
|
12218
12275
|
EntityList,
|
|
12219
12276
|
EntityCreate,
|
|
12220
12277
|
EntityGet,
|
|
@@ -12538,6 +12595,9 @@ var ActivityList = class extends ClientCommand {
|
|
|
12538
12595
|
static paths = [["activity", "list"]];
|
|
12539
12596
|
static usage = Command.Usage({ category: "Activity", description: "List activities" });
|
|
12540
12597
|
entity = options_exports.String("--entity", { description: "Filter by entity (name or ID)" });
|
|
12598
|
+
compact = options_exports.Boolean("--compact", false, { description: "Entity-scoped compact page; preserves spaces and continuation. Read full detail with activity get." });
|
|
12599
|
+
cursor = options_exports.String("--cursor", { description: "Opaque nextCursor from the previous entity-scoped page; keep the same entity and filters" });
|
|
12600
|
+
minCount = options_exports.String("--min-count", { description: "Minimum entity history entries, even outside the time window (default 5). Use 0 for a strict window." });
|
|
12541
12601
|
type = options_exports.String("--type", { description: "Filter by type (task, call, note, message, conversation, meeting)" });
|
|
12542
12602
|
attr = options_exports.Array("--attr", { description: "Filter by attribute key=value" });
|
|
12543
12603
|
onlyOpen = options_exports.Boolean("--only-open", false, { description: "Only show non-completed activities" });
|
|
@@ -12551,6 +12611,7 @@ var ActivityList = class extends ClientCommand {
|
|
|
12551
12611
|
});
|
|
12552
12612
|
async run() {
|
|
12553
12613
|
if (this.archived) {
|
|
12614
|
+
if (this.compact || this.cursor !== void 0 || this.minCount !== void 0) throw new Error("--compact/--cursor/--min-count require an active entity-scoped activity list.");
|
|
12554
12615
|
const client = this.client();
|
|
12555
12616
|
const params = { archived: "true" };
|
|
12556
12617
|
if (this.limit) params.limit = this.limit;
|
|
@@ -12563,6 +12624,9 @@ var ActivityList = class extends ClientCommand {
|
|
|
12563
12624
|
return;
|
|
12564
12625
|
}
|
|
12565
12626
|
await this.runActivityList({
|
|
12627
|
+
compact: this.compact,
|
|
12628
|
+
cursor: this.cursor,
|
|
12629
|
+
minCount: this.minCount !== void 0 ? Number(this.minCount) : void 0,
|
|
12566
12630
|
entity: this.entity,
|
|
12567
12631
|
typeFilter: this.type,
|
|
12568
12632
|
attrFilter: this.attr,
|
|
@@ -12776,8 +12840,7 @@ var ActivityUpdate = class extends ProfileCommand {
|
|
|
12776
12840
|
const deadline = deadlineChange(this.deadline, this.clearDeadline);
|
|
12777
12841
|
const hasEntityChange = !!(this.entityAdd && this.entityAdd.length || this.entityRemove && this.entityRemove.length);
|
|
12778
12842
|
if (this.content === void 0 && this.contentFile === void 0 && this.title === void 0 && deadline === null && !hasEntityChange && !this.agentAssignee?.length && !this.clearAgentAssignees) {
|
|
12779
|
-
|
|
12780
|
-
return 1;
|
|
12843
|
+
throw new Error("Nothing to update. Specify content, title, deadline, entity links or agent assignees.");
|
|
12781
12844
|
}
|
|
12782
12845
|
if (this.clearAgentAssignees && this.agentAssignee?.length) throw new Error("Choose --agent-assignee or --clear-agent-assignees");
|
|
12783
12846
|
const caller = await resolveCaller();
|
|
@@ -12798,8 +12861,7 @@ var ActivityUpdate = class extends ProfileCommand {
|
|
|
12798
12861
|
const newIds = currentIds.filter((eid) => !removeSet.has(eid));
|
|
12799
12862
|
for (const eid of addIds) if (!currentIds.includes(eid)) newIds.push(eid);
|
|
12800
12863
|
if (newIds.length === 0) {
|
|
12801
|
-
|
|
12802
|
-
return 1;
|
|
12864
|
+
throw new Error("Cannot remove all entities \u2014 an activity must have at least one.");
|
|
12803
12865
|
}
|
|
12804
12866
|
await caller.mutation(activitiesUpdateEntities, { activityId: this.id, entities: newIds });
|
|
12805
12867
|
}
|
|
@@ -12974,8 +13036,7 @@ var ActivityMessageAdd = class extends ProfileCommand {
|
|
|
12974
13036
|
async run() {
|
|
12975
13037
|
const markdown = readContentOption(this.content, this.contentFile);
|
|
12976
13038
|
if (!markdown?.trim()) {
|
|
12977
|
-
|
|
12978
|
-
return 1;
|
|
13039
|
+
throw new Error("Message content is required. Specify --content or --content-file.");
|
|
12979
13040
|
}
|
|
12980
13041
|
const caller = await resolveCaller();
|
|
12981
13042
|
const messageId = await caller.mutation(messagesCreateFromMarkdown, {
|
|
@@ -13344,8 +13405,7 @@ var TaskListCmd = class extends ClientCommand {
|
|
|
13344
13405
|
else if (this.due === "today") params.dueBy = String(endOfTodayBerlin());
|
|
13345
13406
|
else if (this.due === "overdue") params.dueBy = String(Date.now());
|
|
13346
13407
|
else if (this.due) {
|
|
13347
|
-
|
|
13348
|
-
return 1;
|
|
13408
|
+
throw new Error(`Unknown --due value: '${this.due}'. Use: today, overdue, or all.`);
|
|
13349
13409
|
}
|
|
13350
13410
|
const res = await client.listTasks(params);
|
|
13351
13411
|
const tasks = (res.data ?? []).slice();
|
|
@@ -13478,8 +13538,7 @@ var TaskUpdate = class extends ProfileCommand {
|
|
|
13478
13538
|
const attributes = parseAttrs(this.attr);
|
|
13479
13539
|
const deadline = deadlineChange(this.deadline, this.clearDeadline);
|
|
13480
13540
|
if (this.title === void 0 && this.content === void 0 && deadline === null && Object.keys(attributes).length === 0) {
|
|
13481
|
-
|
|
13482
|
-
return 1;
|
|
13541
|
+
throw new Error("Nothing to update. Specify --title, --content, --attr, --deadline, or --clear-deadline.");
|
|
13483
13542
|
}
|
|
13484
13543
|
const caller = await resolveCaller();
|
|
13485
13544
|
const activityId = await resolveTaskIdC(caller, this.id);
|
|
@@ -14997,7 +15056,7 @@ var RecordingRerunCommand = class extends ProfileCommand {
|
|
|
14997
15056
|
audioPreserved
|
|
14998
15057
|
};
|
|
14999
15058
|
if (after.processingStatus === "error") {
|
|
15000
|
-
this.emitText(data, () => `Pipeline failed for ${after.id}: ${after.processingError}`);
|
|
15059
|
+
this.emitText({ ...data, error: { message: `Pipeline failed for ${after.id}: ${after.processingError}` } }, () => `Pipeline failed for ${after.id}: ${after.processingError}`);
|
|
15001
15060
|
return 1;
|
|
15002
15061
|
}
|
|
15003
15062
|
this.emitText(
|
|
@@ -15940,7 +15999,7 @@ Commands:
|
|
|
15940
15999
|
ente guide [topic] This help
|
|
15941
16000
|
|
|
15942
16001
|
Run \`ente <command> --help\` for detailed usage on any command.
|
|
15943
|
-
Run \`ente guide <topic>\` for deep dives: entities, tasks, activities, search, patterns, limits`
|
|
16002
|
+
Run \`ente guide <topic>\` for deep dives: entities, tasks, activities, search, retrieval, patterns, limits`
|
|
15944
16003
|
},
|
|
15945
16004
|
entities: {
|
|
15946
16005
|
title: "Entities",
|
|
@@ -16067,6 +16126,26 @@ Archiving (trash):
|
|
|
16067
16126
|
ente activity delete <activity-id> # move to trash (soft delete)
|
|
16068
16127
|
ente activity list --archived # list trashed activities
|
|
16069
16128
|
ente activity restore <activity-id> # restore from trash`
|
|
16129
|
+
},
|
|
16130
|
+
retrieval: {
|
|
16131
|
+
title: "Bounded retrieval",
|
|
16132
|
+
content: `Resolve entities globally first: ente search "Apollo" --json
|
|
16133
|
+
Use an explicit space when the task specifies one:
|
|
16134
|
+
ente query "launch decisions" --space "Work" --entity "Apollo" --since 1791763200000 --until 1792368000000 --limit 8 --json
|
|
16135
|
+
Time filters apply to activity evidence; query uses no model.
|
|
16136
|
+
|
|
16137
|
+
Read one compact entity-history page:
|
|
16138
|
+
ente activity list --entity <id> --after 1791763200000 --min-count 0 --limit 10 --compact --json
|
|
16139
|
+
Continue with --cursor <nextCursor>, keeping the entity and time filters.
|
|
16140
|
+
Compact pages retain spaces/member context, IDs, hasMore and nextCursor.
|
|
16141
|
+
Bodies are excerpts; projection.fullDetail names the complete read.
|
|
16142
|
+
ente activity get <activityId> --json
|
|
16143
|
+
|
|
16144
|
+
Keep spaces, spaceId/spaceIds, scope, warnings and continuation when selecting
|
|
16145
|
+
fields. Access does not authorize copying records into another space.
|
|
16146
|
+
Check command exits before parsing JSON. JSON failures use an error envelope
|
|
16147
|
+
on stdout and a nonzero exit. Use entity get, not entity show.
|
|
16148
|
+
For examples: playbooks/retrieve-bounded-context.md`
|
|
16070
16149
|
},
|
|
16071
16150
|
search: {
|
|
16072
16151
|
title: "Search \u2014 Fuzzy, Multi-Strategy",
|
|
@@ -16159,8 +16238,7 @@ var GuideCmd = class extends BaseCommand {
|
|
|
16159
16238
|
}
|
|
16160
16239
|
const entry = TOPICS[this.topic.toLowerCase()];
|
|
16161
16240
|
if (!entry) {
|
|
16162
|
-
|
|
16163
|
-
return 1;
|
|
16241
|
+
throw new Error(`Unknown topic: '${this.topic}'. Available: ${TOPIC_NAMES.join(", ")}`);
|
|
16164
16242
|
}
|
|
16165
16243
|
this.out(`
|
|
16166
16244
|
${entry.title}
|
|
@@ -17211,7 +17289,7 @@ async function main() {
|
|
|
17211
17289
|
upgradeCommand: ENTE_BRANDING.upgradeCommand
|
|
17212
17290
|
});
|
|
17213
17291
|
}
|
|
17214
|
-
await cli.
|
|
17292
|
+
process.exitCode = await runCli(cli, argv, { stdout: process.stdout, stderr: process.stderr });
|
|
17215
17293
|
}
|
|
17216
17294
|
void main();
|
|
17217
17295
|
/*! Bundled license information:
|