添加完整的微信插件测试框架,包含: - 微信插件源码(weixin-plugin/) - TypeScript 类型定义(types.ts) - 插件编译脚本(scripts/build-weixin-plugin.sh) - 简化测试脚本(scripts/test-weixin-simple.js) - 完整测试脚本(scripts/test-weixin-plugin.js) - 项目配置和依赖管理(package.json) - 使用说明文档(README.md) 主要功能: - 支持二维码登录认证 - HTTP 长轮询消息接收 - 文本、图片、视频、文件消息收发 - 自动回复测试 - 运行状态统计 Generated with [Claude Code](https://claude.com/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
/**
|
|
* Per-bot debug mode toggle, persisted to disk so it survives gateway restarts.
|
|
*
|
|
* State file: `<stateDir>/openclaw-weixin/debug-mode.json`
|
|
* Format: `{ "accounts": { "<accountId>": true, ... } }`
|
|
*
|
|
* When enabled, processOneMessage appends a timing summary after each
|
|
* AI reply is delivered to the user.
|
|
*/
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
import { resolveStateDir } from "../storage/state-dir.js";
|
|
import { logger } from "../util/logger.js";
|
|
|
|
interface DebugModeState {
|
|
accounts: Record<string, boolean>;
|
|
}
|
|
|
|
function resolveDebugModePath(): string {
|
|
return path.join(resolveStateDir(), "openclaw-weixin", "debug-mode.json");
|
|
}
|
|
|
|
function loadState(): DebugModeState {
|
|
try {
|
|
const raw = fs.readFileSync(resolveDebugModePath(), "utf-8");
|
|
const parsed = JSON.parse(raw) as DebugModeState;
|
|
if (parsed && typeof parsed.accounts === "object") return parsed;
|
|
} catch {
|
|
// missing or corrupt — start fresh
|
|
}
|
|
return { accounts: {} };
|
|
}
|
|
|
|
function saveState(state: DebugModeState): void {
|
|
const filePath = resolveDebugModePath();
|
|
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
fs.writeFileSync(filePath, JSON.stringify(state, null, 2), "utf-8");
|
|
}
|
|
|
|
/** Toggle debug mode for a bot account. Returns the new state. */
|
|
export function toggleDebugMode(accountId: string): boolean {
|
|
const state = loadState();
|
|
const next = !state.accounts[accountId];
|
|
state.accounts[accountId] = next;
|
|
try {
|
|
saveState(state);
|
|
} catch (err) {
|
|
logger.error(`debug-mode: failed to persist state: ${String(err)}`);
|
|
}
|
|
return next;
|
|
}
|
|
|
|
/** Check whether debug mode is active for a bot account. */
|
|
export function isDebugMode(accountId: string): boolean {
|
|
return loadState().accounts[accountId] === true;
|
|
}
|
|
|
|
/**
|
|
* Reset internal state — only for tests.
|
|
* @internal
|
|
*/
|
|
export function _resetForTest(): void {
|
|
try {
|
|
fs.unlinkSync(resolveDebugModePath());
|
|
} catch {
|
|
// ignore if not present
|
|
}
|
|
}
|