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.
- package/LICENSE +21 -0
- package/README.md +129 -0
- package/dist/agent/chat.ink.d.ts +28 -0
- package/dist/agent/chat.ink.d.ts.map +1 -0
- package/dist/agent/chat.ink.js +57 -0
- package/dist/agent/chat.ink.js.map +1 -0
- package/dist/agent/chat.legacy.d.ts +25 -0
- package/dist/agent/chat.legacy.d.ts.map +1 -0
- package/dist/agent/chat.legacy.js +299 -0
- package/dist/agent/chat.legacy.js.map +1 -0
- package/dist/agent/cli-mode.d.ts +35 -0
- package/dist/agent/cli-mode.d.ts.map +1 -0
- package/dist/agent/cli-mode.js +69 -0
- package/dist/agent/cli-mode.js.map +1 -0
- package/dist/agent/completer.d.ts +39 -0
- package/dist/agent/completer.d.ts.map +1 -0
- package/dist/agent/completer.js +101 -0
- package/dist/agent/completer.js.map +1 -0
- package/dist/agent/index.d.ts +15 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +11 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/renderer.d.ts +53 -0
- package/dist/agent/renderer.d.ts.map +1 -0
- package/dist/agent/renderer.js +133 -0
- package/dist/agent/renderer.js.map +1 -0
- package/dist/agent/service.d.ts +44 -0
- package/dist/agent/service.d.ts.map +1 -0
- package/dist/agent/service.js +192 -0
- package/dist/agent/service.js.map +1 -0
- package/dist/agent/spinner.d.ts +37 -0
- package/dist/agent/spinner.d.ts.map +1 -0
- package/dist/agent/spinner.js +200 -0
- package/dist/agent/spinner.js.map +1 -0
- package/dist/agent/types.d.ts +84 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +6 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/api/auth.d.ts +71 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +261 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/client.d.ts +37 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +101 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/todo.d.ts +223 -0
- package/dist/api/todo.d.ts.map +1 -0
- package/dist/api/todo.js +196 -0
- package/dist/api/todo.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +55 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent.d.ts +16 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +132 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/context.d.ts +7 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +155 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/login.d.ts +7 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +109 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +7 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +27 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/serve.d.ts +7 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +29 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/tasks.d.ts +7 -0
- package/dist/commands/tasks.d.ts.map +1 -0
- package/dist/commands/tasks.js +277 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/validate.d.ts +7 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +123 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +115 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +439 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/resources.d.ts +14 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +195 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +82 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +14 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +582 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/ui/App.d.ts +15 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +80 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/FullscreenApp.d.ts +16 -0
- package/dist/ui/FullscreenApp.d.ts.map +1 -0
- package/dist/ui/FullscreenApp.js +48 -0
- package/dist/ui/FullscreenApp.js.map +1 -0
- package/dist/ui/components/Header.d.ts +11 -0
- package/dist/ui/components/Header.d.ts.map +1 -0
- package/dist/ui/components/Header.js +6 -0
- package/dist/ui/components/Header.js.map +1 -0
- package/dist/ui/components/InputArea.d.ts +16 -0
- package/dist/ui/components/InputArea.d.ts.map +1 -0
- package/dist/ui/components/InputArea.js +109 -0
- package/dist/ui/components/InputArea.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +12 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +8 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/StreamingText.d.ts +13 -0
- package/dist/ui/components/StreamingText.d.ts.map +1 -0
- package/dist/ui/components/StreamingText.js +8 -0
- package/dist/ui/components/StreamingText.js.map +1 -0
- package/dist/ui/components/ToolCallIndicator.d.ts +14 -0
- package/dist/ui/components/ToolCallIndicator.d.ts.map +1 -0
- package/dist/ui/components/ToolCallIndicator.js +10 -0
- package/dist/ui/components/ToolCallIndicator.js.map +1 -0
- package/dist/ui/components/index.d.ts +9 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +9 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/hooks/index.d.ts +6 -0
- package/dist/ui/hooks/index.d.ts.map +1 -0
- package/dist/ui/hooks/index.js +6 -0
- package/dist/ui/hooks/index.js.map +1 -0
- package/dist/ui/hooks/useAgentStream.d.ts +37 -0
- package/dist/ui/hooks/useAgentStream.d.ts.map +1 -0
- package/dist/ui/hooks/useAgentStream.js +122 -0
- package/dist/ui/hooks/useAgentStream.js.map +1 -0
- package/dist/ui/hooks/useCommands.d.ts +31 -0
- package/dist/ui/hooks/useCommands.d.ts.map +1 -0
- package/dist/ui/hooks/useCommands.js +108 -0
- package/dist/ui/hooks/useCommands.js.map +1 -0
- package/dist/ui/index.d.ts +7 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +7 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/utils/config.d.ts +70 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +130 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/output.d.ts +79 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +157 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/project.d.ts +29 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +135 -0
- package/dist/utils/project.js.map +1 -0
- 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"}
|