@aipanel/core 1.2.0-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.
- package/es/constants.d.ts +145 -0
- package/es/constants.mjs +124 -0
- package/es/file-log-watcher.d.ts +20 -0
- package/es/file-log-watcher.mjs +126 -0
- package/es/index.d.ts +7 -0
- package/es/index.mjs +7 -0
- package/es/logger-core.d.ts +37 -0
- package/es/logger-core.mjs +143 -0
- package/es/logger.d.ts +15 -0
- package/es/logger.mjs +127 -0
- package/es/node-logger.d.ts +38 -0
- package/es/node-logger.mjs +230 -0
- package/es/node-utils.d.ts +28 -0
- package/es/node-utils.mjs +56 -0
- package/es/node.d.ts +6 -0
- package/es/node.mjs +6 -0
- package/es/options.d.ts +63 -0
- package/es/options.mjs +30 -0
- package/es/process-logger.d.ts +97 -0
- package/es/process-logger.mjs +193 -0
- package/es/provider.d.ts +160 -0
- package/es/provider.mjs +0 -0
- package/es/types.d.ts +275 -0
- package/es/types.mjs +40 -0
- package/es/utils.d.ts +34 -0
- package/es/utils.mjs +53 -0
- package/lib/constants.cjs +188 -0
- package/lib/constants.d.ts +145 -0
- package/lib/file-log-watcher.cjs +160 -0
- package/lib/file-log-watcher.d.ts +20 -0
- package/lib/index.cjs +33 -0
- package/lib/index.d.ts +7 -0
- package/lib/logger-core.cjs +177 -0
- package/lib/logger-core.d.ts +37 -0
- package/lib/logger.cjs +145 -0
- package/lib/logger.d.ts +15 -0
- package/lib/node-logger.cjs +252 -0
- package/lib/node-logger.d.ts +38 -0
- package/lib/node-utils.cjs +93 -0
- package/lib/node-utils.d.ts +28 -0
- package/lib/node.cjs +31 -0
- package/lib/node.d.ts +6 -0
- package/lib/options.cjs +54 -0
- package/lib/options.d.ts +63 -0
- package/lib/process-logger.cjs +217 -0
- package/lib/process-logger.d.ts +97 -0
- package/lib/provider.cjs +15 -0
- package/lib/provider.d.ts +160 -0
- package/lib/types.cjs +64 -0
- package/lib/types.d.ts +275 -0
- package/lib/utils.cjs +80 -0
- package/lib/utils.d.ts +34 -0
- package/package.json +34 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var node_utils_exports = {};
|
|
29
|
+
__export(node_utils_exports, {
|
|
30
|
+
checkChromeDevToolsAvailable: () => checkChromeDevToolsAvailable,
|
|
31
|
+
createPackageRequire: () => createPackageRequire,
|
|
32
|
+
findAvailablePort: () => findAvailablePort,
|
|
33
|
+
isPortAvailable: () => isPortAvailable,
|
|
34
|
+
resolvePackageDir: () => resolvePackageDir
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(node_utils_exports);
|
|
37
|
+
var import_node_module = require("node:module");
|
|
38
|
+
var import_node_path = __toESM(require("node:path"));
|
|
39
|
+
var import_constants = require("./constants.cjs");
|
|
40
|
+
function createPackageRequire(baseDir = process.cwd()) {
|
|
41
|
+
return (0, import_node_module.createRequire)(import_node_path.default.join(baseDir, "package.json"));
|
|
42
|
+
}
|
|
43
|
+
function resolvePackageDir(packageName, baseDir = process.cwd()) {
|
|
44
|
+
const require2 = createPackageRequire(baseDir);
|
|
45
|
+
const entryPath = require2.resolve(packageName);
|
|
46
|
+
return import_node_path.default.dirname(import_node_path.default.dirname(entryPath));
|
|
47
|
+
}
|
|
48
|
+
async function checkChromeDevToolsAvailable(port = import_constants.CHROME_DEVTOOLS_PORT, timeout = import_constants.CHROME_DEVTOOLS_CHECK_TIMEOUT) {
|
|
49
|
+
const net = await import("net");
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
const socket = new net.Socket();
|
|
52
|
+
const timer = setTimeout(() => {
|
|
53
|
+
socket.destroy();
|
|
54
|
+
resolve(false);
|
|
55
|
+
}, timeout);
|
|
56
|
+
socket.connect(port, "localhost", () => {
|
|
57
|
+
clearTimeout(timer);
|
|
58
|
+
socket.removeAllListeners();
|
|
59
|
+
socket.destroy();
|
|
60
|
+
resolve(true);
|
|
61
|
+
});
|
|
62
|
+
socket.on("error", () => {
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
resolve(false);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async function isPortAvailable(port, hostname) {
|
|
69
|
+
const net = await import("net");
|
|
70
|
+
return new Promise((resolve) => {
|
|
71
|
+
const server = net.createServer();
|
|
72
|
+
server.once("error", () => resolve(false));
|
|
73
|
+
server.once("listening", () => {
|
|
74
|
+
server.close();
|
|
75
|
+
resolve(true);
|
|
76
|
+
});
|
|
77
|
+
server.listen(port, hostname);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async function findAvailablePort(startPort, hostname, maxTries = 100) {
|
|
81
|
+
for (let port = startPort; port < startPort + maxTries; port++) {
|
|
82
|
+
if (await isPortAvailable(port, hostname)) return port;
|
|
83
|
+
}
|
|
84
|
+
throw new Error(`No available port in range ${startPort}-${startPort + maxTries}`);
|
|
85
|
+
}
|
|
86
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
87
|
+
0 && (module.exports = {
|
|
88
|
+
checkChromeDevToolsAvailable,
|
|
89
|
+
createPackageRequire,
|
|
90
|
+
findAvailablePort,
|
|
91
|
+
isPortAvailable,
|
|
92
|
+
resolvePackageDir
|
|
93
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Node.js 专用工具函数(仅服务端可用)
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 创建一个锚定到指定目录(默认 process.cwd())的 require。
|
|
6
|
+
* 跨 ESM/CJS 安全,避免依赖 __dirname / import.meta.url(CJS 打包时会与 Node 内置变量冲突或被置空)。
|
|
7
|
+
*/
|
|
8
|
+
export declare function createPackageRequire(baseDir?: string): NodeJS.Require;
|
|
9
|
+
/**
|
|
10
|
+
* 解析 npm 包根目录(跨 ESM/CJS 安全)。
|
|
11
|
+
* @param packageName - 包名,例如 "vite-plugin-aipanel"
|
|
12
|
+
* @param baseDir - 解析基准目录,默认当前工作目录
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolvePackageDir(packageName: string, baseDir?: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* 检查 Chrome DevTools 是否可用
|
|
17
|
+
* @param timeout - 超时时间(毫秒),默认 2000ms
|
|
18
|
+
* @returns Chrome DevTools 是否可用
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkChromeDevToolsAvailable(port?: number, timeout?: number): Promise<boolean>;
|
|
21
|
+
/**
|
|
22
|
+
* 检查指定端口是否可用
|
|
23
|
+
*/
|
|
24
|
+
export declare function isPortAvailable(port: number, hostname?: string): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* 从 startPort 开始寻找可用端口
|
|
27
|
+
*/
|
|
28
|
+
export declare function findAvailablePort(startPort: number, hostname?: string, maxTries?: number): Promise<number>;
|
package/lib/node.cjs
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __copyProps = (to, from, except, desc) => {
|
|
6
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
7
|
+
for (let key of __getOwnPropNames(from))
|
|
8
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
9
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
10
|
+
}
|
|
11
|
+
return to;
|
|
12
|
+
};
|
|
13
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
var node_exports = {};
|
|
16
|
+
module.exports = __toCommonJS(node_exports);
|
|
17
|
+
__reExport(node_exports, require("./constants.cjs"), module.exports);
|
|
18
|
+
__reExport(node_exports, require("./logger-core.cjs"), module.exports);
|
|
19
|
+
__reExport(node_exports, require("./node-logger.cjs"), module.exports);
|
|
20
|
+
__reExport(node_exports, require("./process-logger.cjs"), module.exports);
|
|
21
|
+
__reExport(node_exports, require("./file-log-watcher.cjs"), module.exports);
|
|
22
|
+
__reExport(node_exports, require("./node-utils.cjs"), module.exports);
|
|
23
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
24
|
+
0 && (module.exports = {
|
|
25
|
+
...require("./constants.cjs"),
|
|
26
|
+
...require("./logger-core.cjs"),
|
|
27
|
+
...require("./node-logger.cjs"),
|
|
28
|
+
...require("./process-logger.cjs"),
|
|
29
|
+
...require("./file-log-watcher.cjs"),
|
|
30
|
+
...require("./node-utils.cjs")
|
|
31
|
+
});
|
package/lib/node.d.ts
ADDED
package/lib/options.cjs
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var options_exports = {};
|
|
19
|
+
__export(options_exports, {
|
|
20
|
+
DEFAULT_PLUGIN_OPTIONS: () => DEFAULT_PLUGIN_OPTIONS,
|
|
21
|
+
resolvePluginConfig: () => resolvePluginConfig
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(options_exports);
|
|
24
|
+
var import_constants = require("./constants.cjs");
|
|
25
|
+
const DEFAULT_PLUGIN_OPTIONS = {
|
|
26
|
+
enabled: true,
|
|
27
|
+
provider: "default",
|
|
28
|
+
webPort: import_constants.DEFAULT_WEB_PORT,
|
|
29
|
+
hostname: import_constants.DEFAULT_HOSTNAME,
|
|
30
|
+
theme: "dark",
|
|
31
|
+
open: false,
|
|
32
|
+
verbose: false,
|
|
33
|
+
mcpOnly: false,
|
|
34
|
+
hotkey: "ctrl+k",
|
|
35
|
+
warmupChromeMcp: true,
|
|
36
|
+
chromeDevtoolsPort: import_constants.CHROME_DEVTOOLS_PORT,
|
|
37
|
+
displayMode: "extension",
|
|
38
|
+
splitMode: void 0,
|
|
39
|
+
providerOptions: void 0
|
|
40
|
+
};
|
|
41
|
+
function resolvePluginConfig(options = {}) {
|
|
42
|
+
return {
|
|
43
|
+
...DEFAULT_PLUGIN_OPTIONS,
|
|
44
|
+
...options,
|
|
45
|
+
providerOptions: {
|
|
46
|
+
...options.providerOptions ?? {}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
51
|
+
0 && (module.exports = {
|
|
52
|
+
DEFAULT_PLUGIN_OPTIONS,
|
|
53
|
+
resolvePluginConfig
|
|
54
|
+
});
|
package/lib/options.d.ts
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 插件通用配置(Provider 无关)
|
|
3
|
+
* Provider 专属配置通过泛型 P 注入,核心层不感知具体 schema。
|
|
4
|
+
*/
|
|
5
|
+
import type { DisplayMode, LogFileConfig, SplitModeOptions } from "./types";
|
|
6
|
+
/**
|
|
7
|
+
* 插件配置选项
|
|
8
|
+
* @typeParam P - 当前 Provider 的专属配置段(schema 由具体 Provider 声明)
|
|
9
|
+
*/
|
|
10
|
+
export interface PluginOptions<P extends Record<string, unknown> = Record<string, unknown>> {
|
|
11
|
+
/** 是否启用插件,默认 true */
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
/** 选择的 Web Provider 标识,默认 "default" */
|
|
14
|
+
provider?: string;
|
|
15
|
+
/** Web 服务端口,默认 5097 */
|
|
16
|
+
webPort?: number;
|
|
17
|
+
/** 代理服务端口,默认 6097 */
|
|
18
|
+
proxyPort?: number;
|
|
19
|
+
/** 服务主机名,默认 '127.0.0.1' */
|
|
20
|
+
hostname?: string;
|
|
21
|
+
/** 挂件位置,默认 'bottom-right' */
|
|
22
|
+
position?: "bottom-right" | "bottom-left" | "top-right" | "top-left";
|
|
23
|
+
/** 主题模式,默认 'dark' */
|
|
24
|
+
theme?: "light" | "dark" | "auto";
|
|
25
|
+
/** 是否自动打开面板,默认 false */
|
|
26
|
+
open?: boolean;
|
|
27
|
+
/** 是否输出详细日志,默认 false */
|
|
28
|
+
verbose?: boolean;
|
|
29
|
+
/** 纯净 MCP 模式:只暴露 MCP 工具服务,不注入挂件、不启动 provider Web 进程,默认为 false */
|
|
30
|
+
mcpOnly?: boolean;
|
|
31
|
+
/** 快捷键配置,默认 'ctrl+k' */
|
|
32
|
+
hotkey?: string;
|
|
33
|
+
/** 服务启动后是否立即预热 Chrome MCP,默认 true */
|
|
34
|
+
warmupChromeMcp?: boolean;
|
|
35
|
+
/** Chrome DevTools Protocol 端口,默认 9222 */
|
|
36
|
+
chromeDevtoolsPort?: number;
|
|
37
|
+
/** 展示模式,默认 'bubble' */
|
|
38
|
+
displayMode?: DisplayMode;
|
|
39
|
+
/** 分屏模式配置 */
|
|
40
|
+
splitMode?: SplitModeOptions;
|
|
41
|
+
/** 自定义日志文件配置,为 Agent 提供查看外部服务日志的能力 */
|
|
42
|
+
logFiles?: LogFileConfig[];
|
|
43
|
+
/** Provider 专属配置段(schema 由具体 Provider 声明,核心层不感知) */
|
|
44
|
+
providerOptions?: P;
|
|
45
|
+
/** @deprecated 使用 providerOptions.language */
|
|
46
|
+
language?: string;
|
|
47
|
+
/** @deprecated 使用 providerOptions.settings */
|
|
48
|
+
settings?: unknown;
|
|
49
|
+
/** @deprecated 使用 providerOptions.enableLsp */
|
|
50
|
+
enableLsp?: boolean;
|
|
51
|
+
/** @deprecated 使用 providerOptions.enableBlockOnError */
|
|
52
|
+
enableBlockOnError?: boolean;
|
|
53
|
+
/** @deprecated 使用 providerOptions.enablePrettier */
|
|
54
|
+
enablePrettier?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/** 插件通用配置默认值(Provider 无关部分) */
|
|
57
|
+
export declare const DEFAULT_PLUGIN_OPTIONS: Partial<PluginOptions>;
|
|
58
|
+
/**
|
|
59
|
+
* 组装运行时配置(通用默认 + 用户配置)
|
|
60
|
+
* Provider 专属段原样合并透传,schema 由 Provider 自行解析;
|
|
61
|
+
* deprecated 顶层字段不在此迁移,保留在 config 顶层,由 Provider 读取兜底。
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolvePluginConfig<P extends Record<string, unknown> = Record<string, unknown>>(options?: PluginOptions<P>): Required<PluginOptions<P>>;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
20
|
+
var process_logger_exports = {};
|
|
21
|
+
__export(process_logger_exports, {
|
|
22
|
+
getProcessLogBuffer: () => getProcessLogBuffer,
|
|
23
|
+
initProcessLogCapture: () => initProcessLogCapture,
|
|
24
|
+
stopProcessLogCapture: () => stopProcessLogCapture
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(process_logger_exports);
|
|
27
|
+
const DEFAULT_MAX_SIZE = 500;
|
|
28
|
+
class ProcessLogBuffer {
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
__publicField(this, "buffer", []);
|
|
31
|
+
__publicField(this, "maxSize");
|
|
32
|
+
__publicField(this, "enabled", true);
|
|
33
|
+
__publicField(this, "originalConsole", null);
|
|
34
|
+
this.maxSize = options.maxSize ?? DEFAULT_MAX_SIZE;
|
|
35
|
+
this.enabled = options.enabled ?? true;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 启动 console 拦截
|
|
39
|
+
*/
|
|
40
|
+
intercept() {
|
|
41
|
+
if (this.originalConsole) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.originalConsole = {
|
|
45
|
+
log: console.log,
|
|
46
|
+
info: console.info,
|
|
47
|
+
warn: console.warn,
|
|
48
|
+
error: console.error,
|
|
49
|
+
debug: console.debug
|
|
50
|
+
};
|
|
51
|
+
console.log = this.createInterceptor("log", this.originalConsole.log);
|
|
52
|
+
console.info = this.createInterceptor("info", this.originalConsole.info);
|
|
53
|
+
console.warn = this.createInterceptor("warn", this.originalConsole.warn);
|
|
54
|
+
console.error = this.createInterceptor("error", this.originalConsole.error);
|
|
55
|
+
console.debug = this.createInterceptor("debug", this.originalConsole.debug);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 停止拦截,恢复原始 console
|
|
59
|
+
*/
|
|
60
|
+
restore() {
|
|
61
|
+
if (!this.originalConsole) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
console.log = this.originalConsole.log;
|
|
65
|
+
console.info = this.originalConsole.info;
|
|
66
|
+
console.warn = this.originalConsole.warn;
|
|
67
|
+
console.error = this.originalConsole.error;
|
|
68
|
+
console.debug = this.originalConsole.debug;
|
|
69
|
+
this.originalConsole = null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 创建拦截器函数
|
|
73
|
+
*/
|
|
74
|
+
createInterceptor(level, original) {
|
|
75
|
+
return (...args) => {
|
|
76
|
+
original.apply(console, args);
|
|
77
|
+
if (this.enabled) {
|
|
78
|
+
this.addEntry({
|
|
79
|
+
level,
|
|
80
|
+
message: this.serializeArgs(args),
|
|
81
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
82
|
+
source: "console"
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 序列化参数为字符串
|
|
89
|
+
*/
|
|
90
|
+
serializeArgs(args) {
|
|
91
|
+
return args.map((arg) => {
|
|
92
|
+
if (typeof arg === "string") {
|
|
93
|
+
return arg;
|
|
94
|
+
}
|
|
95
|
+
if (typeof arg === "number" || typeof arg === "boolean") {
|
|
96
|
+
return String(arg);
|
|
97
|
+
}
|
|
98
|
+
if (arg === null) {
|
|
99
|
+
return "null";
|
|
100
|
+
}
|
|
101
|
+
if (arg === void 0) {
|
|
102
|
+
return "undefined";
|
|
103
|
+
}
|
|
104
|
+
if (typeof arg === "object") {
|
|
105
|
+
try {
|
|
106
|
+
return JSON.stringify(arg, null, 2);
|
|
107
|
+
} catch {
|
|
108
|
+
return String(arg);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return String(arg);
|
|
112
|
+
}).join(" ");
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 添加日志条目
|
|
116
|
+
*/
|
|
117
|
+
addEntry(entry) {
|
|
118
|
+
if (!this.enabled) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (this.buffer.length >= this.maxSize) {
|
|
122
|
+
this.buffer.shift();
|
|
123
|
+
}
|
|
124
|
+
this.buffer.push(entry);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 添加 Provider stdout 日志
|
|
128
|
+
*/
|
|
129
|
+
addProviderStdout(message) {
|
|
130
|
+
this.addEntry({
|
|
131
|
+
level: "info",
|
|
132
|
+
message,
|
|
133
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
134
|
+
source: "provider-stdout"
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 添加 Provider stderr 日志
|
|
139
|
+
*/
|
|
140
|
+
addProviderStderr(message) {
|
|
141
|
+
this.addEntry({
|
|
142
|
+
level: "error",
|
|
143
|
+
message,
|
|
144
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
145
|
+
source: "provider-stderr"
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* 获取日志
|
|
150
|
+
* @param options 过滤选项
|
|
151
|
+
*/
|
|
152
|
+
getLogs(options = {}) {
|
|
153
|
+
let logs = [...this.buffer];
|
|
154
|
+
if (options.level) {
|
|
155
|
+
const levels = Array.isArray(options.level) ? options.level : [options.level];
|
|
156
|
+
logs = logs.filter((log) => levels.includes(log.level));
|
|
157
|
+
}
|
|
158
|
+
if (options.source) {
|
|
159
|
+
logs = logs.filter((log) => log.source === options.source);
|
|
160
|
+
}
|
|
161
|
+
if (options.since) {
|
|
162
|
+
const sinceDate = new Date(options.since);
|
|
163
|
+
logs = logs.filter((log) => new Date(log.timestamp) >= sinceDate);
|
|
164
|
+
}
|
|
165
|
+
if (options.limit && options.limit > 0) {
|
|
166
|
+
logs = logs.slice(-options.limit);
|
|
167
|
+
}
|
|
168
|
+
return logs;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* 清空缓冲区
|
|
172
|
+
*/
|
|
173
|
+
clear() {
|
|
174
|
+
this.buffer = [];
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 获取缓冲区大小
|
|
178
|
+
*/
|
|
179
|
+
size() {
|
|
180
|
+
return this.buffer.length;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* 启用/禁用捕获
|
|
184
|
+
*/
|
|
185
|
+
setEnabled(enabled) {
|
|
186
|
+
this.enabled = enabled;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 获取是否启用
|
|
190
|
+
*/
|
|
191
|
+
isEnabled() {
|
|
192
|
+
return this.enabled;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
let globalBuffer = null;
|
|
196
|
+
function getProcessLogBuffer(options) {
|
|
197
|
+
if (!globalBuffer) {
|
|
198
|
+
globalBuffer = new ProcessLogBuffer(options);
|
|
199
|
+
}
|
|
200
|
+
return globalBuffer;
|
|
201
|
+
}
|
|
202
|
+
function initProcessLogCapture(options) {
|
|
203
|
+
const buffer = getProcessLogBuffer(options);
|
|
204
|
+
buffer.intercept();
|
|
205
|
+
return buffer;
|
|
206
|
+
}
|
|
207
|
+
function stopProcessLogCapture() {
|
|
208
|
+
if (globalBuffer) {
|
|
209
|
+
globalBuffer.restore();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
213
|
+
0 && (module.exports = {
|
|
214
|
+
getProcessLogBuffer,
|
|
215
|
+
initProcessLogCapture,
|
|
216
|
+
stopProcessLogCapture
|
|
217
|
+
});
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview 进程日志捕获器
|
|
3
|
+
* @description 拦截 console 方法并存储日志到内存缓冲区,供 agent 通过工具获取
|
|
4
|
+
*/
|
|
5
|
+
export interface ProcessLogEntry {
|
|
6
|
+
/** 日志级别 */
|
|
7
|
+
level: "log" | "info" | "warn" | "error" | "debug";
|
|
8
|
+
/** 日志内容(已序列化为字符串) */
|
|
9
|
+
message: string;
|
|
10
|
+
/** 时间戳(ISO 格式) */
|
|
11
|
+
timestamp: string;
|
|
12
|
+
/** 来源标识 */
|
|
13
|
+
source?: "console" | "provider-stdout" | "provider-stderr" | "vite";
|
|
14
|
+
}
|
|
15
|
+
export interface ProcessLogBufferOptions {
|
|
16
|
+
/** 最大日志条数,默认 500 */
|
|
17
|
+
maxSize?: number;
|
|
18
|
+
/** 是否启用捕获,默认 true */
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 进程日志缓冲区
|
|
23
|
+
*/
|
|
24
|
+
declare class ProcessLogBuffer {
|
|
25
|
+
private buffer;
|
|
26
|
+
private maxSize;
|
|
27
|
+
private enabled;
|
|
28
|
+
private originalConsole;
|
|
29
|
+
constructor(options?: ProcessLogBufferOptions);
|
|
30
|
+
/**
|
|
31
|
+
* 启动 console 拦截
|
|
32
|
+
*/
|
|
33
|
+
intercept(): void;
|
|
34
|
+
/**
|
|
35
|
+
* 停止拦截,恢复原始 console
|
|
36
|
+
*/
|
|
37
|
+
restore(): void;
|
|
38
|
+
/**
|
|
39
|
+
* 创建拦截器函数
|
|
40
|
+
*/
|
|
41
|
+
private createInterceptor;
|
|
42
|
+
/**
|
|
43
|
+
* 序列化参数为字符串
|
|
44
|
+
*/
|
|
45
|
+
private serializeArgs;
|
|
46
|
+
/**
|
|
47
|
+
* 添加日志条目
|
|
48
|
+
*/
|
|
49
|
+
addEntry(entry: ProcessLogEntry): void;
|
|
50
|
+
/**
|
|
51
|
+
* 添加 Provider stdout 日志
|
|
52
|
+
*/
|
|
53
|
+
addProviderStdout(message: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* 添加 Provider stderr 日志
|
|
56
|
+
*/
|
|
57
|
+
addProviderStderr(message: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* 获取日志
|
|
60
|
+
* @param options 过滤选项
|
|
61
|
+
*/
|
|
62
|
+
getLogs(options?: {
|
|
63
|
+
level?: ProcessLogEntry["level"] | ProcessLogEntry["level"][];
|
|
64
|
+
limit?: number;
|
|
65
|
+
source?: ProcessLogEntry["source"];
|
|
66
|
+
since?: string;
|
|
67
|
+
}): ProcessLogEntry[];
|
|
68
|
+
/**
|
|
69
|
+
* 清空缓冲区
|
|
70
|
+
*/
|
|
71
|
+
clear(): void;
|
|
72
|
+
/**
|
|
73
|
+
* 获取缓冲区大小
|
|
74
|
+
*/
|
|
75
|
+
size(): number;
|
|
76
|
+
/**
|
|
77
|
+
* 启用/禁用捕获
|
|
78
|
+
*/
|
|
79
|
+
setEnabled(enabled: boolean): void;
|
|
80
|
+
/**
|
|
81
|
+
* 获取是否启用
|
|
82
|
+
*/
|
|
83
|
+
isEnabled(): boolean;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 获取全局日志缓冲区
|
|
87
|
+
*/
|
|
88
|
+
export declare function getProcessLogBuffer(options?: ProcessLogBufferOptions): ProcessLogBuffer;
|
|
89
|
+
/**
|
|
90
|
+
* 初始化进程日志捕获
|
|
91
|
+
*/
|
|
92
|
+
export declare function initProcessLogCapture(options?: ProcessLogBufferOptions): ProcessLogBuffer;
|
|
93
|
+
/**
|
|
94
|
+
* 停止进程日志捕获
|
|
95
|
+
*/
|
|
96
|
+
export declare function stopProcessLogCapture(): void;
|
|
97
|
+
export {};
|
package/lib/provider.cjs
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __copyProps = (to, from, except, desc) => {
|
|
6
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
7
|
+
for (let key of __getOwnPropNames(from))
|
|
8
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
9
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
10
|
+
}
|
|
11
|
+
return to;
|
|
12
|
+
};
|
|
13
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
14
|
+
var provider_exports = {};
|
|
15
|
+
module.exports = __toCommonJS(provider_exports);
|