xabot-cli 1.4.2
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/LICENSE +21 -0
- package/README.md +126 -0
- package/README.zh-CN.md +126 -0
- package/dist/bridge/index.d.ts +93 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +811 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/input-parser.d.ts +16 -0
- package/dist/bridge/input-parser.d.ts.map +1 -0
- package/dist/bridge/input-parser.js +20 -0
- package/dist/bridge/input-parser.js.map +1 -0
- package/dist/cli/chat.d.ts +38 -0
- package/dist/cli/chat.d.ts.map +1 -0
- package/dist/cli/chat.js +147 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/feishu.d.ts +3 -0
- package/dist/cli/feishu.d.ts.map +1 -0
- package/dist/cli/feishu.js +79 -0
- package/dist/cli/feishu.js.map +1 -0
- package/dist/cli/health.d.ts +15 -0
- package/dist/cli/health.d.ts.map +1 -0
- package/dist/cli/health.js +26 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +43 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/run.d.ts +20 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +43 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/wechat.d.ts +3 -0
- package/dist/cli/wechat.d.ts.map +1 -0
- package/dist/cli/wechat.js +86 -0
- package/dist/cli/wechat.js.map +1 -0
- package/dist/core/client.d.ts +31 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +2 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/error.d.ts +11 -0
- package/dist/core/error.d.ts.map +1 -0
- package/dist/core/error.js +21 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/fs-utils.d.ts +17 -0
- package/dist/core/fs-utils.d.ts.map +1 -0
- package/dist/core/fs-utils.js +84 -0
- package/dist/core/fs-utils.js.map +1 -0
- package/dist/core/logger.d.ts +10 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +44 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/pairing.d.ts +10 -0
- package/dist/core/pairing.d.ts.map +1 -0
- package/dist/core/pairing.js +22 -0
- package/dist/core/pairing.js.map +1 -0
- package/dist/core/types.d.ts +50 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +11 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/platforms/feishu/client.d.ts +49 -0
- package/dist/platforms/feishu/client.d.ts.map +1 -0
- package/dist/platforms/feishu/client.js +296 -0
- package/dist/platforms/feishu/client.js.map +1 -0
- package/dist/platforms/feishu/message.d.ts +49 -0
- package/dist/platforms/feishu/message.d.ts.map +1 -0
- package/dist/platforms/feishu/message.js +131 -0
- package/dist/platforms/feishu/message.js.map +1 -0
- package/dist/platforms/feishu/upload.d.ts +11 -0
- package/dist/platforms/feishu/upload.d.ts.map +1 -0
- package/dist/platforms/feishu/upload.js +60 -0
- package/dist/platforms/feishu/upload.js.map +1 -0
- package/dist/platforms/wechat/client.d.ts +53 -0
- package/dist/platforms/wechat/client.d.ts.map +1 -0
- package/dist/platforms/wechat/client.js +301 -0
- package/dist/platforms/wechat/client.js.map +1 -0
- package/dist/platforms/wechat/crypto.d.ts +23 -0
- package/dist/platforms/wechat/crypto.d.ts.map +1 -0
- package/dist/platforms/wechat/crypto.js +46 -0
- package/dist/platforms/wechat/crypto.js.map +1 -0
- package/dist/platforms/wechat/login.d.ts +19 -0
- package/dist/platforms/wechat/login.d.ts.map +1 -0
- package/dist/platforms/wechat/login.js +71 -0
- package/dist/platforms/wechat/login.js.map +1 -0
- package/dist/platforms/wechat/message.d.ts +102 -0
- package/dist/platforms/wechat/message.d.ts.map +1 -0
- package/dist/platforms/wechat/message.js +212 -0
- package/dist/platforms/wechat/message.js.map +1 -0
- package/dist/platforms/wechat/upload.d.ts +10 -0
- package/dist/platforms/wechat/upload.d.ts.map +1 -0
- package/dist/platforms/wechat/upload.js +86 -0
- package/dist/platforms/wechat/upload.js.map +1 -0
- package/dist/xacpp/establish-handler.d.ts +58 -0
- package/dist/xacpp/establish-handler.d.ts.map +1 -0
- package/dist/xacpp/establish-handler.js +152 -0
- package/dist/xacpp/establish-handler.js.map +1 -0
- package/dist/xacpp/index.d.ts +3 -0
- package/dist/xacpp/index.d.ts.map +1 -0
- package/dist/xacpp/index.js +3 -0
- package/dist/xacpp/index.js.map +1 -0
- package/dist/xacpp/initiator-session-handler.d.ts +30 -0
- package/dist/xacpp/initiator-session-handler.d.ts.map +1 -0
- package/dist/xacpp/initiator-session-handler.js +233 -0
- package/dist/xacpp/initiator-session-handler.js.map +1 -0
- package/dist/xacpp/session-handler.d.ts +17 -0
- package/dist/xacpp/session-handler.d.ts.map +1 -0
- package/dist/xacpp/session-handler.js +27 -0
- package/dist/xacpp/session-handler.js.map +1 -0
- package/dist/xacpp/stdin-router.d.ts +23 -0
- package/dist/xacpp/stdin-router.d.ts.map +1 -0
- package/dist/xacpp/stdin-router.js +46 -0
- package/dist/xacpp/stdin-router.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Command, Option } from 'commander';
|
|
2
|
+
import { setLevel } from '../core/logger.js';
|
|
3
|
+
import { WechatClient } from '../platforms/wechat/client.js';
|
|
4
|
+
import { login } from '../platforms/wechat/login.js';
|
|
5
|
+
import { health } from './health.js';
|
|
6
|
+
import { run } from './run.js';
|
|
7
|
+
import { chat } from './chat.js';
|
|
8
|
+
import { XabotEstablishHandler } from '../xacpp/establish-handler.js';
|
|
9
|
+
import { XacppPeer, XacppSession, StdioTransport } from 'xacpp';
|
|
10
|
+
import { Bridge } from '../bridge/index.js';
|
|
11
|
+
export function registerWechat(program) {
|
|
12
|
+
const wechat = program
|
|
13
|
+
.command('wechat')
|
|
14
|
+
.description('WeChat (iLink Bot) platform commands')
|
|
15
|
+
.addOption(new Option('--log-level <level>', 'Log level').choices(['debug', 'info', 'warn', 'error']).default('info'));
|
|
16
|
+
wechat
|
|
17
|
+
.command('health')
|
|
18
|
+
.requiredOption('--token <token>', 'WeChat iLink Bot token')
|
|
19
|
+
.option('--base-url <url>', 'API base URL (default: https://ilinkai.weixin.qq.com)')
|
|
20
|
+
.description('Verify credentials and connection health')
|
|
21
|
+
.action(async (opts) => {
|
|
22
|
+
const { logLevel } = wechat.opts();
|
|
23
|
+
setLevel(logLevel);
|
|
24
|
+
const client = new WechatClient({ token: opts.token, baseUrl: opts.baseUrl });
|
|
25
|
+
await client.connect();
|
|
26
|
+
await health(client);
|
|
27
|
+
await client.close();
|
|
28
|
+
});
|
|
29
|
+
wechat
|
|
30
|
+
.command('run')
|
|
31
|
+
.option('--verbose', 'Enable verbose mode (show thinking/tool indicators)')
|
|
32
|
+
.description('Start Bridge mode with SIGINT/SIGTERM graceful shutdown')
|
|
33
|
+
.action(async (opts) => {
|
|
34
|
+
const { logLevel, verbose } = wechat.opts();
|
|
35
|
+
setLevel(logLevel);
|
|
36
|
+
const transport = new StdioTransport(process.stdout, process.stdin);
|
|
37
|
+
const establishHandler = new XabotEstablishHandler();
|
|
38
|
+
const bridge = new Bridge(transport, { verbose: verbose ?? false });
|
|
39
|
+
establishHandler.setBridge(bridge);
|
|
40
|
+
bridge.setEstablishHandler(establishHandler);
|
|
41
|
+
establishHandler.setLoginFn(() => login());
|
|
42
|
+
establishHandler.setEnsureCloudFn(async (token, baseUrl) => {
|
|
43
|
+
const cfg = { token };
|
|
44
|
+
if (baseUrl)
|
|
45
|
+
cfg.baseUrl = baseUrl;
|
|
46
|
+
cfg.onTokenExpired = () => login().then((r) => r.token);
|
|
47
|
+
const client = new WechatClient(cfg);
|
|
48
|
+
await client.connect();
|
|
49
|
+
bridge.replaceCloud(client);
|
|
50
|
+
});
|
|
51
|
+
establishHandler.onEstablished((_t, sessionId, credentials) => {
|
|
52
|
+
const session = new XacppSession(transport, sessionId, credentials);
|
|
53
|
+
bridge.setSession(session);
|
|
54
|
+
bridge.markEstablished();
|
|
55
|
+
});
|
|
56
|
+
const peer = new XacppPeer(transport, establishHandler);
|
|
57
|
+
bridge.run();
|
|
58
|
+
await peer.connect();
|
|
59
|
+
await run(bridge, peer);
|
|
60
|
+
});
|
|
61
|
+
wechat
|
|
62
|
+
.command('chat')
|
|
63
|
+
.option('--credentials <credentials>', 'Reuse existing session credentials (skip challenge)')
|
|
64
|
+
.description('Interactive chat: Establish handshake + bidirectional messaging with Agent')
|
|
65
|
+
.action(async (opts) => {
|
|
66
|
+
const { logLevel } = wechat.opts();
|
|
67
|
+
setLevel(logLevel);
|
|
68
|
+
const chatOpts = {
|
|
69
|
+
loginFn: () => login(),
|
|
70
|
+
cloudFactory: async (token, baseUrl) => {
|
|
71
|
+
const cfg = { token };
|
|
72
|
+
if (baseUrl)
|
|
73
|
+
cfg.baseUrl = baseUrl;
|
|
74
|
+
cfg.onTokenExpired = () => login().then((r) => r.token);
|
|
75
|
+
const client = new WechatClient(cfg);
|
|
76
|
+
await client.connect();
|
|
77
|
+
return client;
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
if (opts.credentials) {
|
|
81
|
+
chatOpts.credentials = opts.credentials;
|
|
82
|
+
}
|
|
83
|
+
await chat(undefined, chatOpts);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=wechat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wechat.js","sourceRoot":"","sources":["../../src/cli/wechat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Message, MessageId, ChannelId, UserId, StreamCapability, MessageContent } from './types.js';
|
|
2
|
+
/** Platform client interface — all cloud platforms implement this. */
|
|
3
|
+
export interface PlatformClient {
|
|
4
|
+
readonly platform: string;
|
|
5
|
+
connect(): Promise<void>;
|
|
6
|
+
send(chatId: ChannelId, content: MessageContent): Promise<MessageId>;
|
|
7
|
+
/**
|
|
8
|
+
* Streaming send — caller invokes this repeatedly to deliver chunks.
|
|
9
|
+
* Semantic convention:
|
|
10
|
+
* - Return `Promise<MessageId>` on the last chunk call to report completion.
|
|
11
|
+
* - Return `void` when the stream is already complete (no further chunks follow).
|
|
12
|
+
*/
|
|
13
|
+
sendChunk?(chatId: ChannelId, content: MessageContent): Promise<MessageId>;
|
|
14
|
+
messages(): AsyncIterable<Message>;
|
|
15
|
+
streamCapability(): StreamCapability;
|
|
16
|
+
healthCheck(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Notify user that the message has been received and is being processed.
|
|
19
|
+
*/
|
|
20
|
+
setTypingIndicator(chatId: ChannelId, senderId: UserId, messageId?: MessageId): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Refresh the typing indicator to counter server-side timeout.
|
|
23
|
+
*/
|
|
24
|
+
refreshTypingIndicator(chatId: ChannelId, senderId: UserId): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Processing complete, clear the indicator.
|
|
27
|
+
*/
|
|
28
|
+
releaseTypingIndicator(chatId: ChannelId, senderId: UserId, messageId?: MessageId): Promise<void>;
|
|
29
|
+
close(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACrE;;;;;OAKG;IACH,SAAS,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3E,QAAQ,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,gBAAgB,IAAI,gBAAgB,CAAC;IACrC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured error type for xabot operations.
|
|
3
|
+
*/
|
|
4
|
+
export declare class XabotError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
constructor(msg: string, code?: string);
|
|
7
|
+
static platform(msg: string): XabotError;
|
|
8
|
+
static auth(msg: string): XabotError;
|
|
9
|
+
static config(msg: string): XabotError;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/core/error.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;aACM,IAAI,EAAE,MAAM;gBAAzC,GAAG,EAAE,MAAM,EAAkB,IAAI,GAAE,MAAkB;IAKjE,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAIxC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAIpC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;CAGvC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured error type for xabot operations.
|
|
3
|
+
*/
|
|
4
|
+
export class XabotError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(msg, code = 'UNKNOWN') {
|
|
7
|
+
super(msg);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = 'XabotError';
|
|
10
|
+
}
|
|
11
|
+
static platform(msg) {
|
|
12
|
+
return new XabotError(msg, 'PLATFORM');
|
|
13
|
+
}
|
|
14
|
+
static auth(msg) {
|
|
15
|
+
return new XabotError(msg, 'AUTH');
|
|
16
|
+
}
|
|
17
|
+
static config(msg) {
|
|
18
|
+
return new XabotError(msg, 'CONFIG');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/core/error.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACM;IAAzC,YAAY,GAAW,EAAkB,OAAe,SAAS;QAC/D,KAAK,CAAC,GAAG,CAAC,CAAC;QAD4B,SAAI,GAAJ,IAAI,CAAoB;QAE/D,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAW;QACzB,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAW;QACrB,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,GAAW;QACvB,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare function downloadToBuffer(url: string): Promise<Buffer>;
|
|
2
|
+
export declare function detectMimeType(buf: Buffer, fileNameHint?: string): Promise<string>;
|
|
3
|
+
export declare function saveTemp(buf: Buffer, urlPath: string, fileNameHint?: string): Promise<{
|
|
4
|
+
localUri: string;
|
|
5
|
+
sha256: string;
|
|
6
|
+
sizeBytes: number;
|
|
7
|
+
mimeType: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function saveTemp(existingPath: string, fileNameHint?: string): Promise<{
|
|
10
|
+
localUri: string;
|
|
11
|
+
sha256: string;
|
|
12
|
+
sizeBytes: number;
|
|
13
|
+
mimeType: string;
|
|
14
|
+
}>;
|
|
15
|
+
/** Safe unlink — ignore ENOENT. */
|
|
16
|
+
export declare function safeUnlink(path: string): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=fs-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/core/fs-utils.ts"],"names":[],"mappings":"AAYA,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAInE;AAMD,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxF;AAMD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACxK,wBAAsB,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AA6DhK,mCAAmC;AACnC,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ5D"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { writeFile, unlink, readFile } from 'node:fs/promises';
|
|
2
|
+
import { basename } from 'node:path';
|
|
3
|
+
import { fileTypeFromBuffer } from 'file-type';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
6
|
+
import { createLogger } from './logger.js';
|
|
7
|
+
const log = createLogger('fs-utils');
|
|
8
|
+
// --------------------------------------------------------------------------
|
|
9
|
+
// Download
|
|
10
|
+
// --------------------------------------------------------------------------
|
|
11
|
+
export async function downloadToBuffer(url) {
|
|
12
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(60_000) });
|
|
13
|
+
if (!res.ok)
|
|
14
|
+
throw new Error(`Fetch failed: HTTP ${res.status}`);
|
|
15
|
+
return Buffer.from(await res.arrayBuffer());
|
|
16
|
+
}
|
|
17
|
+
// --------------------------------------------------------------------------
|
|
18
|
+
// MIME type detection
|
|
19
|
+
// --------------------------------------------------------------------------
|
|
20
|
+
export async function detectMimeType(buf, fileNameHint) {
|
|
21
|
+
const detected = await fileTypeFromBuffer(buf);
|
|
22
|
+
return detected?.mime || inferMimeFromExt(fileNameHint ?? '');
|
|
23
|
+
}
|
|
24
|
+
export async function saveTemp(first, second, third) {
|
|
25
|
+
if (Buffer.isBuffer(first)) {
|
|
26
|
+
const buf = first;
|
|
27
|
+
const urlPath = second ?? '';
|
|
28
|
+
const fileNameHint = third;
|
|
29
|
+
const tmpPath = `${tmpdir()}/xabot_${randomUUID()}_${basename(new URL(urlPath).pathname || 'blob')}`;
|
|
30
|
+
await writeFile(tmpPath, buf);
|
|
31
|
+
const hash = createHash('sha256').update(buf).digest('hex');
|
|
32
|
+
const mimeType = await detectMimeType(buf, fileNameHint);
|
|
33
|
+
log.debug('saveTemp: %s → %s (%d bytes, sha256=%s)', urlPath.slice(0, 60), tmpPath, buf.length, hash.slice(0, 12));
|
|
34
|
+
return { localUri: tmpPath, sha256: hash, sizeBytes: buf.length, mimeType };
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const existingPath = first;
|
|
38
|
+
const fileNameHint = second;
|
|
39
|
+
const buf = await readFile(existingPath);
|
|
40
|
+
const hash = createHash('sha256').update(buf).digest('hex');
|
|
41
|
+
const mimeType = await detectMimeType(buf, fileNameHint);
|
|
42
|
+
log.debug('saveTemp: existing %s (%d bytes, sha256=%s)', existingPath, buf.length, hash.slice(0, 12));
|
|
43
|
+
return { localUri: existingPath, sha256: hash, sizeBytes: buf.length, mimeType };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// --------------------------------------------------------------------------
|
|
47
|
+
// MIME fallback from extension
|
|
48
|
+
// --------------------------------------------------------------------------
|
|
49
|
+
const EXT_MIME_MAP = {
|
|
50
|
+
txt: 'text/plain',
|
|
51
|
+
csv: 'text/csv',
|
|
52
|
+
json: 'application/json',
|
|
53
|
+
xml: 'text/xml',
|
|
54
|
+
html: 'text/html',
|
|
55
|
+
htm: 'text/html',
|
|
56
|
+
pdf: 'application/pdf',
|
|
57
|
+
doc: 'application/msword',
|
|
58
|
+
docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
59
|
+
xls: 'application/vnd.ms-excel',
|
|
60
|
+
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
61
|
+
ppt: 'application/vnd.ms-powerpoint',
|
|
62
|
+
pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
63
|
+
};
|
|
64
|
+
function inferMimeFromExt(name) {
|
|
65
|
+
if (!name)
|
|
66
|
+
return '';
|
|
67
|
+
const ext = name.split('.').pop()?.toLowerCase() ?? '';
|
|
68
|
+
return EXT_MIME_MAP[ext] ?? '';
|
|
69
|
+
}
|
|
70
|
+
// --------------------------------------------------------------------------
|
|
71
|
+
// Safe unlink
|
|
72
|
+
// --------------------------------------------------------------------------
|
|
73
|
+
/** Safe unlink — ignore ENOENT. */
|
|
74
|
+
export async function safeUnlink(path) {
|
|
75
|
+
try {
|
|
76
|
+
await unlink(path);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
if (err instanceof Error && 'code' in err && err.code !== 'ENOENT') {
|
|
80
|
+
log.warn('safeUnlink failed: %s — %s', path, err.message);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=fs-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../src/core/fs-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LogLevel } from './types.js';
|
|
2
|
+
export declare function setLevel(level: LogLevel): void;
|
|
3
|
+
export interface Logger {
|
|
4
|
+
debug(fmt: string, ...args: unknown[]): void;
|
|
5
|
+
info(fmt: string, ...args: unknown[]): void;
|
|
6
|
+
warn(fmt: string, ...args: unknown[]): void;
|
|
7
|
+
error(fmt: string, ...args: unknown[]): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function createLogger(module: string): Logger;
|
|
10
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAW3C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAE9C;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC9C;AAmBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAcnD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const LEVEL_ORDER = {
|
|
2
|
+
debug: 0,
|
|
3
|
+
info: 1,
|
|
4
|
+
warn: 2,
|
|
5
|
+
error: 3,
|
|
6
|
+
};
|
|
7
|
+
let currentLevel = 'info';
|
|
8
|
+
export function setLevel(level) {
|
|
9
|
+
currentLevel = level;
|
|
10
|
+
}
|
|
11
|
+
function format(fmt, args) {
|
|
12
|
+
let i = 0;
|
|
13
|
+
return fmt.replace(/%[sdjoO%]/g, (m) => {
|
|
14
|
+
if (m === '%%')
|
|
15
|
+
return '%';
|
|
16
|
+
if (i >= args.length)
|
|
17
|
+
return m;
|
|
18
|
+
const arg = args[i++];
|
|
19
|
+
switch (m) {
|
|
20
|
+
case '%s': return String(arg);
|
|
21
|
+
case '%d': return Number(arg).toString();
|
|
22
|
+
case '%j':
|
|
23
|
+
case '%o':
|
|
24
|
+
case '%O': return JSON.stringify(arg);
|
|
25
|
+
default: return m;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export function createLogger(module) {
|
|
30
|
+
function write(level, fmt, args) {
|
|
31
|
+
if (LEVEL_ORDER[level] < LEVEL_ORDER[currentLevel])
|
|
32
|
+
return;
|
|
33
|
+
const ts = new Date().toISOString().slice(11, 23);
|
|
34
|
+
const msg = args.length > 0 ? format(fmt, args) : fmt;
|
|
35
|
+
process.stdout.write(`[${ts}] [${level.toUpperCase().padEnd(5)}] [${module}] ${msg}\n`);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
debug: (fmt, ...args) => write('debug', fmt, args),
|
|
39
|
+
info: (fmt, ...args) => write('info', fmt, args),
|
|
40
|
+
warn: (fmt, ...args) => write('warn', fmt, args),
|
|
41
|
+
error: (fmt, ...args) => write('error', fmt, args),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,IAAI,YAAY,GAAa,MAAM,CAAC;AAEpC,MAAM,UAAU,QAAQ,CAAC,KAAe;IACtC,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AASD,SAAS,MAAM,CAAC,GAAW,EAAE,IAAe;IAC1C,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;QACrC,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,GAAG,CAAC;QAC3B,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QACtB,QAAQ,CAAC,EAAE,CAAC;YACV,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YACzC,KAAK,IAAI,CAAC;YACV,KAAK,IAAI,CAAC;YACV,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACtC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,SAAS,KAAK,CAAC,KAAe,EAAE,GAAW,EAAE,IAAe;QAC1D,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,YAAY,CAAC;YAAE,OAAO;QAC3D,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;QAClD,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QAChD,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QAChD,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;KACnD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pairing code generation utilities.
|
|
3
|
+
* Pure functions for generating and validating pairing codes.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Generate a random pairing code of the given length.
|
|
7
|
+
* Uses crypto.randomInt for uniform distribution over the charset.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generatePairingCode(length?: number): string;
|
|
10
|
+
//# sourceMappingURL=pairing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../../src/core/pairing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM,CAS9D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pairing code generation utilities.
|
|
3
|
+
* Pure functions for generating and validating pairing codes.
|
|
4
|
+
*/
|
|
5
|
+
import { randomInt } from 'node:crypto';
|
|
6
|
+
const PAIRING_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
|
7
|
+
const CHARSET_SIZE = PAIRING_CHARSET.length; // 36
|
|
8
|
+
/**
|
|
9
|
+
* Generate a random pairing code of the given length.
|
|
10
|
+
* Uses crypto.randomInt for uniform distribution over the charset.
|
|
11
|
+
*/
|
|
12
|
+
export function generatePairingCode(length = 6) {
|
|
13
|
+
if (length <= 0) {
|
|
14
|
+
throw new Error('Pairing code length must be a positive integer');
|
|
15
|
+
}
|
|
16
|
+
let result = '';
|
|
17
|
+
for (let i = 0; i < length; i++) {
|
|
18
|
+
result += PAIRING_CHARSET[randomInt(CHARSET_SIZE)];
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=pairing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../src/core/pairing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,eAAe,GAAG,sCAAsC,CAAC;AAC/D,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK;AAElD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,CAAC;IACpD,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,eAAe,CAAC,SAAS,CAAC,YAAY,CAAC,CAAE,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Standard message types shared across all platforms. */
|
|
2
|
+
import type { FileRef } from 'xacpp';
|
|
3
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
4
|
+
export type MessageId = string & {
|
|
5
|
+
readonly __brand: 'MessageId';
|
|
6
|
+
};
|
|
7
|
+
export type ChannelId = string & {
|
|
8
|
+
readonly __brand: 'ChannelId';
|
|
9
|
+
};
|
|
10
|
+
export type UserId = string & {
|
|
11
|
+
readonly __brand: 'UserId';
|
|
12
|
+
};
|
|
13
|
+
export type SessionId = string & {
|
|
14
|
+
readonly __brand: 'SessionId';
|
|
15
|
+
};
|
|
16
|
+
export declare function messageId(s: string): MessageId;
|
|
17
|
+
export declare function channelId(s: string): ChannelId;
|
|
18
|
+
export declare function userId(s: string): UserId;
|
|
19
|
+
export declare function sessionId(s: string): SessionId;
|
|
20
|
+
export declare enum StreamCapability {
|
|
21
|
+
Streaming = "streaming",
|
|
22
|
+
NonStreaming = "non-streaming"
|
|
23
|
+
}
|
|
24
|
+
export type MessageContent = {
|
|
25
|
+
type: 'text';
|
|
26
|
+
text: string;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'image';
|
|
29
|
+
source: FileRef;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'audio';
|
|
32
|
+
source: FileRef;
|
|
33
|
+
} | {
|
|
34
|
+
type: 'video';
|
|
35
|
+
source: FileRef;
|
|
36
|
+
} | {
|
|
37
|
+
type: 'file';
|
|
38
|
+
source: FileRef;
|
|
39
|
+
name?: string;
|
|
40
|
+
};
|
|
41
|
+
export interface Message {
|
|
42
|
+
id: MessageId;
|
|
43
|
+
chatId: ChannelId;
|
|
44
|
+
senderId: UserId;
|
|
45
|
+
content: MessageContent;
|
|
46
|
+
direction: 'incoming' | 'outgoing';
|
|
47
|
+
/** True when PlatformClient replaced an unavailable media message with a fallback text. */
|
|
48
|
+
fallback?: boolean;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AACnE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AACnE,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;AAC7D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAEnE,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAA2B;AAC1E,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAA2B;AAC1E,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAwB;AACjE,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAA2B;AAE1E,oBAAY,gBAAgB;IAC1B,SAAS,cAAc;IACvB,YAAY,kBAAkB;CAC/B;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Standard message types shared across all platforms. */
|
|
2
|
+
export function messageId(s) { return s; }
|
|
3
|
+
export function channelId(s) { return s; }
|
|
4
|
+
export function userId(s) { return s; }
|
|
5
|
+
export function sessionId(s) { return s; }
|
|
6
|
+
export var StreamCapability;
|
|
7
|
+
(function (StreamCapability) {
|
|
8
|
+
StreamCapability["Streaming"] = "streaming";
|
|
9
|
+
StreamCapability["NonStreaming"] = "non-streaming";
|
|
10
|
+
})(StreamCapability || (StreamCapability = {}));
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAW1D,MAAM,UAAU,SAAS,CAAC,CAAS,IAAe,OAAO,CAAc,CAAC,CAAC,CAAC;AAC1E,MAAM,UAAU,SAAS,CAAC,CAAS,IAAe,OAAO,CAAc,CAAC,CAAC,CAAC;AAC1E,MAAM,UAAU,MAAM,CAAC,CAAS,IAAY,OAAO,CAAW,CAAC,CAAC,CAAC;AACjE,MAAM,UAAU,SAAS,CAAC,CAAS,IAAe,OAAO,CAAc,CAAC,CAAC,CAAC;AAE1E,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,2CAAuB,CAAA;IACvB,kDAA8B,CAAA;AAChC,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** xabot — multi-platform bot bridge. Entry point. */
|
|
2
|
+
export { FeishuClient } from './platforms/feishu/client.js';
|
|
3
|
+
export type { FeishuClientConfig } from './platforms/feishu/client.js';
|
|
4
|
+
export { WechatClient } from './platforms/wechat/client.js';
|
|
5
|
+
export type { WechatConfig } from './platforms/wechat/client.js';
|
|
6
|
+
export { StreamCapability } from './core/types.js';
|
|
7
|
+
export type { Message, MessageContent, MessageId, ChannelId, UserId, SessionId, } from './core/types.js';
|
|
8
|
+
export { messageId, channelId, userId, sessionId } from './core/types.js';
|
|
9
|
+
export type { PlatformClient } from './core/client.js';
|
|
10
|
+
export { XabotEstablishHandler } from './xacpp/establish-handler.js';
|
|
11
|
+
export { XabotSessionHandler } from './xacpp/session-handler.js';
|
|
12
|
+
export { Bridge } from './bridge/index.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EACV,OAAO,EACP,cAAc,EACd,SAAS,EACT,SAAS,EACT,MAAM,EACN,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC1E,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** xabot — multi-platform bot bridge. Entry point. */
|
|
2
|
+
export { FeishuClient } from './platforms/feishu/client.js';
|
|
3
|
+
export { WechatClient } from './platforms/wechat/client.js';
|
|
4
|
+
export { StreamCapability } from './core/types.js';
|
|
5
|
+
export { messageId, channelId, userId, sessionId } from './core/types.js';
|
|
6
|
+
export { XabotEstablishHandler } from './xacpp/establish-handler.js';
|
|
7
|
+
export { XabotSessionHandler } from './xacpp/session-handler.js';
|
|
8
|
+
export { Bridge } from './bridge/index.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AASnD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { PlatformClient } from '../../core/client.js';
|
|
2
|
+
import type { ChannelId, MessageId, UserId, Message, MessageContent } from '../../core/types.js';
|
|
3
|
+
import { StreamCapability } from '../../core/types.js';
|
|
4
|
+
export type LogLevel = 'info' | 'debug' | 'trace';
|
|
5
|
+
export interface FeishuClientConfig {
|
|
6
|
+
appId: string;
|
|
7
|
+
appSecret: string;
|
|
8
|
+
logLevel?: LogLevel;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Feishu platform client using WebSocket long connection.
|
|
12
|
+
*
|
|
13
|
+
* Uses @larksuiteoapi/node-sdk:
|
|
14
|
+
* - WSClient: receives incoming messages via WebSocket
|
|
15
|
+
* - Client: sends outgoing messages via REST API
|
|
16
|
+
*/
|
|
17
|
+
export declare class FeishuClient implements PlatformClient {
|
|
18
|
+
#private;
|
|
19
|
+
readonly platform: "feishu";
|
|
20
|
+
private readonly config;
|
|
21
|
+
private readonly wsClient;
|
|
22
|
+
private readonly httpClient;
|
|
23
|
+
private readonly eventDispatcher;
|
|
24
|
+
private readonly messageBuffer;
|
|
25
|
+
private messageResolve;
|
|
26
|
+
private connected;
|
|
27
|
+
private readonly activeReactions;
|
|
28
|
+
constructor(config: FeishuClientConfig);
|
|
29
|
+
connect(): Promise<void>;
|
|
30
|
+
send(chatId: ChannelId, content: MessageContent): Promise<MessageId>;
|
|
31
|
+
private _uploadAndSend;
|
|
32
|
+
private _doSend;
|
|
33
|
+
messages(): AsyncIterable<Message>;
|
|
34
|
+
streamCapability(): StreamCapability;
|
|
35
|
+
/**
|
|
36
|
+
* Fetch a fresh tenant_access_token from Feishu.
|
|
37
|
+
*/
|
|
38
|
+
private fetchTenantToken;
|
|
39
|
+
/**
|
|
40
|
+
* List subscribed event types by calling the event subscription list API.
|
|
41
|
+
*/
|
|
42
|
+
listEventSubscriptions(): Promise<string[]>;
|
|
43
|
+
healthCheck(): Promise<void>;
|
|
44
|
+
setTypingIndicator(_chatId: ChannelId, _senderId: UserId, messageId?: MessageId): Promise<void>;
|
|
45
|
+
refreshTypingIndicator(_chatId: ChannelId, _senderId: UserId): Promise<void>;
|
|
46
|
+
releaseTypingIndicator(_chatId: ChannelId, _senderId: UserId, messageId?: MessageId): Promise<void>;
|
|
47
|
+
close(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/platforms/feishu/client.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEjG,OAAO,EAAE,gBAAgB,EAAgC,MAAM,qBAAqB,CAAC;AAUrF,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAID;;;;;;GAMG;AACH,qBAAa,YAAa,YAAW,cAAc;;IACjD,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4B;IAC1D,OAAO,CAAC,cAAc,CAAoD;IAC1E,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0D;gBAE9E,MAAM,EAAE,kBAAkB;IAgDhC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAexB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;YAoB5D,cAAc;YAmBd,OAAO;IAoBrB,QAAQ,IAAI,aAAa,CAAC,OAAO,CAAC;IAmElC,gBAAgB,IAAI,gBAAgB;IAIpC;;OAEG;YACW,gBAAgB;IAmB9B;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmB3C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/F,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5E,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAanG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB7B"}
|