@leemour/max-cli 0.6.0 → 0.7.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 +8 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +4 -4
- package/dist/cache/index.js.map +1 -1
- package/dist/client.d.ts +178 -9
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +764 -34
- package/dist/client.js.map +1 -1
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +71 -3
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/chats.d.ts.map +1 -1
- package/dist/commands/chats.js +159 -0
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/complete.d.ts +10 -0
- package/dist/commands/complete.d.ts.map +1 -0
- package/dist/commands/complete.js +89 -0
- package/dist/commands/complete.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +4 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contacts.d.ts +3 -0
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +85 -0
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/context.d.ts +8 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +26 -6
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/folders.d.ts +4 -0
- package/dist/commands/folders.d.ts.map +1 -0
- package/dist/commands/folders.js +76 -0
- package/dist/commands/folders.js.map +1 -0
- package/dist/commands/inbox.js +2 -2
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +17 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +84 -2
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/reactions.d.ts.map +1 -1
- package/dist/commands/reactions.js +17 -0
- package/dist/commands/reactions.js.map +1 -1
- package/dist/commands/serve.d.ts +10 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +50 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +4 -1
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +53 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/watch.d.ts +9 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +68 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config.d.ts +16 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +27 -4
- package/dist/config.js.map +1 -1
- package/dist/domain/map.d.ts +8 -1
- package/dist/domain/map.d.ts.map +1 -1
- package/dist/domain/map.js +42 -1
- package/dist/domain/map.js.map +1 -1
- package/dist/domain/models.d.ts +47 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/models.js.map +1 -1
- package/dist/generated/client.generated.d.ts +26 -0
- package/dist/generated/client.generated.d.ts.map +1 -1
- package/dist/generated/client.generated.js +26 -0
- package/dist/generated/client.generated.js.map +1 -1
- package/dist/generated/opcodes.generated.d.ts +24 -5
- package/dist/generated/opcodes.generated.d.ts.map +1 -1
- package/dist/generated/opcodes.generated.js +24 -5
- package/dist/generated/opcodes.generated.js.map +1 -1
- package/dist/generated/operations.generated.d.ts +163 -6
- package/dist/generated/operations.generated.d.ts.map +1 -1
- package/dist/generated/operations.generated.js +27 -4
- package/dist/generated/operations.generated.js.map +1 -1
- package/dist/mcp/confirm.d.ts +24 -0
- package/dist/mcp/confirm.d.ts.map +1 -0
- package/dist/mcp/confirm.js +53 -0
- package/dist/mcp/confirm.js.map +1 -0
- package/dist/mcp/instructions.d.ts +10 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +25 -0
- package/dist/mcp/instructions.js.map +1 -0
- package/dist/mcp/server.d.ts +23 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +38 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +28 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +91 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/tools.d.ts +8 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +274 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +17 -0
- package/dist/program.js.map +1 -1
- package/dist/protocol/connection.d.ts +10 -8
- package/dist/protocol/connection.d.ts.map +1 -1
- package/dist/protocol/connection.js +64 -7
- package/dist/protocol/connection.js.map +1 -1
- package/dist/protocol/frame.d.ts +2 -1
- package/dist/protocol/frame.d.ts.map +1 -1
- package/dist/protocol/frame.js.map +1 -1
- package/dist/rendering/messages.d.ts.map +1 -1
- package/dist/rendering/messages.js +17 -9
- package/dist/rendering/messages.js.map +1 -1
- package/dist/sends/guard.d.ts +3 -2
- package/dist/sends/guard.d.ts.map +1 -1
- package/dist/sends/guard.js +14 -10
- package/dist/sends/guard.js.map +1 -1
- package/dist/sends/journal.d.ts +15 -2
- package/dist/sends/journal.d.ts.map +1 -1
- package/dist/sends/journal.js.map +1 -1
- package/dist/server/lines.d.ts +9 -0
- package/dist/server/lines.d.ts.map +1 -0
- package/dist/server/lines.js +25 -0
- package/dist/server/lines.js.map +1 -0
- package/dist/server/server-connection.d.ts +35 -0
- package/dist/server/server-connection.d.ts.map +1 -0
- package/dist/server/server-connection.js +195 -0
- package/dist/server/server-connection.js.map +1 -0
- package/dist/server/server.d.ts +62 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +297 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/start.d.ts +12 -0
- package/dist/server/start.d.ts.map +1 -0
- package/dist/server/start.js +41 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/subscribe.d.ts +9 -0
- package/dist/server/subscribe.d.ts.map +1 -0
- package/dist/server/subscribe.js +26 -0
- package/dist/server/subscribe.js.map +1 -0
- package/dist/session/browser.d.ts +1 -1
- package/dist/session/browser.d.ts.map +1 -1
- package/dist/session/browser.js +86 -59
- package/dist/session/browser.js.map +1 -1
- package/dist/session/store.d.ts +2 -0
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +4 -0
- package/dist/session/store.js.map +1 -1
- package/dist/spec/define.d.ts.map +1 -1
- package/dist/spec/define.js +14 -1
- package/dist/spec/define.js.map +1 -1
- package/dist/spec/index.d.ts.map +1 -1
- package/dist/spec/index.js +28 -5
- package/dist/spec/index.js.map +1 -1
- package/dist/spec/operations/account.d.ts +20 -0
- package/dist/spec/operations/account.d.ts.map +1 -0
- package/dist/spec/operations/account.js +62 -0
- package/dist/spec/operations/account.js.map +1 -0
- package/dist/spec/operations/chats.d.ts +54 -0
- package/dist/spec/operations/chats.d.ts.map +1 -1
- package/dist/spec/operations/chats.js +121 -0
- package/dist/spec/operations/chats.js.map +1 -1
- package/dist/spec/operations/contacts.d.ts +19 -1
- package/dist/spec/operations/contacts.d.ts.map +1 -1
- package/dist/spec/operations/contacts.js +49 -6
- package/dist/spec/operations/contacts.js.map +1 -1
- package/dist/spec/operations/folders.d.ts +24 -0
- package/dist/spec/operations/folders.d.ts.map +1 -0
- package/dist/spec/operations/folders.js +64 -0
- package/dist/spec/operations/folders.js.map +1 -0
- package/dist/spec/operations/messages.d.ts +44 -6
- package/dist/spec/operations/messages.d.ts.map +1 -1
- package/dist/spec/operations/messages.js +86 -17
- package/dist/spec/operations/messages.js.map +1 -1
- package/dist/spec/operations/session.d.ts +7 -0
- package/dist/spec/operations/session.d.ts.map +1 -1
- package/dist/spec/operations/session.js +17 -0
- package/dist/spec/operations/session.js.map +1 -1
- package/dist/spec/operations/uploads.d.ts +18 -0
- package/dist/spec/operations/uploads.d.ts.map +1 -0
- package/dist/spec/operations/uploads.js +35 -0
- package/dist/spec/operations/uploads.js.map +1 -0
- package/dist/testing/mock-max.d.ts +12 -2
- package/dist/testing/mock-max.d.ts.map +1 -1
- package/dist/testing/mock-max.js +15 -2
- package/dist/testing/mock-max.js.map +1 -1
- package/dist/testing/sandbox.js +2 -0
- package/dist/testing/sandbox.js.map +1 -1
- package/dist/update.d.ts +36 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +70 -0
- package/dist/update.js.map +1 -0
- package/dist/upload.d.ts +10 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +61 -0
- package/dist/upload.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +12 -3
- package/skills/max-cli/SKILL.md +10 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { MaxClient } from "../client.js";
|
|
2
|
+
import type { CommandContext } from "../commands/context.js";
|
|
3
|
+
export interface SessionOptions {
|
|
4
|
+
/** Close the connection after this long without a call. */
|
|
5
|
+
idleMs?: number;
|
|
6
|
+
/** Log in again after this long, whatever the traffic: the chat list is what the login answered. */
|
|
7
|
+
maxAgeMs?: number;
|
|
8
|
+
now?: () => number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* **One connection for the whole agent session, and never for long** (`NEED-152`).
|
|
12
|
+
*
|
|
13
|
+
* The CLI logs in once per command. Here the process outlives the call, so the connection is kept
|
|
14
|
+
* between calls — and dropped after `idleMs` of quiet, after `maxAgeMs` whatever the traffic, and
|
|
15
|
+
* after any failure that may have been the connection's. The age limit is there because a login
|
|
16
|
+
* answers the chat list and the profile once; without it an agent that keeps talking would read a
|
|
17
|
+
* snapshot that never moves.
|
|
18
|
+
*
|
|
19
|
+
* Calls run **one at a time**. A client may send read-only calls in parallel, and one socket with
|
|
20
|
+
* one `seq` space is not the place to find out whether MAX minds.
|
|
21
|
+
*/
|
|
22
|
+
export declare class MaxSession {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(context: CommandContext, { idleMs, maxAgeMs, now }?: SessionOptions);
|
|
25
|
+
use<T>(name: string, body: (client: MaxClient) => Promise<T>): Promise<T>;
|
|
26
|
+
close(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAI5D,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oGAAoG;IACpG,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAWD;;;;;;;;;;;GAWG;AACH,qBAAa,UAAU;;gBAWT,OAAO,EAAE,cAAc,EAAE,EAAE,MAAgB,EAAE,QAAkB,EAAE,GAAc,EAAE,GAAE,cAAmB;IAOlH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAMnE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAiD7B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { isCliError } from "@leemour/cli-core";
|
|
2
|
+
import { openProfileCache } from "../cache/index.js";
|
|
3
|
+
/** The caller's mistake, not the connection's — nothing about the socket is in doubt after these. */
|
|
4
|
+
const HARMLESS = new Set(["validation_error", "not_found", "permission_error", "confirmation_required", "rate_limited"]);
|
|
5
|
+
/**
|
|
6
|
+
* **One connection for the whole agent session, and never for long** (`NEED-152`).
|
|
7
|
+
*
|
|
8
|
+
* The CLI logs in once per command. Here the process outlives the call, so the connection is kept
|
|
9
|
+
* between calls — and dropped after `idleMs` of quiet, after `maxAgeMs` whatever the traffic, and
|
|
10
|
+
* after any failure that may have been the connection's. The age limit is there because a login
|
|
11
|
+
* answers the chat list and the profile once; without it an agent that keeps talking would read a
|
|
12
|
+
* snapshot that never moves.
|
|
13
|
+
*
|
|
14
|
+
* Calls run **one at a time**. A client may send read-only calls in parallel, and one socket with
|
|
15
|
+
* one `seq` space is not the place to find out whether MAX minds.
|
|
16
|
+
*/
|
|
17
|
+
export class MaxSession {
|
|
18
|
+
#context;
|
|
19
|
+
#idleMs;
|
|
20
|
+
#maxAgeMs;
|
|
21
|
+
#now;
|
|
22
|
+
#held;
|
|
23
|
+
#idle;
|
|
24
|
+
#queue = Promise.resolve();
|
|
25
|
+
#events = () => { };
|
|
26
|
+
#closed = false;
|
|
27
|
+
constructor(context, { idleMs = 120_000, maxAgeMs = 300_000, now = Date.now } = {}) {
|
|
28
|
+
this.#context = context;
|
|
29
|
+
this.#idleMs = idleMs;
|
|
30
|
+
this.#maxAgeMs = maxAgeMs;
|
|
31
|
+
this.#now = now;
|
|
32
|
+
}
|
|
33
|
+
use(name, body) {
|
|
34
|
+
const turn = this.#queue.then(() => this.#call(name, body));
|
|
35
|
+
this.#queue = turn.catch(() => { });
|
|
36
|
+
return turn;
|
|
37
|
+
}
|
|
38
|
+
async close() {
|
|
39
|
+
this.#closed = true;
|
|
40
|
+
await this.#queue;
|
|
41
|
+
await this.#release();
|
|
42
|
+
}
|
|
43
|
+
async #call(name, body) {
|
|
44
|
+
if (this.#closed)
|
|
45
|
+
throw new Error("the MCP server is shutting down");
|
|
46
|
+
clearTimeout(this.#idle);
|
|
47
|
+
try {
|
|
48
|
+
return await this.#context.run(name, async (events) => {
|
|
49
|
+
this.#events = events ?? (() => { });
|
|
50
|
+
return body(await this.#hold());
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (!(isCliError(error) && HARMLESS.has(error.code)))
|
|
55
|
+
await this.#release();
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
this.#events = () => { };
|
|
60
|
+
if (this.#held) {
|
|
61
|
+
this.#idle = setTimeout(() => void this.#release(), this.#idleMs);
|
|
62
|
+
this.#idle.unref();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async #hold() {
|
|
67
|
+
if (this.#held && this.#now() - this.#held.openedAt >= this.#maxAgeMs)
|
|
68
|
+
await this.#release();
|
|
69
|
+
if (this.#held)
|
|
70
|
+
return this.#held.client;
|
|
71
|
+
const { settings, renderer, createClient } = this.#context;
|
|
72
|
+
const cache = await openProfileCache(settings.profile, { onProblem: (message) => renderer.note(message) });
|
|
73
|
+
const client = createClient({ events: (event) => this.#events(event), ...(cache ? { cache } : {}) });
|
|
74
|
+
this.#held = { client, cache, openedAt: this.#now() };
|
|
75
|
+
return client;
|
|
76
|
+
}
|
|
77
|
+
async #release() {
|
|
78
|
+
clearTimeout(this.#idle);
|
|
79
|
+
const held = this.#held;
|
|
80
|
+
this.#held = undefined;
|
|
81
|
+
if (!held)
|
|
82
|
+
return;
|
|
83
|
+
try {
|
|
84
|
+
await held.client.close();
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
held.cache?.close();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type McpServer } from "@modelcontextprotocol/server";
|
|
2
|
+
import type { MaxSession } from "./session.js";
|
|
3
|
+
export declare const registerTools: (server: McpServer, session: MaxSession, { allowSend, confirmSend, defaultLimit }: {
|
|
4
|
+
allowSend: boolean;
|
|
5
|
+
confirmSend?: boolean;
|
|
6
|
+
defaultLimit: number;
|
|
7
|
+
}) => void;
|
|
8
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,SAAS,EAGf,MAAM,8BAA8B,CAAA;AAOrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAgS9C,eAAO,MAAM,aAAa,GACxB,QAAQ,SAAS,EACjB,SAAS,UAAU,EACnB,0CAAkD;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,KACpH,IAgCF,CAAA"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { CliError, isCliError } from "@leemour/cli-core";
|
|
2
|
+
import { isInputRequiredResult, } from "@modelcontextprotocol/server";
|
|
3
|
+
import { toStandardJsonSchema } from "@valibot/to-json-schema";
|
|
4
|
+
import * as v from "valibot";
|
|
5
|
+
import { maskedProfile } from "../domain/map.js";
|
|
6
|
+
import { confirmer } from "./confirm.js";
|
|
7
|
+
const chat = v.pipe(v.string(), v.minLength(1), v.description("chat id, or part of a chat name"));
|
|
8
|
+
const message = v.pipe(v.string(), v.regex(/^\d+$/), v.description("message id"));
|
|
9
|
+
const limit = v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(100), v.description("how many")));
|
|
10
|
+
const page = v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.description("which page, from 1")));
|
|
11
|
+
const READ = { readOnlyHint: true, destructiveHint: false, openWorldHint: true };
|
|
12
|
+
const WRITE = {
|
|
13
|
+
readOnlyHint: false,
|
|
14
|
+
destructiveHint: true,
|
|
15
|
+
idempotentHint: false,
|
|
16
|
+
openWorldHint: true,
|
|
17
|
+
};
|
|
18
|
+
const APPROVE = { "anthropic/requiresUserInteraction": true };
|
|
19
|
+
/** Typed where it is written; erased here because the SDK checks the arguments against `input` first. */
|
|
20
|
+
const tool = (definition) => definition;
|
|
21
|
+
/** The same envelope `--json` prints for every listing. */
|
|
22
|
+
const envelope = ({ items, hasMore }, pageNumber, pageSize) => ({
|
|
23
|
+
items,
|
|
24
|
+
page: pageNumber,
|
|
25
|
+
limit: pageSize,
|
|
26
|
+
hasMore,
|
|
27
|
+
});
|
|
28
|
+
const window = (args, defaults) => {
|
|
29
|
+
const size = args.limit ?? defaults.limit;
|
|
30
|
+
const number = args.page ?? 1;
|
|
31
|
+
return { size, number, request: { limit: size, offset: (number - 1) * size } };
|
|
32
|
+
};
|
|
33
|
+
const READ_TOOLS = {
|
|
34
|
+
max_account_show: tool({
|
|
35
|
+
title: "Who this is",
|
|
36
|
+
description: "The MAX account this server is logged in as.",
|
|
37
|
+
input: v.object({}),
|
|
38
|
+
annotations: { ...READ, idempotentHint: true },
|
|
39
|
+
// Always masked: an agent has no reason to hold the owner's number (`NEED-209`).
|
|
40
|
+
answer: async (client) => maskedProfile(await client.account.me()),
|
|
41
|
+
}),
|
|
42
|
+
max_chats_list: tool({
|
|
43
|
+
title: "List chats",
|
|
44
|
+
description: "Chats the owner is in, most recent first. Use it to find a chat's id before reading or sending. " +
|
|
45
|
+
"Returns { items, page, limit, hasMore }.",
|
|
46
|
+
input: v.object({
|
|
47
|
+
search: v.optional(v.pipe(v.string(), v.minLength(3), v.description("only chats whose name contains this"))),
|
|
48
|
+
kind: v.optional(v.picklist(["dialog", "group", "channel"])),
|
|
49
|
+
unread: v.optional(v.pipe(v.boolean(), v.description("only chats with unread messages"))),
|
|
50
|
+
limit,
|
|
51
|
+
page,
|
|
52
|
+
}),
|
|
53
|
+
annotations: READ,
|
|
54
|
+
answer: async (client, { search: query, kind, unread, ...paging }, defaults) => {
|
|
55
|
+
const { size, number, request } = window(paging, defaults);
|
|
56
|
+
const found = await client.chats.list({
|
|
57
|
+
...request,
|
|
58
|
+
...(query === undefined ? {} : { query }),
|
|
59
|
+
...(kind === undefined ? {} : { kind }),
|
|
60
|
+
...(unread === true ? { unread } : {}),
|
|
61
|
+
});
|
|
62
|
+
return envelope(found, number, size);
|
|
63
|
+
},
|
|
64
|
+
}),
|
|
65
|
+
max_chats_show: tool({
|
|
66
|
+
title: "Show a chat",
|
|
67
|
+
description: "One chat: its kind, unread count, last message time and who is in it.",
|
|
68
|
+
input: v.object({ chat }),
|
|
69
|
+
annotations: READ,
|
|
70
|
+
answer: (client, args) => client.chats.show(args.chat),
|
|
71
|
+
}),
|
|
72
|
+
max_contacts_list: tool({
|
|
73
|
+
title: "List contacts",
|
|
74
|
+
description: "People the owner has a one-to-one chat with. Returns { items, page, limit, hasMore }.",
|
|
75
|
+
input: v.object({
|
|
76
|
+
search: v.optional(v.pipe(v.string(), v.minLength(3), v.description("only people whose name contains this"))),
|
|
77
|
+
order: v.optional(v.picklist(["recent", "name"])),
|
|
78
|
+
limit,
|
|
79
|
+
page,
|
|
80
|
+
}),
|
|
81
|
+
annotations: READ,
|
|
82
|
+
answer: async (client, { search: query, order, ...paging }, defaults) => {
|
|
83
|
+
const { size, number, request } = window(paging, defaults);
|
|
84
|
+
const found = await client.contacts.list({
|
|
85
|
+
...request,
|
|
86
|
+
...(query === undefined ? {} : { query }),
|
|
87
|
+
...(order === undefined ? {} : { order }),
|
|
88
|
+
});
|
|
89
|
+
return envelope(found, number, size);
|
|
90
|
+
},
|
|
91
|
+
}),
|
|
92
|
+
max_contacts_show: tool({
|
|
93
|
+
title: "Show a person",
|
|
94
|
+
description: "One person and the chats shared with them.",
|
|
95
|
+
input: v.object({
|
|
96
|
+
person: v.pipe(v.string(), v.minLength(1), v.description("person id, @username, or part of a name")),
|
|
97
|
+
}),
|
|
98
|
+
annotations: READ,
|
|
99
|
+
answer: (client, args) => client.contacts.show(args.person),
|
|
100
|
+
}),
|
|
101
|
+
max_messages_list: tool({
|
|
102
|
+
title: "Read a chat",
|
|
103
|
+
description: "Recent messages in a chat, oldest first. Does not mark anything read. For older messages pass " +
|
|
104
|
+
"`before` = the id of the first item; for newer, `after` = the id of the last. Returns { items, page, limit, hasMore }.",
|
|
105
|
+
input: v.object({
|
|
106
|
+
chat,
|
|
107
|
+
limit,
|
|
108
|
+
before: v.optional(v.pipe(v.string(), v.description("a message id or an ISO 8601 time"))),
|
|
109
|
+
after: v.optional(v.pipe(v.string(), v.description("a message id or an ISO 8601 time; not with before"))),
|
|
110
|
+
}),
|
|
111
|
+
annotations: READ,
|
|
112
|
+
answer: async (client, args, defaults) => {
|
|
113
|
+
if (args.before !== undefined && args.after !== undefined) {
|
|
114
|
+
throw new CliError("validation_error", "before and after are two directions; give one of them");
|
|
115
|
+
}
|
|
116
|
+
const size = args.limit ?? defaults.limit;
|
|
117
|
+
const chatId = await client.chats.resolve(args.chat);
|
|
118
|
+
const anchor = args.after !== undefined
|
|
119
|
+
? { after: client.messages.moment(args.after, "after") }
|
|
120
|
+
: args.before !== undefined
|
|
121
|
+
? { before: client.messages.moment(args.before, "before") }
|
|
122
|
+
: {};
|
|
123
|
+
return envelope(await client.messages.list(chatId, { limit: size, ...anchor }), 1, size);
|
|
124
|
+
},
|
|
125
|
+
}),
|
|
126
|
+
max_messages_search: tool({
|
|
127
|
+
title: "Search messages",
|
|
128
|
+
description: "Find messages in what this machine has already read — it never asks MAX, so an empty answer means " +
|
|
129
|
+
'"not in what was read", not "never said". Returns { items, page, limit, hasMore }.',
|
|
130
|
+
input: v.object({
|
|
131
|
+
text: v.pipe(v.string(), v.minLength(3), v.description("what to look for; at least 3 characters")),
|
|
132
|
+
chat: v.optional(v.pipe(v.string(), v.regex(/^-?\d+$/), v.description("only this chat, by id"))),
|
|
133
|
+
limit,
|
|
134
|
+
}),
|
|
135
|
+
annotations: { ...READ, openWorldHint: false },
|
|
136
|
+
answer: async (client, args, defaults) => {
|
|
137
|
+
const size = args.limit ?? defaults.limit;
|
|
138
|
+
const found = await client.messages.search(args.text, {
|
|
139
|
+
limit: size,
|
|
140
|
+
...(args.chat === undefined ? {} : { chatId: args.chat }),
|
|
141
|
+
});
|
|
142
|
+
return envelope(found, 1, size);
|
|
143
|
+
},
|
|
144
|
+
}),
|
|
145
|
+
max_messages_context: tool({
|
|
146
|
+
title: "Show a message",
|
|
147
|
+
description: "One message by id, and optionally the messages either side of it, oldest first. The one asked for " +
|
|
148
|
+
"carries anchor: true.",
|
|
149
|
+
input: v.object({
|
|
150
|
+
chat,
|
|
151
|
+
message,
|
|
152
|
+
before: v.optional(v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(100))),
|
|
153
|
+
after: v.optional(v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(100))),
|
|
154
|
+
}),
|
|
155
|
+
annotations: READ,
|
|
156
|
+
answer: async (client, args) => {
|
|
157
|
+
const chatId = await client.chats.resolve(args.chat);
|
|
158
|
+
return {
|
|
159
|
+
items: await client.messages.around(chatId, args.message, { before: args.before ?? 0, after: args.after ?? 0 }),
|
|
160
|
+
};
|
|
161
|
+
},
|
|
162
|
+
}),
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* Registered only with `--allow-send`, so a server started without it has no way to write at all —
|
|
166
|
+
* not a refusal at call time, an absence from the list.
|
|
167
|
+
*
|
|
168
|
+
* `requiresUserInteraction` is Claude Code's: an approval dialog on every call that allow-rules do
|
|
169
|
+
* not skip. Other clients ask by `destructiveHint` or `readOnlyHint`.
|
|
170
|
+
*/
|
|
171
|
+
const SEND_TOOLS = {
|
|
172
|
+
max_messages_send: tool({
|
|
173
|
+
title: "Send a message",
|
|
174
|
+
description: "Send one text message as the owner. Only when the owner asked for this exact text to this exact chat. " +
|
|
175
|
+
"A name that matches several chats is refused with the candidates — pick an id, never guess. " +
|
|
176
|
+
"On outcome_unknown, retry with the cid it returns and MAX drops the duplicate.",
|
|
177
|
+
input: v.object({
|
|
178
|
+
chat,
|
|
179
|
+
text: v.pipe(v.string(), v.minLength(1)),
|
|
180
|
+
silent: v.optional(v.pipe(v.boolean(), v.description("deliver without a notification"))),
|
|
181
|
+
cid: v.optional(v.pipe(v.number(), v.integer(), v.description("from an earlier outcome_unknown"))),
|
|
182
|
+
}),
|
|
183
|
+
annotations: WRITE,
|
|
184
|
+
_meta: APPROVE,
|
|
185
|
+
answer: async (client, args) => {
|
|
186
|
+
const chatId = await client.chats.resolve(args.chat);
|
|
187
|
+
return client.messages.send(chatId, args.text, {
|
|
188
|
+
...(args.cid === undefined ? {} : { cid: args.cid }),
|
|
189
|
+
...(args.silent === true ? { notify: false } : {}),
|
|
190
|
+
});
|
|
191
|
+
},
|
|
192
|
+
}),
|
|
193
|
+
max_messages_edit: tool({
|
|
194
|
+
title: "Edit a message",
|
|
195
|
+
description: "Replace the text of one of the owner's own messages. Only when the owner asked for this exact change. " +
|
|
196
|
+
"The other person may have read the old text already. Attachments stay.",
|
|
197
|
+
input: v.object({ chat, message, text: v.pipe(v.string(), v.minLength(1)) }),
|
|
198
|
+
annotations: WRITE,
|
|
199
|
+
_meta: APPROVE,
|
|
200
|
+
answer: async (client, args) => client.messages.edit(await client.chats.resolve(args.chat), args.message, args.text),
|
|
201
|
+
}),
|
|
202
|
+
max_messages_forward: tool({
|
|
203
|
+
title: "Forward a message",
|
|
204
|
+
description: "Forward one message to another chat as the owner. Only when the owner asked for this message to this chat. " +
|
|
205
|
+
"On outcome_unknown, retry with the cid it returns and MAX drops the duplicate.",
|
|
206
|
+
input: v.object({
|
|
207
|
+
chat: v.pipe(chat, v.description("the chat the message is in")),
|
|
208
|
+
message,
|
|
209
|
+
to: v.pipe(chat, v.description("the chat to forward it to")),
|
|
210
|
+
cid: v.optional(v.pipe(v.number(), v.integer(), v.description("from an earlier outcome_unknown"))),
|
|
211
|
+
}),
|
|
212
|
+
annotations: WRITE,
|
|
213
|
+
_meta: APPROVE,
|
|
214
|
+
answer: async (client, args) => client.messages.forward(await client.chats.resolve(args.chat), args.message, await client.chats.resolve(args.to), args.cid === undefined ? {} : { cid: args.cid }),
|
|
215
|
+
}),
|
|
216
|
+
max_messages_pin: tool({
|
|
217
|
+
title: "Pin a message",
|
|
218
|
+
description: "Pin one message in a chat, replacing what was pinned. Members are not notified.",
|
|
219
|
+
input: v.object({ chat, message }),
|
|
220
|
+
annotations: WRITE,
|
|
221
|
+
_meta: APPROVE,
|
|
222
|
+
answer: async (client, args) => client.messages.pin(await client.chats.resolve(args.chat), args.message),
|
|
223
|
+
}),
|
|
224
|
+
max_messages_unpin: tool({
|
|
225
|
+
title: "Unpin a message",
|
|
226
|
+
description: "Unpin whatever message is pinned in a chat.",
|
|
227
|
+
input: v.object({ chat }),
|
|
228
|
+
annotations: WRITE,
|
|
229
|
+
_meta: APPROVE,
|
|
230
|
+
answer: async (client, args) => client.messages.pin(await client.chats.resolve(args.chat), null),
|
|
231
|
+
}),
|
|
232
|
+
};
|
|
233
|
+
const answered = (value) => ({
|
|
234
|
+
content: [{ type: "text", text: JSON.stringify(value) }],
|
|
235
|
+
structuredContent: value,
|
|
236
|
+
});
|
|
237
|
+
/** The same object the CLI prints on stderr, so an agent reads one error shape from both. */
|
|
238
|
+
const failed = (error) => {
|
|
239
|
+
const body = isCliError(error)
|
|
240
|
+
? { code: error.code, message: error.message, ...error.details }
|
|
241
|
+
: { code: "generic_failure", message: error instanceof Error ? error.message : String(error) };
|
|
242
|
+
return {
|
|
243
|
+
content: [{ type: "text", text: JSON.stringify({ error: body }) }],
|
|
244
|
+
structuredContent: { error: body },
|
|
245
|
+
isError: true,
|
|
246
|
+
};
|
|
247
|
+
};
|
|
248
|
+
export const registerTools = (server, session, { allowSend, confirmSend = false, defaultLimit }) => {
|
|
249
|
+
const confirmed = confirmSend ? confirmer() : undefined;
|
|
250
|
+
const tools = {
|
|
251
|
+
...READ_TOOLS,
|
|
252
|
+
...(allowSend ? SEND_TOOLS : {}),
|
|
253
|
+
};
|
|
254
|
+
for (const [name, definition] of Object.entries(tools)) {
|
|
255
|
+
server.registerTool(name, {
|
|
256
|
+
title: definition.title,
|
|
257
|
+
description: definition.description,
|
|
258
|
+
inputSchema: toStandardJsonSchema(definition.input),
|
|
259
|
+
annotations: definition.annotations,
|
|
260
|
+
...(definition._meta ? { _meta: definition._meta } : {}),
|
|
261
|
+
}, async (args, ctx) => {
|
|
262
|
+
try {
|
|
263
|
+
const result = await session.use(name.replace(/^max_/, "mcp ").replaceAll("_", " "), (client) => confirmed && name === "max_messages_send"
|
|
264
|
+
? confirmed(client, args, ctx)
|
|
265
|
+
: definition.answer(client, args, { limit: defaultLimit }));
|
|
266
|
+
return isInputRequiredResult(result) ? result : answered(result);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
return failed(error);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/program.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACxG,OAAO,EAAE,OAAO,EAAkB,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACxG,OAAO,EAAE,OAAO,EAAkB,MAAM,WAAW,CAAA;AAQnD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,uBAAuB,CAAA;AAkBjE,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,mGAAmG;IACnG,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAI,eAAc,cAAmB,KAAG,OAmEjE,CAAA;AAOD;;;;;;GAMG;AACH,eAAO,MAAM,GAAG,GAAU,MAAM,MAAM,EAAE,EAAE,UAAS,UAAe,KAAG,OAAO,CAAC,MAAM,CAmElF,CAAA"}
|
package/dist/program.js
CHANGED
|
@@ -4,19 +4,25 @@ import { accountCommand } from "./commands/account.js";
|
|
|
4
4
|
import { cacheCommand } from "./commands/cache.js";
|
|
5
5
|
import { chatsCommand } from "./commands/chats.js";
|
|
6
6
|
import { commandsCommand } from "./commands/commands.js";
|
|
7
|
+
import { completeCommand } from "./commands/complete.js";
|
|
7
8
|
import { configCommand } from "./commands/config.js";
|
|
8
9
|
import { contactsCommand } from "./commands/contacts.js";
|
|
9
10
|
import { provide } from "./commands/context.js";
|
|
10
11
|
import { doctorCommand } from "./commands/doctor.js";
|
|
11
12
|
import { inboxCommand } from "./commands/inbox.js";
|
|
13
|
+
import { mcpCommand } from "./commands/mcp.js";
|
|
12
14
|
import { messagesCommand } from "./commands/messages.js";
|
|
13
15
|
import { reactionsCommand } from "./commands/reactions.js";
|
|
14
16
|
import { recipientsCommand } from "./commands/recipients.js";
|
|
15
17
|
import { runsCommand } from "./commands/runs.js";
|
|
16
18
|
import { sendsCommand } from "./commands/sends.js";
|
|
19
|
+
import { serveCommand } from "./commands/serve.js";
|
|
17
20
|
import { sessionCommand } from "./commands/session.js";
|
|
18
21
|
import { skillCommand } from "./commands/skill.js";
|
|
22
|
+
import { selfUpdateCommand } from "./commands/update.js";
|
|
23
|
+
import { watchCommand } from "./commands/watch.js";
|
|
19
24
|
import { commandWords, liftProfile } from "./profile.js";
|
|
25
|
+
import { updateNotice } from "./update.js";
|
|
20
26
|
import { VERSION } from "./version.js";
|
|
21
27
|
/**
|
|
22
28
|
* The command tree, built fresh on each call.
|
|
@@ -43,6 +49,8 @@ export const createProgram = ({ out, err } = {}) => {
|
|
|
43
49
|
.option("--offline", "answer from what was recorded and never connect; fails if nothing was")
|
|
44
50
|
.option("--record", "keep this run under `max runs` — ids and timings, never message content")
|
|
45
51
|
.option("--no-record", "do not keep it, whatever the configuration says")
|
|
52
|
+
.option("--serve", "start `max serve` in the background if it is not running (the default)")
|
|
53
|
+
.option("--no-serve", "do not start it; log in on this command's own connection unless one is running")
|
|
46
54
|
.showHelpAfterError();
|
|
47
55
|
// One resource per command, one action per subcommand — `max chats list`, `max messages send`.
|
|
48
56
|
// The shape `braze-cli` uses, and the reason there is no `max send`: an action is never a
|
|
@@ -56,12 +64,17 @@ export const createProgram = ({ out, err } = {}) => {
|
|
|
56
64
|
program.addCommand(recipientsCommand());
|
|
57
65
|
program.addCommand(sendsCommand());
|
|
58
66
|
program.addCommand(inboxCommand());
|
|
67
|
+
program.addCommand(serveCommand());
|
|
68
|
+
program.addCommand(watchCommand());
|
|
59
69
|
program.addCommand(configCommand());
|
|
60
70
|
program.addCommand(doctorCommand());
|
|
61
71
|
program.addCommand(cacheCommand());
|
|
62
72
|
program.addCommand(runsCommand());
|
|
63
73
|
program.addCommand(skillCommand());
|
|
64
74
|
program.addCommand(commandsCommand());
|
|
75
|
+
program.addCommand(selfUpdateCommand());
|
|
76
|
+
program.addCommand(completeCommand(), { hidden: true });
|
|
77
|
+
program.addCommand(mcpCommand());
|
|
65
78
|
// Depth-first: Commander does not pass `configureOutput` down to a command added with
|
|
66
79
|
// `addCommand`, so `max messages --help` would write to the real terminal while the top level
|
|
67
80
|
// wrote to the injected streams — and a test reading stdout would see nothing at all.
|
|
@@ -117,8 +130,12 @@ export const run = async (argv, options = {}) => {
|
|
|
117
130
|
});
|
|
118
131
|
return exitCodeFor("validation_error");
|
|
119
132
|
}
|
|
133
|
+
const notice = updateNotice(rest, { tty: options.tty, environment: options.update });
|
|
120
134
|
try {
|
|
121
135
|
await program.parseAsync(rest, { from: "user" });
|
|
136
|
+
const line = await notice;
|
|
137
|
+
if (line)
|
|
138
|
+
streams.diagnostic(line);
|
|
122
139
|
return process.exitCode === undefined ? 0 : Number(process.exitCode);
|
|
123
140
|
}
|
|
124
141
|
catch (error) {
|
package/dist/program.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,14 @@ export interface ConnectionOptions {
|
|
|
23
23
|
timeoutMs?: number;
|
|
24
24
|
/** Events MAX pushes on its own — messages arriving, presence. Ignored unless a caller cares. */
|
|
25
25
|
onEvent?: (frame: InboundFrame) => void;
|
|
26
|
+
/**
|
|
27
|
+
* **A connection that stays open**, as `max serve`'s does: it answers MAX's ping and acknowledges
|
|
28
|
+
* a new message the way web.max.ru does (bundle read 2026-09-24), and drops a push it has already
|
|
29
|
+
* seen. Off for a one-shot command, which is gone before either matters.
|
|
30
|
+
*/
|
|
31
|
+
live?: boolean;
|
|
32
|
+
/** MAX closed the socket. Not called for our own `close()`. The connection is dead after it. */
|
|
33
|
+
onClose?: (error: Error) => void;
|
|
26
34
|
/** Injected in tests; defaults to the real `ws` client. */
|
|
27
35
|
createSocket?: (url: string, origin: string) => WebSocket;
|
|
28
36
|
}
|
|
@@ -31,14 +39,8 @@ export declare class ProtocolError extends Error {
|
|
|
31
39
|
readonly payload: Payload | null;
|
|
32
40
|
constructor(message: string, opcode: number, payload: Payload | null);
|
|
33
41
|
}
|
|
34
|
-
/**
|
|
35
|
-
|
|
36
|
-
*
|
|
37
|
-
* **Everything that could keep the process alive is owned here**: the socket, the per-request
|
|
38
|
-
* timers and the listeners. `close()` clears all three, and a command that opens a connection
|
|
39
|
-
* closes it in a `finally` — a CLI that prints its result and then hangs is a defect, not a rough
|
|
40
|
-
* edge (REQUIREMENTS §18).
|
|
41
|
-
*/
|
|
42
|
+
/** What a client needs of a connection — so one that goes through `max serve` can stand in. */
|
|
43
|
+
export type Wire = Pick<Connection, "open" | "invoke" | "close">;
|
|
42
44
|
export declare class Connection {
|
|
43
45
|
#private;
|
|
44
46
|
constructor(options?: ConnectionOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/protocol/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,EAAqC,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;AAE/F,eAAO,MAAM,iBAAiB,oCAAoC,CAAA;AAClE,iGAAiG;AACjG,eAAO,MAAM,UAAU,uBAAuB,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,GAAG,UAAU,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iGAAiG;IACjG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,SAAS,CAAA;CAC1D;AAED,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;gBAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;CAMrE;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/protocol/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,EAAqC,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;AAE/F,eAAO,MAAM,iBAAiB,oCAAoC,CAAA;AAClE,iGAAiG;AACjG,eAAO,MAAM,UAAU,uBAAuB,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,GAAG,UAAU,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iGAAiG;IACjG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,gGAAgG;IAChG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,SAAS,CAAA;CAC1D;AAED,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;gBAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;CAMrE;AAeD,+FAA+F;AAC/F,MAAM,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAA;AAEhE,qBAAa,UAAU;;gBAsBT,OAAO,GAAE,iBAAsB;IAUrC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;;;;;;;;;OAUG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAoCzG;;;;;;;;;OASG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAiG7B"}
|