stella-coder 5.3.0 → 5.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/COMMANDS.md +47 -0
  2. package/install-av.bat +17 -0
  3. package/install-stella-pkg.bat +21 -0
  4. package/oneline-av.ps1 +7 -0
  5. package/oneline-stella.ps1 +2 -0
  6. package/package.json +1 -1
  7. package/releases/stella-antivirus/database.mjs +871 -0
  8. package/releases/stella-antivirus/index.mjs +8 -0
  9. package/releases/stella-antivirus/install-av.bat +12 -0
  10. package/releases/stella-antivirus/scanner.mjs +591 -0
  11. package/releases/stella-antivirus/ui.mjs +570 -0
  12. package/releases/stella-antivirus.zip +0 -0
  13. package/releases/stella-coder/README.md +67 -0
  14. package/releases/stella-coder/adb.mjs +200 -0
  15. package/releases/stella-coder/autonomous-agent.mjs +550 -0
  16. package/releases/stella-coder/banner.mjs +46 -0
  17. package/releases/stella-coder/browser-control.mjs +274 -0
  18. package/releases/stella-coder/build.mjs +151 -0
  19. package/releases/stella-coder/charts.mjs +411 -0
  20. package/releases/stella-coder/coding-brain.mjs +753 -0
  21. package/releases/stella-coder/game-engine.mjs +708 -0
  22. package/releases/stella-coder/gdrive-backup.mjs +338 -0
  23. package/releases/stella-coder/git-api.mjs +407 -0
  24. package/releases/stella-coder/gmail.mjs +415 -0
  25. package/releases/stella-coder/home-assistant.mjs +168 -0
  26. package/releases/stella-coder/index.mjs +5810 -0
  27. package/releases/stella-coder/install-stella.bat +12 -0
  28. package/releases/stella-coder/markdown.mjs +100 -0
  29. package/releases/stella-coder/mcp.mjs +296 -0
  30. package/releases/stella-coder/package.json +67 -0
  31. package/releases/stella-coder/presentations.mjs +1106 -0
  32. package/releases/stella-coder/protect.mjs +182 -0
  33. package/releases/stella-coder/screen-monitor.mjs +334 -0
  34. package/releases/stella-coder/sea-config.json +5 -0
  35. package/releases/stella-coder/security.mjs +237 -0
  36. package/releases/stella-coder/subagents.mjs +142 -0
  37. package/releases/stella-coder/telegram-bot.mjs +824 -0
  38. package/releases/stella-coder/tg-server.mjs +116 -0
  39. package/releases/stella-coder/theme.mjs +91 -0
  40. package/releases/stella-coder/tools.mjs +3143 -0
  41. package/releases/stella-coder/web-parser.mjs +229 -0
  42. package/releases/stella-coder/yandex-maps.mjs +426 -0
  43. package/releases/stella-coder.zip +0 -0
  44. package/run-antivirus.bat +4 -0
  45. package/setup-antivirus.bat +64 -0
  46. package/setup-full.bat +65 -0
  47. package/setup-stella.bat +46 -0
  48. package/stella-cli/game-engine.mjs +2 -2
  49. package/stella-cli/index.mjs +11 -1
  50. package/stella-cli/protect.mjs +182 -0
  51. package/stella.bat +3 -0
  52. package/tests/test-modules.mjs +101 -0
