v1: three independent AI Monitor plugins (Codex + Claude + opencode)
This commit is contained in:
@@ -0,0 +1,213 @@
|
||||
// 配置日志文件
|
||||
const now = new Date();
|
||||
const log = require('log4js').configure({
|
||||
appenders: {
|
||||
file: { type: 'file', filename: `./log/${now.getFullYear()}.${now.getMonth() + 1}.${now.getDate()}.log` }
|
||||
},
|
||||
categories: {
|
||||
default: { appenders: ['file'], level: 'info' }
|
||||
}
|
||||
}).getLogger();
|
||||
|
||||
//##################################################
|
||||
//##################全局异常捕获#####################
|
||||
process.on('uncaughtException', (error) => {
|
||||
log.error('Uncaught Exception:', error);
|
||||
});
|
||||
process.on('unhandledRejection', (reason) => {
|
||||
log.error('Unhandled Rejection:', reason);
|
||||
});
|
||||
//##################################################
|
||||
//##################################################
|
||||
|
||||
|
||||
// 插件类
|
||||
const ws = require('ws');
|
||||
class Plugins {
|
||||
static language = JSON.parse(process.argv[9]).application.language;
|
||||
static globalSettings = {};
|
||||
getGlobalSettingsFlag = true;
|
||||
constructor() {
|
||||
if (Plugins.instance) {
|
||||
return Plugins.instance;
|
||||
}
|
||||
// log.info("process.argv", process.argv);
|
||||
this.ws = new ws("ws://127.0.0.1:" + process.argv[3]);
|
||||
this.ws.on('open', () => this.ws.send(JSON.stringify({ uuid: process.argv[5], event: process.argv[7] })));
|
||||
this.ws.on('close', process.exit);
|
||||
this.ws.on('message', e => {
|
||||
if (this.getGlobalSettingsFlag) {
|
||||
// 只获取一次
|
||||
this.getGlobalSettingsFlag = false;
|
||||
this.getGlobalSettings();
|
||||
}
|
||||
const data = JSON.parse(e.toString());
|
||||
const action = data.action?.split('.').pop();
|
||||
this[action]?.[data.event]?.(data);
|
||||
if (data.event === 'didReceiveGlobalSettings') {
|
||||
Plugins.globalSettings = data.payload.settings;
|
||||
}
|
||||
this[data.event]?.(data);
|
||||
});
|
||||
Plugins.instance = this;
|
||||
}
|
||||
|
||||
setGlobalSettings(payload) {
|
||||
Plugins.globalSettings = payload;
|
||||
this.ws.send(JSON.stringify({
|
||||
event: "setGlobalSettings",
|
||||
context: process.argv[5], payload
|
||||
}));
|
||||
}
|
||||
|
||||
getGlobalSettings() {
|
||||
this.ws.send(JSON.stringify({
|
||||
event: "getGlobalSettings",
|
||||
context: process.argv[5],
|
||||
}));
|
||||
}
|
||||
// 设置标题
|
||||
setTitle(context, str, row = 0, num = 6) {
|
||||
let newStr = null;
|
||||
if (row && str) {
|
||||
let nowRow = 1, strArr = str.split('');
|
||||
strArr.forEach((item, index) => {
|
||||
if (nowRow < row && index >= nowRow * num) { nowRow++; newStr += '\n'; }
|
||||
if (nowRow <= row && index < nowRow * num) { newStr += item; }
|
||||
});
|
||||
if (strArr.length > row * num) { newStr = newStr.substring(0, newStr.length - 1); newStr += '..'; }
|
||||
}
|
||||
this.ws.send(JSON.stringify({
|
||||
event: "setTitle",
|
||||
context, payload: {
|
||||
target: 0,
|
||||
title: newStr || str + ''
|
||||
}
|
||||
}));
|
||||
}
|
||||
// 设置背景
|
||||
setImage(context, url) {
|
||||
this.ws.send(JSON.stringify({
|
||||
event: "setImage",
|
||||
context, payload: {
|
||||
target: 0,
|
||||
image: url
|
||||
}
|
||||
}));
|
||||
}
|
||||
// 设置状态
|
||||
setState(context, state) {
|
||||
this.ws.send(JSON.stringify({
|
||||
event: "setState",
|
||||
context, payload: { state }
|
||||
}));
|
||||
}
|
||||
// 保存持久化数据
|
||||
setSettings(context, payload) {
|
||||
this.ws.send(JSON.stringify({
|
||||
event: "setSettings",
|
||||
context, payload
|
||||
}));
|
||||
}
|
||||
|
||||
// 在按键上展示警告
|
||||
showAlert(context) {
|
||||
this.ws.send(JSON.stringify({
|
||||
event: "showAlert",
|
||||
context
|
||||
}));
|
||||
}
|
||||
|
||||
// 在按键上展示成功
|
||||
showOk(context) {
|
||||
this.ws.send(JSON.stringify({
|
||||
event: "showOk",
|
||||
context
|
||||
}));
|
||||
}
|
||||
// 发送给属性检测器
|
||||
sendToPropertyInspector(payload) {
|
||||
this.ws.send(JSON.stringify({
|
||||
action: Actions.currentAction,
|
||||
context: Actions.currentContext,
|
||||
payload, event: "sendToPropertyInspector"
|
||||
}));
|
||||
}
|
||||
// 用默认浏览器打开网页
|
||||
openUrl(url) {
|
||||
this.ws.send(JSON.stringify({
|
||||
event: "openUrl",
|
||||
payload: { url }
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
// 操作类
|
||||
class Actions {
|
||||
constructor(data) {
|
||||
this.data = {};
|
||||
this.default = {};
|
||||
Object.assign(this, data);
|
||||
}
|
||||
// 属性检查器显示时
|
||||
static currentAction = null;
|
||||
static currentContext = null;
|
||||
static actions = {};
|
||||
propertyInspectorDidAppear(data) {
|
||||
Actions.currentAction = data.action;
|
||||
Actions.currentContext = data.context;
|
||||
this._propertyInspectorDidAppear?.(data);
|
||||
}
|
||||
// 初始化数据
|
||||
willAppear(data) {
|
||||
Plugins.globalContext = data.context;
|
||||
Actions.actions[data.context] = data.action
|
||||
const { context, payload: { settings } } = data;
|
||||
this.data[context] = Object.assign({ ...this.default }, settings);
|
||||
this._willAppear?.(data);
|
||||
}
|
||||
|
||||
didReceiveSettings(data) {
|
||||
this.data[data.context] = data.payload.settings;
|
||||
this._didReceiveSettings?.(data);
|
||||
}
|
||||
// 行动销毁
|
||||
willDisappear(data) {
|
||||
this._willDisappear?.(data);
|
||||
delete this.data[data.context];
|
||||
}
|
||||
}
|
||||
|
||||
class EventEmitter {
|
||||
constructor() {
|
||||
this.events = {};
|
||||
}
|
||||
|
||||
// 订阅事件
|
||||
subscribe(event, listener) {
|
||||
if (!this.events[event]) {
|
||||
this.events[event] = [];
|
||||
}
|
||||
this.events[event].push(listener);
|
||||
}
|
||||
|
||||
// 取消订阅
|
||||
unsubscribe(event, listenerToRemove) {
|
||||
if (!this.events[event]) return;
|
||||
|
||||
this.events[event] = this.events[event].filter(listener => listener !== listenerToRemove);
|
||||
}
|
||||
|
||||
// 发布事件
|
||||
emit(event, data) {
|
||||
if (!this.events[event]) return;
|
||||
this.events[event].forEach(listener => listener(data));
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
log,
|
||||
Plugins,
|
||||
Actions,
|
||||
EventEmitter
|
||||
};
|
||||
Reference in New Issue
Block a user