feat(coding): add PI-105 product file host API

This commit is contained in:
2026-08-23 18:17:30 +08:00
parent 7680bfb0cf
commit 9520872d2f
17 changed files with 1419 additions and 38 deletions

View File

@@ -0,0 +1,116 @@
# Task: Implement PI-105 Pi Host API cutover
## Identity
- Task ID: 20260823-pi-host-cutover-c4e8a1d7
- Mode: Feature
- Branch: codex/20260823-pi-host-cutover-c4e8a1d7-pi-host-cutover
- Worktree: D:\Datas\OthersProjects\makelore-pi-host-cutover-c4e8a1d7
- Base commit: 7680bfb0cf206142a164b740d56f8be5ea59362a
- Owner: codex
- Status: In Progress
## Scope
- Implement `PI-105 — Files, changes, skills, and command Host API` from the
`【架构】opencode2pi` Spec/ticket graph on cumulative PI-090 baseline
`7680bfb0cf206142a164b740d56f8be5ea59362a`.
- Add a Main-owned vendor-neutral Project File Service for active-project
status, find, bounded content and bounded text search.
- Add typed `/api/coding` routes for files, search, Conversation changes,
managed Skills and the Conversation command catalog, plus the Renderer
facade contract half owned by this ticket.
- Compose those routes with the same production `PiProductTools`, attachment
store and `ConversationChangeTracker` instances used by the Pi extension.
## Intent And Constraints
- All file inputs are active-project-relative. Reject absolute, traversal and
project-external paths; never project the absolute project root or expose an
arbitrary filesystem proxy.
- Preserve the currently supported file/status/find/content/search UX while
bounding file sizes, result counts and search output. Do not depend on the
OpenCode runtime or its wire DTOs.
- Conversation changes come only from the shared PI-090 tracker and are
associated with the requested Conversation/run. Do not query Pi session
diff, parse message text, or create a second tracker/state source.
- Skills come only from packaged managed resources and the target Agent's
explicit selection. Commands merge Makelore, valid Pi and selected-Skill
entries with stable DTOs and Makelore-first deduplication.
- The new `/api/coding` route/type/test surface contains no todo, share,
revert/unrevert, checkpoint or file-rollback shape. Existing
`/api/opencode` code remains untouched for PI-140 removal.
- Exclude PI-100 project/Agent/Conversation CRUD, prompt, SSE, interactions and
runtime diagnostics; exclude PI-110/120/130 Renderer state/UI work.
- Do not invent an attachment read endpoint: neither PI-105 nor the normative
route table assigns its transport.
- Real external Provider verification remains **Explicitly Waived / Accepted
Risk** with `realTurnVerified=false`; macOS x64/arm64 remains deferred to
mandatory PI-150. Neither is a Pass.
- Do not create subagents. Keep all writes in this isolated worktree and leave
canonical project memory to a later integration task.
## Plan
1. Define the smallest vendor-neutral file/change/skill/command contracts and
lock the supported file UX and path boundaries with focused tests.
2. Implement the Main-owned Project File Service and the PI-105 leaf routes,
including the minimal planner-approved
`GET /api/coding/conversations/:id/changes` route.
3. Wire one shared product-services composition into `HostApiContext`, route
registration and Electron Main without taking PI-100 route ownership.
4. Add focused service/route/facade/dispatcher/Electron seam coverage for path
rejection, redaction, bounds, tracker identity and managed catalog rules.
5. Run focused tests, typecheck, lint, full unit, Vite build, Windows Electron
verification and project-document gates; commit and request planner review.
## Outcome
- Added shared vendor-neutral file/change/Skill/command DTOs and a typed
Renderer facade for the seven PI-105 endpoints.
- Added a Main-owned `CodingProjectFileService` with Git-aware discovery,
bounded non-Git fallback, bounded UTF-8 previews/search, binary rejection,
ignore-directory handling, and lexical/realpath containment.
- Added the five normative file/search/Skill routes plus Conversation command
and planner-approved changes routes. Known input errors are typed and
unknown filesystem/service failures are redacted.
- Added `CodingProductHost` composition and wired Electron Main to one shared
attachment store, `PiProductTools`, and its single
`ConversationChangeTracker`. The current active-project catalog is injected
as a temporary project-selection adapter until PI-100 replaces composition;
no OpenCode runtime call or fallback is used by the new service.
- Product command projection is Makelore-first, accepts only safe Pi metadata,
includes only selected managed Skills, and strips raw Pi/source/provider
fields. The host has a `get_commands` result injection seam for PI-100's
runtime composition.
- Added focused unit and Windows Electron coverage for Git/non-Git files,
Unicode truncation, path rejection/redaction, shared tracker identity,
catalog filtering, seven route DTOs, Renderer encoding, and Main dispatcher.
## Verification
- `corepack pnpm exec vitest run tests/unit/coding-project-files.test.ts tests/unit/coding-product-services.test.ts tests/unit/coding-files-routes.test.ts tests/unit/coding-product-tools-facade.test.ts` — Pass, 4 files / 10 tests.
- `corepack pnpm exec vitest run --config vitest.electron.config.ts tests/electron-runtime/coding-files-host.test.ts` — Pass, 1 file / 1 test (focused seam).
- `corepack pnpm run typecheck` — Pass.
- `corepack pnpm run lint:check` — Pass with 6 pre-existing warnings and no errors.
- `corepack pnpm run build:vite` — Pass; existing dynamic-import/chunk-size warnings remain.
- `corepack pnpm test` — Pass on clean rerun, 207 files / 2237 passed / 2 skipped. The first run had one Windows temporary-file `EPERM` and one async AI-hardware loading timeout; both passed when isolated and the complete suite then passed.
- `corepack pnpm run test:electron:windows` — Pass, 3 files / 7 tests. A direct Vitest invocation was intentionally discarded because it bypassed the repository's local-Electron wrapper.
- Real Provider verification — **Explicitly Waived / Accepted Risk**;
`realTurnVerified=false`, not Pass.
- macOS x64/arm64 — deferred to mandatory PI-150, not Pass.
## Follow-ups
- PI-100 must pass the target Conversation worker's read-only Pi
`get_commands` projection into `createCodingProductHost.listPiCommands` when
it composes the production `CodingConversationRuntime`. Until that runtime
exists in Main, the route deterministically returns Makelore plus selected
managed-Skill commands.
- PI-100 should replace the injected current active-project catalog adapter
with its vendor-neutral project service without changing the PI-105 host
contract or creating another product-tools/change-tracker instance.
## Promotion Candidates
- None recorded.