@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/web-ui.js ADDED
@@ -0,0 +1,303 @@
1
+ import express from 'express';
2
+ import { Service } from './service.js';
3
+ import { loadConfig } from './config.js';
4
+ export class WebUIService extends Service {
5
+ app;
6
+ port;
7
+ host;
8
+ server = null;
9
+ agent = null;
10
+ scheduler = null;
11
+ constructor(config, eventEmitter) {
12
+ super(config, eventEmitter);
13
+ this.app = express();
14
+ this.port = config.port || 3000;
15
+ this.host = config.host || '0.0.0.0';
16
+ this.setupMiddleware();
17
+ this.setupRoutes();
18
+ }
19
+ setAgent(agent) {
20
+ this.agent = agent;
21
+ }
22
+ setScheduler(scheduler) {
23
+ this.scheduler = scheduler;
24
+ }
25
+ setupMiddleware() {
26
+ this.app.use(express.json());
27
+ this.app.use(express.urlencoded({ extended: true }));
28
+ }
29
+ setupRoutes() {
30
+ // Status endpoint
31
+ this.app.get('/api/status', (req, res) => {
32
+ res.json({
33
+ status: 'running',
34
+ uptime: process.uptime(),
35
+ version: '1.0.0'
36
+ });
37
+ });
38
+ // Configuration endpoints
39
+ this.app.get('/api/config', (req, res) => {
40
+ const config = loadConfig();
41
+ // Don't expose sensitive data
42
+ const safeConfig = {
43
+ provider: config.provider,
44
+ telegram: config.telegram ? { configured: true } : undefined,
45
+ opencode: config.opencode ? { baseUrl: config.opencode.baseUrl, model: config.opencode.model } : undefined,
46
+ minimax: config.minimax ? { model: config.minimax.model } : undefined
47
+ };
48
+ res.json(safeConfig);
49
+ });
50
+ // Skills endpoints
51
+ this.app.get('/api/skills', (req, res) => {
52
+ if (!this.agent) {
53
+ return res.status(503).json({ error: 'Agent not available' });
54
+ }
55
+ const skills = this.agent.listSkills();
56
+ res.json(skills.map((skill) => ({
57
+ name: skill.name,
58
+ description: skill.description,
59
+ version: skill.version,
60
+ parameters: skill.parameters
61
+ })));
62
+ });
63
+ this.app.post('/api/skills/:name/enable', (req, res) => {
64
+ if (!this.agent) {
65
+ return res.status(503).json({ error: 'Agent not available' });
66
+ }
67
+ // Skills are always enabled in this implementation
68
+ res.json({ success: true });
69
+ });
70
+ this.app.post('/api/skills/:name/disable', (req, res) => {
71
+ if (!this.agent) {
72
+ return res.status(503).json({ error: 'Agent not available' });
73
+ }
74
+ res.json({ success: true });
75
+ });
76
+ // Jobs endpoints (scheduler)
77
+ this.app.get('/api/jobs', (req, res) => {
78
+ if (!this.scheduler) {
79
+ return res.status(503).json({ error: 'Scheduler not available' });
80
+ }
81
+ res.json(this.scheduler.getJobs());
82
+ });
83
+ this.app.post('/api/jobs', (req, res) => {
84
+ if (!this.scheduler) {
85
+ return res.status(503).json({ error: 'Scheduler not available' });
86
+ }
87
+ const { name, schedule, action } = req.body;
88
+ if (!name || !schedule || !action) {
89
+ return res.status(400).json({ error: 'Missing required fields: name, schedule, action' });
90
+ }
91
+ const job = this.scheduler.addJob(name, schedule, action);
92
+ res.json(job);
93
+ });
94
+ this.app.delete('/api/jobs/:id', (req, res) => {
95
+ if (!this.scheduler) {
96
+ return res.status(503).json({ error: 'Scheduler not available' });
97
+ }
98
+ const deleted = this.scheduler.removeJob(req.params.id);
99
+ if (deleted) {
100
+ res.json({ success: true });
101
+ }
102
+ else {
103
+ res.status(404).json({ error: 'Job not found' });
104
+ }
105
+ });
106
+ // Simple HTML dashboard
107
+ this.app.get('/', (req, res) => {
108
+ res.send(this.getDashboardHTML());
109
+ });
110
+ }
111
+ getDashboardHTML() {
112
+ // Note: In production, use a template engine or React for proper XSS protection
113
+ return `
114
+ <!DOCTYPE html>
115
+ <html lang="en">
116
+ <head>
117
+ <meta charset="UTF-8">
118
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
119
+ <title>sAId Dashboard</title>
120
+ <style>
121
+ * { box-sizing: border-box; margin: 0; padding: 0; }
122
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f5f5f5; }
123
+ .container { max-width: 1200px; margin: 0 auto; padding: 20px; }
124
+ h1 { color: #333; margin-bottom: 20px; }
125
+ h2 { color: #555; margin: 20px 0 10px; }
126
+ h3 { color: #555; margin: 20px 0 10px; }
127
+ .card { background: white; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
128
+ .status { display: inline-block; width: 12px; height: 12px; border-radius: 50%; background: #4caf50; margin-right: 8px; }
129
+ .btn { background: #2196f3; color: white; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; }
130
+ .btn:hover { background: #1976d2; }
131
+ .btn-danger { background: #f44336; }
132
+ .btn-danger:hover { background: #d32f2f; }
133
+ table { width: 100%; border-collapse: collapse; }
134
+ th, td { padding: 12px; text-align: left; border-bottom: 1px solid #eee; }
135
+ th { background: #f9f9f9; }
136
+ .form-group { margin-bottom: 15px; }
137
+ label { display: block; margin-bottom: 5px; color: #555; }
138
+ input, select { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; }
139
+ pre { background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; }
140
+ .empty { color: #999; font-style: italic; }
141
+ </style>
142
+ </head>
143
+ <body>
144
+ <div class="container">
145
+ <h1>sAId Dashboard</h1>
146
+
147
+ <div class="card">
148
+ <h2><span class="status"></span>Status</h2>
149
+ <p id="status">Loading...</p>
150
+ </div>
151
+
152
+ <div class="card">
153
+ <h2>Configuration</h2>
154
+ <div id="config">Loading...</div>
155
+ </div>
156
+
157
+ <div class="card">
158
+ <h2>Skills</h2>
159
+ <table>
160
+ <thead>
161
+ <tr><th>Name</th><th>Description</th><th>Version</th><th>Actions</th></tr>
162
+ </thead>
163
+ <tbody id="skills"></tbody>
164
+ </table>
165
+ </div>
166
+
167
+ <div class="card">
168
+ <h2>Scheduled Jobs</h2>
169
+ <table>
170
+ <thead>
171
+ <tr><th>Name</th><th>Schedule</th><th>Status</th><th>Actions</th></tr>
172
+ </thead>
173
+ <tbody id="jobs"></tbody>
174
+ </table>
175
+ <h3>Add Job</h3>
176
+ <form id="addJobForm">
177
+ <div class="form-group">
178
+ <label>Job Name</label>
179
+ <input type="text" name="name" required>
180
+ </div>
181
+ <div class="form-group">
182
+ <label>Schedule (cron expression)</label>
183
+ <input type="text" name="schedule" placeholder="* * * * *" required>
184
+ </div>
185
+ <div class="form-group">
186
+ <label>Action</label>
187
+ <input type="text" name="action" placeholder="Message to send" required>
188
+ </div>
189
+ <button type="submit" class="btn">Add Job</button>
190
+ </form>
191
+ </div>
192
+ </div>
193
+
194
+ <script>
195
+ function escapeHtml(text) {
196
+ const div = document.createElement('div');
197
+ div.textContent = text;
198
+ return div.innerHTML;
199
+ }
200
+
201
+ async function loadStatus() {
202
+ try {
203
+ const res = await fetch('/api/status');
204
+ const data = await res.json();
205
+ document.getElementById('status').textContent = 'Running | Uptime: ' + Math.floor(data.uptime) + 's';
206
+ } catch (e) {
207
+ document.getElementById('status').textContent = 'Error loading status';
208
+ }
209
+ }
210
+
211
+ async function loadConfig() {
212
+ try {
213
+ const res = await fetch('/api/config');
214
+ const data = await res.json();
215
+ document.getElementById('config').innerHTML = '<pre>' + escapeHtml(JSON.stringify(data, null, 2)) + '</pre>';
216
+ } catch (e) {
217
+ document.getElementById('config').textContent = 'Error loading config';
218
+ }
219
+ }
220
+
221
+ async function loadSkills() {
222
+ try {
223
+ const res = await fetch('/api/skills');
224
+ const skills = await res.json();
225
+ const tbody = document.getElementById('skills');
226
+ if (skills.length === 0) {
227
+ tbody.innerHTML = '<tr><td colspan="4" class="empty">No skills available</td></tr>';
228
+ } else {
229
+ tbody.innerHTML = skills.map(s => '<tr><td>' + escapeHtml(s.name) + '</td><td>' + escapeHtml(s.description) + '</td><td>' + escapeHtml(s.version) + '</td><td><button class="btn" onclick="alert(\\'Configuration coming soon\\')">Configure</button></td></tr>').join('');
230
+ }
231
+ } catch (e) {
232
+ document.getElementById('skills').innerHTML = '<tr><td colspan="4" class="empty">Error loading skills</td></tr>';
233
+ }
234
+ }
235
+
236
+ async function loadJobs() {
237
+ try {
238
+ const res = await fetch('/api/jobs');
239
+ const jobs = await res.json();
240
+ const tbody = document.getElementById('jobs');
241
+ if (!jobs || jobs.length === 0) {
242
+ tbody.innerHTML = '<tr><td colspan="4" class="empty">No jobs scheduled</td></tr>';
243
+ } else {
244
+ tbody.innerHTML = jobs.map(j => '<tr><td>' + escapeHtml(j.name) + '</td><td>' + escapeHtml(j.schedule) + '</td><td>' + (j.enabled ? 'Active' : 'Paused') + '</td><td><button class="btn btn-danger" onclick="deleteJob(\\'' + j.id + '\\')">Delete</button></td></tr>').join('');
245
+ }
246
+ } catch (e) {
247
+ document.getElementById('jobs').innerHTML = '<tr><td colspan="4" class="empty">Error loading jobs</td></tr>';
248
+ }
249
+ }
250
+
251
+ async function deleteJob(id) {
252
+ await fetch('/api/jobs/' + id, { method: 'DELETE' });
253
+ loadJobs();
254
+ }
255
+
256
+ document.getElementById('addJobForm').addEventListener('submit', async (e) => {
257
+ e.preventDefault();
258
+ const form = new FormData(e.target);
259
+ await fetch('/api/jobs', {
260
+ method: 'POST',
261
+ headers: { 'Content-Type': 'api/jobs',application/json' },
262
+ body: JSON.stringify(Object.fromEntries(form))
263
+ });
264
+ e.target.reset();
265
+ loadJobs();
266
+ });
267
+
268
+ loadStatus();
269
+ loadConfig();
270
+ loadSkills();
271
+ loadJobs();
272
+ setInterval(loadStatus, 5000);
273
+ </script>
274
+ </body>
275
+ </html>
276
+ `;
277
+ }
278
+ async initialize() {
279
+ console.log('Web UI service initialized');
280
+ }
281
+ async start() {
282
+ return new Promise((resolve) => {
283
+ this.server = this.app.listen(this.port, this.host, () => {
284
+ console.log(`Web UI running at http://${this.host}:${this.port}`);
285
+ resolve();
286
+ });
287
+ });
288
+ }
289
+ async stop() {
290
+ return new Promise((resolve) => {
291
+ if (this.server) {
292
+ this.server.close(() => {
293
+ console.log('Web UI stopped');
294
+ resolve();
295
+ });
296
+ }
297
+ else {
298
+ resolve();
299
+ }
300
+ });
301
+ }
302
+ }
303
+ //# sourceMappingURL=web-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-ui.js","sourceRoot":"","sources":["../src/web-ui.ts"],"names":[],"mappings":"AAAA,OAAO,OAAuC,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAsB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC,MAAM,OAAO,YAAa,SAAQ,OAAO;IAC/B,GAAG,CAAU;IACb,IAAI,CAAS;IACb,IAAI,CAAS;IACb,MAAM,GAAQ,IAAI,CAAC;IACnB,KAAK,GAAQ,IAAI,CAAC;IAClB,SAAS,GAAQ,IAAI,CAAC;IAE9B,YAAY,MAAmB,EAAE,YAA2B;QAC1D,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC;QAErC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,KAAU;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,SAAc;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAEO,WAAW;QACjB,kBAAkB;QAClB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YAC1D,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;gBACxB,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YAC1D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,8BAA8B;YAC9B,MAAM,UAAU,GAAG;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;gBAC5D,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;gBAC1G,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;aACtE,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,mBAAmB;QACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YAC1D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACxE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,mDAAmD;YACnD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACzE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACxD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACzD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iDAAiD,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YAC/D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxD,IAAI,OAAO,EAAE,CAAC;gBACZ,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YAChD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB;QACtB,gFAAgF;QAChF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmKN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;gBACvD,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClE,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;oBACrB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAC9B,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@smilique/said",
3
+ "version": "1.0.0",
4
+ "description": "Autonomous AI agent with Telegram integration and extensible skills",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "type": "module",
8
+ "bin": {
9
+ "said": "dist/main.js"
10
+ },
11
+ "scripts": {
12
+ "start": "node --no-deprecation ./dist/main.js",
13
+ "build": "tsc",
14
+ "clean": "rm -rf dist",
15
+ "setup": "node ./dist/setup.js"
16
+ },
17
+ "dependencies": {
18
+ "dotenv": "^16.3.1",
19
+ "eventemitter3": "^5.0.1",
20
+ "express": "^4.18.2",
21
+ "grammy": "^1.19.2",
22
+ "openai": "^4.24.1"
23
+ },
24
+ "devDependencies": {
25
+ "@types/express": "^4.17.21",
26
+ "@types/node": "^20.10.0",
27
+ "typescript": "^5.3.3"
28
+ },
29
+ "engines": {
30
+ "node": ">=20.0.0"
31
+ },
32
+ "keywords": [
33
+ "ai",
34
+ "agent",
35
+ "telegram",
36
+ "bot",
37
+ "llm",
38
+ "autonomous"
39
+ ],
40
+ "license": "MIT"
41
+ }