@xiuper/cli 0.0.1
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/README.md +180 -0
- package/dist/jsMain/typescript/agents/LLMService.d.ts +40 -0
- package/dist/jsMain/typescript/agents/LLMService.d.ts.map +1 -0
- package/dist/jsMain/typescript/agents/LLMService.js +156 -0
- package/dist/jsMain/typescript/agents/LLMService.js.map +1 -0
- package/dist/jsMain/typescript/agents/ServerAgentClient.d.ts +103 -0
- package/dist/jsMain/typescript/agents/ServerAgentClient.d.ts.map +1 -0
- package/dist/jsMain/typescript/agents/ServerAgentClient.js +142 -0
- package/dist/jsMain/typescript/agents/ServerAgentClient.js.map +1 -0
- package/dist/jsMain/typescript/agents/render/BaseRenderer.d.ts +87 -0
- package/dist/jsMain/typescript/agents/render/BaseRenderer.d.ts.map +1 -0
- package/dist/jsMain/typescript/agents/render/BaseRenderer.js +128 -0
- package/dist/jsMain/typescript/agents/render/BaseRenderer.js.map +1 -0
- package/dist/jsMain/typescript/agents/render/CliRenderer.d.ts +51 -0
- package/dist/jsMain/typescript/agents/render/CliRenderer.d.ts.map +1 -0
- package/dist/jsMain/typescript/agents/render/CliRenderer.js +564 -0
- package/dist/jsMain/typescript/agents/render/CliRenderer.js.map +1 -0
- package/dist/jsMain/typescript/agents/render/ServerRenderer.d.ts +55 -0
- package/dist/jsMain/typescript/agents/render/ServerRenderer.d.ts.map +1 -0
- package/dist/jsMain/typescript/agents/render/ServerRenderer.js +503 -0
- package/dist/jsMain/typescript/agents/render/ServerRenderer.js.map +1 -0
- package/dist/jsMain/typescript/agents/render/TuiRenderer.d.ts +104 -0
- package/dist/jsMain/typescript/agents/render/TuiRenderer.d.ts.map +1 -0
- package/dist/jsMain/typescript/agents/render/TuiRenderer.js +279 -0
- package/dist/jsMain/typescript/agents/render/TuiRenderer.js.map +1 -0
- package/dist/jsMain/typescript/config/ConfigManager.d.ts +146 -0
- package/dist/jsMain/typescript/config/ConfigManager.d.ts.map +1 -0
- package/dist/jsMain/typescript/config/ConfigManager.js +257 -0
- package/dist/jsMain/typescript/config/ConfigManager.js.map +1 -0
- package/dist/jsMain/typescript/constants/asciiArt.d.ts +9 -0
- package/dist/jsMain/typescript/constants/asciiArt.d.ts.map +1 -0
- package/dist/jsMain/typescript/constants/asciiArt.js +47 -0
- package/dist/jsMain/typescript/constants/asciiArt.js.map +1 -0
- package/dist/jsMain/typescript/design-system/colors.d.ts +492 -0
- package/dist/jsMain/typescript/design-system/colors.d.ts.map +1 -0
- package/dist/jsMain/typescript/design-system/colors.js +333 -0
- package/dist/jsMain/typescript/design-system/colors.js.map +1 -0
- package/dist/jsMain/typescript/design-system/index.d.ts +31 -0
- package/dist/jsMain/typescript/design-system/index.d.ts.map +1 -0
- package/dist/jsMain/typescript/design-system/index.js +195 -0
- package/dist/jsMain/typescript/design-system/index.js.map +1 -0
- package/dist/jsMain/typescript/design-system/theme-helpers.d.ts +161 -0
- package/dist/jsMain/typescript/design-system/theme-helpers.d.ts.map +1 -0
- package/dist/jsMain/typescript/design-system/theme-helpers.js +153 -0
- package/dist/jsMain/typescript/design-system/theme-helpers.js.map +1 -0
- package/dist/jsMain/typescript/i18n/index.d.ts +37 -0
- package/dist/jsMain/typescript/i18n/index.d.ts.map +1 -0
- package/dist/jsMain/typescript/i18n/index.js +139 -0
- package/dist/jsMain/typescript/i18n/index.js.map +1 -0
- package/dist/jsMain/typescript/i18n/locales/en.d.ts +6 -0
- package/dist/jsMain/typescript/i18n/locales/en.d.ts.map +1 -0
- package/dist/jsMain/typescript/i18n/locales/en.js +120 -0
- package/dist/jsMain/typescript/i18n/locales/en.js.map +1 -0
- package/dist/jsMain/typescript/i18n/locales/zh.d.ts +6 -0
- package/dist/jsMain/typescript/i18n/locales/zh.d.ts.map +1 -0
- package/dist/jsMain/typescript/i18n/locales/zh.js +120 -0
- package/dist/jsMain/typescript/i18n/locales/zh.js.map +1 -0
- package/dist/jsMain/typescript/i18n/types.d.ts +124 -0
- package/dist/jsMain/typescript/i18n/types.d.ts.map +1 -0
- package/dist/jsMain/typescript/i18n/types.js +7 -0
- package/dist/jsMain/typescript/i18n/types.js.map +1 -0
- package/dist/jsMain/typescript/index.d.ts +9 -0
- package/dist/jsMain/typescript/index.d.ts.map +1 -0
- package/dist/jsMain/typescript/index.js +380 -0
- package/dist/jsMain/typescript/index.js.map +1 -0
- package/dist/jsMain/typescript/modes/AgentMode.d.ts +33 -0
- package/dist/jsMain/typescript/modes/AgentMode.d.ts.map +1 -0
- package/dist/jsMain/typescript/modes/AgentMode.js +243 -0
- package/dist/jsMain/typescript/modes/AgentMode.js.map +1 -0
- package/dist/jsMain/typescript/modes/ChatMode.d.ts +30 -0
- package/dist/jsMain/typescript/modes/ChatMode.d.ts.map +1 -0
- package/dist/jsMain/typescript/modes/ChatMode.js +260 -0
- package/dist/jsMain/typescript/modes/ChatMode.js.map +1 -0
- package/dist/jsMain/typescript/modes/DocumentMode.d.ts +26 -0
- package/dist/jsMain/typescript/modes/DocumentMode.d.ts.map +1 -0
- package/dist/jsMain/typescript/modes/DocumentMode.js +217 -0
- package/dist/jsMain/typescript/modes/DocumentMode.js.map +1 -0
- package/dist/jsMain/typescript/modes/Mode.d.ts +72 -0
- package/dist/jsMain/typescript/modes/Mode.d.ts.map +1 -0
- package/dist/jsMain/typescript/modes/Mode.js +7 -0
- package/dist/jsMain/typescript/modes/Mode.js.map +1 -0
- package/dist/jsMain/typescript/modes/ModeManager.d.ts +76 -0
- package/dist/jsMain/typescript/modes/ModeManager.d.ts.map +1 -0
- package/dist/jsMain/typescript/modes/ModeManager.js +156 -0
- package/dist/jsMain/typescript/modes/ModeManager.js.map +1 -0
- package/dist/jsMain/typescript/modes/ReviewMode.d.ts +52 -0
- package/dist/jsMain/typescript/modes/ReviewMode.d.ts.map +1 -0
- package/dist/jsMain/typescript/modes/ReviewMode.js +435 -0
- package/dist/jsMain/typescript/modes/ReviewMode.js.map +1 -0
- package/dist/jsMain/typescript/modes/index.d.ts +9 -0
- package/dist/jsMain/typescript/modes/index.d.ts.map +1 -0
- package/dist/jsMain/typescript/modes/index.js +7 -0
- package/dist/jsMain/typescript/modes/index.js.map +1 -0
- package/dist/jsMain/typescript/processors/AtCommandProcessor.d.ts +34 -0
- package/dist/jsMain/typescript/processors/AtCommandProcessor.d.ts.map +1 -0
- package/dist/jsMain/typescript/processors/AtCommandProcessor.js +118 -0
- package/dist/jsMain/typescript/processors/AtCommandProcessor.js.map +1 -0
- package/dist/jsMain/typescript/processors/InputRouter.d.ts +84 -0
- package/dist/jsMain/typescript/processors/InputRouter.d.ts.map +1 -0
- package/dist/jsMain/typescript/processors/InputRouter.js +78 -0
- package/dist/jsMain/typescript/processors/InputRouter.js.map +1 -0
- package/dist/jsMain/typescript/processors/ModeCommandProcessor.d.ts +25 -0
- package/dist/jsMain/typescript/processors/ModeCommandProcessor.d.ts.map +1 -0
- package/dist/jsMain/typescript/processors/ModeCommandProcessor.js +127 -0
- package/dist/jsMain/typescript/processors/ModeCommandProcessor.js.map +1 -0
- package/dist/jsMain/typescript/processors/SlashCommandProcessor.d.ts +68 -0
- package/dist/jsMain/typescript/processors/SlashCommandProcessor.d.ts.map +1 -0
- package/dist/jsMain/typescript/processors/SlashCommandProcessor.js +391 -0
- package/dist/jsMain/typescript/processors/SlashCommandProcessor.js.map +1 -0
- package/dist/jsMain/typescript/processors/VariableProcessor.d.ts +44 -0
- package/dist/jsMain/typescript/processors/VariableProcessor.d.ts.map +1 -0
- package/dist/jsMain/typescript/processors/VariableProcessor.js +105 -0
- package/dist/jsMain/typescript/processors/VariableProcessor.js.map +1 -0
- package/dist/jsMain/typescript/ui/App.d.ts +16 -0
- package/dist/jsMain/typescript/ui/App.d.ts.map +1 -0
- package/dist/jsMain/typescript/ui/App.js +208 -0
- package/dist/jsMain/typescript/ui/App.js.map +1 -0
- package/dist/jsMain/typescript/ui/Banner.d.ts +6 -0
- package/dist/jsMain/typescript/ui/Banner.d.ts.map +1 -0
- package/dist/jsMain/typescript/ui/Banner.js +13 -0
- package/dist/jsMain/typescript/ui/Banner.js.map +1 -0
- package/dist/jsMain/typescript/ui/ChatInterface.d.ts +19 -0
- package/dist/jsMain/typescript/ui/ChatInterface.d.ts.map +1 -0
- package/dist/jsMain/typescript/ui/ChatInterface.js +223 -0
- package/dist/jsMain/typescript/ui/ChatInterface.js.map +1 -0
- package/dist/jsMain/typescript/ui/CommandSuggestions.d.ts +21 -0
- package/dist/jsMain/typescript/ui/CommandSuggestions.d.ts.map +1 -0
- package/dist/jsMain/typescript/ui/CommandSuggestions.js +43 -0
- package/dist/jsMain/typescript/ui/CommandSuggestions.js.map +1 -0
- package/dist/jsMain/typescript/ui/LanguageSwitcher.d.ts +11 -0
- package/dist/jsMain/typescript/ui/LanguageSwitcher.d.ts.map +1 -0
- package/dist/jsMain/typescript/ui/LanguageSwitcher.js +37 -0
- package/dist/jsMain/typescript/ui/LanguageSwitcher.js.map +1 -0
- package/dist/jsMain/typescript/ui/MessageRenderer.d.ts +70 -0
- package/dist/jsMain/typescript/ui/MessageRenderer.d.ts.map +1 -0
- package/dist/jsMain/typescript/ui/MessageRenderer.js +255 -0
- package/dist/jsMain/typescript/ui/MessageRenderer.js.map +1 -0
- package/dist/jsMain/typescript/ui/ModelConfigForm.d.ts +19 -0
- package/dist/jsMain/typescript/ui/ModelConfigForm.d.ts.map +1 -0
- package/dist/jsMain/typescript/ui/ModelConfigForm.js +257 -0
- package/dist/jsMain/typescript/ui/ModelConfigForm.js.map +1 -0
- package/dist/jsMain/typescript/ui/WelcomeScreen.d.ts +12 -0
- package/dist/jsMain/typescript/ui/WelcomeScreen.d.ts.map +1 -0
- package/dist/jsMain/typescript/ui/WelcomeScreen.js +93 -0
- package/dist/jsMain/typescript/ui/WelcomeScreen.js.map +1 -0
- package/dist/jsMain/typescript/utils/commandUtils.d.ts +64 -0
- package/dist/jsMain/typescript/utils/commandUtils.d.ts.map +1 -0
- package/dist/jsMain/typescript/utils/commandUtils.js +195 -0
- package/dist/jsMain/typescript/utils/commandUtils.js.map +1 -0
- package/dist/jsMain/typescript/utils/domainDictUtils.d.ts +53 -0
- package/dist/jsMain/typescript/utils/domainDictUtils.d.ts.map +1 -0
- package/dist/jsMain/typescript/utils/domainDictUtils.js +130 -0
- package/dist/jsMain/typescript/utils/domainDictUtils.js.map +1 -0
- package/dist/jsMain/typescript/utils/markdownSplitter.d.ts +23 -0
- package/dist/jsMain/typescript/utils/markdownSplitter.d.ts.map +1 -0
- package/dist/jsMain/typescript/utils/markdownSplitter.js +90 -0
- package/dist/jsMain/typescript/utils/markdownSplitter.js.map +1 -0
- package/dist/jsMain/typescript/utils/outputFormatter.d.ts +70 -0
- package/dist/jsMain/typescript/utils/outputFormatter.d.ts.map +1 -0
- package/dist/jsMain/typescript/utils/outputFormatter.js +140 -0
- package/dist/jsMain/typescript/utils/outputFormatter.js.map +1 -0
- package/dist/jsMain/typescript/utils/renderUtils.d.ts +17 -0
- package/dist/jsMain/typescript/utils/renderUtils.d.ts.map +1 -0
- package/dist/jsMain/typescript/utils/renderUtils.js +128 -0
- package/dist/jsMain/typescript/utils/renderUtils.js.map +1 -0
- package/dist/test/framework/analyzers/CodeChangeAnalyzer.d.ts +87 -0
- package/dist/test/framework/analyzers/CodeChangeAnalyzer.d.ts.map +1 -0
- package/dist/test/framework/analyzers/CodeChangeAnalyzer.js +412 -0
- package/dist/test/framework/analyzers/CodeChangeAnalyzer.js.map +1 -0
- package/dist/test/framework/analyzers/PromptAnalyzer.d.ts +46 -0
- package/dist/test/framework/analyzers/PromptAnalyzer.d.ts.map +1 -0
- package/dist/test/framework/analyzers/PromptAnalyzer.js +185 -0
- package/dist/test/framework/analyzers/PromptAnalyzer.js.map +1 -0
- package/dist/test/framework/analyzers/ToolCallAnalyzer.d.ts +45 -0
- package/dist/test/framework/analyzers/ToolCallAnalyzer.d.ts.map +1 -0
- package/dist/test/framework/analyzers/ToolCallAnalyzer.js +215 -0
- package/dist/test/framework/analyzers/ToolCallAnalyzer.js.map +1 -0
- package/dist/test/framework/cli.d.ts +8 -0
- package/dist/test/framework/cli.d.ts.map +1 -0
- package/dist/test/framework/cli.js +175 -0
- package/dist/test/framework/cli.js.map +1 -0
- package/dist/test/framework/core/TestCase.d.ts +100 -0
- package/dist/test/framework/core/TestCase.d.ts.map +1 -0
- package/dist/test/framework/core/TestCase.js +101 -0
- package/dist/test/framework/core/TestCase.js.map +1 -0
- package/dist/test/framework/core/TestEngine.d.ts +89 -0
- package/dist/test/framework/core/TestEngine.d.ts.map +1 -0
- package/dist/test/framework/core/TestEngine.js +552 -0
- package/dist/test/framework/core/TestEngine.js.map +1 -0
- package/dist/test/framework/core/TestResult.d.ts +143 -0
- package/dist/test/framework/core/TestResult.d.ts.map +1 -0
- package/dist/test/framework/core/TestResult.js +76 -0
- package/dist/test/framework/core/TestResult.js.map +1 -0
- package/dist/test/framework/examples/BasicRobustnessTest.d.ts +19 -0
- package/dist/test/framework/examples/BasicRobustnessTest.d.ts.map +1 -0
- package/dist/test/framework/examples/BasicRobustnessTest.js +116 -0
- package/dist/test/framework/examples/BasicRobustnessTest.js.map +1 -0
- package/dist/test/framework/index.d.ts +30 -0
- package/dist/test/framework/index.d.ts.map +1 -0
- package/dist/test/framework/index.js +38 -0
- package/dist/test/framework/index.js.map +1 -0
- package/dist/test/framework/loaders/JsonScenarioLoader.d.ts +99 -0
- package/dist/test/framework/loaders/JsonScenarioLoader.d.ts.map +1 -0
- package/dist/test/framework/loaders/JsonScenarioLoader.js +197 -0
- package/dist/test/framework/loaders/JsonScenarioLoader.js.map +1 -0
- package/dist/test/framework/reporters/ConsoleReporter.d.ts +25 -0
- package/dist/test/framework/reporters/ConsoleReporter.d.ts.map +1 -0
- package/dist/test/framework/reporters/ConsoleReporter.js +196 -0
- package/dist/test/framework/reporters/ConsoleReporter.js.map +1 -0
- package/dist/test/framework/scenarios/ScenarioBuilder.d.ts +62 -0
- package/dist/test/framework/scenarios/ScenarioBuilder.d.ts.map +1 -0
- package/dist/test/framework/scenarios/ScenarioBuilder.js +285 -0
- package/dist/test/framework/scenarios/ScenarioBuilder.js.map +1 -0
- package/dist/test/framework/validate-framework.d.ts +9 -0
- package/dist/test/framework/validate-framework.d.ts.map +1 -0
- package/dist/test/framework/validate-framework.js +187 -0
- package/dist/test/framework/validate-framework.js.map +1 -0
- package/package.json +84 -0
package/README.md
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# mpp-ui - Multiplatform UI Module
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
`mpp-ui` 是 AutoDev 的跨平台 UI 模块,基于 Compose Multiplatform 构建,支持 JVM (Desktop)、Android、JS (Web) 和 **Node.js (CLI)** 平台。
|
|
6
|
+
|
|
7
|
+
本模块包含:
|
|
8
|
+
- **SketchRenderer**: 原有的 LLM 响应渲染器
|
|
9
|
+
- **MarkdownSketchRenderer**: 新实现的 Markdown 渲染器,使用 `multiplatform-markdown-renderer` 库
|
|
10
|
+
- **MarkdownDemo**: 演示应用,展示 MarkdownSketchRenderer 的各种渲染能力
|
|
11
|
+
- **FileChooser**: 跨平台文件选择器,支持 JVM、Android 和 JS 平台
|
|
12
|
+
- **AutoDev CLI**: 终端 UI,使用 React/Ink 构建,集成 mpp-core 的 AI Agent 功能
|
|
13
|
+
|
|
14
|
+
## 技术栈
|
|
15
|
+
|
|
16
|
+
- **Kotlin 2.2.0** - Multiplatform
|
|
17
|
+
- **Compose Multiplatform 1.8.0** - UI 框架
|
|
18
|
+
- **multiplatform-markdown-renderer 0.13.0** - Markdown 渲染
|
|
19
|
+
- **Material 3** - 设计系统
|
|
20
|
+
|
|
21
|
+
## 平台支持
|
|
22
|
+
|
|
23
|
+
### ✅ JVM (Desktop)
|
|
24
|
+
完全支持,已测试运行成功。
|
|
25
|
+
|
|
26
|
+
### JVM CLI
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
./gradlew :mpp-ui:runRemoteAgentCli --args="--server http://localhost:8080 --project-id https://github.com/unit-mesh/untitled --task '你的任务' --use-server-config --branch master"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### ⚠️ Android
|
|
33
|
+
配置完成,需要物理设备或模拟器测试。
|
|
34
|
+
|
|
35
|
+
### ⚠️ Web (JS)
|
|
36
|
+
|
|
37
|
+
### ✅ Node.js (CLI)
|
|
38
|
+
|
|
39
|
+
Local mode
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
node dist/jsMain/typescript/index.js code --task "add Spring ai to project and also a service example, I use deepseek, here it's Spring AI documentation https://docs.spring.io/spring-ai/reference/api/chat/deepseek-chat.html 请先阅读文档!!" -p /Users/phodal/IdeaProjects/untitled --max-iterations 100
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Server
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
node dist/jsMain/typescript/index.js server \\n --task "编写 BlogService 测试" \\n --project-id https://github.com/unit-mesh/untitled \\n -s http://localhost:8080
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 构建和运行
|
|
52
|
+
|
|
53
|
+
### 前提条件
|
|
54
|
+
|
|
55
|
+
确保 `gradle.properties` 中已配置:
|
|
56
|
+
```properties
|
|
57
|
+
# 强制使用 Java 17(避免 Kotlin 编译器与 Java 25 的兼容性问题)
|
|
58
|
+
org.gradle.java.home=/path/to/jdk-17
|
|
59
|
+
|
|
60
|
+
# Android 配置
|
|
61
|
+
android.useAndroidX=true
|
|
62
|
+
android.enableJetifier=true
|
|
63
|
+
|
|
64
|
+
# Compose 实验性功能
|
|
65
|
+
org.jetbrains.compose.experimental.jscanvas.enabled=true
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Desktop (JVM)
|
|
69
|
+
|
|
70
|
+
运行演示应用:
|
|
71
|
+
```bash
|
|
72
|
+
./gradlew :mpp-ui:run
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
构建 JAR:
|
|
76
|
+
```bash
|
|
77
|
+
./gradlew :mpp-ui:jvmJar
|
|
78
|
+
# 输出: mpp-ui/build/libs/mpp-ui-jvm.jar
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
构建原生安装包:
|
|
82
|
+
```bash
|
|
83
|
+
# macOS
|
|
84
|
+
./gradlew :mpp-ui:packageDmg
|
|
85
|
+
|
|
86
|
+
# Windows
|
|
87
|
+
./gradlew :mpp-ui:packageMsi
|
|
88
|
+
|
|
89
|
+
# Linux
|
|
90
|
+
./gradlew :mpp-ui:packageDeb
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Web (JS)
|
|
94
|
+
|
|
95
|
+
构建 Web 版本:
|
|
96
|
+
```bash
|
|
97
|
+
./gradlew :mpp-ui:jsBrowserProductionWebpack
|
|
98
|
+
# 输出: mpp-ui/build/dist/js/productionExecutable/
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
运行开发服务器:
|
|
102
|
+
```bash
|
|
103
|
+
./gradlew :mpp-ui:jsBrowserDevelopmentRun --continuous
|
|
104
|
+
# 访问: http://localhost:8080
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Android
|
|
108
|
+
|
|
109
|
+
构建 APK:
|
|
110
|
+
```bash
|
|
111
|
+
./gradlew :mpp-ui:assembleDebug
|
|
112
|
+
# 输出: mpp-ui/build/outputs/apk/debug/
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
在连接的设备上安装和运行:
|
|
116
|
+
```bash
|
|
117
|
+
./gradlew :mpp-ui:installDebug
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## 架构
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
mpp-ui/
|
|
124
|
+
├── src/
|
|
125
|
+
│ ├── commonMain/ # 共享代码
|
|
126
|
+
│ │ └── kotlin/
|
|
127
|
+
│ │ └── cc/unitmesh/devins/ui/compose/
|
|
128
|
+
│ │ ├── sketch/
|
|
129
|
+
│ │ │ ├── SketchRenderer.kt # 原有渲染器
|
|
130
|
+
│ │ │ ├── MarkdownSketchRenderer.kt # 新 Markdown 渲染器
|
|
131
|
+
│ │ │ └── DiffSketchRenderer.kt # Diff 渲染器
|
|
132
|
+
│ │ └── MarkdownDemo.kt # 演示应用
|
|
133
|
+
│ │
|
|
134
|
+
│ ├── jvmMain/ # Desktop 特定代码
|
|
135
|
+
│ │ └── kotlin/
|
|
136
|
+
│ │ └── cc/unitmesh/devins/ui/
|
|
137
|
+
│ │ ├── Main.kt # 原主应用入口
|
|
138
|
+
│ │ └── MarkdownDemoMain.kt # Markdown 演示入口
|
|
139
|
+
│ │
|
|
140
|
+
│ ├── androidMain/ # Android 特定代码
|
|
141
|
+
│ │ ├── AndroidManifest.xml
|
|
142
|
+
│ │ └── kotlin/
|
|
143
|
+
│ │ └── cc/unitmesh/devins/ui/
|
|
144
|
+
│ │ └── MainActivity.kt
|
|
145
|
+
│ │
|
|
146
|
+
│ └── jsMain/ # Web 特定代码
|
|
147
|
+
│ ├── kotlin/
|
|
148
|
+
│ │ └── cc/unitmesh/devins/ui/
|
|
149
|
+
│ │ └── Main.kt
|
|
150
|
+
│ └── resources/
|
|
151
|
+
│ └── index.html
|
|
152
|
+
│
|
|
153
|
+
└── build.gradle.kts # Multiplatform 配置
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## 国际化 (i18n)
|
|
157
|
+
|
|
158
|
+
mpp-ui 支持多语言,目前支持:
|
|
159
|
+
- **English** (en)
|
|
160
|
+
- **中文** (zh)
|
|
161
|
+
|
|
162
|
+
### 语言切换
|
|
163
|
+
|
|
164
|
+
**CLI**:在 `~/.autodev/config.yaml` 中设置 `language` 字段:
|
|
165
|
+
```yaml
|
|
166
|
+
language: zh
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Desktop/Android**:使用 UI 中的语言切换组件
|
|
170
|
+
|
|
171
|
+
详细文档请参阅:[I18N.md](docs/I18N.md)
|
|
172
|
+
|
|
173
|
+
## 贡献
|
|
174
|
+
|
|
175
|
+
在添加新功能时,请确保:
|
|
176
|
+
1. 代码在 `commonMain` 中实现(除非是平台特定的)
|
|
177
|
+
2. 使用 Compose Multiplatform 的跨平台 API
|
|
178
|
+
3. 在多个平台上测试
|
|
179
|
+
4. 更新本 README
|
|
180
|
+
5. 为所有用户可见的文本添加翻译(参见 [I18N.md](docs/I18N.md))
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMService - Wrapper around mpp-core's KoogLLMService
|
|
3
|
+
*
|
|
4
|
+
* This service provides a TypeScript-friendly interface to the Kotlin/JS
|
|
5
|
+
* compiled mpp-core module.
|
|
6
|
+
*/
|
|
7
|
+
import type { LegacyConfig } from '../config/ConfigManager';
|
|
8
|
+
/**
|
|
9
|
+
* LLM Service wrapper
|
|
10
|
+
*/
|
|
11
|
+
export declare class LLMService {
|
|
12
|
+
private config;
|
|
13
|
+
private koogService;
|
|
14
|
+
private chatHistory;
|
|
15
|
+
constructor(config: LegacyConfig);
|
|
16
|
+
/**
|
|
17
|
+
* Send a message and receive streaming response
|
|
18
|
+
*/
|
|
19
|
+
streamMessage(message: string, onChunk: (chunk: string) => void): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Send a message with system prompt and receive streaming response
|
|
22
|
+
*/
|
|
23
|
+
streamMessageWithSystem(systemPrompt: string, userMessage: string, onChunk: (chunk: string) => void): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Format LLM error into user-friendly message
|
|
26
|
+
*/
|
|
27
|
+
private formatLLMError;
|
|
28
|
+
/**
|
|
29
|
+
* Clear chat history
|
|
30
|
+
*/
|
|
31
|
+
clearHistory(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Get chat history
|
|
34
|
+
*/
|
|
35
|
+
getHistory(): Array<{
|
|
36
|
+
role: string;
|
|
37
|
+
content: string;
|
|
38
|
+
}>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=LLMService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLMService.d.ts","sourceRoot":"","sources":["../../../../src/jsMain/typescript/agents/LLMService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAoB5D;;GAEG;AACH,qBAAa,UAAU;IAIT,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,WAAW,CAAgD;gBAE/C,MAAM,EAAE,YAAY;IAiBxC;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,IAAI,CAAC;IA+ChB;;OAEG;IACG,uBAAuB,CAC3B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,IAAI,CAAC;IAsDhB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgCtB;;OAEG;IACH,YAAY,IAAI,IAAI;IAKpB;;OAEG;IACH,UAAU,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAIvD"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMService - Wrapper around mpp-core's KoogLLMService
|
|
3
|
+
*
|
|
4
|
+
* This service provides a TypeScript-friendly interface to the Kotlin/JS
|
|
5
|
+
* compiled mpp-core module.
|
|
6
|
+
*/
|
|
7
|
+
// Import the compiled Kotlin/JS module
|
|
8
|
+
// @ts-ignore - Kotlin/JS generated module
|
|
9
|
+
import MppCore from '@xiuper/mpp-core';
|
|
10
|
+
// Access the exported Kotlin/JS classes
|
|
11
|
+
const { JsKoogLLMService, JsModelConfig, JsMessage } = MppCore.cc.unitmesh.llm;
|
|
12
|
+
// Provider type mapping
|
|
13
|
+
const ProviderTypes = {
|
|
14
|
+
'openai': 'OPENAI',
|
|
15
|
+
'anthropic': 'ANTHROPIC',
|
|
16
|
+
'google': 'GOOGLE',
|
|
17
|
+
'deepseek': 'DEEPSEEK',
|
|
18
|
+
'ollama': 'OLLAMA',
|
|
19
|
+
'openrouter': 'OPENROUTER',
|
|
20
|
+
'custom-openai-base': 'CUSTOM_OPENAI_BASE'
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* LLM Service wrapper
|
|
24
|
+
*/
|
|
25
|
+
export class LLMService {
|
|
26
|
+
config;
|
|
27
|
+
koogService;
|
|
28
|
+
chatHistory = [];
|
|
29
|
+
constructor(config) {
|
|
30
|
+
this.config = config;
|
|
31
|
+
// Create JsModelConfig
|
|
32
|
+
const modelConfig = new JsModelConfig(ProviderTypes[this.config.provider.toLowerCase()], this.config.model, this.config.apiKey, 0.7, // temperature
|
|
33
|
+
8192, // maxTokens
|
|
34
|
+
this.config.baseUrl || '');
|
|
35
|
+
// Create JsKoogLLMService
|
|
36
|
+
this.koogService = new JsKoogLLMService(modelConfig);
|
|
37
|
+
console.log(`✓ LLM Service initialized: ${this.config.provider}/${this.config.model}`);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Send a message and receive streaming response
|
|
41
|
+
*/
|
|
42
|
+
async streamMessage(message, onChunk) {
|
|
43
|
+
// Add user message to history
|
|
44
|
+
this.chatHistory.push({ role: 'user', content: message });
|
|
45
|
+
try {
|
|
46
|
+
// Convert history to JsMessage format (exclude current message)
|
|
47
|
+
const historyMessages = this.chatHistory.slice(0, -1).map(msg => new JsMessage(msg.role, msg.content));
|
|
48
|
+
let fullResponse = '';
|
|
49
|
+
let streamError = null;
|
|
50
|
+
// Call streamPrompt with callbacks - it now returns a Promise
|
|
51
|
+
await this.koogService.streamPrompt(message, historyMessages, (chunk) => {
|
|
52
|
+
fullResponse += chunk;
|
|
53
|
+
onChunk(chunk);
|
|
54
|
+
}, (error) => {
|
|
55
|
+
// Capture error from error callback
|
|
56
|
+
streamError = error;
|
|
57
|
+
}, () => {
|
|
58
|
+
// Streaming completed
|
|
59
|
+
});
|
|
60
|
+
// If error callback was called, throw the error
|
|
61
|
+
if (streamError) {
|
|
62
|
+
throw this.formatLLMError(streamError);
|
|
63
|
+
}
|
|
64
|
+
// Add assistant response to history
|
|
65
|
+
this.chatHistory.push({ role: 'assistant', content: fullResponse });
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
// Remove the user message from history if request failed
|
|
69
|
+
this.chatHistory.pop();
|
|
70
|
+
console.error('Error in streamMessage:', error);
|
|
71
|
+
throw this.formatLLMError(error);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Send a message with system prompt and receive streaming response
|
|
76
|
+
*/
|
|
77
|
+
async streamMessageWithSystem(systemPrompt, userMessage, onChunk) {
|
|
78
|
+
// Add system message if this is the first message
|
|
79
|
+
if (this.chatHistory.length === 0) {
|
|
80
|
+
this.chatHistory.push({ role: 'system', content: systemPrompt });
|
|
81
|
+
}
|
|
82
|
+
// Add user message to history
|
|
83
|
+
this.chatHistory.push({ role: 'user', content: userMessage });
|
|
84
|
+
try {
|
|
85
|
+
// Convert history to JsMessage format (exclude current message)
|
|
86
|
+
const historyMessages = this.chatHistory.slice(0, -1).map(msg => new JsMessage(msg.role, msg.content));
|
|
87
|
+
let fullResponse = '';
|
|
88
|
+
let streamError = null;
|
|
89
|
+
// Call streamPrompt with callbacks - it now returns a Promise
|
|
90
|
+
// IMPORTANT: Pass compileDevIns=false for agent calls to prevent DevIns compilation
|
|
91
|
+
await this.koogService.streamPrompt(userMessage, historyMessages, (chunk) => {
|
|
92
|
+
fullResponse += chunk;
|
|
93
|
+
onChunk(chunk);
|
|
94
|
+
}, (error) => {
|
|
95
|
+
// Capture error from error callback
|
|
96
|
+
streamError = error;
|
|
97
|
+
}, () => {
|
|
98
|
+
// Streaming completed
|
|
99
|
+
}, false // compileDevIns = false - agents send pre-formatted prompts
|
|
100
|
+
);
|
|
101
|
+
// If error callback was called, throw the error
|
|
102
|
+
if (streamError) {
|
|
103
|
+
throw this.formatLLMError(streamError);
|
|
104
|
+
}
|
|
105
|
+
// Add assistant response to history
|
|
106
|
+
this.chatHistory.push({ role: 'assistant', content: fullResponse });
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
// Remove the user message from history if request failed
|
|
110
|
+
this.chatHistory.pop();
|
|
111
|
+
console.error('Error in streamMessageWithSystem:', error);
|
|
112
|
+
throw this.formatLLMError(error);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Format LLM error into user-friendly message
|
|
117
|
+
*/
|
|
118
|
+
formatLLMError(error) {
|
|
119
|
+
const errorMessage = error?.message || String(error);
|
|
120
|
+
// Check for common error patterns
|
|
121
|
+
if (errorMessage.includes('401') || errorMessage.includes('Unauthorized')) {
|
|
122
|
+
return new Error(`❌ API Key 无效或已过期\n请检查配置文件 ~/.autodev/config.yaml 中的 apiKey`);
|
|
123
|
+
}
|
|
124
|
+
if (errorMessage.includes('403') || errorMessage.includes('Forbidden')) {
|
|
125
|
+
return new Error(`❌ API 访问被拒绝\n请检查 API Key 权限或账户余额`);
|
|
126
|
+
}
|
|
127
|
+
if (errorMessage.includes('429') || errorMessage.includes('rate limit')) {
|
|
128
|
+
return new Error(`❌ API 请求频率超限\n请稍后再试或升级您的 API 配额`);
|
|
129
|
+
}
|
|
130
|
+
if (errorMessage.includes('timeout') || errorMessage.includes('ETIMEDOUT')) {
|
|
131
|
+
return new Error(`❌ 请求超时\n请检查网络连接或稍后再试`);
|
|
132
|
+
}
|
|
133
|
+
if (errorMessage.includes('ECONNREFUSED') || errorMessage.includes('connection refused')) {
|
|
134
|
+
return new Error(`❌ 无法连接到 API 服务器\n请检查网络连接${this.config.baseUrl ? ` 和 baseUrl: ${this.config.baseUrl}` : ''}`);
|
|
135
|
+
}
|
|
136
|
+
if (errorMessage.includes('ENOTFOUND') || errorMessage.includes('getaddrinfo')) {
|
|
137
|
+
return new Error(`❌ 无法解析 API 服务器地址\n请检查网络连接和 DNS 设置`);
|
|
138
|
+
}
|
|
139
|
+
// Default error message
|
|
140
|
+
return new Error(`❌ LLM 调用失败: ${errorMessage}\n\n提示:检查 ~/.autodev/config.yaml 中的配置\n- provider: ${this.config.provider}\n- model: ${this.config.model}\n- apiKey: ${this.config.apiKey.substring(0, 8)}...`);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Clear chat history
|
|
144
|
+
*/
|
|
145
|
+
clearHistory() {
|
|
146
|
+
this.chatHistory = [];
|
|
147
|
+
console.log('✓ Chat history cleared');
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get chat history
|
|
151
|
+
*/
|
|
152
|
+
getHistory() {
|
|
153
|
+
return [...this.chatHistory];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=LLMService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLMService.js","sourceRoot":"","sources":["../../../../src/jsMain/typescript/agents/LLMService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ServerAgentClient - Client for connecting to mpp-server
|
|
3
|
+
*
|
|
4
|
+
* Provides both synchronous and streaming (SSE) execution modes
|
|
5
|
+
*/
|
|
6
|
+
export interface LLMConfig {
|
|
7
|
+
provider: string;
|
|
8
|
+
modelName: string;
|
|
9
|
+
apiKey: string;
|
|
10
|
+
baseUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AgentRequest {
|
|
13
|
+
projectId: string;
|
|
14
|
+
task: string;
|
|
15
|
+
llmConfig?: LLMConfig;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentStepInfo {
|
|
18
|
+
step: number;
|
|
19
|
+
action: string;
|
|
20
|
+
tool: string;
|
|
21
|
+
success: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface AgentEditInfo {
|
|
24
|
+
file: string;
|
|
25
|
+
operation: string;
|
|
26
|
+
content: string;
|
|
27
|
+
}
|
|
28
|
+
export interface AgentResponse {
|
|
29
|
+
success: boolean;
|
|
30
|
+
message: string;
|
|
31
|
+
output?: string;
|
|
32
|
+
iterations: number;
|
|
33
|
+
steps: AgentStepInfo[];
|
|
34
|
+
edits: AgentEditInfo[];
|
|
35
|
+
}
|
|
36
|
+
export type AgentEvent = {
|
|
37
|
+
type: 'clone_progress';
|
|
38
|
+
stage: string;
|
|
39
|
+
progress?: number;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'clone_log';
|
|
42
|
+
message: string;
|
|
43
|
+
isError?: boolean;
|
|
44
|
+
} | {
|
|
45
|
+
type: 'iteration';
|
|
46
|
+
current: number;
|
|
47
|
+
max: number;
|
|
48
|
+
} | {
|
|
49
|
+
type: 'llm_chunk';
|
|
50
|
+
chunk: string;
|
|
51
|
+
} | {
|
|
52
|
+
type: 'tool_call';
|
|
53
|
+
toolName: string;
|
|
54
|
+
params: string;
|
|
55
|
+
} | {
|
|
56
|
+
type: 'tool_result';
|
|
57
|
+
toolName: string;
|
|
58
|
+
success: boolean;
|
|
59
|
+
output?: string;
|
|
60
|
+
} | {
|
|
61
|
+
type: 'user_confirmation';
|
|
62
|
+
toolName: string;
|
|
63
|
+
params: Record<string, any>;
|
|
64
|
+
} | {
|
|
65
|
+
type: 'error';
|
|
66
|
+
message: string;
|
|
67
|
+
} | {
|
|
68
|
+
type: 'complete';
|
|
69
|
+
success: boolean;
|
|
70
|
+
message: string;
|
|
71
|
+
iterations: number;
|
|
72
|
+
steps: AgentStepInfo[];
|
|
73
|
+
edits: AgentEditInfo[];
|
|
74
|
+
};
|
|
75
|
+
export declare class ServerAgentClient {
|
|
76
|
+
private baseUrl;
|
|
77
|
+
constructor(baseUrl?: string);
|
|
78
|
+
/**
|
|
79
|
+
* Execute agent task synchronously
|
|
80
|
+
*/
|
|
81
|
+
executeSync(request: AgentRequest): Promise<AgentResponse>;
|
|
82
|
+
/**
|
|
83
|
+
* Execute agent task with SSE streaming
|
|
84
|
+
*/
|
|
85
|
+
executeStream(request: AgentRequest): AsyncGenerator<AgentEvent>;
|
|
86
|
+
private parseSSEEvent;
|
|
87
|
+
/**
|
|
88
|
+
* Get list of available projects
|
|
89
|
+
*/
|
|
90
|
+
getProjects(): Promise<{
|
|
91
|
+
id: string;
|
|
92
|
+
name: string;
|
|
93
|
+
path: string;
|
|
94
|
+
description: string;
|
|
95
|
+
}[]>;
|
|
96
|
+
/**
|
|
97
|
+
* Health check
|
|
98
|
+
*/
|
|
99
|
+
healthCheck(): Promise<{
|
|
100
|
+
status: string;
|
|
101
|
+
}>;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=ServerAgentClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerAgentClient.d.ts","sourceRoot":"","sources":["../../../../src/jsMain/typescript/agents/ServerAgentClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ServerAgentClient - Client for connecting to mpp-server
|
|
3
|
+
*
|
|
4
|
+
* Provides both synchronous and streaming (SSE) execution modes
|
|
5
|
+
*/
|
|
6
|
+
import fetch from 'node-fetch';
|
|
7
|
+
export class ServerAgentClient {
|
|
8
|
+
baseUrl;
|
|
9
|
+
constructor(baseUrl = 'http://localhost:8080') {
|
|
10
|
+
this.baseUrl = baseUrl;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Execute agent task synchronously
|
|
14
|
+
*/
|
|
15
|
+
async executeSync(request) {
|
|
16
|
+
const response = await fetch(`${this.baseUrl}/api/agent/run`, {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers: {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify(request),
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
const error = await response.text();
|
|
25
|
+
throw new Error(`Server error: ${response.status} - ${error}`);
|
|
26
|
+
}
|
|
27
|
+
return await response.json();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Execute agent task with SSE streaming
|
|
31
|
+
*/
|
|
32
|
+
async *executeStream(request) {
|
|
33
|
+
const url = `${this.baseUrl}/api/agent/stream`;
|
|
34
|
+
// Use fetch for SSE (EventSource doesn't support POST)
|
|
35
|
+
const response = await fetch(url, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers: {
|
|
38
|
+
'Content-Type': 'application/json',
|
|
39
|
+
'Accept': 'text/event-stream',
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify(request),
|
|
42
|
+
});
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
const error = await response.text();
|
|
45
|
+
throw new Error(`Server error: ${response.status} - ${error}`);
|
|
46
|
+
}
|
|
47
|
+
if (!response.body) {
|
|
48
|
+
throw new Error('Response body is null');
|
|
49
|
+
}
|
|
50
|
+
// Parse SSE stream
|
|
51
|
+
const decoder = new TextDecoder();
|
|
52
|
+
let buffer = '';
|
|
53
|
+
// node-fetch returns a Node.js Readable stream
|
|
54
|
+
for await (const chunk of response.body) {
|
|
55
|
+
// Decode chunk and add to buffer
|
|
56
|
+
buffer += decoder.decode(chunk, { stream: true });
|
|
57
|
+
// Process complete events in buffer
|
|
58
|
+
const lines = buffer.split('\n');
|
|
59
|
+
buffer = lines.pop() || ''; // Keep incomplete line in buffer
|
|
60
|
+
let currentEvent = {};
|
|
61
|
+
for (const line of lines) {
|
|
62
|
+
if (line.startsWith('event:')) {
|
|
63
|
+
currentEvent.type = line.substring(6).trim();
|
|
64
|
+
}
|
|
65
|
+
else if (line.startsWith('data:')) {
|
|
66
|
+
currentEvent.data = line.substring(5).trim();
|
|
67
|
+
}
|
|
68
|
+
else if (line.trim() === '' && currentEvent.type && currentEvent.data) {
|
|
69
|
+
// Complete event - parse and yield
|
|
70
|
+
const event = this.parseSSEEvent(currentEvent.type, currentEvent.data);
|
|
71
|
+
if (event) {
|
|
72
|
+
yield event;
|
|
73
|
+
// Check if complete
|
|
74
|
+
if (event.type === 'complete') {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
currentEvent = {};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
parseSSEEvent(type, data) {
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(data);
|
|
86
|
+
switch (type) {
|
|
87
|
+
case 'clone_progress':
|
|
88
|
+
return { type: 'clone_progress', stage: parsed.stage, progress: parsed.progress };
|
|
89
|
+
case 'clone_log':
|
|
90
|
+
return { type: 'clone_log', message: parsed.message, isError: parsed.isError };
|
|
91
|
+
case 'iteration':
|
|
92
|
+
return { type: 'iteration', current: parsed.current, max: parsed.max };
|
|
93
|
+
case 'llm_chunk':
|
|
94
|
+
return { type: 'llm_chunk', chunk: parsed.chunk };
|
|
95
|
+
case 'tool_call':
|
|
96
|
+
return { type: 'tool_call', toolName: parsed.toolName, params: parsed.params };
|
|
97
|
+
case 'tool_result':
|
|
98
|
+
return { type: 'tool_result', toolName: parsed.toolName, success: parsed.success, output: parsed.output };
|
|
99
|
+
case 'error':
|
|
100
|
+
return { type: 'error', message: parsed.message };
|
|
101
|
+
case 'complete':
|
|
102
|
+
return {
|
|
103
|
+
type: 'complete',
|
|
104
|
+
success: parsed.success,
|
|
105
|
+
message: parsed.message,
|
|
106
|
+
iterations: parsed.iterations,
|
|
107
|
+
steps: parsed.steps,
|
|
108
|
+
edits: parsed.edits
|
|
109
|
+
};
|
|
110
|
+
default:
|
|
111
|
+
console.warn(`Unknown SSE event type: ${type}`);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (e) {
|
|
116
|
+
console.error(`Failed to parse SSE event: ${e}`);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get list of available projects
|
|
122
|
+
*/
|
|
123
|
+
async getProjects() {
|
|
124
|
+
const response = await fetch(`${this.baseUrl}/api/projects`);
|
|
125
|
+
if (!response.ok) {
|
|
126
|
+
throw new Error(`Failed to get projects: ${response.status}`);
|
|
127
|
+
}
|
|
128
|
+
const data = await response.json();
|
|
129
|
+
return data.projects || [];
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Health check
|
|
133
|
+
*/
|
|
134
|
+
async healthCheck() {
|
|
135
|
+
const response = await fetch(`${this.baseUrl}/health`);
|
|
136
|
+
if (!response.ok) {
|
|
137
|
+
throw new Error(`Health check failed: ${response.status}`);
|
|
138
|
+
}
|
|
139
|
+
return await response.json();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=ServerAgentClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerAgentClient.js","sourceRoot":"","sources":["../../../../src/jsMain/typescript/agents/ServerAgentClient.ts"],"names":[],"mappings":"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"}
|