va-claw 0.2.0 → 0.2.3

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.
Files changed (94) hide show
  1. package/README.md +13 -2
  2. package/README.zh-CN.md +13 -2
  3. package/dist/va-claw-bundle.mjs +212 -77
  4. package/package.json +5 -1
  5. package/packages/channels/discord/dist/.tsbuildinfo +1 -1
  6. package/packages/channels/discord/dist/runtime.test.js +9 -9
  7. package/packages/channels/discord/dist/runtime.test.js.map +1 -1
  8. package/packages/channels/dist/.tsbuildinfo +1 -1
  9. package/packages/channels/dist/index.d.ts +4 -2
  10. package/packages/channels/dist/index.d.ts.map +1 -1
  11. package/packages/channels/dist/index.js +6 -1
  12. package/packages/channels/dist/index.js.map +1 -1
  13. package/packages/channels/dist/lark.d.ts +3 -0
  14. package/packages/channels/dist/lark.d.ts.map +1 -0
  15. package/packages/channels/dist/lark.js +2 -0
  16. package/packages/channels/dist/lark.js.map +1 -0
  17. package/packages/channels/lark/dist/.tsbuildinfo +1 -0
  18. package/packages/channels/lark/dist/cli.d.ts +15 -0
  19. package/packages/channels/lark/dist/cli.d.ts.map +1 -0
  20. package/packages/channels/lark/dist/cli.js +61 -0
  21. package/packages/channels/lark/dist/cli.js.map +1 -0
  22. package/packages/channels/lark/dist/cli.test.d.ts +2 -0
  23. package/packages/channels/lark/dist/cli.test.d.ts.map +1 -0
  24. package/packages/channels/lark/dist/cli.test.js +21 -0
  25. package/packages/channels/lark/dist/cli.test.js.map +1 -0
  26. package/packages/channels/lark/dist/index.d.ts +14 -0
  27. package/packages/channels/lark/dist/index.d.ts.map +1 -0
  28. package/packages/channels/lark/dist/index.js +41 -0
  29. package/packages/channels/lark/dist/index.js.map +1 -0
  30. package/packages/channels/lark/dist/lark-client.d.ts +76 -0
  31. package/packages/channels/lark/dist/lark-client.d.ts.map +1 -0
  32. package/packages/channels/lark/dist/lark-client.js +167 -0
  33. package/packages/channels/lark/dist/lark-client.js.map +1 -0
  34. package/packages/channels/lark/dist/lark.test.d.ts +2 -0
  35. package/packages/channels/lark/dist/lark.test.d.ts.map +1 -0
  36. package/packages/channels/lark/dist/lark.test.js +196 -0
  37. package/packages/channels/lark/dist/lark.test.js.map +1 -0
  38. package/packages/channels/lark/dist/message.d.ts +15 -0
  39. package/packages/channels/lark/dist/message.d.ts.map +1 -0
  40. package/packages/channels/lark/dist/message.js +108 -0
  41. package/packages/channels/lark/dist/message.js.map +1 -0
  42. package/packages/channels/lark/dist/types.d.ts +39 -0
  43. package/packages/channels/lark/dist/types.d.ts.map +1 -0
  44. package/packages/channels/lark/dist/types.js +2 -0
  45. package/packages/channels/lark/dist/types.js.map +1 -0
  46. package/packages/channels/lark/package.json +21 -0
  47. package/packages/channels/package.json +6 -1
  48. package/packages/channels/slack/dist/.tsbuildinfo +1 -1
  49. package/packages/channels/slack/dist/slack.test.js +6 -7
  50. package/packages/channels/slack/dist/slack.test.js.map +1 -1
  51. package/packages/channels/telegram/dist/.tsbuildinfo +1 -1
  52. package/packages/channels/telegram/dist/cli.test.js.map +1 -1
  53. package/packages/channels/telegram/dist/telegram.test.js +6 -7
  54. package/packages/channels/telegram/dist/telegram.test.js.map +1 -1
  55. package/packages/cli/dist/.tsbuildinfo +1 -1
  56. package/packages/cli/dist/channel-handlers.js +115 -66
  57. package/packages/cli/dist/deps.js +106 -71
  58. package/packages/cli/dist/index.js +100 -9
  59. package/packages/cli/dist/program.js +119 -151
  60. package/packages/cli/dist/test-helpers.js +104 -87
  61. package/packages/cli/dist/types.js +0 -2
  62. package/packages/daemon/dist/.tsbuildinfo +1 -1
  63. package/packages/daemon/dist/runner.d.ts.map +1 -1
  64. package/packages/daemon/dist/runner.js +15 -1
  65. package/packages/daemon/dist/runner.js.map +1 -1
  66. package/packages/daemon/dist/runtime.d.ts +6 -2
  67. package/packages/daemon/dist/runtime.d.ts.map +1 -1
  68. package/packages/daemon/dist/runtime.js +2 -2
  69. package/packages/daemon/dist/runtime.js.map +1 -1
  70. package/packages/daemon/dist/wake-cycle.d.ts +1 -0
  71. package/packages/daemon/dist/wake-cycle.d.ts.map +1 -1
  72. package/packages/daemon/dist/wake-cycle.js +7 -0
  73. package/packages/daemon/dist/wake-cycle.js.map +1 -1
  74. package/packages/daemon/package.json +1 -0
  75. package/packages/identity/dist/.tsbuildinfo +1 -1
  76. package/packages/identity/dist/defaults.d.ts.map +1 -1
  77. package/packages/identity/dist/defaults.js +13 -0
  78. package/packages/identity/dist/defaults.js.map +1 -1
  79. package/packages/identity/dist/types.d.ts +7 -0
  80. package/packages/identity/dist/types.d.ts.map +1 -1
  81. package/packages/identity/test/storage.test.mjs +10 -0
  82. package/packages/memory/dist/.tsbuildinfo +1 -1
  83. package/packages/memory/dist/embedding.d.ts +11 -1
  84. package/packages/memory/dist/embedding.d.ts.map +1 -1
  85. package/packages/memory/dist/embedding.js +44 -15
  86. package/packages/memory/dist/embedding.js.map +1 -1
  87. package/packages/memory/dist/memory-store.d.ts +3 -0
  88. package/packages/memory/dist/memory-store.d.ts.map +1 -1
  89. package/packages/memory/dist/memory-store.js +58 -18
  90. package/packages/memory/dist/memory-store.js.map +1 -1
  91. package/packages/memory/dist/sqlite.js.map +1 -1
  92. package/packages/memory/package.json +3 -0
  93. package/packages/skills/dist/.tsbuildinfo +1 -1
  94. package/skills/install-va-claw.md +12 -0
