feihong-code 0.6.1 → 7.2.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/.github/workflows/release.yml +173 -0
- package/CHANGELOG.md +83 -454
- package/dist/agent/browser-agent.js +354 -0
- package/dist/agent/browser-agent.js.map +1 -0
- package/dist/agent/change-manager.js +433 -0
- package/dist/agent/change-manager.js.map +1 -0
- package/dist/agent/code-rag.js +293 -0
- package/dist/agent/code-rag.js.map +1 -0
- package/dist/agent/code-writer.js +13 -1
- package/dist/agent/code-writer.js.map +1 -1
- package/dist/agent/completion-engine.js +522 -0
- package/dist/agent/completion-engine.js.map +1 -0
- package/dist/agent/context-compactor.js +188 -10
- package/dist/agent/context-compactor.js.map +1 -1
- package/dist/agent/custom-agent.js +368 -0
- package/dist/agent/custom-agent.js.map +1 -0
- package/dist/agent/design-to-code.js +218 -0
- package/dist/agent/design-to-code.js.map +1 -0
- package/dist/agent/event-driven-agent.js +359 -0
- package/dist/agent/event-driven-agent.js.map +1 -0
- package/dist/agent/git-integration.js +324 -0
- package/dist/agent/git-integration.js.map +1 -0
- package/dist/agent/layered-memory.js +329 -0
- package/dist/agent/layered-memory.js.map +1 -0
- package/dist/agent/multi-agent.js +359 -0
- package/dist/agent/multi-agent.js.map +1 -0
- package/dist/agent/orchestrator.js +160 -22
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts.js +20 -0
- package/dist/agent/prompts.js.map +1 -1
- package/dist/agent/quality-gate.js +139 -0
- package/dist/agent/quality-gate.js.map +1 -1
- package/dist/agent/self-correction.js +274 -0
- package/dist/agent/self-correction.js.map +1 -0
- package/dist/agent/self-heal.js +42 -12
- package/dist/agent/self-heal.js.map +1 -1
- package/dist/agent/solo-agent.js +321 -0
- package/dist/agent/solo-agent.js.map +1 -0
- package/dist/agent/symbol-index.js +258 -28
- package/dist/agent/symbol-index.js.map +1 -1
- package/dist/agent/team-collaboration.js +252 -0
- package/dist/agent/team-collaboration.js.map +1 -0
- package/dist/agent/type-checker.js +229 -0
- package/dist/agent/type-checker.js.map +1 -0
- package/dist/cli/run.js +1 -0
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/integrations/collaboration.js +219 -0
- package/dist/integrations/collaboration.js.map +1 -0
- package/dist/integrations/figma.js +307 -0
- package/dist/integrations/figma.js.map +1 -0
- package/dist/integrations/sso.js +327 -0
- package/dist/integrations/sso.js.map +1 -0
- package/dist/knowledge/library.js +301 -0
- package/dist/knowledge/library.js.map +1 -0
- package/dist/plugins/manager.js +332 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/runtime/event-log.js.map +1 -1
- package/dist/tools/browser/browser.tool.js +217 -0
- package/dist/tools/browser/browser.tool.js.map +1 -0
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/shell/exec.js +50 -10
- package/dist/tools/shell/exec.js.map +1 -1
- package/dist/tools/shell/run-shell.tool.js +8 -2
- package/dist/tools/shell/run-shell.tool.js.map +1 -1
- package/dist/training/completion-evaluator.js +213 -0
- package/dist/training/completion-evaluator.js.map +1 -0
- package/dist/training/fim-data.js +248 -0
- package/dist/training/fim-data.js.map +1 -0
- package/dist/voice/voice-programming.js +223 -0
- package/dist/voice/voice-programming.js.map +1 -0
- package/dist/web/public/css/style.css +190 -7
- package/dist/web/public/index.html +403 -9
- package/dist/web/public/js/api.js +191 -4
- package/dist/web/public/js/app.js +850 -123
- package/dist/web/public/js/mock-api.js +234 -0
- package/dist/web/public/js/monaco-editor.js +203 -0
- package/dist/web/public/js/ui.js +1271 -54
- package/dist/web/public/manifest.json +59 -0
- package/dist/web/public/service-worker.js +173 -0
- package/dist/web/public/vendor/monaco/vs/abap-D-t0cyap.js +1 -0
- package/dist/web/public/vendor/monaco/vs/apex-CcIm7xu6.js +1 -0
- package/dist/web/public/vendor/monaco/vs/assets/css.worker-URu8fCFR.js +97 -0
- package/dist/web/public/vendor/monaco/vs/assets/editor.worker-lj3bdIIn.js +30 -0
- package/dist/web/public/vendor/monaco/vs/assets/editorWebWorkerMain-CA_vMoUU.js +30 -0
- package/dist/web/public/vendor/monaco/vs/assets/html.worker-D1SL3iM8.js +474 -0
- package/dist/web/public/vendor/monaco/vs/assets/json.worker-CoJx_OPf.js +62 -0
- package/dist/web/public/vendor/monaco/vs/assets/ts.worker-BWKtMYOk.js +67722 -0
- package/dist/web/public/vendor/monaco/vs/azcli-BA0tQDCg.js +1 -0
- package/dist/web/public/vendor/monaco/vs/basic-languages/monaco.contribution.js +1 -0
- package/dist/web/public/vendor/monaco/vs/bat-C397hTD6.js +1 -0
- package/dist/web/public/vendor/monaco/vs/bicep-DF5aW17k.js +2 -0
- package/dist/web/public/vendor/monaco/vs/cameligo-plsz8qhj.js +1 -0
- package/dist/web/public/vendor/monaco/vs/clojure-Y2auQMzK.js +1 -0
- package/dist/web/public/vendor/monaco/vs/coffee-Bu45yuWE.js +1 -0
- package/dist/web/public/vendor/monaco/vs/cpp-CkKPQIni.js +1 -0
- package/dist/web/public/vendor/monaco/vs/csharp-CX28MZyh.js +1 -0
- package/dist/web/public/vendor/monaco/vs/csp-D8uWnyxW.js +1 -0
- package/dist/web/public/vendor/monaco/vs/css-CaeNmE3S.js +3 -0
- package/dist/web/public/vendor/monaco/vs/css.worker-CyhWkhHo.js +1 -0
- package/dist/web/public/vendor/monaco/vs/cssMode-CV6Ay48H.js +1 -0
- package/dist/web/public/vendor/monaco/vs/cypher-DVThT8BS.js +1 -0
- package/dist/web/public/vendor/monaco/vs/dart-CmGfCvrO.js +1 -0
- package/dist/web/public/vendor/monaco/vs/dockerfile-CZqqYdch.js +1 -0
- package/dist/web/public/vendor/monaco/vs/ecl-30fUercY.js +1 -0
- package/dist/web/public/vendor/monaco/vs/editor/editor.main.css +1 -0
- package/dist/web/public/vendor/monaco/vs/editor/editor.main.js +1 -0
- package/dist/web/public/vendor/monaco/vs/editor/editor.worker.js +1 -0
- package/dist/web/public/vendor/monaco/vs/editor-KLE6jdfb.js +831 -0
- package/dist/web/public/vendor/monaco/vs/editor.js +1 -0
- package/dist/web/public/vendor/monaco/vs/editorWorkerHost-fVE1cjcC.js +35 -0
- package/dist/web/public/vendor/monaco/vs/elixir-xjPaIfzF.js +1 -0
- package/dist/web/public/vendor/monaco/vs/flow9-DqtmStfK.js +1 -0
- package/dist/web/public/vendor/monaco/vs/freemarker2-FWreY7v7.js +3 -0
- package/dist/web/public/vendor/monaco/vs/fsharp-BOMdg4U1.js +1 -0
- package/dist/web/public/vendor/monaco/vs/go-D_hbi-Jt.js +1 -0
- package/dist/web/public/vendor/monaco/vs/graphql-CKUU4kLG.js +1 -0
- package/dist/web/public/vendor/monaco/vs/handlebars-CZi4pHCH.js +1 -0
- package/dist/web/public/vendor/monaco/vs/hcl-DTaboeZW.js +1 -0
- package/dist/web/public/vendor/monaco/vs/html-j_7ZTNRU.js +1 -0
- package/dist/web/public/vendor/monaco/vs/html.worker-CA3iAimZ.js +1 -0
- package/dist/web/public/vendor/monaco/vs/htmlMode-27by_KM4.js +1 -0
- package/dist/web/public/vendor/monaco/vs/index-049xrXrp.js +1 -0
- package/dist/web/public/vendor/monaco/vs/index-CBVt3dzv.js +5 -0
- package/dist/web/public/vendor/monaco/vs/index.js +1 -0
- package/dist/web/public/vendor/monaco/vs/ini-CsNwO04R.js +1 -0
- package/dist/web/public/vendor/monaco/vs/initialize-DL0l1TGY.js +1 -0
- package/dist/web/public/vendor/monaco/vs/java-CI4ZMsH9.js +1 -0
- package/dist/web/public/vendor/monaco/vs/javascript-DTJl4Jn1.js +1 -0
- package/dist/web/public/vendor/monaco/vs/json.worker-BizpAl9O.js +1 -0
- package/dist/web/public/vendor/monaco/vs/jsonMode-DLUiMUrI.js +1 -0
- package/dist/web/public/vendor/monaco/vs/julia-BwzEvaQw.js +1 -0
- package/dist/web/public/vendor/monaco/vs/kotlin-IUYPiTV8.js +1 -0
- package/dist/web/public/vendor/monaco/vs/language/css/css.worker.js +66 -0
- package/dist/web/public/vendor/monaco/vs/language/css/monaco.contribution.js +1 -0
- package/dist/web/public/vendor/monaco/vs/language/html/html.worker.js +443 -0
- package/dist/web/public/vendor/monaco/vs/language/html/monaco.contribution.js +1 -0
- package/dist/web/public/vendor/monaco/vs/language/json/json.worker.js +17 -0
- package/dist/web/public/vendor/monaco/vs/language/json/monaco.contribution.js +1 -0
- package/dist/web/public/vendor/monaco/vs/language/typescript/monaco.contribution.js +1 -0
- package/dist/web/public/vendor/monaco/vs/language/typescript/ts.worker.js +67693 -0
- package/dist/web/public/vendor/monaco/vs/less-C0eDYdqa.js +2 -0
- package/dist/web/public/vendor/monaco/vs/lexon-iON-Kj97.js +1 -0
- package/dist/web/public/vendor/monaco/vs/liquid-CLJYelW6.js +1 -0
- package/dist/web/public/vendor/monaco/vs/loader.js +1368 -0
- package/dist/web/public/vendor/monaco/vs/lspLanguageFeatures-BIkJOWLw.js +2 -0
- package/dist/web/public/vendor/monaco/vs/lua-DtygF91M.js +1 -0
- package/dist/web/public/vendor/monaco/vs/m3-CsR4AuFi.js +1 -0
- package/dist/web/public/vendor/monaco/vs/main-BEx-Fmlo.js +15 -0
- package/dist/web/public/vendor/monaco/vs/main-DsK8pnKg.js +3 -0
- package/dist/web/public/vendor/monaco/vs/markdown-C_rD0bIw.js +1 -0
- package/dist/web/public/vendor/monaco/vs/mdx-CpzZIPHF.js +1 -0
- package/dist/web/public/vendor/monaco/vs/mips-CiYP61RB.js +1 -0
- package/dist/web/public/vendor/monaco/vs/monaco.contribution-9cKT3C7t.js +1 -0
- package/dist/web/public/vendor/monaco/vs/monaco.contribution-BE88ZNGY.js +1 -0
- package/dist/web/public/vendor/monaco/vs/monaco.contribution-BPhsneLd.js +1 -0
- package/dist/web/public/vendor/monaco/vs/monaco.contribution-BgRy6xDf.js +1 -0
- package/dist/web/public/vendor/monaco/vs/msdax-C38-sJlp.js +1 -0
- package/dist/web/public/vendor/monaco/vs/mysql-CdtbpvbG.js +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/cs.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/cs.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/de.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/de.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/es.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/es.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/fr.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/fr.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/it.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/it.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/ja.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/ja.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/ko.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/ko.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/pl.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/pl.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/pt-br.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/ru.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/ru.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/tr.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/tr.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/zh-cn.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.d.ts +1 -0
- package/dist/web/public/vendor/monaco/vs/nls/lang/zh-tw.js +9 -0
- package/dist/web/public/vendor/monaco/vs/nls.messages-loader.js +1 -0
- package/dist/web/public/vendor/monaco/vs/objective-c-CntZFaHX.js +1 -0
- package/dist/web/public/vendor/monaco/vs/pascal-r6kuqfl_.js +1 -0
- package/dist/web/public/vendor/monaco/vs/pascaligo-BiXoTmXh.js +1 -0
- package/dist/web/public/vendor/monaco/vs/perl-DABw_TcH.js +1 -0
- package/dist/web/public/vendor/monaco/vs/pgsql-me_jFXeX.js +1 -0
- package/dist/web/public/vendor/monaco/vs/php-D_kh-9LK.js +1 -0
- package/dist/web/public/vendor/monaco/vs/pla-VfZjczW0.js +1 -0
- package/dist/web/public/vendor/monaco/vs/postiats-BBSzz8Pk.js +1 -0
- package/dist/web/public/vendor/monaco/vs/powerquery-Dt-g_2cc.js +1 -0
- package/dist/web/public/vendor/monaco/vs/powershell-B-7ap1zc.js +1 -0
- package/dist/web/public/vendor/monaco/vs/protobuf-BmtuEB1A.js +2 -0
- package/dist/web/public/vendor/monaco/vs/pug-BRpRNeEb.js +1 -0
- package/dist/web/public/vendor/monaco/vs/python-CqWUUgfu.js +1 -0
- package/dist/web/public/vendor/monaco/vs/qsharp-BzsFaUU9.js +1 -0
- package/dist/web/public/vendor/monaco/vs/r-f8dDdrp4.js +1 -0
- package/dist/web/public/vendor/monaco/vs/razor-hok5y9Km.js +1 -0
- package/dist/web/public/vendor/monaco/vs/redis-fvZQY4PI.js +1 -0
- package/dist/web/public/vendor/monaco/vs/redshift-45Et0LQi.js +1 -0
- package/dist/web/public/vendor/monaco/vs/restructuredtext-C7UUFKFD.js +1 -0
- package/dist/web/public/vendor/monaco/vs/ruby-CZO8zYTz.js +1 -0
- package/dist/web/public/vendor/monaco/vs/rust-Bfetafyc.js +1 -0
- package/dist/web/public/vendor/monaco/vs/sb-3GYllVck.js +1 -0
- package/dist/web/public/vendor/monaco/vs/scala-foMgrKo1.js +1 -0
- package/dist/web/public/vendor/monaco/vs/scheme-CHdMtr7p.js +1 -0
- package/dist/web/public/vendor/monaco/vs/scss-C1cmLt9V.js +3 -0
- package/dist/web/public/vendor/monaco/vs/shell-ClXCKCEW.js +1 -0
- package/dist/web/public/vendor/monaco/vs/solidity-MZ6ExpPy.js +1 -0
- package/dist/web/public/vendor/monaco/vs/sophia-DWkuSsPQ.js +1 -0
- package/dist/web/public/vendor/monaco/vs/sparql-AUGFYSyk.js +1 -0
- package/dist/web/public/vendor/monaco/vs/sql-32GpJSV2.js +1 -0
- package/dist/web/public/vendor/monaco/vs/st-CuDFIVZ_.js +1 -0
- package/dist/web/public/vendor/monaco/vs/swift-t-PfMj7W.js +1 -0
- package/dist/web/public/vendor/monaco/vs/systemverilog-Ch4vA8Yt.js +1 -0
- package/dist/web/public/vendor/monaco/vs/tcl-D74tq1nH.js +1 -0
- package/dist/web/public/vendor/monaco/vs/toggleHighContrast-qGX7E9o7.js +61 -0
- package/dist/web/public/vendor/monaco/vs/ts.worker-2QLmBukE.js +1 -0
- package/dist/web/public/vendor/monaco/vs/tsMode-B0S_kp2q.js +11 -0
- package/dist/web/public/vendor/monaco/vs/twig-C6taOxMV.js +1 -0
- package/dist/web/public/vendor/monaco/vs/typescript-_2t_511t.js +1 -0
- package/dist/web/public/vendor/monaco/vs/typespec-8OfoLt6R.js +1 -0
- package/dist/web/public/vendor/monaco/vs/vb-Dyb2648j.js +1 -0
- package/dist/web/public/vendor/monaco/vs/wgsl-BhLXMOR0.js +298 -0
- package/dist/web/public/vendor/monaco/vs/workers-BBttULjf.js +1 -0
- package/dist/web/public/vendor/monaco/vs/xml-cZjNDqDT.js +1 -0
- package/dist/web/public/vendor/monaco/vs/yaml-A1fOIdH6.js +1 -0
- package/dist/web/server.js +2073 -210
- package/dist/web/server.js.map +1 -1
- package/dist/web/task-queue.js +25 -5
- package/dist/web/task-queue.js.map +1 -1
- package/docs/BENCHMARK_REPORT_en.md +329 -0
- package/docs/BENCHMARK_REPORT_zh.md +329 -0
- package/docs/DEPLOYMENT.md +382 -0
- package/docs/MODEL_FINETUNING.md +405 -0
- package/docs/TECHNICAL_SPEC_en.md +292 -0
- package/docs/TECHNICAL_SPEC_zh.md +292 -0
- package/docs/UPDATE_NOTES_en.md +159 -0
- package/docs/UPDATE_NOTES_zh.md +159 -0
- package/electron/main.js +602 -0
- package/package.json +67 -3
- package/tool-schema.json +1 -1
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PluginManager = void 0;
|
|
4
|
+
exports.createPluginManager = createPluginManager;
|
|
5
|
+
/**
|
|
6
|
+
* 飞虹 Code - 插件市场 (阶段四-3)
|
|
7
|
+
*
|
|
8
|
+
* 支持轻应用/插件扩展:
|
|
9
|
+
* - 插件管理:安装、卸载、启用、禁用
|
|
10
|
+
* - 插件市场:浏览、搜索、安装插件
|
|
11
|
+
* - 插件 API:提供插件可调用的 API
|
|
12
|
+
* - 插件沙箱:安全隔离插件执行环境
|
|
13
|
+
*/
|
|
14
|
+
const logger_1 = require("../shared/logger");
|
|
15
|
+
const fs_1 = require("fs");
|
|
16
|
+
const path_1 = require("path");
|
|
17
|
+
/**
|
|
18
|
+
* 插件管理器
|
|
19
|
+
*/
|
|
20
|
+
class PluginManager {
|
|
21
|
+
baseDir;
|
|
22
|
+
pluginsDir;
|
|
23
|
+
installed = new Map();
|
|
24
|
+
registryPath;
|
|
25
|
+
commands = new Map();
|
|
26
|
+
constructor(baseDir) {
|
|
27
|
+
this.baseDir = baseDir;
|
|
28
|
+
this.pluginsDir = (0, path_1.join)(baseDir, 'plugins');
|
|
29
|
+
this.registryPath = (0, path_1.join)(baseDir, 'plugin-registry.json');
|
|
30
|
+
this.ensureDir();
|
|
31
|
+
this.loadRegistry();
|
|
32
|
+
logger_1.logger.info('plugin manager initialized', { baseDir, installed: this.installed.size });
|
|
33
|
+
}
|
|
34
|
+
ensureDir() {
|
|
35
|
+
if (!(0, fs_1.existsSync)(this.baseDir))
|
|
36
|
+
(0, fs_1.mkdirSync)(this.baseDir, { recursive: true });
|
|
37
|
+
if (!(0, fs_1.existsSync)(this.pluginsDir))
|
|
38
|
+
(0, fs_1.mkdirSync)(this.pluginsDir, { recursive: true });
|
|
39
|
+
}
|
|
40
|
+
loadRegistry() {
|
|
41
|
+
try {
|
|
42
|
+
if ((0, fs_1.existsSync)(this.registryPath)) {
|
|
43
|
+
const data = JSON.parse((0, fs_1.readFileSync)(this.registryPath, 'utf-8'));
|
|
44
|
+
for (const plugin of data.installed || []) {
|
|
45
|
+
this.installed.set(plugin.id, plugin);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger_1.logger.error('load plugin registry error', { error: String(error) });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
saveRegistry() {
|
|
54
|
+
try {
|
|
55
|
+
const data = {
|
|
56
|
+
installed: Array.from(this.installed.values()),
|
|
57
|
+
updatedAt: new Date().toISOString(),
|
|
58
|
+
};
|
|
59
|
+
(0, fs_1.writeFileSync)(this.registryPath, JSON.stringify(data, null, 2), 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger_1.logger.error('save plugin registry error', { error: String(error) });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 安装插件
|
|
67
|
+
*/
|
|
68
|
+
async installPlugin(plugin) {
|
|
69
|
+
logger_1.logger.info('installing plugin', { id: plugin.id, version: plugin.version });
|
|
70
|
+
const pluginDir = (0, path_1.join)(this.pluginsDir, plugin.id);
|
|
71
|
+
if (!(0, fs_1.existsSync)(pluginDir))
|
|
72
|
+
(0, fs_1.mkdirSync)(pluginDir, { recursive: true });
|
|
73
|
+
// 保存插件元数据
|
|
74
|
+
const metadataPath = (0, path_1.join)(pluginDir, 'package.json');
|
|
75
|
+
(0, fs_1.writeFileSync)(metadataPath, JSON.stringify(plugin, null, 2), 'utf-8');
|
|
76
|
+
// 创建入口文件(简化版)
|
|
77
|
+
const entryPath = (0, path_1.join)(pluginDir, plugin.entry || 'index.js');
|
|
78
|
+
if (!(0, fs_1.existsSync)(entryPath)) {
|
|
79
|
+
(0, fs_1.writeFileSync)(entryPath, `// ${plugin.name} v${plugin.version}\n// 插件入口文件\nmodule.exports = { activate(api) { console.log('${plugin.name} activated'); } };\n`, 'utf-8');
|
|
80
|
+
}
|
|
81
|
+
const installed = {
|
|
82
|
+
...plugin,
|
|
83
|
+
status: 'installed',
|
|
84
|
+
installedAt: new Date().toISOString(),
|
|
85
|
+
updatedAt: new Date().toISOString(),
|
|
86
|
+
config: {},
|
|
87
|
+
};
|
|
88
|
+
this.installed.set(plugin.id, installed);
|
|
89
|
+
this.saveRegistry();
|
|
90
|
+
logger_1.logger.info('plugin installed', { id: plugin.id });
|
|
91
|
+
return installed;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 卸载插件
|
|
95
|
+
*/
|
|
96
|
+
uninstallPlugin(id) {
|
|
97
|
+
const plugin = this.installed.get(id);
|
|
98
|
+
if (!plugin)
|
|
99
|
+
return false;
|
|
100
|
+
try {
|
|
101
|
+
const pluginDir = (0, path_1.join)(this.pluginsDir, id);
|
|
102
|
+
if ((0, fs_1.existsSync)(pluginDir)) {
|
|
103
|
+
// 递归删除目录
|
|
104
|
+
const files = (0, fs_1.readdirSync)(pluginDir);
|
|
105
|
+
for (const file of files) {
|
|
106
|
+
(0, fs_1.unlinkSync)((0, path_1.join)(pluginDir, file));
|
|
107
|
+
}
|
|
108
|
+
const { rmdirSync } = require('fs');
|
|
109
|
+
rmdirSync(pluginDir);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
logger_1.logger.error('uninstall plugin error', { id, error: String(error) });
|
|
114
|
+
}
|
|
115
|
+
this.installed.delete(id);
|
|
116
|
+
this.saveRegistry();
|
|
117
|
+
logger_1.logger.info('plugin uninstalled', { id });
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 启用插件
|
|
122
|
+
*/
|
|
123
|
+
enablePlugin(id) {
|
|
124
|
+
const plugin = this.installed.get(id);
|
|
125
|
+
if (!plugin)
|
|
126
|
+
return false;
|
|
127
|
+
plugin.status = 'enabled';
|
|
128
|
+
plugin.updatedAt = new Date().toISOString();
|
|
129
|
+
this.saveRegistry();
|
|
130
|
+
this.activatePlugin(plugin);
|
|
131
|
+
logger_1.logger.info('plugin enabled', { id });
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 禁用插件
|
|
136
|
+
*/
|
|
137
|
+
disablePlugin(id) {
|
|
138
|
+
const plugin = this.installed.get(id);
|
|
139
|
+
if (!plugin)
|
|
140
|
+
return false;
|
|
141
|
+
plugin.status = 'disabled';
|
|
142
|
+
plugin.updatedAt = new Date().toISOString();
|
|
143
|
+
this.saveRegistry();
|
|
144
|
+
logger_1.logger.info('plugin disabled', { id });
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 激活插件
|
|
149
|
+
*/
|
|
150
|
+
activatePlugin(plugin) {
|
|
151
|
+
try {
|
|
152
|
+
const pluginDir = (0, path_1.join)(this.pluginsDir, plugin.id);
|
|
153
|
+
const entryPath = (0, path_1.join)(pluginDir, plugin.entry || 'index.js');
|
|
154
|
+
if ((0, fs_1.existsSync)(entryPath)) {
|
|
155
|
+
// 简化版:不实际执行,只记录
|
|
156
|
+
logger_1.logger.info('plugin activated', { id: plugin.id });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
plugin.status = 'error';
|
|
161
|
+
plugin.error = String(error);
|
|
162
|
+
this.saveRegistry();
|
|
163
|
+
logger_1.logger.error('plugin activation error', { id: plugin.id, error: String(error) });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 获取已安装插件
|
|
168
|
+
*/
|
|
169
|
+
getInstalledPlugins(status) {
|
|
170
|
+
let plugins = Array.from(this.installed.values());
|
|
171
|
+
if (status)
|
|
172
|
+
plugins = plugins.filter((p) => p.status === status);
|
|
173
|
+
return plugins;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 获取插件
|
|
177
|
+
*/
|
|
178
|
+
getPlugin(id) {
|
|
179
|
+
return this.installed.get(id);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* 更新插件配置
|
|
183
|
+
*/
|
|
184
|
+
updatePluginConfig(id, config) {
|
|
185
|
+
const plugin = this.installed.get(id);
|
|
186
|
+
if (!plugin)
|
|
187
|
+
return false;
|
|
188
|
+
plugin.config = { ...plugin.config, ...config };
|
|
189
|
+
plugin.updatedAt = new Date().toISOString();
|
|
190
|
+
this.saveRegistry();
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 注册命令
|
|
195
|
+
*/
|
|
196
|
+
registerCommand(id, handler) {
|
|
197
|
+
this.commands.set(id, handler);
|
|
198
|
+
logger_1.logger.info('command registered', { id });
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* 执行命令
|
|
202
|
+
*/
|
|
203
|
+
async executeCommand(id, ...args) {
|
|
204
|
+
const handler = this.commands.get(id);
|
|
205
|
+
if (!handler)
|
|
206
|
+
throw new Error(`Command not found: ${id}`);
|
|
207
|
+
return handler(...args);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* 获取所有注册的命令
|
|
211
|
+
*/
|
|
212
|
+
getCommands() {
|
|
213
|
+
return Array.from(this.commands.keys());
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* 搜索市场插件(模拟)
|
|
217
|
+
*/
|
|
218
|
+
searchMarketPlugins(query, category) {
|
|
219
|
+
// 模拟市场插件列表
|
|
220
|
+
const mockPlugins = [
|
|
221
|
+
{
|
|
222
|
+
id: 'feihong-git-enhanced',
|
|
223
|
+
name: 'Git Enhanced',
|
|
224
|
+
version: '1.2.0',
|
|
225
|
+
description: '增强的 Git 集成,支持可视化 diff、 blame、分支管理',
|
|
226
|
+
author: 'feihong',
|
|
227
|
+
keywords: ['git', 'version-control', 'diff'],
|
|
228
|
+
categories: ['version-control'],
|
|
229
|
+
entry: 'index.js',
|
|
230
|
+
permissions: ['workspace', 'git'],
|
|
231
|
+
dependencies: [],
|
|
232
|
+
publisher: '飞虹官方',
|
|
233
|
+
verified: true,
|
|
234
|
+
featured: true,
|
|
235
|
+
latestVersion: '1.2.0',
|
|
236
|
+
downloads: 12500,
|
|
237
|
+
rating: 4.8,
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
id: 'feihong-theme-dark-plus',
|
|
241
|
+
name: 'Dark+ Theme',
|
|
242
|
+
version: '2.0.1',
|
|
243
|
+
description: '飞虹 Code 官方深色主题,护眼配色',
|
|
244
|
+
author: 'feihong',
|
|
245
|
+
keywords: ['theme', 'dark', 'ui'],
|
|
246
|
+
categories: ['themes'],
|
|
247
|
+
entry: 'index.js',
|
|
248
|
+
permissions: ['ui'],
|
|
249
|
+
dependencies: [],
|
|
250
|
+
publisher: '飞虹官方',
|
|
251
|
+
verified: true,
|
|
252
|
+
featured: true,
|
|
253
|
+
latestVersion: '2.0.1',
|
|
254
|
+
downloads: 28000,
|
|
255
|
+
rating: 4.9,
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
id: 'community-python-helper',
|
|
259
|
+
name: 'Python Helper',
|
|
260
|
+
version: '0.9.3',
|
|
261
|
+
description: 'Python 开发辅助,支持虚拟环境管理、依赖分析、代码格式化',
|
|
262
|
+
author: 'community',
|
|
263
|
+
keywords: ['python', 'venv', 'pip', 'format'],
|
|
264
|
+
categories: ['programming-languages'],
|
|
265
|
+
entry: 'index.js',
|
|
266
|
+
permissions: ['workspace', 'terminal'],
|
|
267
|
+
dependencies: [],
|
|
268
|
+
publisher: '社区贡献者',
|
|
269
|
+
verified: false,
|
|
270
|
+
featured: false,
|
|
271
|
+
latestVersion: '0.9.3',
|
|
272
|
+
downloads: 5600,
|
|
273
|
+
rating: 4.5,
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
id: 'feihong-docker-helper',
|
|
277
|
+
name: 'Docker Helper',
|
|
278
|
+
version: '1.0.0',
|
|
279
|
+
description: 'Docker 容器管理,支持镜像构建、容器运行、日志查看',
|
|
280
|
+
author: 'feihong',
|
|
281
|
+
keywords: ['docker', 'container', 'devops'],
|
|
282
|
+
categories: ['devops'],
|
|
283
|
+
entry: 'index.js',
|
|
284
|
+
permissions: ['terminal', 'workspace'],
|
|
285
|
+
dependencies: [],
|
|
286
|
+
publisher: '飞虹官方',
|
|
287
|
+
verified: true,
|
|
288
|
+
featured: false,
|
|
289
|
+
latestVersion: '1.0.0',
|
|
290
|
+
downloads: 8900,
|
|
291
|
+
rating: 4.6,
|
|
292
|
+
},
|
|
293
|
+
];
|
|
294
|
+
let results = mockPlugins;
|
|
295
|
+
if (query) {
|
|
296
|
+
const q = query.toLowerCase();
|
|
297
|
+
results = results.filter((p) => p.name.toLowerCase().includes(q) ||
|
|
298
|
+
p.description.toLowerCase().includes(q) ||
|
|
299
|
+
p.keywords.some((k) => k.toLowerCase().includes(q)));
|
|
300
|
+
}
|
|
301
|
+
if (category) {
|
|
302
|
+
results = results.filter((p) => p.categories.includes(category));
|
|
303
|
+
}
|
|
304
|
+
return results;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* 获取插件分类
|
|
308
|
+
*/
|
|
309
|
+
getCategories() {
|
|
310
|
+
return ['all', 'programming-languages', 'themes', 'version-control', 'devops', 'ui', 'productivity', 'other'];
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* 获取统计信息
|
|
314
|
+
*/
|
|
315
|
+
getStats() {
|
|
316
|
+
const plugins = Array.from(this.installed.values());
|
|
317
|
+
return {
|
|
318
|
+
total: plugins.length,
|
|
319
|
+
enabled: plugins.filter((p) => p.status === 'enabled').length,
|
|
320
|
+
disabled: plugins.filter((p) => p.status === 'disabled').length,
|
|
321
|
+
errors: plugins.filter((p) => p.status === 'error').length,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
exports.PluginManager = PluginManager;
|
|
326
|
+
/**
|
|
327
|
+
* 便捷函数:创建插件管理器
|
|
328
|
+
*/
|
|
329
|
+
function createPluginManager(baseDir) {
|
|
330
|
+
return new PluginManager(baseDir);
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/plugins/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../src/runtime/event-log.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,0CAAgD;AAChD,+BAA+B;AAC/B,2BAA6B;AAE7B,6CAA0C;
|
|
1
|
+
{"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../src/runtime/event-log.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,0CAAgD;AAChD,+BAA+B;AAC/B,2BAA6B;AAE7B,6CAA0C;AAyB1C,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAA,YAAO,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAa,QAAQ;IACF,KAAK,CAAQ;IACb,IAAI,CAAS;IAE9B,YAAY,KAAY,EAAE,MAAc;QACtC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAe,EAAE,OAAgC;QAC5D,MAAM,EAAE,GAAe,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;QAC7F,IAAI,CAAC;YACH,MAAM,IAAA,gBAAK,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,eAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACrC,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AAxBD,4BAwBC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.browserTools = exports.browserCloseTool = exports.browserEvaluateTool = exports.browserScreenshotTool = exports.browserExtractTool = exports.browserPressTool = exports.browserTypeTool = exports.browserClickTool = exports.browserNavigateTool = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 飞虹 Code - 浏览器自动化工具 (P1-3)
|
|
6
|
+
* 基于 Playwright,为 Agent 提供真实浏览器操作能力
|
|
7
|
+
*
|
|
8
|
+
* 工具列表:
|
|
9
|
+
* - browser_navigate 导航到 URL(自动检测搜索关键词)
|
|
10
|
+
* - browser_click 点击 CSS 选择器匹配的元素
|
|
11
|
+
* - browser_type 在输入框中输入文本
|
|
12
|
+
* - browser_press 按下键盘按键
|
|
13
|
+
* - browser_extract 提取页面文本内容
|
|
14
|
+
* - browser_screenshot 截图(返回 base64)
|
|
15
|
+
* - browser_evaluate 执行 JavaScript
|
|
16
|
+
* - browser_close 关闭页面
|
|
17
|
+
*/
|
|
18
|
+
const zod_1 = require("zod");
|
|
19
|
+
const browser_agent_1 = require("../../agent/browser-agent");
|
|
20
|
+
const logger_1 = require("../../shared/logger");
|
|
21
|
+
exports.browserNavigateTool = {
|
|
22
|
+
name: 'browser_navigate',
|
|
23
|
+
description: '在浏览器中导航到指定 URL。如果输入的是搜索关键词(含空格或无域名),自动用 Bing 搜索。返回页面标题和 pageId。',
|
|
24
|
+
jsonSchema: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
url: { type: 'string', description: '目标 URL 或搜索关键词' },
|
|
28
|
+
pageId: { type: 'string', description: '可选,复用已有页面 ID;不填则新建页面' },
|
|
29
|
+
},
|
|
30
|
+
required: ['url'],
|
|
31
|
+
},
|
|
32
|
+
schema: zod_1.z.object({ url: zod_1.z.string().min(1), pageId: zod_1.z.string().optional() }),
|
|
33
|
+
async execute(args, _ctx) {
|
|
34
|
+
const { url, pageId } = args;
|
|
35
|
+
try {
|
|
36
|
+
const manager = (0, browser_agent_1.getBrowserManager)();
|
|
37
|
+
const result = await manager.navigate(url, pageId);
|
|
38
|
+
if (result.success) {
|
|
39
|
+
return {
|
|
40
|
+
ok: true,
|
|
41
|
+
output: `[浏览器] 已导航到 ${result.url}\n标题: ${result.title || '(无)'}\npageId: ${result.pageId}\n\n后续操作请使用此 pageId。`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return { ok: false, output: '', error: result.message };
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
return { ok: false, output: '', error: `browser_navigate 失败: ${e instanceof Error ? e.message : String(e)}` };
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
exports.browserClickTool = {
|
|
52
|
+
name: 'browser_click',
|
|
53
|
+
description: '点击页面中匹配 CSS 选择器的元素。需要先调用 browser_navigate 获取 pageId。',
|
|
54
|
+
jsonSchema: {
|
|
55
|
+
type: 'object',
|
|
56
|
+
properties: {
|
|
57
|
+
selector: { type: 'string', description: 'CSS 选择器,如 button.submit、a.login、#search-button' },
|
|
58
|
+
pageId: { type: 'string', description: '页面 ID(从 browser_navigate 返回)' },
|
|
59
|
+
},
|
|
60
|
+
required: ['selector', 'pageId'],
|
|
61
|
+
},
|
|
62
|
+
schema: zod_1.z.object({ selector: zod_1.z.string().min(1), pageId: zod_1.z.string().min(1) }),
|
|
63
|
+
async execute(args) {
|
|
64
|
+
const { selector, pageId } = args;
|
|
65
|
+
const manager = (0, browser_agent_1.getBrowserManager)();
|
|
66
|
+
const result = await manager.click(selector, pageId);
|
|
67
|
+
return result.success
|
|
68
|
+
? { ok: true, output: `[浏览器] ${result.message}` }
|
|
69
|
+
: { ok: false, output: '', error: result.message };
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
exports.browserTypeTool = {
|
|
73
|
+
name: 'browser_type',
|
|
74
|
+
description: '在页面输入框中输入文本(先清空再输入)。需要先调用 browser_navigate。',
|
|
75
|
+
jsonSchema: {
|
|
76
|
+
type: 'object',
|
|
77
|
+
properties: {
|
|
78
|
+
selector: { type: 'string', description: '输入框的 CSS 选择器,如 input[name=q]、textarea#comment' },
|
|
79
|
+
text: { type: 'string', description: '要输入的文本' },
|
|
80
|
+
pageId: { type: 'string', description: '页面 ID' },
|
|
81
|
+
},
|
|
82
|
+
required: ['selector', 'text', 'pageId'],
|
|
83
|
+
},
|
|
84
|
+
schema: zod_1.z.object({ selector: zod_1.z.string().min(1), text: zod_1.z.string(), pageId: zod_1.z.string().min(1) }),
|
|
85
|
+
async execute(args) {
|
|
86
|
+
const { selector, text, pageId } = args;
|
|
87
|
+
const manager = (0, browser_agent_1.getBrowserManager)();
|
|
88
|
+
const result = await manager.type(selector, text, pageId);
|
|
89
|
+
return result.success
|
|
90
|
+
? { ok: true, output: `[浏览器] ${result.message}` }
|
|
91
|
+
: { ok: false, output: '', error: result.message };
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
exports.browserPressTool = {
|
|
95
|
+
name: 'browser_press',
|
|
96
|
+
description: '按下键盘按键,如 Enter、Escape、ArrowDown、Control+a。',
|
|
97
|
+
jsonSchema: {
|
|
98
|
+
type: 'object',
|
|
99
|
+
properties: {
|
|
100
|
+
key: { type: 'string', description: '按键名称,如 Enter、Escape、Tab、ArrowDown、Control+c' },
|
|
101
|
+
pageId: { type: 'string', description: '页面 ID' },
|
|
102
|
+
},
|
|
103
|
+
required: ['key', 'pageId'],
|
|
104
|
+
},
|
|
105
|
+
schema: zod_1.z.object({ key: zod_1.z.string().min(1), pageId: zod_1.z.string().min(1) }),
|
|
106
|
+
async execute(args) {
|
|
107
|
+
const { key, pageId } = args;
|
|
108
|
+
const manager = (0, browser_agent_1.getBrowserManager)();
|
|
109
|
+
const result = await manager.press(key, pageId);
|
|
110
|
+
return result.success
|
|
111
|
+
? { ok: true, output: `[浏览器] ${result.message}` }
|
|
112
|
+
: { ok: false, output: '', error: result.message };
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
exports.browserExtractTool = {
|
|
116
|
+
name: 'browser_extract',
|
|
117
|
+
description: '提取页面文本内容。不指定 selector 时提取整个 body 文本(最多 10000 字符)。',
|
|
118
|
+
jsonSchema: {
|
|
119
|
+
type: 'object',
|
|
120
|
+
properties: {
|
|
121
|
+
selector: { type: 'string', description: '可选,只提取指定元素的文本,如 div.article、#content' },
|
|
122
|
+
pageId: { type: 'string', description: '页面 ID' },
|
|
123
|
+
},
|
|
124
|
+
required: ['pageId'],
|
|
125
|
+
},
|
|
126
|
+
schema: zod_1.z.object({ selector: zod_1.z.string().optional(), pageId: zod_1.z.string().min(1) }),
|
|
127
|
+
async execute(args) {
|
|
128
|
+
const { selector, pageId } = args;
|
|
129
|
+
const manager = (0, browser_agent_1.getBrowserManager)();
|
|
130
|
+
const result = await manager.extractText(pageId, selector);
|
|
131
|
+
if (result.success) {
|
|
132
|
+
return { ok: true, output: `[浏览器] 页面文本:\n${result.text}` };
|
|
133
|
+
}
|
|
134
|
+
return { ok: false, output: '', error: result.message || '提取失败' };
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
exports.browserScreenshotTool = {
|
|
138
|
+
name: 'browser_screenshot',
|
|
139
|
+
description: '对当前页面截图,返回 base64 编码的 PNG 图片(可用于多模态分析)。',
|
|
140
|
+
jsonSchema: {
|
|
141
|
+
type: 'object',
|
|
142
|
+
properties: {
|
|
143
|
+
pageId: { type: 'string', description: '页面 ID' },
|
|
144
|
+
fullPage: { type: 'boolean', description: '是否截取整页(默认 false,只截视口)' },
|
|
145
|
+
},
|
|
146
|
+
required: ['pageId'],
|
|
147
|
+
},
|
|
148
|
+
schema: zod_1.z.object({ pageId: zod_1.z.string().min(1), fullPage: zod_1.z.boolean().optional() }),
|
|
149
|
+
async execute(args) {
|
|
150
|
+
const { pageId, fullPage } = args;
|
|
151
|
+
const manager = (0, browser_agent_1.getBrowserManager)();
|
|
152
|
+
const result = await manager.screenshot(pageId, { fullPage });
|
|
153
|
+
if (result.success && result.base64) {
|
|
154
|
+
return {
|
|
155
|
+
ok: true,
|
|
156
|
+
output: `[浏览器] 截图成功 (${Math.round(result.base64.length / 1024)} KB)\n保存路径: ${result.path}\nBase64 前缀: ${result.base64.slice(0, 50)}...`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return { ok: false, output: '', error: result.message || '截图失败' };
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
exports.browserEvaluateTool = {
|
|
163
|
+
name: 'browser_evaluate',
|
|
164
|
+
description: '在页面上下文中执行 JavaScript 代码,返回执行结果。可用于提取数据、操作 DOM、调试。',
|
|
165
|
+
jsonSchema: {
|
|
166
|
+
type: 'object',
|
|
167
|
+
properties: {
|
|
168
|
+
script: { type: 'string', description: '要执行的 JavaScript 代码,如 document.title、JSON.stringify({url: location.href})' },
|
|
169
|
+
pageId: { type: 'string', description: '页面 ID' },
|
|
170
|
+
},
|
|
171
|
+
required: ['script', 'pageId'],
|
|
172
|
+
},
|
|
173
|
+
schema: zod_1.z.object({ script: zod_1.z.string().min(1), pageId: zod_1.z.string().min(1) }),
|
|
174
|
+
async execute(args) {
|
|
175
|
+
const { script, pageId } = args;
|
|
176
|
+
const manager = (0, browser_agent_1.getBrowserManager)();
|
|
177
|
+
const result = await manager.evaluate(pageId, script);
|
|
178
|
+
if (result.success) {
|
|
179
|
+
const output = typeof result.result === 'string' ? result.result : JSON.stringify(result.result, null, 2);
|
|
180
|
+
return { ok: true, output: `[浏览器] JS 执行结果:\n${output || '(无返回值)'}` };
|
|
181
|
+
}
|
|
182
|
+
return { ok: false, output: '', error: result.message || '执行失败' };
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
exports.browserCloseTool = {
|
|
186
|
+
name: 'browser_close',
|
|
187
|
+
description: '关闭指定浏览器页面,释放资源。任务完成后应调用此工具。',
|
|
188
|
+
jsonSchema: {
|
|
189
|
+
type: 'object',
|
|
190
|
+
properties: {
|
|
191
|
+
pageId: { type: 'string', description: '页面 ID' },
|
|
192
|
+
},
|
|
193
|
+
required: ['pageId'],
|
|
194
|
+
},
|
|
195
|
+
schema: zod_1.z.object({ pageId: zod_1.z.string().min(1) }),
|
|
196
|
+
async execute(args) {
|
|
197
|
+
const { pageId } = args;
|
|
198
|
+
const manager = (0, browser_agent_1.getBrowserManager)();
|
|
199
|
+
const result = await manager.closePage(pageId);
|
|
200
|
+
return result.success
|
|
201
|
+
? { ok: true, output: `[浏览器] ${result.message}` }
|
|
202
|
+
: { ok: false, output: '', error: result.message };
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
/** 所有浏览器工具 */
|
|
206
|
+
exports.browserTools = [
|
|
207
|
+
exports.browserNavigateTool,
|
|
208
|
+
exports.browserClickTool,
|
|
209
|
+
exports.browserTypeTool,
|
|
210
|
+
exports.browserPressTool,
|
|
211
|
+
exports.browserExtractTool,
|
|
212
|
+
exports.browserScreenshotTool,
|
|
213
|
+
exports.browserEvaluateTool,
|
|
214
|
+
exports.browserCloseTool,
|
|
215
|
+
];
|
|
216
|
+
logger_1.logger.info('browser tools loaded', { count: exports.browserTools.length });
|
|
217
|
+
//# sourceMappingURL=browser.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.tool.js","sourceRoot":"","sources":["../../../src/tools/browser/browser.tool.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.js
CHANGED
|
@@ -33,6 +33,7 @@ const test_run_tool_1 = require("./verify/test-run.tool");
|
|
|
33
33
|
const build_check_tool_1 = require("./verify/build-check.tool");
|
|
34
34
|
const load_skill_tool_1 = require("./skills/load-skill.tool");
|
|
35
35
|
const web_tool_1 = require("./web/web.tool");
|
|
36
|
+
const browser_tool_1 = require("./browser/browser.tool");
|
|
36
37
|
function createDefaultRegistry() {
|
|
37
38
|
const reg = new tool_registry_1.ToolRegistry();
|
|
38
39
|
for (const t of [
|
|
@@ -47,6 +48,7 @@ function createDefaultRegistry() {
|
|
|
47
48
|
load_skill_tool_1.loadSkillTool,
|
|
48
49
|
web_tool_1.webFetchTool,
|
|
49
50
|
web_tool_1.webSearchTool,
|
|
51
|
+
...browser_tool_1.browserTools,
|
|
50
52
|
]) {
|
|
51
53
|
reg.register(t);
|
|
52
54
|
}
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAmBA,sDAmBC;AAtCD;;;;;GAKG;AACH,mDAA+C;AAC/C,gDAAgD;AAChD,kDAAkD;AAClD,gDAAgD;AAChD,gDAA+C;AAC/C,kDAA8C;AAC9C,2DAAsD;AACtD,0DAAsD;AACtD,gEAA2D;AAC3D,8DAAyD;AACzD,6CAA6D;AAC7D,yDAAsD;AAEtD,SAAgB,qBAAqB;IACnC,MAAM,GAAG,GAAG,IAAI,4BAAY,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI;QACd,wBAAY;QACZ,0BAAa;QACb,wBAAY;QACZ,uBAAW;QACX,oBAAQ;QACR,6BAAY;QACZ,4BAAY;QACZ,iCAAc;QACd,+BAAa;QACb,uBAAY;QACZ,wBAAa;QACb,GAAG,2BAAY;KAChB,EAAE,CAAC;QACF,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,mDAAiC"}
|