sweteam 0.1.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 (206) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +587 -0
  3. package/dist/adapters/adapter.d.ts +19 -0
  4. package/dist/adapters/adapter.d.ts.map +1 -0
  5. package/dist/adapters/adapter.js +20 -0
  6. package/dist/adapters/adapter.js.map +1 -0
  7. package/dist/adapters/claude-code.d.ts +13 -0
  8. package/dist/adapters/claude-code.d.ts.map +1 -0
  9. package/dist/adapters/claude-code.js +150 -0
  10. package/dist/adapters/claude-code.js.map +1 -0
  11. package/dist/adapters/codex.d.ts +13 -0
  12. package/dist/adapters/codex.d.ts.map +1 -0
  13. package/dist/adapters/codex.js +100 -0
  14. package/dist/adapters/codex.js.map +1 -0
  15. package/dist/adapters/custom.d.ts +16 -0
  16. package/dist/adapters/custom.d.ts.map +1 -0
  17. package/dist/adapters/custom.js +167 -0
  18. package/dist/adapters/custom.js.map +1 -0
  19. package/dist/adapters/opencode.d.ts +13 -0
  20. package/dist/adapters/opencode.d.ts.map +1 -0
  21. package/dist/adapters/opencode.js +100 -0
  22. package/dist/adapters/opencode.js.map +1 -0
  23. package/dist/adapters/prompt-detection.d.ts +14 -0
  24. package/dist/adapters/prompt-detection.d.ts.map +1 -0
  25. package/dist/adapters/prompt-detection.js +74 -0
  26. package/dist/adapters/prompt-detection.js.map +1 -0
  27. package/dist/commands/create.d.ts +8 -0
  28. package/dist/commands/create.d.ts.map +1 -0
  29. package/dist/commands/create.js +38 -0
  30. package/dist/commands/create.js.map +1 -0
  31. package/dist/commands/delete.d.ts +2 -0
  32. package/dist/commands/delete.d.ts.map +1 -0
  33. package/dist/commands/delete.js +22 -0
  34. package/dist/commands/delete.js.map +1 -0
  35. package/dist/commands/enter.d.ts +19 -0
  36. package/dist/commands/enter.d.ts.map +1 -0
  37. package/dist/commands/enter.js +73 -0
  38. package/dist/commands/enter.js.map +1 -0
  39. package/dist/commands/init.d.ts +14 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +52 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/list.d.ts +8 -0
  44. package/dist/commands/list.d.ts.map +1 -0
  45. package/dist/commands/list.js +98 -0
  46. package/dist/commands/list.js.map +1 -0
  47. package/dist/commands/show.d.ts +33 -0
  48. package/dist/commands/show.d.ts.map +1 -0
  49. package/dist/commands/show.js +142 -0
  50. package/dist/commands/show.js.map +1 -0
  51. package/dist/commands/stop.d.ts +2 -0
  52. package/dist/commands/stop.d.ts.map +1 -0
  53. package/dist/commands/stop.js +10 -0
  54. package/dist/commands/stop.js.map +1 -0
  55. package/dist/config/discovery.d.ts +12 -0
  56. package/dist/config/discovery.d.ts.map +1 -0
  57. package/dist/config/discovery.js +62 -0
  58. package/dist/config/discovery.js.map +1 -0
  59. package/dist/config/gh-auth.d.ts +5 -0
  60. package/dist/config/gh-auth.d.ts.map +1 -0
  61. package/dist/config/gh-auth.js +18 -0
  62. package/dist/config/gh-auth.js.map +1 -0
  63. package/dist/config/loader.d.ts +38 -0
  64. package/dist/config/loader.d.ts.map +1 -0
  65. package/dist/config/loader.js +72 -0
  66. package/dist/config/loader.js.map +1 -0
  67. package/dist/db/client.d.ts +10 -0
  68. package/dist/db/client.d.ts.map +1 -0
  69. package/dist/db/client.js +84 -0
  70. package/dist/db/client.js.map +1 -0
  71. package/dist/db/schema.d.ts +805 -0
  72. package/dist/db/schema.d.ts.map +1 -0
  73. package/dist/db/schema.js +66 -0
  74. package/dist/db/schema.js.map +1 -0
  75. package/dist/git/git.d.ts +29 -0
  76. package/dist/git/git.d.ts.map +1 -0
  77. package/dist/git/git.js +200 -0
  78. package/dist/git/git.js.map +1 -0
  79. package/dist/index.d.ts +3 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +154 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/lifecycle.d.ts +5 -0
  84. package/dist/lifecycle.d.ts.map +1 -0
  85. package/dist/lifecycle.js +63 -0
  86. package/dist/lifecycle.js.map +1 -0
  87. package/dist/orchestrator/build-handler.d.ts +20 -0
  88. package/dist/orchestrator/build-handler.d.ts.map +1 -0
  89. package/dist/orchestrator/build-handler.js +212 -0
  90. package/dist/orchestrator/build-handler.js.map +1 -0
  91. package/dist/orchestrator/dag.d.ts +10 -0
  92. package/dist/orchestrator/dag.d.ts.map +1 -0
  93. package/dist/orchestrator/dag.js +70 -0
  94. package/dist/orchestrator/dag.js.map +1 -0
  95. package/dist/orchestrator/error-handling.d.ts +21 -0
  96. package/dist/orchestrator/error-handling.d.ts.map +1 -0
  97. package/dist/orchestrator/error-handling.js +124 -0
  98. package/dist/orchestrator/error-handling.js.map +1 -0
  99. package/dist/orchestrator/feedback-handler.d.ts +36 -0
  100. package/dist/orchestrator/feedback-handler.d.ts.map +1 -0
  101. package/dist/orchestrator/feedback-handler.js +316 -0
  102. package/dist/orchestrator/feedback-handler.js.map +1 -0
  103. package/dist/orchestrator/orchestrator.d.ts +21 -0
  104. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  105. package/dist/orchestrator/orchestrator.js +188 -0
  106. package/dist/orchestrator/orchestrator.js.map +1 -0
  107. package/dist/orchestrator/parallel-runner.d.ts +3 -0
  108. package/dist/orchestrator/parallel-runner.d.ts.map +1 -0
  109. package/dist/orchestrator/parallel-runner.js +111 -0
  110. package/dist/orchestrator/parallel-runner.js.map +1 -0
  111. package/dist/orchestrator/reviewer.d.ts +20 -0
  112. package/dist/orchestrator/reviewer.d.ts.map +1 -0
  113. package/dist/orchestrator/reviewer.js +175 -0
  114. package/dist/orchestrator/reviewer.js.map +1 -0
  115. package/dist/orchestrator/task-runner.d.ts +20 -0
  116. package/dist/orchestrator/task-runner.d.ts.map +1 -0
  117. package/dist/orchestrator/task-runner.js +122 -0
  118. package/dist/orchestrator/task-runner.js.map +1 -0
  119. package/dist/orchestrator/test-runner.d.ts +8 -0
  120. package/dist/orchestrator/test-runner.d.ts.map +1 -0
  121. package/dist/orchestrator/test-runner.js +81 -0
  122. package/dist/orchestrator/test-runner.js.map +1 -0
  123. package/dist/planner/plan-parser.d.ts +14 -0
  124. package/dist/planner/plan-parser.d.ts.map +1 -0
  125. package/dist/planner/plan-parser.js +182 -0
  126. package/dist/planner/plan-parser.js.map +1 -0
  127. package/dist/planner/planner.d.ts +9 -0
  128. package/dist/planner/planner.d.ts.map +1 -0
  129. package/dist/planner/planner.js +151 -0
  130. package/dist/planner/planner.js.map +1 -0
  131. package/dist/repl/repl.d.ts +19 -0
  132. package/dist/repl/repl.d.ts.map +1 -0
  133. package/dist/repl/repl.js +505 -0
  134. package/dist/repl/repl.js.map +1 -0
  135. package/dist/session/agent-log.d.ts +35 -0
  136. package/dist/session/agent-log.d.ts.map +1 -0
  137. package/dist/session/agent-log.js +120 -0
  138. package/dist/session/agent-log.js.map +1 -0
  139. package/dist/session/chat.d.ts +38 -0
  140. package/dist/session/chat.d.ts.map +1 -0
  141. package/dist/session/chat.js +106 -0
  142. package/dist/session/chat.js.map +1 -0
  143. package/dist/session/cost-tracker.d.ts +14 -0
  144. package/dist/session/cost-tracker.d.ts.map +1 -0
  145. package/dist/session/cost-tracker.js +61 -0
  146. package/dist/session/cost-tracker.js.map +1 -0
  147. package/dist/session/export.d.ts +2 -0
  148. package/dist/session/export.d.ts.map +1 -0
  149. package/dist/session/export.js +105 -0
  150. package/dist/session/export.js.map +1 -0
  151. package/dist/session/in-session-commands.d.ts +7 -0
  152. package/dist/session/in-session-commands.d.ts.map +1 -0
  153. package/dist/session/in-session-commands.js +227 -0
  154. package/dist/session/in-session-commands.js.map +1 -0
  155. package/dist/session/interactive.d.ts +37 -0
  156. package/dist/session/interactive.d.ts.map +1 -0
  157. package/dist/session/interactive.js +226 -0
  158. package/dist/session/interactive.js.map +1 -0
  159. package/dist/session/manager.d.ts +63 -0
  160. package/dist/session/manager.d.ts.map +1 -0
  161. package/dist/session/manager.js +229 -0
  162. package/dist/session/manager.js.map +1 -0
  163. package/dist/session/resume.d.ts +7 -0
  164. package/dist/session/resume.d.ts.map +1 -0
  165. package/dist/session/resume.js +53 -0
  166. package/dist/session/resume.js.map +1 -0
  167. package/dist/session/state-machine.d.ts +4 -0
  168. package/dist/session/state-machine.d.ts.map +1 -0
  169. package/dist/session/state-machine.js +47 -0
  170. package/dist/session/state-machine.js.map +1 -0
  171. package/dist/tui/chat-ui.d.ts +16 -0
  172. package/dist/tui/chat-ui.d.ts.map +1 -0
  173. package/dist/tui/chat-ui.js +19 -0
  174. package/dist/tui/chat-ui.js.map +1 -0
  175. package/dist/tui/dashboard.d.ts +17 -0
  176. package/dist/tui/dashboard.d.ts.map +1 -0
  177. package/dist/tui/dashboard.js +57 -0
  178. package/dist/tui/dashboard.js.map +1 -0
  179. package/dist/tui/session-list.d.ts +18 -0
  180. package/dist/tui/session-list.d.ts.map +1 -0
  181. package/dist/tui/session-list.js +26 -0
  182. package/dist/tui/session-list.js.map +1 -0
  183. package/dist/ui/agent-panel.d.ts +9 -0
  184. package/dist/ui/agent-panel.d.ts.map +1 -0
  185. package/dist/ui/agent-panel.js +100 -0
  186. package/dist/ui/agent-panel.js.map +1 -0
  187. package/dist/ui/banner.d.ts +10 -0
  188. package/dist/ui/banner.d.ts.map +1 -0
  189. package/dist/ui/banner.js +100 -0
  190. package/dist/ui/banner.js.map +1 -0
  191. package/dist/ui/markdown.d.ts +19 -0
  192. package/dist/ui/markdown.d.ts.map +1 -0
  193. package/dist/ui/markdown.js +174 -0
  194. package/dist/ui/markdown.js.map +1 -0
  195. package/dist/ui/prompt.d.ts +24 -0
  196. package/dist/ui/prompt.d.ts.map +1 -0
  197. package/dist/ui/prompt.js +226 -0
  198. package/dist/ui/prompt.js.map +1 -0
  199. package/dist/utils/time.d.ts +3 -0
  200. package/dist/utils/time.d.ts.map +1 -0
  201. package/dist/utils/time.js +29 -0
  202. package/dist/utils/time.js.map +1 -0
  203. package/drizzle/migrations/0000_naive_human_fly.sql +56 -0
  204. package/drizzle/migrations/meta/0000_snapshot.json +395 -0
  205. package/drizzle/migrations/meta/_journal.json +13 -0
  206. package/package.json +70 -0
