Plugin 开发指南

使用 @downcity/city/plugin 构建由 City 提供的统一 Plugin。

Plugin 开发指南

Plugin 作者 API 位于 @downcity/city/plugin。Plugin 是一个长期实例,不使用按 Agent 创建实例的 工厂函数;需要区分执行范围时读取 PluginContext。

import { Plugin, create_action } from "@downcity/city/plugin";

export default class ExamplePlugin extends Plugin {
  readonly name = "example";
  readonly title = "Example";
  readonly description = "An example Plugin.";
  readonly actions = {
    status: create_action({
      description: "Return the current scope.",
      execute: async ({ context, execution }) => ({
        success: true,
        data: {
          agent_id: context.agent.id,
          workspace_id: context.workspace.id,
          session_id: context.session?.id ?? null,
          call_id: execution.call_id,
        },
      }),
    }),
  };
}

Workspace 文件使用 context.workspace.files;Plugin 私有状态使用 context.storage.files; context.session 可以直接 prompt()、stop()、context() 或订阅变化。需要调用其他 Plugin 时使用 context.city.plugins。

宿主可以直接把实例交给 City:

const city = new City({ plugins: [new ExamplePlugin()], workspaces: [workspace] });
city.agents.add(agent);

可安装 Plugin 的 main 默认导出实例或 { plugin, main },不再提供 module.create()。Renderer 只通过宿主 action gateway 通信,不能访问 Node、Electron 或 Agent 全量对象。

测试时重点验证:City 内实例唯一、initialize/dispose 各一次、每次调用获得正确且独立的 PluginContext,以及 Hook 作用域在 Step 结束后释放。