@meet-im/meet 3.1.0 → 3.2.2-beta.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.
@@ -1,2 +1,8 @@
1
+ import { initMeetUserAgent } from "./src/client.js";
2
+ import { resolveMeetOpenClawVersion, resolveMeetPluginVersion } from "./src/plugin-version.js";
1
3
  // Keep bundled registration fast: runtime wiring only needs the store setter.
4
+ initMeetUserAgent({
5
+ pluginVersion: resolveMeetPluginVersion(),
6
+ openclawVersion: resolveMeetOpenClawVersion(),
7
+ });
2
8
  export { setMeetRuntime } from "./src/runtime.js";
@@ -6,6 +6,7 @@ import { parseMeetTarget, looksLikeMeetId, formatMeetTarget, } from "./targets.j
6
6
  import { sendMessageMeet } from "./send.js";
7
7
  import { getMeetClient } from "./client.js";
8
8
  import { getAllCachedUsers, rememberMeetUser } from "./directory-cache.js";
9
+ import { MeetPluginConfigSchema } from "./config-schema.js";
9
10
  const meta = {
10
11
  id: "meet",
11
12
  label: "Meet",
@@ -56,109 +57,7 @@ export const meetPlugin = {
56
57
  },
57
58
  },
58
59
  reload: { configPrefixes: ["channels.meet"] },
