开发者模式
OTools 提供内置开发者中心,覆盖从创建插件到发布版本的完整流程。
1. 创建与绑定
- 在开发者中心创建插件,填写 Pack ID、名称、摘要等基础信息。
- 绑定插件开发目录,OTools 会读取
plugin.json并管理运行时信息。 - 启用调试后,插件会出现在首页 Tabs,可直接打开。
2. devUrl 调试
devUrl支持http/https,适配 Vite、Webpack 等开发服务器。- 也支持
index.html形式的本地路径,适合纯静态或非框架插件。
3. Web SDK 与权限
插件 WebView 默认注入 Node 风格兼容层,可在 preload.js 或业务代码中直接调用:
const runtime = require("@otools/runtime");
const fs = require("node:fs");
const path = require("node:path");
const { execSync } = require("node:child_process");需要高权限能力时,在根目录 plugin.json 显式声明:
{
"permissions": ["fs", "dialog", "shell", "child_process"]
}说明:
fs:开放node:fs、node:fs/promises、@otools/fsdialog:开放@otools/dialogshell:开放@otools/shellchild_process:开放node:child_process、@otools/child_process- 未声明时默认拒绝上述高风险能力;
path、os、process、http/https默认可用 - 内置工具页与非插件页面不受该声明限制
4. Web/Vue 工程初始化
开发者工具内可一键生成 Vue + Vite 工程骨架:
package.json、vite.config.ts、tsconfig.jsonsrc/main.ts/src/App.vue- 绑定目录直接作为工程根目录
5. Native 原生能力
OTools 支持插件携带 Rust 动态库能力,提升性能上限。
- 初始化原生工程:在绑定目录下生成
native/Rust 工程。 - 构建原生库:生成
lib/目录下的动态库文件。 - 独立构建:可在其他系统环境中单独构建对应平台的动态库。
仓库目录:native 与 tauri(可选)
主仓库中部分插件采用 plugins/<name>/native(业务与 otools_plugin_invoke 协议)+ plugins/<name>/tauri(仅用于内置进 OTools 桌面端时注册 #[tauri::command])。
插件市场上架包仍以 plugin.json + 前端资源 + lib/ 动态库 为准,不需要、也不应打包 tauri 子工程:市场安装后走动态库 FFI;内置集成由主程序 Cargo 依赖 *-tauri crate 完成。
推送事件(poll_events)
若第三方希望在仅动态库场景下使用类似「监听」的能力,可在 native 中实现 poll_events,由宿主轮询并在前端通过 window.otools.listenNative 接收(详见《OTools API》中 Native 事件监听一节)。轮询间隔可由前端 listenNative 的 intervalMs 传入(宿主限制约 50~10000 ms)。
- Web 层优先仍可用 Tauri
listen订阅主程序emit的频道;动态库侧通过poll_events把待推送事项交给宿主统一emit。
plugin.json 中配置:
{
"native": {
"enabled": true,
"libDir": "lib",
"autoReload": true,
"libName": "macOS.dylib"
}
}默认库名:
- macOS:
macOS.dylib - Windows:
Windows.dll - Linux:
Linux.so
主程序统一 AI 接口
如果插件只需要在 Web 层调用 AI,直接使用 window.otools.aiGenerateText(...) 即可,主程序会自动复用全局 AI 配置。
const result = await window.otools.aiGenerateText({
systemPrompt: '你是一个插件文档助手。',
userPrompt: '请为当前插件生成一段更新说明。',
});Native 插件回调主程序
现在 native 动态库也可以回调 OTools 主程序的统一 AI 接口。宿主在加载动态库时,会尝试调用可选导出函数:
otools_plugin_bind_host(host_api_ptr)
host_api_ptr 指向一个 version=1 的宿主 API 结构体,内含两个函数指针:
invoke(input_ptr, input_len, output_len) -> *mut u8free(ptr, len)
native 插件可保存这两个函数指针,然后按 JSON 协议回调宿主:
{
"method": "ai.generateText",
"payload": {
"systemPrompt": "你是原生插件开发助手。",
"userPrompt": "请总结这段日志。",
"model": "qwen2.5-coder:14b"
}
}返回 JSON:
{
"ok": true,
"data": {
"text": "......",
"provider": "ollama",
"model": "qwen2.5-coder:14b"
}
}建议:
- Web 插件优先用
window.otools.aiGenerateText。 - native 动态库仅在必须由 Rust 侧直接发起 AI 调用时,再使用宿主回调接口。
payload中的provider/baseUrl/apiKey/model都可选;省略时自动继承主程序全局 AI 配置。
6. 打包与发布
- 打包时要求插件根目录存在
logo.png与plugin.json。 - 打包成功后会生成插件包,并写入本地市场记录。
- 发布版本需提供下载地址(仅支持
http/https)。
7. 推荐流程
- 创建插件并绑定目录
- 初始化 Web/Vue 工程或纯 HTML
- 配置
devUrl并开启调试 - 需要性能时添加
native能力 - 打包与发布到插件市场