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
+13 -7
View File
@@ -17,7 +17,8 @@ import {
type SessionInfo
} from '@earendil-works/pi-coding-agent'
import { ApprovalService, createApprovalExtension } from './approval'
import { browserTools } from '../tools/browser-tools'
import { getPluginHost } from '../plugins/plugin-host'
import { browserToolNames } from '../tools/browser-tools'
import type {
AgentUiEvent,
AppSettings,
@@ -47,8 +48,9 @@ import type {
/** 增量事件合批的刷新间隔(ms),参考 pi-web 的 60ms 快照节流经验取略低值 */
const DELTA_FLUSH_MS = 40
/** SDK 注册的自定义工具名(用量卡片中与内置「系统工具」分开统计) */
const CUSTOM_TOOL_NAMES = new Set<string>(browserTools.map((tool) => tool.name))
/** SDK 注册的自定义工具名(用量卡片中与内置「系统工具」分开统计)。
* browserTools 已迁入浏览器插件(pi.registerTool 注册),这里同步其名单。 */
const CUSTOM_TOOL_NAMES = new Set<string>(browserToolNames)
/** 需要人工审批的工具名单(高危内置工具;业务演示工具已随 demo-tools.ts 移除) */
const TOOLS_REQUIRING_APPROVAL: ReadonlySet<string> = new Set(['bash', 'write', 'edit'])
@@ -270,7 +272,9 @@ export class AgentService {
agentDir: targetAgentDir,
resourceLoaderOptions: {
extensionFactories: [
createApprovalExtension(this.approvals, TOOLS_REQUIRING_APPROVAL, () => this.permissionMode)
createApprovalExtension(this.approvals, TOOLS_REQUIRING_APPROVAL, () => this.permissionMode),
// 插件聚合 extension:全部已启用插件在同一真实 ExtensionAPI 上下文里激活
getPluginHost().createAggregatedExtension()
]
}
})
@@ -290,8 +294,9 @@ export class AgentService {
const result = await createAgentSessionFromServices({
services,
sessionManager,
sessionStartEvent,
customTools: browserTools
sessionStartEvent
// 业务工具(browserTools 等)由插件经 pi.registerTool 注册(聚合 extension),
// 此处不再传 customTools
})
return { ...result, services, diagnostics: services.diagnostics }
}
@@ -1125,7 +1130,8 @@ export class AgentService {
}
}
private async rebuildRuntime(): Promise<void> {
/** 重建运行时(插件重载/启停后由 PluginHost 调用,extensionFactories 重跑) */
async rebuildRuntime(): Promise<void> {
const old = this.runtime
this.runtime = null
this.initPromise = null