@agentmarketpro/connector 1.0.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/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const index_1 = require("./index");
5
+ function parseArgs() {
6
+ const args = {};
7
+ for (let i = 2; i < process.argv.length; i++) {
8
+ const arg = process.argv[i];
9
+ switch (arg) {
10
+ case '-i':
11
+ case '--id':
12
+ args.id = process.argv[++i];
13
+ break;
14
+ case '-t':
15
+ case '--token':
16
+ args.token = process.argv[++i];
17
+ break;
18
+ case '-u':
19
+ case '--url':
20
+ args.url = process.argv[++i];
21
+ break;
22
+ case '-p':
23
+ case '--port':
24
+ args.port = parseInt(process.argv[++i], 10);
25
+ break;
26
+ case '-h':
27
+ case '--help':
28
+ args.help = true;
29
+ break;
30
+ }
31
+ }
32
+ return args;
33
+ }
34
+ function printHelp() {
35
+ console.log(`
36
+ ๐Ÿค– AgentMarketPro Connector
37
+
38
+ ็”จๆณ•:
39
+ npx @agentmarketpro/connector --id <่ฟžๆŽฅID> --token <Token> [้€‰้กน]
40
+
41
+ ้€‰้กน:
42
+ -i, --id <ID> ่ฟžๆŽฅID (ๅฟ…ๅกซ)
43
+ -t, --token <Token> ่ฎค่ฏToken (ๅฟ…ๅกซ)
44
+ -u, --url <URL> ๅนณๅฐๅœฐๅ€ (้ป˜่ฎค: http://localhost:3000)
45
+ -p, --port <็ซฏๅฃ> OpenClaw ็ซฏๅฃ (้ป˜่ฎค: 18789)
46
+ -h, --help ๆ˜พ็คบๅธฎๅŠฉ
47
+
48
+ ็คบไพ‹:
49
+ npx @agentmarketpro/connector --id abc123 --token xyz789
50
+
51
+ # ่‡ชๅฎšไน‰ๅนณๅฐๅœฐๅ€
52
+ npx @agentmarketpro/connector --id abc123 --token xyz789 --url https://agentmarketpro.com
53
+ `);
54
+ }
55
+ async function main() {
56
+ const args = parseArgs();
57
+ if (args.help) {
58
+ printHelp();
59
+ process.exit(0);
60
+ }
61
+ const connectionId = args.id || process.env.AGENTMARKETPRO_CONNECTION_ID;
62
+ const token = args.token || process.env.AGENTMARKETPRO_TOKEN;
63
+ const platformUrl = args.url || process.env.AGENTMARKETPRO_URL || 'http://localhost:3000';
64
+ if (!connectionId || !token) {
65
+ console.error('โŒ ้”™่ฏฏ: ้œ€่ฆๆไพ› --id ๅ’Œ --token');
66
+ console.log('');
67
+ printHelp();
68
+ process.exit(1);
69
+ }
70
+ console.log(`
71
+ โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
72
+ โ•‘ AgentMarketPro Connector ๅฏๅŠจไธญ... โ•‘
73
+ โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
74
+ `);
75
+ const connector = new index_1.Connector({
76
+ connectionId,
77
+ token,
78
+ platformUrl,
79
+ openclawPort: args.port,
80
+ logLevel: 'info',
81
+ });
82
+ // ็Šถๆ€ๅ˜ๅŒ–
83
+ connector.onStatusChange((status) => {
84
+ if (status.connected) {
85
+ console.log('โœ… ๅทฒ่ฟžๆŽฅๅˆฐๅนณๅฐ');
86
+ }
87
+ else {
88
+ console.log('โŒ ่ฟžๆŽฅๆ–ญๅผ€๏ผŒๆญฃๅœจ้‡่ฟž...');
89
+ }
90
+ });
91
+ // ้”™่ฏฏๅค„็†
92
+ connector.onError((error) => {
93
+ console.error('โŒ ้”™่ฏฏ:', error.message);
94
+ });
95
+ // ๅฏๅŠจ
96
+ await connector.start();
97
+ // ไผ˜้›…้€€ๅ‡บ
98
+ process.on('SIGINT', async () => {
99
+ console.log('\n\n๐Ÿ‘‹ ๆญฃๅœจๅ…ณ้—ญ...');
100
+ await connector.stop();
101
+ process.exit(0);
102
+ });
103
+ }
104
+ main().catch(console.error);
105
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,mCAAoC;AAWpC,SAAS,SAAS;IAChB,MAAM,IAAI,GAAY,EAAE,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE5B,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,IAAI,CAAC;YACV,KAAK,MAAM;gBACT,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5B,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,SAAS;gBACZ,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,OAAO;gBACV,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7B,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5C,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;CAkBb,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,uBAAuB,CAAC;IAE1F,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC;;;;CAIb,CAAC,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,iBAAS,CAAC;QAC9B,YAAY;QACZ,KAAK;QACL,WAAW;QACX,YAAY,EAAE,IAAI,CAAC,IAAI;QACvB,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,OAAO;IACP,SAAS,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,EAAE;QAClC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;IACP,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,KAAK;IACL,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAExB,OAAO;IACP,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,87 @@
1
+ export interface ConnectorConfig {
2
+ platformUrl: string;
3
+ connectionId: string;
4
+ token: string;
5
+ openclawPort?: number;
6
+ logLevel?: 'info' | 'debug' | 'error';
7
+ }
8
+ export interface Message {
9
+ sessionId: string;
10
+ content: string;
11
+ senderId?: string;
12
+ senderName?: string;
13
+ }
14
+ export interface AgentInfo {
15
+ id: string;
16
+ name: string;
17
+ }
18
+ export declare class Connector {
19
+ private ws;
20
+ private config;
21
+ private reconnectTimer;
22
+ private pingTimer;
23
+ private messageHandler?;
24
+ private statusHandler?;
25
+ private errorHandler?;
26
+ constructor(config: ConnectorConfig);
27
+ /**
28
+ * ่ฎพ็ฝฎๆถˆๆฏๅค„็†ๅ‡ฝๆ•ฐ
29
+ */
30
+ onMessage(handler: (message: Message) => Promise<string>): this;
31
+ /**
32
+ * ่ฎพ็ฝฎ็Šถๆ€ๅ˜ๅŒ–ๅ›ž่ฐƒ
33
+ */
34
+ onStatusChange(handler: (status: {
35
+ connected: boolean;
36
+ agentId?: string;
37
+ }) => void): this;
38
+ /**
39
+ * ่ฎพ็ฝฎ้”™่ฏฏๅค„็†
40
+ */
41
+ onError(handler: (error: Error) => void): this;
42
+ /**
43
+ * ๅฏๅŠจ่ฟžๆŽฅๅ™จ
44
+ */
45
+ start(): Promise<void>;
46
+ /**
47
+ * ๅœๆญข่ฟžๆŽฅๅ™จ
48
+ */
49
+ stop(): Promise<void>;
50
+ /**
51
+ * ่ฟžๆŽฅๅˆฐๅนณๅฐ
52
+ */
53
+ private connect;
54
+ /**
55
+ * ๅค„็†ๆ”ถๅˆฐ็š„ๆถˆๆฏ
56
+ */
57
+ private handleMessage;
58
+ /**
59
+ * ๅค„็†็”จๆˆทๆถˆๆฏ
60
+ */
61
+ private processMessage;
62
+ /**
63
+ * ่ฐƒ็”จๆœฌๅœฐ OpenClaw
64
+ */
65
+ private callOpenClaw;
66
+ /**
67
+ * ๅ‘้€ๅ›žๅคๅˆฐๅนณๅฐ
68
+ */
69
+ private sendReply;
70
+ /**
71
+ * ๅ‘้€ๅฟƒ่ทณ
72
+ */
73
+ private sendPing;
74
+ /**
75
+ * ๅฎ‰ๆŽ’้‡่ฟž
76
+ */
77
+ private scheduleReconnect;
78
+ /**
79
+ * ๆ—ฅๅฟ—
80
+ */
81
+ private log;
82
+ }
83
+ /**
84
+ * ไพฟๆทๅฏๅŠจๅ‡ฝๆ•ฐ
85
+ */
86
+ export declare function startConnector(config: ConnectorConfig): Promise<Connector>;
87
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,cAAc,CAAC,CAAwC;IAC/D,OAAO,CAAC,aAAa,CAAC,CAA6D;IACnF,OAAO,CAAC,YAAY,CAAC,CAAyB;gBAElC,MAAM,EAAE,eAAe;IAQnC;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IAK/D;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI;IAKzF;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAK9C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B;;OAEG;IACH,OAAO,CAAC,OAAO;IA4Cf;;OAEG;YACW,aAAa;IA+B3B;;OAEG;YACW,cAAc;IAwC5B;;OAEG;YACW,YAAY;IAwB1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAkBjB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAMhB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,GAAG;CAUZ;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAIhF"}
package/dist/index.js ADDED
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Connector = void 0;
7
+ exports.startConnector = startConnector;
8
+ const ws_1 = __importDefault(require("ws"));
9
+ const child_process_1 = require("child_process");
10
+ class Connector {
11
+ constructor(config) {
12
+ this.ws = null;
13
+ this.reconnectTimer = null;
14
+ this.pingTimer = null;
15
+ this.config = {
16
+ openclawPort: 18789,
17
+ logLevel: 'info',
18
+ ...config,
19
+ };
20
+ }
21
+ /**
22
+ * ่ฎพ็ฝฎๆถˆๆฏๅค„็†ๅ‡ฝๆ•ฐ
23
+ */
24
+ onMessage(handler) {
25
+ this.messageHandler = handler;
26
+ return this;
27
+ }
28
+ /**
29
+ * ่ฎพ็ฝฎ็Šถๆ€ๅ˜ๅŒ–ๅ›ž่ฐƒ
30
+ */
31
+ onStatusChange(handler) {
32
+ this.statusHandler = handler;
33
+ return this;
34
+ }
35
+ /**
36
+ * ่ฎพ็ฝฎ้”™่ฏฏๅค„็†
37
+ */
38
+ onError(handler) {
39
+ this.errorHandler = handler;
40
+ return this;
41
+ }
42
+ /**
43
+ * ๅฏๅŠจ่ฟžๆŽฅๅ™จ
44
+ */
45
+ async start() {
46
+ this.log('info', '๐Ÿš€ ๅฏๅŠจ่ฟžๆŽฅๅ™จ...');
47
+ this.log('info', ` ๅนณๅฐ: ${this.config.platformUrl}`);
48
+ this.log('info', ` ่ฟžๆŽฅID: ${this.config.connectionId}`);
49
+ this.connect();
50
+ }
51
+ /**
52
+ * ๅœๆญข่ฟžๆŽฅๅ™จ
53
+ */
54
+ async stop() {
55
+ this.log('info', '๐Ÿ›‘ ๅœๆญข่ฟžๆŽฅๅ™จ...');
56
+ if (this.pingTimer) {
57
+ clearInterval(this.pingTimer);
58
+ this.pingTimer = null;
59
+ }
60
+ if (this.reconnectTimer) {
61
+ clearTimeout(this.reconnectTimer);
62
+ this.reconnectTimer = null;
63
+ }
64
+ if (this.ws) {
65
+ this.ws.close();
66
+ this.ws = null;
67
+ }
68
+ this.statusHandler?.({ connected: false });
69
+ }
70
+ /**
71
+ * ่ฟžๆŽฅๅˆฐๅนณๅฐ
72
+ */
73
+ connect() {
74
+ const wsUrl = this.config.platformUrl.replace(/^http/, 'ws') + '/ws/connector';
75
+ this.ws = new ws_1.default(wsUrl, {
76
+ headers: {
77
+ 'X-Connection-ID': this.config.connectionId,
78
+ 'X-Token': this.config.token,
79
+ },
80
+ });
81
+ this.ws.on('open', () => {
82
+ this.log('info', 'โœ… ๅทฒ่ฟžๆŽฅๅˆฐๅนณๅฐ');
83
+ this.statusHandler?.({ connected: true, agentId: this.config.connectionId });
84
+ // ๅฏๅŠจๅฟƒ่ทณ
85
+ this.pingTimer = setInterval(() => {
86
+ this.sendPing();
87
+ }, 30000);
88
+ });
89
+ this.ws.on('message', (data) => {
90
+ this.handleMessage(data);
91
+ });
92
+ this.ws.on('close', () => {
93
+ this.log('info', '๐Ÿ”Œ ่ฟžๆŽฅๆ–ญๅผ€');
94
+ this.statusHandler?.({ connected: false });
95
+ // ๆธ…็†ๅฟƒ่ทณ
96
+ if (this.pingTimer) {
97
+ clearInterval(this.pingTimer);
98
+ this.pingTimer = null;
99
+ }
100
+ // ่‡ชๅŠจ้‡่ฟž
101
+ this.scheduleReconnect();
102
+ });
103
+ this.ws.on('error', (error) => {
104
+ this.log('error', `โŒ ่ฟžๆŽฅ้”™่ฏฏ: ${error.message}`);
105
+ this.errorHandler?.(error);
106
+ });
107
+ }
108
+ /**
109
+ * ๅค„็†ๆ”ถๅˆฐ็š„ๆถˆๆฏ
110
+ */
111
+ async handleMessage(data) {
112
+ try {
113
+ const msg = JSON.parse(data.toString());
114
+ // ๅค„็†ไธๅŒ็ฑปๅž‹็š„ๆถˆๆฏ
115
+ switch (msg.type) {
116
+ case 'ping':
117
+ this.ws?.send(JSON.stringify({ type: 'pong' }));
118
+ break;
119
+ case 'pong':
120
+ // ๅฟƒ่ทณๅ“ๅบ”
121
+ break;
122
+ case 'message':
123
+ // ๆ”ถๅˆฐ็”จๆˆทๆถˆๆฏ๏ผŒ้œ€่ฆๅค„็†ๅนถๅ›žๅค
124
+ await this.processMessage(msg.payload);
125
+ break;
126
+ case 'error':
127
+ this.log('error', `โŒ ๅนณๅฐ้”™่ฏฏ: ${msg.message}`);
128
+ break;
129
+ default:
130
+ this.log('debug', `๐Ÿ“จ ๆ”ถๅˆฐๆœช็Ÿฅๆถˆๆฏ: ${msg.type}`);
131
+ }
132
+ }
133
+ catch (error) {
134
+ this.log('error', `โŒ ๆถˆๆฏ่งฃๆžๅคฑ่ดฅ: ${error}`);
135
+ }
136
+ }
137
+ /**
138
+ * ๅค„็†็”จๆˆทๆถˆๆฏ
139
+ */
140
+ async processMessage(payload) {
141
+ const { sessionId, content, messageId, senderId, senderName } = payload;
142
+ this.log('info', `\n๐Ÿ“จ ๆ”ถๅˆฐๆถˆๆฏ:`);
143
+ this.log('info', ` ไผš่ฏ: ${sessionId}`);
144
+ this.log('info', ` ็”จๆˆท: ${senderName || 'Unknown'}`);
145
+ this.log('info', ` ๅ†…ๅฎน: ${content.substring(0, 50)}...`);
146
+ try {
147
+ let reply;
148
+ if (this.messageHandler) {
149
+ // ไฝฟ็”จ่‡ชๅฎšไน‰ๅค„็†ๅ‡ฝๆ•ฐ
150
+ reply = await this.messageHandler({
151
+ sessionId,
152
+ content,
153
+ senderId,
154
+ senderName,
155
+ });
156
+ }
157
+ else {
158
+ // ้ป˜่ฎค่ฐƒ็”จ OpenClaw
159
+ reply = await this.callOpenClaw(content, sessionId);
160
+ }
161
+ this.log('info', ` ๅ›žๅค: ${reply.substring(0, 50)}...`);
162
+ // ๅ‘้€ๅ›žๅค
163
+ this.sendReply(sessionId, messageId, reply);
164
+ }
165
+ catch (error) {
166
+ this.log('error', `โŒ ๅค„็†ๆถˆๆฏๅคฑ่ดฅ: ${error}`);
167
+ this.sendReply(sessionId, messageId, 'ๆŠฑๆญ‰๏ผŒๆˆ‘ๆš‚ๆ—ถๆ— ๆณ•ๅค„็†ไฝ ็š„่ฏทๆฑ‚ใ€‚');
168
+ }
169
+ }
170
+ /**
171
+ * ่ฐƒ็”จๆœฌๅœฐ OpenClaw
172
+ */
173
+ async callOpenClaw(message, sessionId) {
174
+ try {
175
+ const cleanMessage = message.replace(/"/g, '\\"');
176
+ const result = (0, child_process_1.execSync)(`openclaw agent --message "${cleanMessage}" --session-id ${sessionId}`, {
177
+ encoding: 'utf-8',
178
+ timeout: 60000,
179
+ maxBuffer: 10 * 1024 * 1024,
180
+ });
181
+ // ่ฟ‡ๆปคๆ—ฅๅฟ—่กŒ
182
+ const lines = result.split('\n');
183
+ const replyLines = lines.filter(line => !line.startsWith('[') && line.trim());
184
+ const reply = replyLines.join('\n').trim();
185
+ return reply || 'ๆ”ถๅˆฐๆถˆๆฏ';
186
+ }
187
+ catch (error) {
188
+ this.log('error', `โŒ OpenClaw ่ฐƒ็”จๅคฑ่ดฅ: ${error}`);
189
+ throw error;
190
+ }
191
+ }
192
+ /**
193
+ * ๅ‘้€ๅ›žๅคๅˆฐๅนณๅฐ
194
+ */
195
+ sendReply(sessionId, messageId, reply) {
196
+ if (!this.ws || this.ws.readyState !== ws_1.default.OPEN) {
197
+ this.log('error', 'โŒ ่ฟžๆŽฅๆœชๅปบ็ซ‹๏ผŒๆ— ๆณ•ๅ‘้€ๅ›žๅค');
198
+ return;
199
+ }
200
+ this.ws.send(JSON.stringify({
201
+ type: 'reply',
202
+ payload: {
203
+ sessionId,
204
+ messageId,
205
+ content: reply,
206
+ },
207
+ }));
208
+ this.log('info', 'โœ… ๅ›žๅคๅทฒๅ‘้€');
209
+ }
210
+ /**
211
+ * ๅ‘้€ๅฟƒ่ทณ
212
+ */
213
+ sendPing() {
214
+ if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
215
+ this.ws.send(JSON.stringify({ type: 'ping' }));
216
+ }
217
+ }
218
+ /**
219
+ * ๅฎ‰ๆŽ’้‡่ฟž
220
+ */
221
+ scheduleReconnect() {
222
+ if (this.reconnectTimer)
223
+ return;
224
+ this.log('info', 'โณ 5็ง’ๅŽๅฐ่ฏ•้‡่ฟž...');
225
+ this.reconnectTimer = setTimeout(() => {
226
+ this.reconnectTimer = null;
227
+ this.connect();
228
+ }, 5000);
229
+ }
230
+ /**
231
+ * ๆ—ฅๅฟ—
232
+ */
233
+ log(level, message) {
234
+ const prefix = '[Connector]';
235
+ const timestamp = new Date().toISOString();
236
+ if (level === 'error') {
237
+ console.error(`${timestamp} ${prefix} ${message}`);
238
+ }
239
+ else if (this.config.logLevel === 'debug' || level === 'info') {
240
+ console.log(`${timestamp} ${prefix} ${message}`);
241
+ }
242
+ }
243
+ }
244
+ exports.Connector = Connector;
245
+ /**
246
+ * ไพฟๆทๅฏๅŠจๅ‡ฝๆ•ฐ
247
+ */
248
+ async function startConnector(config) {
249
+ const connector = new Connector(config);
250
+ await connector.start();
251
+ return connector;
252
+ }
253
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@agentmarketpro/connector",
3
+ "version": "1.0.0",
4
+ "description": "AgentMarketPro Connector - ่ฟžๆŽฅๆœฌๅœฐ OpenClaw ๅˆฐๅนณๅฐ",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "agentmarketpro-connector": "dist/cli.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "prepublishOnly": "npm run build"
14
+ },
15
+ "keywords": ["agentmarketpro", "openclaw", "connector", "ai-agent"],
16
+ "author": "",
17
+ "license": "MIT",
18
+ "dependencies": {
19
+ "ws": "^8.16.0",
20
+ "axios": "^1.6.0",
21
+ "dotenv": "^16.3.1"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^20.10.0",
25
+ "@types/ws": "^8.5.10",
26
+ "typescript": "^5.3.0"
27
+ }
28
+ }
package/src/cli.ts ADDED
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { Connector } from './index';
4
+ import { randomUUID } from 'crypto';
5
+
6
+ interface CliArgs {
7
+ id?: string;
8
+ token?: string;
9
+ url?: string;
10
+ port?: number;
11
+ help?: boolean;
12
+ }
13
+
14
+ function parseArgs(): CliArgs {
15
+ const args: CliArgs = {};
16
+
17
+ for (let i = 2; i < process.argv.length; i++) {
18
+ const arg = process.argv[i];
19
+
20
+ switch (arg) {
21
+ case '-i':
22
+ case '--id':
23
+ args.id = process.argv[++i];
24
+ break;
25
+ case '-t':
26
+ case '--token':
27
+ args.token = process.argv[++i];
28
+ break;
29
+ case '-u':
30
+ case '--url':
31
+ args.url = process.argv[++i];
32
+ break;
33
+ case '-p':
34
+ case '--port':
35
+ args.port = parseInt(process.argv[++i], 10);
36
+ break;
37
+ case '-h':
38
+ case '--help':
39
+ args.help = true;
40
+ break;
41
+ }
42
+ }
43
+
44
+ return args;
45
+ }
46
+
47
+ function printHelp(): void {
48
+ console.log(`
49
+ ๐Ÿค– AgentMarketPro Connector
50
+
51
+ ็”จๆณ•:
52
+ npx @agentmarketpro/connector --id <่ฟžๆŽฅID> --token <Token> [้€‰้กน]
53
+
54
+ ้€‰้กน:
55
+ -i, --id <ID> ่ฟžๆŽฅID (ๅฟ…ๅกซ)
56
+ -t, --token <Token> ่ฎค่ฏToken (ๅฟ…ๅกซ)
57
+ -u, --url <URL> ๅนณๅฐๅœฐๅ€ (้ป˜่ฎค: http://localhost:3000)
58
+ -p, --port <็ซฏๅฃ> OpenClaw ็ซฏๅฃ (้ป˜่ฎค: 18789)
59
+ -h, --help ๆ˜พ็คบๅธฎๅŠฉ
60
+
61
+ ็คบไพ‹:
62
+ npx @agentmarketpro/connector --id abc123 --token xyz789
63
+
64
+ # ่‡ชๅฎšไน‰ๅนณๅฐๅœฐๅ€
65
+ npx @agentmarketpro/connector --id abc123 --token xyz789 --url https://agentmarketpro.com
66
+ `);
67
+ }
68
+
69
+ async function main() {
70
+ const args = parseArgs();
71
+
72
+ if (args.help) {
73
+ printHelp();
74
+ process.exit(0);
75
+ }
76
+
77
+ const connectionId = args.id || process.env.AGENTMARKETPRO_CONNECTION_ID;
78
+ const token = args.token || process.env.AGENTMARKETPRO_TOKEN;
79
+ const platformUrl = args.url || process.env.AGENTMARKETPRO_URL || 'http://localhost:3000';
80
+
81
+ if (!connectionId || !token) {
82
+ console.error('โŒ ้”™่ฏฏ: ้œ€่ฆๆไพ› --id ๅ’Œ --token');
83
+ console.log('');
84
+ printHelp();
85
+ process.exit(1);
86
+ }
87
+
88
+ console.log(`
89
+ โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
90
+ โ•‘ AgentMarketPro Connector ๅฏๅŠจไธญ... โ•‘
91
+ โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
92
+ `);
93
+
94
+ const connector = new Connector({
95
+ connectionId,
96
+ token,
97
+ platformUrl,
98
+ openclawPort: args.port,
99
+ logLevel: 'info',
100
+ });
101
+
102
+ // ็Šถๆ€ๅ˜ๅŒ–
103
+ connector.onStatusChange((status) => {
104
+ if (status.connected) {
105
+ console.log('โœ… ๅทฒ่ฟžๆŽฅๅˆฐๅนณๅฐ');
106
+ } else {
107
+ console.log('โŒ ่ฟžๆŽฅๆ–ญๅผ€๏ผŒๆญฃๅœจ้‡่ฟž...');
108
+ }
109
+ });
110
+
111
+ // ้”™่ฏฏๅค„็†
112
+ connector.onError((error) => {
113
+ console.error('โŒ ้”™่ฏฏ:', error.message);
114
+ });
115
+
116
+ // ๅฏๅŠจ
117
+ await connector.start();
118
+
119
+ // ไผ˜้›…้€€ๅ‡บ
120
+ process.on('SIGINT', async () => {
121
+ console.log('\n\n๐Ÿ‘‹ ๆญฃๅœจๅ…ณ้—ญ...');
122
+ await connector.stop();
123
+ process.exit(0);
124
+ });
125
+ }
126
+
127
+ main().catch(console.error);
package/src/index.ts ADDED
@@ -0,0 +1,318 @@
1
+ import WebSocket from 'ws';
2
+ import { execSync } from 'child_process';
3
+ import { randomUUID } from 'crypto';
4
+
5
+ export interface ConnectorConfig {
6
+ platformUrl: string;
7
+ connectionId: string;
8
+ token: string;
9
+ openclawPort?: number;
10
+ logLevel?: 'info' | 'debug' | 'error';
11
+ }
12
+
13
+ export interface Message {
14
+ sessionId: string;
15
+ content: string;
16
+ senderId?: string;
17
+ senderName?: string;
18
+ }
19
+
20
+ export interface AgentInfo {
21
+ id: string;
22
+ name: string;
23
+ }
24
+
25
+ export class Connector {
26
+ private ws: WebSocket | null = null;
27
+ private config: ConnectorConfig;
28
+ private reconnectTimer: NodeJS.Timeout | null = null;
29
+ private pingTimer: NodeJS.Timeout | null = null;
30
+ private messageHandler?: (message: Message) => Promise<string>;
31
+ private statusHandler?: (status: { connected: boolean; agentId?: string }) => void;
32
+ private errorHandler?: (error: Error) => void;
33
+
34
+ constructor(config: ConnectorConfig) {
35
+ this.config = {
36
+ openclawPort: 18789,
37
+ logLevel: 'info',
38
+ ...config,
39
+ };
40
+ }
41
+
42
+ /**
43
+ * ่ฎพ็ฝฎๆถˆๆฏๅค„็†ๅ‡ฝๆ•ฐ
44
+ */
45
+ onMessage(handler: (message: Message) => Promise<string>): this {
46
+ this.messageHandler = handler;
47
+ return this;
48
+ }
49
+
50
+ /**
51
+ * ่ฎพ็ฝฎ็Šถๆ€ๅ˜ๅŒ–ๅ›ž่ฐƒ
52
+ */
53
+ onStatusChange(handler: (status: { connected: boolean; agentId?: string }) => void): this {
54
+ this.statusHandler = handler;
55
+ return this;
56
+ }
57
+
58
+ /**
59
+ * ่ฎพ็ฝฎ้”™่ฏฏๅค„็†
60
+ */
61
+ onError(handler: (error: Error) => void): this {
62
+ this.errorHandler = handler;
63
+ return this;
64
+ }
65
+
66
+ /**
67
+ * ๅฏๅŠจ่ฟžๆŽฅๅ™จ
68
+ */
69
+ async start(): Promise<void> {
70
+ this.log('info', '๐Ÿš€ ๅฏๅŠจ่ฟžๆŽฅๅ™จ...');
71
+ this.log('info', ` ๅนณๅฐ: ${this.config.platformUrl}`);
72
+ this.log('info', ` ่ฟžๆŽฅID: ${this.config.connectionId}`);
73
+
74
+ this.connect();
75
+ }
76
+
77
+ /**
78
+ * ๅœๆญข่ฟžๆŽฅๅ™จ
79
+ */
80
+ async stop(): Promise<void> {
81
+ this.log('info', '๐Ÿ›‘ ๅœๆญข่ฟžๆŽฅๅ™จ...');
82
+
83
+ if (this.pingTimer) {
84
+ clearInterval(this.pingTimer);
85
+ this.pingTimer = null;
86
+ }
87
+
88
+ if (this.reconnectTimer) {
89
+ clearTimeout(this.reconnectTimer);
90
+ this.reconnectTimer = null;
91
+ }
92
+
93
+ if (this.ws) {
94
+ this.ws.close();
95
+ this.ws = null;
96
+ }
97
+
98
+ this.statusHandler?.({ connected: false });
99
+ }
100
+
101
+ /**
102
+ * ่ฟžๆŽฅๅˆฐๅนณๅฐ
103
+ */
104
+ private connect(): void {
105
+ const wsUrl = this.config.platformUrl.replace(/^http/, 'ws') + '/ws/connector';
106
+
107
+ this.ws = new WebSocket(wsUrl, {
108
+ headers: {
109
+ 'X-Connection-ID': this.config.connectionId,
110
+ 'X-Token': this.config.token,
111
+ },
112
+ });
113
+
114
+ this.ws.on('open', () => {
115
+ this.log('info', 'โœ… ๅทฒ่ฟžๆŽฅๅˆฐๅนณๅฐ');
116
+ this.statusHandler?.({ connected: true, agentId: this.config.connectionId });
117
+
118
+ // ๅฏๅŠจๅฟƒ่ทณ
119
+ this.pingTimer = setInterval(() => {
120
+ this.sendPing();
121
+ }, 30000);
122
+ });
123
+
124
+ this.ws.on('message', (data) => {
125
+ this.handleMessage(data);
126
+ });
127
+
128
+ this.ws.on('close', () => {
129
+ this.log('info', '๐Ÿ”Œ ่ฟžๆŽฅๆ–ญๅผ€');
130
+ this.statusHandler?.({ connected: false });
131
+
132
+ // ๆธ…็†ๅฟƒ่ทณ
133
+ if (this.pingTimer) {
134
+ clearInterval(this.pingTimer);
135
+ this.pingTimer = null;
136
+ }
137
+
138
+ // ่‡ชๅŠจ้‡่ฟž
139
+ this.scheduleReconnect();
140
+ });
141
+
142
+ this.ws.on('error', (error) => {
143
+ this.log('error', `โŒ ่ฟžๆŽฅ้”™่ฏฏ: ${error.message}`);
144
+ this.errorHandler?.(error);
145
+ });
146
+ }
147
+
148
+ /**
149
+ * ๅค„็†ๆ”ถๅˆฐ็š„ๆถˆๆฏ
150
+ */
151
+ private async handleMessage(data: WebSocket.Data): Promise<void> {
152
+ try {
153
+ const msg = JSON.parse(data.toString());
154
+
155
+ // ๅค„็†ไธๅŒ็ฑปๅž‹็š„ๆถˆๆฏ
156
+ switch (msg.type) {
157
+ case 'ping':
158
+ this.ws?.send(JSON.stringify({ type: 'pong' }));
159
+ break;
160
+
161
+ case 'pong':
162
+ // ๅฟƒ่ทณๅ“ๅบ”
163
+ break;
164
+
165
+ case 'message':
166
+ // ๆ”ถๅˆฐ็”จๆˆทๆถˆๆฏ๏ผŒ้œ€่ฆๅค„็†ๅนถๅ›žๅค
167
+ await this.processMessage(msg.payload);
168
+ break;
169
+
170
+ case 'error':
171
+ this.log('error', `โŒ ๅนณๅฐ้”™่ฏฏ: ${msg.message}`);
172
+ break;
173
+
174
+ default:
175
+ this.log('debug', `๐Ÿ“จ ๆ”ถๅˆฐๆœช็Ÿฅๆถˆๆฏ: ${msg.type}`);
176
+ }
177
+ } catch (error) {
178
+ this.log('error', `โŒ ๆถˆๆฏ่งฃๆžๅคฑ่ดฅ: ${error}`);
179
+ }
180
+ }
181
+
182
+ /**
183
+ * ๅค„็†็”จๆˆทๆถˆๆฏ
184
+ */
185
+ private async processMessage(payload: {
186
+ sessionId: string;
187
+ content: string;
188
+ messageId: string;
189
+ senderId?: string;
190
+ senderName?: string;
191
+ }): Promise<void> {
192
+ const { sessionId, content, messageId, senderId, senderName } = payload;
193
+
194
+ this.log('info', `\n๐Ÿ“จ ๆ”ถๅˆฐๆถˆๆฏ:`);
195
+ this.log('info', ` ไผš่ฏ: ${sessionId}`);
196
+ this.log('info', ` ็”จๆˆท: ${senderName || 'Unknown'}`);
197
+ this.log('info', ` ๅ†…ๅฎน: ${content.substring(0, 50)}...`);
198
+
199
+ try {
200
+ let reply: string;
201
+
202
+ if (this.messageHandler) {
203
+ // ไฝฟ็”จ่‡ชๅฎšไน‰ๅค„็†ๅ‡ฝๆ•ฐ
204
+ reply = await this.messageHandler({
205
+ sessionId,
206
+ content,
207
+ senderId,
208
+ senderName,
209
+ });
210
+ } else {
211
+ // ้ป˜่ฎค่ฐƒ็”จ OpenClaw
212
+ reply = await this.callOpenClaw(content, sessionId);
213
+ }
214
+
215
+ this.log('info', ` ๅ›žๅค: ${reply.substring(0, 50)}...`);
216
+
217
+ // ๅ‘้€ๅ›žๅค
218
+ this.sendReply(sessionId, messageId, reply);
219
+ } catch (error) {
220
+ this.log('error', `โŒ ๅค„็†ๆถˆๆฏๅคฑ่ดฅ: ${error}`);
221
+ this.sendReply(sessionId, messageId, 'ๆŠฑๆญ‰๏ผŒๆˆ‘ๆš‚ๆ—ถๆ— ๆณ•ๅค„็†ไฝ ็š„่ฏทๆฑ‚ใ€‚');
222
+ }
223
+ }
224
+
225
+ /**
226
+ * ่ฐƒ็”จๆœฌๅœฐ OpenClaw
227
+ */
228
+ private async callOpenClaw(message: string, sessionId: string): Promise<string> {
229
+ try {
230
+ const cleanMessage = message.replace(/"/g, '\\"');
231
+ const result = execSync(
232
+ `openclaw agent --message "${cleanMessage}" --session-id ${sessionId}`,
233
+ {
234
+ encoding: 'utf-8',
235
+ timeout: 60000,
236
+ maxBuffer: 10 * 1024 * 1024,
237
+ }
238
+ );
239
+
240
+ // ่ฟ‡ๆปคๆ—ฅๅฟ—่กŒ
241
+ const lines = result.split('\n');
242
+ const replyLines = lines.filter(line => !line.startsWith('[') && line.trim());
243
+ const reply = replyLines.join('\n').trim();
244
+
245
+ return reply || 'ๆ”ถๅˆฐๆถˆๆฏ';
246
+ } catch (error) {
247
+ this.log('error', `โŒ OpenClaw ่ฐƒ็”จๅคฑ่ดฅ: ${error}`);
248
+ throw error;
249
+ }
250
+ }
251
+
252
+ /**
253
+ * ๅ‘้€ๅ›žๅคๅˆฐๅนณๅฐ
254
+ */
255
+ private sendReply(sessionId: string, messageId: string, reply: string): void {
256
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
257
+ this.log('error', 'โŒ ่ฟžๆŽฅๆœชๅปบ็ซ‹๏ผŒๆ— ๆณ•ๅ‘้€ๅ›žๅค');
258
+ return;
259
+ }
260
+
261
+ this.ws.send(JSON.stringify({
262
+ type: 'reply',
263
+ payload: {
264
+ sessionId,
265
+ messageId,
266
+ content: reply,
267
+ },
268
+ }));
269
+
270
+ this.log('info', 'โœ… ๅ›žๅคๅทฒๅ‘้€');
271
+ }
272
+
273
+ /**
274
+ * ๅ‘้€ๅฟƒ่ทณ
275
+ */
276
+ private sendPing(): void {
277
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
278
+ this.ws.send(JSON.stringify({ type: 'ping' }));
279
+ }
280
+ }
281
+
282
+ /**
283
+ * ๅฎ‰ๆŽ’้‡่ฟž
284
+ */
285
+ private scheduleReconnect(): void {
286
+ if (this.reconnectTimer) return;
287
+
288
+ this.log('info', 'โณ 5็ง’ๅŽๅฐ่ฏ•้‡่ฟž...');
289
+
290
+ this.reconnectTimer = setTimeout(() => {
291
+ this.reconnectTimer = null;
292
+ this.connect();
293
+ }, 5000);
294
+ }
295
+
296
+ /**
297
+ * ๆ—ฅๅฟ—
298
+ */
299
+ private log(level: 'info' | 'debug' | 'error', message: string): void {
300
+ const prefix = '[Connector]';
301
+ const timestamp = new Date().toISOString();
302
+
303
+ if (level === 'error') {
304
+ console.error(`${timestamp} ${prefix} ${message}`);
305
+ } else if (this.config.logLevel === 'debug' || level === 'info') {
306
+ console.log(`${timestamp} ${prefix} ${message}`);
307
+ }
308
+ }
309
+ }
310
+
311
+ /**
312
+ * ไพฟๆทๅฏๅŠจๅ‡ฝๆ•ฐ
313
+ */
314
+ export async function startConnector(config: ConnectorConfig): Promise<Connector> {
315
+ const connector = new Connector(config);
316
+ await connector.start();
317
+ return connector;
318
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "commonjs",
5
+ "lib": ["ES2020"],
6
+ "outDir": "./dist",
7
+ "rootDir": "./src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "declaration": true,
13
+ "declarationMap": true,
14
+ "sourceMap": true
15
+ },
16
+ "include": ["src/**/*"],
17
+ "exclude": ["node_modules", "dist"]
18
+ }