@ai-coders/installer 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +18 -0
  3. package/README.md +64 -0
  4. package/dist/callback-page.d.ts +11 -0
  5. package/dist/callback-page.js +230 -0
  6. package/dist/callback-page.js.map +1 -0
  7. package/dist/clerk-auth.d.ts +18 -0
  8. package/dist/clerk-auth.js +296 -0
  9. package/dist/clerk-auth.js.map +1 -0
  10. package/dist/cli-command.d.ts +10 -0
  11. package/dist/cli-command.js +17 -0
  12. package/dist/cli-command.js.map +1 -0
  13. package/dist/cli.d.ts +2 -0
  14. package/dist/cli.js +84 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/i18n.d.ts +52 -0
  17. package/dist/i18n.js +163 -0
  18. package/dist/i18n.js.map +1 -0
  19. package/dist/product-manifest.d.ts +43 -0
  20. package/dist/product-manifest.js +140 -0
  21. package/dist/product-manifest.js.map +1 -0
  22. package/dist/products/second-brain/apply.d.ts +86 -0
  23. package/dist/products/second-brain/apply.js +277 -0
  24. package/dist/products/second-brain/apply.js.map +1 -0
  25. package/dist/products/second-brain/bearer.d.ts +29 -0
  26. package/dist/products/second-brain/bearer.js +78 -0
  27. package/dist/products/second-brain/bearer.js.map +1 -0
  28. package/dist/products/second-brain/bootstrap.d.ts +33 -0
  29. package/dist/products/second-brain/bootstrap.js +39 -0
  30. package/dist/products/second-brain/bootstrap.js.map +1 -0
  31. package/dist/products/second-brain/envfile.d.ts +35 -0
  32. package/dist/products/second-brain/envfile.js +136 -0
  33. package/dist/products/second-brain/envfile.js.map +1 -0
  34. package/dist/products/second-brain/github.d.ts +77 -0
  35. package/dist/products/second-brain/github.js +195 -0
  36. package/dist/products/second-brain/github.js.map +1 -0
  37. package/dist/products/second-brain/hostinger.d.ts +140 -0
  38. package/dist/products/second-brain/hostinger.js +607 -0
  39. package/dist/products/second-brain/hostinger.js.map +1 -0
  40. package/dist/products/second-brain/i18n.d.ts +887 -0
  41. package/dist/products/second-brain/i18n.js +587 -0
  42. package/dist/products/second-brain/i18n.js.map +1 -0
  43. package/dist/products/second-brain/keys.d.ts +5 -0
  44. package/dist/products/second-brain/keys.js +16 -0
  45. package/dist/products/second-brain/keys.js.map +1 -0
  46. package/dist/products/second-brain/main.d.ts +3 -0
  47. package/dist/products/second-brain/main.js +78 -0
  48. package/dist/products/second-brain/main.js.map +1 -0
  49. package/dist/products/second-brain/ports.d.ts +34 -0
  50. package/dist/products/second-brain/ports.js +77 -0
  51. package/dist/products/second-brain/ports.js.map +1 -0
  52. package/dist/products/second-brain/recovery.d.ts +50 -0
  53. package/dist/products/second-brain/recovery.js +96 -0
  54. package/dist/products/second-brain/recovery.js.map +1 -0
  55. package/dist/products/second-brain/sealed-box.d.ts +1 -0
  56. package/dist/products/second-brain/sealed-box.js +11 -0
  57. package/dist/products/second-brain/sealed-box.js.map +1 -0
  58. package/dist/products/second-brain/server.d.ts +143 -0
  59. package/dist/products/second-brain/server.js +280 -0
  60. package/dist/products/second-brain/server.js.map +1 -0
  61. package/dist/products/second-brain/service.d.ts +26 -0
  62. package/dist/products/second-brain/service.js +806 -0
  63. package/dist/products/second-brain/service.js.map +1 -0
  64. package/dist/products/second-brain/ssh.d.ts +35 -0
  65. package/dist/products/second-brain/ssh.js +140 -0
  66. package/dist/products/second-brain/ssh.js.map +1 -0
  67. package/dist/products/second-brain/state.d.ts +27 -0
  68. package/dist/products/second-brain/state.js +60 -0
  69. package/dist/products/second-brain/state.js.map +1 -0
  70. package/dist/products/second-brain/ui/assets/index-BoXpakUt.css +2 -0
  71. package/dist/products/second-brain/ui/assets/index-MgfOpW_R.js +66 -0
  72. package/dist/products/second-brain/ui/index.html +15 -0
  73. package/dist/products/second-brain/verify.d.ts +23 -0
  74. package/dist/products/second-brain/verify.js +59 -0
  75. package/dist/products/second-brain/verify.js.map +1 -0
  76. package/dist/products/severino/apply.d.ts +87 -0
  77. package/dist/products/severino/apply.js +250 -0
  78. package/dist/products/severino/apply.js.map +1 -0
  79. package/dist/products/severino/domain.d.ts +6 -0
  80. package/dist/products/severino/domain.js +20 -0
  81. package/dist/products/severino/domain.js.map +1 -0
  82. package/dist/products/severino/envfile.d.ts +20 -0
  83. package/dist/products/severino/envfile.js +89 -0
  84. package/dist/products/severino/envfile.js.map +1 -0
  85. package/dist/products/severino/github.d.ts +77 -0
  86. package/dist/products/severino/github.js +195 -0
  87. package/dist/products/severino/github.js.map +1 -0
  88. package/dist/products/severino/hostinger.d.ts +140 -0
  89. package/dist/products/severino/hostinger.js +607 -0
  90. package/dist/products/severino/hostinger.js.map +1 -0
  91. package/dist/products/severino/i18n.d.ts +887 -0
  92. package/dist/products/severino/i18n.js +587 -0
  93. package/dist/products/severino/i18n.js.map +1 -0
  94. package/dist/products/severino/keys.d.ts +5 -0
  95. package/dist/products/severino/keys.js +16 -0
  96. package/dist/products/severino/keys.js.map +1 -0
  97. package/dist/products/severino/main.d.ts +3 -0
  98. package/dist/products/severino/main.js +78 -0
  99. package/dist/products/severino/main.js.map +1 -0
  100. package/dist/products/severino/recovery.d.ts +50 -0
  101. package/dist/products/severino/recovery.js +96 -0
  102. package/dist/products/severino/recovery.js.map +1 -0
  103. package/dist/products/severino/sealed-box.d.ts +1 -0
  104. package/dist/products/severino/sealed-box.js +11 -0
  105. package/dist/products/severino/sealed-box.js.map +1 -0
  106. package/dist/products/severino/server.d.ts +123 -0
  107. package/dist/products/severino/server.js +274 -0
  108. package/dist/products/severino/server.js.map +1 -0
  109. package/dist/products/severino/service.d.ts +28 -0
  110. package/dist/products/severino/service.js +752 -0
  111. package/dist/products/severino/service.js.map +1 -0
  112. package/dist/products/severino/slack-manifest.d.ts +3 -0
  113. package/dist/products/severino/slack-manifest.js +45 -0
  114. package/dist/products/severino/slack-manifest.js.map +1 -0
  115. package/dist/products/severino/ssh.d.ts +35 -0
  116. package/dist/products/severino/ssh.js +140 -0
  117. package/dist/products/severino/ssh.js.map +1 -0
  118. package/dist/products/severino/state.d.ts +26 -0
  119. package/dist/products/severino/state.js +61 -0
  120. package/dist/products/severino/state.js.map +1 -0
  121. package/dist/products/severino/ui/assets/index-7S8Hl4jq.js +96 -0
  122. package/dist/products/severino/ui/assets/index-D5kql1Bh.css +2 -0
  123. package/dist/products/severino/ui/index.html +15 -0
  124. package/dist/products/severino/verify.d.ts +22 -0
  125. package/dist/products/severino/verify.js +149 -0
  126. package/dist/products/severino/verify.js.map +1 -0
  127. package/package.json +53 -0
