openpaean 0.1.0 → 0.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 (66) hide show
  1. package/dist/agent/chat.ink.d.ts +5 -0
  2. package/dist/agent/chat.ink.d.ts.map +1 -1
  3. package/dist/agent/chat.ink.js +9 -0
  4. package/dist/agent/chat.ink.js.map +1 -1
  5. package/dist/cli.js +3 -3
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/agent.d.ts.map +1 -1
  8. package/dist/commands/agent.js +6 -5
  9. package/dist/commands/agent.js.map +1 -1
  10. package/dist/ui/App.d.ts +1 -1
  11. package/dist/ui/App.d.ts.map +1 -1
  12. package/dist/ui/App.js +15 -9
  13. package/dist/ui/App.js.map +1 -1
  14. package/dist/ui/FullscreenApp.d.ts +1 -0
  15. package/dist/ui/FullscreenApp.d.ts.map +1 -1
  16. package/dist/ui/FullscreenApp.js +8 -5
  17. package/dist/ui/FullscreenApp.js.map +1 -1
  18. package/dist/ui/components/MarkdownText.d.ts +23 -0
  19. package/dist/ui/components/MarkdownText.d.ts.map +1 -0
  20. package/dist/ui/components/MarkdownText.js +84 -0
  21. package/dist/ui/components/MarkdownText.js.map +1 -0
  22. package/dist/ui/components/ScrollableBox.d.ts +21 -0
  23. package/dist/ui/components/ScrollableBox.d.ts.map +1 -0
  24. package/dist/ui/components/ScrollableBox.js +101 -0
  25. package/dist/ui/components/ScrollableBox.js.map +1 -0
  26. package/dist/ui/components/StreamingText.d.ts +1 -1
  27. package/dist/ui/components/StreamingText.d.ts.map +1 -1
  28. package/dist/ui/components/StreamingText.js +6 -5
  29. package/dist/ui/components/StreamingText.js.map +1 -1
  30. package/dist/ui/components/index.d.ts +2 -0
  31. package/dist/ui/components/index.d.ts.map +1 -1
  32. package/dist/ui/components/index.js +2 -0
  33. package/dist/ui/components/index.js.map +1 -1
  34. package/dist/ui/terminal/ErrorDisplay.d.ts +63 -0
  35. package/dist/ui/terminal/ErrorDisplay.d.ts.map +1 -0
  36. package/dist/ui/terminal/ErrorDisplay.js +113 -0
  37. package/dist/ui/terminal/ErrorDisplay.js.map +1 -0
  38. package/dist/ui/terminal/HelpDisplay.d.ts +21 -0
  39. package/dist/ui/terminal/HelpDisplay.d.ts.map +1 -0
  40. package/dist/ui/terminal/HelpDisplay.js +89 -0
  41. package/dist/ui/terminal/HelpDisplay.js.map +1 -0
  42. package/dist/ui/terminal/Spinner.d.ts +65 -0
  43. package/dist/ui/terminal/Spinner.d.ts.map +1 -0
  44. package/dist/ui/terminal/Spinner.js +130 -0
  45. package/dist/ui/terminal/Spinner.js.map +1 -0
  46. package/dist/ui/terminal/StatusBar.d.ts +27 -0
  47. package/dist/ui/terminal/StatusBar.d.ts.map +1 -0
  48. package/dist/ui/terminal/StatusBar.js +79 -0
  49. package/dist/ui/terminal/StatusBar.js.map +1 -0
  50. package/dist/ui/terminal/TerminalApp.d.ts +137 -0
  51. package/dist/ui/terminal/TerminalApp.d.ts.map +1 -0
  52. package/dist/ui/terminal/TerminalApp.js +450 -0
  53. package/dist/ui/terminal/TerminalApp.js.map +1 -0
  54. package/dist/ui/terminal/output.d.ts +91 -0
  55. package/dist/ui/terminal/output.d.ts.map +1 -0
  56. package/dist/ui/terminal/output.js +138 -0
  57. package/dist/ui/terminal/output.js.map +1 -0
  58. package/dist/ui/theme/index.d.ts +157 -0
  59. package/dist/ui/theme/index.d.ts.map +1 -0
  60. package/dist/ui/theme/index.js +236 -0
  61. package/dist/ui/theme/index.js.map +1 -0
  62. package/dist/utils/inputHistory.d.ts +88 -0
  63. package/dist/utils/inputHistory.d.ts.map +1 -0
  64. package/dist/utils/inputHistory.js +206 -0
  65. package/dist/utils/inputHistory.js.map +1 -0
  66. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"StreamingText.js","sourceRoot":"","sources":["../../../src/ui/components/StreamingText.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAQhC,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EACxD,IAAI,EACJ,UAAU,GAAG,KAAK,EAClB,OAAO,EAAE,QAAQ,GAAG,KAAK,EAC5B,EAAE,EAAE;IACD,gCAAgC;IAChC,wDAAwD;IACxD,OAAO,CACH,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACvB,KAAC,GAAG,cACA,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,kCAAc,GACtC,EACN,MAAC,GAAG,IAAC,UAAU,EAAE,CAAC,aACd,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,YAAE,IAAI,GAAQ,EAC9B,CAAC,UAAU,IAAI,KAAC,IAAI,IAAC,QAAQ,6BAAS,IACrC,IACJ,CACT,CAAC;AACN,CAAC,CAAC"}
