Org structure: divisions → products/services → teams + custom model base URL
The object spine becomes definable (data model was designed-for from day one):
- Division and Product entities (Product carries kind: Product|Service, optional DivisionId);
Team gains nullable ProductId — pre-structure teams keep working. AddDivisionsAndProducts
migration; org-scoped validation; owner-only writes (audited); list endpoints.
- /structure page: define divisions, products/services (with division), teams (under a
product). Org chart now renders the full spine — org → divisions → products → teams →
seats — with parentless layers linking up to the org.
- BYOK custom URL: the SeatsPage model-connection form gains a Base URL field (provider
list: stub/openai/ollama/vllm/custom). Backend already supported it end to end —
ApiConfig.Endpoint flows into the OpenAI-compatible adapter ({base}/v1/chat/completions),
so any OpenAI-compatible gateway or self-hosted model works; the config list shows it.
Verified: ArchitectureTests 8/8, IntegrationTests 45/45 (new OrgStructureTests: spine
creation, kind tags, org-scoped validation 400s, Member 403), client build green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,9 +7,17 @@ internal sealed record CreateOrganizationRequest(Guid OrganizationId, string Nam
|
||||
|
||||
internal sealed record OrganizationResponse(Guid Id, string Name);
|
||||
|
||||
internal sealed record CreateTeamRequest(Guid OrganizationId, string Name);
|
||||
internal sealed record CreateTeamRequest(Guid OrganizationId, string Name, Guid? ProductId = null);
|
||||
|
||||
internal sealed record TeamResponse(Guid Id, Guid OrganizationId, string Name);
|
||||
internal sealed record TeamResponse(Guid Id, Guid OrganizationId, string Name, Guid? ProductId = null);
|
||||
|
||||
internal sealed record CreateDivisionRequest(Guid OrganizationId, string Name);
|
||||
|
||||
internal sealed record DivisionResponse(Guid Id, Guid OrganizationId, string Name);
|
||||
|
||||
internal sealed record CreateProductRequest(Guid OrganizationId, string Name, ProductKind Kind, Guid? DivisionId = null);
|
||||
|
||||
internal sealed record ProductResponse(Guid Id, Guid OrganizationId, Guid? DivisionId, string Name, string Kind);
|
||||
|
||||
internal sealed record CreateTaskRequest(Guid TeamId, string Title, string? Description, WorkItemType Type);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user