@smilique/said 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +21 -0
- package/README.md +132 -0
- package/dist/agent.d.ts +51 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +139 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +15 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +54 -0
- package/dist/app.js.map +1 -0
- package/dist/config.d.ts +32 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +92 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +132 -0
- package/dist/main.js.map +1 -0
- package/dist/minimax-provider.d.ts +33 -0
- package/dist/minimax-provider.d.ts.map +1 -0
- package/dist/minimax-provider.js +104 -0
- package/dist/minimax-provider.js.map +1 -0
- package/dist/npm-check-job.d.ts +34 -0
- package/dist/npm-check-job.d.ts.map +1 -0
- package/dist/npm-check-job.js +93 -0
- package/dist/npm-check-job.js.map +1 -0
- package/dist/opencode-provider.d.ts +33 -0
- package/dist/opencode-provider.d.ts.map +1 -0
- package/dist/opencode-provider.js +68 -0
- package/dist/opencode-provider.js.map +1 -0
- package/dist/scheduler.d.ts +38 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +204 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/service.d.ts +18 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +25 -0
- package/dist/service.js.map +1 -0
- package/dist/setup.d.ts +3 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +141 -0
- package/dist/setup.js.map +1 -0
- package/dist/skills/api-call-skill.d.ts +49 -0
- package/dist/skills/api-call-skill.d.ts.map +1 -0
- package/dist/skills/api-call-skill.js +140 -0
- package/dist/skills/api-call-skill.js.map +1 -0
- package/dist/skills/file-edit-skill.d.ts +39 -0
- package/dist/skills/file-edit-skill.d.ts.map +1 -0
- package/dist/skills/file-edit-skill.js +181 -0
- package/dist/skills/file-edit-skill.js.map +1 -0
- package/dist/skills/index.d.ts +8 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +7 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/registry.d.ts +13 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +45 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/skill.d.ts +41 -0
- package/dist/skills/skill.d.ts.map +1 -0
- package/dist/skills/skill.js +24 -0
- package/dist/skills/skill.js.map +1 -0
- package/dist/skills/tool-call-skill.d.ts +35 -0
- package/dist/skills/tool-call-skill.d.ts.map +1 -0
- package/dist/skills/tool-call-skill.js +81 -0
- package/dist/skills/tool-call-skill.js.map +1 -0
- package/dist/skills/web-surf-skill.d.ts +34 -0
- package/dist/skills/web-surf-skill.d.ts.map +1 -0
- package/dist/skills/web-surf-skill.js +206 -0
- package/dist/skills/web-surf-skill.js.map +1 -0
- package/dist/telegram-adapter.d.ts +21 -0
- package/dist/telegram-adapter.d.ts.map +1 -0
- package/dist/telegram-adapter.js +63 -0
- package/dist/telegram-adapter.js.map +1 -0
- package/dist/version-utils.d.ts +10 -0
- package/dist/version-utils.d.ts.map +1 -0
- package/dist/version-utils.js +24 -0
- package/dist/version-utils.js.map +1 -0
- package/dist/web-ui.d.ts +24 -0
- package/dist/web-ui.d.ts.map +1 -0
- package/dist/web-ui.js +303 -0
- package/dist/web-ui.js.map +1 -0
- package/package.json +41 -0
|
@@ -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(/ /gi, ' ')
|
|
195
|
+
.replace(/&/gi, '&')
|
|
196
|
+
.replace(/</gi, '<')
|
|
197
|
+
.replace(/>/gi, '>')
|
|
198
|
+
.replace(/"/gi, '"')
|
|
199
|
+
.replace(/'/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"}
|
package/dist/web-ui.d.ts
ADDED
|
@@ -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"}
|