@mono-agent/agent-app 0.3.0 → 0.4.1
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/README.md +24 -10
- package/dist/adapter-send-tools-main.d.ts +3 -0
- package/dist/adapter-send-tools-main.d.ts.map +1 -0
- package/dist/adapter-send-tools-main.js +20 -0
- package/dist/adapter-send-tools-main.js.map +1 -0
- package/dist/adapter-send-tools.d.ts +125 -0
- package/dist/adapter-send-tools.d.ts.map +1 -0
- package/dist/adapter-send-tools.js +629 -0
- package/dist/adapter-send-tools.js.map +1 -0
- package/dist/app-config.d.ts +86 -26
- package/dist/app-config.d.ts.map +1 -1
- package/dist/app-config.js +284 -90
- package/dist/app-config.js.map +1 -1
- package/dist/app.d.ts +51 -20
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +889 -119
- package/dist/app.js.map +1 -1
- package/dist/artifact-retention.d.ts +32 -0
- package/dist/artifact-retention.d.ts.map +1 -0
- package/dist/artifact-retention.js +111 -0
- package/dist/artifact-retention.js.map +1 -0
- package/dist/audit-runs.d.ts +12 -0
- package/dist/audit-runs.d.ts.map +1 -0
- package/dist/audit-runs.js +68 -0
- package/dist/audit-runs.js.map +1 -0
- package/dist/backfill.d.ts +75 -0
- package/dist/backfill.d.ts.map +1 -0
- package/dist/backfill.js +350 -0
- package/dist/backfill.js.map +1 -0
- package/dist/background.d.ts +8 -5
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +279 -53
- package/dist/background.js.map +1 -1
- package/dist/broadcast-recorder.d.ts +27 -0
- package/dist/broadcast-recorder.d.ts.map +1 -0
- package/dist/broadcast-recorder.js +82 -0
- package/dist/broadcast-recorder.js.map +1 -0
- package/dist/channel-config-view.d.ts +28 -0
- package/dist/channel-config-view.d.ts.map +1 -0
- package/dist/channel-config-view.js +79 -0
- package/dist/channel-config-view.js.map +1 -0
- package/dist/channel-gate.d.ts +22 -0
- package/dist/channel-gate.d.ts.map +1 -0
- package/dist/channel-gate.js +35 -0
- package/dist/channel-gate.js.map +1 -0
- package/dist/channel-plugins.d.ts +39 -0
- package/dist/channel-plugins.d.ts.map +1 -0
- package/dist/channel-plugins.js +346 -0
- package/dist/channel-plugins.js.map +1 -0
- package/dist/channels.d.ts +62 -66
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +850 -120
- package/dist/channels.js.map +1 -1
- package/dist/cli.d.ts +103 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +984 -112
- package/dist/cli.js.map +1 -1
- package/dist/config-reference.d.ts +24 -0
- package/dist/config-reference.d.ts.map +1 -0
- package/dist/config-reference.js +580 -0
- package/dist/config-reference.js.map +1 -0
- package/dist/configured-agent.d.ts +104 -0
- package/dist/configured-agent.d.ts.map +1 -0
- package/dist/configured-agent.js +578 -0
- package/dist/configured-agent.js.map +1 -0
- package/dist/consumer-contract.d.ts +36 -0
- package/dist/consumer-contract.d.ts.map +1 -0
- package/dist/consumer-contract.js +290 -0
- package/dist/consumer-contract.js.map +1 -0
- package/dist/doctor.d.ts +17 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +392 -95
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +14 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +23 -7
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +91 -26
- package/dist/init.js.map +1 -1
- package/dist/install-skill.d.ts +1 -1
- package/dist/install-skill.js +2 -2
- package/dist/install-skill.js.map +1 -1
- package/dist/interaction-bridge.d.ts +72 -0
- package/dist/interaction-bridge.d.ts.map +1 -0
- package/dist/interaction-bridge.js +354 -0
- package/dist/interaction-bridge.js.map +1 -0
- package/dist/launchd.d.ts +0 -2
- package/dist/launchd.d.ts.map +1 -1
- package/dist/launchd.js +0 -2
- package/dist/launchd.js.map +1 -1
- package/dist/memory-command.d.ts +10 -0
- package/dist/memory-command.d.ts.map +1 -0
- package/dist/memory-command.js +649 -0
- package/dist/memory-command.js.map +1 -0
- package/dist/memory-recall-main.d.ts +3 -0
- package/dist/memory-recall-main.d.ts.map +1 -0
- package/dist/memory-recall-main.js +30 -0
- package/dist/memory-recall-main.js.map +1 -0
- package/dist/memory-recall.d.ts +147 -0
- package/dist/memory-recall.d.ts.map +1 -0
- package/dist/memory-recall.js +345 -0
- package/dist/memory-recall.js.map +1 -0
- package/dist/memory-rituals.d.ts +8 -11
- package/dist/memory-rituals.d.ts.map +1 -1
- package/dist/memory-rituals.js +26 -25
- package/dist/memory-rituals.js.map +1 -1
- package/dist/metrics.d.ts +13 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +105 -0
- package/dist/metrics.js.map +1 -0
- package/dist/notify-destinations.d.ts +23 -0
- package/dist/notify-destinations.d.ts.map +1 -0
- package/dist/notify-destinations.js +79 -0
- package/dist/notify-destinations.js.map +1 -0
- package/dist/posted-message-index.d.ts +61 -0
- package/dist/posted-message-index.d.ts.map +1 -0
- package/dist/posted-message-index.js +178 -0
- package/dist/posted-message-index.js.map +1 -0
- package/dist/proactive-notify.d.ts +32 -0
- package/dist/proactive-notify.d.ts.map +1 -0
- package/dist/proactive-notify.js +62 -0
- package/dist/proactive-notify.js.map +1 -0
- package/dist/recipes/base.d.ts +15 -0
- package/dist/recipes/base.d.ts.map +1 -0
- package/dist/recipes/base.js +51 -0
- package/dist/recipes/base.js.map +1 -0
- package/dist/recipes/catalog.d.ts +4 -0
- package/dist/recipes/catalog.d.ts.map +1 -0
- package/dist/recipes/catalog.js +509 -0
- package/dist/recipes/catalog.js.map +1 -0
- package/dist/recipes/index.d.ts +11 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +14 -0
- package/dist/recipes/index.js.map +1 -0
- package/dist/recipes/types.d.ts +70 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +15 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/request-model-override.d.ts +67 -0
- package/dist/request-model-override.d.ts.map +1 -0
- package/dist/request-model-override.js +96 -0
- package/dist/request-model-override.js.map +1 -0
- package/dist/runs-health.d.ts +22 -0
- package/dist/runs-health.d.ts.map +1 -0
- package/dist/runs-health.js +144 -0
- package/dist/runs-health.js.map +1 -0
- package/dist/seen-conversations.d.ts +22 -0
- package/dist/seen-conversations.d.ts.map +1 -0
- package/dist/seen-conversations.js +120 -0
- package/dist/seen-conversations.js.map +1 -0
- package/dist/sessions.d.ts +21 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +45 -0
- package/dist/sessions.js.map +1 -0
- package/dist/setup.d.ts +29 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +97 -0
- package/dist/setup.js.map +1 -0
- package/dist/trigger-overrides.d.ts +17 -0
- package/dist/trigger-overrides.d.ts.map +1 -0
- package/dist/trigger-overrides.js +30 -0
- package/dist/trigger-overrides.js.map +1 -0
- package/dist/tui-command.d.ts +56 -0
- package/dist/tui-command.d.ts.map +1 -0
- package/dist/tui-command.js +160 -0
- package/dist/tui-command.js.map +1 -0
- package/dist/ui.d.ts +54 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +157 -0
- package/dist/ui.js.map +1 -0
- package/dist/web-command.d.ts +39 -0
- package/dist/web-command.d.ts.map +1 -0
- package/dist/web-command.js +151 -0
- package/dist/web-command.js.map +1 -0
- package/package.json +22 -17
- package/schema/mono-agent.config.schema.json +1686 -0
- package/skills/mono-agent-composer/SKILL.md +38 -12
- package/skills/mono-agent-composer/agents/openai.yaml +4 -0
- package/skills/mono-agent-composer/references/config-blueprint.md +84 -31
- package/skills/mono-agent-composer/references/discovery-questions.md +49 -36
- package/skills/mono-agent-composer/references/feature-coverage.md +26 -19
- package/skills/mono-agent-composer/references/package-map.md +20 -22
- package/skills/mono-agent-composer/references/playbooks.md +209 -0
- package/skills/mono-agent-composer/references/validation.md +14 -5
package/dist/setup.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { WITH_CHANNELS } from "./init.js";
|
|
2
|
+
import { RECIPE_CATALOG } from "./recipes/index.js";
|
|
3
|
+
export async function collectSetupOptions(options) {
|
|
4
|
+
const recipes = options.recipes ?? RECIPE_CATALOG;
|
|
5
|
+
const recipe = options.recipe ?? await promptForRecipe(options.prompt, recipes);
|
|
6
|
+
const recipeInputs = {};
|
|
7
|
+
const secrets = [];
|
|
8
|
+
for (const input of recipe.inputs) {
|
|
9
|
+
if (input.secret === true) {
|
|
10
|
+
secrets.push(secretChecklistItem(input));
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const defaultValue = input.id === "model" && options.model !== undefined ? options.model : input.default;
|
|
14
|
+
const answer = await options.prompt.question(inputPrompt(input, defaultValue));
|
|
15
|
+
const value = answer.trim();
|
|
16
|
+
if (value.length > 0) {
|
|
17
|
+
recipeInputs[input.id] = value;
|
|
18
|
+
}
|
|
19
|
+
else if (defaultValue !== undefined) {
|
|
20
|
+
recipeInputs[input.id] = defaultValue;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const fallbackModels = await promptForFallbackModels(options.prompt, options.fallbackModels ?? []);
|
|
24
|
+
const withChannels = await promptForWithChannels(options.prompt, options.withChannels ?? []);
|
|
25
|
+
return { recipe, recipeInputs, fallbackModels, withChannels, secrets };
|
|
26
|
+
}
|
|
27
|
+
export function renderSetupRecipeMenu(recipes = RECIPE_CATALOG) {
|
|
28
|
+
return recipes
|
|
29
|
+
.map((recipe, index) => {
|
|
30
|
+
const tags = recipe.tags.length === 0 ? "" : ` (${recipe.tags.join(", ")})`;
|
|
31
|
+
return `${index + 1}. ${recipe.id} [risk: ${recipe.riskLevel}] - ${recipe.title}${tags}`;
|
|
32
|
+
})
|
|
33
|
+
.join("\n");
|
|
34
|
+
}
|
|
35
|
+
function inputPrompt(input, defaultValue) {
|
|
36
|
+
const suffix = defaultValue === undefined ? "" : ` [${defaultValue}]`;
|
|
37
|
+
return `${input.label}${suffix}\n${input.description}\n> `;
|
|
38
|
+
}
|
|
39
|
+
function secretChecklistItem(input) {
|
|
40
|
+
return {
|
|
41
|
+
id: input.id,
|
|
42
|
+
label: input.label,
|
|
43
|
+
description: input.description,
|
|
44
|
+
...(input.envVar === undefined ? {} : { envVar: input.envVar }),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async function promptForRecipe(prompt, recipes) {
|
|
48
|
+
if (recipes.length === 0) {
|
|
49
|
+
throw new Error("No setup recipes are available.");
|
|
50
|
+
}
|
|
51
|
+
for (;;) {
|
|
52
|
+
const answer = await prompt.question(`Choose a recipe:\n${renderSetupRecipeMenu(recipes)}\nRecipe [1]: `);
|
|
53
|
+
const selected = parseRecipeChoice(answer, recipes);
|
|
54
|
+
if (selected !== undefined) {
|
|
55
|
+
return selected;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function parseRecipeChoice(answer, recipes) {
|
|
60
|
+
const value = answer.trim();
|
|
61
|
+
if (value.length === 0) {
|
|
62
|
+
return recipes[0];
|
|
63
|
+
}
|
|
64
|
+
const index = Number(value);
|
|
65
|
+
if (Number.isInteger(index) && index >= 1 && index <= recipes.length) {
|
|
66
|
+
return recipes[index - 1];
|
|
67
|
+
}
|
|
68
|
+
return recipes.find((recipe) => recipe.id === value);
|
|
69
|
+
}
|
|
70
|
+
async function promptForWithChannels(prompt, defaults) {
|
|
71
|
+
const defaultText = defaults.length === 0 ? "none" : defaults.join(",");
|
|
72
|
+
for (;;) {
|
|
73
|
+
const answer = await prompt.question(`Enable add-on channels (${WITH_CHANNELS.join(", ")}) [${defaultText}]: `);
|
|
74
|
+
const raw = answer.trim();
|
|
75
|
+
if (raw.length === 0) {
|
|
76
|
+
return defaults;
|
|
77
|
+
}
|
|
78
|
+
const parsed = raw.split(",").map((entry) => entry.trim()).filter((entry) => entry.length > 0);
|
|
79
|
+
const invalid = parsed.filter((entry) => !WITH_CHANNELS.includes(entry));
|
|
80
|
+
if (invalid.length === 0) {
|
|
81
|
+
return parsed;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function promptForFallbackModels(prompt, defaults) {
|
|
86
|
+
const defaultText = defaults.length === 0 ? "none" : defaults.join(",");
|
|
87
|
+
const answer = await prompt.question(`Fallback models, comma-separated [${defaultText}]: `);
|
|
88
|
+
const raw = answer.trim();
|
|
89
|
+
if (raw.length === 0) {
|
|
90
|
+
return defaults;
|
|
91
|
+
}
|
|
92
|
+
if (raw.toLowerCase() === "none") {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
return raw.split(",").map((entry) => entry.trim()).filter((entry) => entry.length > 0);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** One enabled trigger (cron job / webhook endpoint) carrying override strings. */
|
|
2
|
+
export interface TriggerOverrideEntry {
|
|
3
|
+
/** Display name for the issue message, e.g. `cron job "digest"`. */
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly model?: string;
|
|
6
|
+
readonly effort?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Validate per-trigger `model`/`effort` overrides with the same parsers the
|
|
10
|
+
* runtime applies at run time (`request-model-override.ts`), but at
|
|
11
|
+
* validate/load time — so a typo'd cron `model` fails `mono-agent validate`
|
|
12
|
+
* before the 3am job silently falls back to the default. At run time an
|
|
13
|
+
* invalid value is still warn-and-ignored; this check only moves the discovery
|
|
14
|
+
* forward, it never changes run behavior.
|
|
15
|
+
*/
|
|
16
|
+
export declare function findTriggerOverrideIssues(entries: readonly TriggerOverrideEntry[]): readonly string[];
|
|
17
|
+
//# sourceMappingURL=trigger-overrides.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-overrides.d.ts","sourceRoot":"","sources":["../src/trigger-overrides.ts"],"names":[],"mappings":"AAGA,mFAAmF;AACnF,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS,oBAAoB,EAAE,GACvC,SAAS,MAAM,EAAE,CAkBnB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { EFFORT_LEVELS } from "@mono-agent/config";
|
|
2
|
+
import { parseMonoRuntimeModelReference } from "@mono-agent/runtime-adapter";
|
|
3
|
+
const EFFORT_SET = new Set(EFFORT_LEVELS);
|
|
4
|
+
/**
|
|
5
|
+
* Validate per-trigger `model`/`effort` overrides with the same parsers the
|
|
6
|
+
* runtime applies at run time (`request-model-override.ts`), but at
|
|
7
|
+
* validate/load time — so a typo'd cron `model` fails `mono-agent validate`
|
|
8
|
+
* before the 3am job silently falls back to the default. At run time an
|
|
9
|
+
* invalid value is still warn-and-ignored; this check only moves the discovery
|
|
10
|
+
* forward, it never changes run behavior.
|
|
11
|
+
*/
|
|
12
|
+
export function findTriggerOverrideIssues(entries) {
|
|
13
|
+
const issues = [];
|
|
14
|
+
for (const entry of entries) {
|
|
15
|
+
if (entry.model !== undefined) {
|
|
16
|
+
try {
|
|
17
|
+
parseMonoRuntimeModelReference(entry.model);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
21
|
+
issues.push(`${entry.name} has an invalid model override "${entry.model}": ${reason}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (entry.effort !== undefined && !EFFORT_SET.has(entry.effort)) {
|
|
25
|
+
issues.push(`${entry.name} has an invalid effort override "${entry.effort}". Valid: ${[...EFFORT_SET].join(", ")}.`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return issues;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=trigger-overrides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-overrides.js","sourceRoot":"","sources":["../src/trigger-overrides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAU7E,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;AAE/D;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAwC;IAExC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,8BAA8B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,mCAAmC,KAAK,CAAC,KAAK,MAAM,MAAM,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,IAAI,CACT,GAAG,KAAK,CAAC,IAAI,oCAAoC,KAAK,CAAC,MAAM,aAAa,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxG,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { listTraceSources } from "@mono-agent/observability";
|
|
2
|
+
import type { TraceSourceListItem } from "@mono-agent/observability";
|
|
3
|
+
export interface RunTuiOptions {
|
|
4
|
+
readonly configPath: string;
|
|
5
|
+
readonly cwd: string;
|
|
6
|
+
readonly env: Record<string, string | undefined>;
|
|
7
|
+
/** --agent: connect to this label or sourceId directly. */
|
|
8
|
+
readonly agent?: string;
|
|
9
|
+
/** --conversation: conversation id to chat under (default tui-<sourceId>). */
|
|
10
|
+
readonly conversationId?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Test seams: discovery + TUI boot are injectable. */
|
|
13
|
+
export interface RunTuiDeps {
|
|
14
|
+
readonly listSources?: typeof listTraceSources;
|
|
15
|
+
readonly startTui?: (options: Record<string, unknown>) => Promise<{
|
|
16
|
+
waitUntilExit(): Promise<void>;
|
|
17
|
+
}>;
|
|
18
|
+
readonly isTty?: boolean;
|
|
19
|
+
readonly stdout?: {
|
|
20
|
+
write(text: string): void;
|
|
21
|
+
};
|
|
22
|
+
readonly stderr?: {
|
|
23
|
+
write(text: string): void;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export type TuiLaunchPlan = {
|
|
27
|
+
readonly kind: "none";
|
|
28
|
+
readonly message: string;
|
|
29
|
+
} | {
|
|
30
|
+
readonly kind: "error";
|
|
31
|
+
readonly message: string;
|
|
32
|
+
} | {
|
|
33
|
+
readonly kind: "connect";
|
|
34
|
+
readonly source: TraceSourceListItem;
|
|
35
|
+
} | {
|
|
36
|
+
readonly kind: "picker";
|
|
37
|
+
readonly sources: readonly TraceSourceListItem[];
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Pure selection logic for `mono-agent tui`: which running agent to connect
|
|
41
|
+
* to, or whether to open the picker. `registryDirs` names every registry that
|
|
42
|
+
* was consulted (one entry, or two when the configured registry and the
|
|
43
|
+
* machine-wide global one differ) purely for the "nothing found" messaging.
|
|
44
|
+
* Exported for unit tests.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveTuiLaunch(sources: readonly TraceSourceListItem[], registryDirs: readonly string[], agentFilter: string | undefined): TuiLaunchPlan;
|
|
47
|
+
/** Extract the tui channel's baseUrl from a manifest's channel summaries. */
|
|
48
|
+
export declare function tuiEndpointOf(source: TraceSourceListItem): string | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* `mono-agent tui`: discover running agents (machine-wide registry), resolve
|
|
51
|
+
* the target's stream endpoint + key, and launch the operator console. Works
|
|
52
|
+
* from any directory — with no local config the registry falls back to
|
|
53
|
+
* ~/.mono-agent/trace-sources.
|
|
54
|
+
*/
|
|
55
|
+
export declare function runTui(options: RunTuiOptions, deps?: RunTuiDeps): Promise<number>;
|
|
56
|
+
//# sourceMappingURL=tui-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-command.d.ts","sourceRoot":"","sources":["../src/tui-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAwC,MAAM,2BAA2B,CAAC;AACnG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAKrE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,uDAAuD;AACvD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAC;IACtG,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,GAClE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAA;CAAE,CAAC;AAElF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,mBAAmB,EAAE,EACvC,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,aAAa,CAiCf;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAe7E;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA2F3F"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { dirname, resolve } from "node:path";
|
|
2
|
+
import { listTraceSources, mergeTraceSources, pruneTraceSources } from "@mono-agent/observability";
|
|
3
|
+
import { loadTuiAdapterConfig } from "@mono-agent/operator-adapter";
|
|
4
|
+
import { resolveAppTraceRegistryDir, resolveGlobalTraceRegistryDir } from "./app-config.js";
|
|
5
|
+
/**
|
|
6
|
+
* Pure selection logic for `mono-agent tui`: which running agent to connect
|
|
7
|
+
* to, or whether to open the picker. `registryDirs` names every registry that
|
|
8
|
+
* was consulted (one entry, or two when the configured registry and the
|
|
9
|
+
* machine-wide global one differ) purely for the "nothing found" messaging.
|
|
10
|
+
* Exported for unit tests.
|
|
11
|
+
*/
|
|
12
|
+
export function resolveTuiLaunch(sources, registryDirs, agentFilter) {
|
|
13
|
+
const alive = sources.filter((source) => source.health !== "stopped");
|
|
14
|
+
const registryLabel = registryDirs.length <= 1 ? `registry: ${registryDirs[0] ?? ""}` : `registries: ${registryDirs.join(", ")}`;
|
|
15
|
+
if (agentFilter !== undefined) {
|
|
16
|
+
const match = alive.find((source) => source.label === agentFilter || source.sourceId === agentFilter);
|
|
17
|
+
if (match === undefined) {
|
|
18
|
+
const available = alive.map((source) => ` ${source.label} (${source.sourceId})`).join("\n");
|
|
19
|
+
return {
|
|
20
|
+
kind: "error",
|
|
21
|
+
message: `No running agent matches \`${agentFilter}\`.\n` +
|
|
22
|
+
(alive.length === 0
|
|
23
|
+
? `No agents are running (${registryLabel}).`
|
|
24
|
+
: `Running agents:\n${available}`),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return { kind: "connect", source: match };
|
|
28
|
+
}
|
|
29
|
+
if (alive.length === 0) {
|
|
30
|
+
return {
|
|
31
|
+
kind: "none",
|
|
32
|
+
message: `No running agents found (${registryLabel}).\n` +
|
|
33
|
+
"Start one with `mono-agent start` in its folder, then run `mono-agent tui` again.",
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (alive.length === 1 && alive[0] !== undefined) {
|
|
37
|
+
return { kind: "connect", source: alive[0] };
|
|
38
|
+
}
|
|
39
|
+
return { kind: "picker", sources: alive };
|
|
40
|
+
}
|
|
41
|
+
/** Extract the tui channel's baseUrl from a manifest's channel summaries. */
|
|
42
|
+
export function tuiEndpointOf(source) {
|
|
43
|
+
const channels = source.metadata?.channels;
|
|
44
|
+
if (typeof channels !== "object" || channels === null) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
const tui = channels.tui;
|
|
48
|
+
if (typeof tui !== "object" || tui === null) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
const record = tui;
|
|
52
|
+
// Non-empty required: a malformed manifest with baseUrl "" must fall back to
|
|
53
|
+
// discovery mode rather than attempt a broken connection.
|
|
54
|
+
return record.kind === "running" && typeof record.baseUrl === "string" && record.baseUrl.length > 0
|
|
55
|
+
? record.baseUrl
|
|
56
|
+
: undefined;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* `mono-agent tui`: discover running agents (machine-wide registry), resolve
|
|
60
|
+
* the target's stream endpoint + key, and launch the operator console. Works
|
|
61
|
+
* from any directory — with no local config the registry falls back to
|
|
62
|
+
* ~/.mono-agent/trace-sources.
|
|
63
|
+
*/
|
|
64
|
+
export async function runTui(options, deps = {}) {
|
|
65
|
+
const stdout = deps.stdout ?? process.stdout;
|
|
66
|
+
const stderr = deps.stderr ?? process.stderr;
|
|
67
|
+
if ((deps.isTty ?? process.stdin.isTTY) !== true) {
|
|
68
|
+
stderr.write("mono-agent tui needs an interactive terminal (stdin is not a TTY).\n");
|
|
69
|
+
return 1;
|
|
70
|
+
}
|
|
71
|
+
const configuredRegistryDir = await resolveAppTraceRegistryDir({
|
|
72
|
+
env: options.env,
|
|
73
|
+
cwd: options.cwd,
|
|
74
|
+
configPath: options.configPath,
|
|
75
|
+
});
|
|
76
|
+
const globalRegistryDir = resolveGlobalTraceRegistryDir(options.env);
|
|
77
|
+
const listSources = deps.listSources ?? listTraceSources;
|
|
78
|
+
// Use the registry's own echoed (normalized) dir from here on. The "does this
|
|
79
|
+
// differ from the global registry" decision is made BEFORE querying (against
|
|
80
|
+
// the resolvers' own output), not against the echoed result, since a listing
|
|
81
|
+
// seam is free to echo back whatever registryDir it likes.
|
|
82
|
+
const sameAsGlobal = resolve(configuredRegistryDir) === resolve(globalRegistryDir);
|
|
83
|
+
const primary = await listSources({ registryDir: configuredRegistryDir });
|
|
84
|
+
void pruneTraceSources({ registryDir: primary.registryDir });
|
|
85
|
+
const merged = sameAsGlobal ? undefined : await listSources({ registryDir: globalRegistryDir });
|
|
86
|
+
if (merged !== undefined) {
|
|
87
|
+
void pruneTraceSources({ registryDir: merged.registryDir });
|
|
88
|
+
}
|
|
89
|
+
const sources = merged === undefined ? primary.sources : mergeTraceSources(primary.sources, merged.sources);
|
|
90
|
+
// Every consulted registry, in precedence order. The TUI's discovery view
|
|
91
|
+
// (picker, and its in-TUI `r`/`/agents` refresh) re-lists from these, so it
|
|
92
|
+
// MUST see the full union: an agent present only in its local registry (a
|
|
93
|
+
// globalDiscovery:false opt-out, or one still running a pre-mirror build)
|
|
94
|
+
// stays visible from inside its own directory.
|
|
95
|
+
const registryDirs = merged === undefined ? [primary.registryDir] : [primary.registryDir, merged.registryDir];
|
|
96
|
+
const plan = resolveTuiLaunch(sources, registryDirs, options.agent);
|
|
97
|
+
if (plan.kind === "none") {
|
|
98
|
+
stdout.write(`${plan.message}\n`);
|
|
99
|
+
return 1;
|
|
100
|
+
}
|
|
101
|
+
if (plan.kind === "error") {
|
|
102
|
+
stderr.write(`${plan.message}\n`);
|
|
103
|
+
return 1;
|
|
104
|
+
}
|
|
105
|
+
// Lazy: the TUI (and pi-tui) load only when this command actually runs.
|
|
106
|
+
const startTui = deps.startTui ??
|
|
107
|
+
(async (tuiOptions) => {
|
|
108
|
+
const { startMonoAgentTui } = await import("@mono-agent/tui");
|
|
109
|
+
return startMonoAgentTui(tuiOptions);
|
|
110
|
+
});
|
|
111
|
+
const common = {
|
|
112
|
+
title: "mono-agent",
|
|
113
|
+
env: options.env,
|
|
114
|
+
...(options.conversationId === undefined ? {} : { conversationId: options.conversationId }),
|
|
115
|
+
};
|
|
116
|
+
if (plan.kind === "picker") {
|
|
117
|
+
const handle = await startTui({ ...common, discovery: { registryDirs } });
|
|
118
|
+
await handle.waitUntilExit();
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
const source = plan.source;
|
|
122
|
+
const baseUrl = tuiEndpointOf(source);
|
|
123
|
+
const apiKey = await resolveAgentApiKey(source, options.env);
|
|
124
|
+
const handle = await startTui({
|
|
125
|
+
...common,
|
|
126
|
+
...(baseUrl === undefined
|
|
127
|
+
? // No stream endpoint (tui channel disabled): replay/config still work.
|
|
128
|
+
{ discovery: { registryDirs } }
|
|
129
|
+
: { connection: { baseUrl, ...(apiKey === undefined ? {} : { apiKey }) } }),
|
|
130
|
+
instance: {
|
|
131
|
+
label: source.label,
|
|
132
|
+
artifactDir: source.artifactDir,
|
|
133
|
+
...(source.configPath === undefined ? {} : { configPath: source.configPath }),
|
|
134
|
+
},
|
|
135
|
+
...(options.conversationId === undefined ? { conversationId: `tui-${source.sourceId}` } : {}),
|
|
136
|
+
subtitle: source.configPath === undefined ? source.sourceId : dirname(resolve(source.configPath)),
|
|
137
|
+
});
|
|
138
|
+
if (baseUrl === undefined) {
|
|
139
|
+
stdout.write(`Agent \`${source.label}\` has no tui stream endpoint (channel disabled?) — opening in discovery mode; replay/config remain available.\n`);
|
|
140
|
+
}
|
|
141
|
+
await handle.waitUntilExit();
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* The registry never carries secrets: read `tui.apiKey` through the adapter's
|
|
146
|
+
* own loader against the agent's config file (json→env layering included).
|
|
147
|
+
*/
|
|
148
|
+
async function resolveAgentApiKey(source, env) {
|
|
149
|
+
if (source.configPath === undefined) {
|
|
150
|
+
return env.MONO_AGENT_TUI_API_KEY;
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
const config = await loadTuiAdapterConfig({ env, jsonPath: source.configPath });
|
|
154
|
+
return config.apiKey;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return env.MONO_AGENT_TUI_API_KEY;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=tui-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-command.js","sourceRoot":"","sources":["../src/tui-command.ts"],"names":[],"mappings":"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"}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ValidationStatus } from "./doctor.js";
|
|
2
|
+
/**
|
|
3
|
+
* Decide whether ANSI color should be emitted. `NO_COLOR` (any value) always
|
|
4
|
+
* wins per the no-color.org convention; `FORCE_COLOR` forces the decision when
|
|
5
|
+
* set to a recognized truthy/falsy value; otherwise color follows the TTY-ness
|
|
6
|
+
* of the stream. Pure and env-injected so it is trivially testable.
|
|
7
|
+
*/
|
|
8
|
+
export declare function computeColorEnabled(env: Record<string, string | undefined>, isTty: boolean | undefined): boolean;
|
|
9
|
+
export declare function isColorEnabled(): boolean;
|
|
10
|
+
/** Color/weight helpers. Each is the identity function when color is disabled. */
|
|
11
|
+
export declare const style: {
|
|
12
|
+
readonly bold: (text: string) => string;
|
|
13
|
+
readonly dim: (text: string) => string;
|
|
14
|
+
readonly red: (text: string) => string;
|
|
15
|
+
readonly green: (text: string) => string;
|
|
16
|
+
readonly yellow: (text: string) => string;
|
|
17
|
+
readonly cyan: (text: string) => string;
|
|
18
|
+
readonly gray: (text: string) => string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Render a status badge as a fixed-width prefix (badge + trailing space). With
|
|
22
|
+
* color on it is a green/yellow/dim/red glyph; with color off it falls back to
|
|
23
|
+
* an equal-width ASCII tag so columns still line up in plain output.
|
|
24
|
+
*/
|
|
25
|
+
export declare function badge(status: ValidationStatus): string;
|
|
26
|
+
/**
|
|
27
|
+
* Render aligned `label value` rows: labels are padded to the widest label so
|
|
28
|
+
* values line up, replacing the hand-tuned `padEnd` blocks. `indent` prefixes
|
|
29
|
+
* every row with that many spaces (used to nest rows under a section rule).
|
|
30
|
+
* Returns one string with a trailing newline per row (empty when there are no
|
|
31
|
+
* rows).
|
|
32
|
+
*/
|
|
33
|
+
export declare function keyValue(rows: ReadonlyArray<readonly [label: string, value: string]>, indent?: number): string;
|
|
34
|
+
/**
|
|
35
|
+
* A horizontal section divider, optionally labeled — `── instance ────────`.
|
|
36
|
+
* Width tracks the terminal (read at call time so resizes are honored), capped
|
|
37
|
+
* for readability and falling back to a fixed width when stdout is not a TTY.
|
|
38
|
+
* Rendered dim/gray (identity when color is off); the label appears verbatim so
|
|
39
|
+
* it stays greppable. Always ends with a newline.
|
|
40
|
+
*/
|
|
41
|
+
export declare function rule(label?: string): string;
|
|
42
|
+
/** Badge for a channel status *kind* string (running/waiting…/disabled/error). */
|
|
43
|
+
export declare function channelBadge(kind: string): string;
|
|
44
|
+
/** Badge for a trace-source health word (running/stale/stopped/…). */
|
|
45
|
+
export declare function healthBadge(health: string): string;
|
|
46
|
+
/** A bold/cyan section heading with a trailing newline. */
|
|
47
|
+
export declare function heading(text: string): string;
|
|
48
|
+
/** The CLI title block: bold title plus an optional dim subtitle. */
|
|
49
|
+
export declare function banner(title: string, subtitle?: string): string;
|
|
50
|
+
/** A red error line (✗ prefix) with a trailing newline — write to stderr. */
|
|
51
|
+
export declare function errorLine(message: string): string;
|
|
52
|
+
/** A dim hint line (→ prefix) with a trailing newline. */
|
|
53
|
+
export declare function hint(message: string): string;
|
|
54
|
+
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAuBpD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,KAAK,EAAE,OAAO,GAAG,SAAS,GACzB,OAAO,CAYT;AAID,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAMD,kFAAkF;AAClF,eAAO,MAAM,KAAK;0BACH,MAAM,KAAG,MAAM;yBAChB,MAAM,KAAG,MAAM;yBACf,MAAM,KAAG,MAAM;2BACb,MAAM,KAAG,MAAM;4BACd,MAAM,KAAG,MAAM;0BACjB,MAAM,KAAG,MAAM;0BACf,MAAM,KAAG,MAAM;CACpB,CAAC;AAgBX;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAGtD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAC5D,MAAM,SAAI,GACT,MAAM,CASR;AAKD;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3C;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkBjD;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWlD;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,qEAAqE;AACrE,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,0DAA0D;AAC1D,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5C"}
|
package/dist/ui.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
/**
|
|
3
|
+
* Tiny zero-dependency terminal styling layer for the CLI. Every helper returns
|
|
4
|
+
* a plain string, so callers can keep writing through `process.stdout.write` or
|
|
5
|
+
* the injected `deps.stdout`/`deps.stderr` sinks in background.ts. Color is a
|
|
6
|
+
* single global decision keyed on the REAL process stdout (see
|
|
7
|
+
* {@link computeColorEnabled}); when it is off — piped output, `NO_COLOR`, or a
|
|
8
|
+
* non-TTY test harness — every styling helper degrades to plain ASCII so logs
|
|
9
|
+
* and test assertions stay greppable.
|
|
10
|
+
*/
|
|
11
|
+
const ANSI = {
|
|
12
|
+
reset: "[0m",
|
|
13
|
+
bold: "[1m",
|
|
14
|
+
dim: "[2m",
|
|
15
|
+
red: "[31m",
|
|
16
|
+
green: "[32m",
|
|
17
|
+
yellow: "[33m",
|
|
18
|
+
cyan: "[36m",
|
|
19
|
+
gray: "[90m",
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Decide whether ANSI color should be emitted. `NO_COLOR` (any value) always
|
|
23
|
+
* wins per the no-color.org convention; `FORCE_COLOR` forces the decision when
|
|
24
|
+
* set to a recognized truthy/falsy value; otherwise color follows the TTY-ness
|
|
25
|
+
* of the stream. Pure and env-injected so it is trivially testable.
|
|
26
|
+
*/
|
|
27
|
+
export function computeColorEnabled(env, isTty) {
|
|
28
|
+
if (env.NO_COLOR !== undefined) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const force = env.FORCE_COLOR;
|
|
32
|
+
if (force === "1" || force === "true") {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (force === "0" || force === "false") {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return Boolean(isTty);
|
|
39
|
+
}
|
|
40
|
+
const colorEnabled = computeColorEnabled(process.env, process.stdout.isTTY);
|
|
41
|
+
export function isColorEnabled() {
|
|
42
|
+
return colorEnabled;
|
|
43
|
+
}
|
|
44
|
+
function paint(code, text) {
|
|
45
|
+
return colorEnabled ? `${code}${text}${ANSI.reset}` : text;
|
|
46
|
+
}
|
|
47
|
+
/** Color/weight helpers. Each is the identity function when color is disabled. */
|
|
48
|
+
export const style = {
|
|
49
|
+
bold: (text) => paint(ANSI.bold, text),
|
|
50
|
+
dim: (text) => paint(ANSI.dim, text),
|
|
51
|
+
red: (text) => paint(ANSI.red, text),
|
|
52
|
+
green: (text) => paint(ANSI.green, text),
|
|
53
|
+
yellow: (text) => paint(ANSI.yellow, text),
|
|
54
|
+
cyan: (text) => paint(ANSI.cyan, text),
|
|
55
|
+
gray: (text) => paint(ANSI.gray, text),
|
|
56
|
+
};
|
|
57
|
+
const BADGES = {
|
|
58
|
+
ok: { glyph: "✓", paint: style.green, plain: "[ok] " },
|
|
59
|
+
waiting: { glyph: "⚠", paint: style.yellow, plain: "[wait] " },
|
|
60
|
+
disabled: { glyph: "○", paint: style.dim, plain: "[off] " },
|
|
61
|
+
error: { glyph: "✗", paint: style.red, plain: "[error]" },
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Render a status badge as a fixed-width prefix (badge + trailing space). With
|
|
65
|
+
* color on it is a green/yellow/dim/red glyph; with color off it falls back to
|
|
66
|
+
* an equal-width ASCII tag so columns still line up in plain output.
|
|
67
|
+
*/
|
|
68
|
+
export function badge(status) {
|
|
69
|
+
const spec = BADGES[status];
|
|
70
|
+
return colorEnabled ? `${spec.paint(spec.glyph)} ` : `${spec.plain} `;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Render aligned `label value` rows: labels are padded to the widest label so
|
|
74
|
+
* values line up, replacing the hand-tuned `padEnd` blocks. `indent` prefixes
|
|
75
|
+
* every row with that many spaces (used to nest rows under a section rule).
|
|
76
|
+
* Returns one string with a trailing newline per row (empty when there are no
|
|
77
|
+
* rows).
|
|
78
|
+
*/
|
|
79
|
+
export function keyValue(rows, indent = 0) {
|
|
80
|
+
if (rows.length === 0) {
|
|
81
|
+
return "";
|
|
82
|
+
}
|
|
83
|
+
const pad = " ".repeat(indent);
|
|
84
|
+
const width = rows.reduce((max, [label]) => Math.max(max, label.length), 0);
|
|
85
|
+
return rows
|
|
86
|
+
.map(([label, value]) => `${pad}${style.gray(label.padEnd(width))} ${value}\n`)
|
|
87
|
+
.join("");
|
|
88
|
+
}
|
|
89
|
+
const RULE_FALLBACK_WIDTH = 44;
|
|
90
|
+
const RULE_MAX_WIDTH = 72;
|
|
91
|
+
/**
|
|
92
|
+
* A horizontal section divider, optionally labeled — `── instance ────────`.
|
|
93
|
+
* Width tracks the terminal (read at call time so resizes are honored), capped
|
|
94
|
+
* for readability and falling back to a fixed width when stdout is not a TTY.
|
|
95
|
+
* Rendered dim/gray (identity when color is off); the label appears verbatim so
|
|
96
|
+
* it stays greppable. Always ends with a newline.
|
|
97
|
+
*/
|
|
98
|
+
export function rule(label) {
|
|
99
|
+
const width = Math.min(process.stdout.columns ?? RULE_FALLBACK_WIDTH, RULE_MAX_WIDTH);
|
|
100
|
+
if (label === undefined) {
|
|
101
|
+
return `${style.gray("─".repeat(width))}\n`;
|
|
102
|
+
}
|
|
103
|
+
const prefix = `── ${label} `;
|
|
104
|
+
const fill = Math.max(0, width - prefix.length);
|
|
105
|
+
return `${style.gray(`${prefix}${"─".repeat(fill)}`)}\n`;
|
|
106
|
+
}
|
|
107
|
+
/** Badge for a channel status *kind* string (running/waiting…/disabled/error). */
|
|
108
|
+
export function channelBadge(kind) {
|
|
109
|
+
if (kind === "running") {
|
|
110
|
+
return badge("ok");
|
|
111
|
+
}
|
|
112
|
+
if (kind.startsWith("waiting")) {
|
|
113
|
+
return badge("waiting");
|
|
114
|
+
}
|
|
115
|
+
if (kind === "disabled") {
|
|
116
|
+
return badge("disabled");
|
|
117
|
+
}
|
|
118
|
+
if (kind === "degraded") {
|
|
119
|
+
// Still serving, transport self-recovering — a warning, not an error.
|
|
120
|
+
return badge("waiting");
|
|
121
|
+
}
|
|
122
|
+
if (/error|fail|crash/u.test(kind)) {
|
|
123
|
+
return badge("error");
|
|
124
|
+
}
|
|
125
|
+
return badge("waiting");
|
|
126
|
+
}
|
|
127
|
+
/** Badge for a trace-source health word (running/stale/stopped/…). */
|
|
128
|
+
export function healthBadge(health) {
|
|
129
|
+
switch (health) {
|
|
130
|
+
case "running":
|
|
131
|
+
return badge("ok");
|
|
132
|
+
case "stale":
|
|
133
|
+
return badge("waiting");
|
|
134
|
+
case "stopped":
|
|
135
|
+
return badge("disabled");
|
|
136
|
+
default:
|
|
137
|
+
return badge("error");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** A bold/cyan section heading with a trailing newline. */
|
|
141
|
+
export function heading(text) {
|
|
142
|
+
return `${style.bold(style.cyan(text))}\n`;
|
|
143
|
+
}
|
|
144
|
+
/** The CLI title block: bold title plus an optional dim subtitle. */
|
|
145
|
+
export function banner(title, subtitle) {
|
|
146
|
+
const head = style.bold(style.cyan(title));
|
|
147
|
+
return subtitle === undefined ? `${head}\n` : `${head} ${style.dim(`— ${subtitle}`)}\n`;
|
|
148
|
+
}
|
|
149
|
+
/** A red error line (✗ prefix) with a trailing newline — write to stderr. */
|
|
150
|
+
export function errorLine(message) {
|
|
151
|
+
return `${style.red(`✗ ${message}`)}\n`;
|
|
152
|
+
}
|
|
153
|
+
/** A dim hint line (→ prefix) with a trailing newline. */
|
|
154
|
+
export function hint(message) {
|
|
155
|
+
return `${style.dim(`→ ${message}`)}\n`;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|