mirror of
https://github.com/multica-ai/multica.git
synced 2026-08-03 11:10:23 +02:00
* feat(self-host): DISABLE_WORKSPACE_CREATION env var (MUL-2777, #3433) When self-hosters set DISABLE_WORKSPACE_CREATION=true, POST /api/workspaces returns 403 for every caller and the UI hides every "Create workspace" affordance (sidebar, modal, /workspaces/new page, onboarding Step 2). This closes the gap where ALLOW_SIGNUP=false still let any signed-in user open an isolated workspace the platform admin couldn't see. - server: new Config.DisableWorkspaceCreation, gate in CreateWorkspace, workspace_creation_disabled in /api/config, Go tests. - frontend: new workspaceCreationDisabled in configStore, hide sidebar entry, swap NewWorkspacePage / CreateWorkspaceModal / onboarding StepWorkspace to a "creation disabled, ask for invite" state when the flag is on, EN + zh-Hans locale strings. - ops: .env.example, docker-compose.selfhost, helm values + configmap, SELF_HOSTING.md, SELF_HOSTING_ADVANCED.md, environment-variables docs (EN + zh). Co-authored-by: multica-agent <github@multica.ai> * fix(onboarding): drive create path off workspaceCreationAllowed (#3433) PR #3441 review: when DISABLE_WORKSPACE_CREATION=true and the user already has a workspace, StepWorkspace still walked the resume copy (`headline_resume` / `lede_resume` mentioning "or start another") and `creatingActive` ignored the flag, leaving a stale clickable create CTA possible if /api/config arrived late. Refactor StepWorkspace to derive a single `workspaceCreationAllowed` boolean from the config store. It now drives: - Initial `mode` state (defaults to "existing" when disabled + reusing so the CTA is pre-armed for the only valid action). - `creatingActive` so the footer CTA cannot fall back into the create branch even mid-render. - Eyebrow / headline / lede strings — adds `creation_disabled_{eyebrow,headline,lede}_resume` (EN + zh-Hans) for the disabled + reusing variant. Tests: cover the three reachable shapes — flag off + no existing, flag on + no existing, flag on + existing. Co-authored-by: multica-agent <github@multica.ai> --------- Co-authored-by: J <j@multica.ai> Co-authored-by: multica-agent <github@multica.ai>
35 lines
1.4 KiB
JSON
35 lines
1.4 KiB
JSON
{
|
|
"create_form": {
|
|
"name_label": "Workspace Name",
|
|
"name_placeholder": "My Workspace",
|
|
"url_label": "Workspace URL",
|
|
"url_placeholder": "my-workspace",
|
|
"submit": "Create workspace",
|
|
"submitting": "Creating...",
|
|
"errors": {
|
|
"slug_format": "Only lowercase letters, numbers, and hyphens",
|
|
"slug_taken": "That workspace URL is already taken.",
|
|
"slug_reserved": "That workspace URL is reserved and cannot be used.",
|
|
"slug_conflict_toast": "Choose a different workspace URL",
|
|
"create_failed": "Failed to create workspace"
|
|
}
|
|
},
|
|
"new_page": {
|
|
"back": "Back",
|
|
"log_out": "Log out",
|
|
"title": "Welcome to Multica",
|
|
"description": "One workspace where you and your AI teammates work side by side — taking issues, leaving comments, sharing the same context.",
|
|
"invite_hint": "You can invite teammates once your workspace is ready."
|
|
},
|
|
"creation_disabled": {
|
|
"title": "Workspace creation is disabled",
|
|
"description": "This Multica instance does not allow new workspaces to be created. Ask your administrator for an invitation to an existing workspace."
|
|
},
|
|
"no_access": {
|
|
"title": "Workspace not available",
|
|
"description": "This workspace doesn't exist or you don't have access.",
|
|
"go_to_workspaces": "Go to my workspaces",
|
|
"sign_in_different": "Sign in as a different user"
|
|
}
|
|
}
|