1
+ {"version":3,"file":"StreamingText.js","sourceRoot":"","sources":["../../../src/ui/components/StreamingText.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAQ5D,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EACxD,IAAI,EACJ,UAAU,GAAG,KAAK,EAClB,OAAO,GAAG,KAAK,EAClB,EAAE,EAAE;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IAEpC,OAAO,CACH,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACvB,KAAC,GAAG,cACA,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,kCAAmB,GAC3C,EACN,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,YACrC,OAAO,CAAC,CAAC,CAAC,CACP,KAAC,SAAS,IAAC,SAAS,EAAE,CAAC,UAAU,YAAG,IAAI,GAAa,CACxD,CAAC,CAAC,CAAC,CACA,KAAC,YAAY,IAAC,SAAS,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,YACjD,IAAI,GACM,CAClB,GACC,IACJ,CACT,CAAC;AACN,CAAC,CAAC"}
@@ -6,4 +6,6 @@ export { InputArea } from './InputArea.js';
6
6
  export { Spinner } from './Spinner.js';
7
7
  export { StreamingText } from './StreamingText.js';
8
8
  export { ToolCallIndicator } from './ToolCallIndicator.js';
9
+ export { ScrollableBox } from './ScrollableBox.js';
10
+ export { MarkdownText, PlainText } from './MarkdownText.js';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
@@ -6,4 +6,6 @@ export { InputArea } from './InputArea.js';
6
6
  export { Spinner } from './Spinner.js';
7
7
  export { StreamingText } from './StreamingText.js';
8
8
  export { ToolCallIndicator } from './ToolCallIndicator.js';
9
+ export { ScrollableBox } from './ScrollableBox.js';
10
+ export { MarkdownText, PlainText } from './MarkdownText.js';
9
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Error Display
3
+ * Structured error messages with cause and suggestions
4
+ */
5
+ /**
6
+ * Error detail structure
7
+ */
8
+ export interface ErrorDetail {
9
+ message: string;
10
+ cause?: string;
11
+ suggestion?: string;
12
+ code?: string;
13
+ }
14
+ /**
15
+ * Format an error for display
16
+ */
17
+ export declare function formatError(detail: ErrorDetail): string;
18
+ /**
19
+ * Display an error and return the formatted string
20
+ */
21
+ export declare function displayError(detail: ErrorDetail): string;
22
+ /**
23
+ * Common error templates
24
+ */
25
+ export declare const Errors: {
26
+ /**
27
+ * Network error
28
+ */
29
+ network: (cause?: string) => ErrorDetail;
30
+ /**
31
+ * Authentication error
32
+ */
33
+ auth: () => ErrorDetail;
34
+ /**
35
+ * MCP connection error
36
+ */
37
+ mcpConnection: (serverName: string, cause?: string) => ErrorDetail;
38
+ /**
39
+ * MCP tool error
40
+ */
41
+ mcpTool: (toolName: string, cause?: string) => ErrorDetail;
42
+ /**
43
+ * File not found
44
+ */
45
+ fileNotFound: (path: string) => ErrorDetail;
46
+ /**
47
+ * Invalid input
48
+ */
49
+ invalidInput: (field?: string) => ErrorDetail;
50
+ /**
51
+ * Generic error
52
+ */
53
+ generic: (message: string, suggestion?: string) => ErrorDetail;
54
+ };
55
+ /**
56
+ * Parse an Error object into ErrorDetail
57
+ */
58
+ export declare function parseError(err: unknown): ErrorDetail;
59
+ /**
60
+ * Display error from caught exception
61
+ */
62
+ export declare function showError(err: unknown): string;
63
+ //# sourceMappingURL=ErrorDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorDisplay.d.ts","sourceRoot":"","sources":["../../../src/ui/terminal/ErrorDisplay.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsBvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,eAAO,MAAM,MAAM;IACf;;OAEG;sBACe,MAAM,KAAG,WAAW;IAMtC;;OAEG;gBACO,WAAW;IAMrB;;OAEG;gCACyB,MAAM,UAAU,MAAM,KAAG,WAAW;IAMhE;;OAEG;wBACiB,MAAM,UAAU,MAAM,KAAG,WAAW;IAMxD;;OAEG;yBACkB,MAAM,KAAG,WAAW;IAKzC;;OAEG;2BACoB,MAAM,KAAG,WAAW;IAK3C;;OAEG;uBACgB,MAAM,eAAe,MAAM,KAAG,WAAW;CAI/D,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAapD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAG9C"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Error Display
3
+ * Structured error messages with cause and suggestions
4
+ */
5
+ import { styledMessage, warning, info, muted } from '../theme/index.js';
6
+ /**
7
+ * Format an error for display
8
+ */
9
+ export function formatError(detail) {
10
+ let output = '';
11
+ // Main error message
12
+ output += styledMessage('error', detail.message) + '\n';
13
+ // Error code if present
14
+ if (detail.code) {
15
+ output += muted(` Code: ${detail.code}\n`);
16
+ }
17
+ // Cause
18
+ if (detail.cause) {
19
+ output += ` ${warning('Cause:')} ${detail.cause}\n`;
20
+ }
21
+ // Suggestion
22
+ if (detail.suggestion) {
23
+ output += ` ${info('Suggestion:')} ${detail.suggestion}\n`;
24
+ }
25
+ return output;
26
+ }
27
+ /**
28
+ * Display an error and return the formatted string
29
+ */
30
+ export function displayError(detail) {
31
+ return formatError(detail);
32
+ }
33
+ /**
34
+ * Common error templates
35
+ */
36
+ export const Errors = {
37
+ /**
38
+ * Network error
39
+ */
40
+ network: (cause) => ({
41
+ message: 'Network connection failed',
42
+ cause: cause || 'Could not reach the server',
43
+ suggestion: 'Check your internet connection and try again',
44
+ }),
45
+ /**
46
+ * Authentication error
47
+ */
48
+ auth: () => ({
49
+ message: 'Authentication failed',
50
+ cause: 'Your session may have expired',
51
+ suggestion: 'Run `openpaean login` to re-authenticate',
52
+ }),
53
+ /**
54
+ * MCP connection error
55
+ */
56
+ mcpConnection: (serverName, cause) => ({
57
+ message: `Failed to connect to MCP server "${serverName}"`,
58
+ cause: cause || 'Server may be unavailable or already in use',
59
+ suggestion: 'Check if the server is running and not used by another client',
60
+ }),
61
+ /**
62
+ * MCP tool error
63
+ */
64
+ mcpTool: (toolName, cause) => ({
65
+ message: `MCP tool "${toolName}" failed`,
66
+ cause: cause || 'Tool execution returned an error',
67
+ suggestion: 'Check the tool configuration and try again',
68
+ }),
69
+ /**
70
+ * File not found
71
+ */
72
+ fileNotFound: (path) => ({
73
+ message: `File not found: ${path}`,
74
+ suggestion: 'Check the file path and try again',
75
+ }),
76
+ /**
77
+ * Invalid input
78
+ */
79
+ invalidInput: (field) => ({
80
+ message: field ? `Invalid ${field}` : 'Invalid input',
81
+ suggestion: 'Please check your input and try again',
82
+ }),
83
+ /**
84
+ * Generic error
85
+ */
86
+ generic: (message, suggestion) => ({
87
+ message,
88
+ suggestion,
89
+ }),
90
+ };
91
+ /**
92
+ * Parse an Error object into ErrorDetail
93
+ */
94
+ export function parseError(err) {
95
+ if (err instanceof Error) {
96
+ return {
97
+ message: err.message,
98
+ cause: err.cause,
99
+ };
100
+ }
101
+ if (typeof err === 'string') {
102
+ return { message: err };
103
+ }
104
+ return { message: 'An unknown error occurred' };
105
+ }
106
+ /**
107
+ * Display error from caught exception
108
+ */
109
+ export function showError(err) {
110
+ const detail = parseError(err);
111
+ return displayError(detail);
112
+ }
113
+ //# sourceMappingURL=ErrorDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorDisplay.js","sourceRoot":"","sources":["../../../src/ui/terminal/ErrorDisplay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Help Display
3
+ * Centralized help content for the CLI
4
+ */
5
+ /**
6
+ * Get full help text
7
+ */
8
+ export declare function getFullHelp(): string;
9
+ /**
10
+ * Get quick help (one-line hints)
11
+ */
12
+ export declare function getQuickHelp(): string;
13
+ /**
14
+ * Get command-specific help
15
+ */
16
+ export declare function getCommandHelp(command: string): string | null;
17
+ /**
18
+ * Get keybinding help table
19
+ */
20
+ export declare function getKeyBindings(): string;
21
+ //# sourceMappingURL=HelpDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpDisplay.d.ts","sourceRoot":"","sources":["../../../src/ui/terminal/HelpDisplay.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAqCpC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc7D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAgBvC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Help Display
3
+ * Centralized help content for the CLI
4
+ */
5
+ import { success, info, warning, primary, muted } from '../theme/index.js';
6
+ /**
7
+ * Get full help text
8
+ */
9
+ export function getFullHelp() {
10
+ return `
11
+ ${info('Available Commands:')}
12
+
13
+ ${success('/exit, /quit, /q')} Exit the chat session
14
+ ${success('/clear, /cls')} Clear the screen
15
+ ${success('/help, /h, /?')} Show this help message
16
+ ${success('/debug')} Toggle debug mode
17
+ ${success('/raw')} Toggle raw output mode (no markdown)
18
+ ${success('/mcp')} Show MCP connection status
19
+
20
+ ${info('Keyboard Shortcuts:')}
21
+
22
+ ${warning('Ctrl+C')} Exit or abort current operation
23
+ ${warning('Ctrl+D')} Exit (alternative)
24
+ ${warning('Tab')} Command completion
25
+ ${warning('↑/↓')} Navigate command history
26
+ ${warning('Ctrl+L')} Clear screen
27
+
28
+ ${info('Chat Features:')}
29
+
30
+ ${primary('MCP Tools')} Local tool calling via Model Context Protocol
31
+ ${primary('Streaming')} Real-time response streaming
32
+ ${primary('Markdown')} Rich formatted responses (unless in raw mode)
33
+
34
+ ${info('Modes:')}
35
+
36
+ ${success('Raw Mode')} Disable markdown formatting for plain text output
37
+ ${success('Debug Mode')} Show detailed logging for troubleshooting
38
+
39
+ ${info('Terminal:')}
40
+
41
+ Use your terminal's scroll to view message history.
42
+ All messages remain visible after exit.
43
+
44
+ ${muted('For more information, visit: https://github.com/paean-ai/openpaean')}
45
+ `;
46
+ }
47
+ /**
48
+ * Get quick help (one-line hints)
49
+ */
50
+ export function getQuickHelp() {
51
+ return `${primary('[/]')} Commands ${primary('[?]')} Help ${primary('[Tab]')} Complete ${primary('[Ctrl+C]')} Exit`;
52
+ }
53
+ /**
54
+ * Get command-specific help
55
+ */
56
+ export function getCommandHelp(command) {
57
+ const commands = {
58
+ '/exit': 'Exit the chat session',
59
+ '/quit': 'Exit the chat session (alias for /exit)',
60
+ '/q': 'Exit the chat session (short alias)',
61
+ '/clear': 'Clear the screen',
62
+ '/cls': 'Clear the screen (alias)',
63
+ '/help': 'Show this help message',
64
+ '/debug': 'Toggle debug mode for detailed logging',
65
+ '/raw': 'Toggle raw mode (plain text output, no markdown)',
66
+ '/mcp': 'Show MCP server connection status and available tools',
67
+ };
68
+ return commands[command.toLowerCase()] || null;
69
+ }
70
+ /**
71
+ * Get keybinding help table
72
+ */
73
+ export function getKeyBindings() {
74
+ const bindings = [
75
+ { key: 'Ctrl+C', action: 'Exit / Abort' },
76
+ { key: 'Ctrl+D', action: 'Exit' },
77
+ { key: 'Ctrl+L', action: 'Clear screen' },
78
+ { key: 'Tab', action: 'Complete command' },
79
+ { key: '↑ / ↓', action: 'History navigation' },
80
+ { key: 'Enter', action: 'Send message' },
81
+ { key: '?', action: 'Show keybindings' },
82
+ ];
83
+ let output = '\n' + info('Keybindings:') + '\n\n';
84
+ for (const binding of bindings) {
85
+ output += ` ${warning(binding.key.padEnd(12))} ${binding.action}\n`;
86
+ }
87
+ return output;
88
+ }
89
+ //# sourceMappingURL=HelpDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpDisplay.js","sourceRoot":"","sources":["../../../src/ui/terminal/HelpDisplay.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE3E;;GAEG;AACH,MAAM,UAAU,WAAW;IACvB,OAAO;EACT,IAAI,CAAC,qBAAqB,CAAC;;IAEzB,OAAO,CAAC,kBAAkB,CAAC;IAC3B,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,eAAe,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,MAAM,CAAC;IACf,OAAO,CAAC,MAAM,CAAC;;EAEjB,IAAI,CAAC,qBAAqB,CAAC;;IAEzB,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,KAAK,CAAC;IACd,OAAO,CAAC,KAAK,CAAC;IACd,OAAO,CAAC,QAAQ,CAAC;;EAEnB,IAAI,CAAC,gBAAgB,CAAC;;IAEpB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,UAAU,CAAC;;EAErB,IAAI,CAAC,QAAQ,CAAC;;IAEZ,OAAO,CAAC,UAAU,CAAC;IACnB,OAAO,CAAC,YAAY,CAAC;;EAEvB,IAAI,CAAC,WAAW,CAAC;;;;;EAKjB,KAAK,CAAC,oEAAoE,CAAC;CAC5E,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IACxB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,KAAK,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,aAAa,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;AACxH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC1C,MAAM,QAAQ,GAA2B;QACrC,OAAO,EAAE,uBAAuB;QAChC,OAAO,EAAE,yCAAyC;QAClD,IAAI,EAAE,qCAAqC;QAC3C,QAAQ,EAAE,kBAAkB;QAC5B,MAAM,EAAE,0BAA0B;QAClC,OAAO,EAAE,wBAAwB;QACjC,QAAQ,EAAE,wCAAwC;QAClD,MAAM,EAAE,kDAAkD;QAC1D,MAAM,EAAE,uDAAuD;KAClE,CAAC;IAEF,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC1B,MAAM,QAAQ,GAAG;QACb,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE;QACzC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;QACjC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE;QACzC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE;QAC1C,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE;QAC9C,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE;QACxC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE;KAC3C,CAAC;IAEF,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;IAClD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;IACzE,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Spinner Component
3
+ * Loading indicators for different operation types
4
+ */
5
+ /**
6
+ * Spinner frames for different animation types
7
+ */
8
+ declare const SPINNER_FRAMES: {
9
+ dots: string[];
10
+ arrows: string[];
11
+ pipe: string[];
12
+ bounce: string[];
13
+ mcp: string[];
14
+ };
15
+ /**
16
+ * Spinner class
17
+ */
18
+ export declare class Spinner {
19
+ private state;
20
+ /**
21
+ * Start a spinner
22
+ */
23
+ start(label: string, type?: keyof typeof SPINNER_FRAMES): void;
24
+ /**
25
+ * Stop the spinner with success or failure message
26
+ */
27
+ stop(message?: string, success?: boolean): void;
28
+ /**
29
+ * Update the spinner label
30
+ */
31
+ update(label: string): void;
32
+ /**
33
+ * Render current frame
34
+ */
35
+ private render;
36
+ /**
37
+ * Check if spinner is active
38
+ */
39
+ get isActive(): boolean;
40
+ }
41
+ /**
42
+ * Pre-configured spinner functions
43
+ */
44
+ /**
45
+ * Thinking spinner (default for AI processing)
46
+ */
47
+ export declare function thinking(label?: string): Spinner;
48
+ /**
49
+ * Working spinner (for general operations)
50
+ */
51
+ export declare function working(label?: string): Spinner;
52
+ /**
53
+ * Loading spinner (for data loading)
54
+ */
55
+ export declare function loading(label?: string): Spinner;
56
+ /**
57
+ * MCP tool spinner
58
+ */
59
+ export declare function mcpSpinner(label?: string): Spinner;
60
+ /**
61
+ * Simple inline text that doesn't animate
62
+ */
63
+ export declare function staticIndicator(text: string, symbol?: string): void;
64
+ export {};
65
+ //# sourceMappingURL=Spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../../src/ui/terminal/Spinner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,QAAA,MAAM,cAAc;;;;;;CAMnB,CAAC;AAaF;;GAEG;AACH,qBAAa,OAAO;IAChB,OAAO,CAAC,KAAK,CAMX;IAEF;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,OAAO,cAAuB,GAAG,IAAI;IAoBtE;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,UAAO,GAAG,IAAI;IAqB5C;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3B;;OAEG;IACH,OAAO,CAAC,MAAM;IAOd;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;CACJ;AAED;;GAEG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,SAAgB,GAAG,OAAO,CAIvD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,SAAe,GAAG,OAAO,CAIrD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,SAAe,GAAG,OAAO,CAIrD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,SAAgB,GAAG,OAAO,CAIzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAyB,GAAG,IAAI,CAErF"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Spinner Component
3
+ * Loading indicators for different operation types
4
+ */
5
+ import { thinkingSymbol } from '../theme/index.js';
6
+ /**
7
+ * Spinner frames for different animation types
8
+ */
9
+ const SPINNER_FRAMES = {
10
+ dots: ['⋯', '⋯', '⋰', '⋱'],
11
+ arrows: ['←', '↑', '→', '↓'],
12
+ pipe: ['|', '/', '-', '\\'],
13
+ bounce: ['⠁', '⠂', '⠄', '⡀', '⢀', '⠠', '⠐', '⠈'],
14
+ mcp: ['[⚙]', '[⚙⚙]', '[⚙⚙⚙]'],
15
+ };
16
+ /**
17
+ * Spinner class
18
+ */
19
+ export class Spinner {
20
+ state = {
21
+ label: '',
22
+ type: 'dots',
23
+ frame: 0,
24
+ interval: null,
25
+ active: false,
26
+ };
27
+ /**
28
+ * Start a spinner
29
+ */
30
+ start(label, type = 'dots') {
31
+ this.stop(); // Stop any existing spinner
32
+ this.state.label = label;
33
+ this.state.type = type;
34
+ this.state.frame = 0;
35
+ this.state.active = true;
36
+ // Show initial frame
37
+ this.render();
38
+ // Start animation
39
+ this.state.interval = setInterval(() => {
40
+ if (this.state.active) {
41
+ this.state.frame = (this.state.frame + 1) % SPINNER_FRAMES[this.state.type].length;
42
+ this.render();
43
+ }
44
+ }, 100);
45
+ }
46
+ /**
47
+ * Stop the spinner with success or failure message
48
+ */
49
+ stop(message, success = true) {
50
+ if (!this.state.active)
51
+ return;
52
+ if (this.state.interval) {
53
+ clearInterval(this.state.interval);
54
+ this.state.interval = null;
55
+ }
56
+ this.state.active = false;
57
+ // Clear the spinner line
58
+ process.stdout.write('\r\x1b[2K'); // Move to start, clear line
59
+ // Show final message
60
+ if (message) {
61
+ const symbol = success ? '✓' : '✗';
62
+ const color = success ? '\x1b[92m' : '\x1b[91m'; // green or red
63
+ process.stdout.write(`${color}${symbol}\x1b[0m ${message}\n`);
64
+ }
65
+ }
66
+ /**
67
+ * Update the spinner label
68
+ */
69
+ update(label) {
70
+ this.state.label = label;
71
+ this.render();
72
+ }
73
+ /**
74
+ * Render current frame
75
+ */
76
+ render() {
77
+ if (!this.state.active)
78
+ return;
79
+ const frame = SPINNER_FRAMES[this.state.type][this.state.frame];
80
+ process.stdout.write(`\r\x1b[2K${frame} ${this.state.label}`);
81
+ }
82
+ /**
83
+ * Check if spinner is active
84
+ */
85
+ get isActive() {
86
+ return this.state.active;
87
+ }
88
+ }
89
+ /**
90
+ * Pre-configured spinner functions
91
+ */
92
+ /**
93
+ * Thinking spinner (default for AI processing)
94
+ */
95
+ export function thinking(label = 'Thinking...') {
96
+ const spinner = new Spinner();
97
+ spinner.start(label, 'dots');
98
+ return spinner;
99
+ }
100
+ /**
101
+ * Working spinner (for general operations)
102
+ */
103
+ export function working(label = 'Working...') {
104
+ const spinner = new Spinner();
105
+ spinner.start(label, 'arrows');
106
+ return spinner;
107
+ }
108
+ /**
109
+ * Loading spinner (for data loading)
110
+ */
111
+ export function loading(label = 'Loading...') {
112
+ const spinner = new Spinner();
113
+ spinner.start(label, 'bounce');
114
+ return spinner;
115
+ }
116
+ /**
117
+ * MCP tool spinner
118
+ */
119
+ export function mcpSpinner(label = 'MCP Tool...') {
120
+ const spinner = new Spinner();
121
+ spinner.start(label, 'mcp');
122
+ return spinner;
123
+ }
124
+ /**
125
+ * Simple inline text that doesn't animate
126
+ */
127
+ export function staticIndicator(text, symbol = thinkingSymbol()) {
128
+ process.stdout.write(`\r${symbol} ${text}`);
129
+ }
130
+ //# sourceMappingURL=Spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../../src/ui/terminal/Spinner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Status Bar Component
3
+ * Displays helpful hints and status information at the bottom
4
+ */
5
+ /**
6
+ * Status bar state
7
+ */
8
+ export interface StatusBarState {
9
+ isProcessing: boolean;
10
+ hasInput: boolean;
11
+ mcpToolCount: number;
12
+ isRawMode: boolean;
13
+ isDebugMode: boolean;
14
+ }
15
+ /**
16
+ * Default status bar state
17
+ */
18
+ export declare const defaultStatusBarState: StatusBarState;
19
+ /**
20
+ * Format the status bar content
21
+ */
22
+ export declare function formatStatusBar(state?: Partial<StatusBarState>): string;
23
+ /**
24
+ * Get just the hints part (for input area integration)
25
+ */
26
+ export declare function getStatusHints(state?: Partial<StatusBarState>): string;
27
+ //# sourceMappingURL=StatusBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../src/ui/terminal/StatusBar.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAMnC,CAAC;AAkBF;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,MAAM,CAyC3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,MAAM,CAS1E"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Status Bar Component
3
+ * Displays helpful hints and status information at the bottom
4
+ */
5
+ import { ANSI, colorize, getTerminalWidth, style } from './output.js';
6
+ import { primary, warning } from '../theme/index.js';
7
+ /**
8
+ * Default status bar state
9
+ */
10
+ export const defaultStatusBarState = {
11
+ isProcessing: false,
12
+ hasInput: false,
13
+ mcpToolCount: 0,
14
+ isRawMode: false,
15
+ isDebugMode: false,
16
+ };
17
+ /**
18
+ * Status bar key hints
19
+ */
20
+ const KEY_HINTS = {
21
+ default: () => primary('[/]') + ' Commands ' +
22
+ primary('[?]') + ' Help ' +
23
+ primary('[Tab]') + ' Complete ' +
24
+ primary('[Ctrl+C]') + ' Exit',
25
+ processing: () => colorize('[Ctrl+C]', ANSI.brightRed) + ' Abort',
26
+ withInput: () => primary('[Tab]') + ' Complete ' +
27
+ primary('[Ctrl+R]') + ' History ' +
28
+ primary('[Esc]') + ' Clear',
29
+ };
30
+ /**
31
+ * Format the status bar content
32
+ */
33
+ export function formatStatusBar(state = {}) {
34
+ const mergedState = { ...defaultStatusBarState, ...state };
35
+ // Choose hints based on state
36
+ let hints;
37
+ if (mergedState.isProcessing) {
38
+ hints = KEY_HINTS.processing();
39
+ }
40
+ else if (mergedState.hasInput) {
41
+ hints = KEY_HINTS.withInput();
42
+ }
43
+ else {
44
+ hints = KEY_HINTS.default();
45
+ }
46
+ // Build status indicators
47
+ const indicators = [];
48
+ if (mergedState.mcpToolCount > 0) {
49
+ indicators.push(primary(`🔗 ${mergedState.mcpToolCount} tools`));
50
+ }
51
+ if (mergedState.isRawMode) {
52
+ indicators.push(warning('[RAW]'));
53
+ }
54
+ if (mergedState.isDebugMode) {
55
+ indicators.push(warning('[DEBUG]'));
56
+ }
57
+ // Build full status bar
58
+ const width = getTerminalWidth();
59
+ const leftPart = hints;
60
+ const rightPart = indicators.length > 0 ? ' ' + indicators.join(' ') : '';
61
+ // Calculate padding
62
+ const totalLength = leftPart.length + rightPart.length;
63
+ const padding = Math.max(0, width - totalLength - 2);
64
+ return style(leftPart + ' '.repeat(padding) + rightPart, ANSI.dim);
65
+ }
66
+ /**
67
+ * Get just the hints part (for input area integration)
68
+ */
69
+ export function getStatusHints(state = {}) {
70
+ const mergedState = { ...defaultStatusBarState, ...state };
71
+ if (mergedState.isProcessing) {
72
+ return colorize('[Ctrl+C] Abort', ANSI.brightRed);
73
+ }
74
+ else if (mergedState.hasInput) {
75
+ return primary('[Tab]') + ' Complete ' + primary('[Ctrl+R]') + ' History';
76
+ }
77
+ return primary('[/]') + ' Commands ' + primary('[?]') + ' Help';
78
+ }
79
+ //# sourceMappingURL=StatusBar.js.map