chain-studio/lib/l10n/app_en.arb
flemming-it 14f824b8ef
Some checks failed
Security / Security check (push) Failing after 2s
feat(doctor,shell): ollama host-service suggestion + hub-update hint (0.80.0)
Doctor: when the system AI uses an Ollama endpoint that no declared
host service covers (host:port match, /v1 suffix stripped), the
services panel says so in one sentence with a one-click 'declare as
host service' via the new DeclareService RPC — and states honestly
that it takes effect after a daemon restart (the restart button sits
on the same page). Pure suggestOllamaServiceEndpoint pins every
branch.

Shell: one slim, dismissible banner after connecting when the
release manifest offers a newer hub version; dismissal is persisted
per version so each release hints exactly once (pure
shouldShowUpdateHint + a widget test through the fake hub).
Deliberately manifest-based — Studio and hub versions are
independent counters, so a direct comparison would be wrong;
unreleased dev skew stays with the per-page classified states.
The probe stays inert under the test probe override: its timeout
timer leaked into hub_banner_test (the hermeticity class again).

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-23 00:03:42 +02:00

2014 lines
86 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"@@locale": "en",
"errModuleDownload": "Module download failed",
"errModuleDownloadHint": "The module's bundle URL is unreachable (status code below). The hub is running fine — fix the URL/host or choose another store.",
"storeFromSource": "from {store}",
"@storeFromSource": {
"placeholders": {
"store": { "type": "String" }
}
},
"guidedSetupTitle": "Setup assistant",
"guidedSetupIntro": "Answer three questions and Ch∆In assembles a tailored config, module set and starter flow.",
"guidedSetupScenario": "Scenario",
"guidedSetupIntent": "Task",
"guidedSetupTarget": "Where will it run?",
"guidedSetupApproval": "Require a human approval step before the AI step",
"guidedSetupDataLocal": "Data must stay local (air-gapped posture)",
"guidedSetupReviewHeading": "This is the plan Ch∆In will apply:",
"guidedSetupApply": "Apply setup",
"guidedSetupApplied": "Setup applied. Finish with the steps below:",
"guidedSetupBack": "Back",
"guidedSetupNext": "Next",
"guidedSetupCancel": "Cancel",
"guidedSetupClose": "Close",
"appTitle": "Ch∆In Studio",
"@appTitle": {
"description": "App-bar title in the OS task switcher."
},
"navWelcome": "Welcome",
"welcomeHeroTitle": "Ch∆In Platform",
"welcomeHeroSubtitle": "Deterministic workflow engine for AI-assisted data processing in regulated environments.",
"welcomePillarHubTitle": "Hub",
"welcomePillarHubBody": "The program that runs everything. It works right on your machine, needs no extra software, and keeps everything important in a single file.",
"welcomePillarHubTech": "One Rust binary that loads modules and runs flows. SQLite for state. No Docker, no message broker, no background services to babysit.",
"welcomePillarModuleTitle": "Module",
"welcomePillarModuleBody": "A building block that does exactly one job — reading text out of documents, say. Every module states up front what it wants to touch; the hub allows nothing more.",
"welcomePillarModuleTech": "A small, sandboxed WebAssembly component. Declares the network endpoints, files, and environment variables it touches; the hub enforces the list.",
"welcomePillarFlowTitle": "Flow",
"welcomePillarFlowBody": "A recipe that connects modules into fixed steps. Inputs go in, steps run in order, the result comes out — and every step is recorded tamper-evidently.",
"welcomePillarFlowTech": "A YAML file that chains modules together; every step is recorded in a hash-chained audit log that the Diagnostics page verifies in full.",
"welcomePillarTechToggle": "For the technically curious",
"welcomeTrustHeader": "TRUST POSTURE",
"welcomeTrustSandboxTitle": "Sandbox by default",
"welcomeTrustSandboxBody": "Every module ships with an explicit permission list — network endpoints, files, environment variables. The hub enforces it; nothing reaches outside the sandbox without operator approval.",
"welcomeTrustAuditTitle": "Tamper-evident audit log",
"welcomeTrustAuditBody": "Flow runs, install / uninstall actions, approval decisions — all of them write into a hash-chained audit log. The Doctor page verifies the chain end-to-end on every load.",
"welcomeTrustAirgapTitle": "Air-gap ready",
"welcomeTrustAirgapBody": "The whole hub fits in a single binary that runs on Linux, macOS and Windows. Once a module is installed, the flow it powers runs without further network access — perfect for regulated environments.",
"welcomeDocsHeader": "DOCUMENTATION",
"welcomeDocsBody": "Operator-facing explainers, rendered inline. No browser, no external link — air-gap-friendly.",
"welcomeDocArchitectureTitle": "Architecture in one paragraph",
"welcomeDocArchitectureBlurb": "Hub, Module, Flow — and how the three fit together.",
"welcomeDocSecurityTitle": "Sandbox model",
"welcomeDocSecurityBlurb": "What a module declares, what the operator caps, what the hub enforces.",
"welcomeDocAuditTitle": "Tamper-evident audit log",
"welcomeDocAuditBlurb": "How the hash chain makes later edits detectable — and what integrity level WORM-1 does (and does not) provide.",
"welcomeDocFlowsTitle": "Flow composition",
"welcomeDocFlowsBlurb": "YAML basics, templating reference, the extract→summarize example.",
"welcomeDocApprovalsTitle": "Approvals",
"welcomeDocApprovalsBlurb": "Human-in-the-loop checkpoints — when to use them, how the audit log records them.",
"welcomeDocFederationTitle": "Federation",
"welcomeDocFederationBlurb": "Connect other hubs (satellites) so their capabilities become usable here — what a satellite is and how enrolment works.",
"welcomeDocRunsTitle": "Background runs",
"welcomeDocRunsBlurb": "Flows that keep working in the background — what they are for, how to switch the feature on and monitor the runs.",
"helpTooltip": "Help",
"errApprovalRejected": "Approval rejected by reviewer.",
"errApprovalRejectedHint": "The reviewer marked this step as rejected. Check the audit log for the reviewer's reason.",
"errApprovalTimedOut": "Approval timed out.",
"errApprovalTimedOutHint": "No reviewer decided within the configured time. Raise timeout_seconds on the approval step or alert the reviewer.",
"errOutputTooLarge": "Step output exceeded the size limit.",
"errOutputTooLargeHint": "Either trim the output (truncate text, downsample bytes) or raise max_output_size_mb in the operator config.",
"errServiceUnavailableForStep": "Host service not configured.",
"errServiceUnavailableForStepHint": "The module requires a service (e.g. ollama, playwright) the operator hasn't declared. Add it under services: in ~/.chain/config.yaml.",
"errMissingValue": "Required value is missing.",
"errMissingValueHint": "The step expected an input that wasn't wired up — either supply it at run time or fix the upstream $ref.",
"errMcpUnreachable": "MCP endpoint unreachable.",
"errMcpUnreachableHint": "The MCP server didn't respond. Check the endpoint in Settings → Integrations and confirm it's running.",
"errCapabilityNotInstalled": "Required capability is not installed.",
"errCapabilityNotInstalledHint": "Open the flow's Text tab — the analyzer's Fix button installs the capability if it's in the store.",
"errNoStoreEntry": "No store entry provides this capability.",
"errNoStoreEntryHint": "Three ways to get it: install a local module (chain install --link <path>), add the store that provides it (Settings → Stores), or configure the integration (MCP/n8n) that supplies it. If it was just published, refresh the Store page first.",
"welcomeDocClose": "Close",
"welcomeDocFailedToLoad": "Could not load documentation: {error}",
"@welcomeDocFailedToLoad": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"welcomeChecklistHeader": "GETTING STARTED",
"welcomeChecklistBody": "Four steps to a working hub. The list shows the live state — refresh top right after changing anything.",
"welcomeChecklistAi": "Configure System AI",
"welcomeChecklistAiHint": "Settings → System AI. Required for the AI search and inline failure explanations.",
"welcomeChecklistMcp": "Connect a public tool catalog",
"welcomeChecklistMcpHint": "Connects a public tool catalog (the technical term is MCP) — its capabilities then appear in the Store. Add one there, or under Settings → MCP Clients.",
"welcomeChecklistModule": "Install a text module",
"welcomeChecklistModuleHint": "Install a module from the Store — pick whichever category fits your work. Modules are sandboxed Ch∆In components.",
"welcomeChecklistFlow": "Run a saved flow",
"welcomeChecklistFlowHint": "Flows → pick one → Run. Studio ships a few demo flows; one of your own works too.",
"welcomeChecklistAllDone": "All four steps complete.",
"welcomeChecklistDismiss": "Hide checklist",
"welcomeChecklistRefresh": "Refresh",
"welcomeChecklistRefreshing": "Checking…",
"welcomeChecklistDone": "Done",
"welcomeChecklistTodo": "Pending",
"navDoctor": "Doctor",
"navModules": "Modules",
"navStore": "Store",
"navFlows": "Flows",
"navAudit": "Audit",
"navApprovals": "Approvals",
"connectionConnected": "connected",
"connectionUnreachable": "unreachable",
"connectionConnecting": "connecting…",
"connectionStartHub": "Start hub",
"connectionTapToStart": "tap to start",
"sidebarSettingsTooltip": "Settings (⌘;)",
"sidebarChannelTooltip": "Active channel — click to switch.\nproduction = stable · beta = pre-release · dev = rolling · local = workspace",
"buttonCancel": "Cancel",
"buttonLearnMore": "Learn more",
"buttonSave": "Save",
"buttonClose": "Close",
"buttonRetry": "Retry",
"buttonRefresh": "Refresh",
"buttonInstall": "Install",
"buttonUninstall": "Uninstall",
"buttonDetails": "Details",
"buttonAdd": "Add",
"buttonRemove": "Remove",
"buttonOpen": "Open",
"buttonExplain": "Explain",
"buttonReadDocs": "Read docs",
"buttonCopy": "Copy to clipboard",
"buttonCopied": "Copied",
"buttonShowDetails": "Show details",
"buttonHideDetails": "Hide details",
"storeInstallableOnly": "Installable only",
"storePillComingSoon": "Coming soon",
"storeNotInstallableInline": "This module is on the roadmap (status: {status}). It has no installable bundle yet — follow the repository for updates.",
"@storeNotInstallableInline": {
"placeholders": {
"status": {
"type": "String"
}
}
},
"mcpSuggestionDeepwikiDesc": "Public HTTPS — GitHub repo documentation search (AI-powered). No Node, no API key.",
"mcpSuggestionSemgrepDesc": "Public HTTPS — security scanning for code vulnerabilities. No Node, no API key.",
"mcpSuggestionFilesystemDesc": "Anthropic — read / write files in /tmp. Edit the path before saving.",
"mcpSuggestionFetchDesc": "Anthropic — fetch arbitrary HTTP(S) URLs as markdown.",
"mcpSuggestionGithubDesc": "Anthropic — issues, PRs, repo files. Needs a GitHub PAT in the env var.",
"mcpSuggestionPuppeteerDesc": "Anthropic — headless browser automation for screenshots / scraping.",
"mcpSuggestionPostgresDesc": "Anthropic — read-only SQL queries against a Postgres database. Edit the URL.",
"mcpSuggestionSqliteDesc": "Anthropic — query a local SQLite file. Edit the path.",
"mcpSuggestionBraveSearchDesc": "Anthropic — web search via Brave. API key required.",
"mcpSuggestionMemoryDesc": "Anthropic — persistent knowledge graph for an agent's memory.",
"mcpSuggestionTimeDesc": "Anthropic — current time + timezone conversion.",
"mcpServerEnLanguageBadge": "Server text in English — Studio shows it as supplied.",
"themePluginHeader": "Theme plugin (applies instantly)",
"themeApplied": "Theme applied: {name}",
"@themeApplied": {
"placeholders": {
"name": {"type": "String"}
}
},
"themePluginFailed": "Theme plugin could not load — keeping previous theme.",
"themePluginNone": "Built-in (no plugin)",
"themePluginHint": "Built-in and plugin tiles ship hand-curated palettes. The Custom tile derives a full Material 3 palette (primary, secondary, tertiary, surface, …) from one seed colour you pick — it's a complete theme, not a single-colour tweak.",
"themePluginEmpty": "No theme plugins installed. Open the Store and pick one in the studio-plugin category.",
"themePluginCustom": "Custom colour",
"themePluginCustomDialogTitle": "Custom theme — pick a seed colour",
"themePluginCustomHexLabel": "Hex colour",
"themePluginCustomPreview": "Live preview",
"themePluginCustomCancel": "Cancel",
"themePluginCustomApply": "Apply",
"settingsTitle": "Hub endpoint",
"settingsHost": "Host",
"settingsPort": "Port",
"settingsTls": "TLS",
"settingsSaveAndConnect": "Connect to endpoint",
"settingsLanguage": "Language",
"settingsLanguageHint": "App language. Affects every page; bilingual store entries also flip via this toggle.",
"settingsHubEndpointHint": "Where should Studio connect? Default is the local hub at 127.0.0.1:50051.",
"settingsTlsSubtitle": "https/grpc-secure",
"settingsPortError": "port must be 165535",
"channelsBlurb": "Switch hub channel (writes ~/.chain/current-channel and restarts the daemon). Connect just changes Studio's wire.",
"channelsActionsTooltip": "Channel actions",
"systemAiHeader": "SYSTEM AI",
"systemAiEnabled": "enabled",
"systemAiOff": "off",
"systemAiEdit": "Edit…",
"systemAiConfigure": "Configure…",
"systemAiOffBlurb": "Off — failure explanations on the audit page are disabled. Click Configure… to pick a provider (Ollama / OpenAI / LM Studio / vLLM / Custom). Operator config is rewritten in place; no daemon restart needed.",
"mcpServersCount": "{n} {n, plural, =1{server} other{servers}}",
"@mcpServersCount": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"mcpRediscoverTooltip": "Re-run discovery",
"mcpAddTooltip": "Add MCP server",
"mcpRemoveTooltip": "Remove server",
"mcpToolsCount": "{n} {n, plural, =1{tool} other{tools}}",
"@mcpToolsCount": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"n8nEndpointsCount": "{n} {n, plural, =1{endpoint} other{endpoints}}",
"@n8nEndpointsCount": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"n8nWorkflowsCount": "{n} {n, plural, =1{workflow} other{workflows}}",
"@n8nWorkflowsCount": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"n8nRediscoverTooltip": "Re-run discovery",
"n8nAddTooltip": "Add n8n endpoint",
"n8nRemoveTooltip": "Remove endpoint",
"addMcpTitle": "Add MCP server",
"addMcpIntro": "Tools the server advertises via tools/list appear in the Store as mcp.<name>.<tool> capabilities.",
"addMcpSuggestionsLabel": "Suggested servers — click to pre-fill",
"addMcpNameLabel": "Name (no dots)",
"addMcpNameHint": "filesystem",
"addMcpEndpointLabel": "Endpoint",
"addMcpEndpointHint": "http://127.0.0.1:3001/mcp",
"addMcpApiKeyLabel": "API key env var (optional)",
"addMcpApiKeyHint": "MCP_FILESYSTEM_TOKEN",
"addMcpNotesLabel": "Notes (optional)",
"addMcpAddButton": "Add + discover",
"addN8nTitle": "Add n8n endpoint",
"addN8nIntro": "Active workflows surface in the Store as n8n.<name>.<workflow_slug> capabilities.",
"addN8nNameLabel": "Name (no dots)",
"addN8nNameHint": "ops",
"addN8nBaseUrlLabel": "Base URL (without /api/v1)",
"addN8nBaseUrlHint": "https://n8n.example.com",
"addN8nApiKeyLabel": "API key env var (optional)",
"addN8nApiKeyHint": "N8N_OPS_KEY",
"addN8nNotesLabel": "Notes (optional)",
"addN8nAddButton": "Add + discover",
"addedMcpToast": "Added MCP server \"{name}\".",
"@addedMcpToast": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"addedN8nToast": "Added n8n endpoint \"{name}\".",
"@addedN8nToast": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"addFailedToast": "Add failed: {error}",
"@addFailedToast": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"removeFailedToast": "Remove failed: {error}",
"@removeFailedToast": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"refreshFailedToast": "Refresh failed: {error}",
"@refreshFailedToast": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"channelsHeader": "CHANNELS",
"channelsActive": "active",
"channelsRunning": "running",
"channelsStopped": "stopped",
"channelsConnect": "Connect Studio to this channel",
"channelsSwitch": "Make this the active channel",
"channelsEnableAutostart": "Enable autostart at login",
"channelsDisableAutostart": "Disable autostart",
"storeSearchHint": "Search modules — name, tagline, tag, capability…",
"storeAskHint": "What do you need? Try \"a module that reads tabular data\" or just type a keyword.",
"storeAskSubmit": "Search",
"storeAskAi": "Ask the AI",
"storeAskClear": "Clear question",
"storeAskAiThinking": "Looking through modules…",
"storeAskAiUnavailable": "Configure a System AI in Settings to ask questions in plain language.",
"storeAskNoMatches": "No matches yet — refine the question or browse the grid below.",
"storeAskAnswerLabel": "AI suggestion",
"storeAskAnswerWhy": "Why this matches",
"storeAskMatchPill": "match",
"storeFilterLabel": "Filter",
"storeFilterActiveCount": "{n} active",
"@storeFilterActiveCount": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"storeFilterReset": "Reset filters",
"storeFilterApply": "Done",
"storeFilterStatusGroup": "Status",
"storeFilterSourceGroup": "Source",
"storeFilterInstalledGroup": "Show only installed",
"storeFeatured": "FEATURED",
"storeFeaturedHint": "curated picks · click for details",
"storeNoMatches": "No matches",
"storeNoMatchesHint": "Adjust the filters or clear the search to see all entries.",
"storeClearFilters": "Clear filters",
"storeStatusAll": "All",
"storeStatusPublished": "stable",
"storeStatusAlpha": "experimental",
"storeStatusAlphaHelp": "Early version: it works, but it is still evolving and not cleared for regulated production use.",
"storeStatusPublishedHelp": "Cleared by the publisher for general use.",
"storeStatusPlannedHelp": "Announced, but not available yet.",
"storeStatusPlanned": "coming soon",
"storeInstalledOnly": "Installed",
"storeCategoryLabel": "Category",
"storeCategoryAll": "All categories",
"storeCategoryBridge": "Connectors",
"storeCategoryDebug": "Sample modules",
"storeCategoryText": "Text",
"storeCategoryLlm": "AI models",
"storeCategorySystem": "System",
"storeCategoryAuth": "Authentication",
"storeCategoryStorage": "Storage",
"storeCategoryChannel": "Channels",
"storeCategoryWeb": "Web",
"storeCategoryOrchestrator": "Orchestration",
"storeCategoryDocument": "Document",
"storeCatDocuments": "Documents",
"storeCatTextLanguage": "Text & Language",
"storeCatData": "Data & Formats",
"storeCatAiLlm": "AI & LLM",
"storeCatWebApi": "Web & APIs",
"storeCatAnalysisDomain": "Analysis & Domain",
"storeCatStudioThemes": "Studio & Themes",
"storeCatExamplesDev": "Examples & Dev",
"storeCatOther": "Other",
"storeSegmentModules": "Modules",
"storeSegmentStudio": "Studio & Themes",
"storeNResults": "{n} result{n, plural, =1{} other{s}}",
"@storeNResults": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"storeReloadTooltip": "Reload",
"storesManagerButton": "Add store",
"storesManagerTitle": "Module stores",
"storesManagerIntro": "The hub merges the modules from every store below into one index. Add a store's index URL to make its modules installable here.",
"storesManagerAddSection": "Add a store",
"storesManagerNameLabel": "Name",
"storesManagerUrlLabel": "Index URL (https:// or file://)",
"storesManagerAddAction": "Add store",
"storesManagerBundled": "{count} modules · bundled",
"@storesManagerBundled": {
"placeholders": {
"count": { "type": "int" }
}
},
"storesManagerModuleCount": "{count} modules",
"@storesManagerModuleCount": {
"placeholders": {
"count": { "type": "int" }
}
},
"storesManagerAddFailed": "Could not add store",
"storesManagerRemoveFailed": "Could not remove store",
"storesManagerSuggested": "Suggested stores",
"storesManagerAddShort": "Add",
"storesManagerPinnedKeyLabel": "Pin a signing key (PEM, optional)",
"storesManagerPinnedKeyHint": "Only modules signed with this key are accepted from this source. Paste the publisher's public key (PEM) — used instead of the built-in vendor key.",
"storesManagerNotAvailable": "Not available yet",
"storesManagerNotAvailableHint": "The provider hasn't published this store index yet. It will become installable once they do.",
"storesSuggestedReclaimDesc": "Recl∆Im — modules for law & duty reform-mapping",
"storeTodayBadge": "TODAY",
"storeFeaturedBadge": "FEATURED",
"storeTodayDeck": "From the Ch∆In editor",
"storeTodayDismissTooltip": "Hide for this session",
"storePillInstalled": "installed",
"storePillUpdate": "update",
"storeUpdateButton": "Update to {version}",
"@storeUpdateButton": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"storeUpdateTooltip": "Installed {installed} — store has v{best}",
"@storeUpdateTooltip": {
"placeholders": {
"installed": {
"type": "String"
},
"best": {
"type": "String"
}
}
},
"storeNoTagline": "(no tagline)",
"storeUninstallTitle": "Uninstall module?",
"storeUninstallBody": "Removes {name} from this hub. Flows that reference it will fail at the next run.",
"@storeUninstallBody": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"storeInstalledToast": "{name} v{version} installed.",
"@storeInstalledToast": {
"placeholders": {
"name": {
"type": "String"
},
"version": {
"type": "String"
}
}
},
"storeInstallFailedToast": "Install failed: {error}",
"@storeInstallFailedToast": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"storeUninstalledToast": "{name} v{version} uninstalled.",
"@storeUninstalledToast": {
"placeholders": {
"name": {
"type": "String"
},
"version": {
"type": "String"
}
}
},
"storeUninstallFailedToast": "Uninstall failed: {error}",
"@storeUninstallFailedToast": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"storeOpenBrowserFailed": "Could not open browser: {error}",
"@storeOpenBrowserFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"storeSectionTags": "Tags",
"storeSectionRequiredCapabilities": "Required capabilities",
"storeSectionRequiredHostServices": "Required host services",
"storeSectionScreenshots": "Screenshots",
"storeSectionDocumentation": "Documentation",
"storeSectionSource": "Source",
"storeSectionPermissions": "Declared permissions",
"storeSectionDirectory": "Module directory",
"storeSectionPermissionsNone": "(none — pure-computation module)",
"storeInstallingButton": "Installing…",
"storeNotInstallable": "Not installable",
"storeNotInstallableTooltip": "Status \"{status}\" — install path not yet wired.",
"@storeNotInstallableTooltip": {
"placeholders": {
"status": {
"type": "String"
}
}
},
"storeInstallProgressTitle": "Installing {name}",
"@storeInstallProgressTitle": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"storeInstallProgressBody": "Fetching, verifying, unpacking…",
"storeLoadDocs": "Load documentation",
"storeDocsHint": "README rendered inline; uses the hub's registry token when needed.",
"storeDocsFetching": "Fetching README…",
"storeOpenRepoButton": "Open repository in browser",
"storeDocsErrorNotFound": "This module is not in the hub's store index.",
"storeDocsErrorNoDocs": "No repository URL is recorded for this module.",
"storeDocsErrorAuth": "The registry requires authentication to fetch this README. Set CHAIN_REGISTRY_TOKEN in the daemon's environment and restart the hub.",
"storeDocsErrorNetwork": "Network error while fetching the README. {detail}",
"@storeDocsErrorNetwork": {
"placeholders": {
"detail": {
"type": "String"
}
}
},
"storeDocsErrorParse": "README is not valid UTF-8.",
"storeDocsErrorGeneric": "Could not load README.",
"storeSourceLabel": "Source",
"storeSourceAll": "All sources",
"storeSourceNative": "Native",
"storeSourceMcp": "MCP",
"storeSourceN8n": "n8n",
"storeProvenanceNative": "native",
"storeProvenanceMcp": "mcp · {provider}",
"@storeProvenanceMcp": {
"placeholders": {
"provider": {
"type": "String"
}
}
},
"storeProvenanceN8n": "n8n · {provider}",
"@storeProvenanceN8n": {
"placeholders": {
"provider": {
"type": "String"
}
}
},
"storeRecommendedTitle": "Add a public source — one click",
"storeRecommendedBody": "Curated MCP servers reachable over HTTPS. No subprocess, no API key, no Node. Federated capabilities appear in the store immediately.",
"storeRecommendedAddTooltip": "Add and discover",
"storeRecommendedAdding": "Adding…",
"storeRecommendedDeepWikiTagline": "GitHub repo documentation search (AI-powered)",
"storeRecommendedSemgrepTagline": "Security scanning for code vulnerabilities",
"storeProviderAddedToast": "Added {name} — {n} federated {n, plural, =1{capability} other{capabilities}}.",
"@storeProviderAddedToast": {
"placeholders": {
"name": {
"type": "String"
},
"n": {
"type": "int"
}
}
},
"storeProviderAddedZeroToast": "{name} registered, but the server returned no capabilities yet. Open Settings → MCP Clients to retry discovery or check the server.",
"@storeProviderAddedZeroToast": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"storeProviderAddFailed": "Could not add {name}: {error}",
"@storeProviderAddFailed": {
"placeholders": {
"name": {
"type": "String"
},
"error": {
"type": "String"
}
}
},
"auditTitle": "Audit",
"auditNoEvents": "No events yet",
"auditNoEventsHint": "Run a flow to populate the audit stream.\nEvents appear here within seconds.",
"auditFilterAll": "All",
"auditFilterFlow": "flow",
"auditFilterStep": "step",
"auditFilterModule": "module",
"auditFilterTooltip": "Filter events",
"auditClearLogTooltip": "Clear log (local/dev channels only)",
"auditMoreTooltip": "More actions",
"auditSearchHint": "Search events (flow, step, module, error text …)",
"auditExportAction": "Export current view as JSONL …",
"auditExportAllAction": "Export full log as JSONL …",
"auditExportAllNothing": "The log is empty — nothing to export.",
"auditExportNothing": "No events in the current view — nothing to export.",
"auditExportSaved": "Exported {n} events to {path}",
"@auditExportSaved": {"placeholders": {"n": {"type": "int"}, "path": {"type": "String"}}},
"auditDevResetAction": "Development reset: clear log … (local/dev only)",
"auditClearedToast": "Cleared {n} events on channel \"{channel}\". Chain reseeded with marker.",
"@auditClearedToast": {
"placeholders": {
"n": {
"type": "int"
},
"channel": {
"type": "String"
}
}
},
"auditClearFailed": "Clear failed: {detail}",
"@auditClearFailed": {
"placeholders": {
"detail": {
"type": "String"
}
}
},
"auditExplain": "Explain",
"auditReask": "Re-ask",
"auditAsking": "Asking…",
"auditSystemAi": "SYSTEM AI",
"auditCachedPill": "cached",
"auditOriginalLatency": "orig {ms} ms",
"@auditOriginalLatency": {
"placeholders": {
"ms": {
"type": "int"
}
}
},
"auditLatency": "{ms} ms",
"@auditLatency": {
"placeholders": {
"ms": {
"type": "int"
}
}
},
"auditRegenerateTooltip": "Regenerate — skip cache, ask the model again",
"auditLiveStatus": "live · polling 2s · {n} {n, plural, =1{event} other{events}}",
"@auditLiveStatus": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"auditDisconnected": "disconnected · {error}",
"@auditDisconnected": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"auditHashChainVerified": "hash chain verified",
"auditDetailHeader": "DETAIL",
"auditAskingFull": "Asking the configured System AI…",
"auditFixLabel": "FIX",
"auditCachedTooltipKnown": "Served from the local cache. Originally generated on {at}{hits}.",
"@auditCachedTooltipKnown": {
"placeholders": {
"at": {
"type": "String"
},
"hits": {
"type": "String"
}
}
},
"auditCachedTooltipUnknown": "Served from the local cache. Originally generated at unknown time{hits}.",
"@auditCachedTooltipUnknown": {
"placeholders": {
"hits": {
"type": "String"
}
}
},
"auditCachedTooltipHits": " · {n} hits",
"@auditCachedTooltipHits": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"auditConfigureSystemAi": "Configure System AI in Settings (Cmd+,)",
"auditClearDialogTitle": "Clear audit log?",
"auditClearDialogBody": "Wipes every audit event on the active channel and seeds a fresh chain.reset marker carrying reviewer + reason. Refused on beta / production. Irreversible.",
"auditClearReviewerLabel": "Reviewer",
"auditClearReasonLabel": "Reason (recorded in chain.reset marker)",
"auditClearReasonHelper": "Required — auditors will read this.",
"auditClearLogButton": "Clear log",
"modulesTitle": "Modules",
"modulesNoneTitle": "No modules yet",
"modulesNoneHint": "Run chain install <capability-name> or check ~/.chain/modules/.",
"modulesReloadTooltip": "Reload",
"modulesRecentActivity": "RECENT ACTIVITY",
"modulesRecentActivityHint": "last {n} install/uninstall events from the audit log",
"@modulesRecentActivityHint": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"modulesActivityInstalled": "installed",
"modulesActivityUninstalled": "uninstalled",
"modulesCapabilitiesLabel": "Capabilities",
"modulesUninstallTitle": "Uninstall module?",
"modulesUninstallBody": "Removes {name} v{version} from this hub. Flows that reference it will fail at the next run. A module.uninstalled audit event is recorded.",
"@modulesUninstallBody": {
"placeholders": {
"name": {
"type": "String"
},
"version": {
"type": "String"
}
}
},
"modulesUninstalledToast": "Uninstalled {name} v{version}.",
"@modulesUninstalledToast": {
"placeholders": {
"name": {
"type": "String"
},
"version": {
"type": "String"
}
}
},
"modulesUninstallFailed": "Uninstall failed: {error}",
"@modulesUninstallFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"modulesUninstalling": "Uninstalling…",
"moduleSheetFailedToLoad": "Failed to load: {error}",
"@moduleSheetFailedToLoad": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"moduleSheetCapabilities": "Capabilities",
"moduleSheetPermissions": "Declared permissions",
"moduleSheetNoPermissions": "(none — pure-computation module)",
"flowsTitle": "Flows",
"flowsReloadTooltip": "Reload",
"flowsNoneTitle": "No saved flows",
"flowsNoneHint": "Save a flow with chain admin flows save <name> <flow.yaml> and it shows up here.",
"flowsRunDialogTitle": "Run {name}",
"@flowsRunDialogTitle": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"flowsRunDialogBody": "One field per declared input. Pick a file for bytes-shaped inputs; type plain text for the rest. The Run button enables when every required input is set.",
"flowsLoadingDefinition": "Loading inputs…",
"flowsDefinitionFailed": "Could not load flow definition",
"flowsNoInputs": "This flow declares no inputs. Click Run to start.",
"flowsTypeBytesPick": "Choose file…",
"flowsTypeBytesChange": "Change file",
"flowsTypeBytesNoFile": "No file selected",
"flowsTypeBytesSize": "{n} bytes",
"@flowsTypeBytesSize": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"flowsRunErrorTitle": "Flow run failed",
"flowsFileReadFailed": "Could not read \"{path}\": {error}",
"@flowsFileReadFailed": {
"placeholders": {
"path": {
"type": "String"
},
"error": {
"type": "String"
}
}
},
"flowsMissingModulesLabel": "Needs:",
"flowsRunDisabledTooltip": "Install the missing modules first.",
"flowsInstallAllButton": "Install all ({n})",
"@flowsInstallAllButton": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"flowsInstallPillTooltip": "Click to install",
"flowsInstallDepsTitle": "Install dependencies",
"flowsInstallDepsBody": "Walking through the missing modules in order. Existing installs are left alone.",
"flowsInstallStatusPending": "Pending",
"flowsInstallStatusInstalling": "Installing…",
"flowsInstallStatusDone": "Installed v{version}",
"@flowsInstallStatusDone": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"flowsInstallStatusFailed": "Failed",
"flowsInstallStatusFailedDetail": "{error}",
"@flowsInstallStatusFailedDetail": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"flowsInstallDepsAllDone": "All dependencies installed.",
"flowsInstallDepsAnyFailed": "{ok} installed, {failed} failed.",
"@flowsInstallDepsAnyFailed": {
"placeholders": {
"ok": {
"type": "int"
},
"failed": {
"type": "int"
}
}
},
"flowsInstallAuthWallButton": "Add registry token",
"flowsOpenInEditorTooltip": "Open in Studio's flow editor",
"flowsOpenInEditorFailed": "Could not open file: {error}",
"@flowsOpenInEditorFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"registryCredentialsHeader": "REGISTRY CREDENTIALS",
"registryCredentialsBlurb": "Token used to download .chain modules from a registry behind a signin wall (Forgejo, GitHub-private). Stored at ~/.chain/registry-token, mode 0600. The CHAIN_REGISTRY_TOKEN env var still wins when set.",
"registryTokenStatusConfigured": "Configured ({chars} chars)",
"@registryTokenStatusConfigured": {
"placeholders": {
"chars": {
"type": "int"
}
}
},
"registryTokenStatusNotSet": "Not set",
"registryTokenFieldLabel": "Token",
"registryTokenFieldHint": "Paste your Forgejo or GitHub personal access token",
"registryTokenSaveButton": "Save",
"registryTokenClearButton": "Clear",
"registryTokenStorageHint": "Saved locally to ~/.chain/registry-token. Never sent to a remote service.",
"registryTokenSavedToast": "Registry token saved.",
"registryTokenClearedToast": "Registry token cleared.",
"registryTokenSaveFailedToast": "Could not save: {error}",
"@registryTokenSaveFailedToast": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"authPolicyHeader": "HUB ACCESS POLICY",
"authPolicyBlurb": "How the hub checks incoming calls: the active validator, the tokens and their scope grants. Secrets stay in environment variables — only their names appear here.",
"authPolicyValidatorStatic": "Validator: static token list",
"authPolicyValidatorJwt": "Validator: JWT (RS256) via an external identity provider",
"authPolicyAnonymous": "No tokens configured — the hub accepts anonymous calls. Fine for local work; configure tokens in ~/.chain/config.yaml for production.",
"authPolicyReloadRequired": "The config file (or an environment variable) changed after loading — the hub still enforces the previous state. Use “Reload” below to apply the change.",
"authPolicyNeedsAdmin": "This view needs a token with the admin scope. Store it above under “Hub authentication” and reload.",
"authPolicyHubTooOld": "The connected hub does not know this view yet — it is older than Studio. Update the hub (chain update apply) and reload.",
"authPolicyRetry": "Retry",
"authPolicyReload": "Reload tokens",
"authPolicyReloadDone": "Reloaded — {n} tokens active.",
"@authPolicyReloadDone": {"placeholders": {"n": {"type": "int"}}},
"authPolicyEditHint": "The policy is edited in ~/.chain/config.yaml (auth: section). After a change or token rotation, reload here — the hub applies it without a restart.",
"authPolicyEnvSet": "Environment variable {env} is set",
"@authPolicyEnvSet": {"placeholders": {"env": {"type": "String"}}},
"authPolicyEnvMissing": "Environment variable {env} is MISSING — the token is unusable",
"@authPolicyEnvMissing": {"placeholders": {"env": {"type": "String"}}},
"authPolicyRateLimit": "{n}/min",
"@authPolicyRateLimit": {"placeholders": {"n": {"type": "int"}}},
"authPolicyJwtKeySource": "Key source",
"authPolicyJwtAudience": "Audience (aud)",
"authPolicyJwtIssuer": "Issuer (iss)",
"authPolicyJwtScopeClaim": "Scope claim",
"authPolicyNotChecked": "not checked",
"hubAuthTokenHeader": "HUB AUTHENTICATION",
"hubAuthTokenBlurb": "Bearer token used to authenticate Studio against a hub that has auth.tokens: configured (RBAC Level 2). Stored at ~/.chain/hub-auth-token, mode 0600. Studio sends it as Authorization: Bearer on every gRPC call.",
"hubAuthTokenStatusConfigured": "Configured ({chars} chars)",
"@hubAuthTokenStatusConfigured": {
"placeholders": {
"chars": {
"type": "int"
}
}
},
"hubAuthTokenStatusNotSet": "Not set (anonymous)",
"hubAuthTokenFieldLabel": "Token",
"hubAuthTokenFieldHint": "Paste a token from the hub operator's auth.tokens entry",
"hubAuthTokenSaveButton": "Save",
"hubAuthTokenClearButton": "Clear",
"hubAuthTokenStorageHint": "Saved locally to ~/.chain/hub-auth-token. Studio reconnects after save so the new token takes effect immediately.",
"hubAuthTokenSavedToast": "Hub auth token saved.",
"hubAuthTokenClearedToast": "Hub auth token cleared.",
"hubAuthTokenSaveFailedToast": "Could not save: {error}",
"@hubAuthTokenSaveFailedToast": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"storeAdvisoryVersionTooltip": "Federated upstream service — version is advisory; the upstream may break compatibility without bumping it.",
"uninstallVersionPickerTitle": "Pick a version to uninstall",
"uninstallVersionPickerBody": "Several versions of {module} are installed side-by-side. Select the exact version to remove — the others stay in place.",
"@uninstallVersionPickerBody": {
"placeholders": {
"module": {
"type": "String"
}
}
},
"uninstallVersionPickerContinue": "Continue",
"defaultScopeHeader": "DEFAULT SCOPE",
"defaultScopeBlurb": "Ordered list of publisher segments the hub consults when a flow names a capability without an explicit <provider>/ prefix. First match wins — promote the segments your team uses most to the top. Catalog-known publishers appear as chips; arbitrary entries are accepted for private segments.",
"defaultScopeAddLabel": "Add publisher segment",
"defaultScopeAddHint": "e.g. acme.team",
"defaultScopeAddButton": "Add",
"defaultScopeSuggestions": "Catalog suggestions:",
"defaultScopeSavedToast": "Default scope updated.",
"defaultScopeLoadFailed": "Could not load default scope.",
"defaultScopeNonEmptyError": "Default scope cannot be empty — keep at least one segment.",
"maintenanceHeader": "HUB MAINTENANCE",
"maintenanceResetBlurb": "Wipe operator state and start over with a clean hub. Stops every running daemon, atomically backs ~/.chain/ up, then recreates it with the binary, channel state, MCP / n8n / system-AI config, and registry token preserved. Restore by moving the backup directory back.",
"maintenanceKeepModulesTitle": "Keep installed modules",
"maintenanceKeepModulesSubtitle": "Default behaviour wipes ~/.chain/modules/ so a fresh install can verify the module-fetch path end-to-end.",
"maintenanceKeepDataTitle": "Keep audit log + saved flows",
"maintenanceKeepDataSubtitle": "Default behaviour wipes ~/.chain/data/ so the audit chain restarts from a fresh genesis and the bundled sample flows re-import on first daemon start.",
"maintenanceResetButton": "Reset hub state",
"maintenanceResetInProgress": "Resetting…",
"maintenanceResetConfirmTitle": "Reset hub state?",
"maintenanceResetConfirmBody": "This stops every daemon, moves ~/.chain/ to a timestamped backup, and starts fresh. The backup is fully restorable. Continue?",
"maintenanceResetConfirmButton": "Reset",
"welcomeChecklistAllSetTitle": "You're set up.",
"welcomeChecklistAllSetBody": "Three threads to pull on next:",
"welcomeChecklistNextAuditTitle": "Read the audit log",
"welcomeChecklistNextAuditBody": "Every install, flow run, and approval lives in the hash-chained log. Open the Audit tab to see what your hub has been up to.",
"welcomeChecklistNextAuditButton": "Open Audit",
"welcomeChecklistNextTodayTitle": "Set up the daily Today story",
"welcomeChecklistNextTodayBody": "Run tools/today/propose.sh on a cron and the editorial card on the store auto-fills with operator-curated narratives.",
"welcomeChecklistNextTodayButton": "Open Today docs",
"welcomeChecklistNextModuleTitle": "Build your own module",
"welcomeChecklistNextModuleBody": "Generate a Rust+WASM scaffold with chain new module <name>. The module-sdk handles the WIT plumbing; you write a typed invoke.",
"welcomeChecklistNextModuleButton": "Read the docs",
"auditGroupToday": "TODAY",
"auditGroupYesterday": "YESTERDAY",
"auditGroupThisWeek": "EARLIER THIS WEEK",
"auditGroupOlder": "OLDER",
"auditEventViewFlowRun": "View flow run",
"auditFlowRunDialogTitle": "Flow run · {flow}",
"@auditFlowRunDialogTitle": {
"placeholders": {
"flow": {
"type": "String"
}
}
},
"auditFlowRunDialogSubtitle": "{n} {n, plural, =1{event} other{events}} for execution {execution}",
"@auditFlowRunDialogSubtitle": {
"placeholders": {
"n": {
"type": "int"
},
"execution": {
"type": "String"
}
}
},
"approvalsSelectAll": "Select all",
"approvalsClearSelection": "Clear",
"approvalsBatchSelected": "{n} selected",
"@approvalsBatchSelected": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"approvalsBatchApprove": "Approve all",
"approvalsBatchReject": "Reject all",
"approvalsBatchApproveDoneToast": "{n} approvals approved.",
"@approvalsBatchApproveDoneToast": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"approvalsBatchRejectDoneToast": "{n} approvals rejected.",
"@approvalsBatchRejectDoneToast": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"approvalsBatchPartialFailure": "{ok} done, {failed} failed.",
"@approvalsBatchPartialFailure": {
"placeholders": {
"ok": {
"type": "int"
},
"failed": {
"type": "int"
}
}
},
"flowsRunButton": "Run",
"flowsRunningTitle": "Running {name}",
"@flowsRunningTitle": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"flowsResultTitle": "{name} — result",
"@flowsResultTitle": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"flowsErrorTitle": "{name} — failed",
"@flowsErrorTitle": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"flowsRunning": "Flow running…",
"flowsNoOutputs": "Flow completed with no declared outputs.",
"errGeneric": "Something went wrong.",
"errInvalidArgument": "Invalid input.",
"errInvalidArgumentHint": "Check the form values and try again.",
"errNotFound": "Not found.",
"errNotFoundHint": "The item you asked for isn't here — it may have been removed or never existed.",
"errAlreadyExists": "Already exists.",
"errPermissionDenied": "Permission denied.",
"errPermissionDeniedHint": "The hub's operator policy blocks this action. Check ~/.chain/config.yaml.",
"errFailedPrecondition": "Setup issue blocked this.",
"errFailedPreconditionHint": "The hub couldn't proceed because something it needs isn't ready. The detail below explains what.",
"errInternal": "Unexpected internal error.",
"errInternalHint": "Check the hub logs at ~/.chain/logs/. If this repeats, please report it.",
"errUnavailable": "Hub not reachable.",
"errUnavailableHint": "Make sure chain serve (or chain daemon start) is running and the daemon endpoint matches Studio's settings.",
"errUnauthenticated": "Authentication required.",
"errUnauthenticatedHint": "Set CHAIN_REGISTRY_TOKEN or sign in through Settings before retrying.",
"errCopyDetail": "Copy detail",
"errDetailCopied": "Detail copied to clipboard.",
"flowsOutputUnknown": "Output payload variant not recognised.",
"flowsOutputBytesUnknownMime": "binary",
"flowsOutputSaveAs": "Save as…",
"flowsOutputSaveAsTitle": "Save flow output",
"flowsOutputSavedAt": "Saved to {path}",
"@flowsOutputSavedAt": {
"placeholders": {
"path": {
"type": "String"
}
}
},
"flowsOutputSaveFailed": "Save failed: {error}",
"@flowsOutputSaveFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"flowsOutputOpen": "Open",
"flowsOutputOpenFailed": "Open failed: {error}",
"@flowsOutputOpenFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"approvalsTitle": "Approvals",
"approvalsTabPending": "Pending",
"approvalsTabHistory": "History",
"approvalsInboxZero": "Inbox zero",
"approvalsInboxHint": "All caught up. When a flow asks for a human approval, the request appears here automatically.",
"approvalsReloadTooltip": "Reload",
"approvalsPillPending": "pending",
"approvalsPillApproved": "approved",
"approvalsPillRejected": "rejected",
"approvalsPillExpired": "expired",
"approvalsPayloadPreview": "DATA TO REVIEW",
"approvalsNoPayload": "No data was attached for review. The flow's approval step chooses what to show via its \"show:\" field — set it to surface the data behind this decision.",
"approvalsNoDataConfirmTitle": "Approve without review data?",
"approvalsNoDataConfirmBody": "This flow deliberately attached no review data (no \"show:\" on its approval step). You can still approve — but you would be deciding without seeing the data behind this decision.",
"approvalsNoDataConfirmAction": "Approve anyway",
"approvalsRequestFallback": "Approval required for this step",
"approvalsFlowStepMeta": "Flow: {flow} · Step: {step}",
"@approvalsFlowStepMeta": {
"placeholders": {
"flow": { "type": "String" },
"step": { "type": "String" }
}
},
"approvalsApproveButton": "Approve",
"approvalsRejectButton": "Reject",
"approvalsRejectDialogTitle": "Reject approval",
"approvalsRejectReasonLabel": "Reason (recorded in audit log)",
"approvalsApprovedToast": "approved · {flow} {step}",
"@approvalsApprovedToast": {
"placeholders": {
"flow": {
"type": "String"
},
"step": {
"type": "String"
}
}
},
"approvalsRejectedToast": "rejected · {flow} {step}",
"@approvalsRejectedToast": {
"placeholders": {
"flow": {
"type": "String"
},
"step": {
"type": "String"
}
}
},
"approvalsApproveFailed": "approve failed: {error}",
"@approvalsApproveFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"approvalsRejectFailed": "reject failed: {error}",
"@approvalsRejectFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"approvalsHistoryEmpty": "No history yet",
"approvalsHistoryEmptyHint": "Decided approvals (approved / rejected / expired) appear here.\nThe audit log keeps the full hash-chained record.",
"approvalsDialogDecided": "decided",
"approvalsDialogCreated": "created",
"approvalsDialogReason": "reason",
"approvalsDialogPrompt": "PROMPT",
"approvalsExpiresIn": "{minutes}m",
"@approvalsExpiresIn": {
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"approvalsExpiresInHours": "{hours}h",
"@approvalsExpiresInHours": {
"placeholders": {
"hours": {
"type": "int"
}
}
},
"doctorTitle": "Doctor",
"doctorSummaryModules": "Modules",
"doctorSummaryApprovals": "Approvals",
"doctorSummaryAudit": "Audit",
"doctorSummaryServices": "Services",
"doctorSummaryCapabilities": "{n, plural, =1{1 capability} other{{n} capabilities}}",
"@doctorSummaryCapabilities": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"doctorSummaryPending": "pending",
"doctorSummaryChain": "{verified} of {total} events verified",
"@doctorSummaryChain": {
"placeholders": {
"verified": {
"type": "int"
},
"total": {
"type": "int"
}
}
},
"doctorSummaryDeclared": "declared",
"doctorOllamaSuggest": "The system AI uses Ollama at {endpoint} — declare it as a host service so modules and the doctor know it?",
"@doctorOllamaSuggest": {"placeholders": {"endpoint": {"type": "String"}}},
"doctorOllamaDeclareButton": "Declare as host service",
"doctorOllamaDeclared": "Declared as host service \"ollama\" — takes effect after a daemon restart (button further down this page).",
"updateHintBanner": "Version {latest} is available for the hub ({local}).",
"@updateHintBanner": {"placeholders": {"local": {"type": "String"}, "latest": {"type": "String"}}},
"updateHintOpenDoctor": "Open Doctor",
"updateHintDismiss": "Later",
"svcExposureLoopback": "local only",
"svcExposurePrivate": "private network",
"svcExposurePublic": "publicly reachable",
"svcExposureUnknown": "reach unknown",
"svcExposurePublicHint": "This service endpoint sits on a public address — make sure it is protected (TLS, auth, firewall).",
"svcExposureUnknownHint": "Hostname instead of an IP address — the hub deliberately does not resolve names to classify. Check yourself where the name resolves.",
"doctorLinkStore": "Open the store",
"doctorLinkApprovals": "Open approvals",
"doctorLinkAudit": "Open the audit log",
"doctorLinkConfig": "View the configuration",
"doctorLinkReleaseNotes": "Open the release notes in the browser",
"doctorModulesPanelSummary": "{n, plural, =1{1 module} other{{n} modules}} · {m, plural, =1{1 capability} other{{m} capabilities}}",
"@doctorModulesPanelSummary": {
"placeholders": {
"n": {
"type": "int"
},
"m": {
"type": "int"
}
}
},
"doctorApprovalsNone": "No pending approvals",
"doctorApprovalsCount": "{n, plural, =1{1 approval awaiting review} other{{n} approvals awaiting review}}",
"@doctorApprovalsCount": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"doctorApprovalsAttentionPill": "attention",
"doctorServicesEmpty": "No host services declared",
"doctorServicesEmptyHint": "add to ~/.chain/config.yaml under services:",
"doctorPillLoaded": "loaded",
"doctorPillEmpty": "empty",
"doctorRecheckTooltip": "Re-check",
"doctorEventLogSection": "Event log",
"doctorModulesApprovalsSection": "Modules & approvals",
"doctorHostServicesSection": "Host services",
"doctorDaemonFilesSection": "Daemon files",
"doctorDaemonControlSection": "Daemon control",
"doctorChainIntact": "Hash chain intact",
"doctorChainIntactDetail": "{n} {n, plural, =1{event} other{events}} · linkage verified end-to-end",
"@doctorChainIntactDetail": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"doctorChainTampered": "Tampering detected",
"doctorChainTamperedDetail": "{verified} of {total} verified before mismatch at {id}",
"@doctorChainTamperedDetail": {
"placeholders": {
"verified": {
"type": "int"
},
"total": {
"type": "int"
},
"id": {
"type": "String"
}
}
},
"doctorChainPillOk": "Hash chain verified",
"doctorChainPillTamper": "TAMPER",
"doctorVerifyNow": "Verify now",
"doctorRestart": "Restart",
"doctorStart": "Start",
"doctorStop": "Stop",
"doctorStatusAction": "Status",
"doctorRunningOn": "Running on {name}: {endpoint}",
"@doctorRunningOn": {
"placeholders": {
"name": {
"type": "String"
},
"endpoint": {
"type": "String"
}
}
},
"doctorStoppedOn": "{name} daemon stopped",
"@doctorStoppedOn": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"doctorStatusUnknown": "Daemon status: …",
"doctorPillRunning": "running",
"doctorPillStopped": "stopped",
"doctorDaemonControlHint": "Studio shells out to the platform binary — mirrors chain daemon … exactly so the CLI and UI stay in lockstep.",
"doctorDaemonControlWorking": "Working…",
"doctorConnLine": "Connection: {endpoint} · {transport} · {auth}",
"@doctorConnLine": {
"placeholders": {
"endpoint": {"type": "String"},
"transport": {"type": "String"},
"auth": {"type": "String"}
}
},
"doctorConnTls": "TLS-encrypted",
"doctorConnPlainLocal": "unencrypted (stays on this machine)",
"doctorConnPlainRemote": "unencrypted",
"doctorConnToken": "token configured ({count} characters)",
"@doctorConnToken": {
"placeholders": {
"count": {"type": "int"}
}
},
"doctorConnAnonymous": "no token (anonymous)",
"doctorDbVolatileWarning": "The audit database is stored in a temporary folder the operating system may clean up at any time. For real evidence, move the hub's data directory to a permanent location.",
"doctorPathLog": "Log",
"doctorPathConfig": "Config",
"doctorPathDb": "Audit DB",
"doctorPathModules": "Modules dir",
"doctorPathFlows": "Flows dir",
"doctorPathPid": "PID file",
"doctorPathsEmpty": "Daemon did not report file paths. Update the running hub via chain daemon restart.",
"doctorOpenError": "Could not open: {detail}",
"@doctorOpenError": {
"placeholders": {
"detail": {
"type": "String"
}
}
},
"doctorUpdateAvailable": "Update available — {version}",
"@doctorUpdateAvailable": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"doctorUpdateBody": "Channel {channel} now offers {version}. Apply via the button — Studio shells out to chain update apply --channel {channel}.",
"@doctorUpdateBody": {
"placeholders": {
"channel": {
"type": "String"
},
"version": {
"type": "String"
}
}
},
"doctorUpdateUnreachable": "Release host unreachable",
"doctorUpdateUnreachableBody": "Could not contact the release feed for {channel}.",
"@doctorUpdateUnreachableBody": {
"placeholders": {
"channel": {
"type": "String"
}
}
},
"doctorReleaseNotes": "notes: {url}",
"@doctorReleaseNotes": {
"placeholders": {
"url": {
"type": "String"
}
}
},
"doctorPillNew": "new",
"doctorPillOffline": "offline",
"doctorApplyUpdate": "Apply update",
"doctorApplying": "Applying…",
"doctorApplyDone": "Update applied. Restart Studio to see the new daemon version.",
"mcpHeader": "MCP CLIENTS",
"mcpHint": "External MCP servers federate their tools as mcp.<server>.<tool> capabilities. Configure once, see them in the Store.",
"mcpEmpty": "No MCP servers configured. Click + to add one.",
"n8nHeader": "N8N ENDPOINTS",
"n8nHint": "Active n8n workflows surface as n8n.<endpoint>.<slug> capabilities. Configure once, see them in the Store.",
"n8nEmpty": "No n8n endpoints configured. Click + to add one.",
"hubUnreachable": "Hub unreachable",
"hubViewTooOldTitle": "This view needs a newer hub version",
"hubViewTooOldHint": "The hub is connected, but its version does not know this view yet. Update the hub (Doctor → Update) and the content will appear here.",
"hubViewLoadFailedTitle": "This view could not be loaded",
"hubUnreachableHint": "Start the hub with chain serve.",
"languageEnglish": "English",
"languageGerman": "Deutsch",
"searchHint": "Jump anywhere — modules, store, flows, pages…",
"searchIndexing": "Indexing…",
"searchNoMatches": "No matches.",
"searchHintNavigate": "↑↓ navigate",
"searchHintOpen": "enter open",
"searchHintClose": "esc close",
"searchGroupPages": "Pages",
"searchGroupModules": "Modules",
"searchGroupStore": "Store",
"searchGroupFlows": "Flows",
"searchSettingsLabel": "Settings",
"searchPageHint": "page · ⌘{n}",
"@searchPageHint": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"searchSettingsHint": "hub endpoint, channels, system AI · ⌘;",
"searchInstalledModuleHint": "installed module · v{version}",
"@searchInstalledModuleHint": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"searchStoreUncategorized": "uncategorized",
"searchStoreHintWithTagline": "store · {tagline}",
"@searchStoreHintWithTagline": {
"placeholders": {
"tagline": {
"type": "String"
}
}
},
"searchStoreHintWithCategory": "store · {category}",
"@searchStoreHintWithCategory": {
"placeholders": {
"category": {
"type": "String"
}
}
},
"searchSavedFlowHint": "saved flow",
"systemAiTitle": "System AI",
"systemAiIntro": "The hub-internal LLM the platform itself uses for inline failure explanations and operator help. Off by default; configure here. See docs/architecture/system-ai.md for what crosses the wire.",
"systemAiProviderLabel": "Provider",
"systemAiEndpointLabel": "Endpoint URL (up to /v1)",
"systemAiApiKeyRequired": "API key env var (required)",
"systemAiApiKeyOptional": "API key env var (optional)",
"systemAiApiKeyDisclaimer": "Studio never reads or stores the key value — only its env-var name. The hub reads ${name} at request time.",
"@systemAiApiKeyDisclaimer": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"systemAiTestConnection": "Test connection",
"systemAiTesting": "Testing…",
"systemAiSave": "Save",
"systemAiPrivacyHeader": "PRIVACY MODE",
"systemAiPrivacyOffLabel": "Off",
"systemAiPrivacyOffDesc": "Feature disabled. No requests leave the hub.",
"systemAiPrivacyRedactedLabel": "Redacted",
"systemAiPrivacyRedactedDesc": "Only event_type / error / module names. KRITIS-friendly default.",
"systemAiPrivacyFullLabel": "Full",
"systemAiPrivacyFullDesc": "Includes the audit detail JSON (hash-only — no raw payloads).",
"systemAiConnectionOk": "Connection ok",
"systemAiConnectionFailed": "Connection failed",
"systemAiReplyPrefix": "Reply: {text}",
"@systemAiReplyPrefix": {
"placeholders": {
"text": {
"type": "String"
}
}
},
"systemAiModelLabel": "Model (required)",
"systemAiModelHintFallback": "model identifier the provider expects",
"systemAiModelHelperBase": "Required: pick from the list (Refresh) or type one.",
"systemAiModelHelperOllama": "Required: pick from the list (Refresh) or type one. Use Pull to download from Ollama.",
"systemAiRefresh": "Refresh",
"systemAiPull": "Pull",
"systemAiPulling": "Pulling…",
"systemAiCouldNotListModels": "Could not list models: {error}",
"@systemAiCouldNotListModels": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"systemAiNoModelsOllama": "No models on the Ollama server yet. Type one above and click Pull.",
"systemAiNoModelsGeneric": "Provider returned no models.",
"systemAiSuitabilityRecommended": "recommended",
"systemAiSuitabilityBalanced": "balanced",
"systemAiSuitabilitySmall": "small — quality may be limited",
"systemAiSuitabilityLarge": "large — slower",
"systemAiSuitabilityHuge": "huge — likely too slow on a laptop",
"systemAiSuitabilityUnknown": "size unknown",
"systemAiHwDetected": "Detected: {summary}",
"@systemAiHwDetected": {
"placeholders": {
"summary": {
"type": "String"
}
}
},
"systemAiHwReviewed": " · curation reviewed {date}",
"@systemAiHwReviewed": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"systemAiLegendRecommended": "recommended for this hardware{tier}",
"@systemAiLegendRecommended": {
"placeholders": {
"tier": {
"type": "String"
}
}
},
"systemAiLegendBalanced": "balanced (4-8B)",
"systemAiLegendSmallLarge": "small <3B / large 9-15B / above hardware",
"systemAiLegendHuge": "huge >15B",
"systemAiLegendUnknown": "size unknown",
"systemAiCacheRow": "Cache: {n} cached {n, plural, =1{explanation} other{explanations}}. Identical prompts hit the cache; switching model or privacy mode flushes automatically.",
"@systemAiCacheRow": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"systemAiCacheClear": "Clear",
"systemAiCacheClearedToast": "Cleared {n} cached System-AI explanations.",
"@systemAiCacheClearedToast": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"systemAiCacheClearFailed": "Cache clear failed: {error}",
"@systemAiCacheClearFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"systemAiPullEmptyError": "Type a model id (e.g. gemma3:4b) first.",
"systemAiPullFailedError": "Pull failed: {error}",
"@systemAiPullFailedError": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"storeProvenanceTemporal": "temporal · {provider}",
"@storeProvenanceTemporal": {
"placeholders": {
"provider": {
"type": "String"
}
}
},
"storeSourceTemporal": "Temporal",
"navFlowEditor": "Editor",
"flowEditorBackTooltip": "Back",
"flowEditorNew": "New flow",
"flowEditorSave": "Save",
"flowEditorRun": "Run",
"flowEditorRefresh": "Refresh file list",
"flowEditorRunOutput": "RUN OUTPUT",
"flowEditorEmptyTitle": "No flow open",
"flowEditorEmptyBody": "Pick one from the left, or click New flow to start a fresh one.",
"flowEditorListEmptyTitle": "No saved flows",
"flowEditorListEmptyBody": "Click New flow to scaffold one from a template.",
"flowEditorDiscardTitle": "Discard unsaved changes?",
"flowEditorDiscardBody": "Switching files will throw away the edits you haven't saved.",
"flowEditorDiscardKeep": "Keep editing",
"flowEditorDiscardThrow": "Throw away",
"flowEditorNewDialogTitle": "New flow",
"flowEditorNewDialogLabel": "Flow name",
"flowEditorNewDialogHelper": "lowercase letters, digits, hyphen, underscore",
"flowEditorNewDialogCancel": "Cancel",
"flowEditorNewDialogCreate": "Create",
"flowEditorNewTemplateComment": "Generated by Studio's Flow editor. Edit, save, run.",
"@flowEditorNewTemplateComment": {
"placeholders": {
"name": {"type": "String"}
}
},
"flowEditorAlreadyExists": "A flow named \"{name}\" already exists.",
"@flowEditorAlreadyExists": {
"placeholders": {
"name": {"type": "String"}
}
},
"buttonView": "View",
"logViewerTitle": "{title} — last {count} lines",
"@logViewerTitle": {
"placeholders": {
"title": {"type": "String"},
"count": {"type": "int"}
}
},
"logViewerEmpty": "Log file is empty or does not exist yet.",
"logViewerCopyAll": "Copy all",
"logViewerOpenExternal": "Open in default editor",
"logViewerLineCount": "{count, plural, =1{1 line} other{{count} lines}}",
"@logViewerLineCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"doctorPathStudioErrors": "Studio errors",
"settingsCategoryGeneral": "General",
"settingsCategoryAppearance": "Appearance",
"settingsCategoryAbout": "About",
"aboutPanelTitle": "About Ch∆In",
"aboutPanelBody": "Product, vendor, and license details of this installation — every value is copyable.",
"aboutProduct": "Product",
"aboutStudioVersion": "Studio version",
"aboutHubVersion": "Hub version",
"aboutHubVersionUnknown": "not connected",
"aboutVendor": "Vendor",
"aboutAuthor": "Author",
"aboutLicense": "License",
"aboutContact": "Contact",
"aboutDocs": "Documentation",
"aboutOpenLink": "Open in browser",
"aboutCopyTooltip": "Copy",
"aboutCopiedToast": "Copied to the clipboard.",
"sidebarSearchLabel": "Search & commands",
"installConfirmTitle": "Install \"{name}\"?",
"@installConfirmTitle": {"placeholders": {"name": {"type": "String"}}},
"installConfirmVersion": "Version",
"installConfirmSource": "Source",
"installConfirmSourceBundled": "Bundled store index",
"installConfirmLicense": "License",
"installConfirmStatus": "Maturity",
"installConfirmNeedsServices": "Required services",
"installConfirmNeedsCapabilities": "Required capabilities",
"installConfirmTrustTitle": "Trust & security",
"installConfirmTrustBody": "The module runs in a sandbox: it may only touch the network endpoints, files, and environment variables it declares itself — the hub enforces that list. The full permission list is visible in the module details after installation.",
"storeSectionMaintainers": "Maintainers",
"storeMaintainersNone": "not specified",
"installConfirmMaintainers": "Maintainers",
"storePolicyUnverifiedNotice": "Signature enforcement is switched off in the hub policy — installs are not cryptographically verified. The install dialog shows the per-module status; enable security.require_signatures for verified installs.",
"verifPillBlocked": "blocked",
"verifPinnedKey": "Signature checked — pinned store key",
"verifPinnedKeyBody": "The hub verifies the bundle at install time against this source's pinned key. A tampered bundle is refused.",
"verifTrustedPublishers": "Signature checked — trusted publishers",
"verifTrustedPublishersBody": "The hub verifies the signature at install time against the trusted-publisher list. A bundle without a valid signature is refused.",
"verifUnverified": "Installs without signature checking",
"verifUnverifiedBody": "Signature enforcement is switched off in the hub policy — this bundle is not cryptographically verified at install time. Enable security.require_signatures for verified installs.",
"verifBlocked": "An install would be refused",
"verifBlockedBody": "The policy requires signatures, but no key material applies to this source — the hub would refuse the install.",
"verifFederated": "Connected via an integration — no bundle signature",
"verifFederatedBody": "This entry is not an installable bundle; it runs through a configured integration (e.g. MCP or n8n). There is no bundle signature — trust follows the integration.",
"installConfirmSignatureNote": "The hub verifies signatures at install time whenever the security profile requires them. The store index does not yet show a per-entry signature status up front (alpha).",
"settingsSidebarPinnedTitle": "Keep the navigation expanded",
"settingsSidebarPinnedBody": "Shows the sidebar labels permanently instead of only while hovering with the mouse.",
"settingsCategoryAi": "System AI",
"settingsCategoryIntegrations": "Integrations",
"settingsCategorySecurity": "Security",
"settingsCategoryMaintenance": "Maintenance",
"settingsAiPanelTitle": "System AI",
"settingsAiPanelBody": "Operator-managed LLM endpoint used by Studio for the AI helpers (system-ai-edit, install-suggest, doctor-summary). No flow ever calls this; modules speak to their own LLM.",
"settingsIntegrationsPanelTitle": "Integrations",
"settingsIntegrationsPanelBody": "External tool servers the hub federates capabilities from. MCP servers expose tool-shaped endpoints; n8n endpoints expose hosted workflows.",
"settingsSecurityPanelTitle": "Security & credentials",
"settingsSecurityPanelBody": "Tokens the hub holds on the operator's behalf. Stored in ~/.chain/ with mode 0600; never sent in telemetry.",
"settingsMaintenancePanelTitle": "Maintenance",
"settingsMaintenancePanelBody": "Destructive operations gated behind explicit confirm dialogs. Use when re-pilot-testing or debugging.",
"tooltipMoveUp": "Move up",
"tooltipMoveDown": "Move down",
"tooltipRemove": "Remove",
"daemonActionEnableAutostart": "enable autostart",
"daemonActionDisableAutostart": "disable autostart",
"daemonActionRestart": "daemon restart",
"daemonActionStart": "daemon start",
"daemonActionStop": "daemon stop",
"daemonActionStatus": "daemon status",
"daemonActionResultOk": "OK · {label}",
"@daemonActionResultOk": {
"placeholders": {
"label": {"type": "String"}
}
},
"daemonActionResultFailed": "Failed · {label}",
"@daemonActionResultFailed": {
"placeholders": {
"label": {"type": "String"}
}
},
"addSourceTitle": "Add module source",
"addSourceIntro": "{capability} is not in the public store. Point the hub at a .chain bundle URL or a local bundle path; the hub downloads, verifies (sha256 + signature) and installs it.",
"@addSourceIntro": {
"placeholders": {
"capability": {"type": "String"}
}
},
"addSourceField": "URL or path to .chain bundle",
"addSourceHint": "https://git.flemming.ai/your-org/your-module/releases/download/v0.1.0/foo-0.1.0.chain",
"addSourceHowItWorksTitle": "How private modules work",
"addSourceHowItWorksBody": "A module is a directory with a module.yaml + the WASM artifact. To share it: pack it (chain pack <dir>) and host the resulting .chain bundle anywhere (your own Forgejo / GitHub / S3). The hub installs by URL and verifies the signature against its trust store.\n\nDeveloping locally? Use the CLI — Studio cannot install from an unpacked directory (yet):",
"addSourceCliExample": "chain install --link /path/to/module",
"addSourceInstallButton": "Install",
"addSourceCancel": "Cancel",
"installFailed": "Install failed: {error}",
"@installFailed": {
"placeholders": {
"error": {"type": "String"}
}
},
"welcomeHubDownTitle": "The hub isn't running yet",
"welcomeHubDownBody": "Studio talks to a local hub — the engine that loads modules and runs flows. It isn't reachable right now. Start it to begin.",
"welcomeHubDownStart": "Start hub",
"welcomeHubDownStarting": "Starting…",
"welcomeHubDownDocsLink": "Can't start it? Read the getting-started guide",
"welcomeHubDownEndpoint": "Endpoint: {endpoint}",
"@welcomeHubDownEndpoint": {
"placeholders": {
"endpoint": {"type": "String"}
}
},
"daemonStartRequested": "Daemon start requested. Reconnecting…",
"daemonStartFailed": "Could not start daemon: {detail}",
"@daemonStartFailed": {
"placeholders": {
"detail": {"type": "String"}
}
},
"chainBinaryNotFound": "Could not find the chain program on this machine.",
"chainBinaryNotFoundHint": "Install the Ch∆In platform, or point Studio at an existing chain binary.",
"chainBinaryLocateButton": "Locate chain binary…",
"chainBinaryInstallDocsButton": "Open install guide",
"chainBinaryPickerTitle": "Select the chain binary",
"chainBinarySetOk": "Using chain binary at {path}",
"@chainBinarySetOk": {
"placeholders": {
"path": {"type": "String"}
}
},
"sysAiFixParse": "The provider sent a response in an unexpected format. Providers that aren't OpenAI-compatible may need a translation proxy.",
"sysAiFixUnknown": "Unexpected failure ({kind}). See the System AI documentation.",
"@sysAiFixUnknown": {
"placeholders": {
"kind": {"type": "String"}
}
},
"sysAiFixDisabled": "Configure System AI in Settings (Cmd+,) → System AI panel.",
"sysAiFixEnvMissing": "The API-key environment variable is empty. Set it in your shell, then restart the daemon.",
"sysAiFixNetwork": "The hub can't reach the configured endpoint. Is your provider running?",
"sysAiFixHttp": "The provider returned a non-2xx status. Verify the endpoint, model name, and API key.",
"sysAiFixEmptyResponse": "The provider answered with no content. Try a different model or rephrase the prompt.",
"channelSwitchOk": "Switched active channel to \"{name}\". Daemon restarted.",
"@channelSwitchOk": {
"placeholders": {
"name": {"type": "String"}
}
},
"channelSwitchFailed": "Channel switch failed: {detail}",
"@channelSwitchFailed": {
"placeholders": {
"detail": {"type": "String"}
}
},
"providerDescOllama": "Local ollama serve. Models stay on your machine. No API key needed.",
"providerDescOpenai": "OpenAI hosted API. Requires an API key. Data leaves your machine.",
"providerDescLmstudio": "Local LM Studio server. Models stay on your machine. No API key needed.",
"providerDescVllm": "Self-hosted vLLM or any other OpenAI-compatible server. Endpoint required.",
"providerDescCustom": "Anything else that speaks the OpenAI-compatible chat-completions wire (LiteLLM proxy, internal mirror, …).",
"welcomeDocLoadFailedBody": "Could not load the bundled doc \"{slug}\" ({locale}).\nTried: {attempted}\nUnderlying: {underlying}\nThis usually means the Studio build on disk predates the doc bundle. Rebuild Studio or open the online copy.",
"@welcomeDocLoadFailedBody": {
"placeholders": {
"slug": {"type": "String"},
"locale": {"type": "String"},
"attempted": {"type": "String"},
"underlying": {"type": "String"}
}
},
"hubUnreachableBanner": "Can't reach {endpoint} — open Settings",
"@hubUnreachableBanner": {
"placeholders": {
"endpoint": {"type": "String"}
}
},
"hubUnreachableOpenSettings": "Open Settings",
"hubAuthRejectedBanner": "{endpoint} rejected the sign-in — check the access token",
"@hubAuthRejectedBanner": {
"placeholders": {
"endpoint": {"type": "String"}
}
},
"navFederation": "Federation",
"federationTitle": "Federation",
"federationReloadTooltip": "Reload satellites",
"federationAddSatellite": "Add satellite",
"federationEmptyTitle": "No satellites connected",
"federationEmptyHint": "Connect another hub as a satellite to run capabilities on it. Issue an enrollment token to get started.",
"federationPillConnected": "connected",
"federationRegionNone": "no region",
"federationCapabilities": "{count} advertised capabilities",
"@federationCapabilities": {
"placeholders": {
"count": {"type": "int"}
}
},
"federationAddDialogTitle": "Issue an enrollment token",
"federationNameLabel": "Satellite name",
"federationAddIntro": "A satellite is another hub this hub connects to — its capabilities then become usable here in flows. You give it a name and receive a one-time token the satellite uses to enrol with this hub.",
"federationNameHelp": "A free-form name to recognize this satellite in the list (e.g. its location or purpose). Display only — it changes nothing technical.",
"federationIssueButton": "Issue",
"federationIssueFailed": "Could not issue token: {error}",
"@federationIssueFailed": {
"placeholders": {
"error": {"type": "String"}
}
},
"federationEnrollmentTitle": "Enroll {name}",
"@federationEnrollmentTitle": {
"placeholders": {
"name": {"type": "String"}
}
},
"federationTokenLabel": "Bootstrap token (single use)",
"federationConfigLabel": "Satellite config (paste into the satellite)",
"federationCopied": "Copied to clipboard",
"federationEnrollmentHint": "Hand the token to the satellite operator over a secure channel. The bundled CA authenticates the satellite's first connect.",
"workspaceAll": "All projects",
"workspaceDefaultProject": "General",
"workspaceSwitcherTooltip": "Workspace — filters this view and stamps new runs with the selected project",
"workspaceProtectedHint": "Protected: logically separated in the shared hub — no hard process barrier. Critical engagements use a sealed area.",
"runsTitle": "Runs",
"runsReloadTooltip": "Reload the runs list",
"runsEmptyTitle": "No background runs",
"runsEmptyHint": "Runs that keep working in the background while you do something else appear here. The feature is optional and off by default — the guide shows step by step how to turn it on.",
"runsEmptyEnabledHint": "Background runs are switched on — none has been started yet. Start a flow with the \"run in background\" option and it will appear here.",
"runsEmptyGuideButton": "Open the guide",
"runsHubTooOldTitle": "This view needs a newer hub version",
"runsHubTooOldHint": "The hub is connected, but its version does not know the runs monitor yet. Update the hub and the runs will appear here.",
"runsHubTooOldButton": "Open Doctor",
"runsLoadFailedTitle": "Runs could not be loaded",
"runsCancelButton": "Cancel",
"runsCancelSignalled": "Cancel signalled for {flow}.",
"@runsCancelSignalled": {"placeholders": {"flow": {"type": "String"}}},
"runsCancelTooLate": "The run had already finished — nothing to cancel.",
"runsCurrentStep": "Step: {step}",
"@runsCurrentStep": {"placeholders": {"step": {"type": "String"}}},
"runsPhasePending": "Pending",
"runsPhaseRunning": "Running",
"runsPhaseSucceeded": "Succeeded",
"runsPhaseFailed": "Failed",
"runsPhaseCancelled": "Cancelled",
"runsPhaseUnknown": "Unknown",
"navRuns": "Runs",
"workspaceSealedHeader": "SEALED AREAS",
"workspaceSealedAggregate": "{n, plural, =1{1 sealed area} other{{n} sealed areas}}",
"@workspaceSealedAggregate": {"placeholders": {"n": {"type": "int"}}},
"workspaceSealedRevealAction": "Show names",
"settingsSealedNamesTitle": "List sealed areas with their names right away",
"settingsSealedNamesBody": "Area names can be sensitive (client/mandate identity). By default the workspace switcher shows them aggregated; the names appear only after a click.",
"workspaceSealedRunning": "running",
"workspaceSealedStopped": "stopped",
"workspaceSealedRunningHint": "The sealed area runs as its own hub process. Selecting it switches in.",
"workspaceSealedStoppedHint": "The sealed area is not running right now. Selecting it starts it and switches in.",
"workspaceSealedStarting": "Starting sealed area “{name}”…",
"@workspaceSealedStarting": {"placeholders": {"name": {"type": "String"}}},
"workspaceSealedStarted": "Started sealed area “{name}”.",
"@workspaceSealedStarted": {"placeholders": {"name": {"type": "String"}}},
"workspaceSealedSwitchFailed": "Could not switch to the sealed area: {error}",
"@workspaceSealedSwitchFailed": {"placeholders": {"error": {"type": "String"}}},
"sealedIdentityBar": "Sealed area — isolated hub, own data and audit chain",
"sealedLeave": "Leave",
"setupStepOf": "Step {n} of {total}",
"@setupStepOf": {"placeholders": {"n": {"type": "int"}, "total": {"type": "int"}}},
"setupStep1Title": "What are the stakes?",
"setupStep2Title": "What do you want to do first?",
"setupStep3Title": "Where will it run?",
"setupReviewTitle": "This is what Ch∆In will set up",
"setupChooseFreeText": "Or just describe what you want to do",
"setupScenTryingOut": "Just trying it out",
"setupScenTryingOutSub": "A straightforward workstation on this machine — no signature requirement, no write-protected audit log. You can upgrade any time: run the setup again and pick a regulated profile.",
"setupScenTeamHub": "A shared team hub",
"setupScenTeamHubSub": "A secured hub for several people — signed modules, resource limits.",
"setupScenRegulated": "Regulated production",
"setupScenRegulatedSub": "Signed modules, a complete tamper-evident audit trail, and a human approval before every AI step.",
"setupScenBuildModules": "Building modules",
"setupScenBuildModulesSub": "A developer setup for writing and testing your own modules.",
"setupIntentHello": "Run the hello example",
"setupIntentHelloSub": "Just see one flow run end to end.",
"setupIntentExtract": "Extract text from documents",
"setupIntentExtractSub": "Pull plain text out of PDF and DOCX files.",
"setupIntentExtractSummarize": "Extract and summarize",
"setupIntentExtractSummarizeSub": "Extract text, then summarize it.",
"setupIntentClassify": "Sort incoming documents",
"setupIntentClassifySub": "Extract text, then classify it with an AI step.",
"setupIntentBuildModule": "Build my own module",
"setupIntentBuildModuleSub": "Start from a module scaffold.",
"setupTargetLaptop": "This computer",
"setupTargetLaptopSub": "Runs locally on the machine you are on now.",
"setupTargetHomeServer": "An on-premise server",
"setupTargetHomeServerSub": "A server in your own house — starts on boot, runs in the background.",
"setupTargetAirgapped": "A fully local server (no internet)",
"setupTargetAirgappedSub": "An isolated server with no internet — the strictest, most private posture.",
"setupTargetContainer": "A container",
"setupTargetContainerSub": "Docker or Podman, with a ready-made compose snippet.",
"setupApprovalPlain": "Ask a person for approval before every AI step",
"setupDataLocalPlain": "Data must never leave the building (fully local)",
"setupPlanIntroDev": "Ch∆In sets up a straightforward workspace.",
"setupPlanIntroEnterprise": "Ch∆In sets up a secured operation for a team.",
"setupPlanIntroAirgapped": "Ch∆In sets up a fully local, regulated operation.",
"setupPlanSignatures": "Only signed modules are allowed.",
"setupPlanWorm": "The audit log is additionally sealed tamper-proof (WORM).",
"setupPlanApproval": "Before every AI step, the system asks a person for approval.",
"setupPlanModules": "These modules are prepared: {modules}.",
"@setupPlanModules": {"placeholders": {"modules": {"type": "String"}}},
"setupPlanFlow": "An example flow “{flow}” is created.",
"@setupPlanFlow": {"placeholders": {"flow": {"type": "String"}}},
"setupPlanFileChanged": "Only one file is changed: {path}.",
"@setupPlanFileChanged": {"placeholders": {"path": {"type": "String"}}},
"setupPlanOverwriteWarn": "An existing configuration will be overwritten.",
"setupApplied": "Done — Ch∆In is set up.",
"setupNextTitle": "Next steps",
"setupNextHubStart": "Start the hub",
"setupHubRunning": "The hub is running.",
"setupStartHubFirst": "Start the hub first — then the modules can be installed right here.",
"setupActionInstall": "Install {module}",
"@setupActionInstall": {"placeholders": {"module": {"type": "String"}}},
"setupActionInstalled": "{module} is installed.",
"@setupActionInstalled": {"placeholders": {"module": {"type": "String"}}},
"setupActionOpenFlow": "Open the “{flow}” example flow",
"@setupActionOpenFlow": {"placeholders": {"flow": {"type": "String"}}},
"setupModulesOfflineHint": "The modules arrive as an offline bundle, without internet — the documentation explains this under “running without internet”.",
"setupModulesSignedHint": "The modules come from your own, signed source — not from the public store.",
"setupSigPublicStoreNotice": "This setup only accepts signed modules. The public store currently ships unsigned bundles — the prepared modules therefore come from your own, signed source.",
"setupAllowUnsigned": "Allow installing from the public store",
"setupAllowUnsignedSub": "Deliberately relaxes the signature requirement. Fine for trying things out — re-enable it for regulated operation.",
"setupStartCta": "Start setup",
"setupGateIntro": "Before you start: three questions, then Ch∆In sets this machine up to match. Nothing changes without your confirmation.",
"setupGateSkip": "Set up later",
"settingsRunSetup": "Run setup again…",
"settingsRunSetupHint": "Opens the setup assistant (three questions, preview, apply). Your existing configuration is only replaced after you confirm.",
"setupPlanRunbookLocal": "This machine is being set up; the hub runs locally and starts on demand.",
"setupPlanRunbookService": "This machine is being set up: the hub will start automatically on boot (background service). For a different server, run the setup there.",
"setupPlanRunbookAirgap": "Intended for an isolated server without internet — modules and updates arrive as offline bundles.",
"setupPlanRunbookContainer": "Intended for container operation — a ready-made compose example is included.",
"setupPlanAuditChain": "Every step lands in a gapless, hash-chained audit log — tampering becomes detectable.",
"setupPlanDocs": "A matching reading list ({n} chapters) is stored with the setup record under ~/.chain/.",
"@setupPlanDocs": {"placeholders": {"n": {"type": "int"}}},
"setupTrustedPublishersHint": "Important: when adding the source, pin the publisher's key (\"pin signing key\") — otherwise the hub accepts any formally valid signature, no matter whose.",
"setupAddSignedSource": "Add a signed source…",
"setupApplyNotes": "Notes from the setup",
"setupFreeTextHint": "e.g.: pre-screen incoming applications and flag incomplete ones",
"setupFreeTextSuggest": "Suggest a setup",
"setupFreeTextPrivacyLocal": "Your description is processed right on this machine — by the local AI model {model}. Nothing leaves the device.",
"@setupFreeTextPrivacyLocal": {"placeholders": {"model": {"type": "String"}}},
"setupFreeTextPrivacyRemote": "Your description is sent to the configured system AI: {model} ({provider}).",
"@setupFreeTextPrivacyRemote": {"placeholders": {"model": {"type": "String"}, "provider": {"type": "String"}}},
"setupFreeTextUnavailable": "The free-text path needs a configured system AI (Settings → System AI). The choices above always work — no AI required.",
"setupExecHint": "For the preview and setup, Studio runs the “chain” program: {path}",
"@setupExecHint": {"placeholders": {"path": {"type": "String"}}},
"setupExecHintTcc": "The program lives at {path} — macOS may ask once for access to that folder (e.g. “Documents”). That is expected and fine.",
"@setupExecHintTcc": {"placeholders": {"path": {"type": "String"}}},
"setupNoBinaryStepHint": "The “chain” program could not be found on this machine — the preview in the next step will fail. You can pick it under “Doctor”, or install Ch∆In.",
"setupNoBinary": "The “chain” program could not be found on this machine.",
"setupNoBinaryHint": "Without it the assistant cannot apply the setup. Pick it under “Doctor”, or reinstall Ch∆In.",
"setupCliTooOld": "The installed “chain” program is older than Studio and does not know this assistant yet.",
"setupCliTooOldHint": "Found: {path}. Please update Ch∆In (“Doctor” page → update, or in a terminal: chain update apply) and reopen the assistant afterwards.",
"@setupCliTooOldHint": {"placeholders": {"path": {"type": "String"}}},
"setupPreviewFailed": "The plan preview could not be created — the “chain” program reported an error.",
"setupApplyFailed": "The setup could not be applied — the “chain” program reported an error.",
"setupCliUsedBinary": "Executed: {path}",
"@setupCliUsedBinary": {"placeholders": {"path": {"type": "String"}}},
"setupFreeTextParseError": "The system AI did not return a usable suggestion. Pick from the menu above — or try again.",
"setupReflectionTitle": "This is how I read your task",
"setupReflectionScenario": "What it is about: {label}",
"@setupReflectionScenario": {"placeholders": {"label": {"type": "String"}}},
"setupReflectionIntent": "First task: {label}",
"@setupReflectionIntent": {"placeholders": {"label": {"type": "String"}}},
"setupReflectionTarget": "Environment: {label}",
"@setupReflectionTarget": {"placeholders": {"label": {"type": "String"}}},
"setupReflectionApproval": "A human is asked for approval before every AI step.",
"setupReflectionDataLocal": "Data never leaves the building.",
"setupReflectionEditHint": "Nothing is changed without your confirmation. Adjust any point, or go straight to the preview.",
"setupReflectionAdjust": "Adjust",
"setupReflectionToPreview": "To the preview",
"setupProfileDev": "straightforward workstation",
"setupProfileEnterprise": "hardened team operation",
"setupProfileAirgapped": "fully local, regulated operation",
"welcomeChecklistSetupDone": "The setup assistant already took care of the basics ({profile}) — this list shows what has actually happened on your hub.",
"@welcomeChecklistSetupDone": {"placeholders": {"profile": {"type": "String"}}}
}