59
- configSchema: {
60
- schema: {
61
- type: "object",
62
- additionalProperties: false,
63
- properties: {
64
- enabled: { type: "boolean" },
65
- defaultAccount: { type: "string" },
66
- apiEndpoint: { type: "string" },
67
- apiToken: { type: "string" },
68
- pollTimeout: { type: "integer", minimum: 1000, maximum: 300000 },
69
- pollLimit: { type: "integer", minimum: 1, maximum: 1000 },
70
- dmPolicy: { type: "string", enum: ["open", "pairing", "allowlist"] },
71
- allowFrom: {
72
- type: "array",
73
- items: { oneOf: [{ type: "string" }, { type: "number" }] },
74
- },
75
- groupPolicy: {
76
- type: "string",
77
- enum: ["open", "allowlist", "disabled"],
78
- },
79
- groupAllowFrom: {
80
- type: "array",
81
- items: { oneOf: [{ type: "string" }, { type: "number" }] },
82
- },
83
- groups: {
84
- type: "object",
85
- additionalProperties: {
86
- type: "object",
87
- properties: {
88
- enabled: { type: "boolean" },
89
- name: { type: "string" },
90
- requireMention: { type: "boolean" },
91
- systemPrompt: { type: "string" },
92
- users: {
93
- type: "array",
94
- items: { oneOf: [{ type: "string" }, { type: "number" }] },
95
- },
96
- },
97
- },
98
- },
99
- requireMention: { type: "boolean" },
100
- historyLimit: { type: "integer", minimum: 0 },
101
- dmHistoryLimit: { type: "integer", minimum: 0 },
102
- textChunkLimit: { type: "integer", minimum: 1 },
103
- mediaMaxMb: { type: "number", minimum: 0 },
104
- accounts: {
105
- type: "object",
106
- additionalProperties: {
107
- type: "object",
108
- properties: {
109
- enabled: { type: "boolean" },
110
- name: { type: "string" },
111
- apiEndpoint: { type: "string" },
112
- token: { type: "string" },
113
- apiToken: { type: "string" },
114
- pollTimeout: { type: "integer", minimum: 1000, maximum: 300000 },
115
- pollLimit: { type: "integer", minimum: 1, maximum: 1000 },
116
- logLevel: { type: "string", enum: ["silent", "info"] },
117
- dmPolicy: { type: "string", enum: ["open", "pairing", "allowlist"] },
118
- allowFrom: {
119
- type: "array",
120
- items: { oneOf: [{ type: "string" }, { type: "number" }] },
121
- },
122
- groupPolicy: {
123
- type: "string",
124
- enum: ["open", "allowlist", "disabled"],
125
- },
126
- groupAllowFrom: {
127
- type: "array",
128
- items: { oneOf: [{ type: "string" }, { type: "number" }] },
129
- },
130
- requireMention: { type: "boolean" },
131
- systemPrompt: { type: "string" },
132
- historyLimit: { type: "integer", minimum: 0 },
133
- dmHistoryLimit: { type: "integer", minimum: 0 },
134
- textChunkLimit: { type: "integer", minimum: 1 },
135
- mediaMaxMb: { type: "number", minimum: 0 },
136
- groups: {
137
- type: "object",
138
- additionalProperties: {
139
- type: "object",
140
- properties: {
141
- enabled: { type: "boolean" },
142
- name: { type: "string" },
143
- requireMention: { type: "boolean" },
144
- systemPrompt: { type: "string" },
145
- users: {
146
- type: "array",
147
- items: { oneOf: [{ type: "string" }, { type: "number" }] },
148
- },
149
- groupPolicy: {
150
- type: "string",
151
- enum: ["open", "allowlist", "disabled"],
152
- },
153
- },
154
- },
155
- },
156
- },
157
- },
158
- },
159
- },
160
- },
161
- },
60
+ configSchema: MeetPluginConfigSchema,
162
61
  config: {
163
62
  listAccountIds: (cfg) => listMeetAccountIds(cfg),
164
63
  resolveAccount: (cfg, accountId) => resolveMeetAccount({ cfg, accountId }),
@@ -1,6 +1,12 @@
1
1
  import { MeetBot } from "@meet-im/meet-bot-jssdk";
2
2
  import type { PollingOptions } from "@meet-im/meet-bot-jssdk";
3
3
  import type { ResolvedMeetAccount } from "./types.js";
4
+ export declare function getPluginUserAgent(): string;
5
+ export declare function initMeetUserAgent(options: {
6
+ pluginVersion?: string;
7
+ openclawVersion?: string;
8
+ }): void;
9
+ export declare function setOpenClawVersion(version: string): void;
4
10
  export declare function createMeetClient(account: ResolvedMeetAccount): MeetBot;
5
11
  export declare function getPollingOptions(account: ResolvedMeetAccount): PollingOptions;
6
12
  export declare function getMeetClient(accountId: string): MeetBot | undefined;
@@ -1,4 +1,26 @@
1
+ import os from "node:os";
1
2
  import { MeetBot, POLLING } from "@meet-im/meet-bot-jssdk";
3
+ let _pluginVersion = "unknown";
4
+ let _openclawVersion = "unknown";
5
+ function buildUserAgent() {
6
+ return `MeetPlugin/${_pluginVersion} (Node/${process.versions.node}; ${os.platform()}; OpenClaw/${_openclawVersion})`;
7
+ }
8
+ export function getPluginUserAgent() {
9
+ return buildUserAgent();
10
+ }
11
+ export function initMeetUserAgent(options) {
12
+ if (options.pluginVersion) {
13
+ _pluginVersion = options.pluginVersion;
14
+ }
15
+ if (options.openclawVersion) {
16
+ _openclawVersion = options.openclawVersion;
17
+ }
18
+ }
19
+ export function setOpenClawVersion(version) {
20
+ if (version) {
21
+ _openclawVersion = version;
22
+ }
23
+ }
2
24
  const botInstances = new Map();
3
25
  export function createMeetClient(account) {
4
26
  const existing = botInstances.get(account.accountId);
@@ -18,6 +40,7 @@ export function createMeetClient(account) {
18
40
  longPollingTimeout: pollTimeoutSec,
19
41
  logLevel,
20
42
  useV2: true,
43
+ userAgent: buildUserAgent(),
21
44
  });
22
45
  botInstances.set(account.accountId, bot);
23
46
  return bot;
@@ -10,6 +10,11 @@ export declare const MeetGroupConfigSchema: z.ZodObject<{
10
10
  requireMention: z.ZodOptional<z.ZodBoolean>;
11
11
  systemPrompt: z.ZodOptional<z.ZodString>;
12
12
  users: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
13
+ groupPolicy: z.ZodOptional<z.ZodEnum<{
14
+ open: "open";
15
+ allowlist: "allowlist";
16
+ disabled: "disabled";
17
+ }>>;
13
18
  }, z.core.$strip>;
14
19
  export declare const MeetAccountConfigSchema: z.ZodObject<{
15
20
  enabled: z.ZodOptional<z.ZodBoolean>;
@@ -23,6 +28,36 @@ export declare const MeetAccountConfigSchema: z.ZodObject<{
23
28
  silent: "silent";
24
29
  info: "info";
25
30
  }>>;
31
+ dmPolicy: z.ZodOptional<z.ZodEnum<{
32
+ open: "open";
33
+ allowlist: "allowlist";
34
+ pairing: "pairing";
35
+ }>>;
36
+ allowFrom: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
37
+ groupPolicy: z.ZodOptional<z.ZodEnum<{
38
+ open: "open";
39
+ allowlist: "allowlist";
40
+ disabled: "disabled";
41
+ }>>;
42
+ groupAllowFrom: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
43
+ requireMention: z.ZodOptional<z.ZodBoolean>;
44
+ systemPrompt: z.ZodOptional<z.ZodString>;
45
+ historyLimit: z.ZodOptional<z.ZodNumber>;
46
+ dmHistoryLimit: z.ZodOptional<z.ZodNumber>;
47
+ textChunkLimit: z.ZodOptional<z.ZodNumber>;
48
+ mediaMaxMb: z.ZodOptional<z.ZodNumber>;
49
+ groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
50
+ enabled: z.ZodOptional<z.ZodBoolean>;
51
+ name: z.ZodOptional<z.ZodString>;
52
+ requireMention: z.ZodOptional<z.ZodBoolean>;
53
+ systemPrompt: z.ZodOptional<z.ZodString>;
54
+ users: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
55
+ groupPolicy: z.ZodOptional<z.ZodEnum<{
56
+ open: "open";
57
+ allowlist: "allowlist";
58
+ disabled: "disabled";
59
+ }>>;
60
+ }, z.core.$strip>>>;
26
61
  }, z.core.$strip>;
