# 7-52 Page AI target picker 与 resource target 仍未闭环

## 状态

- 状态：done
- Owner：07-ai / Page AI sidebar runtime / Agent Target Resolver
- 发现时间：2026-06-01

## 现象

Page AI 已经有 agent selector、contextRefs popover、`targetPackage` 和 `allowedFiles` 基础输入。2026-06-01 已补上 page target、mindmap resource target、OnlyOffice resource target 与 raw local resource target 的 composer chip / picker / payload 冻结闭环；mindmap / raw file `active_editor` contextRef 均已携带 `targetId` / `objectIdentity` / `resourceKind` / `assetId` / `relativePath`。跨 workspace 多 target 的产品化确认继续由 `design/07-ai/process/7-18-local-first-agent-file-editing-control-plane-v1.md` 跟踪，不再由本文阻塞 target picker 收口。

## 证据

- `rust/crates/mnote-web/browser/sidebar-page-ai-runtime.js` 已有 `currentPageAiOpenEditorsSnapshot()`、`currentPageAiEditorTarget()`、target chip / picker 和 `pageAiBuildAgentTargetPackage()`。
- `scripts/task502-page-ai-agent-selector-context-smoke.js` 已覆盖 page target button / popover / chip，并通过 mock `resourceEditors` 覆盖 mindmap target 选择，断言 run payload 的 `targetPackage.primaryTargetId`、`targets[]`、`resourceKind=mindmap`、`relativePath=maps/Task502.mindmap.json`、`policy.writeRequiresExplicitTarget=true`；同时断言 `active_editor` contextRef 携带 mindmap `targetId` / `objectIdentity` / `resourceKind` / `assetId` / `relativePath`。
- 2026-06-01 验证命令：`MNOTE_UI_BASE_URL=http://127.0.0.1:3301 node scripts/task502-page-ai-agent-selector-context-smoke.js`，截图：`tmp/task502-page-ai-agent-selector-context-smoke/01-agent-selector-context.png`。
- `scripts/task453-local-folder-page-ai-changed-files-smoke.js` 覆盖 target snapshot 冻结、跨 workspace 阻断、dirty buffer 阻断，但不是 target picker UI。
- `design/07-ai/process/7-18-local-first-agent-file-editing-control-plane-v1.md` 仍把 target chip/picker、跨 workspace 多选确认、真实 agent 写入回收列为未完成。
- OnlyOffice 工具层 session/scope 已有 `task515` - `task518` 覆盖；`task523-page-ai-onlyoffice-real-target-session-smoke.js` 已补真实 Page AI target 到 `onlyofficeSessionId` / `bridgeSessionId` 的 UI 绑定。
- `mnote-mindmap` skill 已注册，mindmap target 的 `active_editor` contextRef 已携带资源身份；`task525-page-ai-mindmap-resource-target-smoke.js` 已补真实 mindmap resource tab target / contextRefs 复测。
- `scripts/task520-page-ai-raw-resource-target-smoke.js` 已补真实 raw local resource tab：打开 `Page/notes.txt` 后 Page AI target chip 指向 `notes.txt`，run payload 冻结 `targetPackage.primaryTargetId=resource:file:{rootUri}:Page/notes.txt`，`allowedFiles=["Page/notes.txt"]`，并断言 `objectIdentity` 不再退化成 `[object Object]`。

## 影响

- Page AI UI 已能清楚告诉用户当前 page / mindmap / OnlyOffice target。
- Page AI target picker 已覆盖 page / mindmap / OnlyOffice / raw file 四类当前 P1 目标，不再退化为“当前页”语义。
- 真实 agent 写入回收、跨 workspace 多 target 和 mindmap resource tab 自动注入的更大产品化项继续由 `7-18` / `7-42` / `7-51` 跟踪。

## 下一步建议

- 若继续扩多目标选择，新增跨 workspace 多 target 确认 smoke，并归入 `7-18`。
- 若继续扩 mindmap 多目标或更细粒度 contextRefs，另拆 `7-42` / `7-51` follow-up，不再由本文阻塞 target picker 收口。

## 验收

- [x] Page AI composer 可见 page target chip。
- [x] target picker 可在当前 page 与 mindmap resource tab 间切换。
- [x] run payload 冻结 page `targetPackage.targets[0]`。
- [x] run payload 冻结 mindmap resource `targetPackage.targets[0]`。
- [x] OnlyOffice target 不会把 A 页授权误用于 B session。
- [x] mindmap resource tab 可作为 `resourceKind=mindmap` target。
- [x] mindmap `active_editor` contextRef 携带 `targetId` / `objectIdentity` / `resourceKind` / `assetId`。
- [x] raw file target 可从真实 resource tab 候选选择并冻结到 run payload。
- [x] 真实 mindmap resource tab target / contextRefs 已由 `task525` 覆盖。

## 本轮验证

- `node --check rust/crates/mnote-web/browser/sidebar-page-ai-runtime.js`
- `node --check scripts/task520-page-ai-raw-resource-target-smoke.js`
- `MNOTE_UI_BASE_URL=http://127.0.0.1:3301 node scripts/task520-page-ai-raw-resource-target-smoke.js`
- `MNOTE_UI_BASE_URL=http://127.0.0.1:3301 MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3301 node scripts/task502-page-ai-agent-selector-context-smoke.js`
