{ "@@locale": "en", "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 document processing in regulated environments.", "welcomePillarHubTitle": "Hub", "welcomePillarHubBody": "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 small WebAssembly component that does one thing. Declares the network endpoints, files, and environment variables it touches; the hub enforces the list.", "welcomePillarFlowTitle": "Flow", "welcomePillarFlowBody": "A YAML file that chains modules together. Inputs go in, modules run in declared order, outputs come out — every step recorded in a hash-chained audit log.", "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 works and why WORM-1 is enough for KRITIS.", "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.", "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.", "welcomeDocClose": "Close", "welcomeDocFailedToLoad": "Could not load documentation: {error}", "@welcomeDocFailedToLoad": { "placeholders": { "error": { "type": "String" } } }, "welcomeChecklistHeader": "GETTING STARTED", "welcomeChecklistBody": "Four steps to a working hub. Live state — refresh after changing anything.", "welcomeChecklistAi": "Configure System AI", "welcomeChecklistAiHint": "Settings → System AI. Required for the AI search and inline failure explanations.", "welcomeChecklistMcp": "Add a public capability source", "welcomeChecklistMcpHint": "Add an MCP source from the Store, or configure one 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", "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 1–65535", "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..` 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..` 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", "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", "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": "Pinned public key — PEM (optional)", "storesManagerPinnedKeyHint": "Signed modules from this store verify against this key instead of the built-in vendor key. Paste a PEM public 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", "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", "auditClearLogTooltip": "Clear log (local/dev channels 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 ` 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 ` 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 .fai 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" } } }, "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 `/` 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 `. 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. New `system.approval@^0` steps land 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.", "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} capabilities", "@doctorSummaryCapabilities": { "placeholders": { "n": { "type": "int" } } }, "doctorSummaryPending": "pending", "doctorSummaryChain": "{verified}/{total} chain", "@doctorSummaryChain": { "placeholders": { "verified": { "type": "int" }, "total": { "type": "int" } } }, "doctorSummaryDeclared": "declared", "doctorModulesPanelSummary": "{n} modules · {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} events · prev_event_sha256 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": "WORM-1", "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…", "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..` 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..` capabilities. Configure once, see them in the Store.", "n8nEmpty": "No n8n endpoints configured. Click + to add one.", "hubUnreachable": "Hub unreachable", "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", "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 `.fai` 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 .fai bundle", "addSourceHint": "https://git.flemming.ai/your-org/your-module/releases/download/v0.1.0/foo-0.1.0.fai", "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 `) and host the resulting `.fai` 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", "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", "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 makes the satellite's first connect tamper-proof." }