@smilique/said 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/.env.example +21 -0
- package/README.md +132 -0
- package/dist/agent.d.ts +51 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +139 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +15 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +54 -0
- package/dist/app.js.map +1 -0
- package/dist/config.d.ts +32 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +92 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +132 -0
- package/dist/main.js.map +1 -0
- package/dist/minimax-provider.d.ts +33 -0
- package/dist/minimax-provider.d.ts.map +1 -0
- package/dist/minimax-provider.js +104 -0
- package/dist/minimax-provider.js.map +1 -0
- package/dist/npm-check-job.d.ts +34 -0
- package/dist/npm-check-job.d.ts.map +1 -0
- package/dist/npm-check-job.js +93 -0
- package/dist/npm-check-job.js.map +1 -0
- package/dist/opencode-provider.d.ts +33 -0
- package/dist/opencode-provider.d.ts.map +1 -0
- package/dist/opencode-provider.js +68 -0
- package/dist/opencode-provider.js.map +1 -0
- package/dist/scheduler.d.ts +38 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +204 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/service.d.ts +18 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +25 -0
- package/dist/service.js.map +1 -0
- package/dist/setup.d.ts +3 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +141 -0
- package/dist/setup.js.map +1 -0
- package/dist/skills/api-call-skill.d.ts +49 -0
- package/dist/skills/api-call-skill.d.ts.map +1 -0
- package/dist/skills/api-call-skill.js +140 -0
- package/dist/skills/api-call-skill.js.map +1 -0
- package/dist/skills/file-edit-skill.d.ts +39 -0
- package/dist/skills/file-edit-skill.d.ts.map +1 -0
- package/dist/skills/file-edit-skill.js +181 -0
- package/dist/skills/file-edit-skill.js.map +1 -0
- package/dist/skills/index.d.ts +8 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +7 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/registry.d.ts +13 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +45 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/skill.d.ts +41 -0
- package/dist/skills/skill.d.ts.map +1 -0
- package/dist/skills/skill.js +24 -0
- package/dist/skills/skill.js.map +1 -0
- package/dist/skills/tool-call-skill.d.ts +35 -0
- package/dist/skills/tool-call-skill.d.ts.map +1 -0
- package/dist/skills/tool-call-skill.js +81 -0
- package/dist/skills/tool-call-skill.js.map +1 -0
- package/dist/skills/web-surf-skill.d.ts +34 -0
- package/dist/skills/web-surf-skill.d.ts.map +1 -0
- package/dist/skills/web-surf-skill.js +206 -0
- package/dist/skills/web-surf-skill.js.map +1 -0
- package/dist/telegram-adapter.d.ts +21 -0
- package/dist/telegram-adapter.d.ts.map +1 -0
- package/dist/telegram-adapter.js +63 -0
- package/dist/telegram-adapter.js.map +1 -0
- package/dist/version-utils.d.ts +10 -0
- package/dist/version-utils.d.ts.map +1 -0
- package/dist/version-utils.js +24 -0
- package/dist/version-utils.js.map +1 -0
- package/dist/web-ui.d.ts +24 -0
- package/dist/web-ui.d.ts.map +1 -0
- package/dist/web-ui.js +303 -0
- package/dist/web-ui.js.map +1 -0
- package/package.json +41 -0
package/.env.example
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Telegram Configuration
|
|
2
|
+
TELEGRAM_BOT_TOKEN=your_bot_token_here
|
|
3
|
+
|
|
4
|
+
# LLM Provider (opencode or minimax)
|
|
5
|
+
SAID_PROVIDER=opencode
|
|
6
|
+
|
|
7
|
+
# OpenCode Provider (OpenAI-compatible)
|
|
8
|
+
# Default baseUrl: https://opencode.ai/zen/v1
|
|
9
|
+
OPENCODE_API_KEY=your_opencode_api_key
|
|
10
|
+
OPENCODE_BASE_URL=https://opencode.ai/zen/v1
|
|
11
|
+
OPENCODE_MODEL=minimax-m2.5-free
|
|
12
|
+
|
|
13
|
+
# MiniMax Provider (must configure your own model)
|
|
14
|
+
# MINIMAX_API_KEY=your_minimax_api_key
|
|
15
|
+
# MINIMAX_MODEL=your_minimax_model
|
|
16
|
+
|
|
17
|
+
# Auto-update Configuration
|
|
18
|
+
SAID_AUTO_UPDATE=true
|
|
19
|
+
SAID_AUTO_UPDATE_SCHEDULE=0 * * * *
|
|
20
|
+
SAID_AUTO_UPDATE_AUTO_RESTART=false
|
|
21
|
+
SAID_AUTO_UPDATE_PACKAGE=said
|
package/README.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# sAId - Smart AI Assistant
|
|
2
|
+
|
|
3
|
+
A modular AI agent with Telegram integration, Web UI, job scheduling, and extensible skills system.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Telegram Bot** - Chat with the AI assistant via Telegram
|
|
8
|
+
- **Multiple LLM Providers** - OpenCode (MiniMax, GPT, Claude, etc.) or MiniMax
|
|
9
|
+
- **Web UI** - Manage and configure the agent via browser at http://localhost:3000
|
|
10
|
+
- **Job Scheduler** - Schedule recurring tasks
|
|
11
|
+
- **Skills System** - Extensible skills (file edit, web surf, API calls, tool calls)
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Clone and install dependencies
|
|
17
|
+
npm install
|
|
18
|
+
|
|
19
|
+
# Build all packages
|
|
20
|
+
npm run build
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Configuration
|
|
24
|
+
|
|
25
|
+
### Quick Setup
|
|
26
|
+
|
|
27
|
+
Run the interactive setup wizard:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm run setup
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
This will prompt you for:
|
|
34
|
+
- Telegram bot token (get from @BotFather on Telegram)
|
|
35
|
+
- LLM provider selection (opencode or minimax)
|
|
36
|
+
- API key for the selected provider
|
|
37
|
+
|
|
38
|
+
### Manual Configuration
|
|
39
|
+
|
|
40
|
+
Edit the `.env` file:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Telegram Bot
|
|
44
|
+
TELEGRAM_BOT_TOKEN=your_bot_token_here
|
|
45
|
+
|
|
46
|
+
# Provider (opencode or minimax)
|
|
47
|
+
SAID_PROVIDER=opencode
|
|
48
|
+
|
|
49
|
+
# OpenCode Configuration
|
|
50
|
+
OPENCODE_BASE_URL=https://opencode.ai/zen/v1
|
|
51
|
+
OPENCODE_API_KEY=your_opencode_api_key
|
|
52
|
+
OPENCODE_MODEL=minimax-m2.5-free
|
|
53
|
+
|
|
54
|
+
# Or MiniMax Configuration
|
|
55
|
+
# MINIMAX_API_KEY=your_minimax_api_key
|
|
56
|
+
# MINIMAX_MODEL=MiniMax-Text-01
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Available Models
|
|
60
|
+
|
|
61
|
+
**OpenCode** (via https://opencode.ai/zen/v1):
|
|
62
|
+
- MiniMax: `minimax-m2.5-free`, `minimax-m2.5`, `minimax-m2.1-free`, `minimax-m2.1`
|
|
63
|
+
- GPT: `gpt-5.3-codex`, `gpt-5.2`, `gpt-5.1`, etc.
|
|
64
|
+
- Claude: `opus-4-6`, `sonnet-4-6`, `haiku-4-5`, etc.
|
|
65
|
+
- Gemini: `gemini-3.1-pro`, `gemini-3-flash`
|
|
66
|
+
- And more...
|
|
67
|
+
|
|
68
|
+
## Usage
|
|
69
|
+
|
|
70
|
+
### Start the Agent
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npm run start
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The bot will:
|
|
77
|
+
- Connect to Telegram
|
|
78
|
+
- Start the Web UI at http://localhost:3000
|
|
79
|
+
- Initialize the scheduler
|
|
80
|
+
|
|
81
|
+
### Telegram Commands
|
|
82
|
+
|
|
83
|
+
- Send a message to your bot to chat with the AI
|
|
84
|
+
- The agent maintains conversation context
|
|
85
|
+
|
|
86
|
+
### Web UI
|
|
87
|
+
|
|
88
|
+
Open http://localhost:3000 in your browser to:
|
|
89
|
+
- View agent status
|
|
90
|
+
- Manage configuration
|
|
91
|
+
- View conversation history
|
|
92
|
+
- Manage skills
|
|
93
|
+
- Schedule jobs
|
|
94
|
+
|
|
95
|
+
### Skills
|
|
96
|
+
|
|
97
|
+
The agent includes built-in skills:
|
|
98
|
+
|
|
99
|
+
- **file-edit** - Read, write, and edit files
|
|
100
|
+
- **web-surf** - Fetch URLs and extract content
|
|
101
|
+
- **api-call** - Make HTTP requests to external APIs
|
|
102
|
+
- **tool-call** - Execute custom tools
|
|
103
|
+
|
|
104
|
+
Skills can be invoked using: `[[skill-name:action]]` syntax in messages.
|
|
105
|
+
|
|
106
|
+
## Development
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Build all packages
|
|
110
|
+
npm run build
|
|
111
|
+
|
|
112
|
+
# Start in development mode
|
|
113
|
+
npm run start
|
|
114
|
+
|
|
115
|
+
# Run setup wizard
|
|
116
|
+
npm run setup
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Architecture
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
packages/
|
|
123
|
+
├── core/ # Base service, config, app framework
|
|
124
|
+
├── adapter-telegram/ # Telegram bot integration
|
|
125
|
+
├── provider-opencode/ # OpenCode LLM provider
|
|
126
|
+
├── provider-minimax/ # MiniMax LLM provider
|
|
127
|
+
├── agent/ # AI agent with skills support
|
|
128
|
+
├── skills/ # Skill framework and implementations
|
|
129
|
+
├── scheduler/ # Job scheduling service
|
|
130
|
+
├── web-ui/ # Web dashboard
|
|
131
|
+
└── main/ # Application entry point
|
|
132
|
+
```
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Service, type ServiceConfig } from './service.js';
|
|
2
|
+
import { EventEmitter } from 'eventemitter3';
|
|
3
|
+
import type { Skill } from './skills/skill.js';
|
|
4
|
+
import { SkillRegistry } from './skills/registry.js';
|
|
5
|
+
export interface ConversationContext {
|
|
6
|
+
messages: Array<{
|
|
7
|
+
role: 'system' | 'user' | 'assistant';
|
|
8
|
+
content: string;
|
|
9
|
+
}>;
|
|
10
|
+
chatId: number;
|
|
11
|
+
}
|
|
12
|
+
export interface AgentConfig extends ServiceConfig {
|
|
13
|
+
systemPrompt?: string;
|
|
14
|
+
maxContextLength?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ChatMessage {
|
|
17
|
+
role: 'system' | 'user' | 'assistant';
|
|
18
|
+
content: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ChatCompletionOptions {
|
|
21
|
+
messages: ChatMessage[];
|
|
22
|
+
model?: string;
|
|
23
|
+
temperature?: number;
|
|
24
|
+
maxTokens?: number;
|
|
25
|
+
stream?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface LLMProvider {
|
|
28
|
+
chatCompletion(options: ChatCompletionOptions): Promise<string>;
|
|
29
|
+
chatCompletionStream(options: ChatCompletionOptions): AsyncIterable<string>;
|
|
30
|
+
}
|
|
31
|
+
export declare class Agent extends Service {
|
|
32
|
+
private provider;
|
|
33
|
+
private systemPrompt;
|
|
34
|
+
private contexts;
|
|
35
|
+
private maxContextLength;
|
|
36
|
+
private skillRegistry;
|
|
37
|
+
constructor(config: AgentConfig, eventEmitter?: EventEmitter);
|
|
38
|
+
setProvider(provider: LLMProvider | null): void;
|
|
39
|
+
getSkillRegistry(): SkillRegistry;
|
|
40
|
+
registerSkill(skill: Skill): void;
|
|
41
|
+
unregisterSkill(name: string): boolean;
|
|
42
|
+
listSkills(): Skill[];
|
|
43
|
+
initialize(): Promise<void>;
|
|
44
|
+
start(): Promise<void>;
|
|
45
|
+
stop(): Promise<void>;
|
|
46
|
+
processMessage(chatId: number, userMessage: string): Promise<string>;
|
|
47
|
+
processMessageStream(chatId: number, userMessage: string): Promise<AsyncIterable<string>>;
|
|
48
|
+
clearContext(chatId: number): void;
|
|
49
|
+
clearAllContexts(): void;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAA6B,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAuB,MAAM,sBAAsB,CAAC;AAE1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;CAC7E;AAED,qBAAa,KAAM,SAAQ,OAAO;IAChC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,YAAY,CAA+E;IACnG,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,gBAAgB,CAAc;IACtC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,YAAY;IAW5D,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAI/C,gBAAgB,IAAI,aAAa;IAIjC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIjC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAItC,UAAU,IAAI,KAAK,EAAE;IAIf,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqEpE,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAgC/F,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC,gBAAgB,IAAI,IAAI;CAGzB"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { Service } from './service.js';
|
|
2
|
+
import { loadConfig } from './config.js';
|
|
3
|
+
import { globalSkillRegistry } from './skills/registry.js';
|
|
4
|
+
export class Agent extends Service {
|
|
5
|
+
provider = null;
|
|
6
|
+
systemPrompt = 'You are a helpful AI assistant. Respond concisely and accurately.';
|
|
7
|
+
contexts = new Map();
|
|
8
|
+
maxContextLength = 10;
|
|
9
|
+
skillRegistry;
|
|
10
|
+
constructor(config, eventEmitter) {
|
|
11
|
+
super(config, eventEmitter);
|
|
12
|
+
if (config.systemPrompt) {
|
|
13
|
+
this.systemPrompt = config.systemPrompt;
|
|
14
|
+
}
|
|
15
|
+
if (config.maxContextLength) {
|
|
16
|
+
this.maxContextLength = config.maxContextLength;
|
|
17
|
+
}
|
|
18
|
+
this.skillRegistry = globalSkillRegistry;
|
|
19
|
+
}
|
|
20
|
+
setProvider(provider) {
|
|
21
|
+
this.provider = provider;
|
|
22
|
+
}
|
|
23
|
+
getSkillRegistry() {
|
|
24
|
+
return this.skillRegistry;
|
|
25
|
+
}
|
|
26
|
+
registerSkill(skill) {
|
|
27
|
+
this.skillRegistry.register(skill);
|
|
28
|
+
}
|
|
29
|
+
unregisterSkill(name) {
|
|
30
|
+
return this.skillRegistry.unregister(name);
|
|
31
|
+
}
|
|
32
|
+
listSkills() {
|
|
33
|
+
return this.skillRegistry.list();
|
|
34
|
+
}
|
|
35
|
+
async initialize() {
|
|
36
|
+
const config = loadConfig();
|
|
37
|
+
console.log('Agent initialized');
|
|
38
|
+
}
|
|
39
|
+
async start() {
|
|
40
|
+
console.log('Agent started');
|
|
41
|
+
}
|
|
42
|
+
async stop() {
|
|
43
|
+
this.contexts.clear();
|
|
44
|
+
console.log('Agent stopped');
|
|
45
|
+
}
|
|
46
|
+
async processMessage(chatId, userMessage) {
|
|
47
|
+
if (!this.provider) {
|
|
48
|
+
throw new Error('LLM provider not set');
|
|
49
|
+
}
|
|
50
|
+
// Check if message contains a skill invocation
|
|
51
|
+
const skillMatch = userMessage.match(/\[\[(\w+)(?::(\w+))?\s*(.*?)\]\]/);
|
|
52
|
+
if (skillMatch) {
|
|
53
|
+
const skillName = skillMatch[1];
|
|
54
|
+
const action = skillMatch[2] || 'execute';
|
|
55
|
+
const paramsStr = skillMatch[3];
|
|
56
|
+
let params = {};
|
|
57
|
+
if (paramsStr) {
|
|
58
|
+
try {
|
|
59
|
+
params = JSON.parse(paramsStr);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// If not JSON, treat as single parameter
|
|
63
|
+
params = { value: paramsStr };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const skillContext = {
|
|
67
|
+
sessionId: String(chatId),
|
|
68
|
+
};
|
|
69
|
+
const result = await this.skillRegistry.execute(skillName, params, skillContext);
|
|
70
|
+
if (result.success) {
|
|
71
|
+
return `Skill executed: ${skillName}\nResult: ${JSON.stringify(result.data, null, 2)}`;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
return `Skill error: ${result.error}`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Get or create conversation context
|
|
78
|
+
let context = this.contexts.get(chatId);
|
|
79
|
+
if (!context) {
|
|
80
|
+
context = {
|
|
81
|
+
messages: [{ role: 'system', content: this.systemPrompt }],
|
|
82
|
+
chatId,
|
|
83
|
+
};
|
|
84
|
+
this.contexts.set(chatId, context);
|
|
85
|
+
}
|
|
86
|
+
// Add user message
|
|
87
|
+
context.messages.push({ role: 'user', content: userMessage });
|
|
88
|
+
// Trim context if too long
|
|
89
|
+
if (context.messages.length > this.maxContextLength + 1) {
|
|
90
|
+
// Keep system message and last maxContextLength messages
|
|
91
|
+
const systemMessage = context.messages[0];
|
|
92
|
+
context.messages = [
|
|
93
|
+
systemMessage,
|
|
94
|
+
...context.messages.slice(-this.maxContextLength),
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
// Get response from provider
|
|
98
|
+
const response = await this.provider.chatCompletion({
|
|
99
|
+
messages: context.messages,
|
|
100
|
+
});
|
|
101
|
+
// Add assistant response to context
|
|
102
|
+
context.messages.push({ role: 'assistant', content: response });
|
|
103
|
+
return response;
|
|
104
|
+
}
|
|
105
|
+
async processMessageStream(chatId, userMessage) {
|
|
106
|
+
if (!this.provider) {
|
|
107
|
+
throw new Error('LLM provider not set');
|
|
108
|
+
}
|
|
109
|
+
// Get or create conversation context
|
|
110
|
+
let context = this.contexts.get(chatId);
|
|
111
|
+
if (!context) {
|
|
112
|
+
context = {
|
|
113
|
+
messages: [{ role: 'system', content: this.systemPrompt }],
|
|
114
|
+
chatId,
|
|
115
|
+
};
|
|
116
|
+
this.contexts.set(chatId, context);
|
|
117
|
+
}
|
|
118
|
+
// Add user message
|
|
119
|
+
context.messages.push({ role: 'user', content: userMessage });
|
|
120
|
+
// Trim context if too long
|
|
121
|
+
if (context.messages.length > this.maxContextLength + 1) {
|
|
122
|
+
const systemMessage = context.messages[0];
|
|
123
|
+
context.messages = [
|
|
124
|
+
systemMessage,
|
|
125
|
+
...context.messages.slice(-this.maxContextLength),
|
|
126
|
+
];
|
|
127
|
+
}
|
|
128
|
+
return this.provider.chatCompletionStream({
|
|
129
|
+
messages: context.messages,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
clearContext(chatId) {
|
|
133
|
+
this.contexts.delete(chatId);
|
|
134
|
+
}
|
|
135
|
+
clearAllContexts() {
|
|
136
|
+
this.contexts.clear();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
export declare class Application {
|
|
3
|
+
private services;
|
|
4
|
+
private eventEmitter;
|
|
5
|
+
private running;
|
|
6
|
+
constructor();
|
|
7
|
+
registerService(service: any): void;
|
|
8
|
+
getEventEmitter(): EventEmitter;
|
|
9
|
+
initialize(): Promise<void>;
|
|
10
|
+
start(): Promise<void>;
|
|
11
|
+
stop(): Promise<void>;
|
|
12
|
+
isRunning(): boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare const app: Application;
|
|
15
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,OAAO,CAAkB;;IAMjC,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAInC,eAAe,IAAI,YAAY;IAIzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAetB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,SAAS,IAAI,OAAO;CAGrB;AAED,eAAO,MAAM,GAAG,aAAoB,CAAC"}
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { loadConfig } from './config.js';
|
|
2
|
+
import { EventEmitter } from 'eventemitter3';
|
|
3
|
+
export class Application {
|
|
4
|
+
services = [];
|
|
5
|
+
eventEmitter;
|
|
6
|
+
running = false;
|
|
7
|
+
constructor() {
|
|
8
|
+
this.eventEmitter = new EventEmitter();
|
|
9
|
+
}
|
|
10
|
+
registerService(service) {
|
|
11
|
+
this.services.push(service);
|
|
12
|
+
}
|
|
13
|
+
getEventEmitter() {
|
|
14
|
+
return this.eventEmitter;
|
|
15
|
+
}
|
|
16
|
+
async initialize() {
|
|
17
|
+
const config = loadConfig();
|
|
18
|
+
console.log('Initializing sAId with provider:', config.provider);
|
|
19
|
+
for (const service of this.services) {
|
|
20
|
+
console.log(`Initializing ${service.getName()}...`);
|
|
21
|
+
await service.initialize();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async start() {
|
|
25
|
+
if (this.running) {
|
|
26
|
+
console.log('Application already running');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
console.log('Starting sAId...');
|
|
30
|
+
for (const service of this.services) {
|
|
31
|
+
console.log(`Starting ${service.getName()}...`);
|
|
32
|
+
await service.start();
|
|
33
|
+
}
|
|
34
|
+
this.running = true;
|
|
35
|
+
console.log('sAId is running!');
|
|
36
|
+
}
|
|
37
|
+
async stop() {
|
|
38
|
+
if (!this.running) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
console.log('Stopping sAId...');
|
|
42
|
+
for (const service of this.services) {
|
|
43
|
+
console.log(`Stopping ${service.getName()}...`);
|
|
44
|
+
await service.stop();
|
|
45
|
+
}
|
|
46
|
+
this.running = false;
|
|
47
|
+
console.log('sAId stopped.');
|
|
48
|
+
}
|
|
49
|
+
isRunning() {
|
|
50
|
+
return this.running;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export const app = new Application();
|
|
54
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,OAAO,WAAW;IACd,QAAQ,GAAc,EAAE,CAAC;IACzB,YAAY,CAAe;IAC3B,OAAO,GAAY,KAAK,CAAC;IAEjC;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACzC,CAAC;IAED,eAAe,CAAC,OAAY;QAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEjE,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAChD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAChD,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface AppConfig {
|
|
2
|
+
telegram?: {
|
|
3
|
+
botToken: string;
|
|
4
|
+
};
|
|
5
|
+
provider: 'opencode' | 'minimax';
|
|
6
|
+
opencode?: {
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
apiKey: string;
|
|
9
|
+
model?: string;
|
|
10
|
+
};
|
|
11
|
+
minimax?: {
|
|
12
|
+
apiKey: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Auto-update configuration
|
|
17
|
+
* - enabled: Whether to check for updates (default: true)
|
|
18
|
+
* - schedule: Cron schedule for checking (default: '0 * * * *' - every hour)
|
|
19
|
+
* - autoRestart: Whether to restart after update (default: true)
|
|
20
|
+
* - packageName: NPM package to check (default: '@said/main')
|
|
21
|
+
*/
|
|
22
|
+
autoUpdate?: {
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
schedule: string;
|
|
25
|
+
autoRestart: boolean;
|
|
26
|
+
packageName: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export declare function loadConfig(): AppConfig;
|
|
30
|
+
export declare function saveConfig(config: AppConfig): void;
|
|
31
|
+
export declare function clearConfigCache(): void;
|
|
32
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF;;;;;;OAMG;IACH,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,OAAO,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAID,wBAAgB,UAAU,IAAI,SAAS,CAsDtC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyClD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { config as loadEnv } from 'dotenv';
|
|
2
|
+
import { existsSync, writeFileSync } from 'fs';
|
|
3
|
+
import { join, dirname } from 'path';
|
|
4
|
+
let cachedConfig = null;
|
|
5
|
+
export function loadConfig() {
|
|
6
|
+
if (cachedConfig) {
|
|
7
|
+
return cachedConfig;
|
|
8
|
+
}
|
|
9
|
+
// Find project root by looking for node_modules
|
|
10
|
+
let projectRoot = process.cwd();
|
|
11
|
+
while (!existsSync(join(projectRoot, 'node_modules')) && projectRoot !== '/') {
|
|
12
|
+
projectRoot = dirname(projectRoot);
|
|
13
|
+
}
|
|
14
|
+
// Try to load .env file from project root
|
|
15
|
+
const envPath = join(projectRoot, '.env');
|
|
16
|
+
if (existsSync(envPath)) {
|
|
17
|
+
loadEnv({ path: envPath });
|
|
18
|
+
}
|
|
19
|
+
const provider = process.env.SAID_PROVIDER || 'opencode';
|
|
20
|
+
const config = {
|
|
21
|
+
provider,
|
|
22
|
+
};
|
|
23
|
+
if (process.env.TELEGRAM_BOT_TOKEN) {
|
|
24
|
+
config.telegram = {
|
|
25
|
+
botToken: process.env.TELEGRAM_BOT_TOKEN,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (provider === 'opencode') {
|
|
29
|
+
config.opencode = {
|
|
30
|
+
baseUrl: process.env.OPENCODE_BASE_URL || 'https://opencode.ai/zen/v1',
|
|
31
|
+
apiKey: process.env.OPENCODE_API_KEY || '',
|
|
32
|
+
model: process.env.OPENCODE_MODEL || 'minimax-m2.5-free',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
else if (provider === 'minimax') {
|
|
36
|
+
config.minimax = {
|
|
37
|
+
apiKey: process.env.MINIMAX_API_KEY || '',
|
|
38
|
+
model: process.env.MINIMAX_MODEL || '',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Auto-update enabled by default (unless explicitly disabled)
|
|
42
|
+
if (process.env.SAID_AUTO_UPDATE !== 'false') {
|
|
43
|
+
config.autoUpdate = {
|
|
44
|
+
enabled: true,
|
|
45
|
+
schedule: process.env.SAID_AUTO_UPDATE_SCHEDULE || '0 * * * *',
|
|
46
|
+
autoRestart: process.env.SAID_AUTO_UPDATE_AUTO_RESTART !== 'false',
|
|
47
|
+
packageName: process.env.SAID_AUTO_UPDATE_PACKAGE || '@said/main',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
cachedConfig = config;
|
|
51
|
+
return config;
|
|
52
|
+
}
|
|
53
|
+
export function saveConfig(config) {
|
|
54
|
+
// Find project root
|
|
55
|
+
let projectRoot = process.cwd();
|
|
56
|
+
while (!existsSync(join(projectRoot, 'node_modules')) && projectRoot !== '/') {
|
|
57
|
+
projectRoot = dirname(projectRoot);
|
|
58
|
+
}
|
|
59
|
+
const lines = [];
|
|
60
|
+
if (config.telegram?.botToken) {
|
|
61
|
+
lines.push(`TELEGRAM_BOT_TOKEN=${config.telegram.botToken}`);
|
|
62
|
+
}
|
|
63
|
+
if (config.autoUpdate) {
|
|
64
|
+
lines.push(`SAID_AUTO_UPDATE=${config.autoUpdate.enabled}`);
|
|
65
|
+
lines.push(`SAID_AUTO_UPDATE_SCHEDULE=${config.autoUpdate.schedule}`);
|
|
66
|
+
lines.push(`SAID_AUTO_UPDATE_AUTO_RESTART=${config.autoUpdate.autoRestart}`);
|
|
67
|
+
lines.push(`SAID_AUTO_UPDATE_PACKAGE=${config.autoUpdate.packageName}`);
|
|
68
|
+
}
|
|
69
|
+
lines.push(`SAID_PROVIDER=${config.provider}`);
|
|
70
|
+
if (config.provider === 'opencode' && config.opencode) {
|
|
71
|
+
lines.push(`OPENCODE_BASE_URL=${config.opencode.baseUrl}`);
|
|
72
|
+
lines.push(`OPENCODE_API_KEY=${config.opencode.apiKey}`);
|
|
73
|
+
if (config.opencode.model) {
|
|
74
|
+
lines.push(`OPENCODE_MODEL=${config.opencode.model}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else if (config.provider === 'minimax' && config.minimax) {
|
|
78
|
+
lines.push(`MINIMAX_API_KEY=${config.minimax.apiKey}`);
|
|
79
|
+
if (config.minimax.model) {
|
|
80
|
+
lines.push(`MINIMAX_MODEL=${config.minimax.model}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const envPath = join(projectRoot, '.env');
|
|
84
|
+
const content = lines.join('\n');
|
|
85
|
+
writeFileSync(envPath, content + '\n', 'utf-8');
|
|
86
|
+
// Update cached config
|
|
87
|
+
cachedConfig = config;
|
|
88
|
+
}
|
|
89
|
+
export function clearConfigCache() {
|
|
90
|
+
cachedConfig = null;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAsB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
|