Vendor opencode source for docker build
This commit is contained in:
105
opencode/specs/12-global-sync-domain-split.md
Normal file
105
opencode/specs/12-global-sync-domain-split.md
Normal file
@@ -0,0 +1,105 @@
|
||||
## Global sync domain split
|
||||
|
||||
Refactor `context/global-sync.tsx` into domain modules while preserving behavior.
|
||||
|
||||
---
|
||||
|
||||
### Summary
|
||||
|
||||
`packages/app/src/context/global-sync.tsx` is a large multi-domain module (1,000+ LOC) that currently owns queue scheduling, bootstrap, child store creation, persistence bridges, session trimming, and event reduction. This workstream splits it into clear domains without changing runtime behavior.
|
||||
|
||||
---
|
||||
|
||||
### Goals
|
||||
|
||||
- Decompose global sync internals into maintainable modules.
|
||||
- Keep `useGlobalSync()` public API unchanged.
|
||||
- Isolate pure logic (session trimming, ordering, grouping) from side effects.
|
||||
- Keep event handling deterministic and easier to test.
|
||||
|
||||
---
|
||||
|
||||
### Non-goals
|
||||
|
||||
- No protocol/API changes to server events.
|
||||
- No behavior changes in session ordering, trimming, or cache semantics.
|
||||
- No changes to page-level UI logic.
|
||||
|
||||
---
|
||||
|
||||
### Parallel ownership (important)
|
||||
|
||||
This workstream owns:
|
||||
|
||||
- `packages/app/src/context/global-sync.tsx`
|
||||
- New files under `packages/app/src/context/global-sync/**`
|
||||
|
||||
This workstream must not edit:
|
||||
|
||||
- `packages/app/src/context/file.tsx` (spec 13)
|
||||
- `packages/app/src/components/prompt-input.tsx` (spec 11)
|
||||
- `packages/app/src/pages/session.tsx` and `packages/app/src/pages/layout.tsx` (specs 09/10)
|
||||
|
||||
---
|
||||
|
||||
### Current state
|
||||
|
||||
- Single large module with many responsibilities.
|
||||
- Event reducer is embedded in component lifecycle code.
|
||||
- Queue/scheduler, bootstrap, and child-store lifecycle are tightly interwoven.
|
||||
|
||||
---
|
||||
|
||||
### Proposed module split
|
||||
|
||||
Create `packages/app/src/context/global-sync/` modules like:
|
||||
|
||||
- `types.ts` - shared types.
|
||||
- `queue.ts` - refresh queue and drain scheduler.
|
||||
- `child-store.ts` - child store creation, persistence wiring, cache maps.
|
||||
- `session-trim.ts` - pure session sorting/trimming helpers.
|
||||
- `bootstrap.ts` - global and per-directory bootstrap flows.
|
||||
- `event-reducer.ts` - event handlers for SDK event stream.
|
||||
|
||||
Keep `global-sync.tsx` as provider/composition entry point.
|
||||
|
||||
---
|
||||
|
||||
### Phased steps
|
||||
|
||||
1. Extract pure helpers (`cmp`, session trim/recent logic) first.
|
||||
2. Extract queue/drain scheduler.
|
||||
3. Extract child-store creation and persisted cache wiring.
|
||||
4. Extract bootstrap flows.
|
||||
5. Extract event reducer and wire into existing listener.
|
||||
6. Keep API surface stable and documented.
|
||||
|
||||
---
|
||||
|
||||
### Acceptance criteria
|
||||
|
||||
- Public API of `useGlobalSync()` remains backward compatible.
|
||||
- `global-sync.tsx` is substantially reduced (target: under 500 LOC).
|
||||
- Event handling logic is isolated and easier to trace.
|
||||
- No behavior regressions in project/session/provider sync.
|
||||
|
||||
---
|
||||
|
||||
### Validation plan
|
||||
|
||||
- Typecheck: `bun run typecheck` (from `packages/app`).
|
||||
- Targeted e2e checks:
|
||||
- `e2e/app/session.spec.ts`
|
||||
- `e2e/sidebar/sidebar-session-links.spec.ts`
|
||||
- `e2e/projects/projects-switch.spec.ts`
|
||||
- Manual checks:
|
||||
- switching directories/projects still hydrates child stores correctly
|
||||
- session list/pagination behavior remains stable
|
||||
|
||||
---
|
||||
|
||||
### Handoff notes
|
||||
|
||||
- Favor function extraction with unchanged code first.
|
||||
- Keep event handler ordering explicit; avoid implicit fallthrough behaviors.
|
||||
- Add focused tests only for extracted pure helpers if practical, but avoid broad test-suite changes here.
|
||||
Reference in New Issue
Block a user