mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-14 01:50:39 +09:00
144 lines
4.6 KiB
Markdown
144 lines
4.6 KiB
Markdown
|
|
- Created branch: feat/external-adapter-phase1
|
||
|
|
|
||
|
|
I started phase 1 in the most merge-friendly way I could: small central changes, reusing existing registry patterns instead of inventing a whole new plugin system up front.
|
||
|
|
|
||
|
|
What I changed
|
||
|
|
|
||
|
|
1. Server adapter registry is now mutable
|
||
|
|
Files:
|
||
|
|
- server/src/adapters/registry.ts
|
||
|
|
- server/src/adapters/index.ts
|
||
|
|
|
||
|
|
Added:
|
||
|
|
- registerServerAdapter(adapter)
|
||
|
|
- unregisterServerAdapter(type)
|
||
|
|
- requireServerAdapter(type)
|
||
|
|
|
||
|
|
Kept the existing built-in registry shape, but changed initialization so built-ins are registered into a mutable map on startup.
|
||
|
|
|
||
|
|
Why this is merge-friendly:
|
||
|
|
- existing built-in adapter definitions stay where they already are
|
||
|
|
- existing lookup helpers still exist
|
||
|
|
- no big architectural rewrite yet
|
||
|
|
|
||
|
|
1. Runtime adapter validation moved to server routes
|
||
|
|
File:
|
||
|
|
- server/src/routes/agents.ts
|
||
|
|
|
||
|
|
Added:
|
||
|
|
- assertKnownAdapterType(...)
|
||
|
|
|
||
|
|
Used it in:
|
||
|
|
- /companies/:companyId/adapters/:type/models
|
||
|
|
- /companies/:companyId/adapters/:type/detect-model
|
||
|
|
- /companies/:companyId/adapters/:type/test-environment
|
||
|
|
- POST /companies/:companyId/agents
|
||
|
|
- POST /companies/:companyId/agent-hires
|
||
|
|
- PATCH /agents/:id when adapterType is touched
|
||
|
|
|
||
|
|
Why:
|
||
|
|
- shared schemas can now allow external adapter strings
|
||
|
|
- server becomes the real source of truth for “is this adapter actually registered?”
|
||
|
|
|
||
|
|
1. Shared adapterType validation is now open-ended for inputs
|
||
|
|
Files:
|
||
|
|
- packages/shared/src/adapter-type.ts
|
||
|
|
- packages/shared/src/validators/agent.ts
|
||
|
|
- packages/shared/src/validators/access.ts
|
||
|
|
- packages/shared/src/index.ts
|
||
|
|
|
||
|
|
Changed input validation from hardcoded z.enum(AGENT_ADAPTER_TYPES) to:
|
||
|
|
- agentAdapterTypeSchema
|
||
|
|
- optionalAgentAdapterTypeSchema
|
||
|
|
|
||
|
|
These accept any non-empty string.
|
||
|
|
|
||
|
|
Important:
|
||
|
|
- I did not remove AGENT_ADAPTER_TYPES from constants
|
||
|
|
- I did not change the built-in type unions yet
|
||
|
|
- this keeps the change minimal and limits blast radius
|
||
|
|
|
||
|
|
So:
|
||
|
|
- input payloads can carry external adapter types
|
||
|
|
- actual acceptance still depends on server registry validation
|
||
|
|
|
||
|
|
1. UI adapter registry is now mutable too
|
||
|
|
Files:
|
||
|
|
- ui/src/adapters/registry.ts
|
||
|
|
- ui/src/adapters/index.ts
|
||
|
|
|
||
|
|
Added:
|
||
|
|
- registerUIAdapter(adapter)
|
||
|
|
- unregisterUIAdapter(type)
|
||
|
|
- findUIAdapter(type)
|
||
|
|
|
||
|
|
Built-ins are still registered from the same file, same pattern as server.
|
||
|
|
|
||
|
|
1. Began switching UI adapter lists toward the registry
|
||
|
|
Files:
|
||
|
|
- ui/src/adapters/metadata.ts
|
||
|
|
- ui/src/components/AgentConfigForm.tsx
|
||
|
|
- ui/src/pages/NewAgent.tsx
|
||
|
|
|
||
|
|
Changed:
|
||
|
|
- AgentConfigForm adapter list now comes from registered UI adapters via metadata helper
|
||
|
|
- NewAgent supported adapter set now derives from listUIAdapters()
|
||
|
|
|
||
|
|
Why:
|
||
|
|
- phase 1 should start reducing hardcoded UI lists
|
||
|
|
- but without rewriting every page at once
|
||
|
|
|
||
|
|
1. Tests added first, then implementation
|
||
|
|
New tests:
|
||
|
|
- server/src/__tests__/adapter-registry.test.ts
|
||
|
|
- server/src/__tests__/agent-adapter-validation-routes.test.ts
|
||
|
|
- ui/src/adapters/registry.test.ts
|
||
|
|
- packages/shared/src/adapter-types.test.ts
|
||
|
|
|
||
|
|
Small test mock fix:
|
||
|
|
- server/src/__tests__/agent-skills-routes.test.ts
|
||
|
|
|
||
|
|
Current status
|
||
|
|
|
||
|
|
The branch is created and the phase-1 code is started.
|
||
|
|
|
||
|
|
I also followed TDD in spirit:
|
||
|
|
- wrote failing tests first for missing register/unregister APIs
|
||
|
|
- then implemented the registry changes
|
||
|
|
|
||
|
|
What is not finished yet
|
||
|
|
|
||
|
|
I have not finished the green/stabilization pass yet.
|
||
|
|
|
||
|
|
I still need to:
|
||
|
|
- run the targeted tests again after the implementation changes
|
||
|
|
- fix any TS / mocking fallout
|
||
|
|
- decide how far to take phase-1 UI wiring in this branch before stopping
|
||
|
|
|
||
|
|
Also, I intentionally did not yet touch the bigger hardcoded surfaces like:
|
||
|
|
- NewAgentDialog
|
||
|
|
- OnboardingWizard
|
||
|
|
- InviteLanding
|
||
|
|
- duplicated adapterLabels maps
|
||
|
|
- plugin manifest / plugin loader adapter contributions
|
||
|
|
|
||
|
|
That is deliberate.
|
||
|
|
For merge safety, I started with the smallest useful seam:
|
||
|
|
- dynamic server registry
|
||
|
|
- dynamic UI registry
|
||
|
|
- runtime validation based on registry
|
||
|
|
- first couple of UI consumers
|
||
|
|
|
||
|
|
One note
|
||
|
|
There was already an unrelated dirty change in:
|
||
|
|
- server/scripts/dev-watch.ts
|
||
|
|
|
||
|
|
I left that alone and did not make phase-1 changes there.
|
||
|
|
|
||
|
|
Recommended next move
|
||
|
|
I should keep going on this same branch and do the stabilization pass:
|
||
|
|
1. rerun server/ui/shared targeted tests
|
||
|
|
2. fix failures
|
||
|
|
3. run typechecks
|
||
|
|
4. then extend the same registry-driven approach to the next safest UI surfaces
|