ultracode-ai 1.3.0

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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/dist/commands/authoring-agents.d.ts +19 -0
  4. package/dist/commands/authoring-agents.d.ts.map +1 -0
  5. package/dist/commands/authoring-agents.js +123 -0
  6. package/dist/commands/authoring-agents.js.map +1 -0
  7. package/dist/commands/budget.d.ts +16 -0
  8. package/dist/commands/budget.d.ts.map +1 -0
  9. package/dist/commands/budget.js +105 -0
  10. package/dist/commands/budget.js.map +1 -0
  11. package/dist/commands/config.d.ts +15 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +147 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +65 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +188 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/ext-format.d.ts +22 -0
  20. package/dist/commands/ext-format.d.ts.map +1 -0
  21. package/dist/commands/ext-format.js +115 -0
  22. package/dist/commands/ext-format.js.map +1 -0
  23. package/dist/commands/ext-helpers.d.ts +25 -0
  24. package/dist/commands/ext-helpers.d.ts.map +1 -0
  25. package/dist/commands/ext-helpers.js +36 -0
  26. package/dist/commands/ext-helpers.js.map +1 -0
  27. package/dist/commands/learn.d.ts +29 -0
  28. package/dist/commands/learn.d.ts.map +1 -0
  29. package/dist/commands/learn.js +190 -0
  30. package/dist/commands/learn.js.map +1 -0
  31. package/dist/commands/list.d.ts +11 -0
  32. package/dist/commands/list.d.ts.map +1 -0
  33. package/dist/commands/list.js +58 -0
  34. package/dist/commands/list.js.map +1 -0
  35. package/dist/commands/run.d.ts +13 -0
  36. package/dist/commands/run.d.ts.map +1 -0
  37. package/dist/commands/run.js +46 -0
  38. package/dist/commands/run.js.map +1 -0
  39. package/dist/commands/setup.d.ts +40 -0
  40. package/dist/commands/setup.d.ts.map +1 -0
  41. package/dist/commands/setup.js +146 -0
  42. package/dist/commands/setup.js.map +1 -0
  43. package/dist/commands/skills.d.ts +16 -0
  44. package/dist/commands/skills.d.ts.map +1 -0
  45. package/dist/commands/skills.js +148 -0
  46. package/dist/commands/skills.js.map +1 -0
  47. package/dist/commands/versioning.d.ts +13 -0
  48. package/dist/commands/versioning.d.ts.map +1 -0
  49. package/dist/commands/versioning.js +63 -0
  50. package/dist/commands/versioning.js.map +1 -0
  51. package/dist/context.d.ts +60 -0
  52. package/dist/context.d.ts.map +1 -0
  53. package/dist/context.js +69 -0
  54. package/dist/context.js.map +1 -0
  55. package/dist/core-loader.d.ts +22 -0
  56. package/dist/core-loader.d.ts.map +1 -0
  57. package/dist/core-loader.js +22 -0
  58. package/dist/core-loader.js.map +1 -0
  59. package/dist/format.d.ts +15 -0
  60. package/dist/format.d.ts.map +1 -0
  61. package/dist/format.js +80 -0
  62. package/dist/format.js.map +1 -0
  63. package/dist/index.d.ts +22 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +59 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/program.d.ts +19 -0
  68. package/dist/program.d.ts.map +1 -0
  69. package/dist/program.js +120 -0
  70. package/dist/program.js.map +1 -0
  71. package/dist/themes/dark.d.ts +4 -0
  72. package/dist/themes/dark.d.ts.map +1 -0
  73. package/dist/themes/dark.js +16 -0
  74. package/dist/themes/dark.js.map +1 -0
  75. package/dist/themes/dracula.d.ts +4 -0
  76. package/dist/themes/dracula.d.ts.map +1 -0
  77. package/dist/themes/dracula.js +16 -0
  78. package/dist/themes/dracula.js.map +1 -0
  79. package/dist/themes/index.d.ts +32 -0
  80. package/dist/themes/index.d.ts.map +1 -0
  81. package/dist/themes/index.js +45 -0
  82. package/dist/themes/index.js.map +1 -0
  83. package/dist/themes/light.d.ts +4 -0
  84. package/dist/themes/light.d.ts.map +1 -0
  85. package/dist/themes/light.js +16 -0
  86. package/dist/themes/light.js.map +1 -0
  87. package/dist/themes/theme.d.ts +34 -0
  88. package/dist/themes/theme.d.ts.map +1 -0
  89. package/dist/themes/theme.js +2 -0
  90. package/dist/themes/theme.js.map +1 -0
  91. package/dist/ui/App.d.ts +24 -0
  92. package/dist/ui/App.d.ts.map +1 -0
  93. package/dist/ui/App.js +217 -0
  94. package/dist/ui/App.js.map +1 -0
  95. package/dist/ui/ChatInput.d.ts +21 -0
  96. package/dist/ui/ChatInput.d.ts.map +1 -0
  97. package/dist/ui/ChatInput.js +88 -0
  98. package/dist/ui/ChatInput.js.map +1 -0
  99. package/dist/ui/ChatOutput.d.ts +22 -0
  100. package/dist/ui/ChatOutput.d.ts.map +1 -0
  101. package/dist/ui/ChatOutput.js +27 -0
  102. package/dist/ui/ChatOutput.js.map +1 -0
  103. package/dist/ui/StatusBar.d.ts +22 -0
  104. package/dist/ui/StatusBar.d.ts.map +1 -0
  105. package/dist/ui/StatusBar.js +17 -0
  106. package/dist/ui/StatusBar.js.map +1 -0
  107. package/dist/ui/ToolOutput.d.ts +20 -0
  108. package/dist/ui/ToolOutput.d.ts.map +1 -0
  109. package/dist/ui/ToolOutput.js +14 -0
  110. package/dist/ui/ToolOutput.js.map +1 -0
  111. package/dist/ui/ctrl-c.d.ts +21 -0
  112. package/dist/ui/ctrl-c.d.ts.map +1 -0
  113. package/dist/ui/ctrl-c.js +27 -0
  114. package/dist/ui/ctrl-c.js.map +1 -0
  115. package/dist/ui/start.d.ts +13 -0
  116. package/dist/ui/start.d.ts.map +1 -0
  117. package/dist/ui/start.js +25 -0
  118. package/dist/ui/start.js.map +1 -0
  119. package/dist/utils/cli-version.d.ts +15 -0
  120. package/dist/utils/cli-version.d.ts.map +1 -0
  121. package/dist/utils/cli-version.js +33 -0
  122. package/dist/utils/cli-version.js.map +1 -0
  123. package/dist/utils/resolve-home.d.ts +19 -0
  124. package/dist/utils/resolve-home.d.ts.map +1 -0
  125. package/dist/utils/resolve-home.js +28 -0
  126. package/dist/utils/resolve-home.js.map +1 -0
  127. package/dist/utils/text.d.ts +50 -0
  128. package/dist/utils/text.d.ts.map +1 -0
  129. package/dist/utils/text.js +133 -0
  130. package/dist/utils/text.js.map +1 -0
  131. package/package.json +45 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Theme registry for the interactive UI.
