@sulala/agent 0.1.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 (98) hide show
  1. package/README.md +120 -0
  2. package/bin/sulala.mjs +7 -0
  3. package/dist/agent/loop.d.ts +38 -0
  4. package/dist/agent/loop.d.ts.map +1 -0
  5. package/dist/agent/loop.js +384 -0
  6. package/dist/agent/loop.js.map +1 -0
  7. package/dist/agent/session-queue.d.ts +2 -0
  8. package/dist/agent/session-queue.d.ts.map +1 -0
  9. package/dist/agent/session-queue.js +13 -0
  10. package/dist/agent/session-queue.js.map +1 -0
  11. package/dist/agent/skill-install.d.ts +41 -0
  12. package/dist/agent/skill-install.d.ts.map +1 -0
  13. package/dist/agent/skill-install.js +211 -0
  14. package/dist/agent/skill-install.js.map +1 -0
  15. package/dist/agent/skills-config.d.ts +24 -0
  16. package/dist/agent/skills-config.d.ts.map +1 -0
  17. package/dist/agent/skills-config.js +126 -0
  18. package/dist/agent/skills-config.js.map +1 -0
  19. package/dist/agent/skills-watcher.d.ts +7 -0
  20. package/dist/agent/skills-watcher.d.ts.map +1 -0
  21. package/dist/agent/skills-watcher.js +32 -0
  22. package/dist/agent/skills-watcher.js.map +1 -0
  23. package/dist/agent/skills.d.ts +32 -0
  24. package/dist/agent/skills.d.ts.map +1 -0
  25. package/dist/agent/skills.js +208 -0
  26. package/dist/agent/skills.js.map +1 -0
  27. package/dist/agent/skills.test.d.ts +2 -0
  28. package/dist/agent/skills.test.d.ts.map +1 -0
  29. package/dist/agent/skills.test.js +59 -0
  30. package/dist/agent/skills.test.js.map +1 -0
  31. package/dist/agent/tools.d.ts +8 -0
  32. package/dist/agent/tools.d.ts.map +1 -0
  33. package/dist/agent/tools.js +147 -0
  34. package/dist/agent/tools.js.map +1 -0
  35. package/dist/ai/orchestrator.d.ts +38 -0
  36. package/dist/ai/orchestrator.d.ts.map +1 -0
  37. package/dist/ai/orchestrator.js +360 -0
  38. package/dist/ai/orchestrator.js.map +1 -0
  39. package/dist/ai/orchestrator.test.d.ts +2 -0
  40. package/dist/ai/orchestrator.test.d.ts.map +1 -0
  41. package/dist/ai/orchestrator.test.js +29 -0
  42. package/dist/ai/orchestrator.test.js.map +1 -0
  43. package/dist/cli.d.ts +3 -0
  44. package/dist/cli.d.ts.map +1 -0
  45. package/dist/cli.js +278 -0
  46. package/dist/cli.js.map +1 -0
  47. package/dist/config.d.ts +4 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +77 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/config.test.d.ts +2 -0
  52. package/dist/config.test.d.ts.map +1 -0
  53. package/dist/config.test.js +16 -0
  54. package/dist/config.test.js.map +1 -0
  55. package/dist/db/index.d.ts +42 -0
  56. package/dist/db/index.d.ts.map +1 -0
  57. package/dist/db/index.js +121 -0
  58. package/dist/db/index.js.map +1 -0
  59. package/dist/db/schema.sql +74 -0
  60. package/dist/gateway/server.d.ts +13 -0
  61. package/dist/gateway/server.d.ts.map +1 -0
  62. package/dist/gateway/server.js +566 -0
  63. package/dist/gateway/server.js.map +1 -0
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +78 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/plugins/index.d.ts +52 -0
  69. package/dist/plugins/index.d.ts.map +1 -0
  70. package/dist/plugins/index.js +176 -0
  71. package/dist/plugins/index.js.map +1 -0
  72. package/dist/scheduler/cron.d.ts +8 -0
  73. package/dist/scheduler/cron.d.ts.map +1 -0
  74. package/dist/scheduler/cron.js +31 -0
  75. package/dist/scheduler/cron.js.map +1 -0
  76. package/dist/scheduler/queue.d.ts +13 -0
  77. package/dist/scheduler/queue.d.ts.map +1 -0
  78. package/dist/scheduler/queue.js +75 -0
  79. package/dist/scheduler/queue.js.map +1 -0
  80. package/dist/scheduler/queue.test.d.ts +2 -0
  81. package/dist/scheduler/queue.test.d.ts.map +1 -0
  82. package/dist/scheduler/queue.test.js +41 -0
  83. package/dist/scheduler/queue.test.js.map +1 -0
  84. package/dist/types.d.ts +149 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +2 -0
  87. package/dist/types.js.map +1 -0
  88. package/dist/watcher/index.d.ts +15 -0
  89. package/dist/watcher/index.d.ts.map +1 -0
  90. package/dist/watcher/index.js +87 -0
  91. package/dist/watcher/index.js.map +1 -0
  92. package/dist/webhooks.d.ts +2 -0
  93. package/dist/webhooks.d.ts.map +1 -0
  94. package/dist/webhooks.js +38 -0
  95. package/dist/webhooks.js.map +1 -0
  96. package/package.json +62 -0
  97. package/src/db/schema.sql +74 -0
  98. package/src/index.ts +83 -0