@@ -0,0 +1,196 @@
1
+ import { deepEqual, equal } from "node:assert/strict";
2
+ import test, { afterEach } from "node:test";
3
+ import { createLarkMessageHandler, formatLarkReply, createRecentMessageDeduper, parseLarkEvent, parseLarkPrompt, resetLarkClientDepsForTests, resetLarkDepsForTests, resetLarkMessageDepsForTests, resolveVaClawCommand, sendLarkMessage, setLarkClientDepsForTests, setLarkDepsForTests, setLarkMessageDepsForTests, startLarkChannel, stopLarkChannel, } from "./index.js";
4
+ afterEach(() => {
5
+ resetLarkDepsForTests();
6
+ resetLarkClientDepsForTests();
7
+ resetLarkMessageDepsForTests();
8
+ });
9
+ test("parseLarkPrompt ignores app messages and returns text", () => {
10
+ equal(parseLarkPrompt({
11
+ messageId: "m-1",
12
+ chatId: "c-1",
13
+ chatType: "p2p",
14
+ senderId: "u-1",
15
+ senderType: "user",
16
+ text: " hello ",
17
+ rawContent: "{\"text\":\"hello\"}",
18
+ timestamp: "1",
19
+ }), "hello");
20
+ equal(parseLarkPrompt({
21
+ messageId: "m-2",
22
+ chatId: "c-1",
23
+ chatType: "p2p",
24
+ senderId: "app-1",
25
+ senderType: "app",
26
+ text: "loop",
27
+ rawContent: "{\"text\":\"loop\"}",
28
+ timestamp: "2",
29
+ }), null);
30
+ });
31
+ test("parseLarkEvent strips mention placeholders", () => {
32
+ const message = parseLarkEvent({
33
+ sender: { sender_id: { open_id: "ou_123" }, sender_type: "user" },
34
+ message: {
35
+ message_id: "om_123",
36
+ chat_id: "oc_123",
37
+ chat_type: "group",
38
+ message_type: "text",
39
+ content: JSON.stringify({ text: "@_user_1 summarize this" }),
40
+ create_time: "1741890000000",
41
+ mentions: [{ key: "@_user_1", name: "va-claw" }],
42
+ },
43
+ });
44
+ deepEqual(message?.text, "summarize this");
45
+ deepEqual(message?.senderId, "ou_123");
46
+ });
47
+ test("resolveVaClawCommand detects direct and shortcut commands", () => {
48
+ deepEqual(resolveVaClawCommand("va-claw memory list"), ["memory", "list"]);
49
+ deepEqual(resolveVaClawCommand("va-claw memory recall \"foo bar\""), ["memory", "recall", "foo bar"]);
50
+ deepEqual(resolveVaClawCommand("va-claw memory recall 'foo bar'"), ["memory", "recall", "foo bar"]);
51
+ deepEqual(resolveVaClawCommand("STATUS"), ["status"]);
52
+ deepEqual(resolveVaClawCommand("write me a poem"), null);
53
+ });
54
+ test("createLarkMessageHandler routes known va-claw commands locally", async () => {
55
+ const replies = [];
56
+ let routedArgs = null;
57
+ let routedCommand = "";
58
+ let fallbackCalled = false;
59
+ setLarkMessageDepsForTests({
60
+ resolveVaClawCliCommand: () => "/usr/local/bin/va-claw",
61
+ runCli: async () => {
62
+ fallbackCalled = true;
63
+ return { type: "success", text: "fallback" };
64
+ },
65
+ runCliCommand: async (args, cliCommand) => {
66
+ routedArgs = args;
67
+ routedCommand = cliCommand ?? "";
68
+ return { type: "success", text: "local status" };
69
+ },
70
+ });
71
+ const handler = createLarkMessageHandler("node dist/cli.js");
72
+ await handler({
73
+ messageId: "m-1",
74
+ chatId: "c-1",
75
+ chatType: "group",
76
+ senderId: "u-1",
77
+ senderType: "user",
78
+ text: "status",
79
+ rawContent: "{\"text\":\"status\"}",
80
+ timestamp: "1",
81
+ }, {
82
+ async reply(_messageId, text) {
83
+ replies.push(text);
84
+ return true;
85
+ },
86
+ async sendToChat() {
87
+ return true;
88
+ },
89
+ start() { },
90
+ async stop() { },
91
+ });
92
+ deepEqual(routedArgs, ["status"]);
93
+ deepEqual(routedCommand, "/usr/local/bin/va-claw");
94
+ deepEqual(fallbackCalled, false);
95
+ deepEqual(replies, ["思考中...", "local status"]);
96
+ });
97
+ test("createLarkMessageHandler falls through to configured cliCommand for prompts", async () => {
98
+ let receivedPrompt = "";
99
+ let receivedCommand = "";
100
+ setLarkMessageDepsForTests({
101
+ runCli: async (prompt, cliCommand) => {
102
+ receivedPrompt = prompt;
103
+ receivedCommand = cliCommand ?? "";
104
+ return { type: "success", text: "ok" };
105
+ },
106
+ });
107
+ const handler = createLarkMessageHandler("claude -p");
108
+ await handler({
109
+ messageId: "m-2",
110
+ chatId: "c-1",
111
+ chatType: "group",
112
+ senderId: "u-1",
113
+ senderType: "user",
114
+ text: "summarize this thread",
115
+ rawContent: "{\"text\":\"summarize this thread\"}",
116
+ timestamp: "2",
117
+ }, {
118
+ async reply() {
119
+ return true;
120
+ },
121
+ async sendToChat() {
122
+ return true;
123
+ },
124
+ start() { },
125
+ async stop() { },
126
+ });
127
+ deepEqual(receivedPrompt, "summarize this thread");
128
+ deepEqual(receivedCommand, "claude -p");
129
+ });
130
+ test("createRecentMessageDeduper expires message ids after ttl", () => {
131
+ const timers = new Map();
132
+ let nextId = 1;
133
+ const deduper = createRecentMessageDeduper(60_000, ((callback) => {
134
+ const id = nextId++;
135
+ timers.set(id, callback);
136
+ return id;
137
+ }), ((timer) => {
138
+ timers.delete(timer);
139
+ }));
140
+ deduper.add("m-1");
141
+ deepEqual(deduper.has("m-1"), true);
142
+ timers.get(1)?.();
143
+ deepEqual(deduper.has("m-1"), false);
144
+ });
145
+ test("sendLarkMessage posts a text message with a one-shot client", async () => {
146
+ let receivedChatId = "";
147
+ let receivedText = "";
148
+ setLarkClientDepsForTests({
149
+ createClient: () => ({
150
+ im: {
151
+ message: {
152
+ async create(args) {
153
+ receivedChatId = args.data.receive_id;
154
+ receivedText = JSON.parse(args.data.content).text;
155
+ return { code: 0 };
156
+ },
157
+ async reply() {
158
+ return { code: 0 };
159
+ },
160
+ },
161
+ },
162
+ }),
163
+ });
164
+ const ok = await sendLarkMessage({ appId: "cli_a", appSecret: "secret" }, "oc_123", "wake done");
165
+ deepEqual(ok, true);
166
+ deepEqual(receivedChatId, "oc_123");
167
+ deepEqual(receivedText, "wake done");
168
+ });
169
+ test("startLarkChannel wires a stoppable listener", async () => {
170
+ let started = false;
171
+ let stopped = false;
172
+ setLarkDepsForTests({
173
+ createListener() {
174
+ return {
175
+ async reply() {
176
+ return true;
177
+ },
178
+ async sendToChat() {
179
+ return true;
180
+ },
181
+ start() {
182
+ started = true;
183
+ },
184
+ async stop() {
185
+ stopped = true;
186
+ },
187
+ };
188
+ },
189
+ });
190
+ const channel = await startLarkChannel({ appId: "cli_a", appSecret: "secret", cliCommand: "va-claw" });
191
+ equal(started, true);
192
+ deepEqual(formatLarkReply({ type: "timeout" }), "超时,请重试");
193
+ await stopLarkChannel(channel);
194
+ equal(stopped, true);
195
+ });
196
+ //# sourceMappingURL=lark.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lark.test.js","sourceRoot":"","sources":["../src/lark.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { resolveVaClawCliCommand, runLarkCli, runLarkCliCommand } from "./cli.js";
2
+ import type { LarkCliResult, LarkIncomingMessage, LarkListener } from "./types.js";
3
+ type LarkMessageDeps = {
4
+ resolveVaClawCliCommand: typeof resolveVaClawCliCommand;
5
+ runCli: typeof runLarkCli;
6
+ runCliCommand: typeof runLarkCliCommand;
7
+ };
8
+ export declare function parseLarkPrompt(message: LarkIncomingMessage): string | null;
9
+ export declare function formatLarkReply(result: LarkCliResult): string;
10
+ export declare function resolveVaClawCommand(text: string): string[] | null;
11
+ export declare function createLarkMessageHandler(cliCommand?: string): (message: LarkIncomingMessage, listener: LarkListener) => Promise<void>;
12
+ export declare function setLarkMessageDepsForTests(deps: Partial<LarkMessageDeps>): void;
13
+ export declare function resetLarkMessageDepsForTests(): void;
14
+ export {};
15
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnF,KAAK,eAAe,GAAG;IACrB,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,MAAM,EAAE,OAAO,UAAU,CAAC;IAC1B,aAAa,EAAE,OAAO,iBAAiB,CAAC;CACzC,CAAC;AAiBF,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,CAS3E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAQ7D;AAmCD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAmBlE;AAED,wBAAgB,wBAAwB,CAAC,UAAU,CAAC,EAAE,MAAM,IAC5C,SAAS,mBAAmB,EAAE,UAAU,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAiBnF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAE/E;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAMnD"}
@@ -0,0 +1,108 @@
1
+ import { resolveVaClawCliCommand, runLarkCli, runLarkCliCommand } from "./cli.js";
2
+ let larkMessageDeps = {
3
+ resolveVaClawCliCommand,
4
+ runCli: runLarkCli,
5
+ runCliCommand: runLarkCliCommand,
6
+ };
7
+ const KNOWN_VA_CLAW_COMMANDS = new Set([
8
+ "status",
9
+ "memory list",
10
+ "memory recall",
11
+ "claw list",
12
+ "claw status",
13
+ "protocol",
14
+ ]);
15
+ export function parseLarkPrompt(message) {
16
+ const text = message.text.trim();
17
+ if (text === "") {
18
+ return null;
19
+ }
20
+ if (message.senderType === "app") {
21
+ return null;
22
+ }
23
+ return text;
24
+ }
25
+ export function formatLarkReply(result) {
26
+ if (result.type === "success") {
27
+ return result.text;
28
+ }
29
+ if (result.type === "timeout") {
30
+ return "超时,请重试";
31
+ }
32
+ return `错误:${result.text}`;
33
+ }
34
+ function tokenizeLarkCommand(text) {
35
+ const tokens = [];
36
+ let current = "";
37
+ let quoteChar = null;
38
+ for (const char of text.trim()) {
39
+ if (char === "\"" || char === "'") {
40
+ if (quoteChar === char) {
41
+ quoteChar = null;
42
+ continue;
43
+ }
44
+ if (quoteChar === null) {
45
+ quoteChar = char;
46
+ continue;
47
+ }
48
+ }
49
+ if (/\s/.test(char) && quoteChar === null) {
50
+ if (current !== "") {
51
+ tokens.push(current);
52
+ current = "";
53
+ }
54
+ continue;
55
+ }
56
+ current += char;
57
+ }
58
+ if (current !== "") {
59
+ tokens.push(current);
60
+ }
61
+ return tokens;
62
+ }
63
+ export function resolveVaClawCommand(text) {
64
+ const trimmed = text.trim();
65
+ if (trimmed === "") {
66
+ return null;
67
+ }
68
+ const directMatch = /^va-claw\s+(.+)$/i.exec(trimmed);
69
+ if (directMatch) {
70
+ const command = directMatch[1]?.trim();
71
+ const tokens = command ? tokenizeLarkCommand(command) : [];
72
+ return tokens.length > 0 ? tokens : null;
73
+ }
74
+ const normalized = trimmed.replace(/\s+/g, " ");
75
+ if (KNOWN_VA_CLAW_COMMANDS.has(normalized.toLowerCase())) {
76
+ return normalized.toLowerCase().split(" ");
77
+ }
78
+ return null;
79
+ }
80
+ export function createLarkMessageHandler(cliCommand) {
81
+ return async (message, listener) => {
82
+ const prompt = parseLarkPrompt(message);
83
+ if (prompt === null) {
84
+ return;
85
+ }
86
+ await listener.reply(message.messageId, "思考中...");
87
+ const directCommand = resolveVaClawCommand(prompt);
88
+ const result = directCommand
89
+ ? await larkMessageDeps.runCliCommand(directCommand, larkMessageDeps.resolveVaClawCliCommand())
90
+ : await larkMessageDeps.runCli(prompt, cliCommand);
91
+ const reply = formatLarkReply(result);
92
+ const replied = await listener.reply(message.messageId, reply);
93
+ if (!replied) {
94
+ await listener.sendToChat(message.chatId, reply);
95
+ }
96
+ };
97
+ }
98
+ export function setLarkMessageDepsForTests(deps) {
99
+ larkMessageDeps = { ...larkMessageDeps, ...deps };
100
+ }
101
+ export function resetLarkMessageDepsForTests() {
102
+ larkMessageDeps = {
103
+ resolveVaClawCliCommand,
104
+ runCli: runLarkCli,
105
+ runCliCommand: runLarkCliCommand,
106
+ };
107
+ }
108
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type StartLarkChannelConfig = {
2
+ appId: string;
3
+ appSecret: string;
4
+ cliCommand?: string;
5
+ notifyChatId?: string;
6
+ };
7
+ export type LarkIncomingMessage = {
8
+ messageId: string;
9
+ chatId: string;
10
+ chatType: "p2p" | "group";
11
+ senderId: string;
12
+ senderType?: string;
13
+ text: string;
14
+ rawContent: string;
15
+ timestamp: string;
16
+ };
17
+ export type LarkMessageHandler = (message: LarkIncomingMessage) => Promise<void> | void;
18
+ export type LarkListener = {
19
+ reply(messageId: string, text: string): Promise<boolean>;
20
+ sendToChat(chatId: string, text: string): Promise<boolean>;
21
+ start(): void;
22
+ stop(): Promise<void> | void;
23
+ };
24
+ export type LarkChannel = {
25
+ appId: string;
26
+ appSecret: string;
27
+ cliCommand: string;
28
+ listener: LarkListener;
29
+ };
30
+ export type LarkCliResult = {
31
+ type: "success";
32
+ text: string;
33
+ } | {
34
+ type: "timeout";
35
+ } | {
36
+ type: "error";
37
+ text: string;
38
+ };
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,GAAG,OAAO,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAExF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@va-claw/channel-lark",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "scripts": {
9
+ "build": "tsc -b",
10
+ "test": "pnpm run build && node --test dist/*.test.js"
11
+ },
12
+ "dependencies": {
13
+ "@larksuiteoapi/node-sdk": "^1.59.0"
14
+ },
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "default": "./dist/index.js"
19
+ }
20
+ }
21
+ }
@@ -6,10 +6,11 @@
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "scripts": {
9
- "build": "pnpm --filter @va-claw/channel-telegram build && pnpm --filter @va-claw/channel-slack build && pnpm --filter @va-claw/channel-discord build && pnpm --filter @va-claw/identity build && tsc -b"
9
+ "build": "pnpm --filter @va-claw/channel-telegram build && pnpm --filter @va-claw/channel-slack build && pnpm --filter @va-claw/channel-discord build && pnpm --filter @va-claw/channel-lark build && pnpm --filter @va-claw/identity build && tsc -b"
10
10
  },
11
11
  "dependencies": {
12
12
  "@va-claw/channel-discord": "workspace:*",
13
+ "@va-claw/channel-lark": "workspace:*",
13
14
  "@va-claw/channel-slack": "workspace:*",
14
15
  "@va-claw/channel-telegram": "workspace:*",
15
16
  "@va-claw/identity": "workspace:*"
@@ -18,6 +19,10 @@
18
19
  ".": {
19
20
  "types": "./dist/index.d.ts",
20
21
  "default": "./dist/index.js"
22
+ },
23
+ "./lark": {
24
+ "types": "./src/lark.ts",
25
+ "default": "./dist/lark.js"
21
26
  }
22
27
  }
23
28
  }