3
+ *
4
+ * Built-in themes: `dark` (default), `light`, `dracula`. The
5
+ * {@link ThemeManager} always falls back to `dark` for unknown names, so the
6
+ * UI can never end up without colour tokens.
7
+ */
8
+ import type { Theme } from "./theme.js";
9
+ import { dark } from "./dark.js";
10
+ import { dracula } from "./dracula.js";
11
+ import { light } from "./light.js";
12
+ export type { Theme } from "./theme.js";
13
+ export { dark, light, dracula };
14
+ /** Name → theme lookup with a guaranteed `dark` fallback. */
15
+ export declare class ThemeManager {
16
+ private readonly themes;
17
+ /**
18
+ * @param extra - additional themes to register (e.g. a user `custom` theme);
19
+ * they may override the built-ins by name.
20
+ */
21
+ constructor(extra?: ReadonlyArray<Theme>);
22
+ /** All registered theme names (lowercase, registration order). */
23
+ list(): string[];
24
+ /** Whether `name` resolves to a registered theme (case-insensitive). */
25
+ has(name: string): boolean;
26
+ /**
27
+ * Resolve a theme by name (case-insensitive). Unknown, empty or missing
28
+ * names fall back to the `dark` theme.
29
+ */
30
+ get(name?: string): Theme;
31
+ }
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/themes/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAEhC,6DAA6D;AAC7D,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IAEnD;;;OAGG;gBACS,KAAK,GAAE,aAAa,CAAC,KAAK,CAAM;IAM5C,kEAAkE;IAClE,IAAI,IAAI,MAAM,EAAE;IAIhB,wEAAwE;IACxE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;;OAGG;IACH,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK;CAO1B"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Theme registry for the interactive UI.
3
+ *
4
+ * Built-in themes: `dark` (default), `light`, `dracula`. The
5
+ * {@link ThemeManager} always falls back to `dark` for unknown names, so the
6
+ * UI can never end up without colour tokens.
7
+ */
8
+ import { dark } from "./dark.js";
9
+ import { dracula } from "./dracula.js";
10
+ import { light } from "./light.js";
11
+ export { dark, light, dracula };
12
+ /** Name → theme lookup with a guaranteed `dark` fallback. */
13
+ export class ThemeManager {
14
+ themes = new Map();
15
+ /**
16
+ * @param extra - additional themes to register (e.g. a user `custom` theme);
17
+ * they may override the built-ins by name.
18
+ */
19
+ constructor(extra = []) {
20
+ for (const t of [dark, light, dracula, ...extra]) {
21
+ this.themes.set(t.name.toLowerCase(), t);
22
+ }
23
+ }
24
+ /** All registered theme names (lowercase, registration order). */
25
+ list() {
26
+ return [...this.themes.keys()];
27
+ }
28
+ /** Whether `name` resolves to a registered theme (case-insensitive). */
29
+ has(name) {
30
+ return this.themes.has(name.trim().toLowerCase());
31
+ }
32
+ /**
33
+ * Resolve a theme by name (case-insensitive). Unknown, empty or missing
34
+ * names fall back to the `dark` theme.
35
+ */
36
+ get(name) {
37
+ if (typeof name === "string") {
38
+ const found = this.themes.get(name.trim().toLowerCase());
39
+ if (found)
40
+ return found;
41
+ }
42
+ return dark;
43
+ }
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/themes/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAEhC,6DAA6D;AAC7D,MAAM,OAAO,YAAY;IACN,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IAEnD;;;OAGG;IACH,YAAY,QAA8B,EAAE;QAC1C,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,wEAAwE;IACxE,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,IAAa;QACf,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YACzD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { Theme } from "./theme.js";
2
+ /** Light theme — hex tokens chosen to stay readable on light backgrounds. */
3
+ export declare const light: Theme;
4
+ //# sourceMappingURL=light.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light.d.ts","sourceRoot":"","sources":["../../src/themes/light.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,6EAA6E;AAC7E,eAAO,MAAM,KAAK,EAAE,KAanB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** Light theme — hex tokens chosen to stay readable on light backgrounds. */
2
+ export const light = {
3
+ name: "light",
4
+ primary: "#005f87",
5
+ secondary: "#8700af",
6
+ accent: "#0057d8",
7
+ text: "#1c1c1c",
8
+ dim: "#6c6c6c",
9
+ success: "#007033",
10
+ warning: "#8a6d00",
11
+ error: "#c00000",
12
+ user: "#005f87",
13
+ assistant: "#1c1c1c",
14
+ tool: "#8a6d00",
15
+ };
16
+ //# sourceMappingURL=light.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light.js","sourceRoot":"","sources":["../../src/themes/light.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,KAAK,GAAU;IAC1B,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,SAAS;CAChB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Colour-token contract for CLI themes.
3
+ *
4
+ * Tokens are Ink colour strings (named colours like `"cyan"` or hex values
5
+ * like `"#bd93f9"`) — no chalk, no raw ANSI. Components only ever reference
6
+ * tokens, never literal colours.
7
+ */
8
+ export interface Theme {
9
+ /** Canonical theme name. */
10
+ name: string;
11
+ /** Primary brand/prompt colour. */
12
+ primary: string;
13
+ /** Secondary accents (labels, separators). */
14
+ secondary: string;
15
+ /** Highlight accent. */
16
+ accent: string;
17
+ /** Default body text. */
18
+ text: string;
19
+ /** De-emphasised text (placeholders, hints). */
20
+ dim: string;
21
+ /** Success markers. */
22
+ success: string;
23
+ /** Warnings/transient hints. */
24
+ warning: string;
25
+ /** Errors. */
26
+ error: string;
27
+ /** User chat entries. */
28
+ user: string;
29
+ /** Assistant chat entries. */
30
+ assistant: string;
31
+ /** Tool activity. */
32
+ tool: string;
33
+ }
34
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/themes/theme.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,KAAK;IACpB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc;IACd,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/themes/theme.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Interactive UltraCode UI (Ink).
3
+ *
4
+ * Key bindings:
5
+ * - Enter submits, Ctrl+J inserts a newline, Up/Down navigates input history.
6
+ * - Esc aborts the in-flight run (AbortController).
7
+ * - Shift+Tab cycles through the available agents.
8
+ * - Ctrl+C twice (within 1.5 s) exits.
9
+ *
10
+ * Slash commands: /help /agents [name] /tools /config show /theme <name>
11
+ * /clear /exit.
12
+ */
13
+ import React from "react";
14
+ import type { UltraCodeFacade } from "../context.js";
15
+ export interface AppProps {
16
+ facade: UltraCodeFacade;
17
+ /** Initial theme name; defaults to the configured `ui.theme`. */
18
+ initialTheme?: string;
19
+ /** Invoked once when the user exits the UI. */
20
+ onExit?: () => void;
21
+ }
22
+ /** Root component of the interactive mode. */
23
+ export declare function App({ facade, initialTheme, onExit }: AppProps): React.JSX.Element;
24
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAIjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AASrD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,eAAe,CAAC;IACxB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAcD,8CAA8C;AAC9C,wBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA2NjF"}
package/dist/ui/App.js ADDED
@@ -0,0 +1,217 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Interactive UltraCode UI (Ink).
4
+ *
5
+ * Key bindings:
6
+ * - Enter submits, Ctrl+J inserts a newline, Up/Down navigates input history.
7
+ * - Esc aborts the in-flight run (AbortController).
8
+ * - Shift+Tab cycles through the available agents.
9
+ * - Ctrl+C twice (within 1.5 s) exits.
10
+ *
11
+ * Slash commands: /help /agents [name] /tools /config show /theme <name>
12
+ * /clear /exit.
13
+ */
14
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
15
+ import { Box, Text, useApp, useInput } from "ink";
16
+ import { serializeError } from "ultracode-shared";
17
+ import { ThemeManager } from "../themes/index.js";
18
+ import { redactConfig } from "../utils/text.js";
19
+ import { ChatInput } from "./ChatInput.js";
20
+ import { ChatOutput } from "./ChatOutput.js";
21
+ import { DoublePress } from "./ctrl-c.js";
22
+ import { StatusBar } from "./StatusBar.js";
23
+ import { ToolOutput } from "./ToolOutput.js";
24
+ const HELP_TEXT = [
25
+ "Slash commands:",
26
+ " /help show this help",
27
+ " /agents [name] list agents (or show one agent)",
28
+ " /tools list available tools",
29
+ " /config show print the configuration (secrets masked)",
30
+ " /theme <name> switch theme (dark/light/dracula)",
31
+ " /clear clear the transcript",
32
+ " /exit leave UltraCode",
33
+ "Keys: Enter send · Ctrl+J newline · ↑/↓ history · Shift+Tab agent · Esc cancel · Ctrl+C Ctrl+C exit",
34
+ ].join("\n");
35
+ /** Root component of the interactive mode. */
36
+ export function App({ facade, initialTheme, onExit }) {
37
+ const { exit } = useApp();
38
+ const themes = useMemo(() => new ThemeManager(), []);
39
+ const [themeName, setThemeName] = useState(themes.get(initialTheme ?? facade.config.ui.theme).name);
40
+ const theme = themes.get(themeName);
41
+ const agents = useMemo(() => facade.listAgents(), [facade]);
42
+ const agentNames = useMemo(() => (agents.length > 0 ? agents.map((a) => a.name) : [facade.config.agents.default]), [agents, facade]);
43
+ const [agentIndex, setAgentIndex] = useState(() => {
44
+ const idx = agentNames.indexOf(facade.config.agents.default);
45
+ return idx >= 0 ? idx : 0;
46
+ });
47
+ const agentName = agentNames[agentIndex] ?? agentNames[0] ?? "default";
48
+ const model = agents.find((a) => a.name === agentName)?.model ?? facade.config.core.activeModel;
49
+ const [entries, setEntries] = useState([]);
50
+ const [stream, setStream] = useState("");
51
+ const [busy, setBusy] = useState(false);
52
+ const [hint, setHint] = useState("");
53
+ const [toolEvents, setToolEvents] = useState([]);
54
+ const [sessionId, setSessionId] = useState(undefined);
55
+ const [usage, setUsage] = useState({ input: 0, output: 0 });
56
+ const abortRef = useRef(null);
57
+ const ctrlC = useRef(new DoublePress());
58
+ useEffect(() => {
59
+ const offTool = facade.events.on("tool.executed", (e) => {
60
+ setToolEvents((prev) => [
61
+ ...prev.slice(-19),
62
+ { toolName: e.toolName, ok: e.ok, durationMs: e.durationMs },
63
+ ]);
64
+ });
65
+ const offSession = facade.events.on("session.started", (e) => {
66
+ setSessionId(e.sessionId);
67
+ });
68
+ return () => {
69
+ offTool();
70
+ offSession();
71
+ };
72
+ }, [facade]);
73
+ const doExit = useCallback(() => {
74
+ abortRef.current?.abort();
75
+ exit();
76
+ onExit?.();
77
+ }, [exit, onExit]);
78
+ useInput((input, key) => {
79
+ if (key.escape) {
80
+ abortRef.current?.abort();
81
+ return;
82
+ }
83
+ if (key.tab && key.shift) {
84
+ setAgentIndex((i) => (i + 1) % agentNames.length);
85
+ return;
86
+ }
87
+ if (key.ctrl && input === "c") {
88
+ if (ctrlC.current.press()) {
89
+ doExit();
90
+ }
91
+ else {
92
+ setHint("Press Ctrl+C again to exit");
93
+ }
94
+ }
95
+ });
96
+ const pushEntry = useCallback((entry) => {
97
+ setEntries((prev) => [...prev, entry]);
98
+ }, []);
99
+ const runPrompt = useCallback(async (prompt) => {
100
+ const controller = new AbortController();
101
+ abortRef.current = controller;
102
+ setBusy(true);
103
+ setHint("");
104
+ pushEntry({ kind: "user", text: prompt });
105
+ let acc = "";
106
+ setStream("");
107
+ try {
108
+ const result = await facade.run(prompt, {
109
+ agent: agentName,
110
+ sessionId,
111
+ signal: controller.signal,
112
+ onChunk: (chunk) => {
113
+ if (chunk.type === "text" && typeof chunk.text === "string" && chunk.text !== "") {
114
+ acc += chunk.text;
115
+ setStream(acc);
116
+ }
117
+ },
118
+ });
119
+ setUsage((u) => ({
120
+ input: u.input + result.usage.inputTokens,
121
+ output: u.output + result.usage.outputTokens,
122
+ }));
123
+ pushEntry({ kind: "assistant", text: result.text !== "" ? result.text : acc });
124
+ }
125
+ catch (err) {
126
+ const s = serializeError(err);
127
+ pushEntry({ kind: "error", text: `${s.code !== "" ? s.code : s.name}: ${s.message}` });
128
+ }
129
+ finally {
130
+ setStream("");
131
+ setBusy(false);
132
+ abortRef.current = null;
133
+ }
134
+ }, [agentName, facade, pushEntry, sessionId]);
135
+ const handleSlash = useCallback((raw) => {
136
+ const [cmd = "", ...rest] = raw.slice(1).trim().split(/\s+/);
137
+ const arg = rest.join(" ");
138
+ switch (cmd.toLowerCase()) {
139
+ case "help":
140
+ pushEntry({ kind: "info", text: HELP_TEXT });
141
+ break;
142
+ case "agents": {
143
+ if (arg !== "") {
144
+ const found = agents.find((a) => a.name === arg);
145
+ pushEntry(found
146
+ ? {
147
+ kind: "info",
148
+ text: `${found.name} (${found.type}) — ${found.description}\nmodel: ${found.model ?? "(active model)"}`,
149
+ }
150
+ : { kind: "error", text: `Unknown agent "${arg}"` });
151
+ }
152
+ else {
153
+ const list = agents.length > 0
154
+ ? agents.map((a) => ` ${a.name} (${a.type}) — ${a.description}`).join("\n")
155
+ : " (no agents available)";
156
+ pushEntry({ kind: "info", text: `Agents:\n${list}` });
157
+ }
158
+ break;
159
+ }
160
+ case "tools": {
161
+ const tools = facade.listTools();
162
+ const list = tools.length > 0
163
+ ? tools.map((t) => ` ${t.name} [${t.category}] — ${t.description}`).join("\n")
164
+ : " (no tools registered)";
165
+ pushEntry({ kind: "info", text: `Tools:\n${list}` });
166
+ break;
167
+ }
168
+ case "config": {
169
+ if (arg.trim().toLowerCase() === "show") {
170
+ pushEntry({
171
+ kind: "info",
172
+ text: JSON.stringify(redactConfig(facade.config), null, 2),
173
+ });
174
+ }
175
+ else {
176
+ pushEntry({ kind: "error", text: "Usage: /config show" });
177
+ }
178
+ break;
179
+ }
180
+ case "theme": {
181
+ if (arg !== "" && themes.has(arg)) {
182
+ setThemeName(themes.get(arg).name);
183
+ pushEntry({ kind: "info", text: `Theme switched to ${themes.get(arg).name}` });
184
+ }
185
+ else {
186
+ pushEntry({
187
+ kind: "error",
188
+ text: `Unknown theme "${arg}". Available: ${themes.list().join(", ")}`,
189
+ });
190
+ }
191
+ break;
192
+ }
193
+ case "clear":
194
+ setEntries([]);
195
+ setToolEvents([]);
196
+ break;
197
+ case "exit":
198
+ doExit();
199
+ break;
200
+ default:
201
+ pushEntry({ kind: "error", text: `Unknown command /${cmd} — try /help` });
202
+ }
203
+ }, [agents, doExit, facade, pushEntry, themes]);
204
+ const handleSubmit = useCallback((text) => {
205
+ const trimmed = text.trim();
206
+ if (trimmed === "")
207
+ return;
208
+ setHint("");
209
+ if (trimmed.startsWith("/")) {
210
+ handleSlash(trimmed);
211
+ return;
212
+ }
213
+ void runPrompt(text);
214
+ }, [handleSlash, runPrompt]);
215
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(ChatOutput, { entries: entries, stream: stream, theme: theme }), _jsx(ToolOutput, { events: toolEvents, theme: theme }), busy && stream === "" && _jsx(Text, { color: theme.dim, children: "\u2026 thinking (Esc to cancel)" }), hint !== "" && _jsx(Text, { color: theme.warning, children: hint }), _jsx(ChatInput, { onSubmit: handleSubmit, theme: theme, disabled: busy }), _jsx(StatusBar, { agent: agentName, model: model, sessionId: sessionId, usage: usage, theme: theme, themeName: themeName })] }));
216
+ }
217
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Chat input line with prompt history (Up/Down arrows) and multiline support
3
+ * (Ctrl+J inserts a newline; Enter submits).
4
+ *
5
+ * No cursor movement — input is append/backspace only, which keeps the
6
+ * component robust across terminals.
7
+ */
8
+ import React from "react";
9
+ import type { Theme } from "../themes/index.js";
10
+ export interface ChatInputProps {
11
+ /** Called with the raw (possibly multiline) input on Enter. */
12
+ onSubmit: (text: string) => void;
13
+ theme: Theme;
14
+ /** Disable input handling (e.g. while a run is in flight). */
15
+ disabled?: boolean;
16
+ /** Placeholder shown when the input is empty. */
17
+ placeholder?: string;
18
+ }
19
+ /** Render the input line and manage history/multiline state. */
20
+ export declare function ChatInput({ onSubmit, theme, disabled, placeholder, }: ChatInputProps): React.JSX.Element;
21
+ //# sourceMappingURL=ChatInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.d.ts","sourceRoot":"","sources":["../../src/ui/ChatInput.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAOD,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,KAAK,EACL,QAAgB,EAChB,WAAmD,GACpD,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAqFpC"}
@@ -0,0 +1,88 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Chat input line with prompt history (Up/Down arrows) and multiline support
4
+ * (Ctrl+J inserts a newline; Enter submits).
5
+ *
6
+ * No cursor movement — input is append/backspace only, which keeps the
7
+ * component robust across terminals.
8
+ */
9
+ import React, { useRef, useState } from "react";
10
+ import { Box, Text, useInput } from "ink";
11
+ /** Remove the last user-perceived character (surrogate-pair safe). */
12
+ function dropLastChar(s) {
13
+ return Array.from(s).slice(0, -1).join("");
14
+ }
15
+ /** Render the input line and manage history/multiline state. */
16
+ export function ChatInput({ onSubmit, theme, disabled = false, placeholder = "Type a message — /help for commands", }) {
17
+ const [value, setValueState] = useState("");
18
+ const [history, setHistory] = useState([]);
19
+ const [cursor, setCursor] = useState(null);
20
+ const draftRef = useRef("");
21
+ // Mirror of `value` that is updated synchronously: several key events can
22
+ // arrive within one render tick (fast typing/paste), and Enter must submit
23
+ // what was actually typed, not the value of the last committed render.
24
+ const valueRef = useRef("");
25
+ const setValue = (next) => {
26
+ setValueState(() => {
27
+ const resolved = typeof next === "function" ? next(valueRef.current) : next;
28
+ valueRef.current = resolved;
29
+ return resolved;
30
+ });
31
+ };
32
+ useInput((input, key) => {
33
+ if (key.escape || key.tab || key.ctrl || key.meta)
34
+ return;
35
+ if (key.return) {
36
+ const text = valueRef.current;
37
+ if (text.trim() !== "") {
38
+ setHistory((h) => [...h, text]);
39
+ }
40
+ setValue("");
41
+ setCursor(null);
42
+ draftRef.current = "";
43
+ if (text.trim() !== "")
44
+ onSubmit(text);
45
+ return;
46
+ }
47
+ if (key.upArrow) {
48
+ if (history.length === 0)
49
+ return;
50
+ const idx = cursor === null ? history.length - 1 : Math.max(0, cursor - 1);
51
+ if (cursor === null)
52
+ draftRef.current = valueRef.current;
53
+ setCursor(idx);
54
+ setValue(history[idx] ?? "");
55
+ return;
56
+ }
57
+ if (key.downArrow) {
58
+ if (cursor === null)
59
+ return;
60
+ if (cursor >= history.length - 1) {
61
+ setCursor(null);
62
+ setValue(draftRef.current);
63
+ }
64
+ else {
65
+ const idx = cursor + 1;
66
+ setCursor(idx);
67
+ setValue(history[idx] ?? "");
68
+ }
69
+ return;
70
+ }
71
+ if (key.backspace || key.delete) {
72
+ setValue((v) => dropLastChar(v));
73
+ setCursor(null);
74
+ return;
75
+ }
76
+ if (key.leftArrow || key.rightArrow || key.pageUp || key.pageDown)
77
+ return;
78
+ if (input !== "") {
79
+ // Ctrl+J arrives as a bare "\n" (multiline); pasted text may also
80
+ // contain newlines — both are appended verbatim.
81
+ setValue((v) => v + input);
82
+ setCursor(null);
83
+ }
84
+ }, { isActive: !disabled });
85
+ const lines = value.split("\n");
86
+ return (_jsx(Box, { flexDirection: "column", children: lines.map((line, i) => (_jsxs(Box, { children: [_jsx(Text, { color: theme.primary, bold: true, children: i === 0 ? "❯ " : "… " }), i === 0 && value === "" ? (_jsx(Text, { color: theme.dim, children: disabled ? "(thinking — press Esc to cancel)" : placeholder })) : (_jsx(Text, { color: theme.text, children: line }))] }, i))) }));
87
+ }
88
+ //# sourceMappingURL=ChatInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.js","sourceRoot":"","sources":["../../src/ui/ChatInput.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Conversation transcript: user/assistant/info/error blocks plus the live
3
+ * streaming text of the in-flight assistant turn.
4
+ */
5
+ import React from "react";
6
+ import type { Theme } from "../themes/index.js";
7
+ /** Kind of a transcript entry. */
8
+ export type ChatEntryKind = "user" | "assistant" | "info" | "error";
9
+ /** One block in the transcript. */
10
+ export interface ChatEntry {
11
+ kind: ChatEntryKind;
12
+ text: string;
13
+ }
14
+ export interface ChatOutputProps {
15
+ entries: ReadonlyArray<ChatEntry>;
16
+ /** Live streaming text of the current assistant turn ("" when idle). */
17
+ stream: string;
18
+ theme: Theme;
19
+ }
20
+ /** Render the transcript. */
21
+ export declare function ChatOutput({ entries, stream, theme }: ChatOutputProps): React.JSX.Element;
22
+ //# sourceMappingURL=ChatOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatOutput.d.ts","sourceRoot":"","sources":["../../src/ui/ChatOutput.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,kCAAkC;AAClC,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpE,mCAAmC;AACnC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAKD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAClC,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACd;AAeD,6BAA6B;AAC7B,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAmBzF"}
@@ -0,0 +1,27 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Conversation transcript: user/assistant/info/error blocks plus the live
4
+ * streaming text of the in-flight assistant turn.
5
+ */
6
+ import React from "react";
7
+ import { Box, Text } from "ink";
8
+ import { truncate } from "ultracode-shared";
9
+ /** Cap on rendered characters per entry (terminal protection). */
10
+ const MAX_ENTRY_CHARS = 4000;
11
+ function colorFor(kind, theme) {
12
+ switch (kind) {
13
+ case "user":
14
+ return theme.user;
15
+ case "assistant":
16
+ return theme.assistant;
17
+ case "info":
18
+ return theme.dim;
19
+ case "error":
20
+ return theme.error;
21
+ }
22
+ }
23
+ /** Render the transcript. */
24
+ export function ChatOutput({ entries, stream, theme }) {
25
+ return (_jsxs(Box, { flexDirection: "column", children: [entries.map((entry, i) => (_jsx(Box, { flexDirection: "column", marginBottom: 0, children: _jsxs(Text, { color: colorFor(entry.kind, theme), bold: entry.kind === "user", children: [entry.kind === "user" ? "› " : "", truncate(entry.text, MAX_ENTRY_CHARS)] }) }, i))), stream !== "" && (_jsxs(Text, { color: theme.assistant, children: [truncate(stream, MAX_ENTRY_CHARS), _jsx(Text, { color: theme.dim, children: "\u258B" })] }))] }));
26
+ }
27
+ //# sourceMappingURL=ChatOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatOutput.js","sourceRoot":"","sources":["../../src/ui/ChatOutput.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAY5C,kEAAkE;AAClE,MAAM,eAAe,GAAG,IAAI,CAAC;AAS7B,SAAS,QAAQ,CAAC,IAAmB,EAAE,KAAY;IACjD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,KAAK,WAAW;YACd,OAAO,KAAK,CAAC,SAAS,CAAC;QACzB,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,GAAG,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,KAAK,CAAC;IACvB,CAAC;AACH,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAmB;IACpE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACzB,KAAC,GAAG,IAAS,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,YACjD,MAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,aAClE,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EACjC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,IACjC,IAJC,CAAC,CAKL,CACP,CAAC,EACD,MAAM,KAAK,EAAE,IAAI,CAChB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,aACzB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,EAClC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,GAAG,uBAAU,IAC3B,CACR,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Bottom status bar: active agent, model, session id and token usage.
3
+ */
4
+ import React from "react";
5
+ import type { Theme } from "../themes/index.js";
6
+ export interface StatusBarProps {
7
+ agent: string;
8
+ model: string;
9
+ sessionId?: string;
10
+ /** Cumulative token usage of this UI session. */
11
+ usage: {
12
+ input: number;
13
+ output: number;
14
+ };
15
+ theme: Theme;
16
+ themeName: string;
17
+ }
18
+ /** Shorten a session id for display (first 8 characters). */
19
+ export declare function shortSessionId(id?: string): string;
20
+ /** Render the status bar. */
21
+ export declare function StatusBar({ agent, model, sessionId, usage, theme, themeName, }: StatusBarProps): React.JSX.Element;
22
+ //# sourceMappingURL=StatusBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../src/ui/StatusBar.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,6BAA6B;AAC7B,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,KAAK,EACL,SAAS,GACV,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAmBpC"}