@markus-global/cli 0.4.11 → 0.4.13

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 (52) hide show
  1. package/dist/commands/auth.d.ts +3 -0
  2. package/dist/commands/auth.d.ts.map +1 -0
  3. package/dist/commands/auth.js +420 -0
  4. package/dist/commands/auth.js.map +1 -0
  5. package/dist/commands/channel.d.ts +3 -0
  6. package/dist/commands/channel.d.ts.map +1 -0
  7. package/dist/commands/channel.js +259 -0
  8. package/dist/commands/channel.js.map +1 -0
  9. package/dist/commands/doctor.d.ts +9 -0
  10. package/dist/commands/doctor.d.ts.map +1 -0
  11. package/dist/commands/doctor.js +335 -0
  12. package/dist/commands/doctor.js.map +1 -0
  13. package/dist/commands/gateway.d.ts +1 -1
  14. package/dist/commands/gateway.d.ts.map +1 -1
  15. package/dist/commands/gateway.js +75 -139
  16. package/dist/commands/gateway.js.map +1 -1
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +6 -2
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/model.d.ts +11 -0
  21. package/dist/commands/model.d.ts.map +1 -0
  22. package/dist/commands/model.js +485 -0
  23. package/dist/commands/model.js.map +1 -0
  24. package/dist/commands/models.d.ts +3 -0
  25. package/dist/commands/models.d.ts.map +1 -0
  26. package/dist/commands/models.js +43 -0
  27. package/dist/commands/models.js.map +1 -0
  28. package/dist/commands/start.d.ts.map +1 -1
  29. package/dist/commands/start.js +232 -30
  30. package/dist/commands/start.js.map +1 -1
  31. package/dist/index.js +27 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/markus.mjs +5927 -2040
  34. package/dist/utils/browser.d.ts +6 -0
  35. package/dist/utils/browser.d.ts.map +1 -0
  36. package/dist/utils/browser.js +18 -0
  37. package/dist/utils/browser.js.map +1 -0
  38. package/dist/utils/logger.d.ts +41 -0
  39. package/dist/utils/logger.d.ts.map +1 -0
  40. package/dist/utils/logger.js +103 -0
  41. package/dist/utils/logger.js.map +1 -0
  42. package/dist/utils/startupProgress.d.ts +61 -0
  43. package/dist/utils/startupProgress.d.ts.map +1 -0
  44. package/dist/utils/startupProgress.js +320 -0
  45. package/dist/utils/startupProgress.js.map +1 -0
  46. package/dist/web-ui/assets/index-OE34_qh_.css +1 -0
  47. package/dist/web-ui/assets/index-nuQoO_K8.js +63 -0
  48. package/dist/web-ui/index.html +2 -2
  49. package/package.json +1 -1
  50. package/templates/skills/chrome-devtools/SKILL.md +23 -4
  51. package/dist/web-ui/assets/index-Cc0Wqkrw.js +0 -63
  52. package/dist/web-ui/assets/index-d4taGsNz.css +0 -1
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Auto-open browser utility for markus start command.
3
+ * Uses `open` on macOS and `xdg-open` on Linux.
4
+ */
5
+ export declare function openBrowser(url: string): void;
6
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAU7C"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Auto-open browser utility for markus start command.
3
+ * Uses `open` on macOS and `xdg-open` on Linux.
4
+ */
5
+ import { exec } from 'node:child_process';
6
+ import { platform } from 'node:os';
7
+ export function openBrowser(url) {
8
+ if (process.env['NO_BROWSER'])
9
+ return;
10
+ const sys = platform();
11
+ const cmd = sys === 'darwin' ? `open "${url}"` : sys === 'win32' ? `start "" "${url}"` : `xdg-open "${url}"`;
12
+ exec(cmd, (err) => {
13
+ if (err) {
14
+ // Browser open failure is non-fatal, silently ignore.
15
+ }
16
+ });
17
+ }
18
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAAE,OAAO;IAEtC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC;IAC7G,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;QAChB,IAAI,GAAG,EAAE,CAAC;YACR,sDAAsD;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Startup logger for markus start command.
3
+ * Writes all startup logs to ~/.markus/logs/ AND prints to console.
4
+ * Run `markus gateway logs` to view the log file.
5
+ */
6
+ export declare function getStartupLogPath(): string;
7
+ export declare function getLLMLogPath(): string;
8
+ export declare function setSuppressConsole(suppress: boolean): void;
9
+ export declare function initStartupLogger(): string;
10
+ export declare function getStartupLogFile(): string;
11
+ export type LogLevel = 'INFO' | 'WARN' | 'ERROR' | 'OK' | 'FAIL' | 'SKIP';
12
+ /**
13
+ * Write a startup log entry to file AND console.
14
+ */
15
+ export declare function startupLog(level: LogLevel, message: string, detail?: string): void;
16
+ /**
17
+ * Write a blank line to log file AND console.
18
+ */
19
+ export declare function startupBlank(): void;
20
+ /**
21
+ * Write a section header to log file AND console.
22
+ */
23
+ export declare function startupSection(title: string): void;
24
+ /**
25
+ * Close the startup log stream (call on shutdown).
26
+ */
27
+ export declare function closeStartupLogger(): void;
28
+ /**
29
+ * Append an LLM log entry (call for each LLM call).
30
+ */
31
+ export declare function appendLLMLog(entry: {
32
+ timestamp: string;
33
+ provider: string;
34
+ model: string;
35
+ inputTokens: number;
36
+ outputTokens: number;
37
+ durationMs: number;
38
+ success: boolean;
39
+ error?: string;
40
+ }): void;
41
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAMD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAE1D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAW1E;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAUlF;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAOnC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAOlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAQP"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Startup logger for markus start command.
3
+ * Writes all startup logs to ~/.markus/logs/ AND prints to console.
4
+ * Run `markus gateway logs` to view the log file.
5
+ */
6
+ import { createWriteStream, existsSync, mkdirSync, appendFileSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { homedir } from 'node:os';
9
+ const LOG_DIR = join(homedir(), '.markus', 'logs');
10
+ function ensureLogDir() {
11
+ if (!existsSync(LOG_DIR)) {
12
+ mkdirSync(LOG_DIR, { recursive: true, mode: 0o755 });
13
+ }
14
+ }
15
+ export function getStartupLogPath() {
16
+ const date = new Date().toISOString().slice(0, 10);
17
+ return join(LOG_DIR, `startup-${date}.log`);
18
+ }
19
+ export function getLLMLogPath() {
20
+ return join(LOG_DIR, 'llm.log');
21
+ }
22
+ let startupLogStream = null;
23
+ let startupLogPath = '';
24
+ let _suppressConsole = false;
25
+ export function setSuppressConsole(suppress) {
26
+ _suppressConsole = suppress;
27
+ }
28
+ export function initStartupLogger() {
29
+ ensureLogDir();
30
+ startupLogPath = getStartupLogPath();
31
+ startupLogStream = createWriteStream(startupLogPath, { flags: 'a', mode: 0o644 });
32
+ return startupLogPath;
33
+ }
34
+ export function getStartupLogFile() {
35
+ return startupLogPath;
36
+ }
37
+ const LEVEL_PREFIX = {
38
+ OK: '[OK]',
39
+ INFO: '[INFO]',
40
+ WARN: '[WARN]',
41
+ ERROR: '[ERROR]',
42
+ FAIL: '[FAIL]',
43
+ SKIP: '[SKIP]',
44
+ };
45
+ /**
46
+ * Write a startup log entry to file AND console.
47
+ */
48
+ export function startupLog(level, message, detail) {
49
+ const ts = new Date().toISOString();
50
+ const fileLine = `${ts} ${LEVEL_PREFIX[level]} ${message}${detail ? ' ' + detail : ''}\n`;
51
+ if (startupLogStream) {
52
+ startupLogStream.write(fileLine);
53
+ }
54
+ if (!_suppressConsole) {
55
+ const consoleLine = ` ${LEVEL_PREFIX[level]} ${message}${detail ? ' ' + detail : ''}`;
56
+ console.log(consoleLine);
57
+ }
58
+ }
59
+ /**
60
+ * Write a blank line to log file AND console.
61
+ */
62
+ export function startupBlank() {
63
+ if (startupLogStream) {
64
+ startupLogStream.write('\n');
65
+ }
66
+ if (!_suppressConsole) {
67
+ console.log('');
68
+ }
69
+ }
70
+ /**
71
+ * Write a section header to log file AND console.
72
+ */
73
+ export function startupSection(title) {
74
+ if (startupLogStream) {
75
+ startupLogStream.write(`\n--- ${title} ---\n`);
76
+ }
77
+ if (!_suppressConsole) {
78
+ console.log(`\n--- ${title} ---`);
79
+ }
80
+ }
81
+ /**
82
+ * Close the startup log stream (call on shutdown).
83
+ */
84
+ export function closeStartupLogger() {
85
+ if (startupLogStream) {
86
+ startupLogStream.end();
87
+ startupLogStream = null;
88
+ }
89
+ }
90
+ /**
91
+ * Append an LLM log entry (call for each LLM call).
92
+ */
93
+ export function appendLLMLog(entry) {
94
+ ensureLogDir();
95
+ const line = JSON.stringify(entry) + '\n';
96
+ try {
97
+ appendFileSync(getLLMLogPath(), line, { mode: 0o644 });
98
+ }
99
+ catch {
100
+ // non-fatal
101
+ }
102
+ }
103
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAEnD,SAAS,YAAY;IACnB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,gBAAgB,GAAgD,IAAI,CAAC;AACzE,IAAI,cAAc,GAAW,EAAE,CAAC;AAChC,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAE7B,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAClD,gBAAgB,GAAG,QAAQ,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,YAAY,EAAE,CAAC;IACf,cAAc,GAAG,iBAAiB,EAAE,CAAC;IACrC,gBAAgB,GAAG,iBAAiB,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC;AAID,MAAM,YAAY,GAA6B;IAC7C,EAAE,EAAI,MAAM;IACZ,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAe,EAAE,OAAe,EAAE,MAAe;IAC1E,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IAC1F,IAAI,gBAAgB,EAAE,CAAC;QACrB,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,KAAK,YAAY,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,IAAI,gBAAgB,EAAE,CAAC;QACrB,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,gBAAgB,EAAE,CAAC;QACrB,gBAAgB,CAAC,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,gBAAgB,EAAE,CAAC;QACrB,gBAAgB,CAAC,GAAG,EAAE,CAAC;QACvB,gBAAgB,GAAG,IAAI,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAS5B;IACC,YAAY,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,cAAc,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Animated startup progress display for `markus start`.
3
+ *
4
+ * Displays a live ASCII progress bar + step list in the terminal while the
5
+ * server is initialising. Output is TTY-aware: non-interactive environments
6
+ * fall back to simple unadorned text lines.
7
+ *
8
+ * Progress phases
9
+ * ---------------
10
+ * 0 → Boot
11
+ * 1 → Config
12
+ * 2 → LLM providers
13
+ * 3 → Database
14
+ * 4 → Services
15
+ * 5 → Gateway
16
+ * 6 → Ready (browser opens)
17
+ */
18
+ export interface StartupStep {
19
+ id: number;
20
+ label: string;
21
+ detail?: string;
22
+ }
23
+ export declare const STARTUP_STEPS: StartupStep[];
24
+ export declare class StartupProgress {
25
+ private steps;
26
+ private currentStep;
27
+ private spinnerIdx;
28
+ private intervalId;
29
+ private isTty;
30
+ private output;
31
+ private startedAt;
32
+ private logPath;
33
+ constructor(logPath: string);
34
+ start(): void;
35
+ /** Mark the given step index as done. */
36
+ complete(stepIdx: number, detail?: string): void;
37
+ /** Mark the given step index as failed. */
38
+ fail(stepIdx: number, detail?: string): void;
39
+ /** Mark the given step index as skipped. */
40
+ skip(stepIdx: number, detail?: string): void;
41
+ /** Update the detail text of the currently-active step. */
42
+ updateDetail(stepIdx: number, detail: string): void;
43
+ /** Mark a step as active (spinner + bold label). */
44
+ setActive(stepIdx: number): void;
45
+ /** Stop the animation and print the final ready screen. */
46
+ finish(url: string): void;
47
+ private tick;
48
+ private write;
49
+ private writeLog;
50
+ private render;
51
+ private renderFinal;
52
+ private printNonTtyBanner;
53
+ /** Print the full step list once (used by non-TTY start). */
54
+ private printSteps;
55
+ /** Print a single progress line for non-TTY mode.
56
+ * Overwrites the current line so it stays visible but compact. */
57
+ private printNonTtyLine;
58
+ private printNonTtyFinal;
59
+ private stepIcon;
60
+ }
61
+ //# sourceMappingURL=startupProgress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startupProgress.d.ts","sourceRoot":"","sources":["../../src/utils/startupProgress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA2BH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,EAAE,WAAW,EAQtC,CAAC;AA8CF,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAoG;IACjH,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAA8D;IAC5E,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,EAAE,MAAM;IAa3B,KAAK,IAAI,IAAI;IAcb,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAUhD,2CAA2C;IAC3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAU5C,4CAA4C;IAC5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAO5C,2DAA2D;IAC3D,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAKnD,oDAAoD;IACpD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOhC,2DAA2D;IAC3D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAkBzB,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,MAAM;IA+Cd,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,iBAAiB;IAOzB,6DAA6D;IAC7D,OAAO,CAAC,UAAU;IAOlB;uEACmE;IACnE,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,QAAQ;CAUjB"}
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Animated startup progress display for `markus start`.
3
+ *
4
+ * Displays a live ASCII progress bar + step list in the terminal while the
5
+ * server is initialising. Output is TTY-aware: non-interactive environments
6
+ * fall back to simple unadorned text lines.
7
+ *
8
+ * Progress phases
9
+ * ---------------
10
+ * 0 → Boot
11
+ * 1 → Config
12
+ * 2 → LLM providers
13
+ * 3 → Database
14
+ * 4 → Services
15
+ * 5 → Gateway
16
+ * 6 → Ready (browser opens)
17
+ */
18
+ import { homedir } from 'node:os';
19
+ import { appendFileSync, existsSync, mkdirSync } from 'node:fs';
20
+ import { join } from 'node:path';
21
+ import { setSuppressConsole } from './logger.js';
22
+ // ── ASCII banner ─────────────────────────────────────────────────────────────
23
+ const BANNER = [
24
+ ' ███╗ ███╗ █████╗ ██████╗ ██╗ ██╗██╗ ██╗███████╗',
25
+ ' ████╗ ████║██╔══██╗██╔══██╗██║ ██╔╝██║ ██║██╔════╝',
26
+ ' ██╔████╔██║███████║██████╔╝█████╔╝ ██║ ██║███████╗',
27
+ ' ██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗ ██║ ██║╚════██║',
28
+ ' ██║ ╚═╝ ██║██║ ██║██║ ██║██║ ██╗╚██████╔╝███████║',
29
+ ' ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝',
30
+ ].join('\n');
31
+ const BANNER_LINES = BANNER.split('\n');
32
+ // ── Spinner frames ────────────────────────────────────────────────────────────
33
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
34
+ const SPINNER_FRAMES_ALT = ['◐', '◓', '◑', '◒'];
35
+ export const STARTUP_STEPS = [
36
+ { id: 0, label: 'Boot', detail: 'markus CLI initialised' },
37
+ { id: 1, label: 'Config', detail: 'loading ~/.markus/markus.json' },
38
+ { id: 2, label: 'LLM Providers', detail: 'routing & credential resolution' },
39
+ { id: 3, label: 'Database', detail: 'SQLite storage initialisation' },
40
+ { id: 4, label: 'Services', detail: 'agent manager, task service, API server' },
41
+ { id: 5, label: 'Gateway', detail: 'webhook adapters (Feishu, WebUI…)' },
42
+ { id: 6, label: 'Ready', detail: 'server listening' },
43
+ ];
44
+ const TOTAL_STEPS = STARTUP_STEPS.length; // 7
45
+ // ── ANSI helpers ───────────────────────────────────────────────────────────────
46
+ function clearLine() {
47
+ return '\r\x1b[K';
48
+ }
49
+ function clearScreen() {
50
+ // \x1b[2J = erase entire screen, \x1b[H = move cursor to home (top-left)
51
+ return '\x1b[2J\x1b[H';
52
+ }
53
+ function cursorHide() {
54
+ return '\x1b[?25l';
55
+ }
56
+ function cursorShow() {
57
+ return '\x1b[?25h';
58
+ }
59
+ function moveUp(n) {
60
+ return `\x1b[${n}A`;
61
+ }
62
+ function cyan(s) { return `\x1b[36m${s}\x1b[0m`; }
63
+ function green(s) { return `\x1b[32m${s}\x1b[0m`; }
64
+ function yellow(s) { return `\x1b[33m${s}\x1b[0m`; }
65
+ function red(s) { return `\x1b[31m${s}\x1b[0m`; }
66
+ function bold(s) { return `\x1b[1m${s}\x1b[0m`; }
67
+ function dim(s) { return `\x1b[2m${s}\x1b[0m`; }
68
+ // ── Progress bar renderer ──────────────────────────────────────────────────────
69
+ function renderProgressBar(current, total, width = 28) {
70
+ const filled = Math.round((current / total) * width);
71
+ const empty = width - filled;
72
+ const bar = '█'.repeat(filled) + '░'.repeat(empty);
73
+ const pct = Math.round((current / total) * 100);
74
+ return `[${bar}] ${pct}%`;
75
+ }
76
+ // ── StartupProgress class ─────────────────────────────────────────────────────
77
+ export class StartupProgress {
78
+ steps;
79
+ currentStep = 0;
80
+ spinnerIdx = 0;
81
+ intervalId = null;
82
+ isTty = false;
83
+ output;
84
+ startedAt = 0;
85
+ logPath = '';
86
+ constructor(logPath) {
87
+ this.logPath = logPath;
88
+ this.steps = STARTUP_STEPS.map(s => ({ label: s.label, detail: s.detail ?? '', status: 'pending' }));
89
+ this.output = process.stdout;
90
+ try {
91
+ this.isTty = this.output.isTTY ?? false;
92
+ }
93
+ catch {
94
+ this.isTty = false;
95
+ }
96
+ }
97
+ // ── Public API ─────────────────────────────────────────────────────────────
98
+ start() {
99
+ this.startedAt = Date.now();
100
+ if (this.isTty) {
101
+ setSuppressConsole(true);
102
+ this.render();
103
+ this.intervalId = setInterval(() => this.tick(), 100);
104
+ }
105
+ else {
106
+ // Non-TTY: print banner + step list without animation
107
+ // (don't stay silent — users watching a blank screen is bad UX)
108
+ this.printNonTtyBanner();
109
+ this.printSteps();
110
+ }
111
+ }
112
+ /** Mark the given step index as done. */
113
+ complete(stepIdx, detail) {
114
+ if (detail)
115
+ this.steps[stepIdx].detail = detail;
116
+ this.steps[stepIdx].status = 'done';
117
+ if (stepIdx >= this.currentStep) {
118
+ this.currentStep = stepIdx + 1;
119
+ }
120
+ this.writeLog('OK', stepIdx);
121
+ if (!this.isTty)
122
+ this.printNonTtyLine(stepIdx, 'done');
123
+ }
124
+ /** Mark the given step index as failed. */
125
+ fail(stepIdx, detail) {
126
+ if (detail)
127
+ this.steps[stepIdx].detail = detail;
128
+ this.steps[stepIdx].status = 'fail';
129
+ if (stepIdx >= this.currentStep) {
130
+ this.currentStep = stepIdx + 1;
131
+ }
132
+ this.writeLog('FAIL', stepIdx);
133
+ if (!this.isTty)
134
+ this.printNonTtyLine(stepIdx, 'fail');
135
+ }
136
+ /** Mark the given step index as skipped. */
137
+ skip(stepIdx, detail) {
138
+ if (detail)
139
+ this.steps[stepIdx].detail = detail;
140
+ this.steps[stepIdx].status = 'skip';
141
+ this.writeLog('SKIP', stepIdx);
142
+ if (!this.isTty)
143
+ this.printNonTtyLine(stepIdx, 'skip');
144
+ }
145
+ /** Update the detail text of the currently-active step. */
146
+ updateDetail(stepIdx, detail) {
147
+ this.steps[stepIdx].detail = detail;
148
+ if (!this.isTty)
149
+ this.printNonTtyLine(stepIdx, 'active');
150
+ }
151
+ /** Mark a step as active (spinner + bold label). */
152
+ setActive(stepIdx) {
153
+ this.steps[stepIdx].status = 'active';
154
+ this.currentStep = stepIdx;
155
+ this.writeLog('INFO', stepIdx);
156
+ if (!this.isTty)
157
+ this.printNonTtyLine(stepIdx, 'active');
158
+ }
159
+ /** Stop the animation and print the final ready screen. */
160
+ finish(url) {
161
+ if (this.intervalId) {
162
+ clearInterval(this.intervalId);
163
+ this.intervalId = null;
164
+ }
165
+ this.steps[TOTAL_STEPS - 1].status = 'done';
166
+ this.steps[TOTAL_STEPS - 1].detail = url;
167
+ if (this.isTty) {
168
+ this.renderFinal(url);
169
+ }
170
+ else {
171
+ this.printNonTtyFinal(url);
172
+ }
173
+ }
174
+ // ── Private helpers ─────────────────────────────────────────────────────────
175
+ tick() {
176
+ this.spinnerIdx = (this.spinnerIdx + 1) % SPINNER_FRAMES.length;
177
+ this.render();
178
+ }
179
+ write(content) {
180
+ try {
181
+ this.output.write(content + '\n');
182
+ }
183
+ catch {
184
+ // ignore
185
+ }
186
+ }
187
+ writeLog(type, stepIdx) {
188
+ const step = this.steps[stepIdx];
189
+ const ts = new Date().toISOString();
190
+ const msg = `[${type}] [${step.label}] ${step.detail || step.label}`;
191
+ const line = `${ts} ${msg}\n`;
192
+ try {
193
+ const dir = join(homedir(), '.markus', 'logs');
194
+ if (!existsSync(dir))
195
+ mkdirSync(dir, { recursive: true, mode: 0o755 });
196
+ appendFileSync(this.logPath, line, { mode: 0o644 });
197
+ }
198
+ catch {
199
+ // non-fatal
200
+ }
201
+ }
202
+ render() {
203
+ if (!this.isTty)
204
+ return;
205
+ const lines = [];
206
+ const W = 60;
207
+ // ── Banner ──
208
+ lines.push('');
209
+ for (const l of BANNER_LINES) {
210
+ lines.push(` ${cyan(l)}`);
211
+ }
212
+ lines.push('');
213
+ // ── Progress bar ──
214
+ const pct = Math.round((this.currentStep / TOTAL_STEPS) * 100);
215
+ const frame = SPINNER_FRAMES[this.spinnerIdx];
216
+ lines.push(` ${frame} ${bold('Starting Markus')} ${dim(renderProgressBar(this.currentStep, TOTAL_STEPS))}`);
217
+ lines.push('');
218
+ // ── Step list ──
219
+ for (let i = 0; i < this.steps.length; i++) {
220
+ const s = this.steps[i];
221
+ const isCurrent = i === this.currentStep;
222
+ const icon = this.stepIcon(s.status, isCurrent);
223
+ if (s.status === 'done') {
224
+ lines.push(` ${green('✓')} ${green(s.label)} ${dim(s.detail)}`);
225
+ }
226
+ else if (s.status === 'fail') {
227
+ lines.push(` ${red('✗')} ${red(s.label)} ${dim(s.detail)}`);
228
+ }
229
+ else if (s.status === 'skip') {
230
+ lines.push(` ${yellow('○')} ${dim(s.label)} ${dim(s.detail)}`);
231
+ }
232
+ else if (s.status === 'active') {
233
+ const spin = SPINNER_FRAMES[this.spinnerIdx];
234
+ lines.push(` ${cyan(spin)} ${bold(s.label)} ${dim(s.detail)}`);
235
+ }
236
+ else {
237
+ lines.push(` ${dim('○')} ${s.label} ${dim(s.detail)}`);
238
+ }
239
+ }
240
+ lines.push('');
241
+ lines.push(` ${dim(`logs → ~/.markus/logs/`)}`);
242
+ // ── Output ──
243
+ const output = lines.join('\n');
244
+ this.write(clearScreen() + cursorHide() + output);
245
+ }
246
+ renderFinal(url) {
247
+ const elapsed = ((Date.now() - this.startedAt) / 1000).toFixed(1);
248
+ setSuppressConsole(false);
249
+ const lines = [];
250
+ lines.push('');
251
+ for (const l of BANNER_LINES) {
252
+ lines.push(` ${cyan(l)}`);
253
+ }
254
+ lines.push('');
255
+ lines.push(` ${green('◉')} ${bold('Markus is running')} ${dim(`(${elapsed}s)`)}`);
256
+ lines.push('');
257
+ lines.push(` ${bold('→')} ${url}`);
258
+ lines.push('');
259
+ lines.push(` ${dim('Press Ctrl+C to stop')}`);
260
+ lines.push('');
261
+ this.write(clearScreen() + cursorShow() + lines.join('\n'));
262
+ }
263
+ printNonTtyBanner() {
264
+ for (const l of BANNER_LINES) {
265
+ this.write(` ${l}`);
266
+ }
267
+ this.write('');
268
+ }
269
+ /** Print the full step list once (used by non-TTY start). */
270
+ printSteps() {
271
+ for (let i = 0; i < this.steps.length; i++) {
272
+ const s = this.steps[i];
273
+ this.printNonTtyLine(i, s.status);
274
+ }
275
+ }
276
+ /** Print a single progress line for non-TTY mode.
277
+ * Overwrites the current line so it stays visible but compact. */
278
+ printNonTtyLine(stepIdx, status) {
279
+ const s = this.steps[stepIdx];
280
+ const label = s.label.padEnd(16);
281
+ const detail = (s.detail || '').substring(0, 50);
282
+ let line;
283
+ if (status === 'done') {
284
+ line = ` ✓ ${label} ${detail}`;
285
+ }
286
+ else if (status === 'fail') {
287
+ line = ` ✗ ${label} ${detail}`;
288
+ }
289
+ else if (status === 'skip') {
290
+ line = ` ○ ${label} ${detail}`;
291
+ }
292
+ else if (status === 'active') {
293
+ // Cycle through a few spinner frames for active indication
294
+ const spinFrames = ['⠋', '⠙', '⠹', '⠸', '⠼'];
295
+ const spin = spinFrames[stepIdx % spinFrames.length];
296
+ line = ` ${spin} ${label} ${detail}`;
297
+ }
298
+ else {
299
+ line = ` ${label} ${detail}`;
300
+ }
301
+ // Clear line then overwrite
302
+ this.write(`\r\x1b[K${line}`);
303
+ }
304
+ printNonTtyFinal(url) {
305
+ const elapsed = ((Date.now() - this.startedAt) / 1000).toFixed(1);
306
+ this.write(`\n Markus is running (${elapsed}s) → ${url}`);
307
+ }
308
+ stepIcon(status, isCurrent) {
309
+ if (status === 'done')
310
+ return green('✓');
311
+ if (status === 'fail')
312
+ return red('✗');
313
+ if (status === 'skip')
314
+ return yellow('○');
315
+ if (status === 'active')
316
+ return SPINNER_FRAMES[this.spinnerIdx];
317
+ return dim('○');
318
+ }
319
+ }
320
+ //# sourceMappingURL=startupProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startupProgress.js","sourceRoot":"","sources":["../../src/utils/startupProgress.ts"],"names":[],"mappings":"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"}