@leemour/max-cli 0.6.0 → 0.8.0
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 +201 -74
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +4 -4
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/schema.d.ts +13 -8
- package/dist/cache/schema.d.ts.map +1 -1
- package/dist/cache/schema.js +84 -23
- package/dist/cache/schema.js.map +1 -1
- package/dist/cache/store.d.ts +15 -0
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +32 -3
- package/dist/cache/store.js.map +1 -1
- package/dist/client.d.ts +205 -9
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +866 -31
- package/dist/client.js.map +1 -1
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +71 -3
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/chats.d.ts.map +1 -1
- package/dist/commands/chats.js +167 -0
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/complete.d.ts +10 -0
- package/dist/commands/complete.d.ts.map +1 -0
- package/dist/commands/complete.js +89 -0
- package/dist/commands/complete.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +10 -4
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contacts.d.ts +3 -0
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +85 -0
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/context.d.ts +22 -3
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +26 -7
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +83 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/folders.d.ts +4 -0
- package/dist/commands/folders.d.ts.map +1 -0
- package/dist/commands/folders.js +76 -0
- package/dist/commands/folders.js.map +1 -0
- package/dist/commands/inbox.js +2 -2
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +24 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +210 -5
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/models.d.ts +7 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +47 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/reactions.d.ts.map +1 -1
- package/dist/commands/reactions.js +17 -0
- package/dist/commands/reactions.js.map +1 -1
- package/dist/commands/serve.d.ts +10 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +98 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +16 -3
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +53 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/watch.d.ts +9 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +64 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config.d.ts +32 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +82 -5
- package/dist/config.js.map +1 -1
- package/dist/domain/map.d.ts +8 -1
- package/dist/domain/map.d.ts.map +1 -1
- package/dist/domain/map.js +47 -1
- package/dist/domain/map.js.map +1 -1
- package/dist/domain/models.d.ts +61 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/models.js.map +1 -1
- package/dist/download.d.ts +2 -0
- package/dist/download.d.ts.map +1 -1
- package/dist/download.js +11 -0
- package/dist/download.js.map +1 -1
- package/dist/export.d.ts +26 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +75 -0
- package/dist/export.js.map +1 -0
- package/dist/generated/client.generated.d.ts +28 -0
- package/dist/generated/client.generated.d.ts.map +1 -1
- package/dist/generated/client.generated.js +28 -0
- package/dist/generated/client.generated.js.map +1 -1
- package/dist/generated/opcodes.generated.d.ts +23 -13
- package/dist/generated/opcodes.generated.d.ts.map +1 -1
- package/dist/generated/opcodes.generated.js +23 -13
- package/dist/generated/opcodes.generated.js.map +1 -1
- package/dist/generated/operations.generated.d.ts +180 -6
- package/dist/generated/operations.generated.d.ts.map +1 -1
- package/dist/generated/operations.generated.js +29 -4
- package/dist/generated/operations.generated.js.map +1 -1
- package/dist/mcp/confirm.d.ts +31 -0
- package/dist/mcp/confirm.d.ts.map +1 -0
- package/dist/mcp/confirm.js +62 -0
- package/dist/mcp/confirm.js.map +1 -0
- package/dist/mcp/instructions.d.ts +14 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +39 -0
- package/dist/mcp/instructions.js.map +1 -0
- package/dist/mcp/server.d.ts +25 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +57 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +28 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +91 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/tools.d.ts +15 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +351 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +23 -2
- package/dist/program.js.map +1 -1
- package/dist/protocol/connection.d.ts +10 -8
- package/dist/protocol/connection.d.ts.map +1 -1
- package/dist/protocol/connection.js +64 -7
- package/dist/protocol/connection.js.map +1 -1
- package/dist/protocol/frame.d.ts +2 -1
- package/dist/protocol/frame.d.ts.map +1 -1
- package/dist/protocol/frame.js.map +1 -1
- package/dist/rendering/messages.d.ts.map +1 -1
- package/dist/rendering/messages.js +17 -9
- package/dist/rendering/messages.js.map +1 -1
- package/dist/sends/guard.d.ts +8 -3
- package/dist/sends/guard.d.ts.map +1 -1
- package/dist/sends/guard.js +40 -15
- package/dist/sends/guard.js.map +1 -1
- package/dist/sends/journal.d.ts +20 -2
- package/dist/sends/journal.d.ts.map +1 -1
- package/dist/sends/journal.js.map +1 -1
- package/dist/sends/permissions.d.ts +11 -0
- package/dist/sends/permissions.d.ts.map +1 -0
- package/dist/sends/permissions.js +47 -0
- package/dist/sends/permissions.js.map +1 -0
- package/dist/server/lines.d.ts +9 -0
- package/dist/server/lines.d.ts.map +1 -0
- package/dist/server/lines.js +25 -0
- package/dist/server/lines.js.map +1 -0
- package/dist/server/server-connection.d.ts +45 -0
- package/dist/server/server-connection.d.ts.map +1 -0
- package/dist/server/server-connection.js +201 -0
- package/dist/server/server-connection.js.map +1 -0
- package/dist/server/server.d.ts +69 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +360 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/start.d.ts +28 -0
- package/dist/server/start.d.ts.map +1 -0
- package/dist/server/start.js +80 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/subscribe.d.ts +9 -0
- package/dist/server/subscribe.d.ts.map +1 -0
- package/dist/server/subscribe.js +26 -0
- package/dist/server/subscribe.js.map +1 -0
- package/dist/session/adopt.d.ts.map +1 -1
- package/dist/session/adopt.js +4 -0
- package/dist/session/adopt.js.map +1 -1
- package/dist/session/browser.d.ts +1 -1
- package/dist/session/browser.d.ts.map +1 -1
- package/dist/session/browser.js +86 -59
- package/dist/session/browser.js.map +1 -1
- package/dist/session/handshake.d.ts +1 -1
- package/dist/session/store.d.ts +2 -0
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +4 -0
- package/dist/session/store.js.map +1 -1
- package/dist/spec/define.d.ts.map +1 -1
- package/dist/spec/define.js +14 -1
- package/dist/spec/define.js.map +1 -1
- package/dist/spec/index.d.ts.map +1 -1
- package/dist/spec/index.js +30 -7
- package/dist/spec/index.js.map +1 -1
- package/dist/spec/operations/account.d.ts +20 -0
- package/dist/spec/operations/account.d.ts.map +1 -0
- package/dist/spec/operations/account.js +62 -0
- package/dist/spec/operations/account.js.map +1 -0
- package/dist/spec/operations/chats.d.ts +66 -2
- package/dist/spec/operations/chats.d.ts.map +1 -1
- package/dist/spec/operations/chats.js +153 -5
- package/dist/spec/operations/chats.js.map +1 -1
- package/dist/spec/operations/contacts.d.ts +19 -1
- package/dist/spec/operations/contacts.d.ts.map +1 -1
- package/dist/spec/operations/contacts.js +49 -6
- package/dist/spec/operations/contacts.js.map +1 -1
- package/dist/spec/operations/folders.d.ts +24 -0
- package/dist/spec/operations/folders.d.ts.map +1 -0
- package/dist/spec/operations/folders.js +64 -0
- package/dist/spec/operations/folders.js.map +1 -0
- package/dist/spec/operations/messages.d.ts +56 -6
- package/dist/spec/operations/messages.d.ts.map +1 -1
- package/dist/spec/operations/messages.js +104 -21
- package/dist/spec/operations/messages.js.map +1 -1
- package/dist/spec/operations/session.d.ts +7 -0
- package/dist/spec/operations/session.d.ts.map +1 -1
- package/dist/spec/operations/session.js +17 -0
- package/dist/spec/operations/session.js.map +1 -1
- package/dist/spec/operations/uploads.d.ts +18 -0
- package/dist/spec/operations/uploads.d.ts.map +1 -0
- package/dist/spec/operations/uploads.js +35 -0
- package/dist/spec/operations/uploads.js.map +1 -0
- package/dist/testing/mock-max.d.ts +12 -2
- package/dist/testing/mock-max.d.ts.map +1 -1
- package/dist/testing/mock-max.js +15 -2
- package/dist/testing/mock-max.js.map +1 -1
- package/dist/testing/sandbox.js +2 -0
- package/dist/testing/sandbox.js.map +1 -1
- package/dist/transcribe/index.d.ts +34 -0
- package/dist/transcribe/index.d.ts.map +1 -0
- package/dist/transcribe/index.js +43 -0
- package/dist/transcribe/index.js.map +1 -0
- package/dist/transcribe/install.d.ts +18 -0
- package/dist/transcribe/install.d.ts.map +1 -0
- package/dist/transcribe/install.js +67 -0
- package/dist/transcribe/install.js.map +1 -0
- package/dist/transcribe/models.d.ts +32 -0
- package/dist/transcribe/models.d.ts.map +1 -0
- package/dist/transcribe/models.js +124 -0
- package/dist/transcribe/models.js.map +1 -0
- package/dist/transcribe/speech.d.ts +25 -0
- package/dist/transcribe/speech.d.ts.map +1 -0
- package/dist/transcribe/speech.js +105 -0
- package/dist/transcribe/speech.js.map +1 -0
- package/dist/update.d.ts +26 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +42 -0
- package/dist/update.js.map +1 -0
- package/dist/upload.d.ts +10 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +61 -0
- package/dist/upload.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +17 -3
- package/skills/max-cli/SKILL.md +28 -3
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { script } from "@bomb.sh/tab";
|
|
3
|
+
import { CliError, visibleControls } from "@leemour/cli-core";
|
|
4
|
+
import { describeOptions, describeProgram } from "@leemour/cli-core/commands";
|
|
5
|
+
import { formatSuggestions, suggest } from "@leemour/cli-core/completion";
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import { openProfileCache, profileCacheFile } from "../cache/index.js";
|
|
8
|
+
import { configuredProfiles } from "../config.js";
|
|
9
|
+
import { commandWords, DEFAULT_PROFILE, liftProfile, rootOf } from "../profile.js";
|
|
10
|
+
import { outputFor } from "./context.js";
|
|
11
|
+
const SHELLS = ["zsh", "bash", "fish", "powershell"];
|
|
12
|
+
/**
|
|
13
|
+
* `max complete zsh` prints the script a shell sources; the script then runs
|
|
14
|
+
* `max complete -- <words>` on every Tab, and this answers from the command registry.
|
|
15
|
+
*
|
|
16
|
+
* ⚠ **A Tab never reaches MAX and never writes anything.** Names come from the local cache if it
|
|
17
|
+
* exists — no cache, no names — and nothing goes to stderr: a shell shows whatever it is given.
|
|
18
|
+
*/
|
|
19
|
+
export const completeCommand = () => new Command("complete")
|
|
20
|
+
.description("shell completion: `max complete zsh` prints the script to source")
|
|
21
|
+
.argument("[words...]")
|
|
22
|
+
.allowUnknownOption()
|
|
23
|
+
.helpOption(false)
|
|
24
|
+
.action(async function (words) {
|
|
25
|
+
const root = rootOf(this);
|
|
26
|
+
const { streams } = outputFor(this);
|
|
27
|
+
// Commander drops the `--` from the operands, so only the raw words tell a request from a shell name.
|
|
28
|
+
const raw = root.rawArgs;
|
|
29
|
+
if (!raw.includes("--")) {
|
|
30
|
+
const [shell] = words;
|
|
31
|
+
if (!shell || !SHELLS.includes(shell)) {
|
|
32
|
+
throw new CliError("validation_error", `name a shell: max complete ${SHELLS.join(" | ")}`);
|
|
33
|
+
}
|
|
34
|
+
// tab writes the script through console.log; stdout is where a `source <(…)` reads it.
|
|
35
|
+
script(shell, "max", "max");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// The last word is still being typed, so it is never taken for a profile: `mess` is on its way to `messages`.
|
|
39
|
+
const { profile, rest } = words.length > 1 ? liftProfile(words, commandWords(root)) : { profile: undefined, rest: words };
|
|
40
|
+
const cache = await readableCache(profile ?? process.env.MAX_PROFILE ?? DEFAULT_PROFILE);
|
|
41
|
+
try {
|
|
42
|
+
const suggestions = suggest({
|
|
43
|
+
commands: describeProgram(root),
|
|
44
|
+
globalOptions: describeOptions(root),
|
|
45
|
+
words: rest.length > 0 ? rest : [""],
|
|
46
|
+
sources: sourcesFrom(cache, profile === undefined),
|
|
47
|
+
});
|
|
48
|
+
streams.data(formatSuggestions(suggestions));
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
cache?.close();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
const readableCache = async (profile) => existsSync(profileCacheFile(profile)) ? openProfileCache(profile) : undefined;
|
|
55
|
+
const sourcesFrom = (cache, atTheStart) => {
|
|
56
|
+
const chats = () => (cache ? chatSuggestions(cache) : []);
|
|
57
|
+
return {
|
|
58
|
+
arguments: { chat: chats, person: () => (cache ? personSuggestions(cache) : []) },
|
|
59
|
+
options: { chat: chats },
|
|
60
|
+
...(atTheStart ? { firstWord: profileNames } : {}),
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
/** Ids, with the title beside them: a title with a space in it would reach `max` as two words. */
|
|
64
|
+
const chatSuggestions = (cache) => cache.chats.page({ limit: 500, offset: 0 }).flatMap((chat) => {
|
|
65
|
+
const title = chat.title ?? "";
|
|
66
|
+
const shown = visibleControls(title);
|
|
67
|
+
// Offered as a word only when it is one, and only when nothing in it had to be made visible.
|
|
68
|
+
return [
|
|
69
|
+
{ value: chat.id, description: shown },
|
|
70
|
+
...(/^\S+$/.test(title) && shown === title ? [{ value: title, description: chat.id }] : []),
|
|
71
|
+
];
|
|
72
|
+
});
|
|
73
|
+
const personSuggestions = (cache) => cache.people.page({ order: "name", limit: 500, offset: 0 }).flatMap((person) => {
|
|
74
|
+
const name = visibleControls(person.name ?? "");
|
|
75
|
+
const username = person.username && visibleControls(person.username) === person.username ? person.username : null;
|
|
76
|
+
return [
|
|
77
|
+
{ value: person.id, description: name },
|
|
78
|
+
...(username ? [{ value: `@${username}`, description: name }] : []),
|
|
79
|
+
];
|
|
80
|
+
});
|
|
81
|
+
const profileNames = () => {
|
|
82
|
+
try {
|
|
83
|
+
return configuredProfiles();
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=complete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC7E,OAAO,EAA0B,iBAAiB,EAAmB,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAClH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAmB,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;AAEpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAY,EAAE,CAC3C,IAAI,OAAO,CAAC,UAAU,CAAC;KACpB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,QAAQ,CAAC,YAAY,CAAC;KACtB,kBAAkB,EAAE;KACpB,UAAU,CAAC,KAAK,CAAC;KACjB,MAAM,CAAC,KAAK,WAA0B,KAAe;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IACzB,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAEnC,sGAAsG;IACtG,MAAM,GAAG,GAAI,IAAwC,CAAC,OAAO,CAAA;IAC7D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;QACrB,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,8BAA8B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC5F,CAAC;QACD,uFAAuF;QACvF,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QAC3B,OAAM;IACR,CAAC;IAED,8GAA8G;IAC9G,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GACrB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACjG,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,eAAe,CAAC,CAAA;IACxF,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC;YAC1B,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;YAC/B,aAAa,EAAE,eAAe,CAAC,IAAI,CAAC;YACpC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC;SACnD,CAAC,CAAA;QACF,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAA;IAC9C,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,KAAK,EAAE,CAAA;IAChB,CAAC;AACH,CAAC,CAAC,CAAA;AAEN,MAAM,aAAa,GAAG,KAAK,EAAE,OAAe,EAAmC,EAAE,CAC/E,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAE/E,MAAM,WAAW,GAAG,CAAC,KAA6B,EAAE,UAAmB,EAAqB,EAAE;IAC5F,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACzD,OAAO;QACL,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QACjF,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACxB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAA;AACH,CAAC,CAAA;AAED,kGAAkG;AAClG,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAgB,EAAE,CAC1D,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACpC,6FAA6F;IAC7F,OAAO;QACL,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE;QACtC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5F,CAAA;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,iBAAiB,GAAG,CAAC,KAAiB,EAAgB,EAAE,CAC5D,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;IAC7E,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA;IACjH,OAAO;QACL,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;QACvC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAA;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,YAAY,GAAG,GAAa,EAAE;IAClC,IAAI,CAAC;QACH,OAAO,kBAAkB,EAAE,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmBnC,eAAO,MAAM,aAAa,QAAO,OAmEhC,CAAA"}
|
package/dist/commands/config.js
CHANGED
|
@@ -2,7 +2,7 @@ import { existsSync, readdirSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { pathsAreOverridden, resolvePaths } from "@leemour/cli-core";
|
|
4
4
|
import { Command } from "commander";
|
|
5
|
-
import {
|
|
5
|
+
import { ALL_SETTINGS, changeSetting } from "../config.js";
|
|
6
6
|
import { forCommand } from "./context.js";
|
|
7
7
|
const SHOWN = [
|
|
8
8
|
"limit",
|
|
@@ -11,9 +11,12 @@ const SHOWN = [
|
|
|
11
11
|
"color",
|
|
12
12
|
"senderColors",
|
|
13
13
|
"record",
|
|
14
|
+
"serve",
|
|
14
15
|
"keepRunsForDays",
|
|
15
16
|
"readOnly",
|
|
17
|
+
"allow",
|
|
16
18
|
"sendsPerHour",
|
|
19
|
+
"updateCheck",
|
|
17
20
|
];
|
|
18
21
|
export const configCommand = () => {
|
|
19
22
|
const command = new Command("config").description("the settings in force, and where each one came from");
|
|
@@ -36,7 +39,8 @@ export const configCommand = () => {
|
|
|
36
39
|
pathsOverridden: overridden,
|
|
37
40
|
settings: SHOWN.map((setting) => ({
|
|
38
41
|
setting,
|
|
39
|
-
|
|
42
|
+
// No list is every action, and `null` would read as none.
|
|
43
|
+
value: setting === "allow" ? (settings.allow ?? "all") : (settings[setting] ?? null),
|
|
40
44
|
from: settings.sources[setting],
|
|
41
45
|
})),
|
|
42
46
|
});
|
|
@@ -48,10 +52,12 @@ export const configCommand = () => {
|
|
|
48
52
|
for (const action of ["set", "unset"]) {
|
|
49
53
|
const sub = command
|
|
50
54
|
.command(action)
|
|
51
|
-
.argument("<setting>", `one of: ${
|
|
55
|
+
.argument("<setting>", `one of: ${ALL_SETTINGS.join(", ")}`)
|
|
52
56
|
.option("--defaults", "change what every profile gets, rather than this profile");
|
|
53
57
|
if (action === "set")
|
|
54
|
-
sub
|
|
58
|
+
sub
|
|
59
|
+
.argument("<value>", "a number, true or false, or for allow a list like send,reaction")
|
|
60
|
+
.description("save a setting to the configuration file");
|
|
55
61
|
else
|
|
56
62
|
sub.description("remove a setting from the configuration file");
|
|
57
63
|
sub.action(function (setting, given) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
+
import { type PhoneBookEntry } from "../client.js";
|
|
2
3
|
/**
|
|
3
4
|
* The people this account has a one-to-one chat with.
|
|
4
5
|
*
|
|
@@ -7,4 +8,6 @@ import { Command } from "commander";
|
|
|
7
8
|
* lists what we can establish without guessing.
|
|
8
9
|
*/
|
|
9
10
|
export declare const contactsCommand: () => Command;
|
|
11
|
+
/** ⚠ A bad line is named by its number, never by what is on it. */
|
|
12
|
+
export declare const phoneBook: (text: string) => PhoneBookEntry[];
|
|
10
13
|
//# sourceMappingURL=contacts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAE,KAAK,cAAc,EAAa,MAAM,cAAc,CAAA;AAI7D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAAO,OA8JlC,CAAA;AAED,mEAAmE;AACnE,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,cAAc,EAenD,CAAA"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
1
2
|
import { CliError } from "@leemour/cli-core";
|
|
3
|
+
import { annotate } from "@leemour/cli-core/commands";
|
|
2
4
|
import { Command } from "commander";
|
|
3
5
|
import { openProfileCache } from "../cache/index.js";
|
|
6
|
+
import { wirePhone } from "../client.js";
|
|
4
7
|
import { forCommand } from "./context.js";
|
|
5
8
|
import { renderPage, window, withPaging } from "./paging.js";
|
|
6
9
|
/**
|
|
@@ -81,8 +84,90 @@ export const contactsCommand = () => {
|
|
|
81
84
|
}
|
|
82
85
|
});
|
|
83
86
|
});
|
|
87
|
+
/**
|
|
88
|
+
* ⚠ **The number is asked for, never an argument**: argv is read by `ps` and kept by shell
|
|
89
|
+
* history, and a phone number is what the sixth constraint names.
|
|
90
|
+
*/
|
|
91
|
+
command
|
|
92
|
+
.command("lookup")
|
|
93
|
+
.description("who MAX has under a phone number — asks for it, or reads it from stdin")
|
|
94
|
+
.action(async function () {
|
|
95
|
+
const { renderer, settings, createClient, run, ask } = forCommand(this);
|
|
96
|
+
const phone = await ask("phone number: ");
|
|
97
|
+
const cache = await openProfileCache(settings.profile, { onProblem: (message) => renderer.note(message) });
|
|
98
|
+
await run("contacts lookup", async (events) => {
|
|
99
|
+
const client = createClient({ events, ...(cache ? { cache } : {}) });
|
|
100
|
+
try {
|
|
101
|
+
renderer.result(await client.contacts.lookup(phone));
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
await client.close();
|
|
105
|
+
cache?.close();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
for (const [name, description] of [
|
|
110
|
+
["add", "add a person to your contacts — `contacts list` still shows only people you have a dialog with"],
|
|
111
|
+
["remove", "remove a person from your contacts; the chat stays, a name you gave them may not"],
|
|
112
|
+
]) {
|
|
113
|
+
annotate(command.command(name), { mutates: true })
|
|
114
|
+
.argument("<person>", "person id — `contacts lookup` finds one — or part of a known name")
|
|
115
|
+
.description(description)
|
|
116
|
+
.action(async function (person) {
|
|
117
|
+
const { renderer, settings, createClient, run } = forCommand(this);
|
|
118
|
+
const cache = await openProfileCache(settings.profile, { onProblem: (message) => renderer.note(message) });
|
|
119
|
+
await run(`contacts ${name}`, async (events) => {
|
|
120
|
+
const client = createClient({ events, ...(cache ? { cache } : {}) });
|
|
121
|
+
try {
|
|
122
|
+
renderer.result(await client.contacts[name](person));
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
await client.close();
|
|
126
|
+
cache?.close();
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/** A file rather than lines on argv, for the same reason `lookup` asks: these are phone numbers. */
|
|
132
|
+
annotate(command.command("import"), { mutates: true })
|
|
133
|
+
.argument("<file>", "one person per line: number, then a comma or a tab, then the name")
|
|
134
|
+
.description("upload phone numbers to MAX and add the people it has under them")
|
|
135
|
+
.action(async function (file) {
|
|
136
|
+
const { renderer, settings, createClient, run } = forCommand(this);
|
|
137
|
+
const entries = phoneBook(await readFile(file, "utf8").catch((error) => {
|
|
138
|
+
throw new CliError("not_found", `cannot read ${file}: ${error.code ?? error.message}`);
|
|
139
|
+
}));
|
|
140
|
+
const cache = await openProfileCache(settings.profile, { onProblem: (message) => renderer.note(message) });
|
|
141
|
+
await run("contacts import", async (events) => {
|
|
142
|
+
const client = createClient({ events, ...(cache ? { cache } : {}) });
|
|
143
|
+
try {
|
|
144
|
+
const imported = await client.contacts.import(entries);
|
|
145
|
+
renderer.result(imported);
|
|
146
|
+
renderer.success(`${imported.sent} sent, ${imported.recognised.length} recognised by MAX`);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
await client.close();
|
|
150
|
+
cache?.close();
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
});
|
|
84
154
|
return command;
|
|
85
155
|
};
|
|
156
|
+
/** ⚠ A bad line is named by its number, never by what is on it. */
|
|
157
|
+
export const phoneBook = (text) => text.split(/\r?\n/).flatMap((line, index) => {
|
|
158
|
+
if (line.trim() === "")
|
|
159
|
+
return [];
|
|
160
|
+
const match = /^\s*([^,\t;]+?)\s*[,\t;]\s*(.*\S)\s*$/.exec(line);
|
|
161
|
+
if (!match?.[1] || !match[2]) {
|
|
162
|
+
throw new CliError("validation_error", `line ${index + 1} is not "number, name"`);
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
return [{ phone: wirePhone(match[1]), name: match[2] }];
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
throw new CliError("validation_error", `line ${index + 1}: ${error instanceof Error ? error.message : String(error)}`);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
86
171
|
/**
|
|
87
172
|
* ⚠ **A flag and no configuration field**, deliberately. `--order` and a `contactOrder` setting
|
|
88
173
|
* would be two spellings of one thing, which is what `--profile` was deleted for.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { Renderer, RenderFormat, Streams } from "@leemour/cli-core";
|
|
2
2
|
import type { Command } from "commander";
|
|
3
3
|
import { MaxClient, type MaxClientOptions } from "../client.js";
|
|
4
|
-
import { type Settings } from "../config.js";
|
|
4
|
+
import { type GlobalFlags, type Settings } from "../config.js";
|
|
5
5
|
import { type Closeable } from "../deadline.js";
|
|
6
6
|
import { type BrowserDoors } from "../session/browser.js";
|
|
7
7
|
import { SessionStore } from "../session/store.js";
|
|
8
|
+
import type { UpdateEnvironment } from "../update.js";
|
|
8
9
|
/**
|
|
9
10
|
* What a command writes to and talks through, when it is not the real terminal, keyring and MAX.
|
|
10
11
|
* `run` sets it on the program; without it everything is the real thing.
|
|
@@ -20,12 +21,14 @@ export interface Environment {
|
|
|
20
21
|
ask?: Ask;
|
|
21
22
|
interactive?: boolean;
|
|
22
23
|
columns?: number;
|
|
24
|
+
update?: UpdateEnvironment;
|
|
23
25
|
}
|
|
24
26
|
/** One line from the person at the terminal; `secret` keeps it off the screen. */
|
|
25
27
|
export type Ask = (prompt: string, options?: {
|
|
26
28
|
secret?: boolean;
|
|
27
29
|
}) => Promise<string>;
|
|
28
30
|
export declare const provide: (program: Command, environment: Environment) => void;
|
|
31
|
+
export declare const environmentOf: (command: Command) => Environment;
|
|
29
32
|
/** For the commands that print but never need settings or a client. */
|
|
30
33
|
export declare const outputFor: (command: Command) => {
|
|
31
34
|
format: "json" | "jsonl" | "pretty";
|
|
@@ -41,8 +44,20 @@ export interface CommandContext {
|
|
|
41
44
|
color: boolean;
|
|
42
45
|
streams: Streams;
|
|
43
46
|
store: SessionStore;
|
|
44
|
-
/**
|
|
45
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Not connected yet: the action owns the `finally` that closes it — and the cache, if it opened one.
|
|
49
|
+
* It goes through the profile's one `max serve`; `own` is for logging in, which cannot.
|
|
50
|
+
*/
|
|
51
|
+
createClient: (extra?: Partial<Omit<MaxClientOptions, "store">>, options?: {
|
|
52
|
+
own?: boolean;
|
|
53
|
+
}) => MaxClient;
|
|
54
|
+
/**
|
|
55
|
+
* Starts the profile's server if none is running and waits for it; `false` when it did not come
|
|
56
|
+
* up, or when this is not the place to start one (`serve: false`, a test).
|
|
57
|
+
*/
|
|
58
|
+
shareServer: () => Promise<boolean>;
|
|
59
|
+
/** Stops the profile's server however it was started — `max session start` replaces its session. */
|
|
60
|
+
stopServer: () => Promise<"stopped" | "refused" | "none">;
|
|
46
61
|
/**
|
|
47
62
|
* Runs the body with diagnostics on and the run finalized on every path, if anything asked for
|
|
48
63
|
* either. The body gets the emitter to hand to `createClient`.
|
|
@@ -73,4 +88,8 @@ export interface CommandContext {
|
|
|
73
88
|
* would create a database file for `session end`, which will never read it.
|
|
74
89
|
*/
|
|
75
90
|
export declare const forCommand: (command: Command) => CommandContext;
|
|
91
|
+
/** The same context from flags already parsed — for `max mcp`, whose calls arrive without argv. */
|
|
92
|
+
export declare const contextFor: (flags: GlobalFlags & {
|
|
93
|
+
offline?: boolean;
|
|
94
|
+
}, environment?: Environment) => CommandContext;
|
|
76
95
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/context.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
1
2
|
import { MaxClient } from "../client.js";
|
|
2
3
|
import { resolveSettings } from "../config.js";
|
|
3
4
|
import { withDeadline } from "../deadline.js";
|
|
@@ -7,6 +8,8 @@ import { recorded } from "../runs/recording.js";
|
|
|
7
8
|
import { sendGuard } from "../sends/guard.js";
|
|
8
9
|
import { SendJournal, sendsPathFor } from "../sends/journal.js";
|
|
9
10
|
import { RecipientList, recipientsPathFor } from "../sends/recipients.js";
|
|
11
|
+
import { ServerConnection, stopServer } from "../server/server-connection.js";
|
|
12
|
+
import { ensureServer } from "../server/start.js";
|
|
10
13
|
import { realBrowser } from "../session/browser.js";
|
|
11
14
|
import { readSecret } from "../session/prompt.js";
|
|
12
15
|
import { SessionStore } from "../session/store.js";
|
|
@@ -14,7 +17,7 @@ const environments = new WeakMap();
|
|
|
14
17
|
export const provide = (program, environment) => {
|
|
15
18
|
environments.set(program, environment);
|
|
16
19
|
};
|
|
17
|
-
const environmentOf = (command) => environments.get(rootOf(command)) ?? {};
|
|
20
|
+
export const environmentOf = (command) => environments.get(rootOf(command)) ?? {};
|
|
18
21
|
/** For the commands that print but never need settings or a client. */
|
|
19
22
|
export const outputFor = (command) => {
|
|
20
23
|
const { streams, tty } = environmentOf(command);
|
|
@@ -39,9 +42,10 @@ export const outputFor = (command) => {
|
|
|
39
42
|
* The cache is not opened here on purpose — only the reading commands want one, and opening it
|
|
40
43
|
* would create a database file for `session end`, which will never read it.
|
|
41
44
|
*/
|
|
42
|
-
export const forCommand = (command) =>
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
export const forCommand = (command) => contextFor(command.optsWithGlobals(), environmentOf(command));
|
|
46
|
+
/** The same context from flags already parsed — for `max mcp`, whose calls arrive without argv. */
|
|
47
|
+
export const contextFor = (flags, environment = {}) => {
|
|
48
|
+
const settings = resolveSettings(flags);
|
|
45
49
|
const { renderer, format, color, streams } = resolveOutput({
|
|
46
50
|
...settings,
|
|
47
51
|
...(environment.streams ? { streams: environment.streams } : {}),
|
|
@@ -51,6 +55,8 @@ export const forCommand = (command) => {
|
|
|
51
55
|
// Every client this command builds, so the deadline can shut them. There is always one; relying
|
|
52
56
|
// on that is what makes the second one, some day, the leak that keeps the process alive.
|
|
53
57
|
const clients = [];
|
|
58
|
+
// Only for the real thing: a test hands in its own store, and must never start a process.
|
|
59
|
+
const starts = !environment.store && !environment.connection && settings.serve;
|
|
54
60
|
return {
|
|
55
61
|
settings,
|
|
56
62
|
renderer,
|
|
@@ -58,22 +64,35 @@ export const forCommand = (command) => {
|
|
|
58
64
|
color,
|
|
59
65
|
streams,
|
|
60
66
|
store,
|
|
61
|
-
|
|
67
|
+
shareServer: async () => starts && ensureServer(store),
|
|
68
|
+
stopServer: () => stopServer(store.socketPath(), { force: true }),
|
|
69
|
+
createClient: (extra = {}, { own = false } = {}) => {
|
|
70
|
+
const timeout = settings.timeoutMs ? { timeoutMs: settings.timeoutMs } : {};
|
|
71
|
+
const shares = starts && flags.offline !== true;
|
|
72
|
+
const wire = !own && (shares || existsSync(store.socketPath()))
|
|
73
|
+
? new ServerConnection({
|
|
74
|
+
path: store.socketPath(),
|
|
75
|
+
store,
|
|
76
|
+
...timeout,
|
|
77
|
+
...(shares ? { ensure: () => ensureServer(store) } : {}),
|
|
78
|
+
})
|
|
79
|
+
: undefined;
|
|
62
80
|
const client = new MaxClient({
|
|
63
81
|
store,
|
|
64
82
|
timeoutMs: settings.timeoutMs,
|
|
65
83
|
warn: renderer.note,
|
|
66
|
-
offline:
|
|
84
|
+
offline: flags.offline === true,
|
|
67
85
|
sends: sendGuard({
|
|
68
86
|
profile: settings.profile,
|
|
69
87
|
readOnly: settings.readOnly,
|
|
70
88
|
readOnlyFrom: settings.sources.readOnly,
|
|
89
|
+
...(settings.allow ? { allow: settings.allow, allowFrom: settings.sources.allow } : {}),
|
|
71
90
|
sendsPerHour: settings.sendsPerHour,
|
|
72
91
|
journal: new SendJournal(sendsPathFor(settings.profile)),
|
|
73
92
|
recipients: new RecipientList(recipientsPathFor(settings.profile)),
|
|
74
93
|
warn: renderer.warn,
|
|
75
94
|
}),
|
|
76
|
-
...(environment.connection ? { connection: environment.connection() } : {}),
|
|
95
|
+
...(environment.connection ? { connection: environment.connection() } : wire ? { connection: wire } : {}),
|
|
77
96
|
...extra,
|
|
78
97
|
});
|
|
79
98
|
clients.push(client);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AAO3C,eAAO,MAAM,aAAa,QAAO,OA8EhC,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { CliError, writeSecurely } from "@leemour/cli-core";
|
|
3
|
+
import { Command, Option } from "commander";
|
|
4
|
+
import { openProfileCache } from "../cache/index.js";
|
|
5
|
+
import { toMarkdown, unreadStretches } from "../export.js";
|
|
6
|
+
import { forCommand } from "./context.js";
|
|
7
|
+
const SHOWN_STRETCHES = 5;
|
|
8
|
+
export const exportCommand = () => {
|
|
9
|
+
const command = new Command("export").description("write what this machine holds to a file; never connects");
|
|
10
|
+
/**
|
|
11
|
+
* **Reads the local copy and nothing else**, so an export can never turn into traffic to MAX.
|
|
12
|
+
* What it cannot hold is said on stderr, stretch by stretch: a file that silently starts in the
|
|
13
|
+
* middle of a conversation reads as the whole of it.
|
|
14
|
+
*
|
|
15
|
+
* ⚠ The file carries photo links that open without a login (`docs/architecture/messages.md`), so
|
|
16
|
+
* `--output` writes it readable by the owner only, as the cache is.
|
|
17
|
+
*/
|
|
18
|
+
command
|
|
19
|
+
.command("messages")
|
|
20
|
+
.argument("<chat>", "chat id, or part of a chat name this machine has listed")
|
|
21
|
+
.description("a chat's messages from the local copy, oldest first, as JSON lines or Markdown")
|
|
22
|
+
.addOption(new Option("--format <format>", "jsonl or md").choices(["jsonl", "md"]).makeOptionMandatory())
|
|
23
|
+
.option("--since <id-or-time>", "only from this message id or ISO 8601 time on")
|
|
24
|
+
.option("--output <file>", "write to this file, readable only by you, instead of stdout")
|
|
25
|
+
.action(async function (chat) {
|
|
26
|
+
const options = this.opts();
|
|
27
|
+
const { renderer, settings, streams, createClient, run } = forCommand(this);
|
|
28
|
+
const cache = await openProfileCache(settings.profile);
|
|
29
|
+
if (!cache)
|
|
30
|
+
throw new CliError("not_found", "the local copy could not be opened, and export reads nothing else");
|
|
31
|
+
await run("export messages", async (events) => {
|
|
32
|
+
const client = createClient({ events, cache, offline: true });
|
|
33
|
+
try {
|
|
34
|
+
const chatId = await client.chats.resolve(chat);
|
|
35
|
+
const since = options.since === undefined ? undefined : client.messages.moment(options.since, "--since");
|
|
36
|
+
const messages = cache.messages.all(chatId, since);
|
|
37
|
+
const oldest = messages[0];
|
|
38
|
+
const newest = messages.at(-1);
|
|
39
|
+
if (!oldest || !newest) {
|
|
40
|
+
throw new CliError("not_found", `this machine holds no messages of chat ${chatId}${since === undefined ? "" : " from then on"} — ` +
|
|
41
|
+
`\`max messages list ${chatId}\` reads some`);
|
|
42
|
+
}
|
|
43
|
+
const known = cache.chats.read(Number.POSITIVE_INFINITY)?.find((one) => one.id === chatId);
|
|
44
|
+
const last = known?.lastMessageAt ? Date.parse(known.lastMessageAt) : undefined;
|
|
45
|
+
const unread = unreadStretches(cache.messages.ranges(chatId), { since, last });
|
|
46
|
+
const body = options.format === "md"
|
|
47
|
+
? toMarkdown(known?.title ?? `chat ${chatId}`, messages)
|
|
48
|
+
: `${messages.map((message) => JSON.stringify(message)).join("\n")}\n`;
|
|
49
|
+
for (const stretch of unread.slice(0, SHOWN_STRETCHES))
|
|
50
|
+
renderer.note(describe(stretch));
|
|
51
|
+
if (unread.length > SHOWN_STRETCHES)
|
|
52
|
+
renderer.note(`and ${unread.length - SHOWN_STRETCHES} more stretches`);
|
|
53
|
+
if (unread[0]?.to === oldest.timestamp) {
|
|
54
|
+
renderer.note(`\`max messages list ${chatId} --before ${oldest.id}\` reads further back`);
|
|
55
|
+
}
|
|
56
|
+
if (options.output === undefined) {
|
|
57
|
+
streams.data(body.slice(0, -1));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const path = resolve(options.output);
|
|
61
|
+
writeSecurely(path, body, 0o600);
|
|
62
|
+
renderer.result({
|
|
63
|
+
chatId,
|
|
64
|
+
format: options.format,
|
|
65
|
+
path,
|
|
66
|
+
count: messages.length,
|
|
67
|
+
oldest: oldest.timestamp,
|
|
68
|
+
newest: newest.timestamp,
|
|
69
|
+
unread,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await client.close();
|
|
74
|
+
cache.close();
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
return command;
|
|
79
|
+
};
|
|
80
|
+
const describe = ({ from, to }) => from === null
|
|
81
|
+
? `not in the export: anything before ${to}, never read`
|
|
82
|
+
: `not in the export: ${from} to ${to}, never read`;
|
|
83
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../src/commands/folders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,mGAAmG;AACnG,eAAO,MAAM,cAAc,QAAO,OA8EjC,CAAA"}
|