@sylix/coworker 1.0.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/README.md +191 -0
- package/dist/api/sylix.d.ts +51 -0
- package/dist/api/sylix.d.ts.map +1 -0
- package/dist/api/sylix.js +234 -0
- package/dist/api/sylix.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +235 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ask.d.ts +2 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +55 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/chat.d.ts +2 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +292 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/commit.d.ts +2 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +163 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +101 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/edit.d.ts +2 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +112 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/explain.d.ts +2 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +99 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +151 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/review.d.ts +2 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +137 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +136 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/context/reader.d.ts +24 -0
- package/dist/context/reader.d.ts.map +1 -0
- package/dist/context/reader.js +209 -0
- package/dist/context/reader.js.map +1 -0
- package/dist/memory/loader.d.ts +41 -0
- package/dist/memory/loader.d.ts.map +1 -0
- package/dist/memory/loader.js +249 -0
- package/dist/memory/loader.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +7 -0
- package/dist/scripts/postinstall.d.ts.map +1 -0
- package/dist/scripts/postinstall.js +23 -0
- package/dist/scripts/postinstall.js.map +1 -0
- package/dist/tools/bash.d.ts +2 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +40 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/chrome.d.ts +10 -0
- package/dist/tools/chrome.d.ts.map +1 -0
- package/dist/tools/chrome.js +228 -0
- package/dist/tools/chrome.js.map +1 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +67 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/ls.d.ts +2 -0
- package/dist/tools/ls.d.ts.map +1 -0
- package/dist/tools/ls.js +75 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/read.d.ts +2 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +72 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/registry.d.ts +2 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +64 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/utils/output.d.ts +62 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +487 -0
- package/dist/utils/output.js.map +1 -0
- package/package.json +54 -0
package/README.md
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# CoWorker by Sylix
|
|
2
|
+
|
|
3
|
+
A powerful AI-powered CLI coding assistant that runs in your terminal.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Ask**: Query your codebase with natural language questions
|
|
10
|
+
- **Explain**: Get clear explanations of any file's purpose and structure
|
|
11
|
+
- **Edit**: AI-assisted file editing with diff preview and confirmation
|
|
12
|
+
- **Run**: Execute tasks with intelligent command suggestions
|
|
13
|
+
- **Config**: Easy configuration management for your Sylix API credentials
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
### Prerequisites
|
|
18
|
+
|
|
19
|
+
- Node.js 18 or higher
|
|
20
|
+
- npm or yarn
|
|
21
|
+
- Sylix API access
|
|
22
|
+
|
|
23
|
+
### Install Dependencies
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
cd coworker
|
|
27
|
+
npm install
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Build
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm run build
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Global Installation (Optional)
|
|
37
|
+
|
|
38
|
+
To use `coworker` command anywhere:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm link
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Configuration
|
|
45
|
+
|
|
46
|
+
Before using CoWorker, configure your Sylix API credentials:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
coworker config init
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
You'll be prompted for:
|
|
53
|
+
- **Base URL**: Your Sylix API endpoint (default: `https://api.sylix.ai`)
|
|
54
|
+
- **API Key**: Your Sylix API key
|
|
55
|
+
- **Default Model**: Model to use (default: `sylix-4`)
|
|
56
|
+
|
|
57
|
+
To view your current configuration:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
coworker config show
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Usage
|
|
64
|
+
|
|
65
|
+
### Ask a Question
|
|
66
|
+
|
|
67
|
+
Ask questions about your codebase with context awareness:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
coworker ask "What does the authentication module do?"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
coworker ask "How can I optimize the database queries in this project?"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Explain a File
|
|
78
|
+
|
|
79
|
+
Get detailed explanations of any file:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
coworker explain src/api/sylix.ts
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
coworker explain package.json
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Edit a File
|
|
90
|
+
|
|
91
|
+
AI-assisted editing with diff preview:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
coworker edit src/utils/helper.ts "Add input validation to the parseConfig function"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
coworker edit app.js "Convert the callback-based function to use async/await"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Run a Task
|
|
102
|
+
|
|
103
|
+
Execute tasks with command suggestions:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
coworker run "Set up a new React component library"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
coworker run "Run all tests and show me the results"
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
The assistant will suggest commands and ask for confirmation before executing them.
|
|
114
|
+
|
|
115
|
+
## Project Structure
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
coworker/
|
|
119
|
+
├── src/
|
|
120
|
+
│ ├── cli.ts # Main CLI entry point
|
|
121
|
+
│ ├── api/
|
|
122
|
+
│ │ └── sylix.ts # Sylix API client
|
|
123
|
+
│ ├── context/
|
|
124
|
+
│ │ └── reader.ts # Context reader for codebase
|
|
125
|
+
│ ├── commands/
|
|
126
|
+
│ │ ├── ask.ts # Ask command implementation
|
|
127
|
+
│ │ ├── edit.ts # Edit command implementation
|
|
128
|
+
│ │ ├── explain.ts # Explain command implementation
|
|
129
|
+
│ │ ├── run.ts # Run command implementation
|
|
130
|
+
│ │ └── config.ts # Config commands
|
|
131
|
+
│ └── utils/
|
|
132
|
+
│ └── output.ts # Output formatting utilities
|
|
133
|
+
├── package.json
|
|
134
|
+
├── tsconfig.json
|
|
135
|
+
└── README.md
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## API Configuration
|
|
139
|
+
|
|
140
|
+
The configuration is stored at `~/.coworker/config.json`:
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"baseUrl": "https://api.sylix.ai",
|
|
145
|
+
"apiKey": "your-api-key",
|
|
146
|
+
"defaultModel": "sylix-4"
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Development
|
|
151
|
+
|
|
152
|
+
### Run in Development Mode
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
npm run dev -- ask "What does this project do?"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Build
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
npm run build
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Output Formatting
|
|
165
|
+
|
|
166
|
+
CoWorker provides beautifully formatted terminal output:
|
|
167
|
+
|
|
168
|
+
- **Cyan** - Branding and headers
|
|
169
|
+
- **Green** - Success messages
|
|
170
|
+
- **Red** - Errors
|
|
171
|
+
- **Yellow** - Warnings
|
|
172
|
+
- **Code blocks** - Syntax highlighted with line numbers
|
|
173
|
+
- **Spinners** - Loading indicators for async operations
|
|
174
|
+
|
|
175
|
+
## Security
|
|
176
|
+
|
|
177
|
+
- API keys are stored locally in `~/.coworker/config.json`
|
|
178
|
+
- Never commit your config file to version control
|
|
179
|
+
- The config file path respects your home directory across platforms
|
|
180
|
+
|
|
181
|
+
## License
|
|
182
|
+
|
|
183
|
+
MIT License - Copyright (c) Sylix
|
|
184
|
+
|
|
185
|
+
## Support
|
|
186
|
+
|
|
187
|
+
For issues and feature requests, please visit the [GitHub repository](https://github.com/sylix/coworker).
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
**CoWorker by Sylix** - Your AI pair programmer in the terminal.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface SylixConfig {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
apiKey: string;
|
|
4
|
+
defaultModel?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ChatMessage {
|
|
7
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
8
|
+
content?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
tool_call_id?: string;
|
|
11
|
+
tool_calls?: {
|
|
12
|
+
id: string;
|
|
13
|
+
type: 'function';
|
|
14
|
+
function: {
|
|
15
|
+
name: string;
|
|
16
|
+
arguments: string;
|
|
17
|
+
};
|
|
18
|
+
}[];
|
|
19
|
+
}
|
|
20
|
+
export interface ChatRequest {
|
|
21
|
+
messages: ChatMessage[];
|
|
22
|
+
stream?: boolean;
|
|
23
|
+
model?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ChatResponse {
|
|
26
|
+
content: string;
|
|
27
|
+
tool_calls?: {
|
|
28
|
+
id: string;
|
|
29
|
+
type: 'function';
|
|
30
|
+
function: {
|
|
31
|
+
name: string;
|
|
32
|
+
arguments: string;
|
|
33
|
+
};
|
|
34
|
+
}[];
|
|
35
|
+
}
|
|
36
|
+
export interface StreamChunk {
|
|
37
|
+
content: string;
|
|
38
|
+
done: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface StreamChunk {
|
|
41
|
+
content: string;
|
|
42
|
+
done: boolean;
|
|
43
|
+
}
|
|
44
|
+
export declare function ensureConfigDir(): Promise<void>;
|
|
45
|
+
export declare function loadConfig(): Promise<SylixConfig | null>;
|
|
46
|
+
export declare function saveConfig(config: SylixConfig): Promise<void>;
|
|
47
|
+
export declare function getConfig(): Promise<SylixConfig>;
|
|
48
|
+
export declare function getConfigPath(): string;
|
|
49
|
+
export declare function chat(messages: ChatMessage[], onChunk?: (chunk: string) => void, model?: string): Promise<ChatResponse>;
|
|
50
|
+
export declare function chatNonStreaming(messages: ChatMessage[], model?: string): Promise<string>;
|
|
51
|
+
//# sourceMappingURL=sylix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sylix.d.ts","sourceRoot":"","sources":["../../src/api/sylix.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,EAAE,CAAC;CACL;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,EAAE,CAAC;CACL;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAErD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAW9D;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnE;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,CAmBtD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAsB,IAAI,CACxB,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACjC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAqHvB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAgCjB"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ensureConfigDir = ensureConfigDir;
|
|
37
|
+
exports.loadConfig = loadConfig;
|
|
38
|
+
exports.saveConfig = saveConfig;
|
|
39
|
+
exports.getConfig = getConfig;
|
|
40
|
+
exports.getConfigPath = getConfigPath;
|
|
41
|
+
exports.chat = chat;
|
|
42
|
+
exports.chatNonStreaming = chatNonStreaming;
|
|
43
|
+
const axios_1 = __importStar(require("axios"));
|
|
44
|
+
const fs = __importStar(require("fs-extra"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const os = __importStar(require("os"));
|
|
47
|
+
const output_1 = require("../utils/output");
|
|
48
|
+
const CONFIG_DIR = path.join(os.homedir(), '.coworker');
|
|
49
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
|
50
|
+
async function ensureConfigDir() {
|
|
51
|
+
await fs.ensureDir(CONFIG_DIR);
|
|
52
|
+
}
|
|
53
|
+
async function loadConfig() {
|
|
54
|
+
try {
|
|
55
|
+
if (await fs.pathExists(CONFIG_FILE)) {
|
|
56
|
+
const config = await fs.readJson(CONFIG_FILE);
|
|
57
|
+
return config;
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
(0, output_1.printError)('Failed to load configuration');
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function saveConfig(config) {
|
|
67
|
+
await ensureConfigDir();
|
|
68
|
+
await fs.writeJson(CONFIG_FILE, config, { spaces: 2 });
|
|
69
|
+
}
|
|
70
|
+
async function getConfig() {
|
|
71
|
+
const config = await loadConfig();
|
|
72
|
+
if (!config) {
|
|
73
|
+
(0, output_1.printError)('No configuration found. Please run: coworker config init');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
if (!config.apiKey) {
|
|
77
|
+
(0, output_1.printError)('API key not configured. Please run: coworker config init');
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
if (!config.baseUrl) {
|
|
81
|
+
(0, output_1.printError)('Base URL not configured. Please run: coworker config init');
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
return config;
|
|
85
|
+
}
|
|
86
|
+
function getConfigPath() {
|
|
87
|
+
return CONFIG_FILE;
|
|
88
|
+
}
|
|
89
|
+
async function chat(messages, onChunk, model) {
|
|
90
|
+
const config = await getConfig();
|
|
91
|
+
const url = `${config.baseUrl.replace(/\/$/, '')}/v1/coworker/chat/completions`;
|
|
92
|
+
const request = {
|
|
93
|
+
messages,
|
|
94
|
+
stream: true,
|
|
95
|
+
model: model || config.defaultModel || 'sylix-4'
|
|
96
|
+
};
|
|
97
|
+
try {
|
|
98
|
+
const response = await (0, axios_1.default)({
|
|
99
|
+
method: 'POST',
|
|
100
|
+
url,
|
|
101
|
+
headers: {
|
|
102
|
+
'Content-Type': 'application/json',
|
|
103
|
+
'Authorization': `Bearer ${config.apiKey}`
|
|
104
|
+
},
|
|
105
|
+
data: request,
|
|
106
|
+
responseType: 'stream',
|
|
107
|
+
timeout: 120000
|
|
108
|
+
});
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
let fullContent = '';
|
|
111
|
+
let toolCalls = [];
|
|
112
|
+
let buffer = '';
|
|
113
|
+
response.data.on('data', (chunk) => {
|
|
114
|
+
buffer += chunk.toString();
|
|
115
|
+
const lines = buffer.split('\n');
|
|
116
|
+
buffer = lines.pop() || '';
|
|
117
|
+
for (const line of lines) {
|
|
118
|
+
const trimmed = line.trim();
|
|
119
|
+
if (trimmed.startsWith('data: ')) {
|
|
120
|
+
const data = trimmed.slice(6);
|
|
121
|
+
if (data === '[DONE]') {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(data);
|
|
126
|
+
const delta = parsed.choices?.[0]?.delta;
|
|
127
|
+
if (delta?.content) {
|
|
128
|
+
fullContent += delta.content;
|
|
129
|
+
if (onChunk) {
|
|
130
|
+
onChunk(delta.content);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (delta?.tool_calls) {
|
|
134
|
+
// Reconstruct the array
|
|
135
|
+
for (const tcDelta of delta.tool_calls) {
|
|
136
|
+
const index = tcDelta.index;
|
|
137
|
+
if (!toolCalls[index]) {
|
|
138
|
+
toolCalls[index] = {
|
|
139
|
+
id: tcDelta.id,
|
|
140
|
+
type: 'function',
|
|
141
|
+
function: { name: tcDelta.function?.name || '', arguments: '' }
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (tcDelta.function?.arguments) {
|
|
145
|
+
toolCalls[index].function.arguments += tcDelta.function.arguments;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
// Skip invalid JSON
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
response.data.on('end', () => {
|
|
157
|
+
// Clean up empty indexes if any
|
|
158
|
+
const finalToolCalls = toolCalls.filter(Boolean);
|
|
159
|
+
resolve({
|
|
160
|
+
content: fullContent,
|
|
161
|
+
...(finalToolCalls.length > 0 && { tool_calls: finalToolCalls })
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
response.data.on('error', (err) => {
|
|
165
|
+
reject(err);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
if (error instanceof axios_1.AxiosError) {
|
|
171
|
+
if (error.response) {
|
|
172
|
+
const status = error.response.status;
|
|
173
|
+
const data = error.response.data;
|
|
174
|
+
if (status === 401) {
|
|
175
|
+
(0, output_1.printError)('Invalid API key. Please check your configuration.');
|
|
176
|
+
}
|
|
177
|
+
else if (status === 403) {
|
|
178
|
+
(0, output_1.printError)('Access forbidden. Please check your API permissions.');
|
|
179
|
+
}
|
|
180
|
+
else if (status === 429) {
|
|
181
|
+
(0, output_1.printError)('Rate limit exceeded. Please try again later.');
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
(0, output_1.printError)(`API error (${status}): ${JSON.stringify(data)}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else if (error.code === 'ECONNREFUSED') {
|
|
188
|
+
(0, output_1.printError)('Could not connect to Sylix API. Please check your base URL.');
|
|
189
|
+
}
|
|
190
|
+
else if (error.code === 'ETIMEDOUT') {
|
|
191
|
+
(0, output_1.printError)('Connection timed out. Please try again.');
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
(0, output_1.printError)(`Network error: ${error.message}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
(0, output_1.printError)('An unexpected error occurred');
|
|
199
|
+
}
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async function chatNonStreaming(messages, model) {
|
|
204
|
+
const config = await getConfig();
|
|
205
|
+
const url = `${config.baseUrl.replace(/\/$/, '')}/v1/coworker/chat/completions`;
|
|
206
|
+
const request = {
|
|
207
|
+
messages,
|
|
208
|
+
stream: false,
|
|
209
|
+
model: model || config.defaultModel || 'sylix-4'
|
|
210
|
+
};
|
|
211
|
+
try {
|
|
212
|
+
const response = await axios_1.default.post(url, request, {
|
|
213
|
+
headers: {
|
|
214
|
+
'Content-Type': 'application/json',
|
|
215
|
+
'Authorization': `Bearer ${config.apiKey}`
|
|
216
|
+
},
|
|
217
|
+
timeout: 120000
|
|
218
|
+
});
|
|
219
|
+
return response.data.content || response.data.message?.content || '';
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
if (error instanceof axios_1.AxiosError) {
|
|
223
|
+
if (error.response) {
|
|
224
|
+
const status = error.response.status;
|
|
225
|
+
(0, output_1.printError)(`API error (${status}): ${error.message}`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
(0, output_1.printError)(`Network error: ${error.message}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=sylix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sylix.js","sourceRoot":"","sources":["../../src/api/sylix.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|