Files
multica/packages/views/locales/en/workspace.json
Bohan Jiang 90ddfb04e2 feat(self-host): DISABLE_WORKSPACE_CREATION env var (MUL-2777) (#3441)
* 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>
2026-05-28 16:42:08 +08:00

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"
}
}