@ouro.bot/cli 0.1.0-alpha.441 → 0.1.0-alpha.442
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 +8 -0
- package/dist/heart/daemon/cli-exec.js +11 -11
- package/dist/heart/daemon/cli-help.js +4 -4
- package/dist/heart/daemon/connect-bay.js +17 -18
- package/dist/heart/daemon/human-command-screens.js +15 -15
- package/dist/heart/daemon/terminal-ui.js +4 -13
- package/dist/heart/daemon/up-progress.js +3 -3
- package/package.json +1 -1
package/changelog.json
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
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.442",
|
|
6
|
+
"changes": [
|
|
7
|
+
"The shared CLI masthead now lands as a clean `OUROBOROS` wordmark instead of the older circle treatment, with compact/plain render paths trimmed down so the banner feels intentional rather than doubled or noisy.",
|
|
8
|
+
"The main human-facing screens now use warmer but more concrete first-run language: `ouro up`, the home screen, status, help, hatch, vault outcomes, and the connections screen now explain what Ouro is actually doing without leaning on unexplained `house` or `bay` metaphors.",
|
|
9
|
+
"Failed live provider checks in the connections screen now stay in the honest `needs attention` bucket instead of being downgraded to `needs credentials`, and hermetic runtime plus packaged-install coverage lock the wording into the shipped CLI."
|
|
10
|
+
]
|
|
11
|
+
},
|
|
4
12
|
{
|
|
5
13
|
"version": "0.1.0-alpha.441",
|
|
6
14
|
"changes": [
|
|
@@ -1211,7 +1211,7 @@ async function executeVaultUnlock(command, deps) {
|
|
|
1211
1211
|
{
|
|
1212
1212
|
title: "Next moves",
|
|
1213
1213
|
lines: [
|
|
1214
|
-
`Run ouro up
|
|
1214
|
+
`Run ouro up so Ouro can check ${command.agent} again.`,
|
|
1215
1215
|
`If credentials are still missing, run ouro auth --agent ${command.agent} --provider <provider>.`,
|
|
1216
1216
|
],
|
|
1217
1217
|
},
|
|
@@ -1281,7 +1281,7 @@ async function executeVaultCreate(command, deps) {
|
|
|
1281
1281
|
];
|
|
1282
1282
|
return writeCommandOutcome(deps, {
|
|
1283
1283
|
title: "Credential vault",
|
|
1284
|
-
subtitle: `${command.agent}
|
|
1284
|
+
subtitle: `${command.agent}'s credential vault is ready.`,
|
|
1285
1285
|
summary: `All raw credentials for ${command.agent} now live in this vault.`,
|
|
1286
1286
|
sections: [
|
|
1287
1287
|
{
|
|
@@ -1298,7 +1298,7 @@ async function executeVaultCreate(command, deps) {
|
|
|
1298
1298
|
title: "Next moves",
|
|
1299
1299
|
lines: [
|
|
1300
1300
|
`Authenticate the providers ${command.agent} should use with ouro auth --agent ${command.agent} --provider <provider>.`,
|
|
1301
|
-
`Then run ouro up so
|
|
1301
|
+
`Then run ouro up so Ouro can bring ${command.agent} online.`,
|
|
1302
1302
|
],
|
|
1303
1303
|
},
|
|
1304
1304
|
],
|
|
@@ -1493,7 +1493,7 @@ async function executeVaultRecover(command, deps) {
|
|
|
1493
1493
|
title: "Next moves",
|
|
1494
1494
|
lines: [
|
|
1495
1495
|
`Run ouro auth verify --agent ${command.agent} to re-check the stored providers.`,
|
|
1496
|
-
`Then run ouro up so
|
|
1496
|
+
`Then run ouro up so Ouro can check ${command.agent} again.`,
|
|
1497
1497
|
],
|
|
1498
1498
|
},
|
|
1499
1499
|
],
|
|
@@ -1999,7 +1999,7 @@ async function buildConnectMenu(agent, deps, onProgress) {
|
|
|
1999
1999
|
{
|
|
2000
2000
|
option: "1",
|
|
2001
2001
|
name: "Providers",
|
|
2002
|
-
section: "
|
|
2002
|
+
section: "Providers",
|
|
2003
2003
|
status: providerSummary.status,
|
|
2004
2004
|
detailLines: providerSummary.detailLines,
|
|
2005
2005
|
laneSummaries: providerSummary.laneSummaries,
|
|
@@ -2166,7 +2166,7 @@ async function executeConnectPerplexity(agent, deps) {
|
|
|
2166
2166
|
],
|
|
2167
2167
|
nextMoves: [
|
|
2168
2168
|
"Ask the agent to search.",
|
|
2169
|
-
`Reopen the
|
|
2169
|
+
`Reopen the connections screen with ouro connect --agent ${agent} whenever you want to review capabilities.`,
|
|
2170
2170
|
],
|
|
2171
2171
|
fallbackLines: [
|
|
2172
2172
|
`Perplexity connected for ${agent}`,
|
|
@@ -2247,7 +2247,7 @@ async function executeConnectEmbeddings(agent, deps) {
|
|
|
2247
2247
|
],
|
|
2248
2248
|
nextMoves: [
|
|
2249
2249
|
`Rerun ouro connect embeddings --agent ${agent} with a working key.`,
|
|
2250
|
-
`Use ouro connect --agent ${agent} to review the rest of the
|
|
2250
|
+
`Use ouro connect --agent ${agent} to review the rest of the connections screen.`,
|
|
2251
2251
|
],
|
|
2252
2252
|
fallbackLines: [
|
|
2253
2253
|
`Embeddings key was saved for ${agent}, but the live check failed.`,
|
|
@@ -2276,7 +2276,7 @@ async function executeConnectEmbeddings(agent, deps) {
|
|
|
2276
2276
|
],
|
|
2277
2277
|
nextMoves: [
|
|
2278
2278
|
"Ask the agent to search notes or memory.",
|
|
2279
|
-
`Reopen the
|
|
2279
|
+
`Reopen the connections screen with ouro connect --agent ${agent} whenever you want to review capabilities.`,
|
|
2280
2280
|
],
|
|
2281
2281
|
fallbackLines: [
|
|
2282
2282
|
`Embeddings connected for ${agent}`,
|
|
@@ -2371,7 +2371,7 @@ async function executeConnectTeams(agent, deps) {
|
|
|
2371
2371
|
],
|
|
2372
2372
|
nextMoves: [
|
|
2373
2373
|
"Run ouro up so the daemon picks up the Teams sense change.",
|
|
2374
|
-
`Reopen the
|
|
2374
|
+
`Reopen the connections screen with ouro connect --agent ${agent} whenever you want to review capabilities.`,
|
|
2375
2375
|
],
|
|
2376
2376
|
fallbackLines: [
|
|
2377
2377
|
`Teams connected for ${agent}`,
|
|
@@ -5379,7 +5379,7 @@ async function runOuroCli(args, deps = (0, cli_defaults_1.createDefaultOuroCliDe
|
|
|
5379
5379
|
if (ttyBoardEnabled(deps)) {
|
|
5380
5380
|
deps.writeStdout(renderCommandBoard(deps, {
|
|
5381
5381
|
title: "Hatch an agent",
|
|
5382
|
-
subtitle: "Let’s
|
|
5382
|
+
subtitle: "Let’s set up a new agent.",
|
|
5383
5383
|
summary: "Ouro will walk through the essentials, then hand the conversation to the specialist.",
|
|
5384
5384
|
sections: [
|
|
5385
5385
|
{
|
|
@@ -5430,7 +5430,7 @@ async function runOuroCli(args, deps = (0, cli_defaults_1.createDefaultOuroCliDe
|
|
|
5430
5430
|
lines: [
|
|
5431
5431
|
`Bundle: ${result.bundleRoot}`,
|
|
5432
5432
|
`Specialist identity: ${result.selectedIdentity}`,
|
|
5433
|
-
`
|
|
5433
|
+
`Runtime status: ${daemonResult.message}`,
|
|
5434
5434
|
],
|
|
5435
5435
|
},
|
|
5436
5436
|
{
|
|
@@ -14,7 +14,7 @@ exports.getCommandHelp = getCommandHelp;
|
|
|
14
14
|
exports.COMMAND_REGISTRY = {
|
|
15
15
|
up: {
|
|
16
16
|
category: "Lifecycle",
|
|
17
|
-
description: "
|
|
17
|
+
description: "Start and check Ouro: bring up the background runtime, refresh what this machine needs, and show anything that still needs attention. In a human TTY, bare `ouro` opens the home screen instead; noninteractive shells still route bare `ouro` to `ouro up`.",
|
|
18
18
|
usage: "ouro [up] [--no-repair]",
|
|
19
19
|
example: "ouro up --no-repair",
|
|
20
20
|
},
|
|
@@ -32,7 +32,7 @@ exports.COMMAND_REGISTRY = {
|
|
|
32
32
|
},
|
|
33
33
|
status: {
|
|
34
34
|
category: "Lifecycle",
|
|
35
|
-
description: "Show
|
|
35
|
+
description: "Show Ouro status for this machine",
|
|
36
36
|
usage: "ouro status",
|
|
37
37
|
example: "ouro status",
|
|
38
38
|
},
|
|
@@ -165,7 +165,7 @@ exports.COMMAND_REGISTRY = {
|
|
|
165
165
|
},
|
|
166
166
|
connect: {
|
|
167
167
|
category: "Auth",
|
|
168
|
-
description: "
|
|
168
|
+
description: "Set up providers, portable integrations, and local senses from one guided screen",
|
|
169
169
|
usage: "ouro connect [providers|perplexity|embeddings|teams|bluebubbles] [--agent <name>]",
|
|
170
170
|
example: "ouro connect",
|
|
171
171
|
subcommands: ["providers", "perplexity", "embeddings", "teams", "bluebubbles"],
|
|
@@ -278,7 +278,7 @@ const SUBCOMMAND_HELP = {
|
|
|
278
278
|
example: "ouro connect perplexity",
|
|
279
279
|
},
|
|
280
280
|
"connect providers": {
|
|
281
|
-
description: "Open provider
|
|
281
|
+
description: "Open provider setup from the connections screen without remembering the auth command",
|
|
282
282
|
usage: "ouro connect providers [--agent <name>]",
|
|
283
283
|
example: "ouro connect providers",
|
|
284
284
|
},
|
|
@@ -87,9 +87,8 @@ function resolveProviderHealthStatus(providerHealth) {
|
|
|
87
87
|
return "needs setup";
|
|
88
88
|
if (issue?.kind === "provider-credentials-missing")
|
|
89
89
|
return "needs credentials";
|
|
90
|
-
if (issue?.kind === "provider-live-check-failed")
|
|
91
|
-
return
|
|
92
|
-
}
|
|
90
|
+
if (issue?.kind === "provider-live-check-failed")
|
|
91
|
+
return "needs attention";
|
|
93
92
|
const error = String(providerHealth.error).toLowerCase();
|
|
94
93
|
const fix = String(providerHealth.fix).toLowerCase();
|
|
95
94
|
if (error.includes("failed live check"))
|
|
@@ -169,8 +168,8 @@ function panel(title, body, width) {
|
|
|
169
168
|
return lines;
|
|
170
169
|
}
|
|
171
170
|
function renderHeader(agent, width) {
|
|
172
|
-
return panel(`${agent}
|
|
173
|
-
tty("
|
|
171
|
+
return panel(`${agent} connections`, [
|
|
172
|
+
tty("Set up or review one capability at a time.", BONE, true),
|
|
174
173
|
tty("Everything on this screen was checked live just now.", MIST),
|
|
175
174
|
], width);
|
|
176
175
|
}
|
|
@@ -266,23 +265,23 @@ function renderTtyBay(entries, options) {
|
|
|
266
265
|
const masthead = (0, terminal_ui_1.renderOuroMasthead)({
|
|
267
266
|
isTTY: true,
|
|
268
267
|
columns,
|
|
269
|
-
subtitle: "
|
|
268
|
+
subtitle: "Set up connections one step at a time.",
|
|
270
269
|
}).trimEnd();
|
|
271
270
|
const header = renderHeader(options.agent, fullWidth);
|
|
272
271
|
const nextEntry = entries.find((entry) => isProblemStatus(entry.status));
|
|
273
|
-
const providerEntry = entries.find((entry) => entry.section === "
|
|
272
|
+
const providerEntry = entries.find((entry) => entry.section === "Providers");
|
|
274
273
|
const portableEntries = entries.filter((entry) => entry.section === "Portable");
|
|
275
274
|
const machineEntries = entries.filter((entry) => entry.section === "This machine");
|
|
276
275
|
const wide = columns >= 118;
|
|
277
276
|
const footer = [
|
|
278
|
-
tty("
|
|
277
|
+
tty("Choose a number, or type the capability name.", MIST),
|
|
279
278
|
options.prompt,
|
|
280
279
|
];
|
|
281
280
|
if (!wide) {
|
|
282
281
|
const panels = [
|
|
283
282
|
header,
|
|
284
|
-
panel("
|
|
285
|
-
panel("
|
|
283
|
+
panel("Recommended next step", nextMoveBody(nextEntry), fullWidth),
|
|
284
|
+
panel("Providers", renderProviderBody(providerEntry, fullWidth), fullWidth),
|
|
286
285
|
panel("Portable", renderCapabilityBody(portableEntries, fullWidth), fullWidth),
|
|
287
286
|
panel("This machine", renderCapabilityBody(machineEntries, fullWidth), fullWidth),
|
|
288
287
|
];
|
|
@@ -291,18 +290,18 @@ function renderTtyBay(entries, options) {
|
|
|
291
290
|
const gap = 2;
|
|
292
291
|
const leftWidth = Math.max(52, Math.floor((fullWidth - gap) / 2));
|
|
293
292
|
const rightWidth = Math.max(40, fullWidth - gap - leftWidth);
|
|
294
|
-
const topRow = combineColumns(panel("
|
|
295
|
-
const bottomRow = combineColumns(panel("
|
|
293
|
+
const topRow = combineColumns(panel("Recommended next step", nextMoveBody(nextEntry), leftWidth), panel("This machine", renderCapabilityBody(machineEntries, rightWidth), rightWidth), leftWidth, rightWidth, gap);
|
|
294
|
+
const bottomRow = combineColumns(panel("Providers", renderProviderBody(providerEntry, leftWidth), leftWidth), panel("Portable", renderCapabilityBody(portableEntries, rightWidth), rightWidth), leftWidth, rightWidth, gap);
|
|
296
295
|
return [masthead, "", ...header, "", ...topRow, "", ...bottomRow, "", ...footer].join("\n");
|
|
297
296
|
}
|
|
298
297
|
function renderNonTtyBay(entries, options) {
|
|
299
298
|
const nextEntry = entries.find((entry) => isProblemStatus(entry.status));
|
|
300
299
|
const lines = [
|
|
301
|
-
`${options.agent}
|
|
302
|
-
"
|
|
300
|
+
`${options.agent} connections`,
|
|
301
|
+
"Set up or review one capability at a time. Provider status was checked live just now.",
|
|
303
302
|
"",
|
|
304
|
-
"
|
|
305
|
-
"
|
|
303
|
+
"Recommended next step",
|
|
304
|
+
"---------------------",
|
|
306
305
|
];
|
|
307
306
|
if (!nextEntry) {
|
|
308
307
|
lines.push("Everything here is ready. Pick what you want to review or refresh.");
|
|
@@ -315,7 +314,7 @@ function renderNonTtyBay(entries, options) {
|
|
|
315
314
|
lines.push(`run: ${nextEntry.nextAction}`);
|
|
316
315
|
}
|
|
317
316
|
lines.push("");
|
|
318
|
-
for (const section of ["
|
|
317
|
+
for (const section of ["Providers", "Portable", "This machine"]) {
|
|
319
318
|
lines.push(section);
|
|
320
319
|
lines.push("-".repeat(Math.max(6, section.length + 4)));
|
|
321
320
|
for (const entry of entries.filter((candidate) => candidate.section === section)) {
|
|
@@ -338,7 +337,7 @@ function renderNonTtyBay(entries, options) {
|
|
|
338
337
|
}
|
|
339
338
|
lines.push("6. Not now");
|
|
340
339
|
lines.push("");
|
|
341
|
-
lines.push("
|
|
340
|
+
lines.push("Choose a number, or type the capability name.");
|
|
342
341
|
lines.push(options.prompt);
|
|
343
342
|
return lines.join("\n");
|
|
344
343
|
}
|
|
@@ -21,7 +21,7 @@ function renderScreenEvent(screen) {
|
|
|
21
21
|
function buildOuroHomeActions(agents) {
|
|
22
22
|
if (agents.length === 0) {
|
|
23
23
|
return [
|
|
24
|
-
{ key: "1", label: "
|
|
24
|
+
{ key: "1", label: "Create a new agent", kind: "hatch", command: "ouro hatch" },
|
|
25
25
|
{ key: "2", label: "Clone an existing bundle", kind: "clone", command: "ouro clone <remote>" },
|
|
26
26
|
{ key: "3", label: "Show help", kind: "help", command: "ouro --help" },
|
|
27
27
|
{ key: "4", label: "Exit", kind: "exit", command: "exit" },
|
|
@@ -36,9 +36,9 @@ function buildOuroHomeActions(agents) {
|
|
|
36
36
|
}));
|
|
37
37
|
return [
|
|
38
38
|
...actions,
|
|
39
|
-
{ key: String(actions.length + 1), label: "
|
|
40
|
-
{ key: String(actions.length + 2), label: "
|
|
41
|
-
{ key: String(actions.length + 3), label: "
|
|
39
|
+
{ key: String(actions.length + 1), label: "Start or check Ouro", kind: "up", command: "ouro up" },
|
|
40
|
+
{ key: String(actions.length + 2), label: "Set up connections", kind: "connect", command: "ouro connect --agent <agent>" },
|
|
41
|
+
{ key: String(actions.length + 3), label: "Fix setup issues", kind: "repair", command: "ouro repair --agent <agent>" },
|
|
42
42
|
{ key: String(actions.length + 4), label: "Show help", kind: "help", command: "ouro --help" },
|
|
43
43
|
{ key: String(actions.length + 5), label: "Exit", kind: "exit", command: "exit" },
|
|
44
44
|
];
|
|
@@ -60,10 +60,10 @@ function renderOuroHomeScreen(options) {
|
|
|
60
60
|
const actions = buildOuroHomeActions(options.agents);
|
|
61
61
|
const sections = [
|
|
62
62
|
{
|
|
63
|
-
title: options.agents.length === 0 ? "Start here" : "
|
|
63
|
+
title: options.agents.length === 0 ? "Start here" : "Available agents",
|
|
64
64
|
lines: options.agents.length === 0
|
|
65
|
-
? ["No agents are
|
|
66
|
-
: options.agents.map((agent) => `${agent} is
|
|
65
|
+
? ["No agents are set up on this machine yet."]
|
|
66
|
+
: options.agents.map((agent) => `${agent} is available.`),
|
|
67
67
|
},
|
|
68
68
|
];
|
|
69
69
|
const actionRows = actions.map((action, index) => ({
|
|
@@ -77,13 +77,13 @@ function renderOuroHomeScreen(options) {
|
|
|
77
77
|
columns: options.columns,
|
|
78
78
|
masthead: {
|
|
79
79
|
subtitle: options.agents.length === 0
|
|
80
|
-
? "No agents are
|
|
81
|
-
: "
|
|
80
|
+
? "No agents are set up on this machine yet."
|
|
81
|
+
: "Choose an agent or a setup task.",
|
|
82
82
|
},
|
|
83
83
|
title: "Ouro home",
|
|
84
84
|
summary: options.agents.length === 0
|
|
85
|
-
? "
|
|
86
|
-
: "Choose
|
|
85
|
+
? "Create a new agent or clone an existing bundle to get started."
|
|
86
|
+
: "Choose an agent or a setup task without memorizing commands.",
|
|
87
87
|
sections,
|
|
88
88
|
actions: actionRows,
|
|
89
89
|
prompt: `Choose [1-${actions.length}] or type a name: `,
|
|
@@ -159,7 +159,7 @@ function renderHouseStatusScreen(options) {
|
|
|
159
159
|
renderScreenEvent("house-status");
|
|
160
160
|
const sections = [
|
|
161
161
|
{
|
|
162
|
-
title: "
|
|
162
|
+
title: "Runtime",
|
|
163
163
|
lines: [
|
|
164
164
|
`Daemon: ${options.payload.overview.daemon}`,
|
|
165
165
|
`Health: ${options.payload.overview.health}`,
|
|
@@ -226,9 +226,9 @@ function renderHouseStatusScreen(options) {
|
|
|
226
226
|
});
|
|
227
227
|
}
|
|
228
228
|
return renderHumanCommandBoard({
|
|
229
|
-
title: "
|
|
230
|
-
subtitle: "
|
|
231
|
-
summary: "What is
|
|
229
|
+
title: "Ouro status",
|
|
230
|
+
subtitle: "Current runtime status for this machine.",
|
|
231
|
+
summary: "What is running, what is stopped, and what needs attention.",
|
|
232
232
|
isTTY: options.isTTY,
|
|
233
233
|
columns: options.columns,
|
|
234
234
|
sections,
|
|
@@ -104,26 +104,17 @@ function mastheadArt(columns) {
|
|
|
104
104
|
}
|
|
105
105
|
return rows.map((row) => row.join(" "));
|
|
106
106
|
}
|
|
107
|
-
return [
|
|
108
|
-
" O U R O B O R O S",
|
|
109
|
-
" -----------------",
|
|
110
|
-
];
|
|
107
|
+
return [MASTHEAD_WORD];
|
|
111
108
|
}
|
|
112
109
|
function renderOuroMasthead(options) {
|
|
113
|
-
const lines = mastheadArt(options.columns);
|
|
114
|
-
const
|
|
115
|
-
const branded = [
|
|
116
|
-
...lines,
|
|
117
|
-
MASTHEAD_WORD,
|
|
118
|
-
subtitle,
|
|
119
|
-
];
|
|
110
|
+
const lines = options.isTTY ? mastheadArt(options.columns) : [MASTHEAD_WORD];
|
|
111
|
+
const branded = options.subtitle ? [...lines, options.subtitle] : lines;
|
|
120
112
|
if (!options.isTTY) {
|
|
121
113
|
return `${branded.join("\n")}\n`;
|
|
122
114
|
}
|
|
123
115
|
const ttyLines = [
|
|
124
116
|
...lines.map((line, index) => color(line, index < 2 ? GLOW : SCALE, true)),
|
|
125
|
-
color(
|
|
126
|
-
color(subtitle, MIST),
|
|
117
|
+
...(options.subtitle ? [color(options.subtitle, MIST)] : []),
|
|
127
118
|
];
|
|
128
119
|
return `${ttyLines.join("\n")}\n`;
|
|
129
120
|
}
|
|
@@ -296,10 +296,10 @@ class UpProgress {
|
|
|
296
296
|
isTTY: true,
|
|
297
297
|
columns: this.columns,
|
|
298
298
|
masthead: {
|
|
299
|
-
subtitle: "
|
|
299
|
+
subtitle: "Starting the local agent runtime.",
|
|
300
300
|
},
|
|
301
|
-
title: "
|
|
302
|
-
summary: "Ouro is
|
|
301
|
+
title: "Starting Ouro",
|
|
302
|
+
summary: "Ouro is starting the background runtime, checking credentials, and surfacing anything that needs attention before chat begins.",
|
|
303
303
|
currentStep: {
|
|
304
304
|
label: currentStepLabel,
|
|
305
305
|
detailLines: currentStepDetails,
|