@synergenius/flow-weaver-pack-weaver 0.9.4 → 0.9.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-core.d.ts","sourceRoot":"","sources":["../../src/bot/assistant-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,cAAc,EACnB,KAAK,YAAY,EAElB,MAAM,gCAAgC,CAAC;AAMxC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAkCD,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwKxE"}
1
+ {"version":3,"file":"assistant-core.d.ts","sourceRoot":"","sources":["../../src/bot/assistant-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,cAAc,EACnB,KAAK,YAAY,EAElB,MAAM,gCAAgC,CAAC;AAMxC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAkCD,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsMxE"}
@@ -7,7 +7,8 @@
7
7
  * - CLI provider: tools handled internally via MCP bridge (tool_result events)
8
8
  * - API provider: tools collected and executed manually (tool_use_start/end events)
9
9
  */
10
- import * as readline from 'node:readline';
10
+ import * as path from 'node:path';
11
+ import * as os from 'node:os';
11
12
  import { runAgentLoop, } from '@synergenius/flow-weaver/agent';
12
13
  import { c } from './ansi.js';
13
14
  import { VERBOSE_TOOL_NAMES } from './tool-registry.js';
@@ -98,21 +99,26 @@ export async function runAssistant(opts) {
98
99
  else {
99
100
  out(` ${c.dim(`Conversation: ${conversation.id}`)}\n`);
100
101
  }
101
- out(` ${c.dim('Type your request. Ctrl+C to exit.')}\n\n`);
102
- // Input source
103
- const rl = opts.inputMessages
104
- ? null
105
- : readline.createInterface({ input: process.stdin, output: process.stderr, prompt: `${c.cyan('')} ` });
102
+ out(` ${c.dim('Type your request. Ctrl+C to exit. /help for commands.')}\n\n`);
103
+ // Rich input with history, arrows, tab completion, slash commands
104
+ const { RichInput } = await import('./rich-input.js');
105
+ const { getSlashCompletions, handleSlashCommand } = await import('./slash-commands.js');
106
+ const { formatResponse } = await import('./response-formatter.js');
107
+ const richInput = opts.inputMessages ? null : new RichInput({
108
+ historyFile: path.join(os.homedir(), '.weaver', 'input-history.txt'),
109
+ prompt: `${c.cyan('❯')} `,
110
+ completionProvider: (partial) => {
111
+ if (partial.startsWith('/'))
112
+ return getSlashCompletions(partial);
113
+ return [];
114
+ },
115
+ });
106
116
  const getNextInput = opts.inputMessages
107
117
  ? (() => {
108
118
  let i = 0;
109
119
  return () => Promise.resolve(opts.inputMessages[i++] ?? null);
110
120
  })()
111
- : () => new Promise((resolve) => {
112
- rl.prompt();
113
- rl.once('line', (line) => resolve(line.trim() || null));
114
- rl.once('close', () => resolve(null));
115
- });
121
+ : () => richInput.getInput();
116
122
  const onStreamEvent = (event) => {
117
123
  if (event.type === 'text_delta') {
118
124
  out(event.text);
@@ -140,14 +146,37 @@ export async function runAssistant(opts) {
140
146
  }
141
147
  }
142
148
  };
149
+ // Slash command context
150
+ let shouldExit = false;
151
+ const slashCtx = {
152
+ executor,
153
+ out,
154
+ projectDir,
155
+ conversationId: conversation.id,
156
+ onClear: () => { history.length = 0; },
157
+ onExit: () => { shouldExit = true; },
158
+ onNew: () => { history.length = 0; conversation = store.create(projectDir); },
159
+ onVerbose: () => { out(` ${c.dim('Verbose toggling not yet wired to streaming.')}\n`); },
160
+ };
143
161
  // Main conversation loop
144
- while (true) {
162
+ while (!shouldExit) {
145
163
  const input = await getNextInput();
146
164
  if (input === null)
147
165
  break;
148
166
  if (!input.trim())
149
167
  continue;
168
+ // Handle slash commands
169
+ if (input.startsWith('/')) {
170
+ const handled = await handleSlashCommand(input, slashCtx);
171
+ if (handled)
172
+ continue;
173
+ // Unknown slash command — tell user
174
+ out(` ${c.dim('Unknown command. Type /help for available commands.')}\n\n`);
175
+ continue;
176
+ }
150
177
  out('\n');
178
+ // Reset Ctrl+C counter after successful input
179
+ richInput?.resetCtrlC();
151
180
  // Add user message to history
152
181
  history.push({ role: 'user', content: input });
153
182
  try {
@@ -193,7 +222,7 @@ export async function runAssistant(opts) {
193
222
  }
194
223
  out('\n');
195
224
  }
196
- rl?.close();
225
+ richInput?.destroy();
197
226
  out(`\n ${c.dim('Goodbye.')}\n\n`);
198
227
  }
199
228
  function toolPreview(name, args) {
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-core.js","sourceRoot":"","sources":["../../src/bot/assistant-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assistant-core.js","sourceRoot":"","sources":["../../src/bot/assistant-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Highlight code blocks in streamed text.
3
+ * Detects ```lang ... ``` patterns and applies dim styling.
4
+ */
5
+ export declare function highlightCodeBlocks(text: string): string;
6
+ /**
7
+ * Make file paths clickable using OSC 8 terminal hyperlinks.
8
+ * Only active when terminal supports it.
9
+ */
10
+ export declare function linkifyPaths(text: string, cwd: string): string;
11
+ /**
12
+ * Format a full response — apply all formatting passes.
13
+ */
14
+ export declare function formatResponse(text: string, cwd: string): string;
15
+ //# sourceMappingURL=response-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-formatter.d.ts","sourceRoot":"","sources":["../../src/bot/response-formatter.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKhE"}
@@ -0,0 +1,40 @@
1
+ import * as path from 'node:path';
2
+ import { c } from './ansi.js';
3
+ /**
4
+ * Highlight code blocks in streamed text.
5
+ * Detects ```lang ... ``` patterns and applies dim styling.
6
+ */
7
+ export function highlightCodeBlocks(text) {
8
+ return text.replace(/```(\w+)?\n([\s\S]*?)```/g, (_, lang, code) => {
9
+ const header = lang ? ` ${c.cyan(`[${lang}]`)}\n` : '';
10
+ return `${header}${c.dim(code)}`;
11
+ });
12
+ }
13
+ /**
14
+ * Make file paths clickable using OSC 8 terminal hyperlinks.
15
+ * Only active when terminal supports it.
16
+ */
17
+ export function linkifyPaths(text, cwd) {
18
+ if (!supportsHyperlinks())
19
+ return text;
20
+ return text.replace(/\b((?:src|tests|lib|dist)\/[\w/.-]+\.(?:ts|js|json|md))\b/g, (match) => {
21
+ const abs = path.resolve(cwd, match);
22
+ return `\x1b]8;;file://${abs}\x07${match}\x1b]8;;\x07`;
23
+ });
24
+ }
25
+ /**
26
+ * Format a full response — apply all formatting passes.
27
+ */
28
+ export function formatResponse(text, cwd) {
29
+ let result = text;
30
+ result = highlightCodeBlocks(result);
31
+ result = linkifyPaths(result, cwd);
32
+ return result;
33
+ }
34
+ function supportsHyperlinks() {
35
+ const term = process.env.TERM_PROGRAM ?? '';
36
+ // Known terminals that support OSC 8
37
+ return ['iTerm.app', 'WezTerm', 'vscode', 'Hyper'].includes(term)
38
+ || !!process.env.TERM_PROGRAM_VERSION; // Most modern terminals
39
+ }
40
+ //# sourceMappingURL=response-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-formatter.js","sourceRoot":"","sources":["../../src/bot/response-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,WAAW,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,GAAW;IACpD,IAAI,CAAC,kBAAkB,EAAE;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,4DAA4D,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,kBAAkB,GAAG,OAAO,KAAK,cAAc,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAW;IACtD,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAC5C,qCAAqC;IACrC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;WAC5D,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,wBAAwB;AACnE,CAAC"}
@@ -0,0 +1,39 @@
1
+ export interface RichInputOptions {
2
+ historyFile?: string;
3
+ prompt?: string;
4
+ completionProvider?: (partial: string) => string[];
5
+ maxHistorySize?: number;
6
+ }
7
+ export declare class RichInput {
8
+ private history;
9
+ private historyIndex;
10
+ private currentLine;
11
+ private cursorPos;
12
+ private multiLineBuffer;
13
+ private searchMode;
14
+ private searchQuery;
15
+ private ctrlCCount;
16
+ private prompt;
17
+ private historyFile;
18
+ private completionProvider?;
19
+ private maxHistory;
20
+ constructor(opts?: RichInputOptions);
21
+ getInput(): Promise<string | null>;
22
+ resetCtrlC(): void;
23
+ private handleKey;
24
+ private handleEnter;
25
+ private isIncomplete;
26
+ private historyUp;
27
+ private historyDown;
28
+ private handleTab;
29
+ private handleSearchKey;
30
+ private searchHistory;
31
+ private renderPrompt;
32
+ private renderSearchPrompt;
33
+ private addToHistory;
34
+ private loadHistory;
35
+ private saveHistory;
36
+ private getInputReadline;
37
+ destroy(): void;
38
+ }
39
+ //# sourceMappingURL=rich-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-input.d.ts","sourceRoot":"","sources":["../../src/bot/rich-input.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACnD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,kBAAkB,CAAC,CAAgC;IAC3D,OAAO,CAAC,UAAU,CAAS;gBAEf,IAAI,GAAE,gBAAqB;IAQjC,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA8BxC,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,SAAS;IAgFjB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;YAQL,gBAAgB;IAS9B,OAAO,IAAI,IAAI;CAKhB"}
@@ -0,0 +1,308 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ import * as readline from 'node:readline';
5
+ export class RichInput {
6
+ history = [];
7
+ historyIndex = -1;
8
+ currentLine = '';
9
+ cursorPos = 0;
10
+ multiLineBuffer = [];
11
+ searchMode = false;
12
+ searchQuery = '';
13
+ ctrlCCount = 0;
14
+ prompt;
15
+ historyFile;
16
+ completionProvider;
17
+ maxHistory;
18
+ constructor(opts = {}) {
19
+ this.prompt = opts.prompt ?? '❯ ';
20
+ this.historyFile = opts.historyFile ?? path.join(os.homedir(), '.weaver', 'input-history.txt');
21
+ this.completionProvider = opts.completionProvider;
22
+ this.maxHistory = opts.maxHistorySize ?? 500;
23
+ this.loadHistory();
24
+ }
25
+ async getInput() {
26
+ // Non-TTY fallback
27
+ if (!process.stdin.isTTY) {
28
+ return this.getInputReadline();
29
+ }
30
+ return new Promise((resolve) => {
31
+ this.ctrlCCount = 0;
32
+ this.historyIndex = -1;
33
+ this.currentLine = '';
34
+ this.cursorPos = 0;
35
+ this.searchMode = false;
36
+ process.stdin.setRawMode(true);
37
+ process.stdin.resume();
38
+ const handler = (key) => {
39
+ this.handleKey(key, (result) => {
40
+ process.stdin.setRawMode(false);
41
+ process.stdin.pause();
42
+ process.stdin.removeListener('data', handler);
43
+ resolve(result);
44
+ });
45
+ };
46
+ process.stdin.on('data', handler);
47
+ this.renderPrompt();
48
+ });
49
+ }
50
+ resetCtrlC() {
51
+ this.ctrlCCount = 0;
52
+ }
53
+ handleKey(key, resolve) {
54
+ const s = key.toString();
55
+ // Handle search mode separately
56
+ if (this.searchMode) {
57
+ this.handleSearchKey(s, resolve);
58
+ return;
59
+ }
60
+ if (s === '\r' || s === '\n') {
61
+ this.handleEnter(resolve);
62
+ }
63
+ else if (s === '\x03') { // Ctrl+C
64
+ this.ctrlCCount++;
65
+ if (this.ctrlCCount >= 2 || this.currentLine === '') {
66
+ process.stderr.write('\n');
67
+ resolve(null);
68
+ }
69
+ else {
70
+ this.currentLine = '';
71
+ this.cursorPos = 0;
72
+ process.stderr.write('\n');
73
+ this.renderPrompt();
74
+ }
75
+ }
76
+ else if (s === '\x0c') { // Ctrl+L
77
+ process.stderr.write('\x1b[2J\x1b[H'); // clear screen + move to top
78
+ this.renderPrompt();
79
+ }
80
+ else if (s === '\x12') { // Ctrl+R
81
+ this.searchMode = true;
82
+ this.searchQuery = '';
83
+ this.renderSearchPrompt();
84
+ }
85
+ else if (s === '\x09') { // Tab
86
+ this.handleTab();
87
+ }
88
+ else if (s === '\x1b[A') { // Arrow Up
89
+ this.historyUp();
90
+ }
91
+ else if (s === '\x1b[B') { // Arrow Down
92
+ this.historyDown();
93
+ }
94
+ else if (s === '\x1b[C') { // Arrow Right
95
+ if (this.cursorPos < this.currentLine.length) {
96
+ this.cursorPos++;
97
+ process.stderr.write('\x1b[C');
98
+ }
99
+ }
100
+ else if (s === '\x1b[D') { // Arrow Left
101
+ if (this.cursorPos > 0) {
102
+ this.cursorPos--;
103
+ process.stderr.write('\x1b[D');
104
+ }
105
+ }
106
+ else if (s === '\x7f' || s === '\b') { // Backspace
107
+ if (this.cursorPos > 0) {
108
+ this.currentLine = this.currentLine.slice(0, this.cursorPos - 1) + this.currentLine.slice(this.cursorPos);
109
+ this.cursorPos--;
110
+ this.renderPrompt();
111
+ }
112
+ }
113
+ else if (s === '\x1b[3~') { // Delete
114
+ if (this.cursorPos < this.currentLine.length) {
115
+ this.currentLine = this.currentLine.slice(0, this.cursorPos) + this.currentLine.slice(this.cursorPos + 1);
116
+ this.renderPrompt();
117
+ }
118
+ }
119
+ else if (s === '\x01') { // Ctrl+A (home)
120
+ this.cursorPos = 0;
121
+ this.renderPrompt();
122
+ }
123
+ else if (s === '\x05') { // Ctrl+E (end)
124
+ this.cursorPos = this.currentLine.length;
125
+ this.renderPrompt();
126
+ }
127
+ else if (s === '\x15') { // Ctrl+U (clear line)
128
+ this.currentLine = '';
129
+ this.cursorPos = 0;
130
+ this.renderPrompt();
131
+ }
132
+ else if (s >= ' ' && s.length === 1) { // Printable
133
+ this.ctrlCCount = 0;
134
+ this.currentLine = this.currentLine.slice(0, this.cursorPos) + s + this.currentLine.slice(this.cursorPos);
135
+ this.cursorPos++;
136
+ this.renderPrompt();
137
+ }
138
+ else if (s.length > 1 && !s.startsWith('\x1b')) {
139
+ // Pasted text (multiple chars at once)
140
+ this.ctrlCCount = 0;
141
+ this.currentLine = this.currentLine.slice(0, this.cursorPos) + s + this.currentLine.slice(this.cursorPos);
142
+ this.cursorPos += s.length;
143
+ this.renderPrompt();
144
+ }
145
+ }
146
+ handleEnter(resolve) {
147
+ const fullLine = this.multiLineBuffer.length > 0
148
+ ? [...this.multiLineBuffer, this.currentLine].join('\n')
149
+ : this.currentLine;
150
+ // Check for multi-line continuation
151
+ if (this.isIncomplete(fullLine)) {
152
+ this.multiLineBuffer.push(this.currentLine);
153
+ this.currentLine = '';
154
+ this.cursorPos = 0;
155
+ process.stderr.write('\n');
156
+ process.stderr.write(' ... ');
157
+ return;
158
+ }
159
+ process.stderr.write('\n');
160
+ const trimmed = fullLine.trim();
161
+ if (trimmed) {
162
+ this.addToHistory(trimmed);
163
+ }
164
+ this.multiLineBuffer = [];
165
+ this.currentLine = '';
166
+ this.cursorPos = 0;
167
+ resolve(trimmed || null);
168
+ }
169
+ isIncomplete(text) {
170
+ const backticks = (text.match(/```/g) || []).length;
171
+ if (backticks % 2 !== 0)
172
+ return true;
173
+ if (text.endsWith('\\'))
174
+ return true;
175
+ return false;
176
+ }
177
+ historyUp() {
178
+ if (this.history.length === 0)
179
+ return;
180
+ if (this.historyIndex < this.history.length - 1) {
181
+ this.historyIndex++;
182
+ this.currentLine = this.history[this.history.length - 1 - this.historyIndex];
183
+ this.cursorPos = this.currentLine.length;
184
+ this.renderPrompt();
185
+ }
186
+ }
187
+ historyDown() {
188
+ if (this.historyIndex > 0) {
189
+ this.historyIndex--;
190
+ this.currentLine = this.history[this.history.length - 1 - this.historyIndex];
191
+ this.cursorPos = this.currentLine.length;
192
+ this.renderPrompt();
193
+ }
194
+ else if (this.historyIndex === 0) {
195
+ this.historyIndex = -1;
196
+ this.currentLine = '';
197
+ this.cursorPos = 0;
198
+ this.renderPrompt();
199
+ }
200
+ }
201
+ handleTab() {
202
+ if (!this.completionProvider)
203
+ return;
204
+ const candidates = this.completionProvider(this.currentLine);
205
+ if (candidates.length === 0)
206
+ return;
207
+ if (candidates.length === 1) {
208
+ this.currentLine = candidates[0];
209
+ this.cursorPos = this.currentLine.length;
210
+ this.renderPrompt();
211
+ }
212
+ else {
213
+ // Show candidates below, then redraw prompt
214
+ process.stderr.write('\n ' + candidates.join(' ') + '\n');
215
+ this.renderPrompt();
216
+ }
217
+ }
218
+ handleSearchKey(s, resolve) {
219
+ if (s === '\x1b' || s === '\x03') { // Esc or Ctrl+C — cancel search
220
+ this.searchMode = false;
221
+ this.renderPrompt();
222
+ }
223
+ else if (s === '\r' || s === '\n') { // Enter — accept match
224
+ this.searchMode = false;
225
+ const match = this.searchHistory(this.searchQuery);
226
+ if (match) {
227
+ this.currentLine = match;
228
+ this.cursorPos = this.currentLine.length;
229
+ }
230
+ this.renderPrompt();
231
+ }
232
+ else if (s === '\x7f' || s === '\b') { // Backspace
233
+ this.searchQuery = this.searchQuery.slice(0, -1);
234
+ this.renderSearchPrompt();
235
+ }
236
+ else if (s >= ' ' && s.length === 1) {
237
+ this.searchQuery += s;
238
+ this.renderSearchPrompt();
239
+ }
240
+ }
241
+ searchHistory(query) {
242
+ if (!query)
243
+ return null;
244
+ const lower = query.toLowerCase();
245
+ for (let i = this.history.length - 1; i >= 0; i--) {
246
+ if (this.history[i].toLowerCase().includes(lower))
247
+ return this.history[i];
248
+ }
249
+ return null;
250
+ }
251
+ renderPrompt() {
252
+ process.stderr.write(`\r\x1b[K${this.prompt}${this.currentLine}`);
253
+ // Move cursor to correct position
254
+ const offset = this.currentLine.length - this.cursorPos;
255
+ if (offset > 0)
256
+ process.stderr.write(`\x1b[${offset}D`);
257
+ }
258
+ renderSearchPrompt() {
259
+ const match = this.searchHistory(this.searchQuery) ?? '';
260
+ process.stderr.write(`\r\x1b[K\x1b[2m(search): ${this.searchQuery}\x1b[0m ${match}`);
261
+ }
262
+ addToHistory(line) {
263
+ // Don't add duplicates of the last entry
264
+ if (this.history.length > 0 && this.history[this.history.length - 1] === line)
265
+ return;
266
+ this.history.push(line);
267
+ if (this.history.length > this.maxHistory)
268
+ this.history.shift();
269
+ this.saveHistory();
270
+ }
271
+ loadHistory() {
272
+ try {
273
+ if (fs.existsSync(this.historyFile)) {
274
+ this.history = fs.readFileSync(this.historyFile, 'utf-8')
275
+ .split('\n')
276
+ .filter(Boolean)
277
+ .slice(-this.maxHistory);
278
+ }
279
+ }
280
+ catch { /* history not available */ }
281
+ }
282
+ saveHistory() {
283
+ try {
284
+ const dir = path.dirname(this.historyFile);
285
+ if (!fs.existsSync(dir))
286
+ fs.mkdirSync(dir, { recursive: true });
287
+ fs.writeFileSync(this.historyFile, this.history.join('\n') + '\n');
288
+ }
289
+ catch { /* non-fatal */ }
290
+ }
291
+ async getInputReadline() {
292
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr, prompt: this.prompt });
293
+ return new Promise((resolve) => {
294
+ rl.prompt();
295
+ rl.once('line', (line) => { rl.close(); resolve(line.trim() || null); });
296
+ rl.once('close', () => resolve(null));
297
+ });
298
+ }
299
+ destroy() {
300
+ if (process.stdin.isTTY) {
301
+ try {
302
+ process.stdin.setRawMode(false);
303
+ }
304
+ catch { }
305
+ }
306
+ }
307
+ }
308
+ //# sourceMappingURL=rich-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-input.js","sourceRoot":"","sources":["../../src/bot/rich-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ToolExecutor } from '@synergenius/flow-weaver/agent';
2
+ export interface SlashContext {
3
+ executor: ToolExecutor;
4
+ out: (s: string) => void;
5
+ projectDir: string;
6
+ conversationId?: string;
7
+ onClear?: () => void;
8
+ onExit?: () => void;
9
+ onNew?: () => void;
10
+ onVerbose?: () => void;
11
+ }
12
+ export interface SlashCommand {
13
+ name: string;
14
+ description: string;
15
+ handler: (ctx: SlashContext, args: string) => Promise<void>;
16
+ }
17
+ export declare const SLASH_COMMANDS: SlashCommand[];
18
+ export declare function getSlashCompletions(partial: string): string[];
19
+ export declare function handleSlashCommand(input: string, ctx: SlashContext): Promise<boolean>;
20
+ //# sourceMappingURL=slash-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slash-commands.d.ts","sourceRoot":"","sources":["../../src/bot/slash-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,cAAc,EAAE,YAAY,EA2ExC,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAK7D;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,OAAO,CAAC,CAMlB"}
@@ -0,0 +1,93 @@
1
+ import { c } from './ansi.js';
2
+ export const SLASH_COMMANDS = [
3
+ {
4
+ name: '/help',
5
+ description: 'Show available commands',
6
+ handler: async (ctx) => {
7
+ ctx.out('\n Available commands:\n');
8
+ for (const cmd of SLASH_COMMANDS) {
9
+ ctx.out(` ${c.cyan(cmd.name.padEnd(12))} ${c.dim(cmd.description)}\n`);
10
+ }
11
+ ctx.out('\n');
12
+ },
13
+ },
14
+ {
15
+ name: '/status',
16
+ description: 'Show bots, queue, and conversation summary',
17
+ handler: async (ctx) => {
18
+ const bots = await ctx.executor('bot_list', {});
19
+ const summary = await ctx.executor('conversation_summary', {});
20
+ ctx.out(`\n ${bots.result}\n ${summary.result}\n\n`);
21
+ },
22
+ },
23
+ {
24
+ name: '/bots',
25
+ description: 'List running bots',
26
+ handler: async (ctx) => {
27
+ const result = await ctx.executor('bot_list', {});
28
+ ctx.out(`\n ${result.result}\n\n`);
29
+ },
30
+ },
31
+ {
32
+ name: '/clear',
33
+ description: 'Clear screen and start new conversation',
34
+ handler: async (ctx) => {
35
+ process.stderr.write('\x1b[2J\x1b[H');
36
+ ctx.onClear?.();
37
+ },
38
+ },
39
+ {
40
+ name: '/exit',
41
+ description: 'Exit the assistant',
42
+ handler: async (ctx) => {
43
+ ctx.onExit?.();
44
+ },
45
+ },
46
+ {
47
+ name: '/new',
48
+ description: 'Start a new conversation',
49
+ handler: async (ctx) => {
50
+ ctx.onNew?.();
51
+ ctx.out(`\n ${c.dim('New conversation started.')}\n\n`);
52
+ },
53
+ },
54
+ {
55
+ name: '/list',
56
+ description: 'List saved conversations',
57
+ handler: async (ctx) => {
58
+ const result = await ctx.executor('conversation_list', {});
59
+ ctx.out(`\n ${result.result}\n\n`);
60
+ },
61
+ },
62
+ {
63
+ name: '/verbose',
64
+ description: 'Toggle verbose mode (show AI thinking)',
65
+ handler: async (ctx) => {
66
+ ctx.onVerbose?.();
67
+ },
68
+ },
69
+ {
70
+ name: '/history',
71
+ description: 'Show conversation history summary',
72
+ handler: async (ctx) => {
73
+ const result = await ctx.executor('conversation_summary', {});
74
+ ctx.out(`\n ${result.result}\n\n`);
75
+ },
76
+ },
77
+ ];
78
+ export function getSlashCompletions(partial) {
79
+ if (!partial.startsWith('/'))
80
+ return [];
81
+ return SLASH_COMMANDS
82
+ .filter(cmd => cmd.name.startsWith(partial))
83
+ .map(cmd => cmd.name);
84
+ }
85
+ export async function handleSlashCommand(input, ctx) {
86
+ const [name, ...rest] = input.split(' ');
87
+ const cmd = SLASH_COMMANDS.find(c => c.name === name);
88
+ if (!cmd)
89
+ return false;
90
+ await cmd.handler(ctx, rest.join(' '));
91
+ return true;
92
+ }
93
+ //# sourceMappingURL=slash-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/bot/slash-commands.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifestVersion": 2,
3
3
  "name": "@synergenius/flow-weaver-pack-weaver",
4
- "version": "0.9.4",
4
+ "version": "0.9.5",
5
5
  "description": "AI bot for Flow Weaver. Execute tasks, run workflows, evolve autonomously.",
6
6
  "engineVersion": ">=0.19.4",
7
7
  "categories": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synergenius/flow-weaver-pack-weaver",
3
- "version": "0.9.4",
3
+ "version": "0.9.5",
4
4
  "description": "AI bot for Flow Weaver. Execute tasks, run workflows, evolve autonomously.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -8,7 +8,8 @@
8
8
  * - API provider: tools collected and executed manually (tool_use_start/end events)
9
9
  */
10
10
 
11
- import * as readline from 'node:readline';
11
+ import * as path from 'node:path';
12
+ import * as os from 'node:os';
12
13
  import {
13
14
  runAgentLoop,
14
15
  type AgentProvider,
@@ -124,23 +125,28 @@ export async function runAssistant(opts: AssistantOptions): Promise<void> {
124
125
  } else {
125
126
  out(` ${c.dim(`Conversation: ${conversation.id}`)}\n`);
126
127
  }
127
- out(` ${c.dim('Type your request. Ctrl+C to exit.')}\n\n`);
128
-
129
- // Input source
130
- const rl = opts.inputMessages
131
- ? null
132
- : readline.createInterface({ input: process.stdin, output: process.stderr, prompt: `${c.cyan('')} ` });
128
+ out(` ${c.dim('Type your request. Ctrl+C to exit. /help for commands.')}\n\n`);
129
+
130
+ // Rich input with history, arrows, tab completion, slash commands
131
+ const { RichInput } = await import('./rich-input.js');
132
+ const { getSlashCompletions, handleSlashCommand } = await import('./slash-commands.js');
133
+ const { formatResponse } = await import('./response-formatter.js');
134
+
135
+ const richInput = opts.inputMessages ? null : new RichInput({
136
+ historyFile: path.join(os.homedir(), '.weaver', 'input-history.txt'),
137
+ prompt: `${c.cyan('❯')} `,
138
+ completionProvider: (partial) => {
139
+ if (partial.startsWith('/')) return getSlashCompletions(partial);
140
+ return [];
141
+ },
142
+ });
133
143
 
134
144
  const getNextInput = opts.inputMessages
135
145
  ? (() => {
136
146
  let i = 0;
137
147
  return (): Promise<string | null> => Promise.resolve(opts.inputMessages![i++] ?? null);
138
148
  })()
139
- : (): Promise<string | null> => new Promise<string | null>((resolve) => {
140
- rl!.prompt();
141
- rl!.once('line', (line) => resolve(line.trim() || null));
142
- rl!.once('close', () => resolve(null));
143
- });
149
+ : (): Promise<string | null> => richInput!.getInput();
144
150
 
145
151
  const onStreamEvent = (event: StreamEvent) => {
146
152
  if (event.type === 'text_delta') {
@@ -169,14 +175,39 @@ export async function runAssistant(opts: AssistantOptions): Promise<void> {
169
175
  }
170
176
  };
171
177
 
178
+ // Slash command context
179
+ let shouldExit = false;
180
+ const slashCtx = {
181
+ executor,
182
+ out,
183
+ projectDir,
184
+ conversationId: conversation.id,
185
+ onClear: () => { history.length = 0; },
186
+ onExit: () => { shouldExit = true; },
187
+ onNew: () => { history.length = 0; conversation = store.create(projectDir); },
188
+ onVerbose: () => { out(` ${c.dim('Verbose toggling not yet wired to streaming.')}\n`); },
189
+ };
190
+
172
191
  // Main conversation loop
173
- while (true) {
192
+ while (!shouldExit) {
174
193
  const input = await getNextInput();
175
194
  if (input === null) break;
176
195
  if (!input.trim()) continue;
177
196
 
197
+ // Handle slash commands
198
+ if (input.startsWith('/')) {
199
+ const handled = await handleSlashCommand(input, slashCtx);
200
+ if (handled) continue;
201
+ // Unknown slash command — tell user
202
+ out(` ${c.dim('Unknown command. Type /help for available commands.')}\n\n`);
203
+ continue;
204
+ }
205
+
178
206
  out('\n');
179
207
 
208
+ // Reset Ctrl+C counter after successful input
209
+ richInput?.resetCtrlC();
210
+
180
211
  // Add user message to history
181
212
  history.push({ role: 'user', content: input });
182
213
 
@@ -234,7 +265,7 @@ export async function runAssistant(opts: AssistantOptions): Promise<void> {
234
265
  out('\n');
235
266
  }
236
267
 
237
- rl?.close();
268
+ richInput?.destroy();
238
269
  out(`\n ${c.dim('Goodbye.')}\n\n`);
239
270
  }
240
271
 
@@ -0,0 +1,42 @@
1
+ import * as path from 'node:path';
2
+ import { c } from './ansi.js';
3
+
4
+ /**
5
+ * Highlight code blocks in streamed text.
6
+ * Detects ```lang ... ``` patterns and applies dim styling.
7
+ */
8
+ export function highlightCodeBlocks(text: string): string {
9
+ return text.replace(/```(\w+)?\n([\s\S]*?)```/g, (_, lang, code) => {
10
+ const header = lang ? ` ${c.cyan(`[${lang}]`)}\n` : '';
11
+ return `${header}${c.dim(code)}`;
12
+ });
13
+ }
14
+
15
+ /**
16
+ * Make file paths clickable using OSC 8 terminal hyperlinks.
17
+ * Only active when terminal supports it.
18
+ */
19
+ export function linkifyPaths(text: string, cwd: string): string {
20
+ if (!supportsHyperlinks()) return text;
21
+ return text.replace(/\b((?:src|tests|lib|dist)\/[\w/.-]+\.(?:ts|js|json|md))\b/g, (match) => {
22
+ const abs = path.resolve(cwd, match);
23
+ return `\x1b]8;;file://${abs}\x07${match}\x1b]8;;\x07`;
24
+ });
25
+ }
26
+
27
+ /**
28
+ * Format a full response — apply all formatting passes.
29
+ */
30
+ export function formatResponse(text: string, cwd: string): string {
31
+ let result = text;
32
+ result = highlightCodeBlocks(result);
33
+ result = linkifyPaths(result, cwd);
34
+ return result;
35
+ }
36
+
37
+ function supportsHyperlinks(): boolean {
38
+ const term = process.env.TERM_PROGRAM ?? '';
39
+ // Known terminals that support OSC 8
40
+ return ['iTerm.app', 'WezTerm', 'vscode', 'Hyper'].includes(term)
41
+ || !!process.env.TERM_PROGRAM_VERSION; // Most modern terminals
42
+ }
@@ -0,0 +1,307 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ import * as readline from 'node:readline';
5
+
6
+ export interface RichInputOptions {
7
+ historyFile?: string;
8
+ prompt?: string;
9
+ completionProvider?: (partial: string) => string[];
10
+ maxHistorySize?: number;
11
+ }
12
+
13
+ export class RichInput {
14
+ private history: string[] = [];
15
+ private historyIndex = -1;
16
+ private currentLine = '';
17
+ private cursorPos = 0;
18
+ private multiLineBuffer: string[] = [];
19
+ private searchMode = false;
20
+ private searchQuery = '';
21
+ private ctrlCCount = 0;
22
+ private prompt: string;
23
+ private historyFile: string;
24
+ private completionProvider?: (partial: string) => string[];
25
+ private maxHistory: number;
26
+
27
+ constructor(opts: RichInputOptions = {}) {
28
+ this.prompt = opts.prompt ?? '❯ ';
29
+ this.historyFile = opts.historyFile ?? path.join(os.homedir(), '.weaver', 'input-history.txt');
30
+ this.completionProvider = opts.completionProvider;
31
+ this.maxHistory = opts.maxHistorySize ?? 500;
32
+ this.loadHistory();
33
+ }
34
+
35
+ async getInput(): Promise<string | null> {
36
+ // Non-TTY fallback
37
+ if (!process.stdin.isTTY) {
38
+ return this.getInputReadline();
39
+ }
40
+
41
+ return new Promise((resolve) => {
42
+ this.ctrlCCount = 0;
43
+ this.historyIndex = -1;
44
+ this.currentLine = '';
45
+ this.cursorPos = 0;
46
+ this.searchMode = false;
47
+
48
+ process.stdin.setRawMode(true);
49
+ process.stdin.resume();
50
+
51
+ const handler = (key: Buffer) => {
52
+ this.handleKey(key, (result) => {
53
+ process.stdin.setRawMode(false);
54
+ process.stdin.pause();
55
+ process.stdin.removeListener('data', handler);
56
+ resolve(result);
57
+ });
58
+ };
59
+
60
+ process.stdin.on('data', handler);
61
+ this.renderPrompt();
62
+ });
63
+ }
64
+
65
+ resetCtrlC(): void {
66
+ this.ctrlCCount = 0;
67
+ }
68
+
69
+ private handleKey(key: Buffer, resolve: (value: string | null) => void): void {
70
+ const s = key.toString();
71
+
72
+ // Handle search mode separately
73
+ if (this.searchMode) {
74
+ this.handleSearchKey(s, resolve);
75
+ return;
76
+ }
77
+
78
+ if (s === '\r' || s === '\n') {
79
+ this.handleEnter(resolve);
80
+ } else if (s === '\x03') { // Ctrl+C
81
+ this.ctrlCCount++;
82
+ if (this.ctrlCCount >= 2 || this.currentLine === '') {
83
+ process.stderr.write('\n');
84
+ resolve(null);
85
+ } else {
86
+ this.currentLine = '';
87
+ this.cursorPos = 0;
88
+ process.stderr.write('\n');
89
+ this.renderPrompt();
90
+ }
91
+ } else if (s === '\x0c') { // Ctrl+L
92
+ process.stderr.write('\x1b[2J\x1b[H'); // clear screen + move to top
93
+ this.renderPrompt();
94
+ } else if (s === '\x12') { // Ctrl+R
95
+ this.searchMode = true;
96
+ this.searchQuery = '';
97
+ this.renderSearchPrompt();
98
+ } else if (s === '\x09') { // Tab
99
+ this.handleTab();
100
+ } else if (s === '\x1b[A') { // Arrow Up
101
+ this.historyUp();
102
+ } else if (s === '\x1b[B') { // Arrow Down
103
+ this.historyDown();
104
+ } else if (s === '\x1b[C') { // Arrow Right
105
+ if (this.cursorPos < this.currentLine.length) {
106
+ this.cursorPos++;
107
+ process.stderr.write('\x1b[C');
108
+ }
109
+ } else if (s === '\x1b[D') { // Arrow Left
110
+ if (this.cursorPos > 0) {
111
+ this.cursorPos--;
112
+ process.stderr.write('\x1b[D');
113
+ }
114
+ } else if (s === '\x7f' || s === '\b') { // Backspace
115
+ if (this.cursorPos > 0) {
116
+ this.currentLine = this.currentLine.slice(0, this.cursorPos - 1) + this.currentLine.slice(this.cursorPos);
117
+ this.cursorPos--;
118
+ this.renderPrompt();
119
+ }
120
+ } else if (s === '\x1b[3~') { // Delete
121
+ if (this.cursorPos < this.currentLine.length) {
122
+ this.currentLine = this.currentLine.slice(0, this.cursorPos) + this.currentLine.slice(this.cursorPos + 1);
123
+ this.renderPrompt();
124
+ }
125
+ } else if (s === '\x01') { // Ctrl+A (home)
126
+ this.cursorPos = 0;
127
+ this.renderPrompt();
128
+ } else if (s === '\x05') { // Ctrl+E (end)
129
+ this.cursorPos = this.currentLine.length;
130
+ this.renderPrompt();
131
+ } else if (s === '\x15') { // Ctrl+U (clear line)
132
+ this.currentLine = '';
133
+ this.cursorPos = 0;
134
+ this.renderPrompt();
135
+ } else if (s >= ' ' && s.length === 1) { // Printable
136
+ this.ctrlCCount = 0;
137
+ this.currentLine = this.currentLine.slice(0, this.cursorPos) + s + this.currentLine.slice(this.cursorPos);
138
+ this.cursorPos++;
139
+ this.renderPrompt();
140
+ } else if (s.length > 1 && !s.startsWith('\x1b')) {
141
+ // Pasted text (multiple chars at once)
142
+ this.ctrlCCount = 0;
143
+ this.currentLine = this.currentLine.slice(0, this.cursorPos) + s + this.currentLine.slice(this.cursorPos);
144
+ this.cursorPos += s.length;
145
+ this.renderPrompt();
146
+ }
147
+ }
148
+
149
+ private handleEnter(resolve: (value: string | null) => void): void {
150
+ const fullLine = this.multiLineBuffer.length > 0
151
+ ? [...this.multiLineBuffer, this.currentLine].join('\n')
152
+ : this.currentLine;
153
+
154
+ // Check for multi-line continuation
155
+ if (this.isIncomplete(fullLine)) {
156
+ this.multiLineBuffer.push(this.currentLine);
157
+ this.currentLine = '';
158
+ this.cursorPos = 0;
159
+ process.stderr.write('\n');
160
+ process.stderr.write(' ... ');
161
+ return;
162
+ }
163
+
164
+ process.stderr.write('\n');
165
+
166
+ const trimmed = fullLine.trim();
167
+ if (trimmed) {
168
+ this.addToHistory(trimmed);
169
+ }
170
+
171
+ this.multiLineBuffer = [];
172
+ this.currentLine = '';
173
+ this.cursorPos = 0;
174
+
175
+ resolve(trimmed || null);
176
+ }
177
+
178
+ private isIncomplete(text: string): boolean {
179
+ const backticks = (text.match(/```/g) || []).length;
180
+ if (backticks % 2 !== 0) return true;
181
+ if (text.endsWith('\\')) return true;
182
+ return false;
183
+ }
184
+
185
+ private historyUp(): void {
186
+ if (this.history.length === 0) return;
187
+ if (this.historyIndex < this.history.length - 1) {
188
+ this.historyIndex++;
189
+ this.currentLine = this.history[this.history.length - 1 - this.historyIndex];
190
+ this.cursorPos = this.currentLine.length;
191
+ this.renderPrompt();
192
+ }
193
+ }
194
+
195
+ private historyDown(): void {
196
+ if (this.historyIndex > 0) {
197
+ this.historyIndex--;
198
+ this.currentLine = this.history[this.history.length - 1 - this.historyIndex];
199
+ this.cursorPos = this.currentLine.length;
200
+ this.renderPrompt();
201
+ } else if (this.historyIndex === 0) {
202
+ this.historyIndex = -1;
203
+ this.currentLine = '';
204
+ this.cursorPos = 0;
205
+ this.renderPrompt();
206
+ }
207
+ }
208
+
209
+ private handleTab(): void {
210
+ if (!this.completionProvider) return;
211
+ const candidates = this.completionProvider(this.currentLine);
212
+ if (candidates.length === 0) return;
213
+ if (candidates.length === 1) {
214
+ this.currentLine = candidates[0];
215
+ this.cursorPos = this.currentLine.length;
216
+ this.renderPrompt();
217
+ } else {
218
+ // Show candidates below, then redraw prompt
219
+ process.stderr.write('\n ' + candidates.join(' ') + '\n');
220
+ this.renderPrompt();
221
+ }
222
+ }
223
+
224
+ private handleSearchKey(s: string, resolve: (value: string | null) => void): void {
225
+ if (s === '\x1b' || s === '\x03') { // Esc or Ctrl+C — cancel search
226
+ this.searchMode = false;
227
+ this.renderPrompt();
228
+ } else if (s === '\r' || s === '\n') { // Enter — accept match
229
+ this.searchMode = false;
230
+ const match = this.searchHistory(this.searchQuery);
231
+ if (match) {
232
+ this.currentLine = match;
233
+ this.cursorPos = this.currentLine.length;
234
+ }
235
+ this.renderPrompt();
236
+ } else if (s === '\x7f' || s === '\b') { // Backspace
237
+ this.searchQuery = this.searchQuery.slice(0, -1);
238
+ this.renderSearchPrompt();
239
+ } else if (s >= ' ' && s.length === 1) {
240
+ this.searchQuery += s;
241
+ this.renderSearchPrompt();
242
+ }
243
+ }
244
+
245
+ private searchHistory(query: string): string | null {
246
+ if (!query) return null;
247
+ const lower = query.toLowerCase();
248
+ for (let i = this.history.length - 1; i >= 0; i--) {
249
+ if (this.history[i].toLowerCase().includes(lower)) return this.history[i];
250
+ }
251
+ return null;
252
+ }
253
+
254
+ private renderPrompt(): void {
255
+ process.stderr.write(`\r\x1b[K${this.prompt}${this.currentLine}`);
256
+ // Move cursor to correct position
257
+ const offset = this.currentLine.length - this.cursorPos;
258
+ if (offset > 0) process.stderr.write(`\x1b[${offset}D`);
259
+ }
260
+
261
+ private renderSearchPrompt(): void {
262
+ const match = this.searchHistory(this.searchQuery) ?? '';
263
+ process.stderr.write(`\r\x1b[K\x1b[2m(search): ${this.searchQuery}\x1b[0m ${match}`);
264
+ }
265
+
266
+ private addToHistory(line: string): void {
267
+ // Don't add duplicates of the last entry
268
+ if (this.history.length > 0 && this.history[this.history.length - 1] === line) return;
269
+ this.history.push(line);
270
+ if (this.history.length > this.maxHistory) this.history.shift();
271
+ this.saveHistory();
272
+ }
273
+
274
+ private loadHistory(): void {
275
+ try {
276
+ if (fs.existsSync(this.historyFile)) {
277
+ this.history = fs.readFileSync(this.historyFile, 'utf-8')
278
+ .split('\n')
279
+ .filter(Boolean)
280
+ .slice(-this.maxHistory);
281
+ }
282
+ } catch { /* history not available */ }
283
+ }
284
+
285
+ private saveHistory(): void {
286
+ try {
287
+ const dir = path.dirname(this.historyFile);
288
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
289
+ fs.writeFileSync(this.historyFile, this.history.join('\n') + '\n');
290
+ } catch { /* non-fatal */ }
291
+ }
292
+
293
+ private async getInputReadline(): Promise<string | null> {
294
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr, prompt: this.prompt });
295
+ return new Promise<string | null>((resolve) => {
296
+ rl.prompt();
297
+ rl.once('line', (line) => { rl.close(); resolve(line.trim() || null); });
298
+ rl.once('close', () => resolve(null));
299
+ });
300
+ }
301
+
302
+ destroy(): void {
303
+ if (process.stdin.isTTY) {
304
+ try { process.stdin.setRawMode(false); } catch {}
305
+ }
306
+ }
307
+ }
@@ -0,0 +1,114 @@
1
+ import type { ToolExecutor } from '@synergenius/flow-weaver/agent';
2
+ import { c } from './ansi.js';
3
+
4
+ export interface SlashContext {
5
+ executor: ToolExecutor;
6
+ out: (s: string) => void;
7
+ projectDir: string;
8
+ conversationId?: string;
9
+ onClear?: () => void;
10
+ onExit?: () => void;
11
+ onNew?: () => void;
12
+ onVerbose?: () => void;
13
+ }
14
+
15
+ export interface SlashCommand {
16
+ name: string;
17
+ description: string;
18
+ handler: (ctx: SlashContext, args: string) => Promise<void>;
19
+ }
20
+
21
+ export const SLASH_COMMANDS: SlashCommand[] = [
22
+ {
23
+ name: '/help',
24
+ description: 'Show available commands',
25
+ handler: async (ctx) => {
26
+ ctx.out('\n Available commands:\n');
27
+ for (const cmd of SLASH_COMMANDS) {
28
+ ctx.out(` ${c.cyan(cmd.name.padEnd(12))} ${c.dim(cmd.description)}\n`);
29
+ }
30
+ ctx.out('\n');
31
+ },
32
+ },
33
+ {
34
+ name: '/status',
35
+ description: 'Show bots, queue, and conversation summary',
36
+ handler: async (ctx) => {
37
+ const bots = await ctx.executor('bot_list', {});
38
+ const summary = await ctx.executor('conversation_summary', {});
39
+ ctx.out(`\n ${bots.result}\n ${summary.result}\n\n`);
40
+ },
41
+ },
42
+ {
43
+ name: '/bots',
44
+ description: 'List running bots',
45
+ handler: async (ctx) => {
46
+ const result = await ctx.executor('bot_list', {});
47
+ ctx.out(`\n ${result.result}\n\n`);
48
+ },
49
+ },
50
+ {
51
+ name: '/clear',
52
+ description: 'Clear screen and start new conversation',
53
+ handler: async (ctx) => {
54
+ process.stderr.write('\x1b[2J\x1b[H');
55
+ ctx.onClear?.();
56
+ },
57
+ },
58
+ {
59
+ name: '/exit',
60
+ description: 'Exit the assistant',
61
+ handler: async (ctx) => {
62
+ ctx.onExit?.();
63
+ },
64
+ },
65
+ {
66
+ name: '/new',
67
+ description: 'Start a new conversation',
68
+ handler: async (ctx) => {
69
+ ctx.onNew?.();
70
+ ctx.out(`\n ${c.dim('New conversation started.')}\n\n`);
71
+ },
72
+ },
73
+ {
74
+ name: '/list',
75
+ description: 'List saved conversations',
76
+ handler: async (ctx) => {
77
+ const result = await ctx.executor('conversation_list', {});
78
+ ctx.out(`\n ${result.result}\n\n`);
79
+ },
80
+ },
81
+ {
82
+ name: '/verbose',
83
+ description: 'Toggle verbose mode (show AI thinking)',
84
+ handler: async (ctx) => {
85
+ ctx.onVerbose?.();
86
+ },
87
+ },
88
+ {
89
+ name: '/history',
90
+ description: 'Show conversation history summary',
91
+ handler: async (ctx) => {
92
+ const result = await ctx.executor('conversation_summary', {});
93
+ ctx.out(`\n ${result.result}\n\n`);
94
+ },
95
+ },
96
+ ];
97
+
98
+ export function getSlashCompletions(partial: string): string[] {
99
+ if (!partial.startsWith('/')) return [];
100
+ return SLASH_COMMANDS
101
+ .filter(cmd => cmd.name.startsWith(partial))
102
+ .map(cmd => cmd.name);
103
+ }
104
+
105
+ export async function handleSlashCommand(
106
+ input: string,
107
+ ctx: SlashContext,
108
+ ): Promise<boolean> {
109
+ const [name, ...rest] = input.split(' ');
110
+ const cmd = SLASH_COMMANDS.find(c => c.name === name);
111
+ if (!cmd) return false;
112
+ await cmd.handler(ctx, rest.join(' '));
113
+ return true;
114
+ }