@elyracode/coding-agent 0.3.1 → 0.3.3

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.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.3.3] - 2026-05-10
6
+
7
+ ### Added
8
+ - Animated startup logo with sky-to-teal gradient, revealed line by line on first launch
9
+
10
+ ## [0.3.2] - 2026-05-10
11
+
12
+ ### Fixed
13
+ - `@elyracode/db-tools`: Auto-loads `.env` file from project root with Laravel/Docker key mapping (DB_HOST, DB_DATABASE, CLICKHOUSE_HOST, etc.)
14
+ - `@elyracode/db-tools`: Explicit `ELYRA_*` env vars always take precedence over `.env` values
15
+
5
16
  ## [0.3.1] - 2026-05-10
6
17
 
7
18
  ### Added
@@ -0,0 +1,21 @@
1
+ import type { Component, TUI } from "@elyracode/tui";
2
+ /**
3
+ * Animated startup component that reveals the Elyra logo line by line
4
+ * with a gradient color effect, holds briefly, then calls onComplete.
5
+ */
6
+ export declare class StartupAnimation implements Component {
7
+ private ui;
8
+ private currentLine;
9
+ private phase;
10
+ private intervalId;
11
+ private holdTimeoutId;
12
+ private onComplete;
13
+ private version;
14
+ constructor(ui: TUI, version: string, onComplete: () => void);
15
+ private start;
16
+ stop(): void;
17
+ invalidate(): void;
18
+ private clearInterval;
19
+ render(_width: number): string[];
20
+ }
21
+ //# sourceMappingURL=startup-animation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-animation.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/startup-animation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAiBrD;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,SAAS;IACjD,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,aAAa,CAA4C;IACjE,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAS;IAExB,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,EAK3D;IAED,OAAO,CAAC,KAAK;IAiBb,IAAI,IAAI,IAAI,CAOX;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,OAAO,CAAC,aAAa;IAOrB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA2B/B;CACD","sourcesContent":["import type { Component, TUI } from \"@elyracode/tui\";\nimport chalk from \"chalk\";\n\nconst LOGO_LINES = [\n\t\" ╭─────────────────────╮\",\n\t\" │ ███████╗██╗ ██╗ │\",\n\t\" │ ██╔════╝██║ ╚██╗ │\",\n\t\" │ █████╗ ██║ ██║ │\",\n\t\" │ ██╔══╝ ██║ ██║ │\",\n\t\" │ ███████╗███████╔╝ │\",\n\t\" │ ╚══════╝╚══════╝ │\",\n\t\" ╰─────────────────────╯\",\n];\n\nconst FRAME_INTERVAL_MS = 40;\nconst HOLD_MS = 600;\n\n/**\n * Animated startup component that reveals the Elyra logo line by line\n * with a gradient color effect, holds briefly, then calls onComplete.\n */\nexport class StartupAnimation implements Component {\n\tprivate ui: TUI;\n\tprivate currentLine = 0;\n\tprivate phase: \"reveal\" | \"hold\" | \"done\" = \"reveal\";\n\tprivate intervalId: ReturnType<typeof setInterval> | undefined;\n\tprivate holdTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\tprivate onComplete: () => void;\n\tprivate version: string;\n\n\tconstructor(ui: TUI, version: string, onComplete: () => void) {\n\t\tthis.ui = ui;\n\t\tthis.version = version;\n\t\tthis.onComplete = onComplete;\n\t\tthis.start();\n\t}\n\n\tprivate start(): void {\n\t\tthis.intervalId = setInterval(() => {\n\t\t\tif (this.phase === \"reveal\") {\n\t\t\t\tthis.currentLine++;\n\t\t\t\tif (this.currentLine >= LOGO_LINES.length) {\n\t\t\t\t\tthis.phase = \"hold\";\n\t\t\t\t\tthis.clearInterval();\n\t\t\t\t\tthis.holdTimeoutId = setTimeout(() => {\n\t\t\t\t\t\tthis.phase = \"done\";\n\t\t\t\t\t\tthis.onComplete();\n\t\t\t\t\t}, HOLD_MS);\n\t\t\t\t}\n\t\t\t\tthis.ui.requestRender();\n\t\t\t}\n\t\t}, FRAME_INTERVAL_MS);\n\t}\n\n\tstop(): void {\n\t\tthis.clearInterval();\n\t\tif (this.holdTimeoutId) {\n\t\t\tclearTimeout(this.holdTimeoutId);\n\t\t\tthis.holdTimeoutId = undefined;\n\t\t}\n\t\tthis.phase = \"done\";\n\t}\n\n\tinvalidate(): void {\n\t\t// No cache to clear\n\t}\n\n\tprivate clearInterval(): void {\n\t\tif (this.intervalId) {\n\t\t\tclearInterval(this.intervalId);\n\t\t\tthis.intervalId = undefined;\n\t\t}\n\t}\n\n\trender(_width: number): string[] {\n\t\tif (this.phase === \"done\") {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst lines: string[] = [\"\"];\n\n\t\tconst visibleLines = LOGO_LINES.slice(0, this.currentLine);\n\t\tfor (let i = 0; i < visibleLines.length; i++) {\n\t\t\tconst line = visibleLines[i];\n\t\t\t// Gradient from sky to teal based on line position\n\t\t\tconst t = visibleLines.length > 1 ? i / (visibleLines.length - 1) : 0;\n\t\t\tconst r = Math.round(14 + t * (20 - 14));\n\t\t\tconst g = Math.round(165 + t * (184 - 165));\n\t\t\tconst b = Math.round(233 + t * (166 - 233));\n\t\t\tlines.push(chalk.rgb(r, g, b)(line));\n\t\t}\n\n\t\tif (this.phase === \"hold\") {\n\t\t\tlines.push(\"\");\n\t\t\tconst tagline = \" A self-extensible AI coding agent\";\n\t\t\tconst ver = chalk.dim(` v${this.version}`);\n\t\t\tlines.push(chalk.rgb(14, 165, 233)(tagline) + ver);\n\t\t}\n\n\t\tlines.push(\"\");\n\t\treturn lines;\n\t}\n}\n"]}
@@ -0,0 +1,90 @@
1
+ import chalk from "chalk";
2
+ const LOGO_LINES = [
3
+ " ╭─────────────────────╮",
4
+ " │ ███████╗██╗ ██╗ │",
5
+ " │ ██╔════╝██║ ╚██╗ │",
6
+ " │ █████╗ ██║ ██║ │",
7
+ " │ ██╔══╝ ██║ ██║ │",
8
+ " │ ███████╗███████╔╝ │",
9
+ " │ ╚══════╝╚══════╝ │",
10
+ " ╰─────────────────────╯",
11
+ ];
12
+ const FRAME_INTERVAL_MS = 40;
13
+ const HOLD_MS = 600;
14
+ /**
15
+ * Animated startup component that reveals the Elyra logo line by line
16
+ * with a gradient color effect, holds briefly, then calls onComplete.
17
+ */
18
+ export class StartupAnimation {
19
+ ui;
20
+ currentLine = 0;
21
+ phase = "reveal";
22
+ intervalId;
23
+ holdTimeoutId;
24
+ onComplete;
25
+ version;
26
+ constructor(ui, version, onComplete) {
27
+ this.ui = ui;
28
+ this.version = version;
29
+ this.onComplete = onComplete;
30
+ this.start();
31
+ }
32
+ start() {
33
+ this.intervalId = setInterval(() => {
34
+ if (this.phase === "reveal") {
35
+ this.currentLine++;
36
+ if (this.currentLine >= LOGO_LINES.length) {
37
+ this.phase = "hold";
38
+ this.clearInterval();
39
+ this.holdTimeoutId = setTimeout(() => {
40
+ this.phase = "done";
41
+ this.onComplete();
42
+ }, HOLD_MS);
43
+ }
44
+ this.ui.requestRender();
45
+ }
46
+ }, FRAME_INTERVAL_MS);
47
+ }
48
+ stop() {
49
+ this.clearInterval();
50
+ if (this.holdTimeoutId) {
51
+ clearTimeout(this.holdTimeoutId);
52
+ this.holdTimeoutId = undefined;
53
+ }
54
+ this.phase = "done";
55
+ }
56
+ invalidate() {
57
+ // No cache to clear
58
+ }
59
+ clearInterval() {
60
+ if (this.intervalId) {
61
+ clearInterval(this.intervalId);
62
+ this.intervalId = undefined;
63
+ }
64
+ }
65
+ render(_width) {
66
+ if (this.phase === "done") {
67
+ return [];
68
+ }
69
+ const lines = [""];
70
+ const visibleLines = LOGO_LINES.slice(0, this.currentLine);
71
+ for (let i = 0; i < visibleLines.length; i++) {
72
+ const line = visibleLines[i];
73
+ // Gradient from sky to teal based on line position
74
+ const t = visibleLines.length > 1 ? i / (visibleLines.length - 1) : 0;
75
+ const r = Math.round(14 + t * (20 - 14));
76
+ const g = Math.round(165 + t * (184 - 165));
77
+ const b = Math.round(233 + t * (166 - 233));
78
+ lines.push(chalk.rgb(r, g, b)(line));
79
+ }
80
+ if (this.phase === "hold") {
81
+ lines.push("");
82
+ const tagline = " A self-extensible AI coding agent";
83
+ const ver = chalk.dim(` v${this.version}`);
84
+ lines.push(chalk.rgb(14, 165, 233)(tagline) + ver);
85
+ }
86
+ lines.push("");
87
+ return lines;
88
+ }
89
+ }
90
+ //# sourceMappingURL=startup-animation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-animation.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/startup-animation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Component, TUI } from \"@elyracode/tui\";\nimport chalk from \"chalk\";\n\nconst LOGO_LINES = [\n\t\" ╭─────────────────────╮\",\n\t\" │ ███████╗██╗ ██╗ │\",\n\t\" │ ██╔════╝██║ ╚██╗ │\",\n\t\" │ █████╗ ██║ ██║ │\",\n\t\" │ ██╔══╝ ██║ ██║ │\",\n\t\" │ ███████╗███████╔╝ │\",\n\t\" │ ╚══════╝╚══════╝ │\",\n\t\" ╰─────────────────────╯\",\n];\n\nconst FRAME_INTERVAL_MS = 40;\nconst HOLD_MS = 600;\n\n/**\n * Animated startup component that reveals the Elyra logo line by line\n * with a gradient color effect, holds briefly, then calls onComplete.\n */\nexport class StartupAnimation implements Component {\n\tprivate ui: TUI;\n\tprivate currentLine = 0;\n\tprivate phase: \"reveal\" | \"hold\" | \"done\" = \"reveal\";\n\tprivate intervalId: ReturnType<typeof setInterval> | undefined;\n\tprivate holdTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\tprivate onComplete: () => void;\n\tprivate version: string;\n\n\tconstructor(ui: TUI, version: string, onComplete: () => void) {\n\t\tthis.ui = ui;\n\t\tthis.version = version;\n\t\tthis.onComplete = onComplete;\n\t\tthis.start();\n\t}\n\n\tprivate start(): void {\n\t\tthis.intervalId = setInterval(() => {\n\t\t\tif (this.phase === \"reveal\") {\n\t\t\t\tthis.currentLine++;\n\t\t\t\tif (this.currentLine >= LOGO_LINES.length) {\n\t\t\t\t\tthis.phase = \"hold\";\n\t\t\t\t\tthis.clearInterval();\n\t\t\t\t\tthis.holdTimeoutId = setTimeout(() => {\n\t\t\t\t\t\tthis.phase = \"done\";\n\t\t\t\t\t\tthis.onComplete();\n\t\t\t\t\t}, HOLD_MS);\n\t\t\t\t}\n\t\t\t\tthis.ui.requestRender();\n\t\t\t}\n\t\t}, FRAME_INTERVAL_MS);\n\t}\n\n\tstop(): void {\n\t\tthis.clearInterval();\n\t\tif (this.holdTimeoutId) {\n\t\t\tclearTimeout(this.holdTimeoutId);\n\t\t\tthis.holdTimeoutId = undefined;\n\t\t}\n\t\tthis.phase = \"done\";\n\t}\n\n\tinvalidate(): void {\n\t\t// No cache to clear\n\t}\n\n\tprivate clearInterval(): void {\n\t\tif (this.intervalId) {\n\t\t\tclearInterval(this.intervalId);\n\t\t\tthis.intervalId = undefined;\n\t\t}\n\t}\n\n\trender(_width: number): string[] {\n\t\tif (this.phase === \"done\") {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst lines: string[] = [\"\"];\n\n\t\tconst visibleLines = LOGO_LINES.slice(0, this.currentLine);\n\t\tfor (let i = 0; i < visibleLines.length; i++) {\n\t\t\tconst line = visibleLines[i];\n\t\t\t// Gradient from sky to teal based on line position\n\t\t\tconst t = visibleLines.length > 1 ? i / (visibleLines.length - 1) : 0;\n\t\t\tconst r = Math.round(14 + t * (20 - 14));\n\t\t\tconst g = Math.round(165 + t * (184 - 165));\n\t\t\tconst b = Math.round(233 + t * (166 - 233));\n\t\t\tlines.push(chalk.rgb(r, g, b)(line));\n\t\t}\n\n\t\tif (this.phase === \"hold\") {\n\t\t\tlines.push(\"\");\n\t\t\tconst tagline = \" A self-extensible AI coding agent\";\n\t\t\tconst ver = chalk.dim(` v${this.version}`);\n\t\t\tlines.push(chalk.rgb(14, 165, 233)(tagline) + ver);\n\t\t}\n\n\t\tlines.push(\"\");\n\t\treturn lines;\n\t}\n}\n"]}