@@ -0,0 +1,887 @@
1
+ /**
2
+ * Installer UI strings. English is the source of truth; the pt-BR table must
3
+ * mirror it key-for-key, which the `satisfies` clause enforces at compile
4
+ * time and test/installer-i18n.test.ts enforces at run time.
5
+ */
6
+ export type InstallerLanguage = "en" | "pt-BR";
7
+ export declare const defaultLanguage: InstallerLanguage;
8
+ declare const en: {
9
+ readonly appTitle: "Severino Installer";
10
+ readonly languageLabel: "Language";
11
+ readonly next: "Next";
12
+ readonly back: "Back";
13
+ readonly retry: "Retry";
14
+ readonly cancel: "Cancel";
15
+ readonly close: "Close";
16
+ readonly confirm: "Confirm";
17
+ readonly working: "Working…";
18
+ readonly copy: "Copy";
19
+ readonly copied: "Copied";
20
+ readonly wizardIntroTitle: "Welcome";
21
+ readonly wizardIntroBody: "This installer puts Severino, your task agent, on your own server, directly from this computer. It asks for everything it needs, step by step.";
22
+ readonly wizardProgressLabel: "Installation progress";
23
+ readonly wizardStepVps: "Connect VPS";
24
+ readonly wizardStepConfig: "Configure";
25
+ readonly wizardStepReview: "Review";
26
+ readonly recoverExistingPrompt: "Already installed on another computer?";
27
+ readonly recoverExistingCta: "Connect this computer";
28
+ readonly recoverTitle: "Connect to an existing server";
29
+ readonly recoverBody: "Enter the VPS access details. The installer will confirm the existing installation and save a new local connection for this computer.";
30
+ readonly recoverSecurityNote: "Your root password is used once and is never stored. The installer reads only the public hostname from the server.";
31
+ readonly recoverSubmit: "Connect existing server";
32
+ readonly recoverFailed: "This computer could not connect to the existing server.";
33
+ readonly stepVpsTitle: "Step 1 — Connect your VPS";
34
+ readonly stepVpsBody: "Enter the server details from Hostinger. The root password is used once to install a secure key; it is never stored.";
35
+ readonly vpsRecommendationTitle: "Don't have a VPS yet?";
36
+ readonly vpsRecommendationBody: "We recommend a Hostinger VPS for this installation.";
37
+ readonly vpsRecommendationDiscount: "Get 10% off with coupon AICODERS.";
38
+ readonly vpsRecommendationDiscountLabel: "Member coupon";
39
+ readonly vpsRecommendationDiscountSaving: "10% off";
40
+ readonly vpsRecommendationCopyCoupon: "Copy coupon";
41
+ readonly vpsRecommendationCouponCopied: "Coupon copied";
42
+ readonly vpsRecommendationOpen: "Need a VPS? View the Hostinger offer";
43
+ readonly vpsRecommendationCta: "Get a Hostinger VPS";
44
+ readonly vpsPartnersLink: "See more partner discounts";
45
+ readonly vpsHostLabel: "Server IP address or hostname";
46
+ readonly vpsPortLabel: "SSH port";
47
+ readonly vpsUserLabel: "User";
48
+ readonly vpsPasswordLabel: "Root password";
49
+ readonly vpsTest: "Test connection";
50
+ readonly vpsTestOk: "Connected to the server.";
51
+ readonly vpsUnreachable: "Could not reach the server. Check the IP address and that the VPS is running.";
52
+ readonly vpsTestAgain: "The secure connection check expired. Test the server again before installing.";
53
+ readonly showSecret: "Show";
54
+ readonly hideSecret: "Hide";
55
+ readonly vpsMethodLegend: "How do you want to configure the VPS?";
56
+ readonly vpsMethodHostinger: "Connect Hostinger";
57
+ readonly vpsMethodHostingerBody: "Find your VPS and fill its connection details automatically.";
58
+ readonly vpsMethodRecommended: "Recommended";
59
+ readonly vpsMethodManual: "Enter details manually";
60
+ readonly vpsMethodManualBody: "Use any provider or enter custom SSH settings.";
61
+ readonly hostingerConnectTitle: "Connect your Hostinger account";
62
+ readonly hostingerConnectBody: "Create a temporary API token, then use it once to find your VPS. The token stays only in this installer session.";
63
+ readonly hostingerTokenLabel: "Hostinger API token";
64
+ readonly hostingerTokenOpen: "Create a token in hPanel";
65
+ readonly hostingerTokenSecurity: "The token is kept in memory, never written to the installer settings, and cleared after handoff.";
66
+ readonly hostingerFindVps: "Find my VPSs";
67
+ readonly hostingerConnected: "Hostinger connected";
68
+ readonly hostingerChangeAccount: "Change account";
69
+ readonly hostingerRefresh: "Refresh list";
70
+ readonly hostingerNoVps: "No VPS was found in this Hostinger account.";
71
+ readonly hostingerPickVps: "Choose the VPS for your Severino";
72
+ readonly hostingerVpsId: "VPS ID";
73
+ readonly hostingerPlan: "Plan";
74
+ readonly hostingerTemplate: "Template";
75
+ readonly hostingerIp: "IPv4";
76
+ readonly hostingerStateRunning: "Ready";
77
+ readonly hostingerStateUnavailable: "Unavailable";
78
+ readonly hostingerUnavailablePreparing: "Hostinger is still preparing this VPS.";
79
+ readonly hostingerUnavailableLocked: "Hostinger is finishing another action on this VPS.";
80
+ readonly hostingerUnavailableState: "Start or repair this VPS in hPanel before continuing.";
81
+ readonly hostingerUnavailableIpv4: "This VPS does not have a usable IPv4 address.";
82
+ readonly hostingerUnavailableTemplate: "The Hostinger Docker template is required for this installation.";
83
+ readonly hostingerRootTitle: "Confirm administrator access";
84
+ readonly hostingerRootBody: "Enter the root password once. After SSH is verified, the password leaves this page and a secure deploy key is installed during setup.";
85
+ readonly rootPasswordForgot: "I don't remember the root password";
86
+ readonly rootResetTitle: "Choose a new root password";
87
+ readonly rootResetBody: "Hostinger can replace the password without asking for the current one.";
88
+ readonly rootResetPasswordLabel: "New root password";
89
+ readonly rootResetConfirmLabel: "Confirm the new root password";
90
+ readonly rootResetGeneratePassword: "Generate strong password";
91
+ readonly rootResetGeneratedNote: "A strong API-compatible 24-character password with letters, numbers, and Hostinger-supported symbols was generated and filled into both fields. Save it in your password manager before continuing.";
92
+ readonly rootResetRequirementLength: "At least 12 characters";
93
+ readonly rootResetRequirementUppercase: "At least one uppercase letter";
94
+ readonly rootResetRequirementLowercase: "At least one lowercase letter";
95
+ readonly rootResetRequirementNumber: "At least one number";
96
+ readonly rootResetRequirementSymbol: "At least one allowed symbol: -().&@?'#,/;+";
97
+ readonly rootResetRequirementCharacters: "Only letters, numbers, and allowed symbols";
98
+ readonly rootResetRequirementMatch: "Both password fields match";
99
+ readonly rootResetLeakNote: "Hostinger also rejects passwords found in public leak databases.";
100
+ readonly rootResetReview: "Review password change";
101
+ readonly rootResetConfirmTitle: "Confirm root password change";
102
+ readonly rootResetConfirmBody: "The current root password will stop working for new connections as soon as Hostinger completes this action.";
103
+ readonly rootResetTarget: "This action changes";
104
+ readonly rootResetTypeHostname: "Type the VPS hostname to confirm";
105
+ readonly rootResetNow: "Change root password now";
106
+ readonly rootResetWorking: "Hostinger is updating the VPS…";
107
+ readonly rootResetSuccess: "Root password changed. Testing SSH with the new password…";
108
+ readonly rootResetSshPending: "Hostinger changed the password, but SSH is not accepting it yet. Wait a moment, then test the new password again.";
109
+ readonly rootResetOutcomeUnknown: "Hostinger may still be processing the password change. Do not submit it again; test the new password before retrying.";
110
+ readonly rootResetCancel: "Keep the current password";
111
+ readonly hostingerErrorInvalidInput: "Check the supplied values and try again.";
112
+ readonly hostingerErrorUnauthorized: "Hostinger rejected this token. Create a new token and reconnect.";
113
+ readonly hostingerErrorRateLimited: "Hostinger's request limit was reached. Wait a moment and try again.";
114
+ readonly hostingerErrorUnavailable: "Hostinger is temporarily unavailable. Manual configuration is still available.";
115
+ readonly hostingerErrorInvalidResponse: "Hostinger returned an unexpected response. Try again later or configure the VPS manually.";
116
+ readonly hostingerErrorNotConnected: "Reconnect Hostinger before continuing.";
117
+ readonly hostingerErrorRequestRejected: "Hostinger rejected the password-change request, but did not identify the password field as the cause. Check the VPS status and recent actions in hPanel before trying again.";
118
+ readonly hostingerErrorPasswordPolicy: "Hostinger rejected this password. Use only letters, numbers, and these symbols: -().&@?'#,/;+. Also avoid leaked or common passwords.";
119
+ readonly hostingerErrorActionFailed: "Hostinger could not change the root password. Review the VPS in hPanel before retrying.";
120
+ readonly hostingerErrorActionTimeout: "The password change did not finish in time. It may still be processing; test the new password before retrying.";
121
+ readonly hostingerErrorConfirmation: "This confirmation expired or is no longer valid. Review the password change again.";
122
+ readonly hostingerErrorTargetChanged: "The VPS changed after confirmation. Refresh the list and review the target again.";
123
+ readonly hostingerErrorTargetUnavailable: "This VPS cannot be changed right now. Wait for Hostinger to finish its current action.";
124
+ readonly hostingerErrorConflict: "Another installer operation is already running.";
125
+ readonly stepConfigTitle: "Step 2 — Configure your Severino";
126
+ readonly stepConfigBody: "These values configure the model access, the public address, and the channels your agent answers on.";
127
+ readonly domainLabel: "Your domain (for example severino.example.com)";
128
+ readonly hostingerVpsDomainLabel: "Your Hostinger VPS domain";
129
+ readonly hostingerSubdomainLabel: "Subdomain";
130
+ readonly hostingerFinalDomainLabel: "Final Severino address";
131
+ readonly hostingerDomainNote: "Hostinger's wildcard DNS automatically points this subdomain to the selected VPS.";
132
+ readonly hostingerSubdomainInvalid: "Use 1–63 lowercase letters, numbers, or hyphens. The subdomain cannot start or end with a hyphen.";
133
+ readonly dnsCheck: "Check DNS";
134
+ readonly dnsMatch: "The domain points at your server.";
135
+ readonly dnsMismatch: "The domain does not point at your server yet.";
136
+ readonly dnsPending: "DNS has not propagated yet. You can continue and verify later.";
137
+ readonly openRouterLabel: "OpenRouter API key";
138
+ readonly openRouterNote: "Severino talks to DeepSeek V4 Flash through OpenRouter. Set spending limits for this key in the OpenRouter dashboard.";
139
+ readonly routeAuthUsernameLabel: "Terminal username";
140
+ readonly routeAuthPasswordLabel: "Terminal password (at least 8 characters)";
141
+ readonly routeAuthNote: "Needed for eve dev against this VPS. Vercel login (/vc:login) does not work here. After install, run: eve dev https://USER:PASSWORD@your-host";
142
+ readonly routeAuthGenerate: "Generate a password";
143
+ readonly integrationsTitle: "Channels and tools (optional)";
144
+ readonly integrationsBody: "Everything below can stay empty and be filled in later by editing /opt/severino/.env on the server.";
145
+ readonly slackTokenLabel: "Slack bot token";
146
+ readonly slackSigningSecretLabel: "Slack signing secret";
147
+ readonly slackWebhookNote: "Create a new Slack app from the generated manifest below. Do not reuse a Vercel Connect bot token.";
148
+ readonly slackSetupTitle: "Create the Slack app";
149
+ readonly slackSetupBody: "This installer builds a Slack app manifest for your domain. Create a new app — do not edit a Vercel Connect bot.";
150
+ readonly slackSetupCreateApp: "Open Slack app directory";
151
+ readonly slackSetupStep1: "Open api.slack.com/apps → Create New App → From an app manifest → pick your workspace.";
152
+ readonly slackSetupStep2: "Paste the generated YAML and create the app.";
153
+ readonly slackSetupStep3: "OAuth & Permissions → Install to Workspace. Copy the Bot User OAuth Token (starts with xoxb-).";
154
+ readonly slackSetupStep4: "Basic Information → Signing Secret. Copy it into the fields above.";
155
+ readonly slackSetupStep5: "Event Subscriptions will fail URL verification until this install finishes and the container has the new secret. Then click Retry. It must say Verified.";
156
+ readonly slackSetupStep6: "Invite the bot into the channel with /invite @Severino, then mention it.";
157
+ readonly slackSetupManifestLabel: "Slack app manifest for this domain";
158
+ readonly slackSetupCopyManifest: "Copy manifest";
159
+ readonly slackSetupVerifyNote: "The Request URL in the manifest is already https://<domain>/eve/v1/slack. Slack verifies it only after the new signing secret is on the VPS.";
160
+ readonly mcpUrlLabel: "MCP task server URL";
161
+ readonly mcpUrlInvalid: "The MCP server URL must be a valid http(s) address.";
162
+ readonly mcpDescriptionLabel: "One line: what the MCP server's tools do";
163
+ readonly mcpBearerTokenLabel: "MCP server bearer token (leave empty for a server without auth)";
164
+ readonly stepReviewTitle: "Step 3 — Review and install";
165
+ readonly stepReviewBody: "Review the values below, then start the installation.";
166
+ readonly install: "Install";
167
+ readonly integrationSlack: "Slack";
168
+ readonly integrationMcp: "MCP task server";
169
+ readonly enabledLabel: "enabled";
170
+ readonly disabledLabel: "not configured";
171
+ readonly progressTitle: "Installing";
172
+ readonly progressMapLabel: "Installation phases";
173
+ readonly progressPhaseAccess: "Access";
174
+ readonly progressPhaseConfig: "Configure";
175
+ readonly progressPhaseDeploy: "Deploy";
176
+ readonly progressPhaseVerify: "Verify";
177
+ readonly progressGenerateKey: "Create a secure deploy key";
178
+ readonly progressConnectVps: "Connect to the server";
179
+ readonly progressAuthorizeKey: "Install the deploy key on the server";
180
+ readonly progressWriteEnv: "Write the server configuration";
181
+ readonly progressUploadSource: "Upload the project code to the server";
182
+ readonly progressUncommitted: "Warning: changes not yet committed on this computer were not sent; the server builds the latest commit.";
183
+ readonly progressBuildDeploy: "Build and start on the server — this can take several minutes";
184
+ readonly progressVerifyKey: "Confirm the deploy key works";
185
+ readonly progressVerifyAgent: "Verify the agent from the outside";
186
+ readonly progressSaveState: "Save the installer settings on this computer";
187
+ readonly progressFailed: "This step failed";
188
+ readonly progressSkipped: "Skipped";
189
+ readonly progressOpenLogs: "Open the deployment logs";
190
+ readonly installDone: "Your Severino is ready.";
191
+ readonly doneTitle: "All set";
192
+ readonly doneAgentUrl: "Your agent's address";
193
+ readonly doneConnectClient: "Talk to Severino on Slack if you connected it, or open the terminal UI with the command below. /vc:login is only for Vercel.";
194
+ readonly doneClose: "You can close this window. Run npm run installer again anytime.";
195
+ readonly githubActivateTitle: "Automatic deploys (optional)";
196
+ readonly githubActivateBody: "Connect GitHub once and every change pushed to your repository deploys by itself. You also get a deploy button and one-click rollback here in the installer. You can do this now or anytime later.";
197
+ readonly githubGuidePath: "On github.com: your avatar → Settings → Developer settings → Personal access tokens → Fine-grained tokens.";
198
+ readonly githubGuideStep1: "Open the token page with the button below and sign in to GitHub.";
199
+ readonly githubGuideStep2: "Name it severino-installer and set the expiration to 90 days.";
200
+ readonly githubGuideStep3: "Under Resource owner keep your account, and under Repository access choose Only select repositories and pick this repository.";
201
+ readonly githubGuideStep4: "Under Repository permissions set Actions to Read and write, Secrets to Read and write, and Contents to Read-only.";
202
+ readonly githubGuideStep5: "Click Generate token and copy it right away — GitHub shows it only once.";
203
+ readonly githubGuideOpen: "Create the token on GitHub";
204
+ readonly githubTokenLabel: "GitHub access token";
205
+ readonly githubRepositoryDetected: "Repository detected from this folder";
206
+ readonly githubRepositoryManual: "Type the repository as owner/name";
207
+ readonly githubConnect: "Activate automatic deploys";
208
+ readonly githubConnectedNote: "Automatic deploys are active.";
209
+ readonly githubPermissionActions: "Actions: Read and write";
210
+ readonly githubPermissionSecrets: "Secrets: Read and write";
211
+ readonly githubPermissionContents: "Contents: Read-only";
212
+ readonly githubTokenInvalid: "GitHub rejected this token. Create a new one and paste it again.";
213
+ readonly githubPermissionMissing: "This permission is missing on the token";
214
+ readonly dashboardTitle: "Your Severino";
215
+ readonly dashboardHealthCheck: "Verify now";
216
+ readonly heroAllGood: "All good";
217
+ readonly heroChecking: "Checking your server…";
218
+ readonly heroProblem: "Something needs attention";
219
+ readonly heroOnlineBody: "Your Severino is online and answering.";
220
+ readonly heroProblemBody: "The check found a problem — see Connections below.";
221
+ readonly heroLive: "LIVE";
222
+ readonly heroServerOnline: "Server online";
223
+ readonly heroServerOffline: "Server unreachable";
224
+ readonly connectionsTitle: "Connections";
225
+ readonly connServer: "Server";
226
+ readonly connAgent: "Agent";
227
+ readonly connWorkflow: "Workflow";
228
+ readonly connStatusOnline: "Online";
229
+ readonly connStatusWorking: "Working";
230
+ readonly connStatusMounted: "Mounted";
231
+ readonly connStatusFail: "Problem";
232
+ readonly connStatusWait: "Checking";
233
+ readonly viewDiagnostic: "See full diagnostic";
234
+ readonly hideDiagnostic: "Hide diagnostic";
235
+ readonly lastCheckedLabel: "Last check:";
236
+ readonly agoJustNow: "just now";
237
+ readonly heroVersionLabel: "Current version:";
238
+ readonly heroAutoOn: "Automatic updates on";
239
+ readonly heroAutoOff: "Automatic updates off";
240
+ readonly updateAvailable: "New version available";
241
+ readonly updatePublishing: "Publishing…";
242
+ readonly updateFailed: "Last publish failed";
243
+ readonly updateNow: "Update now";
244
+ readonly publishingNote: "Publishing can take a few minutes. This page updates by itself when it finishes.";
245
+ readonly historyTitle: "Update history";
246
+ readonly historyEmpty: "No updates yet.";
247
+ readonly historyShowAll: "Show all updates";
248
+ readonly historyShowLess: "Show fewer";
249
+ readonly runColumnVersion: "Version";
250
+ readonly runColumnDescription: "Description";
251
+ readonly runColumnStatus: "Status";
252
+ readonly runColumnWhen: "When";
253
+ readonly runStatusSuccess: "Success";
254
+ readonly runStatusFailure: "Failed";
255
+ readonly runStatusInProgress: "In progress";
256
+ readonly dashboardRollback: "Restore a previous version";
257
+ readonly dashboardRollbackHint: "Go back to an earlier stable version.";
258
+ readonly dashboardRollbackPick: "Choose an earlier successful version";
259
+ readonly dashboardRollbackApply: "Restore this version";
260
+ readonly rollbackIntro: "Puts an earlier version back on the air. It reuses the exact package that already worked before, so it is fast — one or two minutes — and low risk.";
261
+ readonly rollbackDataNote: "Your data is untouched: conversations and workflow state stay exactly as they are.";
262
+ readonly rollbackWindowNote: "The most recent versions stay available here. To move forward again, just update again.";
263
+ readonly rollbackCurrentTag: "on air now";
264
+ readonly rollbackConfirmTitle: "Restore this version?";
265
+ readonly rollbackConfirmBody: "Your server goes back to this exact package in a minute or two. Your data is not touched, and you can move forward again with a new update.";
266
+ readonly rollbackConfirmApply: "Yes, restore it";
267
+ readonly dashboardLinkActions: "Deployment history on GitHub";
268
+ readonly helpTitle: "Quick help";
269
+ readonly helpStep1Title: "Copy the agent address";
270
+ readonly helpStep1Body: "Use the button below to copy it.";
271
+ readonly helpStep2Title: "Talk on your channels";
272
+ readonly helpStep2Body: "Create the Slack app from the generated manifest, then mention @Severino in a channel where you invited the bot.";
273
+ readonly helpStep3Title: "Open the terminal UI";
274
+ readonly helpStep3Body: "From any eve project, run: eve dev https://USER:PASSWORD@<agent address>. /vc:login is only for Vercel.";
275
+ readonly helpStep4Title: "Check the connection";
276
+ readonly helpStep4Body: "Confirm the status shows online.";
277
+ readonly agentUrlLabel: "Agent URL";
278
+ readonly actionsTitle: "Actions";
279
+ readonly dashboardDeployLocal: "Upload new version";
280
+ readonly dashboardDeployLocalHint: "Send the latest code from this computer.";
281
+ readonly localConfirmTitle: "Upload the code from this computer?";
282
+ readonly localConfirmBody: "This sends the latest committed code on this computer and rebuilds it on your server.";
283
+ readonly localConfirmUncommitted: "Changes you have not committed yet are not included.";
284
+ readonly localConfirmAuto: "To publish through automatic deploys instead — and have it recorded in the history — merge into main and push.";
285
+ readonly localConfirmApply: "Yes, upload it";
286
+ readonly deployStartedNote: "Started — it takes a few minutes, and this page updates by itself.";
287
+ readonly dashboardReset: "Forget the settings on this computer";
288
+ readonly dashboardResetHint: "Nothing on your server is stopped or deleted; this only clears what the installer saved here.";
289
+ readonly dashboardResetConfirm: "This deletes the saved settings on this computer, including the deploy key and the GitHub token. Your server keeps running. Continue?";
290
+ readonly resetConfirmYes: "Yes, forget the settings";
291
+ readonly dashboardResetFinal: "Last confirmation: the deploy key and the GitHub token stored on this computer will be deleted. Your server keeps running. Continue?";
292
+ readonly footerLine: "Severino AI Coders Academy — Managed infrastructure for developers.";
293
+ readonly terminalRunningAt: "┌─ AI CODERS ACADEMY / SEVERINO\n│\n│ The installer is available at:\n│";
294
+ readonly terminalPressCtrlC: "└─ Press Ctrl+C to stop the installer.";
295
+ readonly terminalStartFailed: "The Severino installer could not be started.";
296
+ readonly terminalStopFailed: "┌─ AI CODERS ACADEMY / ERROR\n│\n│ ! The installer could not be stopped cleanly.\n└─";
297
+ readonly errorGeneric: "Something went wrong. The details are below.";
298
+ readonly errorBusy: "An installation is already running.";
299
+ };
300
+ export declare const installerMessages: {
301
+ readonly en: {
302
+ readonly appTitle: "Severino Installer";
303
+ readonly languageLabel: "Language";
304
+ readonly next: "Next";
305
+ readonly back: "Back";
306
+ readonly retry: "Retry";
307
+ readonly cancel: "Cancel";
308
+ readonly close: "Close";
309
+ readonly confirm: "Confirm";
310
+ readonly working: "Working…";
311
+ readonly copy: "Copy";
312
+ readonly copied: "Copied";
313
+ readonly wizardIntroTitle: "Welcome";
314
+ readonly wizardIntroBody: "This installer puts Severino, your task agent, on your own server, directly from this computer. It asks for everything it needs, step by step.";
315
+ readonly wizardProgressLabel: "Installation progress";
316
+ readonly wizardStepVps: "Connect VPS";
317
+ readonly wizardStepConfig: "Configure";
318
+ readonly wizardStepReview: "Review";
319
+ readonly recoverExistingPrompt: "Already installed on another computer?";
320
+ readonly recoverExistingCta: "Connect this computer";
321
+ readonly recoverTitle: "Connect to an existing server";
322
+ readonly recoverBody: "Enter the VPS access details. The installer will confirm the existing installation and save a new local connection for this computer.";
323
+ readonly recoverSecurityNote: "Your root password is used once and is never stored. The installer reads only the public hostname from the server.";
324
+ readonly recoverSubmit: "Connect existing server";
325
+ readonly recoverFailed: "This computer could not connect to the existing server.";
326
+ readonly stepVpsTitle: "Step 1 — Connect your VPS";
327
+ readonly stepVpsBody: "Enter the server details from Hostinger. The root password is used once to install a secure key; it is never stored.";
328
+ readonly vpsRecommendationTitle: "Don't have a VPS yet?";
329
+ readonly vpsRecommendationBody: "We recommend a Hostinger VPS for this installation.";
330
+ readonly vpsRecommendationDiscount: "Get 10% off with coupon AICODERS.";
331
+ readonly vpsRecommendationDiscountLabel: "Member coupon";
332
+ readonly vpsRecommendationDiscountSaving: "10% off";
333
+ readonly vpsRecommendationCopyCoupon: "Copy coupon";
334
+ readonly vpsRecommendationCouponCopied: "Coupon copied";
335
+ readonly vpsRecommendationOpen: "Need a VPS? View the Hostinger offer";
336
+ readonly vpsRecommendationCta: "Get a Hostinger VPS";
337
+ readonly vpsPartnersLink: "See more partner discounts";
338
+ readonly vpsHostLabel: "Server IP address or hostname";
339
+ readonly vpsPortLabel: "SSH port";
340
+ readonly vpsUserLabel: "User";
341
+ readonly vpsPasswordLabel: "Root password";
342
+ readonly vpsTest: "Test connection";
343
+ readonly vpsTestOk: "Connected to the server.";
344
+ readonly vpsUnreachable: "Could not reach the server. Check the IP address and that the VPS is running.";
345
+ readonly vpsTestAgain: "The secure connection check expired. Test the server again before installing.";
346
+ readonly showSecret: "Show";
347
+ readonly hideSecret: "Hide";
348
+ readonly vpsMethodLegend: "How do you want to configure the VPS?";
349
+ readonly vpsMethodHostinger: "Connect Hostinger";
350
+ readonly vpsMethodHostingerBody: "Find your VPS and fill its connection details automatically.";
351
+ readonly vpsMethodRecommended: "Recommended";
352
+ readonly vpsMethodManual: "Enter details manually";
353
+ readonly vpsMethodManualBody: "Use any provider or enter custom SSH settings.";
354
+ readonly hostingerConnectTitle: "Connect your Hostinger account";
355
+ readonly hostingerConnectBody: "Create a temporary API token, then use it once to find your VPS. The token stays only in this installer session.";
356
+ readonly hostingerTokenLabel: "Hostinger API token";
357
+ readonly hostingerTokenOpen: "Create a token in hPanel";
358
+ readonly hostingerTokenSecurity: "The token is kept in memory, never written to the installer settings, and cleared after handoff.";
359
+ readonly hostingerFindVps: "Find my VPSs";
360
+ readonly hostingerConnected: "Hostinger connected";
361
+ readonly hostingerChangeAccount: "Change account";
362
+ readonly hostingerRefresh: "Refresh list";
363
+ readonly hostingerNoVps: "No VPS was found in this Hostinger account.";
364
+ readonly hostingerPickVps: "Choose the VPS for your Severino";
365
+ readonly hostingerVpsId: "VPS ID";
366
+ readonly hostingerPlan: "Plan";
367
+ readonly hostingerTemplate: "Template";
368
+ readonly hostingerIp: "IPv4";
369
+ readonly hostingerStateRunning: "Ready";
370
+ readonly hostingerStateUnavailable: "Unavailable";
371
+ readonly hostingerUnavailablePreparing: "Hostinger is still preparing this VPS.";
372
+ readonly hostingerUnavailableLocked: "Hostinger is finishing another action on this VPS.";
373
+ readonly hostingerUnavailableState: "Start or repair this VPS in hPanel before continuing.";
374
+ readonly hostingerUnavailableIpv4: "This VPS does not have a usable IPv4 address.";
375
+ readonly hostingerUnavailableTemplate: "The Hostinger Docker template is required for this installation.";
376
+ readonly hostingerRootTitle: "Confirm administrator access";
377
+ readonly hostingerRootBody: "Enter the root password once. After SSH is verified, the password leaves this page and a secure deploy key is installed during setup.";
378
+ readonly rootPasswordForgot: "I don't remember the root password";
379
+ readonly rootResetTitle: "Choose a new root password";
380
+ readonly rootResetBody: "Hostinger can replace the password without asking for the current one.";
381
+ readonly rootResetPasswordLabel: "New root password";
382
+ readonly rootResetConfirmLabel: "Confirm the new root password";
383
+ readonly rootResetGeneratePassword: "Generate strong password";
384
+ readonly rootResetGeneratedNote: "A strong API-compatible 24-character password with letters, numbers, and Hostinger-supported symbols was generated and filled into both fields. Save it in your password manager before continuing.";
385
+ readonly rootResetRequirementLength: "At least 12 characters";
386
+ readonly rootResetRequirementUppercase: "At least one uppercase letter";
387
+ readonly rootResetRequirementLowercase: "At least one lowercase letter";
388
+ readonly rootResetRequirementNumber: "At least one number";
389
+ readonly rootResetRequirementSymbol: "At least one allowed symbol: -().&@?'#,/;+";
390
+ readonly rootResetRequirementCharacters: "Only letters, numbers, and allowed symbols";
391
+ readonly rootResetRequirementMatch: "Both password fields match";
392
+ readonly rootResetLeakNote: "Hostinger also rejects passwords found in public leak databases.";
393
+ readonly rootResetReview: "Review password change";
394
+ readonly rootResetConfirmTitle: "Confirm root password change";
395
+ readonly rootResetConfirmBody: "The current root password will stop working for new connections as soon as Hostinger completes this action.";
396
+ readonly rootResetTarget: "This action changes";
397
+ readonly rootResetTypeHostname: "Type the VPS hostname to confirm";
398
+ readonly rootResetNow: "Change root password now";
399
+ readonly rootResetWorking: "Hostinger is updating the VPS…";
400
+ readonly rootResetSuccess: "Root password changed. Testing SSH with the new password…";
401
+ readonly rootResetSshPending: "Hostinger changed the password, but SSH is not accepting it yet. Wait a moment, then test the new password again.";
402
+ readonly rootResetOutcomeUnknown: "Hostinger may still be processing the password change. Do not submit it again; test the new password before retrying.";
403
+ readonly rootResetCancel: "Keep the current password";
404
+ readonly hostingerErrorInvalidInput: "Check the supplied values and try again.";
405
+ readonly hostingerErrorUnauthorized: "Hostinger rejected this token. Create a new token and reconnect.";
406
+ readonly hostingerErrorRateLimited: "Hostinger's request limit was reached. Wait a moment and try again.";
407
+ readonly hostingerErrorUnavailable: "Hostinger is temporarily unavailable. Manual configuration is still available.";
408
+ readonly hostingerErrorInvalidResponse: "Hostinger returned an unexpected response. Try again later or configure the VPS manually.";
409
+ readonly hostingerErrorNotConnected: "Reconnect Hostinger before continuing.";
410
+ readonly hostingerErrorRequestRejected: "Hostinger rejected the password-change request, but did not identify the password field as the cause. Check the VPS status and recent actions in hPanel before trying again.";
411
+ readonly hostingerErrorPasswordPolicy: "Hostinger rejected this password. Use only letters, numbers, and these symbols: -().&@?'#,/;+. Also avoid leaked or common passwords.";
412
+ readonly hostingerErrorActionFailed: "Hostinger could not change the root password. Review the VPS in hPanel before retrying.";
413
+ readonly hostingerErrorActionTimeout: "The password change did not finish in time. It may still be processing; test the new password before retrying.";
414
+ readonly hostingerErrorConfirmation: "This confirmation expired or is no longer valid. Review the password change again.";
415
+ readonly hostingerErrorTargetChanged: "The VPS changed after confirmation. Refresh the list and review the target again.";
416
+ readonly hostingerErrorTargetUnavailable: "This VPS cannot be changed right now. Wait for Hostinger to finish its current action.";
417
+ readonly hostingerErrorConflict: "Another installer operation is already running.";
418
+ readonly stepConfigTitle: "Step 2 — Configure your Severino";
419
+ readonly stepConfigBody: "These values configure the model access, the public address, and the channels your agent answers on.";
420
+ readonly domainLabel: "Your domain (for example severino.example.com)";
421
+ readonly hostingerVpsDomainLabel: "Your Hostinger VPS domain";
422
+ readonly hostingerSubdomainLabel: "Subdomain";
423
+ readonly hostingerFinalDomainLabel: "Final Severino address";
424
+ readonly hostingerDomainNote: "Hostinger's wildcard DNS automatically points this subdomain to the selected VPS.";
425
+ readonly hostingerSubdomainInvalid: "Use 1–63 lowercase letters, numbers, or hyphens. The subdomain cannot start or end with a hyphen.";
426
+ readonly dnsCheck: "Check DNS";
427
+ readonly dnsMatch: "The domain points at your server.";
428
+ readonly dnsMismatch: "The domain does not point at your server yet.";
429
+ readonly dnsPending: "DNS has not propagated yet. You can continue and verify later.";
430
+ readonly openRouterLabel: "OpenRouter API key";
431
+ readonly openRouterNote: "Severino talks to DeepSeek V4 Flash through OpenRouter. Set spending limits for this key in the OpenRouter dashboard.";
432
+ readonly routeAuthUsernameLabel: "Terminal username";
433
+ readonly routeAuthPasswordLabel: "Terminal password (at least 8 characters)";
434
+ readonly routeAuthNote: "Needed for eve dev against this VPS. Vercel login (/vc:login) does not work here. After install, run: eve dev https://USER:PASSWORD@your-host";
435
+ readonly routeAuthGenerate: "Generate a password";
436
+ readonly integrationsTitle: "Channels and tools (optional)";
437
+ readonly integrationsBody: "Everything below can stay empty and be filled in later by editing /opt/severino/.env on the server.";
438
+ readonly slackTokenLabel: "Slack bot token";
439
+ readonly slackSigningSecretLabel: "Slack signing secret";
440
+ readonly slackWebhookNote: "Create a new Slack app from the generated manifest below. Do not reuse a Vercel Connect bot token.";
441
+ readonly slackSetupTitle: "Create the Slack app";
442
+ readonly slackSetupBody: "This installer builds a Slack app manifest for your domain. Create a new app — do not edit a Vercel Connect bot.";
443
+ readonly slackSetupCreateApp: "Open Slack app directory";
444
+ readonly slackSetupStep1: "Open api.slack.com/apps → Create New App → From an app manifest → pick your workspace.";
445
+ readonly slackSetupStep2: "Paste the generated YAML and create the app.";
446
+ readonly slackSetupStep3: "OAuth & Permissions → Install to Workspace. Copy the Bot User OAuth Token (starts with xoxb-).";
447
+ readonly slackSetupStep4: "Basic Information → Signing Secret. Copy it into the fields above.";
448
+ readonly slackSetupStep5: "Event Subscriptions will fail URL verification until this install finishes and the container has the new secret. Then click Retry. It must say Verified.";
449
+ readonly slackSetupStep6: "Invite the bot into the channel with /invite @Severino, then mention it.";
450
+ readonly slackSetupManifestLabel: "Slack app manifest for this domain";
451
+ readonly slackSetupCopyManifest: "Copy manifest";
452
+ readonly slackSetupVerifyNote: "The Request URL in the manifest is already https://<domain>/eve/v1/slack. Slack verifies it only after the new signing secret is on the VPS.";
453
+ readonly mcpUrlLabel: "MCP task server URL";
454
+ readonly mcpUrlInvalid: "The MCP server URL must be a valid http(s) address.";
455
+ readonly mcpDescriptionLabel: "One line: what the MCP server's tools do";
456
+ readonly mcpBearerTokenLabel: "MCP server bearer token (leave empty for a server without auth)";
457
+ readonly stepReviewTitle: "Step 3 — Review and install";
458
+ readonly stepReviewBody: "Review the values below, then start the installation.";
459
+ readonly install: "Install";
460
+ readonly integrationSlack: "Slack";
461
+ readonly integrationMcp: "MCP task server";
462
+ readonly enabledLabel: "enabled";
463
+ readonly disabledLabel: "not configured";
464
+ readonly progressTitle: "Installing";
465
+ readonly progressMapLabel: "Installation phases";
466
+ readonly progressPhaseAccess: "Access";
467
+ readonly progressPhaseConfig: "Configure";
468
+ readonly progressPhaseDeploy: "Deploy";
469
+ readonly progressPhaseVerify: "Verify";
470
+ readonly progressGenerateKey: "Create a secure deploy key";
471
+ readonly progressConnectVps: "Connect to the server";
472
+ readonly progressAuthorizeKey: "Install the deploy key on the server";
473
+ readonly progressWriteEnv: "Write the server configuration";
474
+ readonly progressUploadSource: "Upload the project code to the server";
475
+ readonly progressUncommitted: "Warning: changes not yet committed on this computer were not sent; the server builds the latest commit.";
476
+ readonly progressBuildDeploy: "Build and start on the server — this can take several minutes";
477
+ readonly progressVerifyKey: "Confirm the deploy key works";
478
+ readonly progressVerifyAgent: "Verify the agent from the outside";
479
+ readonly progressSaveState: "Save the installer settings on this computer";
480
+ readonly progressFailed: "This step failed";
481
+ readonly progressSkipped: "Skipped";
482
+ readonly progressOpenLogs: "Open the deployment logs";
483
+ readonly installDone: "Your Severino is ready.";
484
+ readonly doneTitle: "All set";
485
+ readonly doneAgentUrl: "Your agent's address";
486
+ readonly doneConnectClient: "Talk to Severino on Slack if you connected it, or open the terminal UI with the command below. /vc:login is only for Vercel.";
487
+ readonly doneClose: "You can close this window. Run npm run installer again anytime.";
488
+ readonly githubActivateTitle: "Automatic deploys (optional)";
489
+ readonly githubActivateBody: "Connect GitHub once and every change pushed to your repository deploys by itself. You also get a deploy button and one-click rollback here in the installer. You can do this now or anytime later.";
490
+ readonly githubGuidePath: "On github.com: your avatar → Settings → Developer settings → Personal access tokens → Fine-grained tokens.";
491
+ readonly githubGuideStep1: "Open the token page with the button below and sign in to GitHub.";
492
+ readonly githubGuideStep2: "Name it severino-installer and set the expiration to 90 days.";
493
+ readonly githubGuideStep3: "Under Resource owner keep your account, and under Repository access choose Only select repositories and pick this repository.";
494
+ readonly githubGuideStep4: "Under Repository permissions set Actions to Read and write, Secrets to Read and write, and Contents to Read-only.";
495
+ readonly githubGuideStep5: "Click Generate token and copy it right away — GitHub shows it only once.";
496
+ readonly githubGuideOpen: "Create the token on GitHub";
497
+ readonly githubTokenLabel: "GitHub access token";
498
+ readonly githubRepositoryDetected: "Repository detected from this folder";
499
+ readonly githubRepositoryManual: "Type the repository as owner/name";
500
+ readonly githubConnect: "Activate automatic deploys";
501
+ readonly githubConnectedNote: "Automatic deploys are active.";
502
+ readonly githubPermissionActions: "Actions: Read and write";
503
+ readonly githubPermissionSecrets: "Secrets: Read and write";
504
+ readonly githubPermissionContents: "Contents: Read-only";
505
+ readonly githubTokenInvalid: "GitHub rejected this token. Create a new one and paste it again.";
506
+ readonly githubPermissionMissing: "This permission is missing on the token";
507
+ readonly dashboardTitle: "Your Severino";
508
+ readonly dashboardHealthCheck: "Verify now";
509
+ readonly heroAllGood: "All good";
510
+ readonly heroChecking: "Checking your server…";
511
+ readonly heroProblem: "Something needs attention";
512
+ readonly heroOnlineBody: "Your Severino is online and answering.";
513
+ readonly heroProblemBody: "The check found a problem — see Connections below.";
514
+ readonly heroLive: "LIVE";
515
+ readonly heroServerOnline: "Server online";
516
+ readonly heroServerOffline: "Server unreachable";
517
+ readonly connectionsTitle: "Connections";
518
+ readonly connServer: "Server";
519
+ readonly connAgent: "Agent";
520
+ readonly connWorkflow: "Workflow";
521
+ readonly connStatusOnline: "Online";
522
+ readonly connStatusWorking: "Working";
523
+ readonly connStatusMounted: "Mounted";
524
+ readonly connStatusFail: "Problem";
525
+ readonly connStatusWait: "Checking";
526
+ readonly viewDiagnostic: "See full diagnostic";
527
+ readonly hideDiagnostic: "Hide diagnostic";
528
+ readonly lastCheckedLabel: "Last check:";
529
+ readonly agoJustNow: "just now";
530
+ readonly heroVersionLabel: "Current version:";
531
+ readonly heroAutoOn: "Automatic updates on";
532
+ readonly heroAutoOff: "Automatic updates off";
533
+ readonly updateAvailable: "New version available";
534
+ readonly updatePublishing: "Publishing…";
535
+ readonly updateFailed: "Last publish failed";
536
+ readonly updateNow: "Update now";
537
+ readonly publishingNote: "Publishing can take a few minutes. This page updates by itself when it finishes.";
538
+ readonly historyTitle: "Update history";
539
+ readonly historyEmpty: "No updates yet.";
540
+ readonly historyShowAll: "Show all updates";
541
+ readonly historyShowLess: "Show fewer";
542
+ readonly runColumnVersion: "Version";
543
+ readonly runColumnDescription: "Description";
544
+ readonly runColumnStatus: "Status";
545
+ readonly runColumnWhen: "When";
546
+ readonly runStatusSuccess: "Success";
547
+ readonly runStatusFailure: "Failed";
548
+ readonly runStatusInProgress: "In progress";
549
+ readonly dashboardRollback: "Restore a previous version";
550
+ readonly dashboardRollbackHint: "Go back to an earlier stable version.";
551
+ readonly dashboardRollbackPick: "Choose an earlier successful version";
552
+ readonly dashboardRollbackApply: "Restore this version";
553
+ readonly rollbackIntro: "Puts an earlier version back on the air. It reuses the exact package that already worked before, so it is fast — one or two minutes — and low risk.";
554
+ readonly rollbackDataNote: "Your data is untouched: conversations and workflow state stay exactly as they are.";
555
+ readonly rollbackWindowNote: "The most recent versions stay available here. To move forward again, just update again.";
556
+ readonly rollbackCurrentTag: "on air now";
557
+ readonly rollbackConfirmTitle: "Restore this version?";
558
+ readonly rollbackConfirmBody: "Your server goes back to this exact package in a minute or two. Your data is not touched, and you can move forward again with a new update.";
559
+ readonly rollbackConfirmApply: "Yes, restore it";
560
+ readonly dashboardLinkActions: "Deployment history on GitHub";
561
+ readonly helpTitle: "Quick help";
562
+ readonly helpStep1Title: "Copy the agent address";
563
+ readonly helpStep1Body: "Use the button below to copy it.";
564
+ readonly helpStep2Title: "Talk on your channels";
565
+ readonly helpStep2Body: "Create the Slack app from the generated manifest, then mention @Severino in a channel where you invited the bot.";
566
+ readonly helpStep3Title: "Open the terminal UI";
567
+ readonly helpStep3Body: "From any eve project, run: eve dev https://USER:PASSWORD@<agent address>. /vc:login is only for Vercel.";
568
+ readonly helpStep4Title: "Check the connection";
569
+ readonly helpStep4Body: "Confirm the status shows online.";
570
+ readonly agentUrlLabel: "Agent URL";
571
+ readonly actionsTitle: "Actions";
572
+ readonly dashboardDeployLocal: "Upload new version";
573
+ readonly dashboardDeployLocalHint: "Send the latest code from this computer.";
574
+ readonly localConfirmTitle: "Upload the code from this computer?";
575
+ readonly localConfirmBody: "This sends the latest committed code on this computer and rebuilds it on your server.";
576
+ readonly localConfirmUncommitted: "Changes you have not committed yet are not included.";
577
+ readonly localConfirmAuto: "To publish through automatic deploys instead — and have it recorded in the history — merge into main and push.";
578
+ readonly localConfirmApply: "Yes, upload it";
579
+ readonly deployStartedNote: "Started — it takes a few minutes, and this page updates by itself.";
580
+ readonly dashboardReset: "Forget the settings on this computer";
581
+ readonly dashboardResetHint: "Nothing on your server is stopped or deleted; this only clears what the installer saved here.";
582
+ readonly dashboardResetConfirm: "This deletes the saved settings on this computer, including the deploy key and the GitHub token. Your server keeps running. Continue?";
583
+ readonly resetConfirmYes: "Yes, forget the settings";
584
+ readonly dashboardResetFinal: "Last confirmation: the deploy key and the GitHub token stored on this computer will be deleted. Your server keeps running. Continue?";
585
+ readonly footerLine: "Severino AI Coders Academy — Managed infrastructure for developers.";
586
+ readonly terminalRunningAt: "┌─ AI CODERS ACADEMY / SEVERINO\n│\n│ The installer is available at:\n│";
587
+ readonly terminalPressCtrlC: "└─ Press Ctrl+C to stop the installer.";
588
+ readonly terminalStartFailed: "The Severino installer could not be started.";
589
+ readonly terminalStopFailed: "┌─ AI CODERS ACADEMY / ERROR\n│\n│ ! The installer could not be stopped cleanly.\n└─";
590
+ readonly errorGeneric: "Something went wrong. The details are below.";
591
+ readonly errorBusy: "An installation is already running.";
592
+ };
593
+ readonly "pt-BR": {
594
+ readonly appTitle: "Instalador do Severino";
595
+ readonly languageLabel: "Idioma";
596
+ readonly next: "Avançar";
597
+ readonly back: "Voltar";
598
+ readonly retry: "Tentar novamente";
599
+ readonly cancel: "Cancelar";
600
+ readonly close: "Fechar";
601
+ readonly confirm: "Confirmar";
602
+ readonly working: "Processando…";
603
+ readonly copy: "Copiar";
604
+ readonly copied: "Copiado";
605
+ readonly wizardIntroTitle: "Bem-vindo";
606
+ readonly wizardIntroBody: "Este instalador coloca o Severino, o seu agente de tarefas, no seu próprio servidor, direto deste computador. Ele pede tudo o que precisa, passo a passo.";
607
+ readonly wizardProgressLabel: "Progresso da instalação";
608
+ readonly wizardStepVps: "Conectar VPS";
609
+ readonly wizardStepConfig: "Configurar";
610
+ readonly wizardStepReview: "Revisar";
611
+ readonly recoverExistingPrompt: "Já instalou em outro computador?";
612
+ readonly recoverExistingCta: "Conectar este computador";
613
+ readonly recoverTitle: "Conectar a um servidor existente";
614
+ readonly recoverBody: "Informe os dados de acesso ao VPS. O instalador confirma a instalação existente e salva uma nova conexão local neste computador.";
615
+ readonly recoverSecurityNote: "A senha de root é usada uma vez e nunca é guardada. O instalador lê apenas o hostname público do servidor.";
616
+ readonly recoverSubmit: "Conectar servidor existente";
617
+ readonly recoverFailed: "Este computador não conseguiu se conectar ao servidor existente.";
618
+ readonly stepVpsTitle: "Passo 1 — Conectar o seu VPS";
619
+ readonly stepVpsBody: "Informe os dados do servidor na Hostinger. A senha de root é usada uma única vez para instalar uma chave segura; ela nunca é guardada.";
620
+ readonly vpsRecommendationTitle: "Ainda não tem um VPS?";
621
+ readonly vpsRecommendationBody: "Recomendamos um VPS da Hostinger para esta instalação.";
622
+ readonly vpsRecommendationDiscount: "Garanta 10% de desconto com o cupom AICODERS.";
623
+ readonly vpsRecommendationDiscountLabel: "Cupom de membro";
624
+ readonly vpsRecommendationDiscountSaving: "10% de desconto";
625
+ readonly vpsRecommendationCopyCoupon: "Copiar cupom";
626
+ readonly vpsRecommendationCouponCopied: "Cupom copiado";
627
+ readonly vpsRecommendationOpen: "Ainda não tem um VPS? Ver oferta da Hostinger";
628
+ readonly vpsRecommendationCta: "Contratar VPS na Hostinger";
629
+ readonly vpsPartnersLink: "Conferir mais descontos de parceiros";
630
+ readonly vpsHostLabel: "Endereço IP ou hostname do servidor";
631
+ readonly vpsPortLabel: "Porta SSH";
632
+ readonly vpsUserLabel: "Usuário";
633
+ readonly vpsPasswordLabel: "Senha de root";
634
+ readonly vpsTest: "Testar conexão";
635
+ readonly vpsTestOk: "Conectado ao servidor.";
636
+ readonly vpsUnreachable: "Não foi possível alcançar o servidor. Confira o IP e se o VPS está ligado.";
637
+ readonly vpsTestAgain: "A verificação segura expirou. Teste o servidor novamente antes de instalar.";
638
+ readonly showSecret: "Mostrar";
639
+ readonly hideSecret: "Ocultar";
640
+ readonly vpsMethodLegend: "Como você quer configurar o VPS?";
641
+ readonly vpsMethodHostinger: "Conectar Hostinger";
642
+ readonly vpsMethodHostingerBody: "Encontre o seu VPS e preencha os dados de conexão automaticamente.";
643
+ readonly vpsMethodRecommended: "Recomendado";
644
+ readonly vpsMethodManual: "Informar dados manualmente";
645
+ readonly vpsMethodManualBody: "Use qualquer provedor ou informe uma configuração SSH personalizada.";
646
+ readonly hostingerConnectTitle: "Conecte sua conta Hostinger";
647
+ readonly hostingerConnectBody: "Crie um token temporário de API e use-o uma vez para encontrar seu VPS. O token fica somente nesta sessão do instalador.";
648
+ readonly hostingerTokenLabel: "Token da API Hostinger";
649
+ readonly hostingerTokenOpen: "Criar token no hPanel";
650
+ readonly hostingerTokenSecurity: "O token fica na memória, nunca é gravado nas configurações do instalador e é apagado depois do uso.";
651
+ readonly hostingerFindVps: "Encontrar meus VPSs";
652
+ readonly hostingerConnected: "Hostinger conectada";
653
+ readonly hostingerChangeAccount: "Trocar conta";
654
+ readonly hostingerRefresh: "Atualizar lista";
655
+ readonly hostingerNoVps: "Nenhum VPS foi encontrado nesta conta Hostinger.";
656
+ readonly hostingerPickVps: "Escolha o VPS do seu Severino";
657
+ readonly hostingerVpsId: "ID do VPS";
658
+ readonly hostingerPlan: "Plano";
659
+ readonly hostingerTemplate: "Template";
660
+ readonly hostingerIp: "IPv4";
661
+ readonly hostingerStateRunning: "Pronto";
662
+ readonly hostingerStateUnavailable: "Indisponível";
663
+ readonly hostingerUnavailablePreparing: "A Hostinger ainda está preparando este VPS.";
664
+ readonly hostingerUnavailableLocked: "A Hostinger está finalizando outra ação neste VPS.";
665
+ readonly hostingerUnavailableState: "Ligue ou repare este VPS no hPanel antes de continuar.";
666
+ readonly hostingerUnavailableIpv4: "Este VPS não possui um endereço IPv4 utilizável.";
667
+ readonly hostingerUnavailableTemplate: "Esta instalação exige o template Docker da Hostinger.";
668
+ readonly hostingerRootTitle: "Confirme o acesso de administrador";
669
+ readonly hostingerRootBody: "Informe a senha de root uma vez. Depois da verificação SSH, a senha sai desta página e uma chave segura de deploy é instalada durante a configuração.";
670
+ readonly rootPasswordForgot: "Não lembro a senha de root";
671
+ readonly rootResetTitle: "Escolha uma nova senha de root";
672
+ readonly rootResetBody: "A Hostinger pode substituir a senha sem pedir a senha atual.";
673
+ readonly rootResetPasswordLabel: "Nova senha de root";
674
+ readonly rootResetConfirmLabel: "Confirme a nova senha de root";
675
+ readonly rootResetGeneratePassword: "Gerar senha forte";
676
+ readonly rootResetGeneratedNote: "Uma senha forte de 24 caracteres, compatível com a API e formada por letras, números e símbolos aceitos pela Hostinger, foi gerada e preenchida nos dois campos. Salve ela no seu gerenciador de senhas antes de continuar.";
677
+ readonly rootResetRequirementLength: "Pelo menos 12 caracteres";
678
+ readonly rootResetRequirementUppercase: "Pelo menos uma letra maiúscula";
679
+ readonly rootResetRequirementLowercase: "Pelo menos uma letra minúscula";
680
+ readonly rootResetRequirementNumber: "Pelo menos um número";
681
+ readonly rootResetRequirementSymbol: "Pelo menos um símbolo permitido: -().&@?'#,/;+";
682
+ readonly rootResetRequirementCharacters: "Somente letras, números e símbolos permitidos";
683
+ readonly rootResetRequirementMatch: "Os dois campos de senha são iguais";
684
+ readonly rootResetLeakNote: "A Hostinger também rejeita senhas encontradas em bases públicas de vazamentos.";
685
+ readonly rootResetReview: "Revisar troca de senha";
686
+ readonly rootResetConfirmTitle: "Confirme a troca da senha de root";
687
+ readonly rootResetConfirmBody: "A senha de root atual deixará de funcionar em novas conexões assim que a Hostinger concluir esta ação.";
688
+ readonly rootResetTarget: "Esta ação altera";
689
+ readonly rootResetTypeHostname: "Digite o hostname do VPS para confirmar";
690
+ readonly rootResetNow: "Trocar a senha de root agora";
691
+ readonly rootResetWorking: "A Hostinger está atualizando o VPS…";
692
+ readonly rootResetSuccess: "Senha de root alterada. Testando o SSH com a nova senha…";
693
+ readonly rootResetSshPending: "A Hostinger trocou a senha, mas o SSH ainda não está aceitando ela. Aguarde um momento e teste a nova senha de novo.";
694
+ readonly rootResetOutcomeUnknown: "A Hostinger talvez ainda esteja processando a troca. Não envie novamente; teste a nova senha antes de tentar de novo.";
695
+ readonly rootResetCancel: "Manter a senha atual";
696
+ readonly hostingerErrorInvalidInput: "Confira os dados informados e tente novamente.";
697
+ readonly hostingerErrorUnauthorized: "A Hostinger recusou este token. Crie um novo token e reconecte.";
698
+ readonly hostingerErrorRateLimited: "O limite de requisições da Hostinger foi atingido. Aguarde um pouco e tente novamente.";
699
+ readonly hostingerErrorUnavailable: "A Hostinger está temporariamente indisponível. A configuração manual continua disponível.";
700
+ readonly hostingerErrorInvalidResponse: "A Hostinger retornou uma resposta inesperada. Tente mais tarde ou configure o VPS manualmente.";
701
+ readonly hostingerErrorNotConnected: "Reconecte a Hostinger antes de continuar.";
702
+ readonly hostingerErrorRequestRejected: "A Hostinger recusou o pedido de troca, mas não indicou o campo de senha como a causa. Confira o estado do VPS e as ações recentes no hPanel antes de tentar novamente.";
703
+ readonly hostingerErrorPasswordPolicy: "A Hostinger recusou esta senha. Use somente letras, números e estes símbolos: -().&@?'#,/;+. Também evite senhas vazadas ou comuns.";
704
+ readonly hostingerErrorActionFailed: "A Hostinger não conseguiu trocar a senha de root. Confira o VPS no hPanel antes de tentar novamente.";
705
+ readonly hostingerErrorActionTimeout: "A troca de senha não terminou a tempo. Ela pode continuar em processamento; teste a nova senha antes de tentar de novo.";
706
+ readonly hostingerErrorConfirmation: "Esta confirmação expirou ou não é mais válida. Revise a troca de senha novamente.";
707
+ readonly hostingerErrorTargetChanged: "O VPS mudou depois da confirmação. Atualize a lista e revise o destino novamente.";
708
+ readonly hostingerErrorTargetUnavailable: "Este VPS não pode ser alterado agora. Aguarde a Hostinger terminar a ação atual.";
709
+ readonly hostingerErrorConflict: "Outra operação do instalador já está em andamento.";
710
+ readonly stepConfigTitle: "Passo 2 — Configurar o seu Severino";
711
+ readonly stepConfigBody: "Estes valores configuram o acesso ao modelo, o endereço público e os canais em que o seu agente responde.";
712
+ readonly domainLabel: "Seu domínio (por exemplo severino.exemplo.com)";
713
+ readonly hostingerVpsDomainLabel: "Domínio do seu VPS na Hostinger";
714
+ readonly hostingerSubdomainLabel: "Subdomínio";
715
+ readonly hostingerFinalDomainLabel: "Endereço final do Severino";
716
+ readonly hostingerDomainNote: "O DNS curinga da Hostinger aponta este subdomínio automaticamente para o VPS selecionado.";
717
+ readonly hostingerSubdomainInvalid: "Use de 1 a 63 letras minúsculas, números ou hifens. O subdomínio não pode começar nem terminar com hífen.";
718
+ readonly dnsCheck: "Verificar DNS";
719
+ readonly dnsMatch: "O domínio aponta para o seu servidor.";
720
+ readonly dnsMismatch: "O domínio ainda não aponta para o seu servidor.";
721
+ readonly dnsPending: "O DNS ainda não propagou. Você pode continuar e verificar depois.";
722
+ readonly openRouterLabel: "Chave de API da OpenRouter";
723
+ readonly openRouterNote: "O Severino conversa com o DeepSeek V4 Flash pela OpenRouter. Configure limites de gasto para esta chave no painel da OpenRouter.";
724
+ readonly routeAuthUsernameLabel: "Usuário do terminal";
725
+ readonly routeAuthPasswordLabel: "Senha do terminal (pelo menos 8 caracteres)";
726
+ readonly routeAuthNote: "Necessário para o eve dev nesta VPS. O login da Vercel (/vc:login) não funciona aqui. Depois da instalação, rode: eve dev https://USUARIO:SENHA@seu-host";
727
+ readonly routeAuthGenerate: "Gerar uma senha";
728
+ readonly integrationsTitle: "Canais e ferramentas (opcional)";
729
+ readonly integrationsBody: "Tudo abaixo pode ficar vazio e ser preenchido depois editando /opt/severino/.env no servidor.";
730
+ readonly slackTokenLabel: "Token do bot do Slack";
731
+ readonly slackSigningSecretLabel: "Signing secret do Slack";
732
+ readonly slackWebhookNote: "Crie um app Slack novo com o manifesto gerado abaixo. Não reutilize um token de bot do Vercel Connect.";
733
+ readonly slackSetupTitle: "Criar o app Slack";
734
+ readonly slackSetupBody: "Este instalador monta o manifesto do app Slack para o seu domínio. Crie um app novo — não edite um bot do Vercel Connect.";
735
+ readonly slackSetupCreateApp: "Abrir a lista de apps Slack";
736
+ readonly slackSetupStep1: "Abra api.slack.com/apps → Create New App → From an app manifest → escolha o workspace.";
737
+ readonly slackSetupStep2: "Cole o YAML gerado e crie o app.";
738
+ readonly slackSetupStep3: "OAuth & Permissions → Install to Workspace. Copie o Bot User OAuth Token (começa com xoxb-).";
739
+ readonly slackSetupStep4: "Basic Information → Signing Secret. Cole nos campos acima.";
740
+ readonly slackSetupStep5: "A verificação da URL em Event Subscriptions falha até esta instalação terminar e o container ter o secret novo. Depois clique Retry. Tem que ficar Verified.";
741
+ readonly slackSetupStep6: "Convide o bot no canal com /invite @Severino e mencione-o.";
742
+ readonly slackSetupManifestLabel: "Manifesto do app Slack para este domínio";
743
+ readonly slackSetupCopyManifest: "Copiar manifesto";
744
+ readonly slackSetupVerifyNote: "A Request URL no manifesto já é https://<domínio>/eve/v1/slack. O Slack só verifica depois que o signing secret novo estiver na VPS.";
745
+ readonly mcpUrlLabel: "URL do servidor MCP de tarefas";
746
+ readonly mcpUrlInvalid: "A URL do servidor MCP precisa ser um endereço http(s) válido.";
747
+ readonly mcpDescriptionLabel: "Uma linha: o que as ferramentas do servidor MCP fazem";
748
+ readonly mcpBearerTokenLabel: "Token bearer do servidor MCP (vazio para um servidor sem autenticação)";
749
+ readonly stepReviewTitle: "Passo 3 — Revisar e instalar";
750
+ readonly stepReviewBody: "Revise os valores abaixo e inicie a instalação.";
751
+ readonly install: "Instalar";
752
+ readonly integrationSlack: "Slack";
753
+ readonly integrationMcp: "Servidor MCP de tarefas";
754
+ readonly enabledLabel: "ativado";
755
+ readonly disabledLabel: "não configurado";
756
+ readonly progressTitle: "Instalando";
757
+ readonly progressMapLabel: "Fases da instalação";
758
+ readonly progressPhaseAccess: "Acesso";
759
+ readonly progressPhaseConfig: "Configurar";
760
+ readonly progressPhaseDeploy: "Deploy";
761
+ readonly progressPhaseVerify: "Verificar";
762
+ readonly progressGenerateKey: "Criar uma chave de deploy segura";
763
+ readonly progressConnectVps: "Conectar ao servidor";
764
+ readonly progressAuthorizeKey: "Instalar a chave de deploy no servidor";
765
+ readonly progressWriteEnv: "Gravar a configuração do servidor";
766
+ readonly progressUploadSource: "Enviar o código do projeto para o servidor";
767
+ readonly progressUncommitted: "Atenção: mudanças ainda não commitadas neste computador não foram enviadas; o servidor constrói o último commit.";
768
+ readonly progressBuildDeploy: "Construir e iniciar no servidor — pode levar vários minutos";
769
+ readonly progressVerifyKey: "Confirmar que a chave de deploy funciona";
770
+ readonly progressVerifyAgent: "Verificar o agente por fora";
771
+ readonly progressSaveState: "Salvar as configurações do instalador neste computador";
772
+ readonly progressFailed: "Este passo falhou";
773
+ readonly progressSkipped: "Pulado";
774
+ readonly progressOpenLogs: "Abrir os logs do deploy";
775
+ readonly installDone: "O seu Severino está pronto.";
776
+ readonly doneTitle: "Tudo pronto";
777
+ readonly doneAgentUrl: "O endereço do seu agente";
778
+ readonly doneConnectClient: "Fale com o Severino pelo Slack se você o conectou, ou abra a interface de terminal com o comando abaixo. /vc:login é só para a Vercel.";
779
+ readonly doneClose: "Pode fechar esta janela. Rode npm run installer de novo quando quiser.";
780
+ readonly githubActivateTitle: "Deploys automáticos (opcional)";
781
+ readonly githubActivateBody: "Conecte o GitHub uma vez e toda mudança enviada para o seu repositório entra no ar sozinha. Você também ganha um botão de deploy e rollback de um clique aqui no instalador. Dá para fazer agora ou em qualquer momento depois.";
782
+ readonly githubGuidePath: "No github.com: seu avatar → Settings → Developer settings → Personal access tokens → Fine-grained tokens.";
783
+ readonly githubGuideStep1: "Abra a página do token com o botão abaixo e entre no GitHub.";
784
+ readonly githubGuideStep2: "Dê o nome severino-installer e defina a expiração para 90 dias.";
785
+ readonly githubGuideStep3: "Em Resource owner mantenha a sua conta, e em Repository access escolha Only select repositories e selecione este repositório.";
786
+ readonly githubGuideStep4: "Em Repository permissions defina Actions como Read and write, Secrets como Read and write e Contents como Read-only.";
787
+ readonly githubGuideStep5: "Clique em Generate token e copie na hora — o GitHub mostra o token uma única vez.";
788
+ readonly githubGuideOpen: "Criar o token no GitHub";
789
+ readonly githubTokenLabel: "Token de acesso do GitHub";
790
+ readonly githubRepositoryDetected: "Repositório detectado a partir desta pasta";
791
+ readonly githubRepositoryManual: "Digite o repositório como dono/nome";
792
+ readonly githubConnect: "Ativar deploys automáticos";
793
+ readonly githubConnectedNote: "Os deploys automáticos estão ativos.";
794
+ readonly githubPermissionActions: "Actions: Read and write";
795
+ readonly githubPermissionSecrets: "Secrets: Read and write";
796
+ readonly githubPermissionContents: "Contents: Read-only";
797
+ readonly githubTokenInvalid: "O GitHub recusou este token. Crie um novo e cole de novo.";
798
+ readonly githubPermissionMissing: "Esta permissão está faltando no token";
799
+ readonly dashboardTitle: "Seu Severino";
800
+ readonly dashboardHealthCheck: "Verificar agora";
801
+ readonly heroAllGood: "Tudo funcionando";
802
+ readonly heroChecking: "Verificando o seu servidor…";
803
+ readonly heroProblem: "Algo precisa de atenção";
804
+ readonly heroOnlineBody: "Seu Severino está online e respondendo.";
805
+ readonly heroProblemBody: "A verificação encontrou um problema — veja Conexões abaixo.";
806
+ readonly heroLive: "LIVE";
807
+ readonly heroServerOnline: "Servidor online";
808
+ readonly heroServerOffline: "Servidor inacessível";
809
+ readonly connectionsTitle: "Conexões";
810
+ readonly connServer: "Servidor";
811
+ readonly connAgent: "Agente";
812
+ readonly connWorkflow: "Workflow";
813
+ readonly connStatusOnline: "Online";
814
+ readonly connStatusWorking: "Funcionando";
815
+ readonly connStatusMounted: "Montado";
816
+ readonly connStatusFail: "Problema";
817
+ readonly connStatusWait: "Verificando";
818
+ readonly viewDiagnostic: "Ver diagnóstico completo";
819
+ readonly hideDiagnostic: "Ocultar diagnóstico";
820
+ readonly lastCheckedLabel: "Última verificação:";
821
+ readonly agoJustNow: "agora mesmo";
822
+ readonly heroVersionLabel: "Versão atual:";
823
+ readonly heroAutoOn: "Atualizações automáticas ativas";
824
+ readonly heroAutoOff: "Atualizações automáticas desativadas";
825
+ readonly updateAvailable: "Nova versão disponível";
826
+ readonly updatePublishing: "Publicando…";
827
+ readonly updateFailed: "A última publicação falhou";
828
+ readonly updateNow: "Atualizar agora";
829
+ readonly publishingNote: "A publicação pode levar alguns minutos. Esta página atualiza sozinha quando terminar.";
830
+ readonly historyTitle: "Histórico de atualizações";
831
+ readonly historyEmpty: "Nenhuma atualização ainda.";
832
+ readonly historyShowAll: "Ver todas as atualizações";
833
+ readonly historyShowLess: "Ver menos";
834
+ readonly runColumnVersion: "Versão";
835
+ readonly runColumnDescription: "Descrição";
836
+ readonly runColumnStatus: "Status";
837
+ readonly runColumnWhen: "Quando";
838
+ readonly runStatusSuccess: "Sucesso";
839
+ readonly runStatusFailure: "Falhou";
840
+ readonly runStatusInProgress: "Em andamento";
841
+ readonly dashboardRollback: "Restaurar versão anterior";
842
+ readonly dashboardRollbackHint: "Volte para uma versão estável anterior.";
843
+ readonly dashboardRollbackPick: "Escolha uma versão anterior bem-sucedida";
844
+ readonly dashboardRollbackApply: "Restaurar esta versão";
845
+ readonly rollbackIntro: "Coloca uma versão anterior de volta no ar. Ela reaproveita o mesmo pacote que já funcionou antes, então é rápido — um ou dois minutos — e de baixo risco.";
846
+ readonly rollbackDataNote: "Os seus dados não são tocados: conversas e estado dos workflows continuam exatamente como estão.";
847
+ readonly rollbackWindowNote: "As versões mais recentes ficam disponíveis aqui. Para avançar de novo, é só atualizar de novo.";
848
+ readonly rollbackCurrentTag: "no ar agora";
849
+ readonly rollbackConfirmTitle: "Restaurar esta versão?";
850
+ readonly rollbackConfirmBody: "O seu servidor volta para esse pacote exato em um ou dois minutos. Os seus dados não são tocados, e você pode avançar de novo com uma nova atualização.";
851
+ readonly rollbackConfirmApply: "Sim, restaurar";
852
+ readonly dashboardLinkActions: "Histórico de deploys no GitHub";
853
+ readonly helpTitle: "Ajuda rápida";
854
+ readonly helpStep1Title: "Copie o endereço do agente";
855
+ readonly helpStep1Body: "Use o botão abaixo para copiar.";
856
+ readonly helpStep2Title: "Fale pelos seus canais";
857
+ readonly helpStep2Body: "Crie o app Slack com o manifesto gerado e mencione @Severino num canal em que você convidou o bot.";
858
+ readonly helpStep3Title: "Abra a interface de terminal";
859
+ readonly helpStep3Body: "De qualquer projeto eve, rode: eve dev https://USUARIO:SENHA@<endereço do agente>. /vc:login é só para a Vercel.";
860
+ readonly helpStep4Title: "Verifique a conexão";
861
+ readonly helpStep4Body: "Confirme se o status está online.";
862
+ readonly agentUrlLabel: "URL do agente";
863
+ readonly actionsTitle: "Ações";
864
+ readonly dashboardDeployLocal: "Subir nova versão";
865
+ readonly dashboardDeployLocalHint: "Envie o código mais recente deste computador.";
866
+ readonly localConfirmTitle: "Subir o código deste computador?";
867
+ readonly localConfirmBody: "Isso envia a versão de código mais recente deste computador (o último commit) e reconstrói no seu servidor.";
868
+ readonly localConfirmUncommitted: "Mudanças que você ainda não commitou não vão junto.";
869
+ readonly localConfirmAuto: "Para publicar pelos deploys automáticos — e ficar registrado no histórico — faça merge na main e push.";
870
+ readonly localConfirmApply: "Sim, subir versão";
871
+ readonly deployStartedNote: "Iniciado — leva alguns minutos, e esta página atualiza sozinha.";
872
+ readonly dashboardReset: "Esquecer as configurações deste computador";
873
+ readonly dashboardResetHint: "Nada no seu servidor é desligado ou apagado; isso só limpa o que o instalador salvou aqui.";
874
+ readonly dashboardResetConfirm: "Isto apaga as configurações salvas neste computador, incluindo a chave de deploy e o token do GitHub. O seu servidor continua rodando. Continuar?";
875
+ readonly resetConfirmYes: "Sim, esquecer as configurações";
876
+ readonly dashboardResetFinal: "Última confirmação: a chave de deploy e o token do GitHub guardados neste computador serão apagados. O seu servidor continua rodando. Continuar?";
877
+ readonly footerLine: "Severino AI Coders Academy — Infraestrutura gerenciada para desenvolvedores.";
878
+ readonly terminalRunningAt: "┌─ AI CODERS ACADEMY / SEVERINO\n│\n│ O instalador está disponível em:\n│";
879
+ readonly terminalPressCtrlC: "└─ Pressione Ctrl+C para encerrar o instalador.";
880
+ readonly terminalStartFailed: "Não foi possível iniciar o instalador do Severino.";
881
+ readonly terminalStopFailed: "┌─ AI CODERS ACADEMY / ERRO\n│\n│ ! Não foi possível encerrar o instalador corretamente.\n└─";
882
+ readonly errorGeneric: "Algo deu errado. Os detalhes estão abaixo.";
883
+ readonly errorBusy: "Já existe uma instalação em andamento.";
884
+ };
885
+ };
886
+ export type InstallerMessageKey = keyof typeof en;
887
+ export {};