27
62
  export declare const MeetConfigSchema: z.ZodObject<{
28
63
  enabled: z.ZodOptional<z.ZodBoolean>;
@@ -30,23 +65,23 @@ export declare const MeetConfigSchema: z.ZodObject<{
30
65
  apiEndpoint: z.ZodOptional<z.ZodString>;
31
66
  token: z.ZodOptional<z.ZodString>;
32
67
  apiToken: z.ZodOptional<z.ZodString>;
33
- pollTimeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
34
- pollLimit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
68
+ pollTimeout: z.ZodOptional<z.ZodNumber>;
69
+ pollLimit: z.ZodOptional<z.ZodNumber>;
35
70
  logLevel: z.ZodOptional<z.ZodEnum<{
36
71
  silent: "silent";
37
72
  info: "info";
38
73
  }>>;
39
- dmPolicy: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
74
+ dmPolicy: z.ZodOptional<z.ZodEnum<{
40
75
  open: "open";
41
- pairing: "pairing";
42
76
  allowlist: "allowlist";
43
- }>>>;
77
+ pairing: "pairing";
78
+ }>>;
44
79
  allowFrom: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
45
- groupPolicy: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
80
+ groupPolicy: z.ZodOptional<z.ZodEnum<{
46
81
  open: "open";
47
82
  allowlist: "allowlist";
48
83
  disabled: "disabled";
49
- }>>>;
84
+ }>>;
50
85
  groupAllowFrom: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
51
86
  groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
52
87
  enabled: z.ZodOptional<z.ZodBoolean>;
@@ -54,8 +89,13 @@ export declare const MeetConfigSchema: z.ZodObject<{
54
89
  requireMention: z.ZodOptional<z.ZodBoolean>;
55
90
  systemPrompt: z.ZodOptional<z.ZodString>;
56
91
  users: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
92
+ groupPolicy: z.ZodOptional<z.ZodEnum<{
93
+ open: "open";
94
+ allowlist: "allowlist";
95
+ disabled: "disabled";
96
+ }>>;
57
97
  }, z.core.$strip>>>;
58
- requireMention: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
98
+ requireMention: z.ZodOptional<z.ZodBoolean>;
59
99
  systemPrompt: z.ZodOptional<z.ZodString>;
60
100
  channels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
61
101
  enabled: z.ZodOptional<z.ZodBoolean>;
