@ouro.bot/cli 0.1.0-alpha.386 → 0.1.0-alpha.389
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.
- package/changelog.json +21 -0
- package/dist/heart/daemon/cli-defaults.js +38 -0
- package/dist/heart/daemon/cli-exec.js +25 -38
- package/dist/heart/daemon/cli-help.js +4 -4
- package/dist/heart/daemon/cli-parse.js +2 -2
- package/dist/heart/daemon/ouro-bot-entry.js +3 -1
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/identity.js +1 -1
- package/dist/repertoire/vault-setup.js +12 -7
- package/package.json +1 -1
package/changelog.json
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_note": "This changelog is maintained as part of the PR/version-bump workflow. Agent-curated, not auto-generated. Agents read this file directly via read_file to understand what changed between versions.",
|
|
3
3
|
"versions": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.1.0-alpha.389",
|
|
6
|
+
"changes": [
|
|
7
|
+
"CLI entrypoints now print command failures to stderr before exiting, so invalid commands and vault recovery errors are visible in the terminal instead of only appearing in runtime logs.",
|
|
8
|
+
"Vault unlock secret prompts now fail fast when stdin/stdout is not an interactive terminal, preserving the non-echoing human-provided secret flow instead of dangling or silently exiting.",
|
|
9
|
+
"`ouro vault recover` now validates every local `--from` JSON source before asking for the replacement vault unlock secret, so bad paths or malformed files never ask the human to type a secret first.",
|
|
10
|
+
"Vault recovery tests now assert that bad source files do not call the secret prompt and that entrypoint failures are terminal-visible.",
|
|
11
|
+
"`@ouro.bot/cli` and the `ouro.bot` wrapper are version-synced for the vault recovery prompt polish release."
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"version": "0.1.0-alpha.388",
|
|
16
|
+
"changes": [
|
|
17
|
+
"The default agent credential vault host now points at the live Vaultwarden endpoint `https://vault.ouroboros.bot` instead of the website redirect host.",
|
|
18
|
+
"`ouro vault create` and `ouro vault recover` now create accounts through the live Bitwarden/Vaultwarden identity registration endpoint and include the registration URL in setup failures.",
|
|
19
|
+
"Vault unlock/create/recover prompts now use a non-echoing secret prompt for vault unlock secrets, and the supported docs/help path asks the human to provide a saved secret instead of generating or printing one.",
|
|
20
|
+
"Deprecated `--generate-unlock-secret` vault flags now fail fast with guidance to rerun interactively, preventing new vault unlock secrets from being printed into terminals or logs.",
|
|
21
|
+
"Vault setup, unlock, provider CLI, help, docs, and runtime-config tests now encode the canonical vault host and human-provided secret flow so the wrong host or unsafe prompt path cannot silently return.",
|
|
22
|
+
"`@ouro.bot/cli` and the `ouro.bot` wrapper are version-synced for the canonical vault recovery release."
|
|
23
|
+
]
|
|
24
|
+
},
|
|
4
25
|
{
|
|
5
26
|
"version": "0.1.0-alpha.386",
|
|
6
27
|
"changes": [
|
|
@@ -221,6 +221,43 @@ async function defaultPromptInput(question) {
|
|
|
221
221
|
rl.close();
|
|
222
222
|
}
|
|
223
223
|
}
|
|
224
|
+
async function defaultPromptSecret(question) {
|
|
225
|
+
if (process.stdin.isTTY !== true || process.stdout.isTTY !== true) {
|
|
226
|
+
throw new Error("vault unlock secret entry requires an interactive terminal so the secret can be hidden. Re-run this command in a terminal and enter the human-chosen secret when prompted.");
|
|
227
|
+
}
|
|
228
|
+
const readline = await Promise.resolve().then(() => __importStar(require("readline")));
|
|
229
|
+
const rl = readline.createInterface({
|
|
230
|
+
input: process.stdin,
|
|
231
|
+
output: process.stdout,
|
|
232
|
+
terminal: true,
|
|
233
|
+
});
|
|
234
|
+
const mutableRl = rl;
|
|
235
|
+
const originalWriteToOutput = mutableRl._writeToOutput;
|
|
236
|
+
let muted = false;
|
|
237
|
+
if (originalWriteToOutput) {
|
|
238
|
+
mutableRl._writeToOutput = (stringToWrite) => {
|
|
239
|
+
if (!muted) {
|
|
240
|
+
originalWriteToOutput.call(rl, stringToWrite);
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
const response = await new Promise((resolve) => {
|
|
246
|
+
rl.question(question, (answer) => {
|
|
247
|
+
process.stdout.write("\n");
|
|
248
|
+
resolve(answer);
|
|
249
|
+
});
|
|
250
|
+
muted = true;
|
|
251
|
+
});
|
|
252
|
+
return response.trim();
|
|
253
|
+
}
|
|
254
|
+
finally {
|
|
255
|
+
if (originalWriteToOutput) {
|
|
256
|
+
mutableRl._writeToOutput = originalWriteToOutput;
|
|
257
|
+
}
|
|
258
|
+
rl.close();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
224
261
|
function defaultListDiscoveredAgents() {
|
|
225
262
|
return (0, agent_discovery_1.listEnabledBundleAgents)({
|
|
226
263
|
bundlesRoot: (0, identity_1.getAgentBundlesRoot)(),
|
|
@@ -464,6 +501,7 @@ function createDefaultOuroCliDeps(socketPath = socket_client_1.DEFAULT_DAEMON_SO
|
|
|
464
501
|
listDiscoveredAgents: defaultListDiscoveredAgents,
|
|
465
502
|
runHatchFlow: hatch_flow_1.runHatchFlow,
|
|
466
503
|
promptInput: defaultPromptInput,
|
|
504
|
+
promptSecret: defaultPromptSecret,
|
|
467
505
|
runSerpentGuide: defaultRunSerpentGuide,
|
|
468
506
|
runAuthFlow: auth_flow_1.runRuntimeAuthFlow,
|
|
469
507
|
registerOuroBundleType: ouro_uti_1.registerOuroBundleUti,
|
|
@@ -694,16 +694,22 @@ function defaultRecoveredVaultEmail(agentName, now) {
|
|
|
694
694
|
const stamp = now.toISOString().replace(/[-:.TZ]/g, "").slice(0, 14);
|
|
695
695
|
return `${local}+recovered-${stamp}@ouro.bot`;
|
|
696
696
|
}
|
|
697
|
+
function ensureVaultSecretPrompt(promptSecret, action) {
|
|
698
|
+
if (promptSecret)
|
|
699
|
+
return promptSecret;
|
|
700
|
+
throw new Error(`vault ${action} requires an interactive secret prompt that does not echo the vault unlock secret`);
|
|
701
|
+
}
|
|
702
|
+
function rejectGeneratedVaultUnlockSecret(action) {
|
|
703
|
+
throw new Error(`vault ${action} no longer supports --generate-unlock-secret. Re-run without that flag and enter a human-chosen unlock secret; Ouro will not print vault unlock secrets.`);
|
|
704
|
+
}
|
|
697
705
|
async function executeVaultUnlock(command, deps) {
|
|
698
706
|
if (command.agent === "SerpentGuide") {
|
|
699
707
|
throw new Error("SerpentGuide does not have a persistent credential vault. Hatch bootstrap uses selected provider credentials in memory only.");
|
|
700
708
|
}
|
|
701
|
-
const
|
|
702
|
-
if (!prompt)
|
|
703
|
-
throw new Error("vault unlock requires an interactive prompt to capture the vault unlock secret");
|
|
709
|
+
const promptSecret = ensureVaultSecretPrompt(deps.promptSecret, "unlock");
|
|
704
710
|
const { config } = (0, auth_flow_1.readAgentConfigForAgent)(command.agent, deps.bundlesRoot);
|
|
705
711
|
const vault = (0, identity_1.resolveVaultConfig)(command.agent, config.vault);
|
|
706
|
-
const unlockSecret = await
|
|
712
|
+
const unlockSecret = await promptSecret(`Ouro vault unlock secret for ${vault.email}: `);
|
|
707
713
|
const store = (0, vault_unlock_1.storeVaultUnlockSecret)({
|
|
708
714
|
agentName: command.agent,
|
|
709
715
|
email: vault.email,
|
|
@@ -723,6 +729,8 @@ async function executeVaultCreate(command, deps) {
|
|
|
723
729
|
if (command.agent === "SerpentGuide") {
|
|
724
730
|
throw new Error("SerpentGuide does not have a persistent credential vault. Create a vault for the hatchling agent, not SerpentGuide.");
|
|
725
731
|
}
|
|
732
|
+
if (command.generateUnlockSecret)
|
|
733
|
+
rejectGeneratedVaultUnlockSecret("create");
|
|
726
734
|
const prompt = deps.promptInput;
|
|
727
735
|
const { configPath, config } = (0, auth_flow_1.readAgentConfigForAgent)(command.agent, deps.bundlesRoot);
|
|
728
736
|
const configuredVault = (0, identity_1.resolveVaultConfig)(command.agent, config.vault);
|
|
@@ -730,16 +738,12 @@ async function executeVaultCreate(command, deps) {
|
|
|
730
738
|
if (!email) {
|
|
731
739
|
throw new Error("vault create requires --email <email> when the agent bundle has no vault.email");
|
|
732
740
|
}
|
|
741
|
+
const promptSecret = ensureVaultSecretPrompt(deps.promptSecret, "create");
|
|
733
742
|
const serverUrl = command.serverUrl ?? config.vault?.serverUrl ?? configuredVault.serverUrl;
|
|
734
|
-
const
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
? (await prompt(`Choose Ouro vault unlock secret for ${email}: `)).trim()
|
|
738
|
-
: "";
|
|
739
|
-
if (!requestedUnlockSecret && !command.generateUnlockSecret) {
|
|
740
|
-
throw new Error("vault create requires an unlock secret. Re-run with an interactive terminal or pass --generate-unlock-secret.");
|
|
743
|
+
const unlockSecret = (await promptSecret(`Choose Ouro vault unlock secret for ${email}: `)).trim();
|
|
744
|
+
if (!unlockSecret) {
|
|
745
|
+
throw new Error("vault create requires an unlock secret. Re-run in an interactive terminal and enter a human-chosen unlock secret.");
|
|
741
746
|
}
|
|
742
|
-
const unlockSecret = requestedUnlockSecret || (0, crypto_1.randomBytes)(32).toString("base64");
|
|
743
747
|
const result = await (0, vault_setup_1.createVaultAccount)("Ouro credential vault", serverUrl, email, unlockSecret);
|
|
744
748
|
if (!result.success) {
|
|
745
749
|
const message = [
|
|
@@ -764,14 +768,7 @@ async function executeVaultCreate(command, deps) {
|
|
|
764
768
|
`vault: ${email} at ${serverUrl}`,
|
|
765
769
|
`local unlock store: ${store.kind}${store.secure ? "" : " (explicit plaintext fallback)"}`,
|
|
766
770
|
"All raw credentials for this agent will be stored in this Ouro credential vault.",
|
|
767
|
-
|
|
768
|
-
? [
|
|
769
|
-
"",
|
|
770
|
-
`vault unlock secret: ${unlockSecret}`,
|
|
771
|
-
"",
|
|
772
|
-
"Keep this saved outside Ouro now. Another machine cannot unlock the vault without it.",
|
|
773
|
-
]
|
|
774
|
-
: ["Keep the vault unlock secret saved outside Ouro. Another machine will need it once."]),
|
|
771
|
+
"Keep the vault unlock secret saved outside Ouro. Another machine will need it once.",
|
|
775
772
|
].join("\n");
|
|
776
773
|
deps.writeStdout(message);
|
|
777
774
|
return message;
|
|
@@ -780,22 +777,19 @@ async function executeVaultRecover(command, deps) {
|
|
|
780
777
|
if (command.agent === "SerpentGuide") {
|
|
781
778
|
throw new Error("SerpentGuide does not have a persistent credential vault. Recover the hatchling agent vault, not SerpentGuide.");
|
|
782
779
|
}
|
|
783
|
-
|
|
780
|
+
if (command.generateUnlockSecret)
|
|
781
|
+
rejectGeneratedVaultUnlockSecret("recover");
|
|
782
|
+
const sourceImports = command.sources.map(readVaultRecoverSource);
|
|
783
|
+
const promptSecret = ensureVaultSecretPrompt(deps.promptSecret, "recover");
|
|
784
784
|
const now = providerCliNow(deps);
|
|
785
785
|
const { configPath, config } = (0, auth_flow_1.readAgentConfigForAgent)(command.agent, deps.bundlesRoot);
|
|
786
786
|
const configuredVault = (0, identity_1.resolveVaultConfig)(command.agent, config.vault);
|
|
787
787
|
const email = command.email ?? defaultRecoveredVaultEmail(command.agent, now);
|
|
788
788
|
const serverUrl = command.serverUrl ?? config.vault?.serverUrl ?? configuredVault.serverUrl;
|
|
789
|
-
const
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
? (await prompt(`Choose replacement Ouro vault unlock secret for ${email}: `)).trim()
|
|
793
|
-
: "";
|
|
794
|
-
if (!requestedUnlockSecret && !command.generateUnlockSecret) {
|
|
795
|
-
throw new Error("vault recover requires a replacement unlock secret. Re-run with an interactive terminal or pass --generate-unlock-secret.");
|
|
789
|
+
const unlockSecret = (await promptSecret(`Choose replacement Ouro vault unlock secret for ${email}: `)).trim();
|
|
790
|
+
if (!unlockSecret) {
|
|
791
|
+
throw new Error("vault recover requires a replacement unlock secret. Re-run in an interactive terminal and enter a human-chosen unlock secret.");
|
|
796
792
|
}
|
|
797
|
-
const unlockSecret = requestedUnlockSecret || (0, crypto_1.randomBytes)(32).toString("base64");
|
|
798
|
-
const sourceImports = command.sources.map(readVaultRecoverSource);
|
|
799
793
|
const result = await (0, vault_setup_1.createVaultAccount)("Ouro credential vault", serverUrl, email, unlockSecret);
|
|
800
794
|
if (!result.success) {
|
|
801
795
|
const message = [
|
|
@@ -843,14 +837,7 @@ async function executeVaultRecover(command, deps) {
|
|
|
843
837
|
`provider credentials imported: ${providerList.length === 0 ? "none" : providerList.join(", ")}`,
|
|
844
838
|
`runtime credentials imported: ${runtimeFields.length === 0 ? "none" : runtimeFields.join(", ")}`,
|
|
845
839
|
"credential values were not printed",
|
|
846
|
-
|
|
847
|
-
? [
|
|
848
|
-
"",
|
|
849
|
-
`vault unlock secret: ${unlockSecret}`,
|
|
850
|
-
"",
|
|
851
|
-
"Keep this saved outside Ouro now. Another machine cannot unlock the vault without it.",
|
|
852
|
-
]
|
|
853
|
-
: ["Keep the replacement vault unlock secret saved outside Ouro. Another machine will need it once."]),
|
|
840
|
+
"Keep the replacement vault unlock secret saved outside Ouro. Another machine will need it once.",
|
|
854
841
|
].join("\n");
|
|
855
842
|
deps.writeStdout(message);
|
|
856
843
|
return message;
|
|
@@ -232,13 +232,13 @@ exports.COMMAND_REGISTRY = {
|
|
|
232
232
|
const SUBCOMMAND_HELP = {
|
|
233
233
|
"vault create": {
|
|
234
234
|
description: "Create an agent credential vault and store local unlock material",
|
|
235
|
-
usage: "ouro vault create --agent <name> --email <email> [--server <url>] [--store <store>]
|
|
236
|
-
example: "ouro vault create --agent ouroboros --email ouroboros@ouro.bot
|
|
235
|
+
usage: "ouro vault create --agent <name> --email <email> [--server <url>] [--store <store>]",
|
|
236
|
+
example: "ouro vault create --agent ouroboros --email ouroboros@ouro.bot",
|
|
237
237
|
},
|
|
238
238
|
"vault recover": {
|
|
239
239
|
description: "Create a replacement agent vault and import local JSON credential exports",
|
|
240
|
-
usage: "ouro vault recover --agent <name> --from <json> [--from <json>] [--email <email>] [--server <url>] [--store <store>]
|
|
241
|
-
example: "ouro vault recover --agent ouroboros --from ./credentials.json
|
|
240
|
+
usage: "ouro vault recover --agent <name> --from <json> [--from <json>] [--email <email>] [--server <url>] [--store <store>]",
|
|
241
|
+
example: "ouro vault recover --agent ouroboros --from ./credentials.json",
|
|
242
242
|
},
|
|
243
243
|
"vault unlock": {
|
|
244
244
|
description: "Unlock an existing agent credential vault on this machine",
|
|
@@ -84,8 +84,8 @@ function usage() {
|
|
|
84
84
|
" ouro auth --agent <name> [--provider <provider>]",
|
|
85
85
|
" ouro auth verify --agent <name> [--provider <provider>]",
|
|
86
86
|
" ouro auth switch --agent <name> --provider <provider>",
|
|
87
|
-
" ouro vault create --agent <name> --email <email> [--server <url>] [--store <store>]
|
|
88
|
-
" ouro vault recover --agent <name> --from <json> [--from <json>] [--email <email>] [--server <url>] [--store <store>]
|
|
87
|
+
" ouro vault create --agent <name> --email <email> [--server <url>] [--store <store>]",
|
|
88
|
+
" ouro vault recover --agent <name> --from <json> [--from <json>] [--email <email>] [--server <url>] [--store <store>]",
|
|
89
89
|
" ouro vault unlock --agent <name> [--store auto|macos-keychain|windows-dpapi|linux-secret-service|plaintext-file]",
|
|
90
90
|
" ouro vault status --agent <name> [--store auto|macos-keychain|windows-dpapi|linux-secret-service|plaintext-file]",
|
|
91
91
|
" ouro vault config set --agent <name> --key <path> [--value <value>]",
|
|
@@ -12,12 +12,14 @@ const ouro_bot_wrapper_1 = require("../versioning/ouro-bot-wrapper");
|
|
|
12
12
|
meta: { args: process.argv.slice(2) },
|
|
13
13
|
});
|
|
14
14
|
void (0, ouro_bot_wrapper_1.runOuroBotWrapper)(process.argv.slice(2)).catch((error) => {
|
|
15
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
16
|
+
process.stderr.write(`${message}\n`);
|
|
15
17
|
(0, runtime_1.emitNervesEvent)({
|
|
16
18
|
level: "error",
|
|
17
19
|
component: "daemon",
|
|
18
20
|
event: "daemon.ouro_bot_entry_error",
|
|
19
21
|
message: "ouro.bot wrapper entrypoint failed",
|
|
20
|
-
meta: { error:
|
|
22
|
+
meta: { error: message },
|
|
21
23
|
});
|
|
22
24
|
process.exit(1);
|
|
23
25
|
});
|
|
@@ -12,12 +12,14 @@ const runtime_logging_1 = require("./runtime-logging");
|
|
|
12
12
|
meta: { args: process.argv.slice(2) },
|
|
13
13
|
});
|
|
14
14
|
void (0, daemon_cli_1.runOuroCli)(process.argv.slice(2)).catch((error) => {
|
|
15
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
16
|
+
process.stderr.write(`${message}\n`);
|
|
15
17
|
(0, runtime_1.emitNervesEvent)({
|
|
16
18
|
level: "error",
|
|
17
19
|
component: "daemon",
|
|
18
20
|
event: "daemon.cli_entry_error",
|
|
19
21
|
message: "ouro CLI entrypoint failed",
|
|
20
|
-
meta: { error:
|
|
22
|
+
meta: { error: message },
|
|
21
23
|
});
|
|
22
24
|
process.exit(1);
|
|
23
25
|
});
|
package/dist/heart/identity.js
CHANGED
|
@@ -75,7 +75,7 @@ exports.DEFAULT_AGENT_PHRASES = {
|
|
|
75
75
|
tool: ["running tool"],
|
|
76
76
|
followup: ["processing"],
|
|
77
77
|
};
|
|
78
|
-
exports.DEFAULT_VAULT_SERVER_URL = "https://vault.
|
|
78
|
+
exports.DEFAULT_VAULT_SERVER_URL = "https://vault.ouroboros.bot";
|
|
79
79
|
/**
|
|
80
80
|
* Resolve the vault config for an agent, applying defaults.
|
|
81
81
|
* If vault is not configured in agent.json, returns default values.
|
|
@@ -161,6 +161,7 @@ function generateRsaKeypair() {
|
|
|
161
161
|
// ---------------------------------------------------------------------------
|
|
162
162
|
const KDF_PBKDF2 = 0;
|
|
163
163
|
const KDF_ITERATIONS = 600000;
|
|
164
|
+
const REGISTER_ACCOUNT_PATH = "/identity/accounts/register";
|
|
164
165
|
/**
|
|
165
166
|
* Create a Bitwarden account on the configured Vaultwarden server.
|
|
166
167
|
* Uses the Bitwarden registration API with standard KDF implementation.
|
|
@@ -184,7 +185,8 @@ async function createVaultAccount(agentName, serverUrl, email, masterPassword) {
|
|
|
184
185
|
const { publicKeyB64, privateKeyDer } = generateRsaKeypair();
|
|
185
186
|
const encryptedPrivateKey = encryptWithStretchedKey(privateKeyDer, symKey);
|
|
186
187
|
// Step 4: POST registration
|
|
187
|
-
const
|
|
188
|
+
const registrationUrl = `${serverUrl}${REGISTER_ACCOUNT_PATH}`;
|
|
189
|
+
const res = await fetch(registrationUrl, {
|
|
188
190
|
method: "POST",
|
|
189
191
|
headers: { "Content-Type": "application/json" },
|
|
190
192
|
body: JSON.stringify({
|
|
@@ -210,14 +212,15 @@ async function createVaultAccount(agentName, serverUrl, email, masterPassword) {
|
|
|
210
212
|
catch {
|
|
211
213
|
errorDetail = `HTTP ${res.status} ${res.statusText}`;
|
|
212
214
|
}
|
|
215
|
+
const endpointAwareError = `${errorDetail} from ${registrationUrl}. Check --server; Ouro expects a Bitwarden/Vaultwarden identity API.`;
|
|
213
216
|
(0, runtime_1.emitNervesEvent)({
|
|
214
217
|
level: "error",
|
|
215
218
|
event: "repertoire.vault_setup_error",
|
|
216
219
|
component: "repertoire",
|
|
217
|
-
message: `vault registration failed: ${
|
|
218
|
-
meta: { agentName, serverUrl, email, reason:
|
|
220
|
+
message: `vault registration failed: ${endpointAwareError}`,
|
|
221
|
+
meta: { agentName, serverUrl, email, registrationUrl, reason: endpointAwareError },
|
|
219
222
|
});
|
|
220
|
-
return { success: false, email, serverUrl, error:
|
|
223
|
+
return { success: false, email, serverUrl, error: endpointAwareError };
|
|
221
224
|
}
|
|
222
225
|
(0, runtime_1.emitNervesEvent)({
|
|
223
226
|
event: "repertoire.vault_setup_end",
|
|
@@ -229,13 +232,15 @@ async function createVaultAccount(agentName, serverUrl, email, masterPassword) {
|
|
|
229
232
|
}
|
|
230
233
|
catch (err) {
|
|
231
234
|
const reason = err instanceof Error ? err.message : String(err);
|
|
235
|
+
const registrationUrl = `${serverUrl}${REGISTER_ACCOUNT_PATH}`;
|
|
236
|
+
const endpointAwareError = `cannot reach vault registration endpoint ${registrationUrl}: ${reason}. Check network, DNS/TLS, and --server.`;
|
|
232
237
|
(0, runtime_1.emitNervesEvent)({
|
|
233
238
|
level: "error",
|
|
234
239
|
event: "repertoire.vault_setup_error",
|
|
235
240
|
component: "repertoire",
|
|
236
|
-
message: `vault setup failed: ${
|
|
237
|
-
meta: { agentName, serverUrl, email, reason },
|
|
241
|
+
message: `vault setup failed: ${endpointAwareError}`,
|
|
242
|
+
meta: { agentName, serverUrl, email, registrationUrl, reason: endpointAwareError },
|
|
238
243
|
});
|
|
239
|
-
return { success: false, email, serverUrl, error:
|
|
244
|
+
return { success: false, email, serverUrl, error: endpointAwareError };
|
|
240
245
|
}
|
|
241
246
|
}
|