ambleloft

主页 Webview API

@ambleloft/extension-sdk/webview 用于独立插件主页。聊天内自定义 UI 使用另一套 MCP Apps 协议。

API 参考

按章节查看契约、签名、字段与示例;未注明的默认值不作推断。

本页内容

01初始化与调用

在浏览器入口创建客户端并等待 initialize。下面的 operation ID 必须换成自己的已声明操作。Result 使用 ok 区分成功与失败;unwrap 会将失败抛为 ExtensionError,不会重试。

src/page.ts · call pattern
import { createClient, unwrap } from '@ambleloft/extension-sdk/webview';
const client = createClient();
const host = await client.initialize();
const result = await client.invoke('samples.hello-operation.count', { text: 'Hello' });
const output = unwrap(result);
console.log(host.locale, output);

02WebviewClient 方法

点击页面按钮不是宿主授权。invoke 的写入确认由宿主针对具体请求处理;不要在页面自行制造授权令牌。

字段 / API说明
initialize(): Promise<HostContext>首次握手,读取协议、主题、语言和支持方法。
invoke(operationId,input,{signal?}?): Promise<Result<JsonObject>>调用已声明操作;signal 为 AbortSignal。
selectProject({capabilities}): Promise<Result<Project|null>>用户取消返回成功值 null。
requestGrant({projectId,capabilities}): Promise<Result<boolean>>用户取消返回 false。
requestSecretInput({key,title}): Promise<Result<{saved:boolean}>>仅返回是否保存,页面无法读取密钥值。
onHostContextChanged(listener): Disposable订阅主题/语言等上下文变化并释放。

03HostContext 与能力

不要假定旧宿主支持所有方法。supportedMethods 可用于界面降级;能力声明和授权依然由宿主裁决。

Type signatures
interface HostContext {
  protocolVersion: '1';
  extensionId: string;
  pageInstanceId: string;
  locale: string;
  theme: 'light' | 'dark';
  supportedMethods: string[];
}
type Capability = 'projects.read' | 'projects.path.read'
  | 'conversations.create' | 'conversations.open'
  | 'storage' | 'configuration' | 'secrets';

04失败对象

保留 code、requestId 与 effectStatus 供排错。unknown 表示业务可能已经执行;不能因为 UI 超时就自动重试写入。

Result / Failure · signatures
type Result<T> = { ok: true; value: T } | { ok: false; error: Failure };
interface Failure {
  code: ErrorCode;
  message: string;
  requestId: string;
  effectStatus: 'notStarted' | 'unknown' | 'completed';
  details?: JsonObject;
}
查看错误代码与处理策略
SDK / CLI 0.1.0-alpha.9 · 接口基线 兼容性与预览说明 · 案例源码