@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.
Files changed (87) hide show
  1. package/.env.example +21 -0
  2. package/README.md +132 -0
  3. package/dist/agent.d.ts +51 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +139 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/app.d.ts +15 -0
  8. package/dist/app.d.ts.map +1 -0
  9. package/dist/app.js +54 -0
  10. package/dist/app.js.map +1 -0
  11. package/dist/config.d.ts +32 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +92 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/index.d.ts +4 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +4 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/main.d.ts +3 -0
  20. package/dist/main.d.ts.map +1 -0
  21. package/dist/main.js +132 -0
  22. package/dist/main.js.map +1 -0
  23. package/dist/minimax-provider.d.ts +33 -0
  24. package/dist/minimax-provider.d.ts.map +1 -0
  25. package/dist/minimax-provider.js +104 -0
  26. package/dist/minimax-provider.js.map +1 -0
  27. package/dist/npm-check-job.d.ts +34 -0
  28. package/dist/npm-check-job.d.ts.map +1 -0
  29. package/dist/npm-check-job.js +93 -0
  30. package/dist/npm-check-job.js.map +1 -0
  31. package/dist/opencode-provider.d.ts +33 -0
  32. package/dist/opencode-provider.d.ts.map +1 -0
  33. package/dist/opencode-provider.js +68 -0
  34. package/dist/opencode-provider.js.map +1 -0
  35. package/dist/scheduler.d.ts +38 -0
  36. package/dist/scheduler.d.ts.map +1 -0
  37. package/dist/scheduler.js +204 -0
  38. package/dist/scheduler.js.map +1 -0
  39. package/dist/service.d.ts +18 -0
  40. package/dist/service.d.ts.map +1 -0
  41. package/dist/service.js +25 -0
  42. package/dist/service.js.map +1 -0
  43. package/dist/setup.d.ts +3 -0
  44. package/dist/setup.d.ts.map +1 -0
  45. package/dist/setup.js +141 -0
  46. package/dist/setup.js.map +1 -0
  47. package/dist/skills/api-call-skill.d.ts +49 -0
  48. package/dist/skills/api-call-skill.d.ts.map +1 -0
  49. package/dist/skills/api-call-skill.js +140 -0
  50. package/dist/skills/api-call-skill.js.map +1 -0
  51. package/dist/skills/file-edit-skill.d.ts +39 -0
  52. package/dist/skills/file-edit-skill.d.ts.map +1 -0
  53. package/dist/skills/file-edit-skill.js +181 -0
  54. package/dist/skills/file-edit-skill.js.map +1 -0
  55. package/dist/skills/index.d.ts +8 -0
  56. package/dist/skills/index.d.ts.map +1 -0
  57. package/dist/skills/index.js +7 -0
  58. package/dist/skills/index.js.map +1 -0
  59. package/dist/skills/registry.d.ts +13 -0
  60. package/dist/skills/registry.d.ts.map +1 -0
  61. package/dist/skills/registry.js +45 -0
  62. package/dist/skills/registry.js.map +1 -0
  63. package/dist/skills/skill.d.ts +41 -0
  64. package/dist/skills/skill.d.ts.map +1 -0
  65. package/dist/skills/skill.js +24 -0
  66. package/dist/skills/skill.js.map +1 -0
  67. package/dist/skills/tool-call-skill.d.ts +35 -0
  68. package/dist/skills/tool-call-skill.d.ts.map +1 -0
  69. package/dist/skills/tool-call-skill.js +81 -0
  70. package/dist/skills/tool-call-skill.js.map +1 -0
  71. package/dist/skills/web-surf-skill.d.ts +34 -0
  72. package/dist/skills/web-surf-skill.d.ts.map +1 -0
  73. package/dist/skills/web-surf-skill.js +206 -0
  74. package/dist/skills/web-surf-skill.js.map +1 -0
  75. package/dist/telegram-adapter.d.ts +21 -0
  76. package/dist/telegram-adapter.d.ts.map +1 -0
  77. package/dist/telegram-adapter.js +63 -0
  78. package/dist/telegram-adapter.js.map +1 -0
  79. package/dist/version-utils.d.ts +10 -0
  80. package/dist/version-utils.d.ts.map +1 -0
  81. package/dist/version-utils.js +24 -0
  82. package/dist/version-utils.js.map +1 -0
  83. package/dist/web-ui.d.ts +24 -0
  84. package/dist/web-ui.d.ts.map +1 -0
  85. package/dist/web-ui.js +303 -0
  86. package/dist/web-ui.js.map +1 -0
  87. 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
+ ```
@@ -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
@@ -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"}
@@ -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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"}
@@ -0,0 +1,4 @@
1
+ export { Service, type ServiceConfig } from './service.js';
2
+ export { loadConfig, saveConfig, clearConfigCache, type AppConfig } from './config.js';
3
+ export { Application, app } from './app.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export { Service } from './service.js';
2
+ export { loadConfig, saveConfig, clearConfigCache } from './config.js';
3
+ export { Application, app } from './app.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}