@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,206 @@
1
+ import { BaseSkill } from './skill.js';
2
+ export class WebSurfSkill extends BaseSkill {
3
+ name = 'web-surf';
4
+ description = 'Fetch and extract content from URLs, web pages, and perform web searches';
5
+ version = '1.0.0';
6
+ parameters = [
7
+ {
8
+ name: 'action',
9
+ description: 'The action to perform',
10
+ type: 'string',
11
+ required: true,
12
+ schema: {
13
+ enum: ['fetch', 'search', 'scrape']
14
+ }
15
+ },
16
+ {
17
+ name: 'url',
18
+ description: 'URL to fetch or scrape',
19
+ type: 'string',
20
+ required: false
21
+ },
22
+ {
23
+ name: 'query',
24
+ description: 'Search query (for search action)',
25
+ type: 'string',
26
+ required: false
27
+ },
28
+ {
29
+ name: 'options',
30
+ description: 'Additional options for scraping',
31
+ type: 'object',
32
+ required: false
33
+ }
34
+ ];
35
+ async execute(params) {
36
+ const { action, url, query, options = {} } = params;
37
+ try {
38
+ switch (action) {
39
+ case 'fetch':
40
+ if (!url) {
41
+ return { success: false, error: 'URL is required for fetch action' };
42
+ }
43
+ return await this.fetchUrl(url, options);
44
+ case 'search':
45
+ if (!query) {
46
+ return { success: false, error: 'Query is required for search action' };
47
+ }
48
+ return await this.searchWeb(query, options);
49
+ case 'scrape':
50
+ if (!url) {
51
+ return { success: false, error: 'URL is required for scrape action' };
52
+ }
53
+ return await this.scrapeUrl(url, options);
54
+ default:
55
+ return { success: false, error: `Unknown action: ${action}` };
56
+ }
57
+ }
58
+ catch (error) {
59
+ return {
60
+ success: false,
61
+ error: error instanceof Error ? error.message : String(error)
62
+ };
63
+ }
64
+ }
65
+ async fetchUrl(url, options) {
66
+ const timeout = options.timeout || 30000;
67
+ const headers = options.headers || {};
68
+ const controller = new AbortController();
69
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
70
+ try {
71
+ const response = await fetch(url, {
72
+ method: 'GET',
73
+ headers: {
74
+ 'User-Agent': 'sAId-Bot/1.0',
75
+ ...headers
76
+ },
77
+ signal: controller.signal
78
+ });
79
+ clearTimeout(timeoutId);
80
+ if (!response.ok) {
81
+ return {
82
+ success: false,
83
+ error: `HTTP ${response.status}: ${response.statusText}`
84
+ };
85
+ }
86
+ const contentType = response.headers.get('content-type') || '';
87
+ const isHtml = contentType.includes('text/html');
88
+ if (isHtml && options.extract !== false) {
89
+ // For HTML, extract just the text content
90
+ const html = await response.text();
91
+ const text = this.extractTextFromHtml(html);
92
+ return {
93
+ success: true,
94
+ data: {
95
+ url,
96
+ content: text,
97
+ title: this.extractTitle(html),
98
+ length: text.length
99
+ },
100
+ metadata: {
101
+ contentType,
102
+ status: response.status
103
+ }
104
+ };
105
+ }
106
+ const content = await response.text();
107
+ return {
108
+ success: true,
109
+ data: {
110
+ url,
111
+ content,
112
+ length: content.length
113
+ },
114
+ metadata: {
115
+ contentType,
116
+ status: response.status
117
+ }
118
+ };
119
+ }
120
+ catch (error) {
121
+ clearTimeout(timeoutId);
122
+ throw error;
123
+ }
124
+ }
125
+ async searchWeb(query, options) {
126
+ // Using a simple search API - in production you'd use a real search service
127
+ const limit = options.limit || 10;
128
+ // For now, return a message that search requires configuration
129
+ return {
130
+ success: true,
131
+ data: {
132
+ query,
133
+ results: [],
134
+ message: 'Web search requires a search API key. Configure in options.'
135
+ }
136
+ };
137
+ }
138
+ async scrapeUrl(url, options) {
139
+ // Use Firecrawl if available, otherwise fall back to basic fetch
140
+ try {
141
+ // Try to use Firecrawl if API key is available
142
+ const apiKey = options.apiKey || process.env.FIRECRAWL_API_KEY;
143
+ if (apiKey) {
144
+ const response = await fetch('https://api.firecrawl.dev/v1/scrape', {
145
+ method: 'POST',
146
+ headers: {
147
+ 'Content-Type': 'application/json',
148
+ 'Authorization': `Bearer ${apiKey}`
149
+ },
150
+ body: JSON.stringify({
151
+ url,
152
+ formats: ['markdown', 'html', 'text']
153
+ })
154
+ });
155
+ if (response.ok) {
156
+ const data = await response.json();
157
+ return {
158
+ success: true,
159
+ data: {
160
+ url,
161
+ content: data.data?.markdown || data.data?.text || data.data?.html,
162
+ title: data.data?.metadata?.title,
163
+ length: data.data?.markdown?.length || 0
164
+ }
165
+ };
166
+ }
167
+ }
168
+ }
169
+ catch {
170
+ // Fall back to basic fetch
171
+ }
172
+ // Fallback to basic HTML extraction
173
+ return this.fetchUrl(url, { ...options, extract: true });
174
+ }
175
+ extractTitle(html) {
176
+ const match = html.match(/<title[^>]*>([^<]+)<\/title>/i);
177
+ return match ? match[1].trim() : '';
178
+ }
179
+ extractTextFromHtml(html) {
180
+ // Remove script and style elements
181
+ let text = html
182
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
183
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
184
+ .replace(/<noscript[^>]*>[\s\S]*?<\/noscript>/gi, '')
185
+ .replace(/<!--[\s\S]*?-->/g, '');
186
+ // Replace block elements with newlines
187
+ text = text
188
+ .replace(/<\/(p|div|h[1-6]|li|tr|br)[^>]*>/gi, '\n')
189
+ .replace(/<br[^>]*>/gi, '\n');
190
+ // Remove all remaining HTML tags
191
+ text = text.replace(/<[^>]+>/g, '');
192
+ // Decode HTML entities
193
+ text = text
194
+ .replace(/&nbsp;/gi, ' ')
195
+ .replace(/&amp;/gi, '&')
196
+ .replace(/&lt;/gi, '<')
197
+ .replace(/&gt;/gi, '>')
198
+ .replace(/&quot;/gi, '"')
199
+ .replace(/&#39;/gi, "'");
200
+ // Clean up whitespace
201
+ text = text.replace(/[ \t]+/g, ' ');
202
+ text = text.replace(/\n\s*\n/g, '\n\n');
203
+ return text.trim();
204
+ }
205
+ }
206
+ //# sourceMappingURL=web-surf-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-surf-skill.js","sourceRoot":"","sources":["../../src/skills/web-surf-skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Service, type ServiceConfig } from './service.js';
2
+ import { EventEmitter } from 'eventemitter3';
3
+ export interface TelegramMessage {
4
+ chatId: number;
5
+ text: string;
6
+ messageId?: number;
7
+ }
8
+ export interface TelegramAdapterConfig extends ServiceConfig {
9
+ botToken: string;
10
+ }
11
+ export declare class TelegramAdapter extends Service {
12
+ private bot;
13
+ private messageHandler;
14
+ constructor(config: TelegramAdapterConfig, eventEmitter?: EventEmitter);
15
+ setMessageHandler(handler: (msg: TelegramMessage) => Promise<string>): void;
16
+ initialize(): Promise<void>;
17
+ start(): Promise<void>;
18
+ stop(): Promise<void>;
19
+ sendMessage(chatId: number, text: string): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=telegram-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-adapter.d.ts","sourceRoot":"","sources":["../src/telegram-adapter.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,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAgB,SAAQ,OAAO;IAC1C,OAAO,CAAC,GAAG,CAAoB;IAC/B,OAAO,CAAC,cAAc,CAA4D;gBAEtE,MAAM,EAAE,qBAAqB,EAAE,YAAY,CAAC,EAAE,YAAY;IAItE,iBAAiB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IAIrE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAM/D"}
@@ -0,0 +1,63 @@
1
+ import { Bot } from 'grammy';
2
+ import { Service } from './service.js';
3
+ import { loadConfig } from './config.js';
4
+ export class TelegramAdapter extends Service {
5
+ bot = null;
6
+ messageHandler = null;
7
+ constructor(config, eventEmitter) {
8
+ super(config, eventEmitter);
9
+ }
10
+ setMessageHandler(handler) {
11
+ this.messageHandler = handler;
12
+ }
13
+ async initialize() {
14
+ const config = loadConfig();
15
+ if (!config.telegram?.botToken) {
16
+ throw new Error('Telegram bot token not configured');
17
+ }
18
+ this.bot = new Bot(config.telegram.botToken);
19
+ console.log('Telegram adapter initialized');
20
+ }
21
+ async start() {
22
+ if (!this.bot) {
23
+ throw new Error('Telegram adapter not initialized');
24
+ }
25
+ // Set up message handler
26
+ this.bot.on('message:text', async (ctx) => {
27
+ const chatId = ctx.message?.chat.id;
28
+ const text = ctx.message?.text;
29
+ if (!chatId || !text)
30
+ return;
31
+ console.log(`Received message from ${chatId}: ${text}`);
32
+ // Emit message event for other services
33
+ this.emit('message', { chatId, text, messageId: ctx.message.message_id });
34
+ // If there's a message handler, process and respond
35
+ if (this.messageHandler) {
36
+ try {
37
+ const response = await this.messageHandler({ chatId, text, messageId: ctx.message.message_id });
38
+ await ctx.api.sendMessage(chatId, response, { parse_mode: 'Markdown' });
39
+ }
40
+ catch (error) {
41
+ console.error('Error processing message:', error);
42
+ await ctx.api.sendMessage(chatId, 'Sorry, an error occurred processing your message.');
43
+ }
44
+ }
45
+ });
46
+ // Start polling in non-blocking mode
47
+ this.bot.start();
48
+ console.log('Telegram bot started');
49
+ }
50
+ async stop() {
51
+ if (this.bot) {
52
+ await this.bot.stop();
53
+ console.log('Telegram bot stopped');
54
+ }
55
+ }
56
+ async sendMessage(chatId, text) {
57
+ if (!this.bot) {
58
+ throw new Error('Telegram bot not initialized');
59
+ }
60
+ await this.bot.api.sendMessage(chatId, text, { parse_mode: 'Markdown' });
61
+ }
62
+ }
63
+ //# sourceMappingURL=telegram-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-adapter.js","sourceRoot":"","sources":["../src/telegram-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Compare two semantic version strings.
3
+ * Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal
4
+ */
5
+ export declare function compareVersions(v1: string, v2: string): number;
6
+ /**
7
+ * Check if version1 is greater than version2
8
+ */
9
+ export declare function isNewerVersion(version1: string, version2: string): boolean;
10
+ //# sourceMappingURL=version-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-utils.d.ts","sourceRoot":"","sources":["../src/version-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAW9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Compare two semantic version strings.
3
+ * Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal
4
+ */
5
+ export function compareVersions(v1, v2) {
6
+ const parts1 = v1.replace(/^v/, '').split('.').map(Number);
7
+ const parts2 = v2.replace(/^v/, '').split('.').map(Number);
8
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
9
+ const p1 = parts1[i] || 0;
10
+ const p2 = parts2[i] || 0;
11
+ if (p1 > p2)
12
+ return 1;
13
+ if (p1 < p2)
14
+ return -1;
15
+ }
16
+ return 0;
17
+ }
18
+ /**
19
+ * Check if version1 is greater than version2
20
+ */
21
+ export function isNewerVersion(version1, version2) {
22
+ return compareVersions(version1, version2) > 0;
23
+ }
24
+ //# sourceMappingURL=version-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-utils.js","sourceRoot":"","sources":["../src/version-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU,EAAE,EAAU;IACpD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC;QACtB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,QAAgB;IAC/D,OAAO,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Service, type ServiceConfig } from './service.js';
2
+ import { EventEmitter } from 'eventemitter3';
3
+ export interface WebUIConfig extends ServiceConfig {
4
+ port?: number;
5
+ host?: string;
6
+ }
7
+ export declare class WebUIService extends Service {
8
+ private app;
9
+ private port;
10
+ private host;
11
+ private server;
12
+ private agent;
13
+ private scheduler;
14
+ constructor(config: WebUIConfig, eventEmitter?: EventEmitter);
15
+ setAgent(agent: any): void;
16
+ setScheduler(scheduler: any): void;
17
+ private setupMiddleware;
18
+ private setupRoutes;
19
+ private getDashboardHTML;
20
+ initialize(): Promise<void>;
21
+ start(): Promise<void>;
22
+ stop(): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=web-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-ui.d.ts","sourceRoot":"","sources":["../src/web-ui.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,WAAY,SAAQ,aAAa;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,YAAa,SAAQ,OAAO;IACvC,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,SAAS,CAAa;gBAElB,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,YAAY;IAU5D,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAI1B,YAAY,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI;IAIlC,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,WAAW;IA0FnB,OAAO,CAAC,gBAAgB;IAwKlB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAY5B"}