@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/dist/main.js ADDED
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env node
2
+ import { Application } from './app.js';
3
+ import { loadConfig } from './config.js';
4
+ import { TelegramAdapter } from './telegram-adapter.js';
5
+ import { OpenCodeProvider } from './opencode-provider.js';
6
+ import { MiniMaxProvider } from './minimax-provider.js';
7
+ import { Agent } from './agent.js';
8
+ import { FileEditSkill } from './skills/file-edit-skill.js';
9
+ import { WebSurfSkill } from './skills/web-surf-skill.js';
10
+ import { ApiCallSkill } from './skills/api-call-skill.js';
11
+ import { ToolCallSkill } from './skills/tool-call-skill.js';
12
+ import { SchedulerService } from './scheduler.js';
13
+ import { NpmCheckJob } from './npm-check-job.js';
14
+ import { WebUIService } from './web-ui.js';
15
+ import { EventEmitter } from 'eventemitter3';
16
+ async function main() {
17
+ const config = loadConfig();
18
+ // Warn but don't fail if Telegram not configured
19
+ if (!config.telegram?.botToken) {
20
+ console.warn('Warning: Telegram bot token not configured.');
21
+ console.warn('Please run "npm run setup" first.');
22
+ }
23
+ const eventEmitter = new EventEmitter();
24
+ // Create provider based on config (may be null if not configured)
25
+ let provider = null;
26
+ let providerError = null;
27
+ if (config.provider === 'opencode') {
28
+ if (!config.opencode?.apiKey) {
29
+ providerError = 'OpenCode API key not configured. Please run "npm run setup" first.';
30
+ console.warn(`Warning: ${providerError}`);
31
+ }
32
+ else {
33
+ provider = new OpenCodeProvider({ name: 'opencode-provider', ...config.opencode }, eventEmitter);
34
+ }
35
+ }
36
+ else if (config.provider === 'minimax') {
37
+ if (!config.minimax?.apiKey) {
38
+ providerError = 'MiniMax API key not configured. Please run "npm run setup" first.';
39
+ console.warn(`Warning: ${providerError}`);
40
+ }
41
+ else {
42
+ provider = new MiniMaxProvider({ name: 'minimax-provider', ...config.minimax }, eventEmitter);
43
+ }
44
+ }
45
+ else {
46
+ providerError = `Unknown provider: ${config.provider}`;
47
+ console.warn(`Warning: ${providerError}`);
48
+ }
49
+ // Create agent
50
+ const agent = new Agent({ name: 'agent' }, eventEmitter);
51
+ agent.setProvider(provider);
52
+ // Register built-in skills
53
+ const fileEditSkill = new FileEditSkill();
54
+ const webSurfSkill = new WebSurfSkill();
55
+ const apiCallSkill = new ApiCallSkill();
56
+ const toolCallSkill = new ToolCallSkill();
57
+ agent.registerSkill(fileEditSkill);
58
+ agent.registerSkill(webSurfSkill);
59
+ agent.registerSkill(apiCallSkill);
60
+ agent.registerSkill(toolCallSkill);
61
+ // Create scheduler
62
+ const scheduler = new SchedulerService({ name: 'scheduler' }, eventEmitter);
63
+ // Set up auto-update if enabled
64
+ if (config.autoUpdate?.enabled) {
65
+ const npmCheckJob = new NpmCheckJob(eventEmitter, {
66
+ packageName: config.autoUpdate.packageName,
67
+ autoRestart: config.autoUpdate.autoRestart,
68
+ });
69
+ scheduler.addJob('npm-check', config.autoUpdate.schedule, () => npmCheckJob.run());
70
+ console.log(`[AutoUpdate] Enabled - checking ${config.autoUpdate.packageName} on ${config.autoUpdate.schedule}`);
71
+ }
72
+ // Create Telegram adapter (only if token is configured)
73
+ let telegramAdapter = null;
74
+ if (config.telegram?.botToken) {
75
+ telegramAdapter = new TelegramAdapter({ name: 'telegram-adapter', botToken: config.telegram.botToken }, eventEmitter);
76
+ // Wire up message handler
77
+ telegramAdapter.setMessageHandler(async (msg) => {
78
+ // Check for provider error
79
+ if (providerError) {
80
+ return `⚠️ ${providerError}`;
81
+ }
82
+ if (!provider) {
83
+ return '⚠️ No LLM provider configured. Please run "npm run setup" first.';
84
+ }
85
+ try {
86
+ const response = await agent.processMessage(msg.chatId, msg.text);
87
+ return response;
88
+ }
89
+ catch (error) {
90
+ console.error('Error processing message:', error);
91
+ return `⚠️ Error: ${error instanceof Error ? error.message : 'Unknown error'}`;
92
+ }
93
+ });
94
+ }
95
+ // Create Web UI
96
+ const webUI = new WebUIService({ name: 'web-ui', port: 3000 }, eventEmitter);
97
+ webUI.setAgent(agent);
98
+ webUI.setScheduler(scheduler);
99
+ // Wire scheduler events to agent
100
+ eventEmitter.on('job:action', async ({ job, message }) => {
101
+ console.log(`[Scheduler] Running job: ${job.name}`);
102
+ // For now, just log - in a real implementation, this could send a message via Telegram
103
+ console.log(`[Scheduler] Would send: ${message}`);
104
+ });
105
+ // Create application
106
+ const app = new Application();
107
+ if (provider) {
108
+ app.registerService(provider);
109
+ }
110
+ app.registerService(agent);
111
+ if (telegramAdapter) {
112
+ app.registerService(telegramAdapter);
113
+ }
114
+ app.registerService(scheduler);
115
+ app.registerService(webUI);
116
+ // Initialize and start
117
+ await app.initialize();
118
+ await app.start();
119
+ // Handle shutdown
120
+ const shutdown = async () => {
121
+ console.log('\nShutting down...');
122
+ await app.stop();
123
+ process.exit(0);
124
+ };
125
+ process.on('SIGINT', shutdown);
126
+ process.on('SIGTERM', shutdown);
127
+ }
128
+ main().catch((error) => {
129
+ console.error('Fatal error:', error);
130
+ process.exit(1);
131
+ });
132
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,iDAAiD;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IAExC,kEAAkE;IAClE,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,aAAa,GAAkB,IAAI,CAAC;IAExC,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC7B,aAAa,GAAG,oEAAoE,CAAC;YACrF,OAAO,CAAC,IAAI,CAAC,YAAY,aAAa,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,IAAI,gBAAgB,CAC7B,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,EACjD,YAAY,CACb,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,aAAa,GAAG,mEAAmE,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,YAAY,aAAa,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,IAAI,eAAe,CAC5B,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,EAC/C,YAAY,CACb,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,YAAY,aAAa,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,eAAe;IACf,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;IACzD,KAAK,CAAC,WAAW,CAAC,QAAe,CAAC,CAAC;IAEnC,2BAA2B;IAC3B,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAE1C,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IACnC,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAClC,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAClC,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAEnC,mBAAmB;IACnB,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;IAE5E,gCAAgC;IAChC,IAAI,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,YAAiC,EAAE;YACrE,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW;YAC1C,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW;SAC3C,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CACd,WAAW,EACX,MAAM,CAAC,UAAU,CAAC,QAAQ,EAC1B,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CACxB,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,UAAU,CAAC,WAAW,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnH,CAAC;IAED,wDAAwD;IACxD,IAAI,eAAe,GAA2B,IAAI,CAAC;IACnD,IAAI,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC9B,eAAe,GAAG,IAAI,eAAe,CACnC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAChE,YAAY,CACb,CAAC;QAEF,0BAA0B;QAC1B,eAAe,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAoB,EAAmB,EAAE;YAChF,2BAA2B;YAC3B,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,MAAM,aAAa,EAAE,CAAC;YAC/B,CAAC;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,kEAAkE,CAAC;YAC5E,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClE,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;gBAClD,OAAO,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;YACjF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;IAC7E,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtB,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAE9B,iCAAiC;IACjC,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAiC,EAAE,EAAE;QACtF,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,uFAAuF;QACvF,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IACD,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,eAAe,EAAE,CAAC;QACpB,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IACD,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/B,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE3B,uBAAuB;IACvB,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;IACvB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAElB,kBAAkB;IAClB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { Service, type ServiceConfig } from './service.js';
2
+ import { EventEmitter } from 'eventemitter3';
3
+ export interface MiniMaxProviderConfig extends ServiceConfig {
4
+ apiKey: string;
5
+ model?: string;
6
+ }
7
+ export interface ChatMessage {
8
+ role: 'system' | 'user' | 'assistant';
9
+ content: string;
10
+ }
11
+ export interface ChatCompletionOptions {
12
+ messages: ChatMessage[];
13
+ model?: string;
14
+ temperature?: number;
15
+ maxTokens?: number;
16
+ stream?: boolean;
17
+ }
18
+ export interface LLMProvider {
19
+ chatCompletion(options: ChatCompletionOptions): Promise<string>;
20
+ chatCompletionStream(options: ChatCompletionOptions): AsyncIterable<string>;
21
+ }
22
+ export declare class MiniMaxProvider extends Service implements LLMProvider {
23
+ private apiKey;
24
+ private model;
25
+ private baseUrl;
26
+ constructor(config: MiniMaxProviderConfig, eventEmitter?: EventEmitter);
27
+ initialize(): Promise<void>;
28
+ start(): Promise<void>;
29
+ stop(): Promise<void>;
30
+ chatCompletion(options: ChatCompletionOptions): Promise<string>;
31
+ chatCompletionStream(options: ChatCompletionOptions): AsyncIterable<string>;
32
+ }
33
+ //# sourceMappingURL=minimax-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax-provider.d.ts","sourceRoot":"","sources":["../src/minimax-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;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;AA+BD,qBAAa,eAAgB,SAAQ,OAAQ,YAAW,WAAW;IACjE,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,OAAO,CAAyC;gBAE5C,MAAM,EAAE,qBAAqB,EAAE,YAAY,CAAC,EAAE,YAAY;IAIhE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B9D,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,MAAM,CAAC;CA4DnF"}
@@ -0,0 +1,104 @@
1
+ import { Service } from './service.js';
2
+ import { loadConfig } from './config.js';
3
+ export class MiniMaxProvider extends Service {
4
+ apiKey = '';
5
+ model = 'MiniMax-Text-01';
6
+ baseUrl = 'https://api.minimax.chat/v1';
7
+ constructor(config, eventEmitter) {
8
+ super(config, eventEmitter);
9
+ }
10
+ async initialize() {
11
+ const config = loadConfig();
12
+ if (!config.minimax) {
13
+ throw new Error('MiniMax provider not configured');
14
+ }
15
+ this.apiKey = config.minimax.apiKey;
16
+ this.model = config.minimax.model || 'MiniMax-Text-01';
17
+ console.log(`MiniMax provider initialized with model: ${this.model}`);
18
+ }
19
+ async start() {
20
+ console.log('MiniMax provider started');
21
+ }
22
+ async stop() {
23
+ console.log('MiniMax provider stopped');
24
+ }
25
+ async chatCompletion(options) {
26
+ const request = {
27
+ model: options.model || this.model,
28
+ messages: options.messages,
29
+ temperature: options.temperature ?? 0.7,
30
+ max_tokens: options.maxTokens,
31
+ };
32
+ const response = await fetch(`${this.baseUrl}/text/chatcompletion`, {
33
+ method: 'POST',
34
+ headers: {
35
+ 'Content-Type': 'application/json',
36
+ 'Authorization': `Bearer ${this.apiKey}`,
37
+ },
38
+ body: JSON.stringify(request),
39
+ });
40
+ if (!response.ok) {
41
+ const error = await response.text();
42
+ throw new Error(`MiniMax API error: ${response.status} - ${error}`);
43
+ }
44
+ const data = await response.json();
45
+ return data.choices[0]?.message?.content || '';
46
+ }
47
+ async *chatCompletionStream(options) {
48
+ const request = {
49
+ model: options.model || this.model,
50
+ messages: options.messages,
51
+ temperature: options.temperature ?? 0.7,
52
+ max_tokens: options.maxTokens,
53
+ stream: true,
54
+ };
55
+ const response = await fetch(`${this.baseUrl}/text/chatcompletion`, {
56
+ method: 'POST',
57
+ headers: {
58
+ 'Content-Type': 'application/json',
59
+ 'Authorization': `Bearer ${this.apiKey}`,
60
+ },
61
+ body: JSON.stringify(request),
62
+ });
63
+ if (!response.ok) {
64
+ const error = await response.text();
65
+ throw new Error(`MiniMax API error: ${response.status} - ${error}`);
66
+ }
67
+ if (!response.body) {
68
+ throw new Error('No response body');
69
+ }
70
+ const decoder = new TextDecoder();
71
+ const reader = response.body.getReader();
72
+ try {
73
+ while (true) {
74
+ const { done, value } = await reader.read();
75
+ if (done)
76
+ break;
77
+ const chunk = decoder.decode(value);
78
+ const lines = chunk.split('\n').filter(line => line.trim() !== '');
79
+ for (const line of lines) {
80
+ if (line.startsWith('data: ')) {
81
+ const data = line.slice(6);
82
+ if (data === '[DONE]') {
83
+ return;
84
+ }
85
+ try {
86
+ const parsed = JSON.parse(data);
87
+ const content = parsed.choices?.[0]?.delta?.content || '';
88
+ if (content) {
89
+ yield content;
90
+ }
91
+ }
92
+ catch {
93
+ // Skip invalid JSON
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
99
+ finally {
100
+ reader.releaseLock();
101
+ }
102
+ }
103
+ }
104
+ //# sourceMappingURL=minimax-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax-provider.js","sourceRoot":"","sources":["../src/minimax-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAsB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAuDzC,MAAM,OAAO,eAAgB,SAAQ,OAAO;IAClC,MAAM,GAAW,EAAE,CAAC;IACpB,KAAK,GAAW,iBAAiB,CAAC;IAClC,OAAO,GAAW,6BAA6B,CAAC;IAExD,YAAY,MAA6B,EAAE,YAA2B;QACpE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,4CAA4C,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAA8B;QACjD,MAAM,OAAO,GAAmB;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG;YACvC,UAAU,EAAE,OAAO,CAAC,SAAS;SAC9B,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,sBAAsB,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACzC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAqB,CAAC;QACtD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,CAAC,oBAAoB,CAAC,OAA8B;QACxD,MAAM,OAAO,GAAmB;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG;YACvC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,MAAM,EAAE,IAAI;SACb,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,sBAAsB,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACzC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAEzC,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAEnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC3B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACtB,OAAO;wBACT,CAAC;wBACD,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BAChC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;4BAC1D,IAAI,OAAO,EAAE,CAAC;gCACZ,MAAM,OAAO,CAAC;4BAChB,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,oBAAoB;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ export interface NpmCheckJobOptions {
3
+ packageName: string;
4
+ autoRestart: boolean;
5
+ }
6
+ export interface NpmCheckJobEvents {
7
+ 'update:available': {
8
+ currentVersion: string;
9
+ latestVersion: string;
10
+ };
11
+ 'update:complete': {
12
+ version: string;
13
+ };
14
+ 'update:failed': {
15
+ error: string;
16
+ };
17
+ 'check:complete': {
18
+ currentVersion: string;
19
+ latestVersion: string;
20
+ hasUpdate: boolean;
21
+ };
22
+ }
23
+ export declare class NpmCheckJob {
24
+ private eventEmitter;
25
+ private packageName;
26
+ private autoRestart;
27
+ private currentVersion;
28
+ constructor(eventEmitter: EventEmitter<NpmCheckJobEvents>, options: NpmCheckJobOptions);
29
+ getCurrentVersion(): Promise<string>;
30
+ getLocalVersion(): Promise<string>;
31
+ run(): Promise<void>;
32
+ private installUpdate;
33
+ }
34
+ //# sourceMappingURL=npm-check-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-check-job.d.ts","sourceRoot":"","sources":["../src/npm-check-job.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,iBAAiB,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,eAAe,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,gBAAgB,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CACzF;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,cAAc,CAAuB;gBAEjC,YAAY,EAAE,YAAY,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,kBAAkB;IAUhF,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAapC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBlC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAoCZ,aAAa;CAgB5B"}
@@ -0,0 +1,93 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { isNewerVersion } from './version-utils.js';
4
+ const execAsync = promisify(exec);
5
+ export class NpmCheckJob {
6
+ eventEmitter;
7
+ packageName;
8
+ autoRestart;
9
+ currentVersion = null;
10
+ constructor(eventEmitter, options) {
11
+ // Validate package name format
12
+ if (!/^[a-zA-Z0-9@\-_\/]+$/.test(options.packageName)) {
13
+ throw new Error(`Invalid package name: ${options.packageName}`);
14
+ }
15
+ this.eventEmitter = eventEmitter;
16
+ this.packageName = options.packageName;
17
+ this.autoRestart = options.autoRestart;
18
+ }
19
+ async getCurrentVersion() {
20
+ try {
21
+ const { stdout } = await execAsync(`npm view ${this.packageName} version`, {
22
+ encoding: 'utf8',
23
+ timeout: 30000,
24
+ });
25
+ return stdout.trim();
26
+ }
27
+ catch (error) {
28
+ console.error(`Failed to get current version from npm: ${error}`);
29
+ return '0.0.0';
30
+ }
31
+ }
32
+ async getLocalVersion() {
33
+ try {
34
+ // Sanitize packageName to prevent path traversal
35
+ const sanitizedPackageName = this.packageName.replace(/[^a-zA-Z0-9@\-_\/]/g, '').replace('/', '__');
36
+ const packageJsonPath = `./node_modules/${sanitizedPackageName}/package.json`;
37
+ const { readFileSync, existsSync } = await import('fs');
38
+ if (existsSync(packageJsonPath)) {
39
+ const content = readFileSync(packageJsonPath, 'utf8');
40
+ const pkg = JSON.parse(content);
41
+ return pkg.version || '0.0.0';
42
+ }
43
+ }
44
+ catch (error) {
45
+ console.error(`Failed to get local version: ${error}`);
46
+ }
47
+ return '0.0.0';
48
+ }
49
+ async run() {
50
+ console.log(`[NpmCheckJob] Checking for updates...`);
51
+ const [latestVersion, localVersion] = await Promise.all([
52
+ this.getCurrentVersion(),
53
+ this.getLocalVersion(),
54
+ ]);
55
+ this.currentVersion = localVersion;
56
+ console.log(`[NpmCheckJob] Local: ${localVersion}, Latest: ${latestVersion}`);
57
+ const hasUpdate = isNewerVersion(latestVersion, localVersion);
58
+ this.eventEmitter.emit('check:complete', {
59
+ currentVersion: localVersion,
60
+ latestVersion,
61
+ hasUpdate,
62
+ });
63
+ if (hasUpdate) {
64
+ console.log(`[NpmCheckJob] New version available: ${latestVersion}`);
65
+ this.eventEmitter.emit('update:available', {
66
+ currentVersion: localVersion,
67
+ latestVersion,
68
+ });
69
+ try {
70
+ await this.installUpdate(latestVersion);
71
+ this.eventEmitter.emit('update:complete', { version: latestVersion });
72
+ }
73
+ catch (error) {
74
+ const errorMessage = error instanceof Error ? error.message : String(error);
75
+ this.eventEmitter.emit('update:failed', { error: errorMessage });
76
+ }
77
+ }
78
+ }
79
+ async installUpdate(version) {
80
+ console.log(`[NpmCheckJob] Installing update ${version}...`);
81
+ await execAsync(`npm install ${this.packageName}@${version}`, {
82
+ encoding: 'utf8',
83
+ timeout: 30000,
84
+ });
85
+ console.log(`[NpmCheckJob] Update installed successfully`);
86
+ if (this.autoRestart) {
87
+ console.log(`[NpmCheckJob] Auto-restart enabled, exiting for restart...`);
88
+ // Intentional: Exit to allow process manager to restart the application
89
+ process.exit(0);
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=npm-check-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-check-job.js","sourceRoot":"","sources":["../src/npm-check-job.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Service, type ServiceConfig } from './service.js';
2
+ import { EventEmitter } from 'eventemitter3';
3
+ export interface ChatMessage {
4
+ role: 'system' | 'user' | 'assistant';
5
+ content: string;
6
+ }
7
+ export interface ChatCompletionOptions {
8
+ messages: ChatMessage[];
9
+ model?: string;
10
+ temperature?: number;
11
+ maxTokens?: number;
12
+ stream?: boolean;
13
+ }
14
+ export interface LLMProvider {
15
+ chatCompletion(options: ChatCompletionOptions): Promise<string>;
16
+ chatCompletionStream(options: ChatCompletionOptions): AsyncIterable<string>;
17
+ }
18
+ export interface OpenCodeProviderConfig extends ServiceConfig {
19
+ baseUrl: string;
20
+ apiKey: string;
21
+ model?: string;
22
+ }
23
+ export declare class OpenCodeProvider extends Service implements LLMProvider {
24
+ private client;
25
+ private model;
26
+ constructor(config: OpenCodeProviderConfig, eventEmitter?: EventEmitter);
27
+ initialize(): Promise<void>;
28
+ start(): Promise<void>;
29
+ stop(): Promise<void>;
30
+ chatCompletion(options: ChatCompletionOptions): Promise<string>;
31
+ chatCompletionStream(options: ChatCompletionOptions): AsyncIterable<string>;
32
+ }
33
+ //# sourceMappingURL=opencode-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-provider.d.ts","sourceRoot":"","sources":["../src/opencode-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,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,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAiB,SAAQ,OAAQ,YAAW,WAAW;IAClE,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAoB;gBAErB,MAAM,EAAE,sBAAsB,EAAE,YAAY,CAAC,EAAE,YAAY;IAIjE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAe9D,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,MAAM,CAAC;CAoBnF"}
@@ -0,0 +1,68 @@
1
+ import OpenAI from 'openai';
2
+ import { Service } from './service.js';
3
+ import { loadConfig } from './config.js';
4
+ export class OpenCodeProvider extends Service {
5
+ client = null;
6
+ model = 'gpt-4o';
7
+ constructor(config, eventEmitter) {
8
+ super(config, eventEmitter);
9
+ }
10
+ async initialize() {
11
+ const config = loadConfig();
12
+ if (!config.opencode) {
13
+ throw new Error('OpenCode provider not configured');
14
+ }
15
+ this.client = new OpenAI({
16
+ baseURL: config.opencode.baseUrl,
17
+ apiKey: config.opencode.apiKey,
18
+ });
19
+ this.model = config.opencode.model || 'gpt-4o';
20
+ console.log(`OpenCode provider initialized with model: ${this.model}`);
21
+ }
22
+ async start() {
23
+ // Test connection
24
+ if (this.client) {
25
+ try {
26
+ await this.client.models.list();
27
+ console.log('OpenCode provider connection verified');
28
+ }
29
+ catch (error) {
30
+ console.warn('OpenCode provider connection test failed:', error);
31
+ }
32
+ }
33
+ }
34
+ async stop() {
35
+ console.log('OpenCode provider stopped');
36
+ }
37
+ async chatCompletion(options) {
38
+ if (!this.client) {
39
+ throw new Error('OpenCode provider not initialized');
40
+ }
41
+ const response = await this.client.chat.completions.create({
42
+ model: options.model || this.model,
43
+ messages: options.messages,
44
+ temperature: options.temperature ?? 0.7,
45
+ max_tokens: options.maxTokens,
46
+ });
47
+ return response.choices[0]?.message?.content || '';
48
+ }
49
+ async *chatCompletionStream(options) {
50
+ if (!this.client) {
51
+ throw new Error('OpenCode provider not initialized');
52
+ }
53
+ const stream = await this.client.chat.completions.create({
54
+ model: options.model || this.model,
55
+ messages: options.messages,
56
+ temperature: options.temperature ?? 0.7,
57
+ max_tokens: options.maxTokens,
58
+ stream: true,
59
+ });
60
+ for await (const chunk of stream) {
61
+ const content = chunk.choices[0]?.delta?.content || '';
62
+ if (content) {
63
+ yield content;
64
+ }
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=opencode-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-provider.js","sourceRoot":"","sources":["../src/opencode-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { Service, type ServiceConfig } from './service.js';
2
+ import { EventEmitter } from 'eventemitter3';
3
+ export type JobAction = string | (() => Promise<void>);
4
+ export interface Job {
5
+ id: string;
6
+ name: string;
7
+ schedule: string;
8
+ action: JobAction;
9
+ enabled: boolean;
10
+ lastRun?: Date;
11
+ nextRun?: Date;
12
+ createdAt: Date;
13
+ }
14
+ export interface SchedulerConfig extends ServiceConfig {
15
+ maxConcurrentJobs?: number;
16
+ }
17
+ export declare class SchedulerService extends Service {
18
+ private jobs;
19
+ private timers;
20
+ private maxConcurrentJobs;
21
+ private runningJobs;
22
+ constructor(config: SchedulerConfig, eventEmitter?: EventEmitter);
23
+ initialize(): Promise<void>;
24
+ start(): Promise<void>;
25
+ stop(): Promise<void>;
26
+ addJob(name: string, schedule: string, action: JobAction): Job;
27
+ removeJob(id: string): boolean;
28
+ getJob(id: string): Job | undefined;
29
+ getJobs(): Job[];
30
+ enableJob(id: string): boolean;
31
+ disableJob(id: string): boolean;
32
+ private scheduleJob;
33
+ private runJob;
34
+ private calculateNextRun;
35
+ private generateId;
36
+ private isRunning;
37
+ }
38
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAEvD,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,gBAAiB,SAAQ,OAAO;IAC3C,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,WAAW,CAAa;gBAEpB,MAAM,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,YAAY;IAK1D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,GAAG;IAsB9D,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAgB9B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS;IAInC,OAAO,IAAI,GAAG,EAAE;IAIhB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAU9B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAiB/B,OAAO,CAAC,WAAW;IAgCnB,OAAO,CAAC,MAAM;IAkCd,OAAO,CAAC,gBAAgB;IAmDxB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;CAGlB"}