@@ -0,0 +1,100 @@
1
+ import chalk from "chalk";
2
+ import { MarkdownRenderer } from "./markdown.js";
3
+ const border = chalk.blue;
4
+ const iconRunning = chalk.blue("▶");
5
+ const iconDone = chalk.green("✓");
6
+ const iconFailed = chalk.red("✗");
7
+ export class AgentPanel {
8
+ slots = new Map();
9
+ activeId = null;
10
+ addAgent(id, role, taskId, taskTitle) {
11
+ const label = `${role} ─ ${taskId}: ${taskTitle}`;
12
+ const slot = {
13
+ id,
14
+ label,
15
+ role,
16
+ status: "running",
17
+ midLine: false,
18
+ lineBuffer: "",
19
+ renderer: new MarkdownRenderer(),
20
+ };
21
+ this.slots.set(id, slot);
22
+ this.activeId = id;
23
+ // Print header
24
+ process.stdout.write(`${iconRunning} ${label}\n`);
25
+ process.stdout.write(border("─".repeat(Math.min(process.stdout.columns || 80, 80))) + "\n");
26
+ }
27
+ appendOutput(id, chunk) {
28
+ const slot = this.slots.get(id);
29
+ if (!slot || slot.status !== "running")
30
+ return;
31
+ const prefix = border("│ ");
32
+ let i = 0;
33
+ while (i < chunk.length) {
34
+ const nlIdx = chunk.indexOf("\n", i);
35
+ if (nlIdx === -1) {
36
+ // No newline remaining — show immediately for streaming feel
37
+ const segment = chunk.slice(i);
38
+ if (segment.length > 0) {
39
+ slot.lineBuffer += segment;
40
+ if (!slot.midLine) {
41
+ process.stdout.write(prefix);
42
+ }
43
+ process.stdout.write(segment);
44
+ slot.midLine = true;
45
+ }
46
+ break;
47
+ }
48
+ // Complete line available
49
+ const segment = chunk.slice(i, nlIdx).replace(/\r$/, "");
50
+ const fullLine = slot.lineBuffer + segment;
51
+ // Always pass through renderer to keep state (code block tracking) in sync
52
+ const renderedLines = slot.renderer.renderLine(fullLine);
53
+ if (slot.midLine) {
54
+ // Already showed partial content raw — just finish the line
55
+ process.stdout.write(segment + "\n");
56
+ }
57
+ else {
58
+ // Full line arrived at once — show the markdown-rendered version(s)
59
+ for (const rl of renderedLines) {
60
+ process.stdout.write(prefix + rl + "\n");
61
+ }
62
+ }
63
+ slot.lineBuffer = "";
64
+ slot.midLine = false;
65
+ i = nlIdx + 1;
66
+ }
67
+ }
68
+ completeAgent(id, success) {
69
+ const slot = this.slots.get(id);
70
+ if (!slot)
71
+ return;
72
+ slot.status = success ? "done" : "failed";
73
+ // Flush any partial line
74
+ if (slot.midLine || slot.lineBuffer) {
75
+ process.stdout.write("\n");
76
+ slot.lineBuffer = "";
77
+ slot.midLine = false;
78
+ }
79
+ // Flush any buffered table rows
80
+ const remaining = slot.renderer.flush();
81
+ if (remaining.length > 0) {
82
+ const prefix = border("│ ");
83
+ for (const rl of remaining) {
84
+ process.stdout.write(prefix + rl + "\n");
85
+ }
86
+ }
87
+ // Print footer
88
+ const icon = success ? iconDone : iconFailed;
89
+ const verb = success ? "completed" : "failed";
90
+ process.stdout.write(`${icon} ${slot.role} ${verb}\n\n`);
91
+ if (this.activeId === id) {
92
+ this.activeId = null;
93
+ }
94
+ }
95
+ destroy() {
96
+ this.slots.clear();
97
+ this.activeId = null;
98
+ }
99
+ }
100
+ //# sourceMappingURL=agent-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-panel.js","sourceRoot":"","sources":["../../src/ui/agent-panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Visible length of a string after stripping ANSI escape codes. */
2
+ export declare function vLen(s: string): number;
3
+ /** Pad string to `w` visible characters (right-pad with spaces). */
4
+ export declare function rPad(s: string, w: number): string;
5
+ export interface RecentSession {
6
+ id: string;
7
+ goal: string;
8
+ }
9
+ export declare function renderBanner(sessions?: RecentSession[]): string;
10
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"AAiBA,oEAAoE;AACpE,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtC;AAED,oEAAoE;AACpE,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjD;AAWD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,QAAQ,GAAE,aAAa,EAAO,GAAG,MAAM,CA6EnE"}
@@ -0,0 +1,100 @@
1
+ import chalk from "chalk";
2
+ import os from "os";
3
+ import { createRequire } from "module";
4
+ const require = createRequire(import.meta.url);
5
+ const pkg = require("../../package.json");
6
+ const VERSION = pkg.version;
7
+ // ── Blue theme palette ──────────────────────────────────────────────
8
+ const border = chalk.blue;
9
+ const accent = chalk.blueBright;
10
+ const title = chalk.bold.blueBright;
11
+ const dim = chalk.dim;
12
+ const cmd = chalk.cyanBright;
13
+ // ── Helpers ─────────────────────────────────────────────────────────
14
+ /** Visible length of a string after stripping ANSI escape codes. */
15
+ export function vLen(s) {
16
+ // eslint-disable-next-line no-control-regex
17
+ return s.replace(/\x1b\[[0-9;]*m/g, "").length;
18
+ }
19
+ /** Pad string to `w` visible characters (right-pad with spaces). */
20
+ export function rPad(s, w) {
21
+ const diff = w - vLen(s);
22
+ return diff > 0 ? s + " ".repeat(diff) : s;
23
+ }
24
+ /** Shorten cwd by replacing homedir with ~. */
25
+ function shortCwd() {
26
+ const cwd = process.cwd();
27
+ const home = os.homedir();
28
+ return cwd.startsWith(home) ? "~" + cwd.slice(home.length) : cwd;
29
+ }
30
+ export function renderBanner(sessions = []) {
31
+ const termW = process.stdout.columns || 80;
32
+ // Box outer width = termW - 1 (leave 1 col margin to avoid terminal wrap)
33
+ // Inner = outer - 2 (left + right border)
34
+ // Inner splits into left | divider | right → LW + 1 + RW = IW
35
+ const IW = Math.max(termW - 3, 60); // -3: left border + right border + margin
36
+ const LW = Math.min(44, Math.floor(IW * 0.4));
37
+ const RW = IW - 1 - LW; // remaining goes to right
38
+ // ── Mascot (from README, blue-styled) ──
39
+ const mascot = [
40
+ accent(" ┌─────────────────┐"),
41
+ accent(" │") + " ◉ ◉ " + accent("│"),
42
+ accent(" │") + " ───────── " + accent("│"),
43
+ accent(" └─────────────────┘"),
44
+ ];
45
+ // ── Left column ──
46
+ const left = [
47
+ "",
48
+ title(" Welcome to sweteam!"),
49
+ "",
50
+ ...mascot.map((l) => " " + l),
51
+ "",
52
+ dim(` Orchestrator · v${VERSION}`),
53
+ dim(" " + shortCwd()),
54
+ "",
55
+ ];
56
+ // ── Right column ──
57
+ const maxCmdPad = Math.max(RW - 30, 4);
58
+ const right = [
59
+ "",
60
+ title(" Getting started"),
61
+ " " + cmd("/create") + dim(" [repo]") + " ".repeat(Math.max(maxCmdPad - 6, 1)) + "Start a new session",
62
+ " " + cmd("/list") + " ".repeat(Math.max(maxCmdPad + 5, 1)) + "See all sessions",
63
+ " " + cmd("/enter") + dim(" <id>") + " ".repeat(Math.max(maxCmdPad - 3, 1)) + "Resume a session",
64
+ " " + dim("─".repeat(Math.max(RW - 4, 10))),
65
+ title(" Recent sessions"),
66
+ ];
67
+ if (sessions.length > 0) {
68
+ const maxGoal = RW - 16;
69
+ for (const s of sessions.slice(0, 3)) {
70
+ const g = s.goal.length > maxGoal ? s.goal.slice(0, maxGoal - 1) + "…" : s.goal;
71
+ right.push(" " + dim(s.id.slice(0, 12)) + " " + g);
72
+ }
73
+ }
74
+ else {
75
+ right.push(" " + dim("No recent sessions"));
76
+ }
77
+ right.push("");
78
+ // ── Equalise row count ──
79
+ const h = Math.max(left.length, right.length);
80
+ while (left.length < h)
81
+ left.push("");
82
+ while (right.length < h)
83
+ right.push("");
84
+ // ── Assemble box ──
85
+ const label = ` sweteam v${VERSION} `;
86
+ const topDashes = Math.max(IW - 3 - label.length, 0);
87
+ const top = border("╭───") + title(label) + border("─".repeat(topDashes)) + border("╮");
88
+ const bot = border("╰" + "─".repeat(IW) + "╯");
89
+ const rows = [top];
90
+ for (let i = 0; i < h; i++) {
91
+ rows.push(border("│") +
92
+ rPad(left[i], LW) +
93
+ border("│") +
94
+ rPad(right[i], RW) +
95
+ border("│"));
96
+ }
97
+ rows.push(bot);
98
+ return rows.join("\n");
99
+ }
100
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Streaming-friendly markdown renderer for terminal output.
3
+ * Processes one line at a time, tracking state across lines
4
+ * (e.g. code block boundaries, table accumulation).
5
+ */
6
+ export declare class MarkdownRenderer {
7
+ private inCodeBlock;
8
+ private tableBuffer;
9
+ /**
10
+ * Render a single input line. Returns an array of rendered lines.
11
+ * May return an empty array when buffering table rows (the table
12
+ * is emitted once a non-table line arrives or flush() is called).
13
+ */
14
+ renderLine(line: string): string[];
15
+ /** Flush any buffered table rows. Call when agent output ends. */
16
+ flush(): string[];
17
+ private flushTable;
18
+ }
19
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/ui/markdown.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAgB;IAEnC;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAiElC,kEAAkE;IAClE,KAAK,IAAI,MAAM,EAAE;IAIjB,OAAO,CAAC,UAAU;CAMnB"}
@@ -0,0 +1,174 @@
1
+ import chalk from "chalk";
2
+ /**
3
+ * Streaming-friendly markdown renderer for terminal output.
4
+ * Processes one line at a time, tracking state across lines
5
+ * (e.g. code block boundaries, table accumulation).
6
+ */
7
+ export class MarkdownRenderer {
8
+ inCodeBlock = false;
9
+ tableBuffer = [];
10
+ /**
11
+ * Render a single input line. Returns an array of rendered lines.
12
+ * May return an empty array when buffering table rows (the table
13
+ * is emitted once a non-table line arrives or flush() is called).
14
+ */
15
+ renderLine(line) {
16
+ // Code block toggle: ```lang or ```
17
+ if (/^\s*```/.test(line)) {
18
+ const flushed = this.flushTable();
19
+ this.inCodeBlock = !this.inCodeBlock;
20
+ if (this.inCodeBlock) {
21
+ const lang = line.replace(/^\s*```/, "").trim();
22
+ const label = lang ? ` ${lang} ` : "";
23
+ const ruleLen = Math.max(0, 40 - label.length);
24
+ return [...flushed, chalk.dim(` ${"─".repeat(2)}${label}${"─".repeat(ruleLen)}`)];
25
+ }
26
+ return [...flushed, chalk.dim(` ${"─".repeat(42)}`)];
27
+ }
28
+ // Inside code block — show dimmed with a gutter
29
+ if (this.inCodeBlock) {
30
+ return [chalk.dim(` ${line}`)];
31
+ }
32
+ // Table row: buffer lines that look like | … | for batch rendering
33
+ if (isTableRow(line)) {
34
+ this.tableBuffer.push(line);
35
+ return [];
36
+ }
37
+ // Non-table line — flush any buffered table first
38
+ const flushed = this.flushTable();
39
+ // Heading: # … through ######
40
+ const headerMatch = line.match(/^(#{1,6})\s+(.*)/);
41
+ if (headerMatch) {
42
+ const level = headerMatch[1].length;
43
+ const text = renderInline(headerMatch[2]);
44
+ if (level === 1)
45
+ return [...flushed, "\n" + chalk.bold.underline(text)];
46
+ if (level === 2)
47
+ return [...flushed, "\n" + chalk.bold(text)];
48
+ return [...flushed, chalk.bold(text)];
49
+ }
50
+ // Horizontal rule: --- / *** / ___
51
+ if (/^\s*[-*_]{3,}\s*$/.test(line)) {
52
+ return [...flushed, chalk.dim("─".repeat(40))];
53
+ }
54
+ // Blockquote: > text
55
+ const bqMatch = line.match(/^>\s?(.*)/);
56
+ if (bqMatch) {
57
+ return [...flushed, chalk.dim(" │ ") + renderInline(bqMatch[1])];
58
+ }
59
+ // Unordered list item: - / * / + followed by space
60
+ const ulMatch = line.match(/^(\s*)[-*+]\s+(.*)/);
61
+ if (ulMatch) {
62
+ return [...flushed, `${ulMatch[1]} ${chalk.dim("•")} ${renderInline(ulMatch[2])}`];
63
+ }
64
+ // Ordered list item: 1. text
65
+ const olMatch = line.match(/^(\s*)(\d+)\.\s+(.*)/);
66
+ if (olMatch) {
67
+ return [...flushed, `${olMatch[1]} ${chalk.dim(olMatch[2] + ".")} ${renderInline(olMatch[3])}`];
68
+ }
69
+ // Regular line — just apply inline formatting
70
+ return [...flushed, renderInline(line)];
71
+ }
72
+ /** Flush any buffered table rows. Call when agent output ends. */
73
+ flush() {
74
+ return this.flushTable();
75
+ }
76
+ flushTable() {
77
+ if (this.tableBuffer.length === 0)
78
+ return [];
79
+ const lines = renderTable(this.tableBuffer);
80
+ this.tableBuffer = [];
81
+ return lines;
82
+ }
83
+ }
84
+ /* ── Table helpers ─────────────────────────────────────────────── */
85
+ function isTableRow(line) {
86
+ const trimmed = line.trim();
87
+ // Must contain pipes and start/end with a pipe (standard markdown table row)
88
+ return /^\|.*\|$/.test(trimmed) && trimmed.length > 2;
89
+ }
90
+ function isSeparatorRow(line) {
91
+ return /^\s*\|[\s:|-]+\|\s*$/.test(line);
92
+ }
93
+ function parseCells(line) {
94
+ const cells = line.trim().split("|").map((c) => c.trim());
95
+ if (cells.length > 0 && cells[0] === "")
96
+ cells.shift();
97
+ if (cells.length > 0 && cells[cells.length - 1] === "")
98
+ cells.pop();
99
+ return cells;
100
+ }
101
+ function renderTable(bufferedLines) {
102
+ // Separate header and data rows (skip separator rows)
103
+ const rows = [];
104
+ for (const line of bufferedLines) {
105
+ if (isSeparatorRow(line))
106
+ continue;
107
+ const cells = parseCells(line);
108
+ if (cells.length > 0)
109
+ rows.push(cells);
110
+ }
111
+ if (rows.length === 0)
112
+ return bufferedLines; // fallback to raw lines
113
+ // Normalise column count
114
+ const maxCols = Math.max(...rows.map((r) => r.length));
115
+ for (const row of rows) {
116
+ while (row.length < maxCols)
117
+ row.push("");
118
+ }
119
+ // Calculate column widths, capped at 30 visible chars
120
+ const MAX_COL = 30;
121
+ const colW = new Array(maxCols).fill(0);
122
+ for (const row of rows) {
123
+ for (let j = 0; j < maxCols; j++) {
124
+ colW[j] = Math.min(MAX_COL, Math.max(colW[j], row[j].length));
125
+ }
126
+ }
127
+ const dim = chalk.dim;
128
+ const pad = (s, w) => {
129
+ if (s.length > w)
130
+ return s.slice(0, w - 1) + "…";
131
+ return s.padEnd(w);
132
+ };
133
+ const out = [];
134
+ // Top border: ┌──┬──┐
135
+ out.push(dim(" ┌" + colW.map((w) => "─".repeat(w + 2)).join("┬") + "┐"));
136
+ for (let i = 0; i < rows.length; i++) {
137
+ const cells = rows[i].map((c, j) => {
138
+ const content = pad(c, colW[j]);
139
+ // First row is the header — render bold
140
+ return i === 0 ? chalk.bold(content) : renderInline(content);
141
+ });
142
+ out.push(dim(" │") + cells.map((c) => ` ${c} `).join(dim("│")) + dim("│"));
143
+ // Separator after header: ├──┼──┤
144
+ if (i === 0) {
145
+ out.push(dim(" ├" + colW.map((w) => "─".repeat(w + 2)).join("┼") + "┤"));
146
+ }
147
+ }
148
+ // Bottom border: └──┴──┘
149
+ out.push(dim(" └" + colW.map((w) => "─".repeat(w + 2)).join("┴") + "┘"));
150
+ return out;
151
+ }
152
+ /* ── Inline formatting ─────────────────────────────────────────── */
153
+ /**
154
+ * Apply inline markdown formatting to a single line of text.
155
+ * Order matters: code spans first (to protect their contents),
156
+ * then bold, then italic.
157
+ */
158
+ function renderInline(text) {
159
+ // Protect inline code spans from other transforms
160
+ const codeSpans = [];
161
+ text = text.replace(/`([^`]+)`/g, (_, code) => {
162
+ codeSpans.push(chalk.cyan(code));
163
+ return `\x00C${codeSpans.length - 1}\x00`;
164
+ });
165
+ // Bold: **text** or __text__
166
+ text = text.replace(/\*\*(.+?)\*\*/g, (_, p1) => chalk.bold(p1));
167
+ text = text.replace(/__(.+?)__/g, (_, p1) => chalk.bold(p1));
168
+ // Italic: *text* (single asterisk, not preceded/followed by *)
169
+ text = text.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g, (_, p1) => chalk.italic(p1));
170
+ // Restore protected code spans
171
+ text = text.replace(/\x00C(\d+)\x00/g, (_, idx) => codeSpans[parseInt(idx)]);
172
+ return text;
173
+ }
174
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/ui/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Interactive prompt with dropdown autocomplete and ghost-text.
3
+ *
4
+ * When completions are available, a dropdown list renders below the
5
+ * prompt line. The user can navigate with Up/Down arrows and accept
6
+ * with Tab. Ghost text (fish-shell style) also shows the highlighted
7
+ * match inline.
8
+ *
9
+ * - Tab Accept the highlighted suggestion
10
+ * - Up/Down Navigate the dropdown
11
+ * - Right arrow Accept one ghost character (fish-style)
12
+ * - Enter Submit the current input
13
+ * - Escape Dismiss the dropdown
14
+ * - Ctrl-C Exit
15
+ */
16
+ /** Sentinel value returned by promptLine when the user presses Escape to back out. */
17
+ export declare const ESCAPE_SIGNAL = "\u001B__ESCAPE__";
18
+ export interface PromptOptions {
19
+ prompt: string;
20
+ /** Returns matching completions for the current input. */
21
+ getCompletions: (input: string) => string[];
22
+ }
23
+ export declare function promptLine(opts: PromptOptions): Promise<string>;
24
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/ui/prompt.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AAEH,sFAAsF;AACtF,eAAO,MAAM,aAAa,qBAAmB,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CAC7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAwO/D"}