# computer-use 插件的API 和使用方法

现在我已经完整了解了 computer-use 插件的全部 API 和使用方法。以下是详细的使用示例说明：

---

## Computer Use 插件使用指南

Computer Use 插件可以通过 `@oai/sky` 库自动化控制 Windows 应用程序的 UI，支持截图、点击、输入、滚动、拖拽等操作，即使窗口被遮挡也能工作。

---

### 初始化

每次使用前需要先初始化 sky 对象：

```
if (!globalThis.sky) {
  const { sky } = await import("@oai/sky");
  globalThis.sky = sky;
}
```

---

### 示例 1：列出所有已打开的应用和窗口

```
globalThis.apps = await sky.list_apps();
nodeRepl.write(JSON.stringify(apps, null, 2));
```

---

### 示例 2：选择目标窗口并激活

```
// 假设从 list_apps 结果中找到记事本
globalThis.targetApp = apps.find((app) => app.id === "notepad.exe");
globalThis.targetWindow = await sky.get_window({
  id: targetApp.windows[0].id,
  app: targetApp.windows[0].app,
});
await sky.activate_window({ window: targetWindow });
```

---

### 示例 3：获取窗口状态（截图 + 无障碍树）

```
globalThis.state = await sky.get_window_state({
  window: targetWindow,
  include_screenshot: true,
  include_text: true,
});
globalThis.targetWindow = state.window;
// 查看无障碍树中的元素索引
nodeRepl.write(String(state.accessibility?.tree || ""));
```

---

### 示例 4：点击元素（通过无障碍树索引）

```
// element_index 来自上一步无障碍树中看到的索引号
await sky.click({ window: targetWindow, element_index: 12 });
```

### 示例 4b：点击坐标

```
// 基于窗口相对坐标点击
await sky.click({ window: targetWindow, x: 200, y: 150 });
```

---

### 示例 5：输入文本

```
await sky.type_text({ window: targetWindow, text: "Hello, World!" });
```

---

### 示例 6：按键 / 快捷键

```
// 按回车
await sky.press_key({ window: targetWindow, key: "Return" });

// Ctrl+A 全选
await sky.press_key({ window: targetWindow, key: "Control_L+a" });

// Ctrl+C 复制
await sky.press_key({ window: targetWindow, key: "Control_L+c" });

// Ctrl+V 粘贴
await sky.press_key({ window: targetWindow, key: "Control_L+v" });
```

---

### 示例 7：滚动

```
// 在窗口内 (x:400, y:300) 位置向下滚动 600 像素
await sky.scroll({
  window: targetWindow,
  x: 400,
  y: 300,
  scrollX: 0,
  scrollY: 600,
});
```

---

### 示例 8：拖拽

```
// 从 (100, 200) 拖拽到 (300, 400)
await sky.drag({
  window: targetWindow,
  from_x: 100,
  from_y: 200,
  to_x: 300,
  to_y: 400,
});
```

---

### 示例 9：设置输入框的值

```
// 替换某个可编辑元素的值（element_index 来自无障碍树）
await sky.set_value({ window: targetWindow, element_index: 5, value: "新内容" });
```

---

### 示例 10：执行辅助操作（如展开/折叠）

```
await sky.perform_secondary_action({
  window: targetWindow,
  element_index: 8,
  action: "Expand",  // 可选: Raise, Scroll Up, Scroll Down, Expand, Collapse 等
});
```

---

### 示例 11：启动一个应用

```
// 通过 app id 启动
await sky.launch_app({ app: "notepad.exe" });

// 或通过完整 exe 路径启动
await sky.launch_app({ app: "C:\\Program Files\\MyApp\\app.exe" });
```

---

### 核心工作流模式（观察 → 操作 → 刷新）

这是最推荐的使用模式，每次操作后都要重新获取窗口状态：

```
// 第 1 步：观察
globalThis.state = await sky.get_window_state({
  window: targetWindow,
  include_screenshot: true,
  include_text: true,
});
nodeRepl.write(String(state.accessibility?.tree));

// 第 2 步：执行一个操作
await sky.click({ window: targetWindow, element_index: 12 });

// 第 3 步：刷新状态（必须！索引和坐标在状态变化后失效）
globalThis.state = await sky.get_window_state({
  window: targetWindow,
  include_screenshot: true,
  include_text: true,
});
nodeRepl.write(String(state.accessibility?.tree));
```

---

### 重要注意事项

- **每次操作后必须刷新状态**：元素索引、截图 ID、坐标在窗口状态变化后都会失效
- **不要自动化终端应用**（CMD、PowerShell、Windows Terminal）
- **不要使用 Windows 键**或涉及 Windows 键的快捷键
- **不要自动化密码输入或安全对话框**
- 对于浏览器自动化，推荐使用 Browser Use 插件而非 Computer Use
- 涉及删除数据、发送消息、财务操作等高风险动作需要用户确认