@leemour/max-cli 0.4.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/dist/bin/max.js +0 -0
- package/dist/cache/store.d.ts +14 -8
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +29 -5
- package/dist/cache/store.js.map +1 -1
- package/dist/client.d.ts +37 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +164 -27
- package/dist/client.js.map +1 -1
- package/dist/commands/chats.d.ts.map +1 -1
- package/dist/commands/chats.js +20 -0
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +27 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +18 -0
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +1 -0
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +49 -2
- package/dist/commands/messages.js.map +1 -1
- package/dist/config.d.ts +45 -12
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +82 -16
- package/dist/config.js.map +1 -1
- package/dist/domain/map.js +6 -1
- package/dist/domain/map.js.map +1 -1
- package/dist/domain/models.d.ts +22 -1
- package/dist/domain/models.d.ts.map +1 -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/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 +4 -0
- 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/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 +27 -22
- package/skills/max-cli/SKILL.md +11 -3
- 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.
|
|
@@ -15,6 +18,7 @@ export const mockMax = ({ answers, refuse = {} }) => {
|
|
|
15
18
|
return socket;
|
|
16
19
|
};
|
|
17
20
|
const state = { createSocket, sent: [], unexpected: [], closed: false };
|
|
21
|
+
built.push(state);
|
|
18
22
|
const socket = new (class extends EventEmitter {
|
|
19
23
|
readyState = 1;
|
|
20
24
|
OPEN = 1;
|
|
@@ -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
|
@@ -27,5 +27,7 @@ process.env.MAX_CONFIG_DIR = join(sandbox, "config");
|
|
|
27
27
|
process.env.MAX_STATE_DIR = join(sandbox, "state");
|
|
28
28
|
process.env.MAX_CACHE_DIR = join(sandbox, "cache");
|
|
29
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;
|
|
30
32
|
afterAll(() => rmSync(sandbox, { recursive: true, force: true }));
|
|
31
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,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;AAE5B,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,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,6 +12,7 @@
|
|
|
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
|
},
|
|
@@ -21,26 +22,6 @@
|
|
|
21
22
|
"README.md",
|
|
22
23
|
"LICENSE"
|
|
23
24
|
],
|
|
24
|
-
"dependencies": {
|
|
25
|
-
"@leemour/cli-core": "^0.1.0",
|
|
26
|
-
"commander": "^15.0.0",
|
|
27
|
-
"lossless-json": "^4.3.1",
|
|
28
|
-
"string-width": "^8.2.2",
|
|
29
|
-
"valibot": "^1.5.0",
|
|
30
|
-
"wrap-ansi": "^10.0.2",
|
|
31
|
-
"ws": "^8.19.0"
|
|
32
|
-
},
|
|
33
|
-
"devDependencies": {
|
|
34
|
-
"@biomejs/biome": "^2.3.14",
|
|
35
|
-
"@types/node": "^22.10.2",
|
|
36
|
-
"@types/ws": "^8.18.1",
|
|
37
|
-
"lefthook": "^2.1.8",
|
|
38
|
-
"typescript": "^5.9.3",
|
|
39
|
-
"vitest": "^3.2.4"
|
|
40
|
-
},
|
|
41
|
-
"publishConfig": {
|
|
42
|
-
"access": "public"
|
|
43
|
-
},
|
|
44
25
|
"scripts": {
|
|
45
26
|
"build": "tsc --build",
|
|
46
27
|
"generate": "pnpm build && node --experimental-strip-types scripts/generate.ts && node --experimental-strip-types scripts/commands.ts",
|
|
@@ -53,11 +34,35 @@
|
|
|
53
34
|
"version:check": "node --experimental-strip-types scripts/version.ts",
|
|
54
35
|
"version:sync": "node --experimental-strip-types scripts/version.ts --sync",
|
|
55
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",
|
|
56
38
|
"probe:edits": "pnpm build && node --experimental-strip-types scripts/probe-edits.ts",
|
|
57
39
|
"probe:attachments": "pnpm build && node --experimental-strip-types scripts/probe-attachments.ts",
|
|
58
40
|
"verify:live": "pnpm build && node --experimental-strip-types scripts/verify-commands.ts",
|
|
41
|
+
"prepare": "lefthook install || true",
|
|
59
42
|
"secrets:scan": "gitleaks git --no-banner --redact .",
|
|
43
|
+
"prepublishOnly": "pnpm build",
|
|
60
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",
|
|
61
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"
|
|
62
67
|
}
|
|
63
|
-
}
|
|
68
|
+
}
|
package/skills/max-cli/SKILL.md
CHANGED
|
@@ -44,7 +44,9 @@ description: Читать и отправлять сообщения в личн
|
|
|
44
44
|
алфавите отвергается **как имя** (код `2`), и это не то же самое, что профиль, в который никто
|
|
45
45
|
не входил (код `4`).
|
|
46
46
|
3. **Имя чата, подходящее к нескольким чатам, — ошибка, а не выбор.** В JSON у неё есть
|
|
47
|
-
`candidates: [{ id, title }]`. Взять оттуда id и повторить с ним, а не угадывать.
|
|
47
|
+
`candidates: [{ id, title }]`. Взять оттуда id и повторить с ним, а не угадывать. То же у
|
|
48
|
+
`max contacts show` — человек по id, `@username` или части имени, кандидаты
|
|
49
|
+
`[{ id, name, username }]`.
|
|
48
50
|
4. **Повтор отправки — только с тем же `--cid`.** Код `14` значит, что сообщение, возможно, ушло.
|
|
49
51
|
В тексте ошибки есть `--cid <n>`; повтор с ним MAX схлопнет, повтор без него — второе сообщение
|
|
50
52
|
человеку.
|
|
@@ -55,12 +57,14 @@ description: Читать и отправлять сообщения в личн
|
|
|
55
57
|
а не пустой список.
|
|
56
58
|
6. **`messages show` и `messages context` требуют и чат, и id сообщения.** Искомое сообщение в
|
|
57
59
|
JSON помечено `"anchor": true`. Если сообщения нет, это `not_found`, а не соседнее сообщение.
|
|
58
|
-
7. **Время сообщения зашито в его id**: `id >> 16` — миллисекунды. Поэтому `--before <id>`
|
|
59
|
-
|
|
60
|
+
7. **Время сообщения зашито в его id**: `id >> 16` — миллисекунды. Поэтому `--before <id>` и
|
|
61
|
+
`--after <id>` работают для любого id, даже не прочитанного раньше. `--before` включает само
|
|
62
|
+
сообщение, `--after` — нет. Вместе они — отказ с кодом `2`.
|
|
60
63
|
8. **`MAX_CONFIG_DIR`, `MAX_STATE_DIR`, `MAX_CACHE_DIR` меняют и запись в ключнице.** С ними
|
|
61
64
|
профиль ищет другой токен и может ответить «нет сессии», хотя владелец вошёл. `max config show`
|
|
62
65
|
говорит, заданы ли они, и какой профиль и какие настройки действуют.
|
|
63
66
|
9. **`--offline` отвечает из локальной копии** и не подключается. Если там ничего нет — ошибка.
|
|
67
|
+
Отправка с `--offline` — всегда отказ.
|
|
64
68
|
10. **Многострочный текст передаётся только через stdin.** Аргумент командной строки перевод
|
|
65
69
|
строки не несёт вовсе, а тело в аргументе видно в `ps` и остаётся в истории оболочки. Последний
|
|
66
70
|
аргумент опускается, и тело читается со входа: `printf 'первая\n\nтретья' | max messages send
|
|
@@ -75,7 +79,11 @@ Id ниже выдуманные — подставить настоящие и
|
|
|
75
79
|
|
|
76
80
|
```sh
|
|
77
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 # один человек и общие чаты
|
|
78
85
|
max messages list -1000 --limit 20 --json # последние сообщения, от старых к новым
|
|
86
|
+
max messages list -1000 --after 100000000000000001 --json # что было после этого сообщения
|
|
79
87
|
max messages context -1000 100000000000000001 --before 3 --after 3 --json
|
|
80
88
|
```
|
|
81
89
|
|
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"}
|
package/dist/commands/me.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
import { MaxClient } from "../client.js";
|
|
3
|
-
import { resolveOutput } from "../output.js";
|
|
4
|
-
import { SessionStore } from "../session/store.js";
|
|
5
|
-
export const meCommand = () => new Command("me").description("who this profile is logged in as").action(async function () {
|
|
6
|
-
const options = this.optsWithGlobals();
|
|
7
|
-
const { renderer } = resolveOutput(options);
|
|
8
|
-
const client = new MaxClient({ store: new SessionStore({ profile: options.profile }) });
|
|
9
|
-
try {
|
|
10
|
-
await client.connect();
|
|
11
|
-
renderer.result(client.account.me());
|
|
12
|
-
}
|
|
13
|
-
finally {
|
|
14
|
-
// Nothing below this line: an open socket keeps the process alive after the answer printed.
|
|
15
|
-
await client.close();
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
//# sourceMappingURL=me.js.map
|
package/dist/commands/me.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"me.js","sourceRoot":"","sources":["../../src/commands/me.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,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAY,EAAE,CACrC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC,MAAM,CAAC,KAAK;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;IACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;IAEvF,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;QACtB,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IACtC,CAAC;YAAS,CAAC;QACT,4FAA4F;QAC5F,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;AACH,CAAC,CAAC,CAAA"}
|
package/dist/commands/send.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
/**
|
|
3
|
-
* One message, one command, no retry.
|
|
4
|
-
*
|
|
5
|
-
* There is no `--dry-run` here: the target and the text are both in the line the person typed, so
|
|
6
|
-
* a preview would restate the command back at them (REQUIREMENTS §21). What this command does owe
|
|
7
|
-
* the caller is honesty about an outcome it does not know — see `MaxClient.sendMessage`.
|
|
8
|
-
*/
|
|
9
|
-
export declare const sendCommand: () => Command;
|
|
10
|
-
//# sourceMappingURL=send.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,QAAO,OAoBzB,CAAA"}
|
package/dist/commands/send.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
import { MaxClient } from "../client.js";
|
|
3
|
-
import { resolveOutput } from "../output.js";
|
|
4
|
-
import { SessionStore } from "../session/store.js";
|
|
5
|
-
/**
|
|
6
|
-
* One message, one command, no retry.
|
|
7
|
-
*
|
|
8
|
-
* There is no `--dry-run` here: the target and the text are both in the line the person typed, so
|
|
9
|
-
* a preview would restate the command back at them (REQUIREMENTS §21). What this command does owe
|
|
10
|
-
* the caller is honesty about an outcome it does not know — see `MaxClient.sendMessage`.
|
|
11
|
-
*/
|
|
12
|
-
export const sendCommand = () => new Command("send")
|
|
13
|
-
.argument("<chat>", "chat id, or part of a chat name")
|
|
14
|
-
.argument("<text>", "what to say")
|
|
15
|
-
.description("send one text message")
|
|
16
|
-
.option("--cid <n>", "reuse a client id from an earlier ambiguous send; MAX collapses the duplicate", (value) => Number.parseInt(value, 10))
|
|
17
|
-
.action(async function (chat, text) {
|
|
18
|
-
const options = this.optsWithGlobals();
|
|
19
|
-
const { renderer } = resolveOutput(options);
|
|
20
|
-
const client = new MaxClient({ store: new SessionStore({ profile: options.profile }) });
|
|
21
|
-
try {
|
|
22
|
-
await client.connect();
|
|
23
|
-
const chatId = await client.chats.resolve(chat);
|
|
24
|
-
renderer.result(await client.messages.send(chatId, text, options.cid === undefined ? {} : { cid: options.cid }));
|
|
25
|
-
}
|
|
26
|
-
finally {
|
|
27
|
-
await client.close();
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
//# sourceMappingURL=send.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.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,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAY,EAAE,CACvC,IAAI,OAAO,CAAC,MAAM,CAAC;KAChB,QAAQ,CAAC,QAAQ,EAAE,iCAAiC,CAAC;KACrD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;KACjC,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,WAAW,EAAE,+EAA+E,EAAE,CAAC,KAAK,EAAE,EAAE,CAC9G,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3B;KACA,MAAM,CAAC,KAAK,WAA0B,IAAY,EAAE,IAAY;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;IACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;IAEvF,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;QACtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/C,QAAQ,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAClH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;AACH,CAAC,CAAC,CAAA"}
|