@leemour/max-cli 0.3.0 → 0.5.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 +7 -0
- package/dist/bin/max.js +0 -0
- package/dist/cache/store.d.ts +18 -15
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +47 -8
- package/dist/cache/store.js.map +1 -1
- package/dist/client.d.ts +53 -10
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +252 -59
- package/dist/client.js.map +1 -1
- package/dist/commands/account.js +1 -1
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/body.d.ts +23 -0
- package/dist/commands/body.d.ts.map +1 -0
- package/dist/commands/body.js +36 -0
- package/dist/commands/body.js.map +1 -0
- package/dist/commands/cache.js +2 -2
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/chats.d.ts.map +1 -1
- package/dist/commands/chats.js +21 -1
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +82 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +20 -2
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/context.d.ts +23 -2
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +43 -7
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/doctor.d.ts +18 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +72 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +114 -7
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/runs.d.ts.map +1 -1
- package/dist/commands/runs.js +4 -6
- package/dist/commands/runs.js.map +1 -1
- package/dist/commands/session.js +2 -2
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +23 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/config.d.ts +80 -11
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +177 -21
- package/dist/config.js.map +1 -1
- package/dist/deadline.d.ts +30 -0
- package/dist/deadline.d.ts.map +1 -0
- package/dist/deadline.js +45 -0
- package/dist/deadline.js.map +1 -0
- package/dist/diagnose.d.ts +68 -0
- package/dist/diagnose.d.ts.map +1 -0
- package/dist/diagnose.js +115 -0
- package/dist/diagnose.js.map +1 -0
- package/dist/domain/map.js +6 -1
- package/dist/domain/map.js.map +1 -1
- package/dist/domain/models.d.ts +32 -1
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/models.js +11 -1
- package/dist/domain/models.js.map +1 -1
- package/dist/download.d.ts +15 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +60 -0
- package/dist/download.js.map +1 -0
- package/dist/generated/client.generated.d.ts +4 -0
- package/dist/generated/client.generated.d.ts.map +1 -1
- package/dist/generated/client.generated.js +4 -0
- package/dist/generated/client.generated.js.map +1 -1
- package/dist/generated/opcodes.generated.d.ts +2 -0
- package/dist/generated/opcodes.generated.d.ts.map +1 -1
- package/dist/generated/opcodes.generated.js +2 -0
- package/dist/generated/opcodes.generated.js.map +1 -1
- package/dist/generated/operations.generated.d.ts +13 -0
- package/dist/generated/operations.generated.d.ts.map +1 -1
- package/dist/generated/operations.generated.js +3 -0
- package/dist/generated/operations.generated.js.map +1 -1
- package/dist/program.d.ts +2 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +11 -0
- package/dist/program.js.map +1 -1
- package/dist/protocol/connection.d.ts.map +1 -1
- package/dist/protocol/connection.js +9 -0
- package/dist/protocol/connection.js.map +1 -1
- package/dist/rendering/messages.d.ts +3 -3
- package/dist/rendering/messages.d.ts.map +1 -1
- package/dist/rendering/messages.js +2 -1
- package/dist/rendering/messages.js.map +1 -1
- package/dist/runs/recording.d.ts.map +1 -1
- package/dist/runs/recording.js +7 -0
- package/dist/runs/recording.js.map +1 -1
- package/dist/runs/run.d.ts +2 -0
- package/dist/runs/run.d.ts.map +1 -1
- package/dist/runs/run.js +1 -0
- package/dist/runs/run.js.map +1 -1
- package/dist/session/handshake.d.ts +1 -1
- package/dist/spec/index.d.ts.map +1 -1
- package/dist/spec/index.js +3 -0
- package/dist/spec/index.js.map +1 -1
- package/dist/spec/operations/attachments.d.ts +15 -0
- package/dist/spec/operations/attachments.d.ts.map +1 -0
- package/dist/spec/operations/attachments.js +38 -0
- package/dist/spec/operations/attachments.js.map +1 -0
- package/dist/testing/mock-max.d.ts +8 -3
- package/dist/testing/mock-max.d.ts.map +1 -1
- package/dist/testing/mock-max.js +20 -2
- package/dist/testing/mock-max.js.map +1 -1
- package/dist/testing/sandbox.js +10 -1
- package/dist/testing/sandbox.js.map +1 -1
- package/dist/testing/unscripted.d.ts +2 -0
- package/dist/testing/unscripted.d.ts.map +1 -0
- package/dist/testing/unscripted.js +18 -0
- package/dist/testing/unscripted.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +28 -22
- package/skills/max-cli/SKILL.md +91 -0
- package/dist/commands/login.d.ts +0 -15
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js +0 -43
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.d.ts +0 -10
- package/dist/commands/logout.d.ts.map +0 -1
- package/dist/commands/logout.js +0 -22
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/me.d.ts +0 -3
- package/dist/commands/me.d.ts.map +0 -1
- package/dist/commands/me.js +0 -18
- package/dist/commands/me.js.map +0 -1
- package/dist/commands/send.d.ts +0 -10
- package/dist/commands/send.d.ts.map +0 -1
- package/dist/commands/send.js +0 -30
- package/dist/commands/send.js.map +0 -1
- package/dist/protocol/session.d.ts +0 -54
- package/dist/protocol/session.d.ts.map +0 -1
- package/dist/protocol/session.js +0 -57
- package/dist/protocol/session.js.map +0 -1
- package/dist/spec/operations/auth.d.ts +0 -42
- package/dist/spec/operations/auth.d.ts.map +0 -1
package/dist/config.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { CliError, configFilePath, loadConfigFile, resolvePaths, saveConfigFile } from "@leemour/cli-core";
|
|
2
3
|
import * as v from "valibot";
|
|
3
4
|
import { DEFAULT_PROFILE, usableProfileName } from "./profile.js";
|
|
4
5
|
const APP = "max-cli";
|
|
5
6
|
const DEFAULT_LIMIT = 20;
|
|
6
7
|
const DEFAULT_KEEP_RUNS_FOR_DAYS = 30;
|
|
7
|
-
const
|
|
8
|
+
const plain = (rule) => (issue) => `${rule}, not ${issue.received}`;
|
|
9
|
+
const wholeNumber = plain("has to be a whole number, 1 or more");
|
|
10
|
+
const count = v.pipe(v.number(wholeNumber), v.integer(wholeNumber), v.minValue(1, wholeNumber));
|
|
11
|
+
const flag = v.boolean(plain("has to be true or false"));
|
|
12
|
+
/** valibot's own words ("Expected never but received …") mean nothing to someone editing a file. */
|
|
13
|
+
const objectMessage = (known) => (issue) => issue.expected === "never"
|
|
14
|
+
? `unknown setting — the known ones are ${known.join(", ")}`
|
|
15
|
+
: "has to be an object, in braces";
|
|
8
16
|
/**
|
|
9
17
|
* ⚠ `strictObject`, not `object`: an unknown key is an error here.
|
|
10
18
|
*
|
|
@@ -16,50 +24,120 @@ const count = v.pipe(v.number(), v.integer(), v.minValue(1));
|
|
|
16
24
|
* **No field here can hold a secret.** No token, no phone number, no chat id: a schema with
|
|
17
25
|
* nowhere to put one is stronger than a rule saying do not put one there.
|
|
18
26
|
*/
|
|
19
|
-
const
|
|
27
|
+
const profileEntries = {
|
|
20
28
|
limit: v.optional(count),
|
|
21
29
|
timeoutMs: v.optional(count),
|
|
22
|
-
color: v.optional(
|
|
23
|
-
senderColors: v.optional(
|
|
30
|
+
color: v.optional(flag),
|
|
31
|
+
senderColors: v.optional(flag),
|
|
24
32
|
/** The run log reads these two; nothing records anything until it exists. */
|
|
25
|
-
record: v.optional(
|
|
33
|
+
record: v.optional(flag),
|
|
26
34
|
keepRunsForDays: v.optional(count),
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
};
|
|
36
|
+
const profileSettings = v.strictObject(profileEntries, objectMessage(Object.keys(profileEntries)));
|
|
37
|
+
const configEntries = {
|
|
38
|
+
defaultProfile: v.optional(v.string(plain("has to be a profile name, in quotes"))),
|
|
39
|
+
/** What every profile gets unless it says otherwise. */
|
|
40
|
+
defaults: v.optional(profileSettings),
|
|
41
|
+
profiles: v.optional(v.record(v.string(), profileSettings, "has to be an object of profiles, by name"), {}),
|
|
42
|
+
};
|
|
43
|
+
export const configSchema = v.strictObject(configEntries, objectMessage(Object.keys(configEntries)));
|
|
44
|
+
export const PROFILE_SETTINGS = Object.keys(profileSettings.entries);
|
|
45
|
+
/** The first given value wins, and says which it was. */
|
|
46
|
+
const first = (candidates, fallback) => {
|
|
47
|
+
for (const [from, value] of candidates)
|
|
48
|
+
if (value !== undefined)
|
|
49
|
+
return { value, from };
|
|
50
|
+
return { value: fallback, from: "default" };
|
|
51
|
+
};
|
|
32
52
|
/**
|
|
33
53
|
* **Flag, then environment, then the configuration file, then the built-in default.** One place,
|
|
34
54
|
* so no command can decide the order differently from another.
|
|
35
55
|
*
|
|
56
|
+
* ⚠ **Only two settings actually have the middle step** — `MAX_PROFILE` and `MAX_TIMEOUT` — and
|
|
57
|
+
* that is deliberate rather than unfinished (`NEED-119`). They are the two an agent sets once for
|
|
58
|
+
* a whole process. A variable for `--json` or `--color` would be worse than missing: one left set
|
|
59
|
+
* in a shell silently changes the output of a command that never asked for it.
|
|
60
|
+
*
|
|
36
61
|
* Two things already jump this queue and are documented rather than re-litigated here:
|
|
37
62
|
* `MAX_TOKEN` outranks the keyring (`cli-core`'s `Credentials.read`), and `MAX_CONFIG_DIR`,
|
|
38
63
|
* `MAX_STATE_DIR` or `MAX_CACHE_DIR` move the whole installation — including which keyring entry
|
|
39
|
-
* a profile means (`ARCHITECTURE.md` §
|
|
64
|
+
* a profile means (`ARCHITECTURE.md` §14).
|
|
40
65
|
*/
|
|
41
66
|
export const resolveSettings = (flags = {}, { env = process.env, configDir } = {}) => {
|
|
42
67
|
const paths = resolvePaths({ appName: APP, prefix: "MAX", env });
|
|
43
68
|
const configPath = configFilePath(configDir ?? paths.config);
|
|
44
69
|
const config = readConfig(configPath);
|
|
45
|
-
const profile =
|
|
46
|
-
|
|
70
|
+
const profile = first([
|
|
71
|
+
["first word", flags.profile],
|
|
72
|
+
["MAX_PROFILE", given(env.MAX_PROFILE)],
|
|
73
|
+
["config file", config.defaultProfile],
|
|
74
|
+
], DEFAULT_PROFILE);
|
|
75
|
+
const configured = config.profiles[usableProfileName(profile.value)] ?? {};
|
|
76
|
+
const shared = config.defaults ?? {};
|
|
77
|
+
const limit = first([
|
|
78
|
+
["flag", flags.limit],
|
|
79
|
+
["config file", configured.limit],
|
|
80
|
+
["config defaults", shared.limit],
|
|
81
|
+
], DEFAULT_LIMIT);
|
|
82
|
+
const timeoutMs = first([
|
|
83
|
+
["config file", configured.timeoutMs],
|
|
84
|
+
["config defaults", shared.timeoutMs],
|
|
85
|
+
], undefined);
|
|
86
|
+
const color = first([
|
|
87
|
+
["config file", configured.color],
|
|
88
|
+
["config defaults", shared.color],
|
|
89
|
+
], undefined);
|
|
90
|
+
const senderColors = first([
|
|
91
|
+
["config file", configured.senderColors],
|
|
92
|
+
["config defaults", shared.senderColors],
|
|
93
|
+
], false);
|
|
94
|
+
const record = first([
|
|
95
|
+
["flag", flags.record],
|
|
96
|
+
["config file", configured.record],
|
|
97
|
+
["config defaults", shared.record],
|
|
98
|
+
], false);
|
|
99
|
+
const keepRunsForDays = first([
|
|
100
|
+
["config file", configured.keepRunsForDays],
|
|
101
|
+
["config defaults", shared.keepRunsForDays],
|
|
102
|
+
], DEFAULT_KEEP_RUNS_FOR_DAYS);
|
|
103
|
+
/**
|
|
104
|
+
* ⚠ **The only setting with no `config file` row, on purpose.** A budget for one command is
|
|
105
|
+
* about a particular run, not a habit, and a timeout written into a file is one somebody trips
|
|
106
|
+
* over months later without remembering they set it.
|
|
107
|
+
*/
|
|
108
|
+
const timeout = first([
|
|
109
|
+
["flag", flags.timeout],
|
|
110
|
+
["MAX_TIMEOUT", given(env.MAX_TIMEOUT)],
|
|
111
|
+
], undefined);
|
|
47
112
|
const settings = {
|
|
48
|
-
profile,
|
|
113
|
+
profile: usableProfileName(profile.value),
|
|
49
114
|
json: flags.json === true,
|
|
50
115
|
jsonl: flags.jsonl === true,
|
|
51
116
|
quiet: flags.quiet === true,
|
|
52
117
|
detail: Math.min(2, Math.max(0, flags.verbose ?? 0)),
|
|
53
118
|
trace: flags.trace === true,
|
|
54
|
-
color:
|
|
55
|
-
senderColors:
|
|
56
|
-
limit:
|
|
119
|
+
color: color.value,
|
|
120
|
+
senderColors: senderColors.value,
|
|
121
|
+
limit: limit.value,
|
|
57
122
|
page: flags.page ?? 1,
|
|
58
123
|
all: flags.all === true,
|
|
59
|
-
timeoutMs:
|
|
60
|
-
|
|
61
|
-
|
|
124
|
+
timeoutMs: timeoutMs.value,
|
|
125
|
+
commandTimeoutMs: durationMs(timeout.value, timeout.from),
|
|
126
|
+
record: record.value,
|
|
127
|
+
keepRunsForDays: keepRunsForDays.value,
|
|
62
128
|
configPath,
|
|
129
|
+
configFound: existsSync(configPath),
|
|
130
|
+
configuredProfiles: Object.keys(config.profiles),
|
|
131
|
+
sources: {
|
|
132
|
+
profile: profile.from,
|
|
133
|
+
limit: limit.from,
|
|
134
|
+
timeoutMs: timeoutMs.from,
|
|
135
|
+
commandTimeoutMs: timeout.from,
|
|
136
|
+
color: color.from,
|
|
137
|
+
senderColors: senderColors.from,
|
|
138
|
+
record: record.from,
|
|
139
|
+
keepRunsForDays: keepRunsForDays.from,
|
|
140
|
+
},
|
|
63
141
|
};
|
|
64
142
|
// The file was checked by the schema; a flag was not, and `--limit abc` is `NaN` by the time it
|
|
65
143
|
// gets here, which slices an array to nothing without complaining.
|
|
@@ -76,6 +154,84 @@ export const resolveSettings = (flags = {}, { env = process.env, configDir } = {
|
|
|
76
154
|
}
|
|
77
155
|
return settings;
|
|
78
156
|
};
|
|
157
|
+
/**
|
|
158
|
+
* The profile names written in the configuration file.
|
|
159
|
+
*
|
|
160
|
+
* ⚠ **This is not every profile that works.** `max <name> session start` stores a token under any
|
|
161
|
+
* name without writing anything to the file, so a profile can be in daily use and absent here.
|
|
162
|
+
* Whoever prints this has to say so, or it reads as a complete list and quietly is not.
|
|
163
|
+
*/
|
|
164
|
+
export const configuredProfiles = ({ env = process.env, configDir } = {}) => {
|
|
165
|
+
const paths = resolvePaths({ appName: APP, prefix: "MAX", env });
|
|
166
|
+
return Object.keys(readConfig(configFilePath(configDir ?? paths.config)).profiles).sort();
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* `30s`, `2m`, `500ms` — **the unit is required, and a bare number is refused.**
|
|
170
|
+
*
|
|
171
|
+
* `--timeout 30` is ambiguous in a way that costs real time: the neighbouring setting in the
|
|
172
|
+
* configuration file is called `timeoutMs` and is milliseconds, while every other tool that spells
|
|
173
|
+
* it this way means seconds. Guessing either one is a thirty-fold surprise in one direction or the
|
|
174
|
+
* other, so this asks instead — the same rule as `--kind`, and the reason is the same.
|
|
175
|
+
*
|
|
176
|
+
* The refusal names whichever of the two supplied the value — see `durationMs`.
|
|
177
|
+
*/
|
|
178
|
+
const DURATION = /^(\d+)(ms|s|m)$/;
|
|
179
|
+
const UNIT_MS = { ms: 1, s: 1000, m: 60_000 };
|
|
180
|
+
const durationMs = (value, from) => {
|
|
181
|
+
if (value === undefined)
|
|
182
|
+
return undefined;
|
|
183
|
+
// Named by where it came from, so somebody who set `MAX_TIMEOUT` in a shell profile weeks ago is
|
|
184
|
+
// told which thing is wrong rather than shown a flag they never typed.
|
|
185
|
+
const source = from === "MAX_TIMEOUT" ? "MAX_TIMEOUT" : "--timeout";
|
|
186
|
+
const match = DURATION.exec(value.trim());
|
|
187
|
+
if (!match?.[1] || !match[2]) {
|
|
188
|
+
throw new CliError("validation_error", `${source} takes a duration with a unit — 30s, 2m or 500ms — not "${value}"`);
|
|
189
|
+
}
|
|
190
|
+
const ms = Number(match[1]) * (UNIT_MS[match[2]] ?? 0);
|
|
191
|
+
if (ms <= 0) {
|
|
192
|
+
throw new CliError("validation_error", `${source} has to be more than zero, and "${value}" is not`);
|
|
193
|
+
}
|
|
194
|
+
return ms;
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* Sets or removes one setting of one profile, or of `defaults`, and writes the file back.
|
|
198
|
+
*
|
|
199
|
+
* **The value is checked by the same schema that reads the file**, on the whole result, before
|
|
200
|
+
* anything is written — so `config set` cannot produce a file the next command refuses to load.
|
|
201
|
+
*/
|
|
202
|
+
export const changeSetting = (path, { profile, setting, value }) => {
|
|
203
|
+
if (!PROFILE_SETTINGS.includes(setting)) {
|
|
204
|
+
throw new CliError("validation_error", `no setting called "${setting}" — one of: ${PROFILE_SETTINGS.join(", ")}`);
|
|
205
|
+
}
|
|
206
|
+
const config = readConfig(path);
|
|
207
|
+
const scope = { ...(profile === undefined ? config.defaults : config.profiles[profile]) };
|
|
208
|
+
if (value === undefined)
|
|
209
|
+
delete scope[setting];
|
|
210
|
+
else
|
|
211
|
+
scope[setting] = parseValue(value);
|
|
212
|
+
const changed = profile === undefined
|
|
213
|
+
? { ...config, defaults: scope }
|
|
214
|
+
: { ...config, profiles: { ...config.profiles, [profile]: scope } };
|
|
215
|
+
if (profile === undefined && Object.keys(scope).length === 0)
|
|
216
|
+
delete changed.defaults;
|
|
217
|
+
if (profile !== undefined && Object.keys(scope).length === 0)
|
|
218
|
+
delete changed.profiles[profile];
|
|
219
|
+
const checked = v.safeParse(configSchema, changed);
|
|
220
|
+
if (!checked.success) {
|
|
221
|
+
throw new CliError("validation_error", `${setting} cannot be "${value}": ${checked.issues[0]?.message ?? "invalid"}`);
|
|
222
|
+
}
|
|
223
|
+
saveConfigFile(path, checked.output);
|
|
224
|
+
return scope[setting] ?? null;
|
|
225
|
+
};
|
|
226
|
+
/** `50` is a number and `true` a boolean, as they would be in the file; anything else stays text. */
|
|
227
|
+
const parseValue = (value) => {
|
|
228
|
+
try {
|
|
229
|
+
return JSON.parse(value);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return value;
|
|
233
|
+
}
|
|
234
|
+
};
|
|
79
235
|
/**
|
|
80
236
|
* A missing file is not an error — it is a program nobody has configured. A malformed one is, in
|
|
81
237
|
* every output mode: an agent reading JSON deserves the same refusal a person gets, and silently
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Anything holding something that would keep the process alive. A `MaxClient` is one. */
|
|
2
|
+
export interface Closeable {
|
|
3
|
+
close(): Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Stops the whole command at `ms`, and **closes what it was holding on the way out**.
|
|
7
|
+
*
|
|
8
|
+
* ⚠ The closing is the part that matters, and it is what a plain `Promise.race` does not do.
|
|
9
|
+
* Racing only decides which answer is printed; the losing work carries on, and an open WebSocket
|
|
10
|
+
* keeps Node alive — so a command that reported a timeout would then sit there, which is the
|
|
11
|
+
* defect §18 forbids and worse than the wait it was cutting short. A test covers exactly that, by
|
|
12
|
+
* taking the closing away and watching what is left behind.
|
|
13
|
+
*
|
|
14
|
+
* Closing a connection with a request still in flight used to strand the caller forever; it now
|
|
15
|
+
* rejects it (`BUG-24`), which is what lets the body unwind through its own `finally` rather than
|
|
16
|
+
* hanging somewhere underneath this.
|
|
17
|
+
*
|
|
18
|
+
* ⚠ **It bounds everything, not only what talks to MAX.** `max messages search` never opens a
|
|
19
|
+
* socket at all and still has to fit the budget: an agent handing out thirty seconds does not
|
|
20
|
+
* know which commands are the networked ones, and a bound that quietly did not apply to some of
|
|
21
|
+
* them would be worse than no bound.
|
|
22
|
+
*
|
|
23
|
+
* It lives here rather than under `commands/` because it is about the lifetime of a process, not
|
|
24
|
+
* about any command — and because a command may not reach the transport, while the thing that
|
|
25
|
+
* shuts the transport down has to.
|
|
26
|
+
*
|
|
27
|
+
* Without a bound there is no timer and no race: the ordinary path is exactly what it was.
|
|
28
|
+
*/
|
|
29
|
+
export declare const withDeadline: <T>(ms: number | undefined, closeables: Closeable[], body: () => Promise<T>) => Promise<T>;
|
|
30
|
+
//# sourceMappingURL=deadline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadline.d.ts","sourceRoot":"","sources":["../src/deadline.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,MAAM,WAAW,SAAS;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,YAAY,GAAU,CAAC,EAClC,IAAI,MAAM,GAAG,SAAS,EACtB,YAAY,SAAS,EAAE,EACvB,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,CAAC,CAmBX,CAAA"}
|
package/dist/deadline.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { CliError } from "@leemour/cli-core";
|
|
2
|
+
/**
|
|
3
|
+
* Stops the whole command at `ms`, and **closes what it was holding on the way out**.
|
|
4
|
+
*
|
|
5
|
+
* ⚠ The closing is the part that matters, and it is what a plain `Promise.race` does not do.
|
|
6
|
+
* Racing only decides which answer is printed; the losing work carries on, and an open WebSocket
|
|
7
|
+
* keeps Node alive — so a command that reported a timeout would then sit there, which is the
|
|
8
|
+
* defect §18 forbids and worse than the wait it was cutting short. A test covers exactly that, by
|
|
9
|
+
* taking the closing away and watching what is left behind.
|
|
10
|
+
*
|
|
11
|
+
* Closing a connection with a request still in flight used to strand the caller forever; it now
|
|
12
|
+
* rejects it (`BUG-24`), which is what lets the body unwind through its own `finally` rather than
|
|
13
|
+
* hanging somewhere underneath this.
|
|
14
|
+
*
|
|
15
|
+
* ⚠ **It bounds everything, not only what talks to MAX.** `max messages search` never opens a
|
|
16
|
+
* socket at all and still has to fit the budget: an agent handing out thirty seconds does not
|
|
17
|
+
* know which commands are the networked ones, and a bound that quietly did not apply to some of
|
|
18
|
+
* them would be worse than no bound.
|
|
19
|
+
*
|
|
20
|
+
* It lives here rather than under `commands/` because it is about the lifetime of a process, not
|
|
21
|
+
* about any command — and because a command may not reach the transport, while the thing that
|
|
22
|
+
* shuts the transport down has to.
|
|
23
|
+
*
|
|
24
|
+
* Without a bound there is no timer and no race: the ordinary path is exactly what it was.
|
|
25
|
+
*/
|
|
26
|
+
export const withDeadline = async (ms, closeables, body) => {
|
|
27
|
+
if (ms === undefined)
|
|
28
|
+
return body();
|
|
29
|
+
let timer;
|
|
30
|
+
const expired = new Promise((_, reject) => {
|
|
31
|
+
timer = setTimeout(() => {
|
|
32
|
+
// Sockets first, then the message: the rejection is what the person reads, and the closing
|
|
33
|
+
// is what lets the process actually end once they have read it.
|
|
34
|
+
void Promise.allSettled(closeables.map((closeable) => closeable.close())).then(() => reject(new CliError("timeout", `the command did not finish within ${ms}ms — \`--timeout\` ended it`)));
|
|
35
|
+
}, ms);
|
|
36
|
+
});
|
|
37
|
+
try {
|
|
38
|
+
return await Promise.race([body(), expired]);
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
if (timer)
|
|
42
|
+
clearTimeout(timer);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=deadline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadline.js","sourceRoot":"","sources":["../src/deadline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAO5C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,EAAsB,EACtB,UAAuB,EACvB,IAAsB,EACV,EAAE;IACd,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,IAAI,EAAE,CAAA;IAEnC,IAAI,KAAiC,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,2FAA2F;YAC3F,gEAAgE;YAChE,KAAK,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAClF,MAAM,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,qCAAqC,EAAE,6BAA6B,CAAC,CAAC,CACtG,CAAA;QACH,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;IAC9C,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export interface DiagnoseOptions {
|
|
2
|
+
profile: string;
|
|
3
|
+
env?: NodeJS.ProcessEnv;
|
|
4
|
+
/** Tests point these at a temporary directory; nothing else should need them. */
|
|
5
|
+
stateDir?: string;
|
|
6
|
+
cacheDir?: string;
|
|
7
|
+
/** Injected so a test needs no SQLite file and no keyring. */
|
|
8
|
+
readSchemaVersion?: (file: string) => Promise<number | undefined>;
|
|
9
|
+
hasKeyringToken?: (profile: string) => boolean;
|
|
10
|
+
}
|
|
11
|
+
export type TokenSource = "environment" | "keyring" | "none";
|
|
12
|
+
export interface Diagnosis {
|
|
13
|
+
/** ⚠ Never the token, and never a prefix or a length of it — only whether one is reachable. */
|
|
14
|
+
token: {
|
|
15
|
+
present: boolean;
|
|
16
|
+
from: TokenSource;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* ⚠ **The trap this command exists for.** `MAX_CONFIG_DIR` and its two siblings change the
|
|
20
|
+
* keyring entry a profile means, so a login performed with them set answers "no session"
|
|
21
|
+
* without them — and nothing else in the tool can show that.
|
|
22
|
+
*/
|
|
23
|
+
keyring: {
|
|
24
|
+
service: string;
|
|
25
|
+
movedByEnvironment: boolean;
|
|
26
|
+
};
|
|
27
|
+
session: {
|
|
28
|
+
stateFile: string;
|
|
29
|
+
/** `false` on a machine nobody has logged in on. Reading it must not create it. */
|
|
30
|
+
exists: boolean;
|
|
31
|
+
deviceId: boolean;
|
|
32
|
+
viewerId: boolean;
|
|
33
|
+
/** What `RISK-2` wants counted: a token that stops working can then be explained. */
|
|
34
|
+
logins: number | null;
|
|
35
|
+
lastLoginAt: string | null;
|
|
36
|
+
};
|
|
37
|
+
loggedInProfiles: string[];
|
|
38
|
+
cache: {
|
|
39
|
+
file: string;
|
|
40
|
+
exists: boolean;
|
|
41
|
+
/** What is written in the file, which is not always what this build speaks. */
|
|
42
|
+
schemaVersion: number | undefined;
|
|
43
|
+
speaks: number;
|
|
44
|
+
/** A file from a newer `max` is refused rather than written to — and that looks like a bug. */
|
|
45
|
+
readable: boolean;
|
|
46
|
+
};
|
|
47
|
+
runs: {
|
|
48
|
+
directory: string;
|
|
49
|
+
kept: number;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Everything a command depends on, read from disk and **never from MAX**.
|
|
54
|
+
*
|
|
55
|
+
* It is a separate function rather than the body of the command because `forCommand` builds its
|
|
56
|
+
* own renderer over the real streams, so anything left inside a command action cannot be asserted
|
|
57
|
+
* on (`CLI-15`, and `src/session/adopt.ts` moved for the same reason).
|
|
58
|
+
*
|
|
59
|
+
* ⚠ **It must work when everything is broken**, which is the only time anybody runs it: no
|
|
60
|
+
* session, no configuration file, a cache from a newer version, a keyring that will not open. Each
|
|
61
|
+
* of those is a field in the answer, never an exception.
|
|
62
|
+
*
|
|
63
|
+
* ⚠ **It reads the state file directly instead of calling `readState`**, which invents a device
|
|
64
|
+
* identity and writes it out on first read. A diagnosis that creates the thing it is reporting on
|
|
65
|
+
* is not a diagnosis.
|
|
66
|
+
*/
|
|
67
|
+
export declare const diagnose: ({ profile, env, stateDir, cacheDir, readSchemaVersion, hasKeyringToken, }: DiagnoseOptions) => Promise<Diagnosis>;
|
|
68
|
+
//# sourceMappingURL=diagnose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACjE,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAA;CAC/C;AAED,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,CAAA;AAE5D,MAAM,WAAW,SAAS;IACxB,+FAA+F;IAC/F,KAAK,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,CAAA;IAC9C;;;;OAIG;IACH,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,OAAO,CAAA;KAAE,CAAA;IACzD,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAA;QACjB,mFAAmF;QACnF,MAAM,EAAE,OAAO,CAAA;QACf,QAAQ,EAAE,OAAO,CAAA;QACjB,QAAQ,EAAE,OAAO,CAAA;QACjB,qFAAqF;QACrF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAC3B,CAAA;IACD,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,OAAO,CAAA;QACf,+EAA+E;QAC/E,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;QACjC,MAAM,EAAE,MAAM,CAAA;QACd,+FAA+F;QAC/F,QAAQ,EAAE,OAAO,CAAA;KAClB,CAAA;IACD,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1C;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,QAAQ,GAAU,2EAO5B,eAAe,KAAG,OAAO,CAAC,SAAS,CA0CrC,CAAA"}
|
package/dist/diagnose.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { pathsAreOverridden, resolvePaths } from "@leemour/cli-core";
|
|
4
|
+
import { openCache } from "./cache/open.js";
|
|
5
|
+
import { SCHEMA_VERSION } from "./cache/schema.js";
|
|
6
|
+
/**
|
|
7
|
+
* Everything a command depends on, read from disk and **never from MAX**.
|
|
8
|
+
*
|
|
9
|
+
* It is a separate function rather than the body of the command because `forCommand` builds its
|
|
10
|
+
* own renderer over the real streams, so anything left inside a command action cannot be asserted
|
|
11
|
+
* on (`CLI-15`, and `src/session/adopt.ts` moved for the same reason).
|
|
12
|
+
*
|
|
13
|
+
* ⚠ **It must work when everything is broken**, which is the only time anybody runs it: no
|
|
14
|
+
* session, no configuration file, a cache from a newer version, a keyring that will not open. Each
|
|
15
|
+
* of those is a field in the answer, never an exception.
|
|
16
|
+
*
|
|
17
|
+
* ⚠ **It reads the state file directly instead of calling `readState`**, which invents a device
|
|
18
|
+
* identity and writes it out on first read. A diagnosis that creates the thing it is reporting on
|
|
19
|
+
* is not a diagnosis.
|
|
20
|
+
*/
|
|
21
|
+
export const diagnose = async ({ profile, env = process.env, stateDir, cacheDir, readSchemaVersion = schemaVersionOf, hasKeyringToken = () => false, }) => {
|
|
22
|
+
const paths = resolvePaths({ appName: "max-cli", prefix: "MAX", env });
|
|
23
|
+
const state = stateDir ?? paths.state;
|
|
24
|
+
const cacheHome = cacheDir ?? paths.cache;
|
|
25
|
+
const moved = pathsAreOverridden({ appName: "max-cli", prefix: "MAX", env });
|
|
26
|
+
const fromEnvironment = (env.MAX_TOKEN ?? "").trim() !== "";
|
|
27
|
+
const inKeyring = fromEnvironment ? false : hasKeyringToken(profile);
|
|
28
|
+
const stateFile = join(state, "profiles", `${profile}.json`);
|
|
29
|
+
const stored = readState(stateFile);
|
|
30
|
+
const cacheFile = join(cacheHome, `${profile}.db`);
|
|
31
|
+
const cacheExists = existsSync(cacheFile);
|
|
32
|
+
const schemaVersion = cacheExists ? await readSchemaVersion(cacheFile) : undefined;
|
|
33
|
+
const runsDirectory = join(state, "runs");
|
|
34
|
+
return {
|
|
35
|
+
token: {
|
|
36
|
+
present: fromEnvironment || inKeyring,
|
|
37
|
+
from: fromEnvironment ? "environment" : inKeyring ? "keyring" : "none",
|
|
38
|
+
},
|
|
39
|
+
keyring: { service: moved ? `max-cli:${paths.config}` : "max-cli", movedByEnvironment: moved },
|
|
40
|
+
session: {
|
|
41
|
+
stateFile,
|
|
42
|
+
exists: stored !== undefined,
|
|
43
|
+
deviceId: typeof stored?.deviceId === "string" && stored.deviceId !== "",
|
|
44
|
+
viewerId: typeof stored?.viewerId === "string" && stored.viewerId !== "",
|
|
45
|
+
logins: typeof stored?.logins === "number" ? stored.logins : null,
|
|
46
|
+
lastLoginAt: typeof stored?.lastLoginAt === "string" ? stored.lastLoginAt : null,
|
|
47
|
+
},
|
|
48
|
+
loggedInProfiles: profilesWithState(join(state, "profiles")),
|
|
49
|
+
cache: {
|
|
50
|
+
file: cacheFile,
|
|
51
|
+
exists: cacheExists,
|
|
52
|
+
schemaVersion,
|
|
53
|
+
speaks: SCHEMA_VERSION,
|
|
54
|
+
readable: !cacheExists || (schemaVersion !== undefined && schemaVersion <= SCHEMA_VERSION),
|
|
55
|
+
},
|
|
56
|
+
runs: { directory: runsDirectory, kept: countEntries(runsDirectory) },
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
/** A file that is missing, unreadable or not JSON is "no session", never a thrown error. */
|
|
60
|
+
const readState = (file) => {
|
|
61
|
+
try {
|
|
62
|
+
const parsed = JSON.parse(readFileSync(file, "utf8"));
|
|
63
|
+
return typeof parsed === "object" && parsed !== null ? parsed : undefined;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* **Which profiles have been logged in**, which is not the same list as the configured ones —
|
|
71
|
+
* `config show` says so and cannot answer it, because a profile needs no configuration entry.
|
|
72
|
+
*/
|
|
73
|
+
const profilesWithState = (directory) => {
|
|
74
|
+
try {
|
|
75
|
+
return readdirSync(directory)
|
|
76
|
+
.filter((name) => name.endsWith(".json"))
|
|
77
|
+
.map((name) => name.slice(0, -".json".length))
|
|
78
|
+
.sort();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const countEntries = (directory) => {
|
|
85
|
+
try {
|
|
86
|
+
return readdirSync(directory).filter((name) => statSync(join(directory, name)).isDirectory()).length;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* The schema version written in the file, read **without migrating it**.
|
|
94
|
+
*
|
|
95
|
+
* It goes through `openCache`, the one seam that knows which SQLite this runtime has — and
|
|
96
|
+
* crucially `openCache` does **not** migrate: `migrate` runs inside `openStore`. So this reads the
|
|
97
|
+
* number the file already carries rather than the number it would carry after being upgraded,
|
|
98
|
+
* which is the whole point. A command asked to describe the state must not change it.
|
|
99
|
+
*/
|
|
100
|
+
const schemaVersionOf = async (file) => {
|
|
101
|
+
try {
|
|
102
|
+
const database = await openCache(file);
|
|
103
|
+
try {
|
|
104
|
+
const row = database.prepare("PRAGMA user_version").get();
|
|
105
|
+
return typeof row?.user_version === "number" ? row.user_version : undefined;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
database.close();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/map.js
CHANGED
|
@@ -119,7 +119,8 @@ const phone = (value) => {
|
|
|
119
119
|
};
|
|
120
120
|
/**
|
|
121
121
|
* What an attachment is and where it lives — never its bytes. The link fields are the ones
|
|
122
|
-
* `pnpm probe:attachments` measured on 2026-09-22: `baseUrl` on a photo, `url` on a share.
|
|
122
|
+
* `pnpm probe:attachments` measured on 2026-09-22: `baseUrl` on a photo, `url` on a share. A file
|
|
123
|
+
* and a video have no link, only `fileId` and `videoId` (measured 2026-09-23).
|
|
123
124
|
*/
|
|
124
125
|
const attachments = (value) => {
|
|
125
126
|
if (!Array.isArray(value))
|
|
@@ -134,6 +135,8 @@ const attachments = (value) => {
|
|
|
134
135
|
const title = text(entry.title);
|
|
135
136
|
const name = text(entry.name);
|
|
136
137
|
const size = count(entry.size);
|
|
138
|
+
const fileId = asId(entry.fileId);
|
|
139
|
+
const videoId = asId(entry.videoId);
|
|
137
140
|
return {
|
|
138
141
|
kind: typeof entry._type === "string" ? entry._type.toLowerCase() : "unknown",
|
|
139
142
|
...(url ? { url } : {}),
|
|
@@ -142,6 +145,8 @@ const attachments = (value) => {
|
|
|
142
145
|
...(title ? { title } : {}),
|
|
143
146
|
...(name ? { name } : {}),
|
|
144
147
|
...(size !== null ? { size } : {}),
|
|
148
|
+
...(fileId ? { fileId } : {}),
|
|
149
|
+
...(videoId ? { videoId } : {}),
|
|
145
150
|
};
|
|
146
151
|
});
|
|
147
152
|
};
|
package/dist/domain/map.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/domain/map.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/domain/map.ts"],"names":[],"mappings":"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"}
|