openpaean 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 (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -0
  3. package/dist/agent/chat.ink.d.ts +28 -0
  4. package/dist/agent/chat.ink.d.ts.map +1 -0
  5. package/dist/agent/chat.ink.js +57 -0
  6. package/dist/agent/chat.ink.js.map +1 -0
  7. package/dist/agent/chat.legacy.d.ts +25 -0
  8. package/dist/agent/chat.legacy.d.ts.map +1 -0
  9. package/dist/agent/chat.legacy.js +299 -0
  10. package/dist/agent/chat.legacy.js.map +1 -0
  11. package/dist/agent/cli-mode.d.ts +35 -0
  12. package/dist/agent/cli-mode.d.ts.map +1 -0
  13. package/dist/agent/cli-mode.js +69 -0
  14. package/dist/agent/cli-mode.js.map +1 -0
  15. package/dist/agent/completer.d.ts +39 -0
  16. package/dist/agent/completer.d.ts.map +1 -0
  17. package/dist/agent/completer.js +101 -0
  18. package/dist/agent/completer.js.map +1 -0
  19. package/dist/agent/index.d.ts +15 -0
  20. package/dist/agent/index.d.ts.map +1 -0
  21. package/dist/agent/index.js +11 -0
  22. package/dist/agent/index.js.map +1 -0
  23. package/dist/agent/renderer.d.ts +53 -0
  24. package/dist/agent/renderer.d.ts.map +1 -0
  25. package/dist/agent/renderer.js +133 -0
  26. package/dist/agent/renderer.js.map +1 -0
  27. package/dist/agent/service.d.ts +44 -0
  28. package/dist/agent/service.d.ts.map +1 -0
  29. package/dist/agent/service.js +192 -0
  30. package/dist/agent/service.js.map +1 -0
  31. package/dist/agent/spinner.d.ts +37 -0
  32. package/dist/agent/spinner.d.ts.map +1 -0
  33. package/dist/agent/spinner.js +200 -0
  34. package/dist/agent/spinner.js.map +1 -0
  35. package/dist/agent/types.d.ts +84 -0
  36. package/dist/agent/types.d.ts.map +1 -0
  37. package/dist/agent/types.js +6 -0
  38. package/dist/agent/types.js.map +1 -0
  39. package/dist/api/auth.d.ts +71 -0
  40. package/dist/api/auth.d.ts.map +1 -0
  41. package/dist/api/auth.js +261 -0
  42. package/dist/api/auth.js.map +1 -0
  43. package/dist/api/client.d.ts +37 -0
  44. package/dist/api/client.d.ts.map +1 -0
  45. package/dist/api/client.js +101 -0
  46. package/dist/api/client.js.map +1 -0
  47. package/dist/api/todo.d.ts +223 -0
  48. package/dist/api/todo.d.ts.map +1 -0
  49. package/dist/api/todo.js +196 -0
  50. package/dist/api/todo.js.map +1 -0
  51. package/dist/cli.d.ts +7 -0
  52. package/dist/cli.d.ts.map +1 -0
  53. package/dist/cli.js +55 -0
  54. package/dist/cli.js.map +1 -0
  55. package/dist/commands/agent.d.ts +16 -0
  56. package/dist/commands/agent.d.ts.map +1 -0
  57. package/dist/commands/agent.js +132 -0
  58. package/dist/commands/agent.js.map +1 -0
  59. package/dist/commands/context.d.ts +7 -0
  60. package/dist/commands/context.d.ts.map +1 -0
  61. package/dist/commands/context.js +155 -0
  62. package/dist/commands/context.js.map +1 -0
  63. package/dist/commands/login.d.ts +7 -0
  64. package/dist/commands/login.d.ts.map +1 -0
  65. package/dist/commands/login.js +109 -0
  66. package/dist/commands/login.js.map +1 -0
  67. package/dist/commands/logout.d.ts +7 -0
  68. package/dist/commands/logout.d.ts.map +1 -0
  69. package/dist/commands/logout.js +27 -0
  70. package/dist/commands/logout.js.map +1 -0
  71. package/dist/commands/serve.d.ts +7 -0
  72. package/dist/commands/serve.d.ts.map +1 -0
  73. package/dist/commands/serve.js +29 -0
  74. package/dist/commands/serve.js.map +1 -0
  75. package/dist/commands/tasks.d.ts +7 -0
  76. package/dist/commands/tasks.d.ts.map +1 -0
  77. package/dist/commands/tasks.js +277 -0
  78. package/dist/commands/tasks.js.map +1 -0
  79. package/dist/commands/validate.d.ts +7 -0
  80. package/dist/commands/validate.d.ts.map +1 -0
  81. package/dist/commands/validate.js +123 -0
  82. package/dist/commands/validate.js.map +1 -0
  83. package/dist/index.d.ts +15 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +23 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/mcp/client.d.ts +115 -0
  88. package/dist/mcp/client.d.ts.map +1 -0
  89. package/dist/mcp/client.js +439 -0
  90. package/dist/mcp/client.js.map +1 -0
  91. package/dist/mcp/resources.d.ts +14 -0
  92. package/dist/mcp/resources.d.ts.map +1 -0
  93. package/dist/mcp/resources.js +195 -0
  94. package/dist/mcp/resources.js.map +1 -0
  95. package/dist/mcp/server.d.ts +12 -0
  96. package/dist/mcp/server.d.ts.map +1 -0
  97. package/dist/mcp/server.js +82 -0
  98. package/dist/mcp/server.js.map +1 -0
  99. package/dist/mcp/tools.d.ts +14 -0
  100. package/dist/mcp/tools.d.ts.map +1 -0
  101. package/dist/mcp/tools.js +582 -0
  102. package/dist/mcp/tools.js.map +1 -0
  103. package/dist/ui/App.d.ts +15 -0
  104. package/dist/ui/App.d.ts.map +1 -0
  105. package/dist/ui/App.js +80 -0
  106. package/dist/ui/App.js.map +1 -0
  107. package/dist/ui/FullscreenApp.d.ts +16 -0
  108. package/dist/ui/FullscreenApp.d.ts.map +1 -0
  109. package/dist/ui/FullscreenApp.js +48 -0
  110. package/dist/ui/FullscreenApp.js.map +1 -0
  111. package/dist/ui/components/Header.d.ts +11 -0
  112. package/dist/ui/components/Header.d.ts.map +1 -0
  113. package/dist/ui/components/Header.js +6 -0
  114. package/dist/ui/components/Header.js.map +1 -0
  115. package/dist/ui/components/InputArea.d.ts +16 -0
  116. package/dist/ui/components/InputArea.d.ts.map +1 -0
  117. package/dist/ui/components/InputArea.js +109 -0
  118. package/dist/ui/components/InputArea.js.map +1 -0
  119. package/dist/ui/components/Spinner.d.ts +12 -0
  120. package/dist/ui/components/Spinner.d.ts.map +1 -0
  121. package/dist/ui/components/Spinner.js +8 -0
  122. package/dist/ui/components/Spinner.js.map +1 -0
  123. package/dist/ui/components/StreamingText.d.ts +13 -0
  124. package/dist/ui/components/StreamingText.d.ts.map +1 -0
  125. package/dist/ui/components/StreamingText.js +8 -0
  126. package/dist/ui/components/StreamingText.js.map +1 -0
  127. package/dist/ui/components/ToolCallIndicator.d.ts +14 -0
  128. package/dist/ui/components/ToolCallIndicator.d.ts.map +1 -0
  129. package/dist/ui/components/ToolCallIndicator.js +10 -0
  130. package/dist/ui/components/ToolCallIndicator.js.map +1 -0
  131. package/dist/ui/components/index.d.ts +9 -0
  132. package/dist/ui/components/index.d.ts.map +1 -0
  133. package/dist/ui/components/index.js +9 -0
  134. package/dist/ui/components/index.js.map +1 -0
  135. package/dist/ui/hooks/index.d.ts +6 -0
  136. package/dist/ui/hooks/index.d.ts.map +1 -0
  137. package/dist/ui/hooks/index.js +6 -0
  138. package/dist/ui/hooks/index.js.map +1 -0
  139. package/dist/ui/hooks/useAgentStream.d.ts +37 -0
  140. package/dist/ui/hooks/useAgentStream.d.ts.map +1 -0
  141. package/dist/ui/hooks/useAgentStream.js +122 -0
  142. package/dist/ui/hooks/useAgentStream.js.map +1 -0
  143. package/dist/ui/hooks/useCommands.d.ts +31 -0
  144. package/dist/ui/hooks/useCommands.d.ts.map +1 -0
  145. package/dist/ui/hooks/useCommands.js +108 -0
  146. package/dist/ui/hooks/useCommands.js.map +1 -0
  147. package/dist/ui/index.d.ts +7 -0
  148. package/dist/ui/index.d.ts.map +1 -0
  149. package/dist/ui/index.js +7 -0
  150. package/dist/ui/index.js.map +1 -0
  151. package/dist/utils/config.d.ts +70 -0
  152. package/dist/utils/config.d.ts.map +1 -0
  153. package/dist/utils/config.js +130 -0
  154. package/dist/utils/config.js.map +1 -0
  155. package/dist/utils/output.d.ts +79 -0
  156. package/dist/utils/output.d.ts.map +1 -0
  157. package/dist/utils/output.js +157 -0
  158. package/dist/utils/output.js.map +1 -0
  159. package/dist/utils/project.d.ts +29 -0
  160. package/dist/utils/project.d.ts.map +1 -0
  161. package/dist/utils/project.js +135 -0
  162. package/dist/utils/project.js.map +1 -0
  163. package/package.json +81 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 Paean AI (Zero One Intelligence)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,129 @@
1
+ # OpenPaean
2
+
3
+ > Open source AI agent CLI with fullscreen TUI and local MCP integration
4
+
5
+ <p align="center">
6
+ <img src="https://img.shields.io/npm/v/openpaean?style=flat-square" alt="npm version" />
7
+ <img src="https://img.shields.io/npm/l/openpaean?style=flat-square" alt="license" />
8
+ <img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen?style=flat-square" alt="node version" />
9
+ </p>
10
+
11
+ **OpenPaean** is a powerful command-line AI agent that provides:
12
+
13
+ - **🖥️ Fullscreen TUI**: Immersive terminal experience like opencode and claude-code
14
+ - **🤖 Agent Mode**: Interactive AI chat with streaming responses
15
+ - **🔗 Local MCP Integration**: Connect to local MCP servers for tool calling
16
+ - **📋 Task Management**: View, create, and manage tasks from the command line
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ # Install globally with bun (recommended)
22
+ bun add -g openpaean
23
+
24
+ # Or use npm
25
+ npm install -g openpaean
26
+
27
+ # Or use directly with npx
28
+ npx openpaean
29
+ ```
30
+
31
+ ## Quick Start
32
+
33
+ ### 1. Authenticate
34
+
35
+ ```bash
36
+ openpaean login
37
+ ```
38
+
39
+ ### 2. Start Agent Mode
40
+
41
+ ```bash
42
+ # Start fullscreen TUI mode (default)
43
+ openpaean
44
+
45
+ # Disable fullscreen mode
46
+ openpaean --no-fullscreen
47
+
48
+ # Send a single message
49
+ openpaean -m "What can you help me with?"
50
+ ```
51
+
52
+ ### 3. Configure Local MCP Servers
53
+
54
+ Create `~/.openpaean/mcp_config.json`:
55
+
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "vibe_kanban": {
60
+ "command": "npx",
61
+ "args": ["-y", "vibe-kanban@latest", "--mcp"]
62
+ }
63
+ }
64
+ }
65
+ ```
66
+
67
+ ## Options
68
+
69
+ ```bash
70
+ openpaean # Start fullscreen TUI mode
71
+ openpaean --no-fullscreen # Disable fullscreen mode
72
+ openpaean --no-mcp # Disable local MCP integration
73
+ openpaean -d, --debug # Enable debug logging
74
+ openpaean -m "message" # Send a single message
75
+ ```
76
+
77
+ ## Configuration
78
+
79
+ Config stored in `~/.openpaean/`:
80
+
81
+ - `config.json` - Auth and preferences
82
+ - `mcp_config.json` - MCP server configuration
83
+
84
+ ### Environment Variables
85
+
86
+ ```bash
87
+ # Override API endpoint (for self-hosted backends)
88
+ OPENPAEAN_API_URL=https://your-api.com
89
+
90
+ # Override Web URL (for OAuth callbacks)
91
+ OPENPAEAN_WEB_URL=https://your-web.com
92
+ ```
93
+
94
+ ## Architecture
95
+
96
+ ```
97
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
98
+ │ You (CLI) │────▶│ API Backend │────▶│ AI Agent │
99
+ │ (Fullscreen) │ │ │ │ (ADK) │
100
+ └─────────────────┘ └─────────────────┘ └─────────────────┘
101
+ │ │ │
102
+ │ │ SSE: mcp_tool_call │
103
+ ▼ ▼ │
104
+ ┌─────────────────┐◀────────────────────────────────────┘
105
+ │ Local MCP │
106
+ │ Servers │ ← Executes locally, returns result
107
+ └─────────────────┘
108
+ ```
109
+
110
+ ## Security
111
+
112
+ - **No hardcoded secrets**: All credentials stored locally in `~/.openpaean/`
113
+ - **Environment variable support**: Override API URLs for self-hosted deployments
114
+ - **MCP server trust**: Only configure MCP servers from trusted sources
115
+
116
+ See [SECURITY.md](SECURITY.md) for vulnerability reporting.
117
+
118
+ ## Contributing
119
+
120
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
121
+
122
+ ## Requirements
123
+
124
+ - Node.js 18+ or Bun
125
+ - Paean AI account (or self-hosted backend)
126
+
127
+ ## License
128
+
129
+ MIT © [Paean AI](https://paean.ai)
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Interactive Chat Loop - Ink Version
3
+ * Modern React-based CLI interface using Ink
4
+ * Supports both inline and fullscreen modes
5
+ */
6
+ import type { McpState, McpToolResult } from './types.js';
7
+ /**
8
+ * Chat options
9
+ */
10
+ export interface ChatOptions {
11
+ mcpState?: McpState;
12
+ onMcpToolCall?: (callId: string, serverName: string, toolName: string, args: Record<string, unknown>) => Promise<McpToolResult>;
13
+ debug?: boolean;
14
+ }
15
+ /**
16
+ * Start the interactive chat loop using Ink (inline mode)
17
+ */
18
+ export declare function startChat(options?: ChatOptions): Promise<void>;
19
+ /**
20
+ * Start the interactive chat loop in fullscreen mode
21
+ */
22
+ export declare function startFullscreenChat(options?: ChatOptions): Promise<void>;
23
+ /**
24
+ * Send a single message (non-interactive mode)
25
+ * This is kept for programmatic usage
26
+ */
27
+ export { sendMessage } from './chat.legacy.js';
28
+ //# sourceMappingURL=chat.ink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.ink.d.ts","sourceRoot":"","sources":["../../src/agent/chat.ink.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,aAAa,CAAC,EAAE,CACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAkBD;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAcxE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBlF;AAED;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Interactive Chat Loop - Ink Version
4
+ * Modern React-based CLI interface using Ink
5
+ * Supports both inline and fullscreen modes
6
+ */
7
+ import { render } from 'ink';
8
+ import { App } from '../ui/App.js';
9
+ import { FullscreenApp } from '../ui/FullscreenApp.js';
10
+ /**
11
+ * Enter alternate screen buffer for fullscreen mode
12
+ */
13
+ function enterAlternateScreen() {
14
+ process.stdout.write('\x1b[?1049h'); // Enter alternate screen
15
+ process.stdout.write('\x1b[H'); // Move cursor to top-left
16
+ process.stdout.write('\x1b[2J'); // Clear screen
17
+ }
18
+ /**
19
+ * Exit alternate screen buffer
20
+ */
21
+ function exitAlternateScreen() {
22
+ process.stdout.write('\x1b[?1049l'); // Exit alternate screen
23
+ }
24
+ /**
25
+ * Start the interactive chat loop using Ink (inline mode)
26
+ */
27
+ export async function startChat(options = {}) {
28
+ const { mcpState, onMcpToolCall, debug } = options;
29
+ // Render the Ink application
30
+ const { waitUntilExit } = render(_jsx(App, { mcpState: mcpState, onMcpToolCall: onMcpToolCall, debug: debug }));
31
+ // Wait until the app exits
32
+ await waitUntilExit();
33
+ }
34
+ /**
35
+ * Start the interactive chat loop in fullscreen mode
36
+ */
37
+ export async function startFullscreenChat(options = {}) {
38
+ const { mcpState, onMcpToolCall, debug } = options;
39
+ // Enter alternate screen buffer
40
+ enterAlternateScreen();
41
+ try {
42
+ // Render the fullscreen Ink application
43
+ const { waitUntilExit } = render(_jsx(FullscreenApp, { mcpState: mcpState, onMcpToolCall: onMcpToolCall, debug: debug }));
44
+ // Wait until the app exits
45
+ await waitUntilExit();
46
+ }
47
+ finally {
48
+ // Always exit alternate screen on cleanup
49
+ exitAlternateScreen();
50
+ }
51
+ }
52
+ /**
53
+ * Send a single message (non-interactive mode)
54
+ * This is kept for programmatic usage
55
+ */
56
+ export { sendMessage } from './chat.legacy.js';
57
+ //# sourceMappingURL=chat.ink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.ink.js","sourceRoot":"","sources":["../../src/agent/chat.ink.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAiBvD;;GAEG;AACH,SAAS,oBAAoB;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,yBAAyB;IAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAM,0BAA0B;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAK,eAAe;AACxD,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,wBAAwB;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAuB,EAAE;IACrD,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEnD,6BAA6B;IAC7B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC5B,KAAC,GAAG,IACA,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,KAAK,GACd,CACL,CAAC;IAEF,2BAA2B;IAC3B,MAAM,aAAa,EAAE,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAuB,EAAE;IAC/D,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEnD,gCAAgC;IAChC,oBAAoB,EAAE,CAAC;IAEvB,IAAI,CAAC;QACD,wCAAwC;QACxC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC5B,KAAC,aAAa,IACV,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,KAAK,GACd,CACL,CAAC;QAEF,2BAA2B;QAC3B,MAAM,aAAa,EAAE,CAAC;IAC1B,CAAC;YAAS,CAAC;QACP,0CAA0C;QAC1C,mBAAmB,EAAE,CAAC;IAC1B,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Interactive Chat Loop
3
+ * Handles user input and agent responses in a REPL-style interface
4
+ * Features: Dynamic spinners, Tab completion, CLI-friendly mode
5
+ */
6
+ import { type CliModeOptions } from './cli-mode.js';
7
+ import type { McpState, McpToolResult } from './types.js';
8
+ /**
9
+ * Chat options
10
+ */
11
+ export interface ChatOptions {
12
+ mcpState?: McpState;
13
+ onMcpToolCall?: (callId: string, serverName: string, toolName: string, args: Record<string, unknown>) => Promise<McpToolResult>;
14
+ debug?: boolean;
15
+ cliMode?: Partial<CliModeOptions>;
16
+ }
17
+ /**
18
+ * Start the interactive chat loop
19
+ */
20
+ export declare function startChat(options?: ChatOptions): Promise<void>;
21
+ /**
22
+ * Send a single message (non-interactive mode)
23
+ */
24
+ export declare function sendMessage(message: string, options?: ChatOptions): Promise<string>;
25
+ //# sourceMappingURL=chat.legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.legacy.d.ts","sourceRoot":"","sources":["../../src/agent/chat.legacy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH,OAAO,EAGH,KAAK,cAAc,EACtB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAwB,MAAM,YAAY,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,aAAa,CAAC,EAAE,CACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACrC;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsRxE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA4CjB"}
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Interactive Chat Loop
3
+ * Handles user input and agent responses in a REPL-style interface
4
+ * Features: Dynamic spinners, Tab completion, CLI-friendly mode
5
+ */
6
+ import * as readline from 'readline';
7
+ import chalk from 'chalk';
8
+ import { agentService } from './service.js';
9
+ import { renderMarkdown, renderError, renderPrompt, renderAgentLabel, renderWelcome, renderGoodbye, renderThinking, } from './renderer.js';
10
+ // Spinner imports (kept for future use)
11
+ // import {
12
+ // createThinkingSpinner,
13
+ // createMcpSpinner,
14
+ // type SpinnerController,
15
+ // } from './spinner.js';
16
+ import { commandCompleter, renderCommandHelp, } from './completer.js';
17
+ import { isCliModeActive, isRawStreamEnabled, } from './cli-mode.js';
18
+ /**
19
+ * Start the interactive chat loop
20
+ */
21
+ export async function startChat(options = {}) {
22
+ const { mcpState, onMcpToolCall, debug } = options;
23
+ // CLI mode state
24
+ let cliModeEnabled = isCliModeActive(options.cliMode);
25
+ let rawStreamEnabled = isRawStreamEnabled(options.cliMode);
26
+ // Calculate total MCP tools
27
+ const mcpToolCount = mcpState?.mcpServers?.reduce((sum, server) => sum + (server.tools?.length || 0), 0);
28
+ // Print welcome message
29
+ console.log(renderWelcome(mcpToolCount));
30
+ // Create readline interface with completer
31
+ const rl = readline.createInterface({
32
+ input: process.stdin,
33
+ output: process.stdout,
34
+ terminal: true,
35
+ completer: commandCompleter,
36
+ });
37
+ let conversationId;
38
+ let isProcessing = false;
39
+ let currentStreamAbort = null;
40
+ // Handle Ctrl+C
41
+ const handleSigint = () => {
42
+ if (isProcessing) {
43
+ // Abort current stream
44
+ if (currentStreamAbort) {
45
+ currentStreamAbort();
46
+ }
47
+ console.log(chalk.dim('\n(interrupted)'));
48
+ isProcessing = false;
49
+ currentStreamAbort = null;
50
+ promptUser();
51
+ }
52
+ else {
53
+ // Exit
54
+ console.log(renderGoodbye());
55
+ rl.close();
56
+ process.exit(0);
57
+ }
58
+ };
59
+ process.on('SIGINT', handleSigint);
60
+ // Prompt for user input
61
+ const promptUser = () => {
62
+ rl.question(renderPrompt(), async (input) => {
63
+ const trimmedInput = input.trim();
64
+ if (!trimmedInput) {
65
+ promptUser();
66
+ return;
67
+ }
68
+ // Handle slash commands
69
+ if (trimmedInput.startsWith('/')) {
70
+ const handled = handleCommand(trimmedInput);
71
+ if (handled) {
72
+ promptUser();
73
+ return;
74
+ }
75
+ }
76
+ // Process the message
77
+ await processMessage(trimmedInput);
78
+ promptUser();
79
+ });
80
+ };
81
+ // Handle slash commands
82
+ const handleCommand = (input) => {
83
+ const cmd = input.toLowerCase();
84
+ switch (cmd) {
85
+ case '/exit':
86
+ case '/quit':
87
+ case '/q':
88
+ console.log(renderGoodbye());
89
+ rl.close();
90
+ process.exit(0);
91
+ case '/clear':
92
+ case '/cls':
93
+ console.clear();
94
+ console.log(renderWelcome(mcpToolCount));
95
+ return true;
96
+ case '/help':
97
+ case '/h':
98
+ case '/?':
99
+ console.log(renderCommandHelp());
100
+ return true;
101
+ case '/debug':
102
+ options.debug = !options.debug;
103
+ console.log(chalk.dim(` Debug mode: ${options.debug ? chalk.green('ON') : chalk.red('OFF')}`));
104
+ console.log('');
105
+ return true;
106
+ case '/raw':
107
+ cliModeEnabled = !cliModeEnabled;
108
+ rawStreamEnabled = cliModeEnabled;
109
+ console.log(chalk.dim(` Raw mode: ${cliModeEnabled ? chalk.green('ON') : chalk.red('OFF')}`));
110
+ if (cliModeEnabled) {
111
+ console.log(chalk.dim(' Agent will return plain text (no markdown)'));
112
+ }
113
+ console.log('');
114
+ return true;
115
+ case '/mcp':
116
+ if (mcpState?.mcpServers && mcpState.mcpServers.length > 0) {
117
+ console.log(chalk.bold.cyan('\n MCP Connections:\n'));
118
+ for (const server of mcpState.mcpServers) {
119
+ const toolCount = server.tools?.length || 0;
120
+ console.log(` ${chalk.yellow(server.name)}: ${chalk.green(toolCount)} tools`);
121
+ }
122
+ console.log('');
123
+ }
124
+ else {
125
+ console.log(chalk.dim('\n No MCP servers connected\n'));
126
+ }
127
+ return true;
128
+ default:
129
+ // Unknown command
130
+ if (cmd.startsWith('/')) {
131
+ console.log(chalk.dim(`\n Unknown command: ${cmd}`));
132
+ console.log(chalk.dim(' Type /help for available commands\n'));
133
+ return true;
134
+ }
135
+ return false;
136
+ }
137
+ };
138
+ // Process a message - simplified version following old working pattern
139
+ const processMessage = async (message) => {
140
+ isProcessing = true;
141
+ let responseText = '';
142
+ let isFirstContent = true;
143
+ // Print thinking indicator (use simple text, not ora spinner)
144
+ process.stdout.write('\n' + renderThinking());
145
+ const callbacks = {
146
+ onContent: (text, partial) => {
147
+ if (rawStreamEnabled && partial) {
148
+ // Raw stream mode: output directly
149
+ if (isFirstContent) {
150
+ process.stdout.write('\r\x1b[K'); // Clear thinking
151
+ process.stdout.write(renderAgentLabel());
152
+ isFirstContent = false;
153
+ }
154
+ process.stdout.write(text);
155
+ }
156
+ else {
157
+ // Buffered mode: accumulate text
158
+ if (partial) {
159
+ responseText += text;
160
+ }
161
+ else {
162
+ responseText = text;
163
+ }
164
+ }
165
+ },
166
+ onToolCall: (_id, name) => {
167
+ if (debug) {
168
+ process.stdout.write('\r\x1b[K');
169
+ console.log(chalk.dim(` 🔧 ${name}...`));
170
+ process.stdout.write(renderThinking());
171
+ }
172
+ },
173
+ onToolResult: (_id, _name) => {
174
+ if (debug) {
175
+ process.stdout.write('\r\x1b[K');
176
+ process.stdout.write(renderThinking());
177
+ }
178
+ },
179
+ onMcpToolCall: async (callId, serverName, toolName, args) => {
180
+ // Clear thinking and show MCP call
181
+ process.stdout.write('\r\x1b[K');
182
+ console.log(chalk.dim(` 🔌 MCP: ${serverName} → ${toolName}`));
183
+ if (onMcpToolCall) {
184
+ try {
185
+ const result = await onMcpToolCall(callId, serverName, toolName, args);
186
+ console.log(chalk.dim(` ✓ MCP: ${serverName} → ${toolName} completed`));
187
+ // Restore thinking indicator
188
+ process.stdout.write(renderThinking());
189
+ return result;
190
+ }
191
+ catch (error) {
192
+ console.log(chalk.dim(` ✗ MCP: ${serverName} → ${toolName} failed`));
193
+ process.stdout.write(renderThinking());
194
+ return {
195
+ content: [
196
+ {
197
+ type: 'text',
198
+ text: `Error: ${error.message}`,
199
+ },
200
+ ],
201
+ isError: true,
202
+ };
203
+ }
204
+ }
205
+ process.stdout.write(renderThinking());
206
+ return {
207
+ content: [{ type: 'text', text: 'MCP not available' }],
208
+ isError: true,
209
+ };
210
+ },
211
+ onDone: (convId) => {
212
+ conversationId = convId;
213
+ // Clear thinking indicator
214
+ process.stdout.write('\r\x1b[K');
215
+ if (responseText) {
216
+ if (rawStreamEnabled) {
217
+ // Raw mode: just add newline (content already streamed)
218
+ console.log('');
219
+ }
220
+ else {
221
+ // Markdown mode: render complete response
222
+ process.stdout.write(renderAgentLabel());
223
+ const rendered = cliModeEnabled
224
+ ? responseText // CLI mode: plain text
225
+ : renderMarkdown(responseText); // Normal: markdown
226
+ console.log(rendered.trim());
227
+ }
228
+ }
229
+ console.log(''); // New line after response
230
+ isProcessing = false;
231
+ currentStreamAbort = null;
232
+ },
233
+ onError: (error) => {
234
+ process.stdout.write('\r\x1b[K'); // Clear line
235
+ console.log(renderError(error));
236
+ isProcessing = false;
237
+ currentStreamAbort = null;
238
+ },
239
+ };
240
+ try {
241
+ const { abort } = await agentService.streamMessage(message, callbacks, {
242
+ conversationId,
243
+ mcpState,
244
+ cliMode: cliModeEnabled ? { enabled: true, streamRaw: rawStreamEnabled } : undefined,
245
+ });
246
+ currentStreamAbort = abort;
247
+ }
248
+ catch (error) {
249
+ console.log(renderError(error.message));
250
+ isProcessing = false;
251
+ }
252
+ };
253
+ // Start the prompt loop
254
+ promptUser();
255
+ }
256
+ /**
257
+ * Send a single message (non-interactive mode)
258
+ */
259
+ export async function sendMessage(message, options = {}) {
260
+ const { mcpState, onMcpToolCall } = options;
261
+ const cliModeEnabled = isCliModeActive(options.cliMode);
262
+ return new Promise((resolve, reject) => {
263
+ let responseText = '';
264
+ const callbacks = {
265
+ onContent: (text, partial) => {
266
+ if (!partial) {
267
+ responseText = text;
268
+ }
269
+ else {
270
+ responseText += text;
271
+ }
272
+ },
273
+ onMcpToolCall: async (callId, serverName, toolName, args) => {
274
+ if (onMcpToolCall) {
275
+ return onMcpToolCall(callId, serverName, toolName, args);
276
+ }
277
+ return {
278
+ content: [{ type: 'text', text: 'MCP not available' }],
279
+ isError: true,
280
+ };
281
+ },
282
+ onDone: () => {
283
+ // Render based on mode
284
+ const rendered = cliModeEnabled
285
+ ? responseText
286
+ : renderMarkdown(responseText);
287
+ resolve(rendered.trim());
288
+ },
289
+ onError: (error) => {
290
+ reject(new Error(error));
291
+ },
292
+ };
293
+ agentService.streamMessage(message, callbacks, {
294
+ mcpState,
295
+ cliMode: cliModeEnabled ? { enabled: true } : undefined,
296
+ });
297
+ });
298
+ }
299
+ //# sourceMappingURL=chat.legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.legacy.js","sourceRoot":"","sources":["../../src/agent/chat.legacy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * CLI Mode Configuration
3
+ * Configures agent to return CLI-friendly output without markdown
4
+ */
5
+ /**
6
+ * System prompt suffix for CLI mode
7
+ * Instructs the agent to return plain text instead of markdown
8
+ */
9
+ export declare const CLI_MODE_PROMPT = "\n[CLI Terminal Mode Active]\nYou are running in a CLI terminal environment. Follow these formatting rules:\n\nOUTPUT FORMAT:\n- Do NOT use markdown formatting (no **, *, #, ```, etc.)\n- Use plain text with appropriate spacing and line breaks\n- For code snippets, show as-is without code fences\n- For lists, use simple dashes (-) or numbers (1. 2. 3.)\n- For emphasis, use CAPS or [brackets] sparingly\n- Keep output concise and scannable\n\nSTRUCTURE:\n- Use blank lines to separate sections\n- Indent nested content with 2 spaces\n- Use --- for horizontal separators if needed\n- Keep line width under 80 characters when possible\n\nThis ensures optimal display in terminal interfaces.\n";
10
+ /**
11
+ * CLI mode options
12
+ */
13
+ export interface CliModeOptions {
14
+ /** Enable CLI-friendly output (no markdown) */
15
+ enabled: boolean;
16
+ /** Stream raw text directly without buffering */
17
+ streamRaw: boolean;
18
+ }
19
+ /**
20
+ * Default CLI mode settings
21
+ */
22
+ export declare const DEFAULT_CLI_MODE: CliModeOptions;
23
+ /**
24
+ * Create CLI mode configuration for API requests
25
+ */
26
+ export declare function createCliModeConfig(options?: Partial<CliModeOptions>): CliModeOptions;
27
+ /**
28
+ * Check if CLI mode is active based on environment or options
29
+ */
30
+ export declare function isCliModeActive(options?: Partial<CliModeOptions>): boolean;
31
+ /**
32
+ * Check if raw streaming is enabled
33
+ */
34
+ export declare function isRawStreamEnabled(options?: Partial<CliModeOptions>): boolean;
35
+ //# sourceMappingURL=cli-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-mode.d.ts","sourceRoot":"","sources":["../../src/agent/cli-mode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,eAAO,MAAM,eAAe,yrBAmB3B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAG9B,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,cAAc,CAKzF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAQ1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAW7E"}