feat: 动态插件系统 M0-M3(两层能力模型 + pi 原生契约 + Obsidian 式 SDK)

This commit is contained in:
Rick Ye
2026-09-10 02:15:55 +08:00
parent 2b69a9aa13
commit 367f3f5c5b
37 changed files with 2009 additions and 5773 deletions
@@ -0,0 +1,46 @@
/**
* 浏览器插件(内置,组件级:UI 仍由宿主树 BrowserPanel 承载,面板 tab 见 App.tsx)。
* 主进程侧:browserTools 经 pi.registerTool 注册(原生路径,提示词注入/审批拦截
* 与 pi 生态一致),并示范内联 UI——受管浏览器打开时推状态胶囊。
*/
import { getBrowserController } from '../../browser/browser-controller'
import { browserTools } from '../../tools/browser-tools'
import type { BuiltinPlugin } from './index'
export const browserPlugin: BuiltinPlugin = {
manifest: {
id: 'browser',
name: '浏览器',
version: '0.1.0',
minContract: '0.1.0',
panel: true,
order: 10,
description: '受管浏览器(CDP 驱动,Agent 可操作,右侧面板查看)'
},
main: (api) => {
for (const tool of browserTools) {
api.pi.registerTool(tool)
}
const pushStatus = (): void => {
const state = getBrowserController().getState()
if (!state.open || state.tabs.length === 0) {
api.ui.removeStatusItem('tabs')
return
}
const active = state.tabs.find((t) => t.tabId === state.activeTabId)
const title = active?.title?.trim()
api.ui.setStatusItem('tabs', {
text: `浏览器 ${state.tabs.length} 页${title ? ` · ${title.slice(0, 12)}` : ''}`,
tone: 'default'
})
}
const off = getBrowserController().onState(pushStatus)
pushStatus()
return () => {
off()
api.ui.removeStatusItem('tabs')
}
}
}