@@ -65,7 +105,7 @@ export declare const MeetConfigSchema: z.ZodObject<{
65
105
  historyLimit: z.ZodOptional<z.ZodNumber>;
66
106
  dmHistoryLimit: z.ZodOptional<z.ZodNumber>;
67
107
  textChunkLimit: z.ZodOptional<z.ZodNumber>;
68
- mediaMaxMb: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
108
+ mediaMaxMb: z.ZodOptional<z.ZodNumber>;
69
109
  accounts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
70
110
  enabled: z.ZodOptional<z.ZodBoolean>;
71
111
  name: z.ZodOptional<z.ZodString>;
@@ -78,5 +118,36 @@ export declare const MeetConfigSchema: z.ZodObject<{
78
118
  silent: "silent";
79
119
  info: "info";
80
120
  }>>;
121
+ dmPolicy: z.ZodOptional<z.ZodEnum<{
122
+ open: "open";
123
+ allowlist: "allowlist";
124
+ pairing: "pairing";
125
+ }>>;
126
+ allowFrom: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
127
+ groupPolicy: z.ZodOptional<z.ZodEnum<{
128
+ open: "open";
129
+ allowlist: "allowlist";
130
+ disabled: "disabled";
131
+ }>>;
132
+ groupAllowFrom: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
133
+ requireMention: z.ZodOptional<z.ZodBoolean>;
134
+ systemPrompt: z.ZodOptional<z.ZodString>;
135
+ historyLimit: z.ZodOptional<z.ZodNumber>;
136
+ dmHistoryLimit: z.ZodOptional<z.ZodNumber>;
137
+ textChunkLimit: z.ZodOptional<z.ZodNumber>;
138
+ mediaMaxMb: z.ZodOptional<z.ZodNumber>;
139
+ groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
140
+ enabled: z.ZodOptional<z.ZodBoolean>;
141
+ name: z.ZodOptional<z.ZodString>;
142
+ requireMention: z.ZodOptional<z.ZodBoolean>;
143
+ systemPrompt: z.ZodOptional<z.ZodString>;
144
+ users: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
145
+ groupPolicy: z.ZodOptional<z.ZodEnum<{
146
+ open: "open";
147
+ allowlist: "allowlist";
148
+ disabled: "disabled";
149
+ }>>;
150
+ }, z.core.$strip>>>;
81
151
  }, z.core.$strip>>>;
82
152
  }, z.core.$strip>;