package/dist/cli.js ADDED
@@ -0,0 +1,278 @@
1
+ #!/usr/bin/env -S npx tsx
2
+ /**
3
+ * Sulala CLI — status, tasks, logs, enqueue, skill install, init.
4
+ */
5
+ import { mkdirSync, existsSync, copyFileSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { getRegistrySkills, installSkill, updateSkillsAll, uninstallSkill } from './agent/skill-install.js';
8
+ const GATEWAY_URL = process.env.GATEWAY_URL || 'http://127.0.0.1:3000';
9
+ const API_KEY = process.env.GATEWAY_API_KEY || '';
10
+ function headers() {
11
+ const h = { 'Content-Type': 'application/json' };
12
+ if (API_KEY)
13
+ h['X-Api-Key'] = API_KEY;
14
+ return h;
15
+ }
16
+ async function get(path, qs = '') {
17
+ const url = qs ? `${GATEWAY_URL}${path}?${qs}` : `${GATEWAY_URL}${path}`;
18
+ const res = await fetch(url, { headers: headers() });
19
+ if (!res.ok)
20
+ throw new Error(`${res.status} ${await res.text()}`);
21
+ return res.json();
22
+ }
23
+ async function post(path, body) {
24
+ const res = await fetch(`${GATEWAY_URL}${path}`, {
25
+ method: 'POST',
26
+ headers: headers(),
27
+ body: JSON.stringify(body),
28
+ });
29
+ if (!res.ok)
30
+ throw new Error(`${res.status} ${await res.text()}`);
31
+ return res.json();
32
+ }
33
+ async function status() {
34
+ const data = await get('/health');
35
+ console.log(JSON.stringify(data, null, 2));
36
+ }
37
+ async function tasks(limit = 50) {
38
+ const data = await get('/api/tasks', `limit=${limit}`);
39
+ console.log(JSON.stringify(data, null, 2));
40
+ }
41
+ async function logs(limit = 100) {
42
+ const data = await get('/api/logs', `limit=${limit}`);
43
+ console.log(JSON.stringify(data, null, 2));
44
+ }
45
+ async function skillList() {
46
+ const skills = await getRegistrySkills();
47
+ console.log(JSON.stringify({ skills }, null, 2));
48
+ }
49
+ async function skillCheck() {
50
+ try {
51
+ const data = await get('/api/agent/skills');
52
+ const skills = data.skills || [];
53
+ const binsData = (await get('/api/agent/skills/required-bins'));
54
+ const bins = binsData.bins || [];
55
+ let ok = true;
56
+ const blocked = skills.filter((s) => s.status === 'blocked');
57
+ if (blocked.length > 0) {
58
+ ok = false;
59
+ console.error('Blocked skills (missing binaries):');
60
+ for (const s of blocked) {
61
+ console.error(` - ${s.name}: missing ${(s.missing || []).join(', ')}`);
62
+ }
63
+ }
64
+ const eligible = skills.filter((s) => s.status === 'eligible');
65
+ const unknown = skills.filter((s) => s.status === 'unknown');
66
+ console.log(JSON.stringify({ skills: skills.length, eligible: eligible.length, blocked: blocked.length, unknown: unknown.length, requiredBins: bins }, null, 2));
67
+ if (!ok)
68
+ process.exit(1);
69
+ }
70
+ catch (e) {
71
+ console.error(e instanceof Error ? e.message : e);
72
+ process.exit(1);
73
+ }
74
+ }
75
+ async function skillUpdate() {
76
+ const result = await updateSkillsAll();
77
+ console.log(JSON.stringify(result, null, 2));
78
+ if (result.failed.length > 0)
79
+ process.exit(1);
80
+ }
81
+ async function skillUninstall(slug, global) {
82
+ const target = global ? 'managed' : 'workspace';
83
+ const result = uninstallSkill(slug, target);
84
+ if (result.success) {
85
+ console.log(JSON.stringify({ uninstalled: slug, path: result.path, target }));
86
+ }
87
+ else {
88
+ console.error(result.error || 'Uninstall failed');
89
+ process.exit(1);
90
+ }
91
+ }
92
+ async function skillInstall(slug, global, registryUrl) {
93
+ const target = global ? 'managed' : 'workspace';
94
+ const result = await installSkill(slug, target, { registryUrl });
95
+ if (result.success) {
96
+ console.log(JSON.stringify({ installed: slug, path: result.path, target }));
97
+ }
98
+ else {
99
+ console.error(result.error || 'Install failed');
100
+ process.exit(1);
101
+ }
102
+ }
103
+ async function doctor() {
104
+ const issues = [];
105
+ const ok = [];
106
+ // Env
107
+ if (!process.env.PORT)
108
+ ok.push('PORT (default 3000)');
109
+ else
110
+ ok.push(`PORT=${process.env.PORT}`);
111
+ const aiKeys = ['OPENAI_API_KEY', 'ANTHROPIC_API_KEY', 'OPENROUTER_API_KEY', 'GOOGLE_GEMINI_API_KEY', 'GEMINI_API_KEY'];
112
+ const hasAi = aiKeys.some((k) => process.env[k]?.trim());
113
+ if (!hasAi)
114
+ issues.push('No AI provider key set (OPENAI_API_KEY, ANTHROPIC_API_KEY, OPENROUTER_API_KEY, or GEMINI_API_KEY)');
115
+ else
116
+ ok.push('AI provider configured');
117
+ // DB
118
+ const dbPath = process.env.DB_PATH || './data/sulala.db';
119
+ const { existsSync } = await import('fs');
120
+ const { resolve } = await import('path');
121
+ const dbFull = resolve(process.cwd(), dbPath);
122
+ if (existsSync(dbFull))
123
+ ok.push(`DB exists: ${dbPath}`);
124
+ else
125
+ issues.push(`DB not found: ${dbPath}`);
126
+ // Gateway
127
+ try {
128
+ await get('/health');
129
+ ok.push(`Gateway reachable: ${GATEWAY_URL}`);
130
+ }
131
+ catch {
132
+ issues.push(`Gateway not reachable at ${GATEWAY_URL}`);
133
+ }
134
+ // Skills
135
+ try {
136
+ const skillsData = await get('/api/agent/skills');
137
+ const skills = skillsData.skills || [];
138
+ ok.push(`${skills.length} skill(s) loaded`);
139
+ }
140
+ catch {
141
+ issues.push('Could not fetch skills');
142
+ }
143
+ console.log(JSON.stringify({ ok, issues }, null, 2));
144
+ if (issues.length > 0)
145
+ process.exit(1);
146
+ }
147
+ async function init(targetDir) {
148
+ const cwd = targetDir || process.cwd();
149
+ const dirs = [join(cwd, 'config'), join(cwd, 'context'), join(cwd, 'registry')];
150
+ for (const d of dirs) {
151
+ if (!existsSync(d)) {
152
+ mkdirSync(d, { recursive: true });
153
+ console.log(`Created ${d}`);
154
+ }
155
+ }
156
+ const envExample = join(cwd, '.env.example');
157
+ const envDest = join(cwd, '.env');
158
+ if (!existsSync(envExample)) {
159
+ console.log('No .env.example found in project root; run init from sulala_agent dir or copy manually.');
160
+ return;
161
+ }
162
+ if (!existsSync(envDest)) {
163
+ copyFileSync(envExample, envDest);
164
+ console.log(`Created ${envDest} from .env.example`);
165
+ }
166
+ else {
167
+ console.log(`${envDest} already exists`);
168
+ }
169
+ console.log(JSON.stringify({ init: true, dir: cwd }));
170
+ }
171
+ async function enqueueTask(type, payloadStr) {
172
+ let payload = null;
173
+ if (payloadStr) {
174
+ try {
175
+ payload = JSON.parse(payloadStr);
176
+ }
177
+ catch {
178
+ throw new Error('--payload must be valid JSON');
179
+ }
180
+ }
181
+ const data = await post('/api/tasks', { type, payload });
182
+ console.log(JSON.stringify(data, null, 2));
183
+ }
184
+ function parseArgs() {
185
+ const raw = process.argv.slice(2);
186
+ const args = [];
187
+ const opts = {};
188
+ for (let i = 0; i < raw.length; i++) {
189
+ const a = raw[i];
190
+ if (a.startsWith('--')) {
191
+ const [k, v] = a.slice(2).split('=');
192
+ opts[k] = v !== undefined ? v : true;
193
+ }
194
+ else {
195
+ args.push(a);
196
+ }
197
+ }
198
+ return { cmd: args[0] ?? '', args, opts };
199
+ }
200
+ async function main() {
201
+ const { cmd, args, opts } = parseArgs();
202
+ if (!cmd || cmd === 'help' || cmd === '-h' || cmd === '--help') {
203
+ console.log(`Sulala CLI
204
+ status
205
+ doctor
206
+ tasks [--limit=50]
207
+ logs [--limit=100]
208
+ enqueue --type=NAME [--payload='{"key":"value"}']
209
+ skill list
210
+ skill check
211
+ skill install <slug> [--global] [--registry=URL] [--registry=URL]
212
+ skill uninstall <slug> [--global]
213
+ skill update [--all]
214
+ init [dir]
215
+
216
+ Env: GATEWAY_URL, GATEWAY_API_KEY, SULALA_SKILLS_DIR, AGENT_CONTEXT_PATH
217
+ `);
218
+ process.exit(0);
219
+ }
220
+ try {
221
+ switch (cmd) {
222
+ case 'status':
223
+ await status();
224
+ break;
225
+ case 'doctor':
226
+ await doctor();
227
+ break;
228
+ case 'tasks':
229
+ await tasks(parseInt(String(opts.limit || '50'), 10));
230
+ break;
231
+ case 'logs':
232
+ await logs(parseInt(String(opts.limit || '100'), 10));
233
+ break;
234
+ case 'enqueue':
235
+ if (!opts.type)
236
+ throw new Error('enqueue requires --type=NAME');
237
+ await enqueueTask(String(opts.type), typeof opts.payload === 'string' ? opts.payload : undefined);
238
+ break;
239
+ case 'skill': {
240
+ const sub = args[1] ?? '';
241
+ if (sub === 'list')
242
+ await skillList();
243
+ else if (sub === 'check')
244
+ await skillCheck();
245
+ else if (sub === 'update')
246
+ await skillUpdate();
247
+ else if (sub === 'install') {
248
+ const slug = args[2];
249
+ if (!slug)
250
+ throw new Error('skill install requires <slug>');
251
+ await skillInstall(slug, !!opts.global);
252
+ }
253
+ else if (sub === 'uninstall') {
254
+ const slug = args[2];
255
+ if (!slug)
256
+ throw new Error('skill uninstall requires <slug>');
257
+ await skillUninstall(slug, !!opts.global);
258
+ }
259
+ else
260
+ throw new Error(`skill: use 'list', 'install <slug> [--global]', 'uninstall <slug> [--global]', or 'update [--all]'`);
261
+ break;
262
+ }
263
+ case 'init': {
264
+ const dir = args[1] || process.cwd();
265
+ await init(dir);
266
+ break;
267
+ }
268
+ default:
269
+ throw new Error(`Unknown command: ${cmd}`);
270
+ }
271
+ }
272
+ catch (err) {
273
+ console.error(err instanceof Error ? err.message : err);
274
+ process.exit(1);
275
+ }
276
+ }
277
+ main();
278
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import 'dotenv/config';
2
+ import type { Config } from './types.js';
3
+ export declare const config: Config;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA0BzC,eAAO,MAAM,MAAM,EAAE,MA2BpB,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,77 @@
1
+ import 'dotenv/config';
2
+ import { readFileSync, existsSync, readdirSync } from 'fs';
3
+ import { join, dirname } from 'path';
4
+ import { homedir } from 'os';
5
+ import { fileURLToPath } from 'url';
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const projectRoot = join(__dirname, '..');
8
+ function loadWatchFolders() {
9
+ const fromEnv = (process.env.WATCH_FOLDERS || '')
10
+ .split(',')
11
+ .map((s) => s.trim())
12
+ .filter(Boolean);
13
+ const configPath = join(projectRoot, 'config', 'watched.json');
14
+ if (!existsSync(configPath))
15
+ return fromEnv;
16
+ try {
17
+ const data = JSON.parse(readFileSync(configPath, 'utf8'));
18
+ const fromFile = Array.isArray(data.folders) ? data.folders : [];
19
+ const combined = [...fromEnv];
20
+ for (const p of fromFile) {
21
+ const s = typeof p === 'string' ? p.trim() : '';
22
+ if (s && !combined.includes(s))
23
+ combined.push(s);
24
+ }
25
+ return combined;
26
+ }
27
+ catch {
28
+ return fromEnv;
29
+ }
30
+ }
31
+ export const config = {
32
+ port: parseInt(process.env.PORT || '3000', 10),
33
+ host: process.env.HOST || '127.0.0.1',
34
+ dbPath: process.env.DB_PATH || './data/sulala.db',
35
+ watchFolders: loadWatchFolders(),
36
+ debug: !!process.env.DEBUG,
37
+ gatewayApiKey: process.env.GATEWAY_API_KEY || null,
38
+ webhookUrls: (process.env.WEBHOOK_URL || process.env.WEBHOOK_URLS || '')
39
+ .split(',')
40
+ .map((s) => s.trim())
41
+ .filter(Boolean),
42
+ webhookSecret: process.env.WEBHOOK_SECRET || null,
43
+ rateLimitMax: parseInt(process.env.RATE_LIMIT_MAX || '0', 10),
44
+ rateLimitWindowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '60000', 10),
45
+ agentSystemPrompt: process.env.AGENT_SYSTEM_PROMPT || null,
46
+ agentTimeoutMs: parseInt(process.env.AGENT_TIMEOUT_MS || '0', 10),
47
+ agentContextPath: process.env.AGENT_CONTEXT_PATH || null,
48
+ agentWorkspaceRoot: process.env.AGENT_WORKSPACE_ROOT || null,
49
+ skillsBundledDir: join(projectRoot, 'context'),
50
+ skillsManagedDir: process.env.SULALA_SKILLS_DIR || join(homedir(), '.sulala', 'skills'),
51
+ skillsExtraDirs: (process.env.SKILLS_EXTRA_DIRS || '')
52
+ .split(',')
53
+ .map((s) => s.trim())
54
+ .filter(Boolean),
55
+ skillsPluginDirs: loadPluginSkillDirs(),
56
+ skillsWatch: process.env.SKILLS_WATCH !== '0',
57
+ };
58
+ function loadPluginSkillDirs() {
59
+ const pluginsDir = join(process.cwd(), 'plugins');
60
+ if (!existsSync(pluginsDir))
61
+ return [];
62
+ const dirs = [];
63
+ try {
64
+ for (const name of readdirSync(pluginsDir, { withFileTypes: true })) {
65
+ if (!name.isDirectory())
66
+ continue;
67
+ const skillsPath = join(pluginsDir, name.name, 'skills');
68
+ if (existsSync(skillsPath))
69
+ dirs.push(skillsPath);
70
+ }
71
+ }
72
+ catch {
73
+ // skip
74
+ }
75
+ return dirs;
76
+ }
77
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { config } from './config.js';
3
+ describe('config', () => {
4
+ it('has required Config shape', () => {
5
+ expect(config).toBeDefined();
6
+ expect(typeof config.port).toBe('number');
7
+ expect(config.port).toBeGreaterThan(0);
8
+ expect(typeof config.host).toBe('string');
9
+ expect(Array.isArray(config.watchFolders)).toBe(true);
10
+ expect(typeof config.debug).toBe('boolean');
11
+ expect(Array.isArray(config.webhookUrls)).toBe(true);
12
+ expect(typeof config.rateLimitMax).toBe('number');
13
+ expect(typeof config.rateLimitWindowMs).toBe('number');
14
+ });
15
+ });
16
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import Database from 'better-sqlite3';
2
+ import type { InsertTaskPayload, AgentSessionRow, AgentMessageRow } from '../types.js';
3
+ export declare function initDb(path?: string): Database.Database;
4
+ export declare function getDb(): Database.Database;
5
+ export declare function closeDb(): void;
6
+ export declare function log(source: string, level: string, message: string, meta?: object | null | undefined): void;
7
+ export declare function insertTask(task: InsertTaskPayload): InsertTaskPayload;
8
+ export declare function updateTaskStatus(id: string, status: string, error?: string | null): void;
9
+ export declare function setTaskPendingForRetry(id: string): void;
10
+ export declare function upsertFileState(path: string, mtimeMs: number, size?: number | null, hash?: string | null, meta?: Record<string, unknown> | null): void;
11
+ export declare function saveAiResult(record: {
12
+ id: string;
13
+ provider: string;
14
+ model?: string | null;
15
+ task_id?: string | null;
16
+ request_meta?: unknown;
17
+ response_meta?: unknown;
18
+ }): void;
19
+ export interface FileStateRow {
20
+ path: string;
21
+ mtime_ms: number;
22
+ size: number | null;
23
+ hash: string | null;
24
+ last_seen: number;
25
+ meta: string | null;
26
+ }
27
+ export declare function getFileStates(limit?: number): FileStateRow[];
28
+ export declare function createAgentSession(sessionKey: string, meta?: Record<string, unknown> | null): AgentSessionRow;
29
+ export declare function getAgentSessionById(id: string): AgentSessionRow | null;
30
+ export declare function getAgentSessionByKey(sessionKey: string): AgentSessionRow | null;
31
+ export declare function listAgentSessions(limit?: number): AgentSessionRow[];
32
+ export declare function getOrCreateAgentSession(sessionKey: string, meta?: Record<string, unknown> | null): AgentSessionRow;
33
+ export declare function appendAgentMessage(msg: {
34
+ session_id: string;
35
+ role: string;
36
+ content?: string | null;
37
+ tool_calls?: string | null;
38
+ tool_call_id?: string | null;
39
+ name?: string | null;
40
+ }): AgentMessageRow;
41
+ export declare function getAgentMessages(sessionId: string, limit?: number): AgentMessageRow[];
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import Database from 'better-sqlite3';
2
+ import { readFileSync, mkdirSync, existsSync } from 'fs';
3
+ import { dirname, join } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+ let db = null;
7
+ export function initDb(path = './data/sulala.db') {
8
+ if (db)
9
+ return db;
10
+ const dir = dirname(path);
11
+ if (!existsSync(dir))
12
+ mkdirSync(dir, { recursive: true });
13
+ db = new Database(path);
14
+ const schema = readFileSync(join(__dirname, 'schema.sql'), 'utf8');
15
+ db.exec(schema);
16
+ return db;
17
+ }
18
+ export function getDb() {
19
+ if (!db)
20
+ throw new Error('DB not initialized; call initDb first');
21
+ return db;
22
+ }
23
+ export function closeDb() {
24
+ if (db) {
25
+ db.close();
26
+ db = null;
27
+ }
28
+ }
29
+ export function log(source, level, message, meta = null) {
30
+ const d = getDb();
31
+ d.prepare('INSERT INTO logs (source, level, message, meta, created_at) VALUES (?, ?, ?, ?, ?)').run(source, level, message, meta ? JSON.stringify(meta) : null, Date.now());
32
+ }
33
+ export function insertTask(task) {
34
+ const d = getDb();
35
+ const now = Date.now();
36
+ d.prepare(`
37
+ INSERT INTO tasks (id, type, payload, status, scheduled_at, retry_count, max_retries, created_at, updated_at)
38
+ VALUES (?, ?, ?, 'pending', ?, 0, ?, ?, ?)
39
+ `).run(task.id, task.type, task.payload ? JSON.stringify(task.payload) : null, task.scheduled_at ?? null, task.max_retries ?? 3, now, now);
40
+ return task;
41
+ }
42
+ export function updateTaskStatus(id, status, error = null) {
43
+ const d = getDb();
44
+ const now = Date.now();
45
+ const finished = status === 'done' || status === 'failed' || status === 'cancelled';
46
+ d.prepare(`
47
+ UPDATE tasks SET status = ?, error = ?, updated_at = ?, finished_at = ?
48
+ WHERE id = ?
49
+ `).run(status, error, now, finished ? now : null, id);
50
+ }
51
+ export function setTaskPendingForRetry(id) {
52
+ const d = getDb();
53
+ const now = Date.now();
54
+ d.prepare(`
55
+ UPDATE tasks SET status = 'pending', error = NULL, retry_count = 0, updated_at = ?, finished_at = NULL
56
+ WHERE id = ?
57
+ `).run(now, id);
58
+ }
59
+ export function upsertFileState(path, mtimeMs, size = null, hash = null, meta = null) {
60
+ const d = getDb();
61
+ const now = Date.now();
62
+ d.prepare(`
63
+ INSERT INTO file_states (path, mtime_ms, size, hash, last_seen, meta)
64
+ VALUES (?, ?, ?, ?, ?, ?)
65
+ ON CONFLICT(path) DO UPDATE SET mtime_ms = ?, size = ?, hash = ?, last_seen = ?, meta = ?
66
+ `).run(path, mtimeMs, size, hash, now, meta ? JSON.stringify(meta) : null, mtimeMs, size, hash, now, meta ? JSON.stringify(meta) : null);
67
+ }
68
+ export function saveAiResult(record) {
69
+ const d = getDb();
70
+ d.prepare(`
71
+ INSERT INTO ai_results (id, provider, model, task_id, request_meta, response_meta, created_at)
72
+ VALUES (?, ?, ?, ?, ?, ?, ?)
73
+ `).run(record.id, record.provider, record.model ?? null, record.task_id ?? null, record.request_meta ? JSON.stringify(record.request_meta) : null, record.response_meta ? JSON.stringify(record.response_meta) : null, Date.now());
74
+ }
75
+ export function getFileStates(limit = 200) {
76
+ const d = getDb();
77
+ return d.prepare('SELECT * FROM file_states ORDER BY last_seen DESC LIMIT ?').all(limit);
78
+ }
79
+ // --- Agent sessions ---
80
+ export function createAgentSession(sessionKey, meta = null) {
81
+ const d = getDb();
82
+ const id = `sess_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
83
+ const now = Date.now();
84
+ d.prepare('INSERT INTO agent_sessions (id, session_key, meta, created_at, updated_at) VALUES (?, ?, ?, ?, ?)').run(id, sessionKey, meta ? JSON.stringify(meta) : null, now, now);
85
+ return { id, session_key: sessionKey, meta: meta ? JSON.stringify(meta) : null, created_at: now, updated_at: now };
86
+ }
87
+ export function getAgentSessionById(id) {
88
+ const d = getDb();
89
+ const row = d.prepare('SELECT * FROM agent_sessions WHERE id = ?').get(id);
90
+ return row ?? null;
91
+ }
92
+ export function getAgentSessionByKey(sessionKey) {
93
+ const d = getDb();
94
+ const row = d.prepare('SELECT * FROM agent_sessions WHERE session_key = ?').get(sessionKey);
95
+ return row ?? null;
96
+ }
97
+ export function listAgentSessions(limit = 50) {
98
+ const d = getDb();
99
+ return d.prepare('SELECT * FROM agent_sessions ORDER BY updated_at DESC LIMIT ?').all(limit);
100
+ }
101
+ export function getOrCreateAgentSession(sessionKey, meta) {
102
+ const existing = getAgentSessionByKey(sessionKey);
103
+ if (existing)
104
+ return existing;
105
+ return createAgentSession(sessionKey, meta ?? null);
106
+ }
107
+ export function appendAgentMessage(msg) {
108
+ const d = getDb();
109
+ const now = Date.now();
110
+ d.prepare('UPDATE agent_sessions SET updated_at = ? WHERE id = ?').run(now, msg.session_id);
111
+ d.prepare(`INSERT INTO agent_messages (session_id, role, content, tool_calls, tool_call_id, name, created_at)
112
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(msg.session_id, msg.role, msg.content ?? null, msg.tool_calls ?? null, msg.tool_call_id ?? null, msg.name ?? null, now);
113
+ const row = d.prepare('SELECT * FROM agent_messages WHERE session_id = ? ORDER BY id DESC LIMIT 1')
114
+ .get(msg.session_id);
115
+ return { ...row, created_at: row.created_at };
116
+ }
117
+ export function getAgentMessages(sessionId, limit = 100) {
118
+ const d = getDb();
119
+ return d.prepare('SELECT * FROM agent_messages WHERE session_id = ? ORDER BY id ASC LIMIT ?').all(sessionId, limit);
120
+ }
121
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}