@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: "Second Brain 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 sets up your Second Brain on your own server, directly from this computer. It asks for everything it needs, step by step — no GitHub configuration is required to install.";
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 vpsAuthPassword: "Password";
49
+ readonly vpsAuthKey: "Private key";
50
+ readonly vpsPasswordLabel: "Root password";
51
+ readonly vpsKeyLabel: "Paste the private key";
52
+ readonly vpsTest: "Test connection";
53
+ readonly vpsTestOk: "Connected to the server.";
54
+ readonly vpsAuthFailed: "The server refused the password. Check it and try again.";
55
+ readonly vpsUnreachable: "Could not reach the server. Check the IP address and that the VPS is running.";
56
+ readonly vpsTestAgain: "The secure connection check expired. Test the server again before installing.";
57
+ readonly showSecret: "Show";
58
+ readonly hideSecret: "Hide";
59
+ readonly vpsMethodLegend: "How do you want to configure the VPS?";
60
+ readonly vpsMethodHostinger: "Connect Hostinger";
61
+ readonly vpsMethodHostingerBody: "Find your VPS and fill its connection details automatically.";
62
+ readonly vpsMethodRecommended: "Recommended";
63
+ readonly vpsMethodManual: "Enter details manually";
64
+ readonly vpsMethodManualBody: "Use any provider or enter custom SSH settings.";
65
+ readonly hostingerConnectTitle: "Connect your Hostinger account";
66
+ readonly hostingerConnectBody: "Create a temporary API token, then use it once to find your VPS. The token stays only in this installer session.";
67
+ readonly hostingerTokenLabel: "Hostinger API token";
68
+ readonly hostingerTokenOpen: "Create a token in hPanel";
69
+ readonly hostingerTokenSecurity: "The token is kept in memory, never written to the installer settings, and cleared after handoff.";
70
+ readonly hostingerFindVps: "Find my VPSs";
71
+ readonly hostingerConnected: "Hostinger connected";
72
+ readonly hostingerChangeAccount: "Change account";
73
+ readonly hostingerRefresh: "Refresh list";
74
+ readonly hostingerNoVps: "No VPS was found in this Hostinger account.";
75
+ readonly hostingerPickVps: "Choose the VPS for your Second Brain";
76
+ readonly hostingerVpsId: "VPS ID";
77
+ readonly hostingerPlan: "Plan";
78
+ readonly hostingerTemplate: "Template";
79
+ readonly hostingerIp: "IPv4";
80
+ readonly hostingerStateRunning: "Ready";
81
+ readonly hostingerStateUnavailable: "Unavailable";
82
+ readonly hostingerUnavailablePreparing: "Hostinger is still preparing this VPS.";
83
+ readonly hostingerUnavailableLocked: "Hostinger is finishing another action on this VPS.";
84
+ readonly hostingerUnavailableState: "Start or repair this VPS in hPanel before continuing.";
85
+ readonly hostingerUnavailableIpv4: "This VPS does not have a usable IPv4 address.";
86
+ readonly hostingerUnavailableTemplate: "The Hostinger Docker template is required for this installation.";
87
+ readonly hostingerRootTitle: "Confirm administrator access";
88
+ 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.";
89
+ readonly rootPasswordForgot: "I don't remember the root password";
90
+ readonly rootResetTitle: "Choose a new root password";
91
+ readonly rootResetBody: "Hostinger can replace the password without asking for the current one.";
92
+ readonly rootResetPasswordLabel: "New root password";
93
+ readonly rootResetConfirmLabel: "Confirm the new root password";
94
+ readonly rootResetGeneratePassword: "Generate strong password";
95
+ 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.";
96
+ readonly rootResetRequirementLength: "At least 12 characters";
97
+ readonly rootResetRequirementUppercase: "At least one uppercase letter";
98
+ readonly rootResetRequirementLowercase: "At least one lowercase letter";
99
+ readonly rootResetRequirementNumber: "At least one number";
100
+ readonly rootResetRequirementSymbol: "At least one allowed symbol: -().&@?'#,/;+";
101
+ readonly rootResetRequirementCharacters: "Only letters, numbers, and allowed symbols";
102
+ readonly rootResetRequirementMatch: "Both password fields match";
103
+ readonly rootResetLeakNote: "Hostinger also rejects passwords found in public leak databases.";
104
+ readonly rootResetReview: "Review password change";
105
+ readonly rootResetConfirmTitle: "Confirm root password change";
106
+ readonly rootResetConfirmBody: "The current root password will stop working for new connections as soon as Hostinger completes this action.";
107
+ readonly rootResetTarget: "This action changes";
108
+ readonly rootResetTypeHostname: "Type the VPS hostname to confirm";
109
+ readonly rootResetNow: "Change root password now";
110
+ readonly rootResetWorking: "Hostinger is updating the VPS…";
111
+ readonly rootResetSuccess: "Root password changed. Testing SSH with the new password…";
112
+ readonly rootResetSshPending: "Hostinger changed the password, but SSH is not accepting it yet. Wait a moment, then test the new password again.";
113
+ readonly rootResetOutcomeUnknown: "Hostinger may still be processing the password change. Do not submit it again; test the new password before retrying.";
114
+ readonly rootResetCancel: "Keep the current password";
115
+ readonly hostingerErrorInvalidInput: "Check the supplied values and try again.";
116
+ readonly hostingerErrorUnauthorized: "Hostinger rejected this token. Create a new token and reconnect.";
117
+ readonly hostingerErrorRateLimited: "Hostinger's request limit was reached. Wait a moment and try again.";
118
+ readonly hostingerErrorUnavailable: "Hostinger is temporarily unavailable. Manual configuration is still available.";
119
+ readonly hostingerErrorInvalidResponse: "Hostinger returned an unexpected response. Try again later or configure the VPS manually.";
120
+ readonly hostingerErrorNotConnected: "Reconnect Hostinger before continuing.";
121
+ 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.";
122
+ readonly hostingerErrorPasswordPolicy: "Hostinger rejected this password. Use only letters, numbers, and these symbols: -().&@?'#,/;+. Also avoid leaked or common passwords.";
123
+ readonly hostingerErrorActionFailed: "Hostinger could not change the root password. Review the VPS in hPanel before retrying.";
124
+ readonly hostingerErrorActionTimeout: "The password change did not finish in time. It may still be processing; test the new password before retrying.";
125
+ readonly hostingerErrorConfirmation: "This confirmation expired or is no longer valid. Review the password change again.";
126
+ readonly hostingerErrorTargetChanged: "The VPS changed after confirmation. Refresh the list and review the target again.";
127
+ readonly hostingerErrorTargetUnavailable: "This VPS cannot be changed right now. Wait for Hostinger to finish its current action.";
128
+ readonly hostingerErrorConflict: "Another installer operation is already running.";
129
+ readonly stepConfigTitle: "Step 2 — Configure your Second Brain";
130
+ readonly stepConfigBody: "These values configure your server and your owner account.";
131
+ readonly domainLabel: "Your domain (for example brain.example.com)";
132
+ readonly hostingerVpsDomainLabel: "Your Hostinger VPS domain";
133
+ readonly hostingerSubdomainLabel: "Subdomain";
134
+ readonly hostingerFinalDomainLabel: "Final Second Brain address";
135
+ readonly hostingerDomainNote: "Hostinger's wildcard DNS automatically points this subdomain to the selected VPS.";
136
+ readonly hostingerSubdomainInvalid: "Use 1–63 lowercase letters, numbers, or hyphens. The subdomain cannot start or end with a hyphen.";
137
+ readonly dnsCheck: "Check DNS";
138
+ readonly dnsMatch: "The domain points at your server.";
139
+ readonly dnsMismatch: "The domain does not point at your server yet.";
140
+ readonly dnsPending: "DNS has not propagated yet. You can continue and verify later.";
141
+ readonly openRouterLabel: "OpenRouter API key";
142
+ readonly databasePasswordNote: "A strong database password is generated automatically and stored only on your server.";
143
+ readonly ownerEmailLabel: "Owner email";
144
+ readonly ownerPasswordLabel: "Owner password (at least 12 characters)";
145
+ readonly ownerPasswordConfirmLabel: "Confirm the owner password";
146
+ readonly ownerPasswordTooShort: "The password must contain at least 12 characters.";
147
+ readonly ownerPasswordMismatch: "The password confirmation does not match.";
148
+ readonly stepReviewTitle: "Step 3 — Review and install";
149
+ readonly stepReviewBody: "Review the values below, then start the installation.";
150
+ readonly install: "Install";
151
+ readonly progressTitle: "Installing";
152
+ readonly progressMapLabel: "Installation phases";
153
+ readonly progressPhaseAccess: "Access";
154
+ readonly progressPhaseConfig: "Configure";
155
+ readonly progressPhaseDeploy: "Deploy";
156
+ readonly progressPhaseAccount: "Account";
157
+ readonly progressPhaseVerify: "Verify";
158
+ readonly progressGenerateKey: "Create a secure deploy key";
159
+ readonly progressConnectVps: "Connect to the server";
160
+ readonly progressAuthorizeKey: "Install the deploy key on the server";
161
+ readonly progressWriteEnv: "Write the server configuration";
162
+ readonly progressKeptDatabasePassword: "Kept the existing database password.";
163
+ readonly progressAlternatePorts: "The default local ports were busy on the server — using";
164
+ readonly bearerOptionLabel: "Also create a static access token (Bearer)";
165
+ readonly bearerOptionBody: "For MCP clients that cannot sign in with OAuth. The token grants full access to the owner account; reinstalling with this option creates a new token and replaces the old one.";
166
+ readonly bearerReviewEnabled: "Will be created";
167
+ readonly bearerReviewDisabled: "Not requested";
168
+ readonly doneBearerTitle: "Static access token (Bearer)";
169
+ readonly doneBearerNote: "Shown only this once — copy it now and store it somewhere safe. Send it as an Authorization: Bearer header when connecting to the MCP URL above.";
170
+ readonly dashboardBearer: "Create static access token (Bearer)";
171
+ readonly dashboardBearerHint: "for clients that cannot sign in with OAuth";
172
+ readonly bearerConfirmTitle: "Create a static access token?";
173
+ readonly bearerConfirmBody: "The token grants full access to the owner account and replaces any previous static token. The engine restarts briefly to activate it.";
174
+ readonly bearerEmailLabel: "Owner account email";
175
+ readonly bearerConfirmApply: "Create token";
176
+ readonly progressUploadSource: "Upload the project code to the server";
177
+ readonly progressUncommitted: "Warning: changes not yet committed on this computer were not sent; the server builds the latest commit.";
178
+ readonly progressBuildDeploy: "Build and start on the server — this can take several minutes";
179
+ readonly progressVerifyKey: "Confirm the deploy key works";
180
+ readonly progressCreateOwner: "Create your owner account";
181
+ readonly progressOwnerExisted: "The owner account already existed. Continuing.";
182
+ readonly progressVerifyMcp: "Verify the server from the outside";
183
+ readonly progressSaveState: "Save the installer settings on this computer";
184
+ readonly progressFailed: "This step failed";
185
+ readonly progressSkipped: "Skipped";
186
+ readonly progressOpenLogs: "Open the deployment logs";
187
+ readonly installDone: "Your Second Brain is ready.";
188
+ readonly doneTitle: "All set";
189
+ readonly doneMcpUrl: "Your connector address";
190
+ readonly doneConnectClient: "Open your client's connector settings, add a custom connector, paste the address above, and sign in with your owner email and password.";
191
+ readonly doneClose: "You can close this window. Run npm run installer again anytime.";
192
+ readonly githubActivateTitle: "Automatic deploys (optional)";
193
+ 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.";
194
+ readonly githubGuidePath: "On github.com: your avatar → Settings → Developer settings → Personal access tokens → Fine-grained tokens.";
195
+ readonly githubGuideStep1: "Open the token page with the button below and sign in to GitHub.";
196
+ readonly githubGuideStep2: "Name it second-brain-installer and set the expiration to 90 days.";
197
+ readonly githubGuideStep3: "Under Resource owner keep your account, and under Repository access choose Only select repositories and pick this repository.";
198
+ readonly githubGuideStep4: "Under Repository permissions set Actions to Read and write, Secrets to Read and write, and Contents to Read-only.";
199
+ readonly githubGuideStep5: "Click Generate token and copy it right away — GitHub shows it only once.";
200
+ readonly githubGuideOpen: "Create the token on GitHub";
201
+ readonly githubTokenLabel: "GitHub access token";
202
+ readonly githubRepositoryLabel: "Repository";
203
+ readonly githubRepositoryDetected: "Repository detected from this folder";
204
+ readonly githubRepositoryManual: "Type the repository as owner/name";
205
+ readonly githubConnect: "Activate automatic deploys";
206
+ readonly githubConnectedNote: "Automatic deploys are active.";
207
+ readonly githubPermissionActions: "Actions: Read and write";
208
+ readonly githubPermissionSecrets: "Secrets: Read and write";
209
+ readonly githubPermissionContents: "Contents: Read-only";
210
+ readonly githubTokenInvalid: "GitHub rejected this token. Create a new one and paste it again.";
211
+ readonly githubTokenExpiresSoon: "This token expires soon. Consider creating a new one.";
212
+ readonly githubPermissionMissing: "This permission is missing on the token";
213
+ readonly dashboardTitle: "Your Second Brain";
214
+ readonly dashboardHealthCheck: "Verify now";
215
+ readonly heroAllGood: "All good";
216
+ readonly heroChecking: "Checking your server…";
217
+ readonly heroProblem: "Something needs attention";
218
+ readonly heroOnlineBody: "Your Second Brain is online and connected.";
219
+ readonly heroProblemBody: "The check found a problem — see Connections below.";
220
+ readonly heroLive: "LIVE";
221
+ readonly heroVersionLabel: "Current version:";
222
+ readonly heroAutoOn: "Automatic updates on";
223
+ readonly heroAutoOff: "Automatic updates off";
224
+ readonly heroServerOnline: "Server online";
225
+ readonly heroServerOffline: "Server unreachable";
226
+ readonly updateAvailable: "New version available";
227
+ readonly updatePublishing: "Publishing…";
228
+ readonly updateFailed: "Last publish failed";
229
+ readonly updateNow: "Update now";
230
+ readonly btnOtherActions: "Other actions";
231
+ readonly publishingNote: "Publishing can take a few minutes. This page updates by itself when it finishes.";
232
+ readonly connectionsTitle: "Connections";
233
+ readonly connMcp: "MCP";
234
+ readonly connOauth: "OAuth";
235
+ readonly connServer: "Server";
236
+ readonly connStatusWorking: "Working";
237
+ readonly connStatusOk: "OK";
238
+ readonly connStatusOnline: "Online";
239
+ readonly connStatusFail: "Problem";
240
+ readonly connStatusWait: "Checking";
241
+ readonly viewDiagnostic: "See full diagnostic";
242
+ readonly hideDiagnostic: "Hide diagnostic";
243
+ readonly lastCheckedLabel: "Last check:";
244
+ readonly agoJustNow: "just now";
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 helpTitle: "Quick help";
254
+ readonly helpStep1Title: "Copy the connector URL";
255
+ readonly helpStep1Body: "Use the button below to copy it.";
256
+ readonly helpStep2Title: "Add it to your client";
257
+ readonly helpStep2Body: "Open its connector settings and add a custom connector.";
258
+ readonly helpStep3Title: "Sign in";
259
+ readonly helpStep3Body: "Use your owner email and password.";
260
+ readonly helpStep4Title: "Check the connection";
261
+ readonly helpStep4Body: "Confirm the status shows online.";
262
+ readonly connectorUrlLabel: "Connector URL";
263
+ readonly actionsTitle: "Actions";
264
+ readonly dashboardRollback: "Restore a previous version";
265
+ readonly dashboardRollbackHint: "Go back to an earlier stable version.";
266
+ readonly dashboardRollbackPick: "Choose an earlier successful version";
267
+ readonly dashboardRollbackApply: "Restore this version";
268
+ 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.";
269
+ readonly rollbackDataNote: "Your data is untouched: tasks, memories, knowledge, and your account stay exactly as they are.";
270
+ readonly rollbackWindowNote: "The most recent versions stay available here. To move forward again, just update again.";
271
+ readonly rollbackCurrentTag: "on air now";
272
+ readonly dashboardDeployLocal: "Upload new version";
273
+ readonly dashboardDeployLocalHint: "Send the latest code from this computer.";
274
+ readonly localConfirmTitle: "Upload the code from this computer?";
275
+ readonly localConfirmBody: "This sends the latest committed code on this computer and rebuilds it on your server, without going through GitHub.";
276
+ readonly localConfirmUncommitted: "Changes you have not committed yet are not included.";
277
+ readonly localConfirmAuto: "To publish through automatic deploys instead — and have it recorded in the history — merge into main and push.";
278
+ readonly localConfirmApply: "Yes, upload it";
279
+ readonly rollbackConfirmTitle: "Restore this version?";
280
+ 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.";
281
+ readonly rollbackConfirmApply: "Yes, restore it";
282
+ readonly deployStartedNote: "Started — follow the status in the history. It takes a minute or two, and this page updates by itself.";
283
+ readonly dashboardLinkActions: "Deployment history on GitHub";
284
+ readonly dashboardReset: "Forget the settings on this computer";
285
+ readonly dashboardResetHint: "Nothing on your server is stopped or deleted; this only clears what the installer saved here.";
286
+ readonly dashboardResetConfirm: "This deletes the saved settings on this computer, including the GitHub token. Your server keeps running. Continue?";
287
+ readonly resetConfirmYes: "Yes, forget the settings";
288
+ readonly dashboardResetFinal: "Last confirmation: the GitHub token and the deploy key stored on this computer will be deleted. Your server keeps running. Continue?";
289
+ readonly footerLine: "Second Brain AI Coders Academy — Managed infrastructure for developers.";
290
+ readonly runStatusSuccess: "Success";
291
+ readonly runStatusFailure: "Failed";
292
+ readonly runStatusInProgress: "In progress";
293
+ readonly terminalRunningAt: "┌─ AI CODERS ACADEMY / SECOND BRAIN\n│\n│ The installer is available at:\n│";
294
+ readonly terminalPressCtrlC: "└─ Press Ctrl+C to stop the installer.";
295
+ readonly terminalStartFailed: "The Second Brain 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: "Second Brain 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 sets up your Second Brain on your own server, directly from this computer. It asks for everything it needs, step by step — no GitHub configuration is required to install.";
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 vpsAuthPassword: "Password";
342
+ readonly vpsAuthKey: "Private key";
343
+ readonly vpsPasswordLabel: "Root password";
344
+ readonly vpsKeyLabel: "Paste the private key";
345
+ readonly vpsTest: "Test connection";
346
+ readonly vpsTestOk: "Connected to the server.";
347
+ readonly vpsAuthFailed: "The server refused the password. Check it and try again.";
348
+ readonly vpsUnreachable: "Could not reach the server. Check the IP address and that the VPS is running.";
349
+ readonly vpsTestAgain: "The secure connection check expired. Test the server again before installing.";
350
+ readonly showSecret: "Show";
351
+ readonly hideSecret: "Hide";
352
+ readonly vpsMethodLegend: "How do you want to configure the VPS?";
353
+ readonly vpsMethodHostinger: "Connect Hostinger";
354
+ readonly vpsMethodHostingerBody: "Find your VPS and fill its connection details automatically.";
355
+ readonly vpsMethodRecommended: "Recommended";
356
+ readonly vpsMethodManual: "Enter details manually";
357
+ readonly vpsMethodManualBody: "Use any provider or enter custom SSH settings.";
358
+ readonly hostingerConnectTitle: "Connect your Hostinger account";
359
+ readonly hostingerConnectBody: "Create a temporary API token, then use it once to find your VPS. The token stays only in this installer session.";
360
+ readonly hostingerTokenLabel: "Hostinger API token";
361
+ readonly hostingerTokenOpen: "Create a token in hPanel";
362
+ readonly hostingerTokenSecurity: "The token is kept in memory, never written to the installer settings, and cleared after handoff.";
363
+ readonly hostingerFindVps: "Find my VPSs";
364
+ readonly hostingerConnected: "Hostinger connected";
365
+ readonly hostingerChangeAccount: "Change account";
366
+ readonly hostingerRefresh: "Refresh list";
367
+ readonly hostingerNoVps: "No VPS was found in this Hostinger account.";
368
+ readonly hostingerPickVps: "Choose the VPS for your Second Brain";
369
+ readonly hostingerVpsId: "VPS ID";
370
+ readonly hostingerPlan: "Plan";
371
+ readonly hostingerTemplate: "Template";
372
+ readonly hostingerIp: "IPv4";
373
+ readonly hostingerStateRunning: "Ready";
374
+ readonly hostingerStateUnavailable: "Unavailable";
375
+ readonly hostingerUnavailablePreparing: "Hostinger is still preparing this VPS.";
376
+ readonly hostingerUnavailableLocked: "Hostinger is finishing another action on this VPS.";
377
+ readonly hostingerUnavailableState: "Start or repair this VPS in hPanel before continuing.";
378
+ readonly hostingerUnavailableIpv4: "This VPS does not have a usable IPv4 address.";
379
+ readonly hostingerUnavailableTemplate: "The Hostinger Docker template is required for this installation.";
380
+ readonly hostingerRootTitle: "Confirm administrator access";
381
+ 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.";
382
+ readonly rootPasswordForgot: "I don't remember the root password";
383
+ readonly rootResetTitle: "Choose a new root password";
384
+ readonly rootResetBody: "Hostinger can replace the password without asking for the current one.";
385
+ readonly rootResetPasswordLabel: "New root password";
386
+ readonly rootResetConfirmLabel: "Confirm the new root password";
387
+ readonly rootResetGeneratePassword: "Generate strong password";
388
+ 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.";
389
+ readonly rootResetRequirementLength: "At least 12 characters";
390
+ readonly rootResetRequirementUppercase: "At least one uppercase letter";
391
+ readonly rootResetRequirementLowercase: "At least one lowercase letter";
392
+ readonly rootResetRequirementNumber: "At least one number";
393
+ readonly rootResetRequirementSymbol: "At least one allowed symbol: -().&@?'#,/;+";
394
+ readonly rootResetRequirementCharacters: "Only letters, numbers, and allowed symbols";
395
+ readonly rootResetRequirementMatch: "Both password fields match";
396
+ readonly rootResetLeakNote: "Hostinger also rejects passwords found in public leak databases.";
397
+ readonly rootResetReview: "Review password change";
398
+ readonly rootResetConfirmTitle: "Confirm root password change";
399
+ readonly rootResetConfirmBody: "The current root password will stop working for new connections as soon as Hostinger completes this action.";
400
+ readonly rootResetTarget: "This action changes";
401
+ readonly rootResetTypeHostname: "Type the VPS hostname to confirm";
402
+ readonly rootResetNow: "Change root password now";
403
+ readonly rootResetWorking: "Hostinger is updating the VPS…";
404
+ readonly rootResetSuccess: "Root password changed. Testing SSH with the new password…";
405
+ readonly rootResetSshPending: "Hostinger changed the password, but SSH is not accepting it yet. Wait a moment, then test the new password again.";
406
+ readonly rootResetOutcomeUnknown: "Hostinger may still be processing the password change. Do not submit it again; test the new password before retrying.";
407
+ readonly rootResetCancel: "Keep the current password";
408
+ readonly hostingerErrorInvalidInput: "Check the supplied values and try again.";
409
+ readonly hostingerErrorUnauthorized: "Hostinger rejected this token. Create a new token and reconnect.";
410
+ readonly hostingerErrorRateLimited: "Hostinger's request limit was reached. Wait a moment and try again.";
411
+ readonly hostingerErrorUnavailable: "Hostinger is temporarily unavailable. Manual configuration is still available.";
412
+ readonly hostingerErrorInvalidResponse: "Hostinger returned an unexpected response. Try again later or configure the VPS manually.";
413
+ readonly hostingerErrorNotConnected: "Reconnect Hostinger before continuing.";
414
+ 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.";
415
+ readonly hostingerErrorPasswordPolicy: "Hostinger rejected this password. Use only letters, numbers, and these symbols: -().&@?'#,/;+. Also avoid leaked or common passwords.";
416
+ readonly hostingerErrorActionFailed: "Hostinger could not change the root password. Review the VPS in hPanel before retrying.";
417
+ readonly hostingerErrorActionTimeout: "The password change did not finish in time. It may still be processing; test the new password before retrying.";
418
+ readonly hostingerErrorConfirmation: "This confirmation expired or is no longer valid. Review the password change again.";
419
+ readonly hostingerErrorTargetChanged: "The VPS changed after confirmation. Refresh the list and review the target again.";
420
+ readonly hostingerErrorTargetUnavailable: "This VPS cannot be changed right now. Wait for Hostinger to finish its current action.";
421
+ readonly hostingerErrorConflict: "Another installer operation is already running.";
422
+ readonly stepConfigTitle: "Step 2 — Configure your Second Brain";
423
+ readonly stepConfigBody: "These values configure your server and your owner account.";
424
+ readonly domainLabel: "Your domain (for example brain.example.com)";
425
+ readonly hostingerVpsDomainLabel: "Your Hostinger VPS domain";
426
+ readonly hostingerSubdomainLabel: "Subdomain";
427
+ readonly hostingerFinalDomainLabel: "Final Second Brain address";
428
+ readonly hostingerDomainNote: "Hostinger's wildcard DNS automatically points this subdomain to the selected VPS.";
429
+ readonly hostingerSubdomainInvalid: "Use 1–63 lowercase letters, numbers, or hyphens. The subdomain cannot start or end with a hyphen.";
430
+ readonly dnsCheck: "Check DNS";
431
+ readonly dnsMatch: "The domain points at your server.";
432
+ readonly dnsMismatch: "The domain does not point at your server yet.";
433
+ readonly dnsPending: "DNS has not propagated yet. You can continue and verify later.";
434
+ readonly openRouterLabel: "OpenRouter API key";
435
+ readonly databasePasswordNote: "A strong database password is generated automatically and stored only on your server.";
436
+ readonly ownerEmailLabel: "Owner email";
437
+ readonly ownerPasswordLabel: "Owner password (at least 12 characters)";
438
+ readonly ownerPasswordConfirmLabel: "Confirm the owner password";
439
+ readonly ownerPasswordTooShort: "The password must contain at least 12 characters.";
440
+ readonly ownerPasswordMismatch: "The password confirmation does not match.";
441
+ readonly stepReviewTitle: "Step 3 — Review and install";
442
+ readonly stepReviewBody: "Review the values below, then start the installation.";
443
+ readonly install: "Install";
444
+ readonly progressTitle: "Installing";
445
+ readonly progressMapLabel: "Installation phases";
446
+ readonly progressPhaseAccess: "Access";
447
+ readonly progressPhaseConfig: "Configure";
448
+ readonly progressPhaseDeploy: "Deploy";
449
+ readonly progressPhaseAccount: "Account";
450
+ readonly progressPhaseVerify: "Verify";
451
+ readonly progressGenerateKey: "Create a secure deploy key";
452
+ readonly progressConnectVps: "Connect to the server";
453
+ readonly progressAuthorizeKey: "Install the deploy key on the server";
454
+ readonly progressWriteEnv: "Write the server configuration";
455
+ readonly progressKeptDatabasePassword: "Kept the existing database password.";
456
+ readonly progressAlternatePorts: "The default local ports were busy on the server — using";
457
+ readonly bearerOptionLabel: "Also create a static access token (Bearer)";
458
+ readonly bearerOptionBody: "For MCP clients that cannot sign in with OAuth. The token grants full access to the owner account; reinstalling with this option creates a new token and replaces the old one.";
459
+ readonly bearerReviewEnabled: "Will be created";
460
+ readonly bearerReviewDisabled: "Not requested";
461
+ readonly doneBearerTitle: "Static access token (Bearer)";
462
+ readonly doneBearerNote: "Shown only this once — copy it now and store it somewhere safe. Send it as an Authorization: Bearer header when connecting to the MCP URL above.";
463
+ readonly dashboardBearer: "Create static access token (Bearer)";
464
+ readonly dashboardBearerHint: "for clients that cannot sign in with OAuth";
465
+ readonly bearerConfirmTitle: "Create a static access token?";
466
+ readonly bearerConfirmBody: "The token grants full access to the owner account and replaces any previous static token. The engine restarts briefly to activate it.";
467
+ readonly bearerEmailLabel: "Owner account email";
468
+ readonly bearerConfirmApply: "Create token";
469
+ readonly progressUploadSource: "Upload the project code to the server";
470
+ readonly progressUncommitted: "Warning: changes not yet committed on this computer were not sent; the server builds the latest commit.";
471
+ readonly progressBuildDeploy: "Build and start on the server — this can take several minutes";
472
+ readonly progressVerifyKey: "Confirm the deploy key works";
473
+ readonly progressCreateOwner: "Create your owner account";
474
+ readonly progressOwnerExisted: "The owner account already existed. Continuing.";
475
+ readonly progressVerifyMcp: "Verify the server from the outside";
476
+ readonly progressSaveState: "Save the installer settings on this computer";
477
+ readonly progressFailed: "This step failed";
478
+ readonly progressSkipped: "Skipped";
479
+ readonly progressOpenLogs: "Open the deployment logs";
480
+ readonly installDone: "Your Second Brain is ready.";
481
+ readonly doneTitle: "All set";
482
+ readonly doneMcpUrl: "Your connector address";
483
+ readonly doneConnectClient: "Open your client's connector settings, add a custom connector, paste the address above, and sign in with your owner email and password.";
484
+ readonly doneClose: "You can close this window. Run npm run installer again anytime.";
485
+ readonly githubActivateTitle: "Automatic deploys (optional)";
486
+ 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.";
487
+ readonly githubGuidePath: "On github.com: your avatar → Settings → Developer settings → Personal access tokens → Fine-grained tokens.";
488
+ readonly githubGuideStep1: "Open the token page with the button below and sign in to GitHub.";
489
+ readonly githubGuideStep2: "Name it second-brain-installer and set the expiration to 90 days.";
490
+ readonly githubGuideStep3: "Under Resource owner keep your account, and under Repository access choose Only select repositories and pick this repository.";
491
+ readonly githubGuideStep4: "Under Repository permissions set Actions to Read and write, Secrets to Read and write, and Contents to Read-only.";
492
+ readonly githubGuideStep5: "Click Generate token and copy it right away — GitHub shows it only once.";
493
+ readonly githubGuideOpen: "Create the token on GitHub";
494
+ readonly githubTokenLabel: "GitHub access token";
495
+ readonly githubRepositoryLabel: "Repository";
496
+ readonly githubRepositoryDetected: "Repository detected from this folder";
497
+ readonly githubRepositoryManual: "Type the repository as owner/name";
498
+ readonly githubConnect: "Activate automatic deploys";
499
+ readonly githubConnectedNote: "Automatic deploys are active.";
500
+ readonly githubPermissionActions: "Actions: Read and write";
501
+ readonly githubPermissionSecrets: "Secrets: Read and write";
502
+ readonly githubPermissionContents: "Contents: Read-only";
503
+ readonly githubTokenInvalid: "GitHub rejected this token. Create a new one and paste it again.";
504
+ readonly githubTokenExpiresSoon: "This token expires soon. Consider creating a new one.";
505
+ readonly githubPermissionMissing: "This permission is missing on the token";
506
+ readonly dashboardTitle: "Your Second Brain";
507
+ readonly dashboardHealthCheck: "Verify now";
508
+ readonly heroAllGood: "All good";
509
+ readonly heroChecking: "Checking your server…";
510
+ readonly heroProblem: "Something needs attention";
511
+ readonly heroOnlineBody: "Your Second Brain is online and connected.";
512
+ readonly heroProblemBody: "The check found a problem — see Connections below.";
513
+ readonly heroLive: "LIVE";
514
+ readonly heroVersionLabel: "Current version:";
515
+ readonly heroAutoOn: "Automatic updates on";
516
+ readonly heroAutoOff: "Automatic updates off";
517
+ readonly heroServerOnline: "Server online";
518
+ readonly heroServerOffline: "Server unreachable";
519
+ readonly updateAvailable: "New version available";
520
+ readonly updatePublishing: "Publishing…";
521
+ readonly updateFailed: "Last publish failed";
522
+ readonly updateNow: "Update now";
523
+ readonly btnOtherActions: "Other actions";
524
+ readonly publishingNote: "Publishing can take a few minutes. This page updates by itself when it finishes.";
525
+ readonly connectionsTitle: "Connections";
526
+ readonly connMcp: "MCP";
527
+ readonly connOauth: "OAuth";
528
+ readonly connServer: "Server";
529
+ readonly connStatusWorking: "Working";
530
+ readonly connStatusOk: "OK";
531
+ readonly connStatusOnline: "Online";
532
+ readonly connStatusFail: "Problem";
533
+ readonly connStatusWait: "Checking";
534
+ readonly viewDiagnostic: "See full diagnostic";
535
+ readonly hideDiagnostic: "Hide diagnostic";
536
+ readonly lastCheckedLabel: "Last check:";
537
+ readonly agoJustNow: "just now";
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 helpTitle: "Quick help";
547
+ readonly helpStep1Title: "Copy the connector URL";
548
+ readonly helpStep1Body: "Use the button below to copy it.";
549
+ readonly helpStep2Title: "Add it to your client";
550
+ readonly helpStep2Body: "Open its connector settings and add a custom connector.";
551
+ readonly helpStep3Title: "Sign in";
552
+ readonly helpStep3Body: "Use your owner email and password.";
553
+ readonly helpStep4Title: "Check the connection";
554
+ readonly helpStep4Body: "Confirm the status shows online.";
555
+ readonly connectorUrlLabel: "Connector URL";
556
+ readonly actionsTitle: "Actions";
557
+ readonly dashboardRollback: "Restore a previous version";
558
+ readonly dashboardRollbackHint: "Go back to an earlier stable version.";
559
+ readonly dashboardRollbackPick: "Choose an earlier successful version";
560
+ readonly dashboardRollbackApply: "Restore this version";
561
+ 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.";
562
+ readonly rollbackDataNote: "Your data is untouched: tasks, memories, knowledge, and your account stay exactly as they are.";
563
+ readonly rollbackWindowNote: "The most recent versions stay available here. To move forward again, just update again.";
564
+ readonly rollbackCurrentTag: "on air now";
565
+ readonly dashboardDeployLocal: "Upload new version";
566
+ readonly dashboardDeployLocalHint: "Send the latest code from this computer.";
567
+ readonly localConfirmTitle: "Upload the code from this computer?";
568
+ readonly localConfirmBody: "This sends the latest committed code on this computer and rebuilds it on your server, without going through GitHub.";
569
+ readonly localConfirmUncommitted: "Changes you have not committed yet are not included.";
570
+ readonly localConfirmAuto: "To publish through automatic deploys instead — and have it recorded in the history — merge into main and push.";
571
+ readonly localConfirmApply: "Yes, upload it";
572
+ readonly rollbackConfirmTitle: "Restore this version?";
573
+ 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.";
574
+ readonly rollbackConfirmApply: "Yes, restore it";
575
+ readonly deployStartedNote: "Started — follow the status in the history. It takes a minute or two, and this page updates by itself.";
576
+ readonly dashboardLinkActions: "Deployment history on GitHub";
577
+ readonly dashboardReset: "Forget the settings on this computer";
578
+ readonly dashboardResetHint: "Nothing on your server is stopped or deleted; this only clears what the installer saved here.";
579
+ readonly dashboardResetConfirm: "This deletes the saved settings on this computer, including the GitHub token. Your server keeps running. Continue?";
580
+ readonly resetConfirmYes: "Yes, forget the settings";
581
+ readonly dashboardResetFinal: "Last confirmation: the GitHub token and the deploy key stored on this computer will be deleted. Your server keeps running. Continue?";
582
+ readonly footerLine: "Second Brain AI Coders Academy — Managed infrastructure for developers.";
583
+ readonly runStatusSuccess: "Success";
584
+ readonly runStatusFailure: "Failed";
585
+ readonly runStatusInProgress: "In progress";
586
+ readonly terminalRunningAt: "┌─ AI CODERS ACADEMY / SECOND BRAIN\n│\n│ The installer is available at:\n│";
587
+ readonly terminalPressCtrlC: "└─ Press Ctrl+C to stop the installer.";
588
+ readonly terminalStartFailed: "The Second Brain 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 Second Brain";
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 configura o seu Second Brain no seu próprio servidor, direto deste computador. Ele pede tudo o que precisa, passo a passo — nenhuma configuração do GitHub é necessária para instalar.";
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 vpsAuthPassword: "Senha";
634
+ readonly vpsAuthKey: "Chave privada";
635
+ readonly vpsPasswordLabel: "Senha de root";
636
+ readonly vpsKeyLabel: "Cole a chave privada";
637
+ readonly vpsTest: "Testar conexão";
638
+ readonly vpsTestOk: "Conectado ao servidor.";
639
+ readonly vpsAuthFailed: "O servidor recusou a senha. Confira e tente de novo.";
640
+ readonly vpsUnreachable: "Não foi possível alcançar o servidor. Confira o IP e se o VPS está ligado.";
641
+ readonly vpsTestAgain: "A verificação segura expirou. Teste o servidor novamente antes de instalar.";
642
+ readonly showSecret: "Mostrar";
643
+ readonly hideSecret: "Ocultar";
644
+ readonly vpsMethodLegend: "Como você quer configurar o VPS?";
645
+ readonly vpsMethodHostinger: "Conectar Hostinger";
646
+ readonly vpsMethodHostingerBody: "Encontre o seu VPS e preencha os dados de conexão automaticamente.";
647
+ readonly vpsMethodRecommended: "Recomendado";
648
+ readonly vpsMethodManual: "Informar dados manualmente";
649
+ readonly vpsMethodManualBody: "Use qualquer provedor ou informe uma configuração SSH personalizada.";
650
+ readonly hostingerConnectTitle: "Conecte sua conta Hostinger";
651
+ 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.";
652
+ readonly hostingerTokenLabel: "Token da API Hostinger";
653
+ readonly hostingerTokenOpen: "Criar token no hPanel";
654
+ readonly hostingerTokenSecurity: "O token fica na memória, nunca é gravado nas configurações do instalador e é apagado depois do uso.";
655
+ readonly hostingerFindVps: "Encontrar meus VPSs";
656
+ readonly hostingerConnected: "Hostinger conectada";
657
+ readonly hostingerChangeAccount: "Trocar conta";
658
+ readonly hostingerRefresh: "Atualizar lista";
659
+ readonly hostingerNoVps: "Nenhum VPS foi encontrado nesta conta Hostinger.";
660
+ readonly hostingerPickVps: "Escolha o VPS do seu Second Brain";
661
+ readonly hostingerVpsId: "ID do VPS";
662
+ readonly hostingerPlan: "Plano";
663
+ readonly hostingerTemplate: "Template";
664
+ readonly hostingerIp: "IPv4";
665
+ readonly hostingerStateRunning: "Pronto";
666
+ readonly hostingerStateUnavailable: "Indisponível";
667
+ readonly hostingerUnavailablePreparing: "A Hostinger ainda está preparando este VPS.";
668
+ readonly hostingerUnavailableLocked: "A Hostinger está finalizando outra ação neste VPS.";
669
+ readonly hostingerUnavailableState: "Ligue ou repare este VPS no hPanel antes de continuar.";
670
+ readonly hostingerUnavailableIpv4: "Este VPS não possui um endereço IPv4 utilizável.";
671
+ readonly hostingerUnavailableTemplate: "Esta instalação exige o template Docker da Hostinger.";
672
+ readonly hostingerRootTitle: "Confirme o acesso de administrador";
673
+ 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.";
674
+ readonly rootPasswordForgot: "Não lembro a senha de root";
675
+ readonly rootResetTitle: "Escolha uma nova senha de root";
676
+ readonly rootResetBody: "A Hostinger pode substituir a senha sem pedir a senha atual.";
677
+ readonly rootResetPasswordLabel: "Nova senha de root";
678
+ readonly rootResetConfirmLabel: "Confirme a nova senha de root";
679
+ readonly rootResetGeneratePassword: "Gerar senha forte";
680
+ 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.";
681
+ readonly rootResetRequirementLength: "Pelo menos 12 caracteres";
682
+ readonly rootResetRequirementUppercase: "Pelo menos uma letra maiúscula";
683
+ readonly rootResetRequirementLowercase: "Pelo menos uma letra minúscula";
684
+ readonly rootResetRequirementNumber: "Pelo menos um número";
685
+ readonly rootResetRequirementSymbol: "Pelo menos um símbolo permitido: -().&@?'#,/;+";
686
+ readonly rootResetRequirementCharacters: "Somente letras, números e símbolos permitidos";
687
+ readonly rootResetRequirementMatch: "Os dois campos de senha são iguais";
688
+ readonly rootResetLeakNote: "A Hostinger também rejeita senhas encontradas em bases públicas de vazamentos.";
689
+ readonly rootResetReview: "Revisar troca de senha";
690
+ readonly rootResetConfirmTitle: "Confirme a troca da senha de root";
691
+ readonly rootResetConfirmBody: "A senha de root atual deixará de funcionar em novas conexões assim que a Hostinger concluir esta ação.";
692
+ readonly rootResetTarget: "Esta ação altera";
693
+ readonly rootResetTypeHostname: "Digite o hostname do VPS para confirmar";
694
+ readonly rootResetNow: "Trocar a senha de root agora";
695
+ readonly rootResetWorking: "A Hostinger está atualizando o VPS…";
696
+ readonly rootResetSuccess: "Senha de root alterada. Testando o SSH com a nova senha…";
697
+ 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.";
698
+ readonly rootResetOutcomeUnknown: "A Hostinger talvez ainda esteja processando a troca. Não envie novamente; teste a nova senha antes de tentar de novo.";
699
+ readonly rootResetCancel: "Manter a senha atual";
700
+ readonly hostingerErrorInvalidInput: "Confira os dados informados e tente novamente.";
701
+ readonly hostingerErrorUnauthorized: "A Hostinger recusou este token. Crie um novo token e reconecte.";
702
+ readonly hostingerErrorRateLimited: "O limite de requisições da Hostinger foi atingido. Aguarde um pouco e tente novamente.";
703
+ readonly hostingerErrorUnavailable: "A Hostinger está temporariamente indisponível. A configuração manual continua disponível.";
704
+ readonly hostingerErrorInvalidResponse: "A Hostinger retornou uma resposta inesperada. Tente mais tarde ou configure o VPS manualmente.";
705
+ readonly hostingerErrorNotConnected: "Reconecte a Hostinger antes de continuar.";
706
+ 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.";
707
+ readonly hostingerErrorPasswordPolicy: "A Hostinger recusou esta senha. Use somente letras, números e estes símbolos: -().&@?'#,/;+. Também evite senhas vazadas ou comuns.";
708
+ readonly hostingerErrorActionFailed: "A Hostinger não conseguiu trocar a senha de root. Confira o VPS no hPanel antes de tentar novamente.";
709
+ 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.";
710
+ readonly hostingerErrorConfirmation: "Esta confirmação expirou ou não é mais válida. Revise a troca de senha novamente.";
711
+ readonly hostingerErrorTargetChanged: "O VPS mudou depois da confirmação. Atualize a lista e revise o destino novamente.";
712
+ readonly hostingerErrorTargetUnavailable: "Este VPS não pode ser alterado agora. Aguarde a Hostinger terminar a ação atual.";
713
+ readonly hostingerErrorConflict: "Outra operação do instalador já está em andamento.";
714
+ readonly stepConfigTitle: "Passo 2 — Configurar o seu Second Brain";
715
+ readonly stepConfigBody: "Estes valores configuram o seu servidor e a sua conta de dono.";
716
+ readonly domainLabel: "Seu domínio (por exemplo brain.exemplo.com)";
717
+ readonly hostingerVpsDomainLabel: "Domínio do seu VPS na Hostinger";
718
+ readonly hostingerSubdomainLabel: "Subdomínio";
719
+ readonly hostingerFinalDomainLabel: "Endereço final do Second Brain";
720
+ readonly hostingerDomainNote: "O DNS curinga da Hostinger aponta este subdomínio automaticamente para o VPS selecionado.";
721
+ 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.";
722
+ readonly dnsCheck: "Verificar DNS";
723
+ readonly dnsMatch: "O domínio aponta para o seu servidor.";
724
+ readonly dnsMismatch: "O domínio ainda não aponta para o seu servidor.";
725
+ readonly dnsPending: "O DNS ainda não propagou. Você pode continuar e verificar depois.";
726
+ readonly openRouterLabel: "Chave de API da OpenRouter";
727
+ readonly databasePasswordNote: "Uma senha forte de banco de dados é gerada automaticamente e guardada apenas no seu servidor.";
728
+ readonly ownerEmailLabel: "Email do dono";
729
+ readonly ownerPasswordLabel: "Senha do dono (pelo menos 12 caracteres)";
730
+ readonly ownerPasswordConfirmLabel: "Confirme a senha do dono";
731
+ readonly ownerPasswordTooShort: "A senha precisa ter pelo menos 12 caracteres.";
732
+ readonly ownerPasswordMismatch: "A confirmação da senha não confere.";
733
+ readonly stepReviewTitle: "Passo 3 — Revisar e instalar";
734
+ readonly stepReviewBody: "Revise os valores abaixo e inicie a instalação.";
735
+ readonly install: "Instalar";
736
+ readonly progressTitle: "Instalando";
737
+ readonly progressMapLabel: "Fases da instalação";
738
+ readonly progressPhaseAccess: "Acesso";
739
+ readonly progressPhaseConfig: "Configurar";
740
+ readonly progressPhaseDeploy: "Deploy";
741
+ readonly progressPhaseAccount: "Conta";
742
+ readonly progressPhaseVerify: "Verificar";
743
+ readonly progressGenerateKey: "Criar uma chave de deploy segura";
744
+ readonly progressConnectVps: "Conectar ao servidor";
745
+ readonly progressAuthorizeKey: "Instalar a chave de deploy no servidor";
746
+ readonly progressWriteEnv: "Gravar a configuração do servidor";
747
+ readonly progressKeptDatabasePassword: "A senha de banco existente foi mantida.";
748
+ readonly progressAlternatePorts: "As portas locais padrão estavam ocupadas no servidor — usando";
749
+ readonly bearerOptionLabel: "Criar também um token de acesso estático (Bearer)";
750
+ readonly bearerOptionBody: "Para clientes MCP que não conseguem entrar com OAuth. O token dá acesso total à conta de dono; reinstalar com esta opção cria um novo token e substitui o antigo.";
751
+ readonly bearerReviewEnabled: "Será criado";
752
+ readonly bearerReviewDisabled: "Não solicitado";
753
+ readonly doneBearerTitle: "Token de acesso estático (Bearer)";
754
+ readonly doneBearerNote: "Exibido apenas esta vez — copie agora e guarde em um lugar seguro. Envie como cabeçalho Authorization: Bearer ao conectar na URL MCP acima.";
755
+ readonly dashboardBearer: "Criar token de acesso estático (Bearer)";
756
+ readonly dashboardBearerHint: "para clientes que não conseguem entrar com OAuth";
757
+ readonly bearerConfirmTitle: "Criar um token de acesso estático?";
758
+ readonly bearerConfirmBody: "O token dá acesso total à conta de dono e substitui qualquer token estático anterior. O engine reinicia rapidamente para ativá-lo.";
759
+ readonly bearerEmailLabel: "Email da conta de dono";
760
+ readonly bearerConfirmApply: "Criar token";
761
+ readonly progressUploadSource: "Enviar o código do projeto para o servidor";
762
+ readonly progressUncommitted: "Atenção: mudanças ainda não commitadas neste computador não foram enviadas; o servidor constrói o último commit.";
763
+ readonly progressBuildDeploy: "Construir e iniciar no servidor — pode levar vários minutos";
764
+ readonly progressVerifyKey: "Confirmar que a chave de deploy funciona";
765
+ readonly progressCreateOwner: "Criar a sua conta de dono";
766
+ readonly progressOwnerExisted: "A conta de dono já existia. Continuando.";
767
+ readonly progressVerifyMcp: "Verificar o servidor por fora";
768
+ readonly progressSaveState: "Salvar as configurações do instalador neste computador";
769
+ readonly progressFailed: "Este passo falhou";
770
+ readonly progressSkipped: "Pulado";
771
+ readonly progressOpenLogs: "Abrir os logs do deploy";
772
+ readonly installDone: "O seu Second Brain está pronto.";
773
+ readonly doneTitle: "Tudo pronto";
774
+ readonly doneMcpUrl: "O endereço do seu conector";
775
+ readonly doneConnectClient: "Abra as configurações de conectores do seu cliente, adicione um conector personalizado, cole o endereço acima e entre com o seu email e a senha de dono.";
776
+ readonly doneClose: "Pode fechar esta janela. Rode npm run installer de novo quando quiser.";
777
+ readonly githubActivateTitle: "Deploys automáticos (opcional)";
778
+ 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.";
779
+ readonly githubGuidePath: "No github.com: seu avatar → Settings → Developer settings → Personal access tokens → Fine-grained tokens.";
780
+ readonly githubGuideStep1: "Abra a página do token com o botão abaixo e entre no GitHub.";
781
+ readonly githubGuideStep2: "Dê o nome second-brain-installer e defina a expiração para 90 dias.";
782
+ readonly githubGuideStep3: "Em Resource owner mantenha a sua conta, e em Repository access escolha Only select repositories e selecione este repositório.";
783
+ readonly githubGuideStep4: "Em Repository permissions defina Actions como Read and write, Secrets como Read and write e Contents como Read-only.";
784
+ readonly githubGuideStep5: "Clique em Generate token e copie na hora — o GitHub mostra o token uma única vez.";
785
+ readonly githubGuideOpen: "Criar o token no GitHub";
786
+ readonly githubTokenLabel: "Token de acesso do GitHub";
787
+ readonly githubRepositoryLabel: "Repositório";
788
+ readonly githubRepositoryDetected: "Repositório detectado a partir desta pasta";
789
+ readonly githubRepositoryManual: "Digite o repositório como dono/nome";
790
+ readonly githubConnect: "Ativar deploys automáticos";
791
+ readonly githubConnectedNote: "Os deploys automáticos estão ativos.";
792
+ readonly githubPermissionActions: "Actions: Read and write";
793
+ readonly githubPermissionSecrets: "Secrets: Read and write";
794
+ readonly githubPermissionContents: "Contents: Read-only";
795
+ readonly githubTokenInvalid: "O GitHub recusou este token. Crie um novo e cole de novo.";
796
+ readonly githubTokenExpiresSoon: "Este token expira em breve. Considere criar um novo.";
797
+ readonly githubPermissionMissing: "Esta permissão está faltando no token";
798
+ readonly dashboardTitle: "Seu Second Brain";
799
+ readonly dashboardHealthCheck: "Verificar agora";
800
+ readonly heroAllGood: "Tudo funcionando";
801
+ readonly heroChecking: "Verificando o seu servidor…";
802
+ readonly heroProblem: "Algo precisa de atenção";
803
+ readonly heroOnlineBody: "Seu Second Brain está online e conectado.";
804
+ readonly heroProblemBody: "A verificação encontrou um problema — veja Conexões abaixo.";
805
+ readonly heroLive: "LIVE";
806
+ readonly heroVersionLabel: "Versão atual:";
807
+ readonly heroAutoOn: "Atualizações automáticas ativas";
808
+ readonly heroAutoOff: "Atualizações automáticas desativadas";
809
+ readonly heroServerOnline: "Servidor online";
810
+ readonly heroServerOffline: "Servidor inacessível";
811
+ readonly updateAvailable: "Nova versão disponível";
812
+ readonly updatePublishing: "Publicando…";
813
+ readonly updateFailed: "A última publicação falhou";
814
+ readonly updateNow: "Atualizar agora";
815
+ readonly btnOtherActions: "Outras ações";
816
+ readonly publishingNote: "A publicação pode levar alguns minutos. Esta página atualiza sozinha quando terminar.";
817
+ readonly connectionsTitle: "Conexões";
818
+ readonly connMcp: "MCP";
819
+ readonly connOauth: "OAuth";
820
+ readonly connServer: "Servidor";
821
+ readonly connStatusWorking: "Funcionando";
822
+ readonly connStatusOk: "OK";
823
+ readonly connStatusOnline: "Online";
824
+ readonly connStatusFail: "Problema";
825
+ readonly connStatusWait: "Verificando";
826
+ readonly viewDiagnostic: "Ver diagnóstico completo";
827
+ readonly hideDiagnostic: "Ocultar diagnóstico";
828
+ readonly lastCheckedLabel: "Última verificação:";
829
+ readonly agoJustNow: "agora mesmo";
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 helpTitle: "Ajuda rápida";
839
+ readonly helpStep1Title: "Copie a URL do conector";
840
+ readonly helpStep1Body: "Use o botão abaixo para copiar.";
841
+ readonly helpStep2Title: "Adicione no seu cliente";
842
+ readonly helpStep2Body: "Abra as configurações de conectores e adicione um conector personalizado.";
843
+ readonly helpStep3Title: "Faça login";
844
+ readonly helpStep3Body: "Use o seu email e a senha de dono.";
845
+ readonly helpStep4Title: "Verifique a conexão";
846
+ readonly helpStep4Body: "Confirme se o status está online.";
847
+ readonly connectorUrlLabel: "URL do conector";
848
+ readonly actionsTitle: "Ações";
849
+ readonly dashboardRollback: "Restaurar versão anterior";
850
+ readonly dashboardRollbackHint: "Volte para uma versão estável anterior.";
851
+ readonly dashboardRollbackPick: "Escolha uma versão anterior bem-sucedida";
852
+ readonly dashboardRollbackApply: "Restaurar esta versão";
853
+ 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.";
854
+ readonly rollbackDataNote: "Os seus dados não são tocados: tarefas, memórias, conhecimento e a sua conta continuam exatamente como estão.";
855
+ readonly rollbackWindowNote: "As versões mais recentes ficam disponíveis aqui. Para avançar de novo, é só atualizar de novo.";
856
+ readonly rollbackCurrentTag: "no ar agora";
857
+ readonly dashboardDeployLocal: "Subir nova versão";
858
+ readonly dashboardDeployLocalHint: "Envie o código mais recente deste computador.";
859
+ readonly localConfirmTitle: "Subir o código deste computador?";
860
+ readonly localConfirmBody: "Isso envia a versão de código mais recente deste computador (o último commit) e reconstrói no seu servidor, sem passar pelo GitHub.";
861
+ readonly localConfirmUncommitted: "Mudanças que você ainda não commitou não vão junto.";
862
+ readonly localConfirmAuto: "Para publicar pelos deploys automáticos — e ficar registrado no histórico — faça merge na main e push.";
863
+ readonly localConfirmApply: "Sim, subir versão";
864
+ readonly rollbackConfirmTitle: "Restaurar esta versão?";
865
+ 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.";
866
+ readonly rollbackConfirmApply: "Sim, restaurar";
867
+ readonly deployStartedNote: "Iniciado — acompanhe o status no histórico. Leva um ou dois minutos, e esta página atualiza sozinha.";
868
+ readonly dashboardLinkActions: "Histórico de deploys no GitHub";
869
+ readonly dashboardReset: "Esquecer as configurações deste computador";
870
+ readonly dashboardResetHint: "Nada no seu servidor é desligado ou apagado; isso só limpa o que o instalador salvou aqui.";
871
+ readonly dashboardResetConfirm: "Isto apaga as configurações salvas neste computador, incluindo o token do GitHub. O seu servidor continua rodando. Continuar?";
872
+ readonly resetConfirmYes: "Sim, esquecer as configurações";
873
+ readonly dashboardResetFinal: "Última confirmação: o token do GitHub e a chave de deploy guardados neste computador serão apagados. O seu servidor continua rodando. Continuar?";
874
+ readonly footerLine: "Second Brain AI Coders Academy — Infraestrutura gerenciada para desenvolvedores.";
875
+ readonly runStatusSuccess: "Sucesso";
876
+ readonly runStatusFailure: "Falhou";
877
+ readonly runStatusInProgress: "Em andamento";
878
+ readonly terminalRunningAt: "┌─ AI CODERS ACADEMY / SECOND BRAIN\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 Second Brain.";
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 {};