@@ -0,0 +1,12 @@
1
+ @echo off
2
+ chcp 65001 >nul
3
+ echo.
4
+ echo ✦ Stella Coder — Installation
5
+ echo =============================
6
+ echo.
7
+ echo Install: npm i -g stella-coder
8
+ echo Or run: node stella-cli/index.mjs
9
+ echo.
10
+ echo Docs: https://a1x10.github.io/stella/
11
+ echo.
12
+ pause
@@ -0,0 +1,100 @@
1
+ import { bold, dim, italic, violet, blue, cyan, purple, gray, bgRgb, rgb } from "./theme.mjs"
2
+
3
+ const codeBg = bgRgb(30, 27, 55)
4
+ const codeFg = rgb(196, 181, 253)
5
+
6
+ // Inline markdown: **bold**, *italic*, `code`, [link](url)
7
+ export function renderInline(text) {
8
+ let out = text
9
+ out = out.replace(/\*\*([^*]+)\*\*/g, (_, s) => bold(violet(s)))
10
+ out = out.replace(/(^|[^*])\*([^*\n]+)\*/g, (_, p, s) => p + italic(s))
11
+ out = out.replace(/`([^`]+)`/g, (_, s) => codeBg(codeFg(` ${s} `)))
12
+ out = out.replace(/\[([^\]]+)\][(]([^)]+)[)]/g, (_, label, url) => blue(label) + dim(` (${url})`))
13
+ return out
14
+ }
15
+
16
+ // Block markdown renderer for a complete markdown string
17
+ export function renderMarkdown(md) {
18
+ const lines = md.split("\n")
19
+ const out = []
20
+ let inCode = false
21
+ let codeLang = ""
22
+ let codeBuf = []
23
+
24
+ for (const line of lines) {
25
+ const fence = line.match(/^\s*```(\w*)/)
26
+ if (fence) {
27
+ if (!inCode) {
28
+ inCode = true
29
+ codeLang = fence[1] || ""
30
+ codeBuf = []
31
+ } else {
32
+ inCode = false
33
+ const width = Math.max(...codeBuf.map((l) => l.length), codeLang.length + 2, 20)
34
+ out.push(purple(" ╭─") + dim(codeLang ? ` ${codeLang} ` : "") + purple("─".repeat(Math.max(width - codeLang.length, 2)) + "╮"))
35
+ for (const cl of codeBuf) {
36
+ out.push(purple(" │ ") + codeFg(cl) + " ".repeat(width - cl.length + 1) + purple("│"))
37
+ }
38
+ out.push(purple(" ╰" + "─".repeat(width + 3) + "╯"))
39
+ }
40
+ continue
41
+ }
42
+ if (inCode) {
43
+ codeBuf.push(line)
44
+ continue
45
+ }
46
+ const h = line.match(/^(#{1,4})\s+(.*)/)
47
+ if (h) {
48
+ out.push("")
49
+ out.push(bold(violet(h[2])))
50
+ continue
51
+ }
52
+ const li = line.match(/^(\s*)[-*]\s+(.*)/)
53
+ if (li) {
54
+ out.push(li[1] + violet("•") + " " + renderInline(li[2]))
55
+ continue
56
+ }
57
+ const ol = line.match(/^(\s*)(\d+)\.\s+(.*)/)
58
+ if (ol) {
59
+ out.push(ol[1] + blue(ol[2] + ".") + " " + renderInline(ol[3]))
60
+ continue
61
+ }
62
+ const bq = line.match(/^\s*>\s?(.*)/)
63
+ if (bq) {
64
+ out.push(purple(" ▎") + dim(renderInline(bq[1])))
65
+ continue
66
+ }
67
+ if (/^\s*(---|\*\*\*)\s*$/.test(line)) {
68
+ out.push(dim(" " + "─".repeat(40)))
69
+ continue
70
+ }
71
+ out.push(renderInline(line))
72
+ }
73
+ if (inCode && codeBuf.length) {
74
+ for (const cl of codeBuf) out.push(codeFg(" " + cl))
75
+ }
76
+ return out.join("\n")
77
+ }
78
+
79
+ // Streaming renderer: buffers text and flushes rendered lines as they complete
80
+ export function createStreamRenderer(write) {
81
+ let buf = ""
82
+ return {
83
+ push(delta) {
84
+ buf += delta
85
+ const idx = buf.lastIndexOf("\n")
86
+ if (idx === -1) return
87
+ // Don't flush while inside an unclosed code fence
88
+ const flushable = buf.slice(0, idx + 1)
89
+ const fences = (flushable.match(/```/g) || []).length
90
+ if (fences % 2 !== 0) return
91
+ write(renderMarkdown(flushable.replace(/\n$/, "")) + "\n")
92
+ buf = buf.slice(idx + 1)
93
+ },
94
+ flush() {
95
+ if (buf.trim()) write(renderMarkdown(buf) + "\n")
96
+ else if (buf) write(buf)
97
+ buf = ""
98
+ },
99
+ }
100
+ }
@@ -0,0 +1,296 @@
1
+ import fs from "node:fs"
2
+ import path from "node:path"
3
+ import os from "node:os"
4
+ import { execSync } from "node:child_process"
5
+
6
+ // Конфигурация MCP серверов
7
+ const MCP_CONFIG_PATH = path.join(os.homedir(), ".stella", "mcp.json")
8
+
9
+ // Дефолтные MCP серверы
10
+ const DEFAULT_SERVERS = {
11
+ "filesystem": {
12
+ command: "npx",
13
+ args: ["-y", "@modelcontextprotocol/server-filesystem", process.cwd()],
14
+ description: "Доступ к файловой системе",
15
+ icon: "📁",
16
+ },
17
+ "github": {
18
+ command: "npx",
19
+ args: ["-y", "@modelcontextprotocol/server-github"],
20
+ env: { GITHUB_TOKEN: process.env.GITHUB_TOKEN || "" },
21
+ description: "Интеграция с GitHub",
22
+ icon: "🐙",
23
+ },
24
+ "memory": {
25
+ command: "npx",
26
+ args: ["-y", "@modelcontextprotocol/server-memory"],
27
+ description: "Долгосрочная память",
28
+ icon: "🧠",
29
+ },
30
+ "brave-search": {
31
+ command: "npx",
32
+ args: ["-y", "@modelcontextprotocol/server-brave-search"],
33
+ env: { BRAVE_API_KEY: process.env.BRAVE_API_KEY || "" },
34
+ description: "Поиск в интернете (Brave)",
35
+ icon: "🔍",
36
+ },
37
+ "postgres": {
38
+ command: "npx",
39
+ args: ["-y", "@modelcontextprotocol/server-postgres", process.env.DATABASE_URL || ""],
40
+ description: "PostgreSQL база данных",
41
+ icon: "🐘",
42
+ },
43
+ "sqlite": {
44
+ command: "npx",
45
+ args: ["-y", "@modelcontextprotocol/server-sqlite", "--db-path", "database.db"],
46
+ description: "SQLite база данных",
47
+ icon: "💾",
48
+ },
49
+ "puppeteer": {
50
+ command: "npx",
51
+ args: ["-y", "@modelcontextprotocol/server-puppeteer"],
52
+ description: "Браузер automation (Puppeteer)",
53
+ icon: "🌐",
54
+ },
55
+ "fetch": {
56
+ command: "npx",
57
+ args: ["-y", "@modelcontextprotocol/server-fetch"],
58
+ description: "HTTP запросы",
59
+ icon: "📤",
60
+ },
61
+ }
62
+
63
+ class MCPManager {
64
+ constructor() {
65
+ this.servers = new Map()
66
+ this.tools = new Map()
67
+ this.config = this.loadConfig()
68
+ }
69
+
70
+ loadConfig() {
71
+ try {
72
+ if (fs.existsSync(MCP_CONFIG_PATH)) {
73
+ return JSON.parse(fs.readFileSync(MCP_CONFIG_PATH, "utf8"))
74
+ }
75
+ } catch {}
76
+ return { servers: {} }
77
+ }
78
+
79
+ saveConfig() {
80
+ const dir = path.dirname(MCP_CONFIG_PATH)
81
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })
82
+ fs.writeFileSync(MCP_CONFIG_PATH, JSON.stringify(this.config, null, 2), "utf8")
83
+ }
84
+
85
+ // Регистрация сервера
86
+ async addServer(name, serverConfig) {
87
+ this.config.servers[name] = {
88
+ command: serverConfig.command,
89
+ args: serverConfig.args || [],
90
+ env: serverConfig.env || {},
91
+ description: serverConfig.description || "",
92
+ icon: serverConfig.icon || "🔌",
93
+ }
94
+ this.saveConfig()
95
+ return { success: true, message: `Сервер "${name}" добавлен` }
96
+ }
97
+
98
+ // Удаление сервера
99
+ async removeServer(name) {
100
+ if (this.config.servers[name]) {
101
+ delete this.config.servers[name]
102
+ this.saveConfig()
103
+ this.servers.delete(name)
104
+ return { success: true, message: `Сервер "${name}" удалён` }
105
+ }
106
+ return { error: `Сервер "${name}" не найден` }
107
+ }
108
+
109
+ // Запуск сервера (симуляция для CLI)
110
+ async startServer(name) {
111
+ const server = this.config.servers[name] || DEFAULT_SERVERS[name]
112
+ if (!server) {
113
+ return { error: `Сервер "${name}" не найден` }
114
+ }
115
+
116
+ console.log(`\n 🔌 Запуск MCP сервера: ${name}`)
117
+ console.log(` ${server.description}`)
118
+
119
+ // Проверяем доступность
120
+ try {
121
+ const cmd = `${server.command} ${server.args.join(" ")} --help`
122
+ execSync(cmd, { stdio: "pipe", timeout: 5000 })
123
+ this.servers.set(name, { status: "running", config: server })
124
+ console.log(` ✓ Сервер "${name}" запущен\n`)
125
+ return { success: true, status: "running" }
126
+ } catch (err) {
127
+ console.log(` ⚠ Сервер "${name}" требует установку зависимостей`)
128
+ console.log(` Выполните: ${server.command} ${server.args.join(" ")}\n`)
129
+ this.servers.set(name, { status: "installed", config: server })
130
+ return { success: true, status: "installed" }
131
+ }
132
+ }
133
+
134
+ // Остановка сервера
135
+ async stopServer(name) {
136
+ this.servers.delete(name)
137
+ return { success: true, message: `Сервер "${name}" остановлен` }
138
+ }
139
+
140
+ // Получение инструментов сервера
141
+ getServerTools(name) {
142
+ const serverTools = {
143
+ "filesystem": [
144
+ { name: "fs_read_file", description: "Чтение файла через MCP" },
145
+ { name: "fs_write_file", description: "Запись файла через MCP" },
146
+ { name: "fs_list_directory", description: "Список файлов" },
147
+ { name: "fs_search_files", description: "Поиск файлов" },
148
+ ],
149
+ "github": [
150
+ { name: "gh_create_repo", description: "Создать репозиторий" },
151
+ { name: "gh_create_issue", description: "Создать issue" },
152
+ { name: "gh_create_pr", description: "Создать pull request" },
153
+ { name: "gh_list_issues", description: "Список issues" },
154
+ { name: "gh_search_code", description: "Поиск кода" },
155
+ ],
156
+ "memory": [
157
+ { name: "mem_store", description: "Сохранить в память" },
158
+ { name: "mem_retrieve", description: "Из памяти" },
159
+ { name: "mem_search", description: "Поиск в памяти" },
160
+ ],
161
+ "brave-search": [
162
+ { name: "brave_web_search", description: "Поиск в интернете" },
163
+ { name: "brave_local_search", description: "Локальный поиск" },
164
+ ],
165
+ "puppeteer": [
166
+ { name: "pup_navigate", description: "Открыть страницу" },
167
+ { name: "pup_screenshot", description: "Скриншот страницы" },
168
+ { name: "pup_click", description: "Клик по элементу" },
169
+ { name: "pup_type", description: "Ввод текста" },
170
+ { name: "pup_evaluate", description: "Выполнить JS в браузере" },
171
+ ],
172
+ "fetch": [
173
+ { name: "fetch_get", description: "GET запрос" },
174
+ { name: "fetch_post", description: "POST запрос" },
175
+ ],
176
+ }
177
+ return serverTools[name] || []
178
+ }
179
+
180
+ // Список серверов
181
+ listServers() {
182
+ const all = { ...DEFAULT_SERVERS, ...this.config.servers }
183
+ return Object.entries(all).map(([name, config]) => ({
184
+ name,
185
+ ...config,
186
+ status: this.servers.get(name)?.status || "stopped",
187
+ }))
188
+ }
189
+
190
+ // Список всех доступных инструментов
191
+ getAllTools() {
192
+ const tools = []
193
+ for (const [serverName] of this.servers) {
194
+ const serverTools = this.getServerTools(serverName)
195
+ tools.push(...serverTools.map(t => ({ ...t, server: serverName })))
196
+ }
197
+ return tools
198
+ }
199
+ }
200
+
201
+ // Экспорт singleton
202
+ export const mcp = new MCPManager()
203
+
204
+ // Команды MCP для CLI
205
+ export const MCP_COMMANDS = {
206
+ "/mcp": {
207
+ description: "Управление MCP серверами",
208
+ handler: async (args) => {
209
+ const [subcommand, ...rest] = args.split(" ")
210
+
211
+ switch (subcommand) {
212
+ case "list":
213
+ case "ls": {
214
+ const servers = mcp.listServers()
215
+ console.log("\n MCP Серверы:\n")
216
+ for (const s of servers) {
217
+ const status = s.status === "running" ? "🟢" : s.status === "installed" ? "🟡" : "🔴"
218
+ console.log(` ${status} ${s.icon || "🔌"} ${s.name}`)
219
+ console.log(` ${s.description}`)
220
+ console.log(` ${s.command} ${s.args.join(" ")}\n`)
221
+ }
222
+ return
223
+ }
224
+
225
+ case "start": {
226
+ const name = rest[0]
227
+ if (!name) { console.log(" Использование: /mcp start <имя>"); return }
228
+ await mcp.startServer(name)
229
+ return
230
+ }
231
+
232
+ case "stop": {
233
+ const name = rest[0]
234
+ if (!name) { console.log(" Использование: /mcp stop <имя>"); return }
235
+ await mcp.stopServer(name)
236
+ console.log(` ✓ Сервер "${name}" остановлен`)
237
+ return
238
+ }
239
+
240
+ case "add": {
241
+ const [name, command, ...args] = rest
242
+ if (!name || !command) {
243
+ console.log(" Использование: /mcp add <имя> <команда> [аргументы...]")
244
+ return
245
+ }
246
+ await mcp.addServer(name, { command, args, description: `Custom server: ${name}` })
247
+ console.log(` ✓ Сервер "${name}" добавлен`)
248
+ return
249
+ }
250
+
251
+ case "remove":
252
+ case "rm": {
253
+ const name = rest[0]
254
+ if (!name) { console.log(" Использование: /mcp remove <имя>"); return }
255
+ await mcp.removeServer(name)
256
+ console.log(` ✓ Сервер "${name}" удалён`)
257
+ return
258
+ }
259
+
260
+ case "tools": {
261
+ const tools = mcp.getAllTools()
262
+ if (tools.length === 0) {
263
+ console.log("\n Нет подключённых серверов. Запустите: /mcp start <имя>\n")
264
+ return
265
+ }
266
+ console.log("\n Доступные MCP инструменты:\n")
267
+ for (const t of tools) {
268
+ console.log(` 🔧 ${t.name} (${t.server})`)
269
+ console.log(` ${t.description}\n`)
270
+ }
271
+ return
272
+ }
273
+
274
+ default:
275
+ console.log(`
276
+ MCP (Model Context Protocol) — подключение к внешним серверам
277
+
278
+ Команды:
279
+ /mcp list — список серверов
280
+ /mcp start <имя> — запустить сервер
281
+ /mcp stop <имя> — остановить сервер
282
+ /mcp add <имя> <команда> [args] — добавить сервер
283
+ /mcp remove <имя> — удалить сервер
284
+ /mcp tools — список инструментов
285
+
286
+ Популярные серверы:
287
+ filesystem — файловая система
288
+ github — GitHub API
289
+ memory — долгосрочная память
290
+ puppeteer — браузер automation
291
+ fetch — HTTP запросы
292
+ `)
293
+ }
294
+ },
295
+ },
296
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "stella-coder",
3
+ "version": "5.3.1",
4
+ "private": false,
5
+ "description": "Stella Coder 5.0 — AI coding agent with Telegram bot, huge context, TDD, Git ecosystem, presentations, computer control, smart home, Office automation, and antivirus",
6
+ "main": "stella-cli/index.mjs",
7
+ "bin": {
8
+ "stella": "stella-cli/index.mjs"
9
+ },
10
+ "scripts": {
11
+ "stella": "node stella-cli/index.mjs",
12
+ "stellar-av": "node antimalware/index.mjs",
13
+ "dev": "next dev",
14
+ "build": "next build",
15
+ "build:cli": "node stella-cli/build.mjs",
16
+ "start": "next start",
17
+ "lint": "eslint ."
18
+ },
19
+ "keywords": [
20
+ "ai",
21
+ "coding",
22
+ "agent",
23
+ "terminal",
24
+ "smart-home",
25
+ "antivirus"
26
+ ],
27
+ "author": "codex alex",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "@ai-sdk/openai": "^4.0.7",
31
+ "@ai-sdk/openai-compatible": "^3.0.5",
32
+ "@ai-sdk/react": "^4.0.16",
33
+ "@base-ui/react": "^1.5.0",
34
+ "@vercel/analytics": "1.6.1",
35
+ "ai": "^7.0.15",
36
+ "class-variance-authority": "^0.7.1",
37
+ "clsx": "^2.1.1",
38
+ "gsap": "^3.15.0",
39
+ "jsdom": "^29.1.1",
40
+ "lucide-react": "^1.16.0",
41
+ "next": "16.2.6",
42
+ "react": "^19",
43
+ "react-dom": "^19",
44
+ "shadcn": "^4.8.0",
45
+ "tailwind-merge": "^3.3.1",
46
+ "three": "^0.185.1",
47
+ "tw-animate-css": "^1.4.0",
48
+ "zod": "^4.4.3"
49
+ },
50
+ "devDependencies": {
51
+ "@eslint/eslintrc": "^3.3.0",
52
+ "@tailwindcss/postcss": "^4.2.0",
53
+ "@types/node": "^24",
54
+ "@types/react": "^19",
55
+ "@types/react-dom": "^19",
56
+ "eslint": "^9.28.0",
57
+ "eslint-config-next": "^16.2.0",
58
+ "postcss": "^8.5",
59
+ "tailwindcss": "^4.2.0",
60
+ "typescript": "5.7.3"
61
+ },
62
+ "pnpm": {
63
+ "overrides": {
64
+ "hono": "4.12.25"
65
+ }
66
+ }
67
+ }