@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/runs/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runs/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACrF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,gBAAgB,EAAmB,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runs/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export interface SessionOptions {
|
|
|
12
12
|
* changed in each collection since the one given, so a stored marker is the difference between
|
|
13
13
|
* re-fetching every chat and every contact on every invocation and receiving the handful that
|
|
14
14
|
* moved. Where it is kept, and why the merge and the marker share a transaction, is
|
|
15
|
-
* `
|
|
15
|
+
* `docs/architecture/session.md`.
|
|
16
16
|
*
|
|
17
17
|
* All four carry the same value: nothing reads presence or drafts, and sending the marker in
|
|
18
18
|
* those two as well was measured harmless on the real account (`NEED-103`).
|
package/dist/spec/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spec/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spec/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAOhE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAE5B;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,EAAE,SAAS,KAAK,EAchC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAA2E,CAAA;AAEtH,eAAO,MAAM,YAAY,EAAE,SAAS,WAAW,EAE9C,CAAA"}
|
package/dist/spec/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { attachmentsFile, attachmentsVideo } from "./operations/attachments.js";
|
|
1
2
|
import { chatMark, chatsHistory, chatsList } from "./operations/chats.js";
|
|
2
3
|
import { contactsInfo, profile, unidentified36 } from "./operations/contacts.js";
|
|
3
4
|
import { messageDelete, messagesSend } from "./operations/messages.js";
|
|
@@ -24,6 +25,8 @@ export const spec = [
|
|
|
24
25
|
chatsList,
|
|
25
26
|
messagesSend,
|
|
26
27
|
messageDelete,
|
|
28
|
+
attachmentsVideo,
|
|
29
|
+
attachmentsFile,
|
|
27
30
|
];
|
|
28
31
|
export const operations = spec.filter((entry) => entry.kind === "operation");
|
|
29
32
|
export const reservations = spec.filter((entry) => entry.kind === "reservation");
|
package/dist/spec/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/spec/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAE5B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAqB;IACpC,WAAW;IACX,YAAY;IACZ,MAAM;IACN,YAAY;IACZ,OAAO;IACP,cAAc;IACd,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,aAAa;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/spec/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAE5B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAqB;IACpC,WAAW;IACX,YAAY;IACZ,MAAM;IACN,YAAY;IACZ,OAAO;IACP,cAAc;IACd,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,aAAa;IACb,gBAAgB;IAChB,eAAe;CAChB,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAyB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAsB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAA;AAEtH,MAAM,CAAC,MAAM,YAAY,GAA2B,IAAI,CAAC,MAAM,CAC7D,CAAC,KAAK,EAAwB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CAC9D,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
export declare const attachmentsFile: import("../define.js").Operation<v.StrictObjectSchema<{
|
|
3
|
+
readonly chatId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
4
|
+
readonly messageId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
5
|
+
readonly fileId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
6
|
+
}, undefined>, v.LooseObjectSchema<{
|
|
7
|
+
readonly url: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
8
|
+
readonly unsafe: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
9
|
+
}, undefined>>;
|
|
10
|
+
export declare const attachmentsVideo: import("../define.js").Operation<v.StrictObjectSchema<{
|
|
11
|
+
readonly chatId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
12
|
+
readonly messageId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
13
|
+
readonly videoId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "an id is a whole number written as a string">, v.TransformAction<string, bigint>]>;
|
|
14
|
+
}, undefined>, v.LooseObjectSchema<{}, undefined>>;
|
|
15
|
+
//# sourceMappingURL=attachments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../../src/spec/operations/attachments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,eAAO,MAAM,eAAe;;;;;;;cAiB1B,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;kDAiB3B,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { defineOperation } from "../define.js";
|
|
3
|
+
import { id } from "../scalars.js";
|
|
4
|
+
export const attachmentsFile = defineOperation({
|
|
5
|
+
name: "attachments.file",
|
|
6
|
+
constant: "FILE_DOWNLOAD",
|
|
7
|
+
opcode: 88,
|
|
8
|
+
auth: true,
|
|
9
|
+
request: v.strictObject({
|
|
10
|
+
chatId: id(),
|
|
11
|
+
messageId: id(),
|
|
12
|
+
fileId: id(),
|
|
13
|
+
}),
|
|
14
|
+
response: v.looseObject({ url: v.optional(v.string()), unsafe: v.optional(v.boolean()) }),
|
|
15
|
+
provenance: {
|
|
16
|
+
confidence: "measured",
|
|
17
|
+
sources: ["measured against MAX 2026-09-23 (`pnpm probe:download`)", "tsmax getFileById", "PyMax get_file_by_id"],
|
|
18
|
+
notes: "A file attachment carries `fileId` and no link; this answers `{unsafe, url}`, and the link opens without credentials.",
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
export const attachmentsVideo = defineOperation({
|
|
22
|
+
name: "attachments.video",
|
|
23
|
+
constant: "VIDEO_PLAY",
|
|
24
|
+
opcode: 83,
|
|
25
|
+
auth: true,
|
|
26
|
+
request: v.strictObject({
|
|
27
|
+
chatId: id(),
|
|
28
|
+
messageId: id(),
|
|
29
|
+
videoId: id(),
|
|
30
|
+
}),
|
|
31
|
+
response: v.looseObject({}),
|
|
32
|
+
provenance: {
|
|
33
|
+
confidence: "measured",
|
|
34
|
+
sources: ["measured against MAX 2026-09-23 (`pnpm probe:download`)", "tsmax getVideoById", "PyMax get_video_by_id"],
|
|
35
|
+
notes: "Answers `cache` and one key per rendition — `MP4_720`, `HLS`, `DASH`, `EXTERNAL` were seen. The MP4 link opens without credentials.",
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../src/spec/operations/attachments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAA;AAElC,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;IAC7C,IAAI,EAAE,kBAAkB;IACxB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;QACtB,MAAM,EAAE,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE,EAAE;QACf,MAAM,EAAE,EAAE,EAAE;KACb,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IACzF,UAAU,EAAE;QACV,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE,CAAC,yDAAyD,EAAE,mBAAmB,EAAE,sBAAsB,CAAC;QACjH,KAAK,EACH,uHAAuH;KAC1H;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,eAAe,CAAC;IAC9C,IAAI,EAAE,mBAAmB;IACzB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;QACtB,MAAM,EAAE,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE,EAAE;QACf,OAAO,EAAE,EAAE,EAAE;KACd,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;IAC3B,UAAU,EAAE;QACV,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE,CAAC,yDAAyD,EAAE,oBAAoB,EAAE,uBAAuB,CAAC;QACnH,KAAK,EACH,qIAAqI;KACxI;CACF,CAAC,CAAA"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { WebSocket } from "ws";
|
|
2
2
|
import { type Payload } from "../protocol/frame.js";
|
|
3
3
|
export interface MockMaxOptions {
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* One answer per opcode. An opcode with no answer is an unexpected call, and the test fails.
|
|
6
|
+
* A function may return `undefined` to stay silent, which is how a timeout is scripted — and
|
|
7
|
+
* the only way a test says it means a request to go unanswered.
|
|
8
|
+
*/
|
|
6
9
|
answers: Record<number, Payload | (() => Payload | undefined)>;
|
|
7
10
|
/** Opcodes to refuse, as MAX does: `cmd=3` with an `error` in the payload. */
|
|
8
11
|
refuse?: Record<number, string>;
|
|
@@ -14,10 +17,12 @@ export interface MockMax {
|
|
|
14
17
|
opcode: number;
|
|
15
18
|
payload: Payload;
|
|
16
19
|
}[];
|
|
17
|
-
/** Calls with no scripted answer.
|
|
20
|
+
/** Calls with no scripted answer. Any left at the end of a test fail it (`unscripted.ts`). */
|
|
18
21
|
unexpected: number[];
|
|
19
22
|
closed: boolean;
|
|
20
23
|
}
|
|
24
|
+
/** Every mock built since the last call, and forgets them — so each test sees only its own. */
|
|
25
|
+
export declare const takeBuiltMocks: () => MockMax[];
|
|
21
26
|
/**
|
|
22
27
|
* MAX, scripted. **No timers, no network, no waiting**: an answer is delivered on the next tick,
|
|
23
28
|
* so a timeout test costs nothing and a suite cannot reach the real service.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-max.d.ts","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACnC,OAAO,EAAqC,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEtF,MAAM,WAAW,cAAc;IAC7B
|
|
1
|
+
{"version":3,"file":"mock-max.d.ts","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACnC,OAAO,EAAqC,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEtF,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAA;IAC9D,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,MAAM,SAAS,CAAA;IAC7B,sFAAsF;IACtF,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;IAC5C,8FAA8F;IAC9F,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;CAChB;AAID,+FAA+F;AAC/F,eAAO,MAAM,cAAc,QAAO,OAAO,EAAqB,CAAA;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,qBAA0B,cAAc,KAAG,OA0DlE,CAAA"}
|
package/dist/testing/mock-max.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
2
|
import { Command, decodeFrame, encodeFrame } from "../protocol/frame.js";
|
|
3
|
+
const built = [];
|
|
4
|
+
/** Every mock built since the last call, and forgets them — so each test sees only its own. */
|
|
5
|
+
export const takeBuiltMocks = () => built.splice(0);
|
|
3
6
|
/**
|
|
4
7
|
* MAX, scripted. **No timers, no network, no waiting**: an answer is delivered on the next tick,
|
|
5
8
|
* so a timeout test costs nothing and a suite cannot reach the real service.
|
|
@@ -8,7 +11,14 @@ import { Command, decodeFrame, encodeFrame } from "../protocol/frame.js";
|
|
|
8
11
|
* rather than a hope: assert that opcode 50 is absent from `sent`.
|
|
9
12
|
*/
|
|
10
13
|
export const mockMax = ({ answers, refuse = {} }) => {
|
|
11
|
-
|
|
14
|
+
// Open when asked for, as a real socket does — not when the mock is built, or a connection made
|
|
15
|
+
// later than the same tick waits for an event that already fired.
|
|
16
|
+
const createSocket = () => {
|
|
17
|
+
queueMicrotask(() => socket.emit("open"));
|
|
18
|
+
return socket;
|
|
19
|
+
};
|
|
20
|
+
const state = { createSocket, sent: [], unexpected: [], closed: false };
|
|
21
|
+
built.push(state);
|
|
12
22
|
const socket = new (class extends EventEmitter {
|
|
13
23
|
readyState = 1;
|
|
14
24
|
OPEN = 1;
|
|
@@ -35,12 +45,20 @@ export const mockMax = ({ answers, refuse = {} }) => {
|
|
|
35
45
|
answer(frame) {
|
|
36
46
|
queueMicrotask(() => this.emit("message", encodeFrame(frame)));
|
|
37
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* ⚠ **Emits `error` on the way out, the way `ws` does when a socket is closed before it
|
|
50
|
+
* finished connecting** — measured against the real service on 2026-09-22.
|
|
51
|
+
*
|
|
52
|
+
* It is here so the suite can see what that costs: an `error` event with nobody listening is
|
|
53
|
+
* how Node kills the process, so a connection that strips its listeners before closing turns
|
|
54
|
+
* a timeout into a stack trace. A mock that closed politely would have let that ship.
|
|
55
|
+
*/
|
|
38
56
|
close() {
|
|
39
57
|
state.closed = true;
|
|
40
58
|
this.readyState = 3;
|
|
59
|
+
this.emit("error", new Error("WebSocket was closed before the connection was established"));
|
|
41
60
|
}
|
|
42
61
|
})();
|
|
43
|
-
queueMicrotask(() => socket.emit("open"));
|
|
44
62
|
return state;
|
|
45
63
|
};
|
|
46
64
|
//# sourceMappingURL=mock-max.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-max.js","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAgB,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"mock-max.js","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"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"}
|
package/dist/testing/sandbox.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { mkdtempSync } from "node:fs";
|
|
1
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
+
import { afterAll } from "vitest";
|
|
4
5
|
/**
|
|
5
6
|
* **Moves the whole installation into a temporary directory, for every test file.**
|
|
6
7
|
*
|
|
@@ -16,9 +17,17 @@ import { join } from "node:path";
|
|
|
16
17
|
*
|
|
17
18
|
* The three variables move config, state and cache together. They also scope the keyring entry
|
|
18
19
|
* (`ARCHITECTURE.md` §14) — the documented trap, which here is precisely the isolation wanted.
|
|
20
|
+
*
|
|
21
|
+
* `TMPDIR` points into it too, and the whole of it goes when the file is done: every test makes
|
|
22
|
+
* its directories with `mkdtempSync(join(tmpdir(), …))`, and by 2026-09-23 that had left some
|
|
23
|
+
* fifteen thousand of them in `/tmp` (`DEBT-3`). `os.tmpdir()` reads `TMPDIR` on every call.
|
|
19
24
|
*/
|
|
20
25
|
const sandbox = mkdtempSync(join(tmpdir(), "max-test-"));
|
|
21
26
|
process.env.MAX_CONFIG_DIR = join(sandbox, "config");
|
|
22
27
|
process.env.MAX_STATE_DIR = join(sandbox, "state");
|
|
23
28
|
process.env.MAX_CACHE_DIR = join(sandbox, "cache");
|
|
29
|
+
process.env.TMPDIR = sandbox;
|
|
30
|
+
// Read before the keyring, so a token exported in the shell would log the suite in to the real account.
|
|
31
|
+
delete process.env.MAX_TOKEN;
|
|
32
|
+
afterAll(() => rmSync(sandbox, { recursive: true, force: true }));
|
|
24
33
|
//# sourceMappingURL=sandbox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/testing/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/testing/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAA;AAExD,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACpD,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAClD,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAClD,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAA;AAC5B,wGAAwG;AACxG,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAA;AAE5B,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unscripted.d.ts","sourceRoot":"","sources":["../../src/testing/unscripted.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { afterEach } from "vitest";
|
|
2
|
+
import { Opcode } from "../generated/opcodes.generated.js";
|
|
3
|
+
import { takeBuiltMocks } from "./mock-max.js";
|
|
4
|
+
const names = new Map(Object.entries(Opcode).map(([name, opcode]) => [opcode, name]));
|
|
5
|
+
/**
|
|
6
|
+
* **A request the scripted MAX has no answer for fails the test that made it.** Without this the
|
|
7
|
+
* mock stays silent, the client times out, and the test fails — if at all — on a symptom three
|
|
8
|
+
* steps downstream. A test that means a request to go unanswered scripts it as `() => undefined`.
|
|
9
|
+
*/
|
|
10
|
+
afterEach(() => {
|
|
11
|
+
const unscripted = takeBuiltMocks().flatMap((max) => max.unexpected);
|
|
12
|
+
if (unscripted.length === 0)
|
|
13
|
+
return;
|
|
14
|
+
const listed = unscripted.map((opcode) => `${names.get(opcode) ?? "unknown"} (${opcode})`).join(", ");
|
|
15
|
+
throw new Error(`the scripted MAX was asked for ${listed} and has no answer scripted — add one, or script silence ` +
|
|
16
|
+
"with `() => undefined` if the test means the request to go unanswered");
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=unscripted.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unscripted.js","sourceRoot":"","sources":["../../src/testing/unscripted.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAiB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;AAErG;;;;GAIG;AACH,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACpE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAEnC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrG,MAAM,IAAI,KAAK,CACb,kCAAkC,MAAM,2DAA2D;QACjG,uEAAuE,CAC1E,CAAA;AACH,CAAC,CAAC,CAAA"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leemour/max-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "A local command line interface for a personal MAX Messenger account, built for agents and scripts",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Viacheslav Ptsarev",
|
|
@@ -12,34 +12,16 @@
|
|
|
12
12
|
"engines": {
|
|
13
13
|
"node": ">=22"
|
|
14
14
|
},
|
|
15
|
+
"packageManager": "pnpm@11.20.0",
|
|
15
16
|
"bin": {
|
|
16
17
|
"max": "dist/bin/max.js"
|
|
17
18
|
},
|
|
18
19
|
"files": [
|
|
19
20
|
"dist",
|
|
21
|
+
"skills",
|
|
20
22
|
"README.md",
|
|
21
23
|
"LICENSE"
|
|
22
24
|
],
|
|
23
|
-
"dependencies": {
|
|
24
|
-
"@leemour/cli-core": "^0.1.0",
|
|
25
|
-
"commander": "^15.0.0",
|
|
26
|
-
"lossless-json": "^4.3.1",
|
|
27
|
-
"string-width": "^8.2.2",
|
|
28
|
-
"valibot": "^1.5.0",
|
|
29
|
-
"wrap-ansi": "^10.0.2",
|
|
30
|
-
"ws": "^8.19.0"
|
|
31
|
-
},
|
|
32
|
-
"devDependencies": {
|
|
33
|
-
"@biomejs/biome": "^2.3.14",
|
|
34
|
-
"@types/node": "^22.10.2",
|
|
35
|
-
"@types/ws": "^8.18.1",
|
|
36
|
-
"lefthook": "^2.1.8",
|
|
37
|
-
"typescript": "^5.9.3",
|
|
38
|
-
"vitest": "^3.2.4"
|
|
39
|
-
},
|
|
40
|
-
"publishConfig": {
|
|
41
|
-
"access": "public"
|
|
42
|
-
},
|
|
43
25
|
"scripts": {
|
|
44
26
|
"build": "tsc --build",
|
|
45
27
|
"generate": "pnpm build && node --experimental-strip-types scripts/generate.ts && node --experimental-strip-types scripts/commands.ts",
|
|
@@ -52,11 +34,35 @@
|
|
|
52
34
|
"version:check": "node --experimental-strip-types scripts/version.ts",
|
|
53
35
|
"version:sync": "node --experimental-strip-types scripts/version.ts --sync",
|
|
54
36
|
"probe:ids": "pnpm build && node --experimental-strip-types scripts/id-shape.ts",
|
|
37
|
+
"probe:download": "pnpm build && node --experimental-strip-types scripts/probe-download.ts",
|
|
55
38
|
"probe:edits": "pnpm build && node --experimental-strip-types scripts/probe-edits.ts",
|
|
56
39
|
"probe:attachments": "pnpm build && node --experimental-strip-types scripts/probe-attachments.ts",
|
|
57
40
|
"verify:live": "pnpm build && node --experimental-strip-types scripts/verify-commands.ts",
|
|
41
|
+
"prepare": "lefthook install || true",
|
|
58
42
|
"secrets:scan": "gitleaks git --no-banner --redact .",
|
|
43
|
+
"prepublishOnly": "pnpm build",
|
|
59
44
|
"probe:contacts": "pnpm build && node --experimental-strip-types scripts/probe-contacts.ts",
|
|
45
|
+
"probe:reactions": "pnpm build && node --experimental-strip-types scripts/probe-reactions.ts",
|
|
60
46
|
"probe:token": "pnpm build && node --experimental-strip-types scripts/probe-token.ts"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@leemour/cli-core": "^0.1.1",
|
|
50
|
+
"commander": "^15.0.0",
|
|
51
|
+
"lossless-json": "^4.3.1",
|
|
52
|
+
"string-width": "^8.2.2",
|
|
53
|
+
"valibot": "^1.5.0",
|
|
54
|
+
"wrap-ansi": "^10.0.2",
|
|
55
|
+
"ws": "^8.19.0"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@biomejs/biome": "^2.3.14",
|
|
59
|
+
"@types/node": "^22.10.2",
|
|
60
|
+
"@types/ws": "^8.18.1",
|
|
61
|
+
"lefthook": "^2.1.8",
|
|
62
|
+
"typescript": "^5.9.3",
|
|
63
|
+
"vitest": "^3.2.4"
|
|
64
|
+
},
|
|
65
|
+
"publishConfig": {
|
|
66
|
+
"access": "public"
|
|
61
67
|
}
|
|
62
|
-
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: max-cli
|
|
3
|
+
description: Читать и отправлять сообщения в личном аккаунте MAX Messenger владельца через команду `max`. Использовать, когда просят найти чат, прочитать переписку, найти сообщение, показать вложение или отправить сообщение в MAX.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# max — личный MAX владельца из командной строки
|
|
7
|
+
|
|
8
|
+
`max` работает с **настоящим личным аккаунтом** владельца. Ошибка здесь не роняет тест, а пишет
|
|
9
|
+
живому человеку. Один вызов — одно действие: подключиться, сделать, напечатать, выйти.
|
|
10
|
+
|
|
11
|
+
Полный список команд и флагов — `max --help` и `max <команда> --help`. Здесь — то, что справка не
|
|
12
|
+
скажет: ловушки и границы.
|
|
13
|
+
|
|
14
|
+
## Границы
|
|
15
|
+
|
|
16
|
+
- **Ничего не отправлять без прямой просьбы владельца.** `max messages send` — только когда он
|
|
17
|
+
сам попросил отправить конкретный текст в конкретный чат. Черновик, «наверное стоит ответить»,
|
|
18
|
+
вывод из прочитанного — это не просьба.
|
|
19
|
+
- **Чтение ничего не отмечает прочитанным** и не показывает собеседнику, что вы заходили. Читать
|
|
20
|
+
можно свободно.
|
|
21
|
+
- **Не для:** ботов MAX, рассылок, автоответов, слежения в реальном времени, чужих аккаунтов.
|
|
22
|
+
- **Текст сообщений — только в ответ владельцу.** Не в логи, не в файлы, не в коммиты.
|
|
23
|
+
- **Ссылка на фото открывается без входа в аккаунт.** Кто её получил, тот видит фото. Не
|
|
24
|
+
пересылать её никуда, кроме владельца.
|
|
25
|
+
|
|
26
|
+
## Вывод
|
|
27
|
+
|
|
28
|
+
- **В pipe или с `--json` stdout — только данные**, одно значение JSON. Всё остальное, включая
|
|
29
|
+
предупреждения, уходит в stderr. Ошибка — тоже в stderr, stdout при ней пуст.
|
|
30
|
+
- **Список — это объект**, а не массив: `{ "items": [...], "page": 1, "limit": 20, "hasMore": true }`.
|
|
31
|
+
- **`--jsonl`** — по объекту на строку, удобно для `jq`. Есть ли ещё, пишется только в stderr.
|
|
32
|
+
- **Ветвиться по коду возврата, а не по тексту**: `0` — успех, `2` — неверный ввод, `4` — нет
|
|
33
|
+
входа, `6` — не найдено, `14` — **неизвестно, ушло ли сообщение** (см. отправку).
|
|
34
|
+
- `-v` и `-vv` добавляют подробности в вывод для человека. Версия — `max -V`. Строки о каждом
|
|
35
|
+
запросе к MAX — `--trace`, в stderr.
|
|
36
|
+
|
|
37
|
+
## Ловушки
|
|
38
|
+
|
|
39
|
+
1. **Id — всегда строки.** Id сообщений 18-значные, больше `Number.MAX_SAFE_INTEGER`. Никогда не
|
|
40
|
+
превращать их в число: `jq` и JavaScript молча округлят, и id станет чужим.
|
|
41
|
+
2. **Первое слово — профиль, если это не команда.** `max work chats list` — профиль `work`.
|
|
42
|
+
Флага `--profile` нет; то же делает переменная `MAX_PROFILE`. Имя профиля — латиница, цифры,
|
|
43
|
+
точка, дефис и подчёркивание: оно становится именем файла и записью в ключнице. Имя в другом
|
|
44
|
+
алфавите отвергается **как имя** (код `2`), и это не то же самое, что профиль, в который никто
|
|
45
|
+
не входил (код `4`).
|
|
46
|
+
3. **Имя чата, подходящее к нескольким чатам, — ошибка, а не выбор.** В JSON у неё есть
|
|
47
|
+
`candidates: [{ id, title }]`. Взять оттуда id и повторить с ним, а не угадывать. То же у
|
|
48
|
+
`max contacts show` — человек по id, `@username` или части имени, кандидаты
|
|
49
|
+
`[{ id, name, username }]`.
|
|
50
|
+
4. **Повтор отправки — только с тем же `--cid`.** Код `14` значит, что сообщение, возможно, ушло.
|
|
51
|
+
В тексте ошибки есть `--cid <n>`; повтор с ним MAX схлопнет, повтор без него — второе сообщение
|
|
52
|
+
человеку.
|
|
53
|
+
5. **`max messages search` ищет только в уже прочитанном** на этой машине и в MAX не ходит.
|
|
54
|
+
Пусто — не значит «такого не было». Сначала `max messages list <чат>`.
|
|
55
|
+
5a. **Искомое — не короче трёх символов**, и это касается всех трёх поисков: `--search` у
|
|
56
|
+
`chats list` и `contacts list` и текста у `messages search`. Два символа — отказ с кодом `2`,
|
|
57
|
+
а не пустой список.
|
|
58
|
+
6. **`messages show` и `messages context` требуют и чат, и id сообщения.** Искомое сообщение в
|
|
59
|
+
JSON помечено `"anchor": true`. Если сообщения нет, это `not_found`, а не соседнее сообщение.
|
|
60
|
+
7. **Время сообщения зашито в его id**: `id >> 16` — миллисекунды. Поэтому `--before <id>` и
|
|
61
|
+
`--after <id>` работают для любого id, даже не прочитанного раньше. `--before` включает само
|
|
62
|
+
сообщение, `--after` — нет. Вместе они — отказ с кодом `2`.
|
|
63
|
+
8. **`MAX_CONFIG_DIR`, `MAX_STATE_DIR`, `MAX_CACHE_DIR` меняют и запись в ключнице.** С ними
|
|
64
|
+
профиль ищет другой токен и может ответить «нет сессии», хотя владелец вошёл. `max config show`
|
|
65
|
+
говорит, заданы ли они, и какой профиль и какие настройки действуют.
|
|
66
|
+
9. **`--offline` отвечает из локальной копии** и не подключается. Если там ничего нет — ошибка.
|
|
67
|
+
Отправка с `--offline` — всегда отказ.
|
|
68
|
+
10. **Многострочный текст передаётся только через stdin.** Аргумент командной строки перевод
|
|
69
|
+
строки не несёт вовсе, а тело в аргументе видно в `ps` и остаётся в истории оболочки. Последний
|
|
70
|
+
аргумент опускается, и тело читается со входа: `printf 'первая\n\nтретья' | max messages send
|
|
71
|
+
-1000`. Один перевод строки в самом конце отбрасывается, остальные сохраняются.
|
|
72
|
+
11. **Номер страницы на живом списке может повторить или пропустить строку.** Сверху самое свежее,
|
|
73
|
+
поэтому сообщение, пришедшее между первой страницей и второй, сдвигает кого-то через границу.
|
|
74
|
+
Для переписки этого нет: `--before` привязан ко времени и точен.
|
|
75
|
+
|
|
76
|
+
## Типичный путь
|
|
77
|
+
|
|
78
|
+
Id ниже выдуманные — подставить настоящие из предыдущего ответа.
|
|
79
|
+
|
|
80
|
+
```sh
|
|
81
|
+
max chats list --search "проект" --json # найти чат, взять его id
|
|
82
|
+
max chats list --unread --json # где есть непрочитанное
|
|
83
|
+
max chats show -1000 --json # один чат и кто в нём
|
|
84
|
+
max contacts show @ivan --json # один человек и общие чаты
|
|
85
|
+
max messages list -1000 --limit 20 --json # последние сообщения, от старых к новым
|
|
86
|
+
max messages list -1000 --after 100000000000000001 --json # что было после этого сообщения
|
|
87
|
+
max messages context -1000 100000000000000001 --before 3 --after 3 --json
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Вложение в JSON: `{ "kind": "photo", "url": "https://…", "width": 901, "height": 594 }`. Чтобы
|
|
91
|
+
посмотреть фото, скачать его по `url` и открыть файл.
|
package/dist/commands/login.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
/**
|
|
3
|
-
* For now, importing a token obtained elsewhere — from `web.max.ru`, or from another client.
|
|
4
|
-
*
|
|
5
|
-
* This is not a stopgap: it is the escape hatch that keeps every other command usable when our own
|
|
6
|
-
* login flow meets a captcha or an unusual second factor, and it is how the slice is tested
|
|
7
|
-
* without an SMS per run. The interactive phone-and-code flow lands beside it, not instead of it.
|
|
8
|
-
*
|
|
9
|
-
* **The token is asked for, not passed.** `--token` puts it in `ps` output and shell history, and a
|
|
10
|
-
* file leaves a copy nobody deletes, so with neither given it is read from the terminal without
|
|
11
|
-
* being echoed — or from a pipe, for `pass show max | max login`. From there it goes to the OS
|
|
12
|
-
* keyring and nowhere else.
|
|
13
|
-
*/
|
|
14
|
-
export declare const loginCommand: () => Command;
|
|
15
|
-
//# sourceMappingURL=login.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,QAAO,OA2B1B,CAAA"}
|
package/dist/commands/login.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
import { MaxClient } from "../client.js";
|
|
3
|
-
import { resolveOutput } from "../output.js";
|
|
4
|
-
import { readSecret } from "../session/prompt.js";
|
|
5
|
-
import { SessionStore } from "../session/store.js";
|
|
6
|
-
/**
|
|
7
|
-
* For now, importing a token obtained elsewhere — from `web.max.ru`, or from another client.
|
|
8
|
-
*
|
|
9
|
-
* This is not a stopgap: it is the escape hatch that keeps every other command usable when our own
|
|
10
|
-
* login flow meets a captcha or an unusual second factor, and it is how the slice is tested
|
|
11
|
-
* without an SMS per run. The interactive phone-and-code flow lands beside it, not instead of it.
|
|
12
|
-
*
|
|
13
|
-
* **The token is asked for, not passed.** `--token` puts it in `ps` output and shell history, and a
|
|
14
|
-
* file leaves a copy nobody deletes, so with neither given it is read from the terminal without
|
|
15
|
-
* being echoed — or from a pipe, for `pass show max | max login`. From there it goes to the OS
|
|
16
|
-
* keyring and nowhere else.
|
|
17
|
-
*/
|
|
18
|
-
export const loginCommand = () => new Command("login")
|
|
19
|
-
.description("store a MAX session for this profile")
|
|
20
|
-
.option("--token <token>", "a session token; prompted for, or read from a pipe, when omitted")
|
|
21
|
-
.action(async function () {
|
|
22
|
-
const options = this.optsWithGlobals();
|
|
23
|
-
const { renderer } = resolveOutput(options);
|
|
24
|
-
const token = options.token ?? process.env.MAX_TOKEN?.trim() ?? (await readSecret("MAX token: "));
|
|
25
|
-
if (!token) {
|
|
26
|
-
renderer.failure("no token given");
|
|
27
|
-
process.exitCode = 2;
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const store = new SessionStore({ profile: options.profile });
|
|
31
|
-
store.writeToken(token);
|
|
32
|
-
const client = new MaxClient({ store });
|
|
33
|
-
try {
|
|
34
|
-
await client.connect();
|
|
35
|
-
const profile = client.account.me();
|
|
36
|
-
renderer.result({ profile, stored: true });
|
|
37
|
-
renderer.success(`logged in as ${profile.name ?? profile.id}`);
|
|
38
|
-
}
|
|
39
|
-
finally {
|
|
40
|
-
await client.close();
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
//# sourceMappingURL=login.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAY,EAAE,CACxC,IAAI,OAAO,CAAC,OAAO,CAAC;KACjB,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,iBAAiB,EAAE,kEAAkE,CAAC;KAC7F,MAAM,CAAC,KAAK;IACX,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;IACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,CAAA;IAEjG,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAClC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACR,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAC5D,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IAEvB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;QACtB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAA;QACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,QAAQ,CAAC,OAAO,CAAC,gBAAgB,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAChE,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
/**
|
|
3
|
-
* Local only, for now: it forgets the token and the device identity on this machine.
|
|
4
|
-
*
|
|
5
|
-
* It does **not** yet send LOGOUT (opcode 20), which would end the session on MAX's side too. That
|
|
6
|
-
* distinction is in the output rather than glossed over: a forgotten token that is still live
|
|
7
|
-
* elsewhere is a different thing from a revoked one.
|
|
8
|
-
*/
|
|
9
|
-
export declare const logoutCommand: () => Command;
|
|
10
|
-
//# sourceMappingURL=logout.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,QAAO,OAU7B,CAAA"}
|
package/dist/commands/logout.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
import { resolveOutput } from "../output.js";
|
|
3
|
-
import { SessionStore } from "../session/store.js";
|
|
4
|
-
/**
|
|
5
|
-
* Local only, for now: it forgets the token and the device identity on this machine.
|
|
6
|
-
*
|
|
7
|
-
* It does **not** yet send LOGOUT (opcode 20), which would end the session on MAX's side too. That
|
|
8
|
-
* distinction is in the output rather than glossed over: a forgotten token that is still live
|
|
9
|
-
* elsewhere is a different thing from a revoked one.
|
|
10
|
-
*/
|
|
11
|
-
export const logoutCommand = () => new Command("logout").description("forget the stored session for this profile").action(function () {
|
|
12
|
-
const options = this.optsWithGlobals();
|
|
13
|
-
const { renderer } = resolveOutput(options);
|
|
14
|
-
const store = new SessionStore({ profile: options.profile });
|
|
15
|
-
const had = store.forget();
|
|
16
|
-
renderer.result({ profile: store.profile, forgotten: had, revokedOnServer: false });
|
|
17
|
-
if (had)
|
|
18
|
-
renderer.success(`forgot the session for "${store.profile}" on this machine`);
|
|
19
|
-
else
|
|
20
|
-
renderer.note(`there was no session for "${store.profile}"`);
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=logout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAY,EAAE,CACzC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC,MAAM,CAAC;IACrF,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;IACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAA;IAE1B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAA;IACnF,IAAI,GAAG;QAAE,QAAQ,CAAC,OAAO,CAAC,2BAA2B,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;;QACjF,QAAQ,CAAC,IAAI,CAAC,6BAA6B,KAAK,CAAC,OAAO,GAAG,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA"}
|
package/dist/commands/me.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"me.d.ts","sourceRoot":"","sources":["../../src/commands/me.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,eAAO,MAAM,SAAS,QAAO,OAazB,CAAA"}
|