153
+ export declare const MeetPluginConfigSchema: import("openclaw/plugin-sdk").ChannelConfigSchema;
@@ -1,3 +1,4 @@
1
+ import { buildChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-schema";
1
2
  import { z } from "zod";
2
3
  export const MeetChannelConfigSchema = z.object({
3
4
  enabled: z.boolean().optional(),
@@ -10,6 +11,7 @@ export const MeetGroupConfigSchema = z.object({
10
11
  requireMention: z.boolean().optional(),
11
12
  systemPrompt: z.string().optional(),
12
13
  users: z.array(z.union([z.string(), z.number()])).optional(),
14
+ groupPolicy: z.enum(["open", "allowlist", "disabled"]).optional(),
13
15
  });
14
16
  export const MeetAccountConfigSchema = z.object({
15
17
  enabled: z.boolean().optional(),
@@ -20,6 +22,17 @@ export const MeetAccountConfigSchema = z.object({
20
22
  pollTimeout: z.number().min(1000).max(300000).optional(),
21
23
  pollLimit: z.number().min(1).max(1000).optional(),
22
24
  logLevel: z.enum(["silent", "info"]).optional(),
25
+ dmPolicy: z.enum(["open", "pairing", "allowlist"]).optional(),
26
+ allowFrom: z.array(z.union([z.string(), z.number()])).optional(),
27
+ groupPolicy: z.enum(["open", "allowlist", "disabled"]).optional(),
28
+ groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),
29
+ requireMention: z.boolean().optional(),
30
+ systemPrompt: z.string().optional(),
31
+ historyLimit: z.number().min(0).optional(),
32
+ dmHistoryLimit: z.number().min(0).optional(),
33
+ textChunkLimit: z.number().min(1).optional(),
34
+ mediaMaxMb: z.number().min(0).optional(),
35
+ groups: z.record(z.string(), MeetGroupConfigSchema).optional(),
23
36
  });
24
37
  export const MeetConfigSchema = z.object({
25
38
  enabled: z.boolean().optional(),
@@ -27,20 +40,21 @@ export const MeetConfigSchema = z.object({
27
40
  apiEndpoint: z.string().optional(),
28
41
  token: z.string().optional(),
29
42
  apiToken: z.string().optional(),
30
- pollTimeout: z.number().min(1000).max(300000).optional().default(30000),
31
- pollLimit: z.number().min(1).max(1000).optional().default(100),
43
+ pollTimeout: z.number().min(1000).max(300000).optional(),
44
+ pollLimit: z.number().min(1).max(1000).optional(),
32
45
  logLevel: z.enum(["silent", "info"]).optional(),
33
- dmPolicy: z.enum(["open", "pairing", "allowlist"]).optional().default("pairing"),
46
+ dmPolicy: z.enum(["open", "pairing", "allowlist"]).optional(),
34
47
  allowFrom: z.array(z.union([z.string(), z.number()])).optional(),
35
- groupPolicy: z.enum(["open", "allowlist", "disabled"]).optional().default("allowlist"),
48
+ groupPolicy: z.enum(["open", "allowlist", "disabled"]).optional(),
36
49
  groupAllowFrom: z.array(z.union([z.string(), z.number()])).optional(),
37
50
  groups: z.record(z.string(), MeetGroupConfigSchema).optional(),
38
- requireMention: z.boolean().optional().default(true),
51
+ requireMention: z.boolean().optional(),
39
52
  systemPrompt: z.string().optional(),
40
53
  channels: z.record(z.string(), MeetChannelConfigSchema).optional(),
41
54
  historyLimit: z.number().min(0).optional(),
42
55
  dmHistoryLimit: z.number().min(0).optional(),
43
56
  textChunkLimit: z.number().min(1).optional(),
44
- mediaMaxMb: z.number().min(0).optional().default(30),
57
+ mediaMaxMb: z.number().min(0).optional(),
45
58
  accounts: z.record(z.string(), MeetAccountConfigSchema).optional(),
46
59
  });
60
+ export const MeetPluginConfigSchema = buildChannelConfigSchema(MeetConfigSchema);
@@ -0,0 +1,2 @@
1
+ export declare function resolveMeetPluginVersion(): string;
2
+ export declare function resolveMeetOpenClawVersion(): string;
@@ -0,0 +1,7 @@
1
+ import packageJson from "../package.json" with { type: "json" };
2
+ export function resolveMeetPluginVersion() {
3
+ return packageJson.version;
4
+ }
5
+ export function resolveMeetOpenClawVersion() {
6
+ return packageJson.peerDependencies?.openclaw ?? packageJson.devDependencies?.openclaw ?? "unknown";
7
+ }
@@ -23,7 +23,12 @@ export type CreateMeetReplyDispatcherOpts = {
23
23
  };
24
24
  export declare function createMeetReplyDispatcher(opts: CreateMeetReplyDispatcherOpts): Promise<{
25
25
  dispatcher: import("node_modules/openclaw/dist/plugin-sdk/src/auto-reply/reply/reply-dispatcher.types.js").ReplyDispatcher;
26
- replyOptions: Pick<import("node_modules/openclaw/dist/plugin-sdk/src/auto-reply/get-reply-options.types.js").GetReplyOptions, "onReplyStart" | "onTypingController" | "onTypingCleanup">;
26
+ replyOptions: {
27
+ sourceReplyDeliveryMode?: import("openclaw/plugin-sdk/channel-reply-pipeline").SourceReplyDeliveryMode | undefined;
28
+ onReplyStart?: (() => Promise<void> | void) | undefined;
29
+ onTypingController?: ((typing: import("node_modules/openclaw/dist/plugin-sdk/src/auto-reply/reply/typing.js").TypingController) => void) | undefined;
30
+ onTypingCleanup?: (() => void) | undefined;
31
+ };
27
32
  markDispatchIdle: () => void;
28
33
  markRunComplete: () => void;
29
34
  }>;
@@ -1,6 +1,25 @@
1
+ import { resolveChannelSourceReplyDeliveryMode } from "openclaw/plugin-sdk/channel-reply-pipeline";
1
2
  import { createReplyPrefixContext } from "openclaw/plugin-sdk/channel-runtime";
2
3
  import { getMeetRuntime } from "./runtime.js";
3
4
  import { sendMessageMeet, sendMediaMeet } from "./send.js";
5
+ function resolveMeetConversationType(chatId) {
6
+ if (chatId.startsWith("channel:")) {
7
+ return "group";
8
+ }
9
+ if (chatId.startsWith("user:")) {
10
+ return "direct";
11
+ }
12
+ return undefined;
13
+ }
14
+ function resolveMeetChatType(chatId) {
15
+ if (chatId.startsWith("channel:")) {
16
+ return "channel";
17
+ }
18
+ if (chatId.startsWith("user:")) {
19
+ return "direct";
20
+ }
21
+ return undefined;
22
+ }
4
23
  /**
5
24
  * 匹配末尾不完整的 mention 开始: <@ 或 <@xxx (没有闭合的 >)
6
25
  */
@@ -61,9 +80,21 @@ export async function createMeetReplyDispatcher(opts) {
61
80
  });
62
81
  const chunkMode = core.channel.text.resolveChunkMode(cfg, "meet", accountId);
63
82
  const prefixContext = createReplyPrefixContext({ cfg, agentId });
83
+ const chatType = resolveMeetChatType(chatId);
84
+ const sourceReplyDeliveryMode = chatType
85
+ ? resolveChannelSourceReplyDeliveryMode({
86
+ cfg,
87
+ ctx: { ChatType: chatType },
88
+ })
89
+ : undefined;
64
90
  const { dispatcher, replyOptions, markDispatchIdle, markRunComplete } = core.channel.reply.createReplyDispatcherWithTyping({
65
91
  responsePrefix: prefixContext.responsePrefix,
66
92
  responsePrefixContextProvider: prefixContext.responsePrefixContextProvider,
93
+ silentReplyContext: {
94
+ cfg,
95
+ surface: "meet",
96
+ conversationType: resolveMeetConversationType(chatId),
97
+ },
67
98
  humanDelay: core.channel.reply.resolveHumanDelayConfig(cfg, agentId),
68
99
  onReplyStart: async () => {
69
100
  },
@@ -166,7 +197,10 @@ export async function createMeetReplyDispatcher(opts) {
166
197
  });
167
198
  return {
168
199
  dispatcher,
169
- replyOptions,
200
+ replyOptions: {
201
+ ...replyOptions,
202
+ ...(sourceReplyDeliveryMode ? { sourceReplyDeliveryMode } : {}),
203
+ },
170
204
  markDispatchIdle,
171
205
  markRunComplete,
172
206
  };
@@ -7,5 +7,6 @@ export type MeetRuntime = PluginRuntime & {
7
7
  meet?: MeetChannelRuntime;
8
8
  };
9
9
  };
10
- declare const setMeetRuntime: (next: MeetRuntime) => void, getOptionalMeetRuntime: () => MeetRuntime | null, getMeetRuntime: () => MeetRuntime;
11
- export { getMeetRuntime, getOptionalMeetRuntime, setMeetRuntime };
10
+ declare const getOptionalMeetRuntime: () => MeetRuntime | null, getMeetRuntime: () => MeetRuntime;
11
+ export declare function setMeetRuntime(runtime: MeetRuntime): void;
12
+ export { getMeetRuntime, getOptionalMeetRuntime };
@@ -1,6 +1,13 @@
1
1
  import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
2
- const { setRuntime: setMeetRuntime, tryGetRuntime: getOptionalMeetRuntime, getRuntime: getMeetRuntime, } = createPluginRuntimeStore({
2
+ import { setOpenClawVersion } from "./client.js";
3
+ const { setRuntime: setMeetRuntimeStore, tryGetRuntime: getOptionalMeetRuntime, getRuntime: getMeetRuntime, } = createPluginRuntimeStore({
3
4
  pluginId: "meet",
4
5
  errorMessage: "Meet runtime not initialized",
5
6
  });
6
- export { getMeetRuntime, getOptionalMeetRuntime, setMeetRuntime };
7
+ export function setMeetRuntime(runtime) {
8
+ if (runtime.version) {
9
+ setOpenClawVersion(runtime.version);
10
+ }
11
+ setMeetRuntimeStore(runtime);
12
+ }
13
+ export { getMeetRuntime, getOptionalMeetRuntime };
@@ -55,7 +55,8 @@
55
55
  "users": {
56
56
  "type": "array",
57
57
  "items": { "anyOf": [{ "type": "string" }, { "type": "number" }] }
58
- }
58
+ },
59
+ "groupPolicy": { "type": "string", "enum": ["open", "allowlist", "disabled"] }
59
60
  }
60
61
  }
61
62
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meet-im/meet",
3
- "version": "3.1.0",
3
+ "version": "3.2.2-beta.0",
4
4
  "type": "module",
5
5
  "description": "OpenClaw Meet channel plugin",
6
6
  "scripts": {
@@ -55,7 +55,7 @@
55
55
  }
56
56
  },
57
57
  "dependencies": {
58
- "@meet-im/meet-bot-jssdk": "^1.1.0",
58
+ "@meet-im/meet-bot-jssdk": "^1.2.1",
59
59
  "zod": "^4.4.3"
60
60
  },
61
61
  "devDependencies": {