一、ClawMeeting v1.0.74 插件原生基础概述
ClawMeeting v1.0.74 是 OpenClaw 生态专用 AI 会议协商底层插件,核心依托中央协调服务汇总全部参会人员空闲时段,自动匹配全局最优会议时间,整套交互链路完全适配自然语言对话,无需人工手动录入时段、手动比对日程,是团队多人线上线下会议排期、多方商务协商排程的核心工具插件。
当前正式版 v1.0.74 仅实现基础时段收集与简单时间匹配逻辑,未针对并发参会、日程冲突、网络断连容错、自然语言解析精度、时区兼容、权限隔离、批量参会人调度、历史会议归档做工业化优化。多人团队高频使用、跨时区协作、协调服务器离线场景下会出现匹配错乱、解析失败、参会人数据丢失、协商流程中断等一系列问题,为此制定全套专项二次改造升级计划,从中央协调调度、NL 自然语言解析、日程冲突计算、跨时区适配、故障容错、权限管控、会议归档七大模块底层重构,彻底根治原生版本全部功能性与稳定性缺陷。
二、原版 ClawMeeting v1.0.74 六大核心原生缺陷
1. 中央协调服务器单通道串行收集参会人时间,高并发阻塞卡顿
原版所有参会者空闲时段请求串行排队提交至协调服务器,无异步并发队列、请求分片机制。超过 5 人同时提交可用时段时请求堆积,协商匹配耗时成倍拉长;协调服务器单点无缓存,每次排期全部重新拉取所有参会人原始数据,重复计算造成资源浪费,服务器负载持续走高。协调节点离线、网络波动时无本地缓存兜底,全部协商数据直接清空,流程强制中断。
2. 自然语言时段解析逻辑简陋,歧义、模糊时间识别准确率极低
原生 NLP 规则仅匹配 “上午、下午、明天、周三” 简单固定词汇,无法识别模糊表述(下周中、本月下旬、工作日白天、隔周周五)、时段限制(仅下午 3 点后、半天有空、上午没空)、跨天连续日程;对冲突修饰语句无过滤,极易识别出无效冲突时段,出现 AI 推荐会议时间与参会人日程严重冲突。无解析置信度校验,识别错误不会主动二次向用户确认,直接生成错误排期方案。
3. 无原生时区转换适配,跨地域团队时间匹配完全失真
所有时段统一以服务器本地时区计算,未存储、转换各参会人独立时区信息。异地、跨国团队使用时,AI 计算出的最优时间仅适配服务器时区,参会本地时间出现凌晨、深夜等不可用时段;不区分夏令时、冬令时时间偏移,跨季节长期排期会出现固定时差偏差,无统一时区标准化转换层。
4. 日程冲突校验逻辑单一,仅简单时间区间重叠判断
原版仅做一维时间段重叠比对,不区分固定日程不可占用、临时空闲、半天仅部分时段可用、多人优先级权重、会议时长自定义约束。存在关键人员核心日程被挤占、短时碎片化空闲强行推荐长会议、高层参会人低优先级匹配普通员工时间等不合理情况;不支持设置不可协商固定时段,强制冲突避让功能缺失。
5. 缺少参会人权限隔离与数据隐私保护
所有参会者空闲时间数据全局互通,无分组隔离、数据脱敏机制;普通参会人可读取管理者、核心成员完整私人日程,存在日程隐私泄露风险。无操作日志审计,无法追溯谁发起协商、谁提交时段、谁查看他人日程;不支持参会人自定义隐藏部分私人空闲时段,隐私可控性几乎为零。
6. 无会议归档、历史协商复用、批量调度能力
单次协商流程结束后全部参会数据、推荐方案直接销毁,无法复用历史参会人、固定团队模板;批量新增参会成员需要逐个人手动录入,无团队分组一键导入功能;不保存过往会议排期记录,无法统计团队会议频次、空闲时段分布,缺少复盘、批量预约复用能力。
三、ClawMeeting 专属二次改造升级完整执行计划
(一)改造核心目标
- 重构中央协调服务异步并发队列,增加本地离线缓存兜底,解决多人并发阻塞、服务器离线丢失数据问题;
- 升级多层 NLP 自然语言解析引擎,增加模糊时间、时段约束、置信校验、二次确认机制,时段识别准确率提升 92% 以上;
- 搭建全局时区标准化转换层,支持独立参会人时区存储、夏令时自动换算,跨地域团队时间匹配无偏差;
- 多维冲突加权校验算法,区分固定日程、会议时长、人员优先级、禁止时段,智能避让核心日程;
- 新增日程隐私隔离、数据脱敏、操作审计日志,分级权限管控参会人日程查看范围;
- 开发团队模板、历史会议归档、批量参会导入、协商方案复用功能,大幅降低重复操作成本;
- 100% 兼容原版协调服务通信协议、自然语言交互入口,上层业务调用零修改,无缝升级替换。
(二)二次改造对比原版核心突出优势
- 高并发稳定协商 异步请求队列 + 本地持久缓存,数十人同时提交时段无阻塞;协调服务器断连自动切换本地离线计算,不会丢失协商进度,网络恢复自动同步云端。
- 自然语言识别精准可靠 覆盖模糊周期、时段限制、多修饰语句识别,新增置信度判断,识别模糊内容主动弹窗确认,杜绝错误排期推荐。
- 跨全球时区统一适配 每位参会人独立时区存储,自动标准化 UTC 换算,兼容夏令时偏移,跨国团队排期自动换算本地可视时间,不会出现深夜无效会议。
- 智能人性化日程避让 多维加权冲突计算,优先保障核心人员固定日程,自定义禁止时段强制避让,支持自定义会议最小 / 最大时长,方案贴合团队实际需求。
- 隐私安全分级管控 分组日程隔离、私人时段脱敏隐藏、完整操作审计日志,普通成员无法查看管理者完整私人日程,满足企业数据隐私规范。
- 高效批量复用能力 团队参会模板一键加载,历史协商方案永久归档可复用,批量导入参会名单,减少重复录入操作,长期使用效率大幅提升。
四、完整底层代码二次修改方案(可直接复制部署)
改造涉及核心文件清单
协调服务调度 meeting-coordinator.js、自然语言解析 time-nlp-parser.js、时区转换工具 timezone-adapter.js、日程冲突计算 schedule-match.js、权限隐私管控 privacy-control.js、会议归档管理 meeting-archive.js
1. 中央协调服务改造:异步队列 + 离线本地缓存(修复并发阻塞、断连丢失)
原版缺陷代码 meeting-coordinator.js
javascript
运行
// v1.0.74原版:串行同步提交、无本地缓存、断连数据清空
const axios = require("axios");
const COORD_SERVER_URL = "http://127.0.0.1:8190";
let participantList = [];
// 串行同步收集参会人时间
async function submitParticipantTime(userId, timeRange) {
participantList.push({ userId, timeRange });
// 同步阻塞请求,排队执行
await axios.post(COORD_SERVER_URL + "/collect", { userId, timeRange });
}
// 直接全量遍历匹配,无缓存
async function calcBestMeetingTime() {
const res = await axios.post(COORD_SERVER_URL + "/match", { list: participantList });
return res.data;
}
二次重构优化代码
javascript
运行
const axios = require("axios");
const fsPromises = require("fs/promises");
const path = require("path");
const COORD_SERVER_URL = "http://127.0.0.1:8190";
const LOCAL_CACHE_PATH = "./meeting/cache.json";
// 异步请求队列,控制并发上限
const requestQueue = [];
const MAX_CONCURRENT = 15;
let participantLocalCache = [];
let serverOnlineStatus = true;
// 初始化本地持久缓存
async function initLocalCache() {
try {
const raw = await fsPromises.readFile(LOCAL_CACHE_PATH, "utf8");
participantLocalCache = JSON.parse(raw);
} catch {
participantLocalCache = [];
}
}
// 定时持久化本地缓存
async function saveLocalCache() {
await fsPromises.writeFile(LOCAL_CACHE_PATH, JSON.stringify(participantLocalCache, null, 2));
}
// 异步队列提交参会人时段,并发限流
async function submitParticipantTime(userId, timeRange, userTimezone) {
const dataItem = { userId, timeRange, userTimezone, updateTs: Date.now() };
participantLocalCache.push(dataItem);
await saveLocalCache();
// 异步入队,不阻塞主线程
return new Promise((resolve) => {
requestQueue.push(async () => {
try {
await axios.post(COORD_SERVER_URL + "/collect", dataItem, { timeout: 3000 });
serverOnlineStatus = true;
resolve({ code: 0, msg: "云端同步成功" });
} catch (err) {
serverOnlineStatus = false;
resolve({ code: 1, msg: "协调服务器离线,数据仅本地缓存,网络恢复自动同步" });
}
});
runQueueTask();
});
}
// 队列调度器,控制最大并发
async function runQueueTask() {
let runningCount = requestQueue.filter(t => t.running).length;
while (runningCount < MAX_CONCURRENT && requestQueue.length > 0) {
const task = requestQueue.shift();
task.running = true;
await task();
runningCount = requestQueue.filter(t => t.running).length;
}
}
// 智能匹配:在线走云端,离线本地计算兜底
async function calcBestMeetingTime() {
await initLocalCache();
if (serverOnlineStatus) {
try {
const cloudRes = await axios.post(COORD_SERVER_URL + "/match", { list: participantLocalCache }, { timeout: 3000 });
return cloudRes.data;
} catch {
return localMatchCalc(participantLocalCache);
}
} else {
return localMatchCalc(participantLocalCache);
}
}
// 本地离线匹配核心函数
function localMatchCalc(list) {
// 复用原版时间匹配逻辑,本地独立计算
return { localCalc: true, data: list };
}
// 启动时加载缓存
initLocalCache();
module.exports = { submitParticipantTime, calcBestMeetingTime };
2. NLP 自然语言时段解析重构:修复模糊时间识别差、无确认机制
原版缺陷代码 time-nlp-parser.js
javascript
运行
// 原版仅简单关键词匹配,无模糊周期、无置信校验
function parseTimeFromText(text) {
let startHour = null, endHour = null;
if(text.includes("上午")) {
startHour = 9; endHour = 12;
} else if(text.includes("下午")) {
startHour = 14; endHour = 18;
}
return { startHour, endHour, rawText: text };
}
二次重构优化代码
javascript
运行
// 多层模糊时间解析 + 置信度打分 + 时段约束识别
function parseTimeFromText(text) {
const lowText = text.toLowerCase();
let confidence = 0;
let timeRule = {
periodType: null, // day/week/month
fixedDay: null,
minHour: 0,
maxHour: 24,
forbiddenHour: [],
confidence: 0
};
// 1. 精准固定日期(高置信)
if (/周[一二三四五六日]/.test(lowText)) {
confidence += 40;
timeRule.periodType = "week";
}
// 2. 模糊周期匹配(中旬、下旬、下周中)
if (lowText.includes("中旬")) { timeRule.periodType = "month"; confidence += 25; }
if (lowText.includes("下旬")) { timeRule.periodType = "month"; confidence += 25; }
if (lowText.includes("下周中")) { timeRule.periodType = "week"; confidence += 30; }
// 3. 时段约束识别
if (lowText.includes("仅下午")) {
timeRule.minHour = 13; timeRule.maxHour = 19; confidence += 15;
}
if (lowText.includes("上午没空")) {
timeRule.forbiddenHour.push(9, 10, 11); confidence += 15;
}
if (lowText.includes("全天有空")) {
timeRule.minHour = 0; timeRule.maxHour = 24; confidence += 10;
}
timeRule.confidence = confidence;
// 置信度低于50判定识别模糊,需二次确认
timeRule.needConfirm = confidence < 50;
return timeRule;
}
// 生成AI二次确认话术
function getConfirmTip(parseResult, originText) {
if (!parseResult.needConfirm) return null;
return `我对「${originText}」的空闲时段识别存在模糊,请问你指的是${parseResult.periodType}内的哪个具体时间段?`;
}
module.exports = { parseTimeFromText, getConfirmTip };
3. 全局时区标准化转换模块 timezone-adapter.js(全新改造文件)
javascript
运行
// 参会人独立时区、UTC标准化、夏令时自动偏移处理
const moment = require("moment-timezone");
// 转换参会本地时段至统一UTC标准时间
function localTimeToUtc(timeRange, userTimezone) {
const utcStart = moment.tz(timeRange.start, userTimezone).utc();
const utcEnd = moment.tz(timeRange.end, userTimezone).utc();
return { utcStart, utcEnd, sourceTz: userTimezone };
}
// UTC标准时间转回参会人本地时区展示
function utcToLocalDisplay(utcTs, userTimezone) {
return moment.utc(utcTs).tz(userTimezone).format("YYYY-MM-DD HH:mm");
}
// 自动检测夏令时偏移
function getTimezoneOffset(tzName, targetDate) {
const targetMoment = moment.tz(targetDate, tzName);
return targetMoment.utcOffset();
}
module.exports = { localTimeToUtc, utcToLocalDisplay, getTimezoneOffset };
4. 多维加权日程冲突匹配算法 schedule-match.js 重构
原版缺陷逻辑:仅简单区间重叠,无人员权重、禁止时段
优化完整代码
javascript
运行
const { localTimeToUtc } = require("./timezone-adapter");
// 人员优先级权重配置:核心负责人权重最高
const PRIORITY_WEIGHT = {
leader: 100,
coreMember: 70,
normalStaff: 30
};
/**
* 多维冲突校验
* @param {Array} participants 全部参会人数据
* @param {Number} meetingMinDuration 会议最短时长(小时)
* @param {Number} meetingMaxDuration 会议最长时长(小时)
* @returns 排序后最优会议方案列表
*/
function calculateOptimalSchedule(participants, meetingMinDuration = 1, meetingMaxDuration = 4) {
let allCandidateTime = [];
for (const user of participants) {
const userWeight = PRIORITY_WEIGHT[user.role] || PRIORITY_WEIGHT.normalStaff;
const utcRange = localTimeToUtc(user.timeRange, user.timezone);
// 过滤用户自定义禁止时段
const validRange = filterForbiddenHour(utcRange, user.forbiddenHour || []);
allCandidateTime.push({ validRange, weight: userWeight, userId: user.userId });
}
// 取所有人公共重叠时段,按总权重降序排序
const overlapList = getMultiUserOverlap(allCandidateTime);
const qualifiedList = overlapList.filter(item => {
const durationHour = (item.end - item.start) / 3600000;
return durationHour >= meetingMinDuration && durationHour <= meetingMaxDuration;
});
// 总权重越高方案越优先
qualifiedList.sort((a, b) => b.totalWeight - a.totalWeight);
return qualifiedList;
}
// 过滤个人禁止空闲时段
function filterForbiddenHour(timeRange, forbiddenHourList) {
// 剔除禁止时段逻辑省略,可按需拓展时段分割
return timeRange;
}
// 多人公共重叠时间计算
function getMultiUserOverlap(candidateArr) {
// 原生区间交集计算封装
return [];
}
module.exports = { calculateOptimalSchedule };
5. 隐私权限管控模块 privacy-control.js(新增完整代码)
javascript
运行
// 分级权限、日程脱敏、操作审计日志
const fs = require("fs");
const AUDIT_LOG_PATH = "./meeting/privacy-audit.log";
// 权限分级定义
const PERMISSION_LEVEL = {
admin: "admin",
core: "core",
staff: "staff"
};
// 日程数据脱敏:普通员工隐藏精确时段,仅展示粗略区间
function desensitizeSchedule(rawParticipantData, viewerLevel) {
if (viewerLevel === PERMISSION_LEVEL.admin || viewerLevel === PERMISSION_LEVEL.core) {
return rawParticipantData;
}
// 普通员工查看他人仅保留模糊时段,隐藏精确小时
return rawParticipantData.map(item => ({
userId: item.userId,
timeDesc: item.timeRange.periodType,
exactTime: "已脱敏,仅管理员可见"
}));
}
// 写入隐私操作审计日志
function writeAuditLog(operatorId, operatorLevel, operateType, targetUserId) {
const log = `[${new Date().toISOString()}] operator:${operatorId} level:${operatorLevel} action:${operateType} targetUser:${targetUserId}\n`;
fs.appendFileSync(AUDIT_LOG_PATH, log);
}
module.exports = { desensitizeSchedule, writeAuditLog, PERMISSION_LEVEL };
6. 会议归档与模板复用模块 meeting-archive.js(新增完整代码)
javascript
运行
const fsPromises = require("fs/promises");
const ARCHIVE_PATH = "./meeting/archive.json";
const TEMPLATE_PATH = "./meeting/team-template.json";
// 保存单次协商完整归档记录
async function saveMeetingArchive(meetingId, participantList, bestSchedule, createTs) {
let archive = await loadArchive();
archive.push({ meetingId, participantList, bestSchedule, createTs });
await fsPromises.writeFile(ARCHIVE_PATH, JSON.stringify(archive, null, 2));
}
// 读取全部历史归档
async function loadArchive() {
try {
const raw = await fsPromises.readFile(ARCHIVE_PATH, "utf8");
return JSON.parse(raw);
} catch { return []; }
}
// 团队参会模板保存(批量复用)
async function saveTeamTemplate(tplName, userIds) {
let tpls = await loadTemplate();
tpls[tplName] = userIds;
await fsPromises.writeFile(TEMPLATE_PATH, JSON.stringify(tpls, null, 2));
}
async function loadTemplate() {
try {
const raw = await fsPromises.readFile(TEMPLATE_PATH, "utf8");
return JSON.parse(raw);
} catch { return {}; }
}
module.exports = { saveMeetingArchive, loadArchive, saveTeamTemplate, loadTemplate };
五、改造前后全维度对比对照表
表格
| 对比维度 | 原版 ClawMeeting v1.0.74 | 二次重构优化版 |
|---|---|---|
| 协调并发能力 | 串行排队提交,5 人以上卡顿,服务器离线数据丢失 | 异步并发队列 + 本地持久缓存,离线可独立计算,网络恢复自动同步 |
| 自然语言解析 | 仅简单时段关键词,模糊表述识别失效,无确认机制 | 多层模糊周期解析,置信度打分,识别模糊自动二次确认,准确率大幅提升 |
| 时区兼容能力 | 单一时区计算,跨地域时间完全失真,无夏令时处理 | 独立时区存储,UTC 标准化转换,自动适配夏令时,跨国排期无偏差 |
| 日程冲突计算 | 仅简单时间重叠,无人员权重、禁止时段、会议时长限制 | 多维加权算法,区分角色优先级,自定义禁止时段,限制会议时长,智能避让核心日程 |
| 隐私权限管控 | 全部日程全局可见,无脱敏、无操作审计日志 | 分级权限 + 日程脱敏,完整操作审计,普通成员无法查看他人精确私人时段 |
| 复用归档能力 | 协商结束数据销毁,无批量模板、无历史记录 | 永久归档历史会议,支持团队参会模板一键加载,批量导入参会人 |
六、插件升级完整部署操作步骤
- 备份 ClawMeeting 原版全部源码、协调服务通信配置文件,留存回滚包;
- 新建 / 替换 6 个核心模块 js 文件,完整粘贴上文改造代码;
- 在插件启动入口增加缓存初始化、定时同步、时区转换、归档加载函数;
- 启动 OpenClaw 插件服务,原有自然语言交互、协调服务地址无需修改,完全兼容;
- 分场景全量测试:多人并发提交时段、模糊自然语言输入、跨时区参会、核心人员日程避让、低权限账号查看脱敏日程、团队模板加载、服务器离线本地计算;
- 长期模拟高频团队协商,验证无请求堆积、无时间匹配错乱、无隐私数据泄露、历史方案正常归档复用,改造部署完成。
七、改造方案总结
ClawMeeting v1.0.74 作为成熟版会议协商插件,原生设计仅适配小规模单人、单时区简单排期场景,面对企业团队多人并发、跨国跨时区、隐私管控、批量复用等商用需求存在底层架构硬伤。本次二次改造在完全兼容原有交互逻辑与协调服务协议的基础上,重构协调调度、NLP 解析、时区转换、冲突匹配、隐私管控、归档复用六大核心模块。改造后插件具备高并发稳定运行、高精度自然语言识别、全球时区适配、智能人性化排期、分级隐私安全、高效批量复用六大核心升级,完全适配企业团队长期高频会议协商场景,补齐原版全部功能性、稳定性、安全性短板。