@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
@@ -0,0 +1,204 @@
1
+ import { Service } from './service.js';
2
+ export class SchedulerService extends Service {
3
+ jobs = new Map();
4
+ timers = new Map();
5
+ maxConcurrentJobs;
6
+ runningJobs = 0;
7
+ constructor(config, eventEmitter) {
8
+ super(config, eventEmitter);
9
+ this.maxConcurrentJobs = config.maxConcurrentJobs || 5;
10
+ }
11
+ async initialize() {
12
+ console.log('Scheduler service initialized');
13
+ }
14
+ async start() {
15
+ console.log('Scheduler service started');
16
+ // Schedule all enabled jobs
17
+ for (const [id, job] of this.jobs.entries()) {
18
+ if (job.enabled) {
19
+ this.scheduleJob(id);
20
+ }
21
+ }
22
+ }
23
+ async stop() {
24
+ // Clear all timers
25
+ for (const timer of this.timers.values()) {
26
+ clearTimeout(timer);
27
+ }
28
+ this.timers.clear();
29
+ console.log('Scheduler service stopped');
30
+ }
31
+ addJob(name, schedule, action) {
32
+ const id = this.generateId();
33
+ const job = {
34
+ id,
35
+ name,
36
+ schedule,
37
+ action,
38
+ enabled: true,
39
+ createdAt: new Date(),
40
+ };
41
+ this.jobs.set(id, job);
42
+ // Schedule if running
43
+ if (this.isRunning()) {
44
+ this.scheduleJob(id);
45
+ }
46
+ this.emit('job:added', job);
47
+ return job;
48
+ }
49
+ removeJob(id) {
50
+ const job = this.jobs.get(id);
51
+ if (!job)
52
+ return false;
53
+ // Clear timer
54
+ const timer = this.timers.get(id);
55
+ if (timer) {
56
+ clearTimeout(timer);
57
+ this.timers.delete(id);
58
+ }
59
+ this.jobs.delete(id);
60
+ this.emit('job:removed', job);
61
+ return true;
62
+ }
63
+ getJob(id) {
64
+ return this.jobs.get(id);
65
+ }
66
+ getJobs() {
67
+ return Array.from(this.jobs.values());
68
+ }
69
+ enableJob(id) {
70
+ const job = this.jobs.get(id);
71
+ if (!job)
72
+ return false;
73
+ job.enabled = true;
74
+ this.scheduleJob(id);
75
+ this.emit('job:enabled', job);
76
+ return true;
77
+ }
78
+ disableJob(id) {
79
+ const job = this.jobs.get(id);
80
+ if (!job)
81
+ return false;
82
+ job.enabled = false;
83
+ // Clear timer
84
+ const timer = this.timers.get(id);
85
+ if (timer) {
86
+ clearTimeout(timer);
87
+ this.timers.delete(id);
88
+ }
89
+ this.emit('job:disabled', job);
90
+ return true;
91
+ }
92
+ scheduleJob(id) {
93
+ const job = this.jobs.get(id);
94
+ if (!job || !job.enabled)
95
+ return;
96
+ // Calculate next run time
97
+ const nextRun = this.calculateNextRun(job.schedule);
98
+ if (!nextRun) {
99
+ console.warn(`Invalid cron expression for job ${job.name}: ${job.schedule}`);
100
+ return;
101
+ }
102
+ job.nextRun = nextRun;
103
+ const now = Date.now();
104
+ const delay = nextRun.getTime() - now;
105
+ if (delay <= 0) {
106
+ // Run immediately if due
107
+ this.runJob(id);
108
+ // Reschedule
109
+ this.scheduleJob(id);
110
+ return;
111
+ }
112
+ const timer = setTimeout(() => {
113
+ this.runJob(id);
114
+ this.scheduleJob(id);
115
+ }, delay);
116
+ this.timers.set(id, timer);
117
+ }
118
+ runJob(id) {
119
+ if (this.runningJobs >= this.maxConcurrentJobs) {
120
+ console.warn(`Max concurrent jobs reached, skipping job ${id}`);
121
+ return;
122
+ }
123
+ const job = this.jobs.get(id);
124
+ if (!job || !job.enabled)
125
+ return;
126
+ this.runningJobs++;
127
+ job.lastRun = new Date();
128
+ this.emit('job:start', job);
129
+ try {
130
+ if (typeof job.action === 'string') {
131
+ // It's a message to be processed - emit event for agent to handle
132
+ this.emit('job:action', { job, message: job.action });
133
+ }
134
+ else if (typeof job.action === 'function') {
135
+ // It's a function to execute
136
+ job.action().then(() => {
137
+ this.runningJobs--;
138
+ this.emit('job:complete', job);
139
+ }).catch((error) => {
140
+ this.runningJobs--;
141
+ this.emit('job:error', { job, error });
142
+ });
143
+ }
144
+ }
145
+ catch (error) {
146
+ this.runningJobs--;
147
+ this.emit('job:error', { job, error });
148
+ }
149
+ }
150
+ calculateNextRun(cron) {
151
+ // Simple cron parser - supports basic expressions
152
+ // Format: minute hour day month weekday
153
+ const parts = cron.trim().split(/\s+/);
154
+ if (parts.length < 5) {
155
+ return null;
156
+ }
157
+ const now = new Date();
158
+ const [minute, hour, day, month, weekday] = parts;
159
+ // For simplicity, we'll just do basic calculation
160
+ // In production, use a proper cron library like cron-parser
161
+ const next = new Date(now);
162
+ // Handle specific patterns
163
+ if (minute === '*' && hour === '*') {
164
+ // Every minute
165
+ next.setMinutes(next.getMinutes() + 1);
166
+ next.setSeconds(0);
167
+ next.setMilliseconds(0);
168
+ }
169
+ else if (minute === '*') {
170
+ // Every minute of specific hour
171
+ next.setHours(parseInt(hour), 0, 0, 0);
172
+ if (next <= now) {
173
+ next.setDate(next.getDate() + 1);
174
+ }
175
+ }
176
+ else if (hour === '*') {
177
+ // Every hour of specific minute
178
+ next.setMinutes(parseInt(minute), 0, 0);
179
+ if (next <= now) {
180
+ next.setHours(next.getHours() + 1);
181
+ }
182
+ }
183
+ else {
184
+ // Specific time
185
+ const hourNum = parseInt(hour);
186
+ const minuteNum = parseInt(minute);
187
+ if (isNaN(hourNum) || isNaN(minuteNum) || hourNum > 23 || minuteNum > 59) {
188
+ return null;
189
+ }
190
+ next.setHours(hourNum, minuteNum, 0, 0);
191
+ if (next <= now) {
192
+ next.setDate(next.getDate() + 1);
193
+ }
194
+ }
195
+ return next;
196
+ }
197
+ generateId() {
198
+ return `job_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
199
+ }
200
+ isRunning() {
201
+ return true;
202
+ }
203
+ }
204
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ export interface ServiceConfig {
3
+ name: string;
4
+ }
5
+ export declare abstract class Service {
6
+ protected config: ServiceConfig;
7
+ protected eventEmitter: EventEmitter;
8
+ constructor(config: ServiceConfig, eventEmitter?: EventEmitter);
9
+ abstract initialize(): Promise<void>;
10
+ abstract start(): Promise<void>;
11
+ abstract stop(): Promise<void>;
12
+ getName(): string;
13
+ getEventEmitter(): EventEmitter;
14
+ emit(event: string, ...args: any[]): void;
15
+ on(event: string, handler: (...args: any[]) => void): void;
16
+ off(event: string, handler: (...args: any[]) => void): void;
17
+ }
18
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,8BAAsB,OAAO;IAC3B,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC;IAChC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;gBAEzB,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,YAAY;IAK9D,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAC/B,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9B,OAAO,IAAI,MAAM;IAIjB,eAAe,IAAI,YAAY;IAI/B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIzC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI;IAI1D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI;CAG5D"}
@@ -0,0 +1,25 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ export class Service {
3
+ config;
4
+ eventEmitter;
5
+ constructor(config, eventEmitter) {
6
+ this.config = config;
7
+ this.eventEmitter = eventEmitter || new EventEmitter();
8
+ }
9
+ getName() {
10
+ return this.config.name;
11
+ }
12
+ getEventEmitter() {
13
+ return this.eventEmitter;
14
+ }
15
+ emit(event, ...args) {
16
+ this.eventEmitter.emit(event, ...args);
17
+ }
18
+ on(event, handler) {
19
+ this.eventEmitter.on(event, handler);
20
+ }
21
+ off(event, handler) {
22
+ this.eventEmitter.off(event, handler);
23
+ }
24
+ }
25
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAM7C,MAAM,OAAgB,OAAO;IACjB,MAAM,CAAgB;IACtB,YAAY,CAAe;IAErC,YAAY,MAAqB,EAAE,YAA2B;QAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,IAAI,YAAY,EAAE,CAAC;IACzD,CAAC;IAMD,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,GAAG,IAAW;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,EAAE,CAAC,KAAa,EAAE,OAAiC;QACjD,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,OAAiC;QAClD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":""}
package/dist/setup.js ADDED
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env node
2
+ import inquirer from 'inquirer';
3
+ import { existsSync, writeFileSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { loadConfig } from './config.js';
6
+ async function validateTelegramToken(token) {
7
+ // Basic validation - check format
8
+ return /^\d+:[\w-]+$/.test(token);
9
+ }
10
+ async function runSetup() {
11
+ console.log('\n=== sAId Setup ===\n');
12
+ console.log('This will help you configure your Telegram bot and LLM provider.\n');
13
+ const existingConfig = existsSync(join(process.cwd(), '.env')) ? loadConfig() : null;
14
+ const answers = await inquirer.prompt([
15
+ {
16
+ type: 'input',
17
+ name: 'telegramBotToken',
18
+ message: 'Enter your Telegram Bot Token (from @BotFather):',
19
+ default: existingConfig?.telegram?.botToken || '',
20
+ validate: async (input) => {
21
+ if (!input.trim()) {
22
+ return 'Bot token is required';
23
+ }
24
+ if (!/^\d+:[\w-]+$/.test(input)) {
25
+ return 'Invalid token format. Should be like: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz';
26
+ }
27
+ return true;
28
+ },
29
+ },
30
+ {
31
+ type: 'list',
32
+ name: 'provider',
33
+ message: 'Select LLM Provider:',
34
+ choices: [
35
+ { name: 'OpenCode (OpenAI-compatible)', value: 'opencode' },
36
+ { name: 'MiniMax', value: 'minimax' },
37
+ ],
38
+ default: existingConfig?.provider || 'opencode',
39
+ },
40
+ {
41
+ type: 'input',
42
+ name: 'opencodeBaseUrl',
43
+ message: 'OpenCode API Base URL:',
44
+ default: existingConfig?.opencode?.baseUrl || 'https://opencode.ai/v1',
45
+ when: (answers) => answers.provider === 'opencode',
46
+ },
47
+ {
48
+ type: 'password',
49
+ name: 'opencodeApiKey',
50
+ message: 'OpenCode API Key:',
51
+ when: (answers) => answers.provider === 'opencode',
52
+ default: existingConfig?.opencode?.apiKey || '',
53
+ },
54
+ {
55
+ type: 'input',
56
+ name: 'opencodeModel',
57
+ message: 'OpenCode Model (optional):',
58
+ default: existingConfig?.opencode?.model || 'gpt-4o',
59
+ when: (answers) => answers.provider === 'opencode',
60
+ },
61
+ {
62
+ type: 'password',
63
+ name: 'minimaxApiKey',
64
+ message: 'MiniMax API Key:',
65
+ when: (answers) => answers.provider === 'minimax',
66
+ default: existingConfig?.minimax?.apiKey || '',
67
+ },
68
+ {
69
+ type: 'input',
70
+ name: 'minimaxModel',
71
+ message: 'MiniMax Model (optional):',
72
+ default: existingConfig?.minimax?.model || 'MiniMax-Text-01',
73
+ when: (answers) => answers.provider === 'minimax',
74
+ },
75
+ {
76
+ type: 'confirm',
77
+ name: 'enableAutolaunch',
78
+ message: 'Enable systemd autolaunch?',
79
+ default: false,
80
+ },
81
+ {
82
+ type: 'input',
83
+ name: 'systemdUser',
84
+ message: 'Systemd service user (e.g., ubuntu):',
85
+ default: 'ubuntu',
86
+ when: (answers) => answers.enableAutolaunch,
87
+ },
88
+ ]);
89
+ // Build config content
90
+ const lines = [
91
+ `TELEGRAM_BOT_TOKEN=${answers.telegramBotToken}`,
92
+ `SAID_PROVIDER=${answers.provider}`,
93
+ ];
94
+ if (answers.provider === 'opencode') {
95
+ lines.push(`OPENCODE_BASE_URL=${answers.opencodeBaseUrl}`);
96
+ lines.push(`OPENCODE_API_KEY=${answers.opencodeApiKey}`);
97
+ if (answers.opencodeModel && answers.opencodeModel !== 'gpt-4o') {
98
+ lines.push(`OPENCODE_MODEL=${answers.opencodeModel}`);
99
+ }
100
+ }
101
+ else if (answers.provider === 'minimax') {
102
+ lines.push(`MINIMAX_API_KEY=${answers.minimaxApiKey}`);
103
+ if (answers.minimaxModel && answers.minimaxModel !== 'MiniMax-Text-01') {
104
+ lines.push(`MINIMAX_MODEL=${answers.minimaxModel}`);
105
+ }
106
+ }
107
+ // Save .env file
108
+ const envPath = join(process.cwd(), '.env');
109
+ writeFileSync(envPath, lines.join('\n') + '\n', 'utf-8');
110
+ console.log('\n✓ Configuration saved to .env\n');
111
+ // Generate systemd service file if requested
112
+ if (answers.enableAutolaunch) {
113
+ const serviceContent = `[Unit]
114
+ Description=sAId Telegram Bot
115
+ After=network.target
116
+
117
+ [Service]
118
+ Type=simple
119
+ User=${answers.systemdUser}
120
+ WorkingDirectory=${process.cwd()}
121
+ ExecStart=/usr/bin/npx said start
122
+ Restart=on-failure
123
+
124
+ [Install]
125
+ WantedBy=multi-user.target
126
+ `;
127
+ const servicePath = join(process.cwd(), 'said.service');
128
+ writeFileSync(servicePath, serviceContent, 'utf-8');
129
+ console.log('✓ Systemd service file created at said.service\n');
130
+ console.log('To enable autolaunch, run:');
131
+ console.log(` sudo cp said.service /etc/systemd/system/`);
132
+ console.log(' sudo systemctl daemon-reload');
133
+ console.log(' sudo systemctl enable said');
134
+ console.log(' sudo systemctl start said\n');
135
+ }
136
+ console.log('=== Setup Complete ===\n');
137
+ console.log('Run "npm start" to start the bot.\n');
138
+ }
139
+ // Run if executed directly
140
+ runSetup().catch(console.error);
141
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { BaseSkill, type SkillResult } from './skill.js';
2
+ export interface ApiRequestOptions {
3
+ method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
4
+ url: string;
5
+ headers?: Record<string, string>;
6
+ body?: any;
7
+ timeout?: number;
8
+ }
9
+ export declare class ApiCallSkill extends BaseSkill {
10
+ name: string;
11
+ description: string;
12
+ version: string;
13
+ parameters: ({
14
+ name: string;
15
+ description: string;
16
+ type: "string";
17
+ required: boolean;
18
+ schema: {
19
+ enum: string[];
20
+ };
21
+ default?: undefined;
22
+ } | {
23
+ name: string;
24
+ description: string;
25
+ type: "string";
26
+ required: boolean;
27
+ schema?: undefined;
28
+ default?: undefined;
29
+ } | {
30
+ name: string;
31
+ description: string;
32
+ type: "object";
33
+ required: boolean;
34
+ schema?: undefined;
35
+ default?: undefined;
36
+ } | {
37
+ name: string;
38
+ description: string;
39
+ type: "number";
40
+ required: boolean;
41
+ default: number;
42
+ schema?: undefined;
43
+ })[];
44
+ private allowedDomains;
45
+ private timeout;
46
+ setAllowedDomains(domains: string[]): void;
47
+ execute(params: Record<string, any>): Promise<SkillResult>;
48
+ }
49
+ //# sourceMappingURL=api-call-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-call-skill.d.ts","sourceRoot":"","sources":["../../src/skills/api-call-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAa,SAAQ,SAAS;IACzC,IAAI,SAAc;IAClB,WAAW,SAA8C;IACzD,OAAO,SAAW;IAElB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAmCR;IAEF,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,OAAO,CAAS;IAExB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAIpC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;CAsGjE"}
@@ -0,0 +1,140 @@
1
+ import { BaseSkill } from './skill.js';
2
+ export class ApiCallSkill extends BaseSkill {
3
+ name = 'api-call';
4
+ description = 'Make HTTP API calls to external services';
5
+ version = '1.0.0';
6
+ parameters = [
7
+ {
8
+ name: 'method',
9
+ description: 'HTTP method',
10
+ type: 'string',
11
+ required: true,
12
+ schema: {
13
+ enum: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']
14
+ }
15
+ },
16
+ {
17
+ name: 'url',
18
+ description: 'API endpoint URL',
19
+ type: 'string',
20
+ required: true
21
+ },
22
+ {
23
+ name: 'headers',
24
+ description: 'HTTP headers as key-value pairs',
25
+ type: 'object',
26
+ required: false
27
+ },
28
+ {
29
+ name: 'body',
30
+ description: 'Request body (for POST/PUT/PATCH)',
31
+ type: 'object',
32
+ required: false
33
+ },
34
+ {
35
+ name: 'timeout',
36
+ description: 'Request timeout in milliseconds',
37
+ type: 'number',
38
+ required: false,
39
+ default: 30000
40
+ }
41
+ ];
42
+ allowedDomains = [];
43
+ timeout = 30000;
44
+ setAllowedDomains(domains) {
45
+ this.allowedDomains = domains;
46
+ }
47
+ async execute(params) {
48
+ const { method, url, headers = {}, body, timeout = this.timeout } = params;
49
+ // Validate URL
50
+ if (!url) {
51
+ return { success: false, error: 'URL is required' };
52
+ }
53
+ // Check domain allowlist if configured
54
+ if (this.allowedDomains.length > 0) {
55
+ try {
56
+ const urlObj = new URL(url);
57
+ const isAllowed = this.allowedDomains.some(domain => urlObj.hostname === domain || urlObj.hostname.endsWith(`.${domain}`));
58
+ if (!isAllowed) {
59
+ return {
60
+ success: false,
61
+ error: `Domain "${urlObj.hostname}" is not allowed. Allowed: ${this.allowedDomains.join(', ')}`
62
+ };
63
+ }
64
+ }
65
+ catch {
66
+ return { success: false, error: 'Invalid URL format' };
67
+ }
68
+ }
69
+ try {
70
+ const controller = new AbortController();
71
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
72
+ const requestOptions = {
73
+ method,
74
+ headers: {
75
+ 'User-Agent': 'sAId-Bot/1.0',
76
+ ...headers
77
+ },
78
+ signal: controller.signal
79
+ };
80
+ if (body && ['POST', 'PUT', 'PATCH'].includes(method)) {
81
+ if (typeof body === 'object') {
82
+ requestOptions.body = JSON.stringify(body);
83
+ if (!headers['Content-Type']) {
84
+ requestOptions.headers['Content-Type'] = 'application/json';
85
+ }
86
+ }
87
+ else {
88
+ requestOptions.body = body;
89
+ }
90
+ }
91
+ const response = await fetch(url, requestOptions);
92
+ clearTimeout(timeoutId);
93
+ // Parse response
94
+ const contentType = response.headers.get('content-type') || '';
95
+ let responseData;
96
+ let responseText;
97
+ try {
98
+ responseText = await response.text();
99
+ if (contentType.includes('application/json')) {
100
+ try {
101
+ responseData = JSON.parse(responseText);
102
+ }
103
+ catch {
104
+ responseData = responseText;
105
+ }
106
+ }
107
+ else {
108
+ responseData = responseText;
109
+ }
110
+ }
111
+ catch {
112
+ responseText = '';
113
+ responseData = null;
114
+ }
115
+ const result = {
116
+ success: response.ok,
117
+ data: responseData,
118
+ metadata: {
119
+ status: response.status,
120
+ statusText: response.statusText,
121
+ headers: Object.fromEntries(response.headers.entries())
122
+ }
123
+ };
124
+ if (!response.ok) {
125
+ result.error = `HTTP ${response.status}: ${response.statusText}`;
126
+ }
127
+ return result;
128
+ }
129
+ catch (error) {
130
+ if (error instanceof Error) {
131
+ if (error.name === 'AbortError') {
132
+ return { success: false, error: `Request timed out after ${timeout}ms` };
133
+ }
134
+ return { success: false, error: error.message };
135
+ }
136
+ return { success: false, error: String(error) };
137
+ }
138
+ }
139
+ }
140
+ //# sourceMappingURL=api-call-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-call-skill.js","sourceRoot":"","sources":["../../src/skills/api-call-skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { BaseSkill, type SkillResult } from './skill.js';
2
+ export interface FileOperation {
3
+ action: 'read' | 'write' | 'delete' | 'list' | 'mkdir' | 'stat';
4
+ path: string;
5
+ content?: string;
6
+ }
7
+ export declare class FileEditSkill extends BaseSkill {
8
+ name: string;
9
+ description: string;
10
+ version: string;
11
+ parameters: ({
12
+ name: string;
13
+ description: string;
14
+ type: "string";
15
+ required: boolean;
16
+ schema: {
17
+ enum: string[];
18
+ };
19
+ } | {
20
+ name: string;
21
+ description: string;
22
+ type: "string";
23
+ required: boolean;
24
+ schema?: undefined;
25
+ })[];
26
+ private allowedExtensions;
27
+ private maxFileSize;
28
+ private resolvePath;
29
+ private isPathSafe;
30
+ private isExtensionAllowed;
31
+ execute(params: Record<string, any>): Promise<SkillResult>;
32
+ private readFile;
33
+ private writeFile;
34
+ private deleteFile;
35
+ private listDirectory;
36
+ private makeDirectory;
37
+ private getFileStat;
38
+ }
39
+ //# sourceMappingURL=file-edit-skill.d.ts.map