@sena-ai/core 0.0.1
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/dist/__tests__/agent.test.d.ts +2 -0
- package/dist/__tests__/agent.test.d.ts.map +1 -0
- package/dist/__tests__/agent.test.js +25 -0
- package/dist/__tests__/agent.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +31 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/engine.test.d.ts +2 -0
- package/dist/__tests__/engine.test.d.ts.map +1 -0
- package/dist/__tests__/engine.test.js +208 -0
- package/dist/__tests__/engine.test.js.map +1 -0
- package/dist/__tests__/env.test.d.ts +2 -0
- package/dist/__tests__/env.test.d.ts.map +1 -0
- package/dist/__tests__/env.test.js +30 -0
- package/dist/__tests__/env.test.js.map +1 -0
- package/dist/__tests__/full-config.test.d.ts +2 -0
- package/dist/__tests__/full-config.test.d.ts.map +1 -0
- package/dist/__tests__/full-config.test.js +138 -0
- package/dist/__tests__/full-config.test.js.map +1 -0
- package/dist/__tests__/helpers.d.ts +16 -0
- package/dist/__tests__/helpers.d.ts.map +1 -0
- package/dist/__tests__/helpers.js +48 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +2 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +57 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/scheduler.test.d.ts +2 -0
- package/dist/__tests__/scheduler.test.d.ts.map +1 -0
- package/dist/__tests__/scheduler.test.js +143 -0
- package/dist/__tests__/scheduler.test.js.map +1 -0
- package/dist/__tests__/worker.test.d.ts +2 -0
- package/dist/__tests__/worker.test.d.ts.map +1 -0
- package/dist/__tests__/worker.test.js +154 -0
- package/dist/__tests__/worker.test.js.map +1 -0
- package/dist/agent.d.ts +9 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +14 -0
- package/dist/agent.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -0
- package/dist/engine.d.ts +25 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +167 -0
- package/dist/engine.js.map +1 -0
- package/dist/env.d.ts +4 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +22 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator.d.ts +18 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +106 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/scheduler.d.ts +15 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +100 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/types.d.ts +178 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +16 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +111 -0
- package/dist/worker.js.map +1 -0
- package/package.json +19 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { defineConfig, createAgent } from '../index.js';
|
|
3
|
+
import { createMockRuntime } from './helpers.js';
|
|
4
|
+
function inlineContext(content, role = 'system') {
|
|
5
|
+
return {
|
|
6
|
+
name: 'inline',
|
|
7
|
+
async execute() {
|
|
8
|
+
return [{ source: 'inline', role, content }];
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
describe('E2E: defineConfig → createAgent → processTurn', () => {
|
|
13
|
+
it('runs full pipeline with hooks and returns valid trace', async () => {
|
|
14
|
+
const config = defineConfig({
|
|
15
|
+
name: 'sena-test',
|
|
16
|
+
runtime: createMockRuntime('안녕하세요!'),
|
|
17
|
+
hooks: {
|
|
18
|
+
onTurnStart: [
|
|
19
|
+
inlineContext('당신은 세나입니다.', 'system'),
|
|
20
|
+
inlineContext('오늘의 기억: 테스트 중', 'context'),
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
const agent = createAgent(config);
|
|
25
|
+
const trace = await agent.processTurn({ input: '안녕' });
|
|
26
|
+
// Trace structure
|
|
27
|
+
expect(trace.turnId).toBeDefined();
|
|
28
|
+
expect(trace.agentName).toBe('sena-test');
|
|
29
|
+
expect(trace.trigger).toBe('programmatic');
|
|
30
|
+
expect(trace.input).toBe('안녕');
|
|
31
|
+
// Hook traces
|
|
32
|
+
expect(trace.hooks).toHaveLength(2);
|
|
33
|
+
// Assembled context: system before context
|
|
34
|
+
expect(trace.assembledContext).toContain('당신은 세나입니다.');
|
|
35
|
+
expect(trace.assembledContext).toContain('오늘의 기억: 테스트 중');
|
|
36
|
+
const sysIdx = trace.assembledContext.indexOf('세나');
|
|
37
|
+
const ctxIdx = trace.assembledContext.indexOf('기억');
|
|
38
|
+
expect(sysIdx).toBeLessThan(ctxIdx);
|
|
39
|
+
// Result
|
|
40
|
+
expect(trace.result?.text).toBe('안녕하세요!');
|
|
41
|
+
expect(trace.result?.sessionId).toBe('sess-1');
|
|
42
|
+
expect(trace.result?.durationMs).toBeGreaterThanOrEqual(0);
|
|
43
|
+
expect(trace.error).toBeNull();
|
|
44
|
+
});
|
|
45
|
+
it('handles empty hooks gracefully', async () => {
|
|
46
|
+
const config = defineConfig({
|
|
47
|
+
name: 'minimal',
|
|
48
|
+
runtime: createMockRuntime('ok'),
|
|
49
|
+
});
|
|
50
|
+
const agent = createAgent(config);
|
|
51
|
+
const trace = await agent.processTurn({ input: 'test' });
|
|
52
|
+
expect(trace.hooks).toHaveLength(0);
|
|
53
|
+
expect(trace.assembledContext).toBe('');
|
|
54
|
+
expect(trace.result?.text).toBe('ok');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scheduler.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { createScheduler, matchField, matchesCron } from '../scheduler.js';
|
|
3
|
+
function mockTrace() {
|
|
4
|
+
return {
|
|
5
|
+
turnId: 'turn-1',
|
|
6
|
+
timestamp: new Date().toISOString(),
|
|
7
|
+
agentName: 'test',
|
|
8
|
+
trigger: 'schedule',
|
|
9
|
+
input: 'test prompt',
|
|
10
|
+
hooks: [],
|
|
11
|
+
assembledContext: '',
|
|
12
|
+
result: { text: 'ok', sessionId: null, durationMs: 0, toolCalls: [] },
|
|
13
|
+
error: null,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
describe('createScheduler', () => {
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
vi.useFakeTimers();
|
|
19
|
+
});
|
|
20
|
+
afterEach(() => {
|
|
21
|
+
vi.useRealTimers();
|
|
22
|
+
});
|
|
23
|
+
it('executes heartbeat on interval', async () => {
|
|
24
|
+
const onTurn = vi.fn().mockResolvedValue(mockTrace());
|
|
25
|
+
const schedule = {
|
|
26
|
+
name: 'test-heartbeat',
|
|
27
|
+
type: 'heartbeat',
|
|
28
|
+
expression: '1s',
|
|
29
|
+
prompt: 'heartbeat check',
|
|
30
|
+
};
|
|
31
|
+
const scheduler = createScheduler({ schedules: [schedule], onTurn });
|
|
32
|
+
scheduler.start();
|
|
33
|
+
// Advance 1 second
|
|
34
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
35
|
+
expect(onTurn).toHaveBeenCalledTimes(1);
|
|
36
|
+
expect(onTurn).toHaveBeenCalledWith(expect.objectContaining({
|
|
37
|
+
input: 'heartbeat check',
|
|
38
|
+
trigger: 'schedule',
|
|
39
|
+
schedule: { name: 'test-heartbeat', type: 'heartbeat' },
|
|
40
|
+
}));
|
|
41
|
+
// Advance another second
|
|
42
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
43
|
+
expect(onTurn).toHaveBeenCalledTimes(2);
|
|
44
|
+
scheduler.stop();
|
|
45
|
+
});
|
|
46
|
+
it('stops executing after stop()', async () => {
|
|
47
|
+
const onTurn = vi.fn().mockResolvedValue(mockTrace());
|
|
48
|
+
const scheduler = createScheduler({
|
|
49
|
+
schedules: [{ name: 'test', type: 'heartbeat', expression: '1s', prompt: 'check' }],
|
|
50
|
+
onTurn,
|
|
51
|
+
});
|
|
52
|
+
scheduler.start();
|
|
53
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
54
|
+
expect(onTurn).toHaveBeenCalledTimes(1);
|
|
55
|
+
scheduler.stop();
|
|
56
|
+
await vi.advanceTimersByTimeAsync(5000);
|
|
57
|
+
expect(onTurn).toHaveBeenCalledTimes(1); // No more calls
|
|
58
|
+
});
|
|
59
|
+
it('reloads schedules', async () => {
|
|
60
|
+
const onTurn = vi.fn().mockResolvedValue(mockTrace());
|
|
61
|
+
const scheduler = createScheduler({
|
|
62
|
+
schedules: [{ name: 'old', type: 'heartbeat', expression: '1s', prompt: 'old' }],
|
|
63
|
+
onTurn,
|
|
64
|
+
});
|
|
65
|
+
scheduler.start();
|
|
66
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
67
|
+
expect(onTurn).toHaveBeenCalledWith(expect.objectContaining({ input: 'old' }));
|
|
68
|
+
scheduler.reload([{ name: 'new', type: 'heartbeat', expression: '2s', prompt: 'new' }]);
|
|
69
|
+
await vi.advanceTimersByTimeAsync(2000);
|
|
70
|
+
expect(onTurn).toHaveBeenLastCalledWith(expect.objectContaining({ input: 'new' }));
|
|
71
|
+
scheduler.stop();
|
|
72
|
+
});
|
|
73
|
+
it('does not run duplicate if previous run is still going', async () => {
|
|
74
|
+
let resolveFirst;
|
|
75
|
+
const firstCall = new Promise((r) => { resolveFirst = r; });
|
|
76
|
+
const onTurn = vi.fn()
|
|
77
|
+
.mockImplementationOnce(() => firstCall.then(() => mockTrace()))
|
|
78
|
+
.mockResolvedValue(mockTrace());
|
|
79
|
+
const scheduler = createScheduler({
|
|
80
|
+
schedules: [{ name: 'slow', type: 'heartbeat', expression: '1s', prompt: 'check' }],
|
|
81
|
+
onTurn,
|
|
82
|
+
});
|
|
83
|
+
scheduler.start();
|
|
84
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
85
|
+
expect(onTurn).toHaveBeenCalledTimes(1);
|
|
86
|
+
// Second tick while first is still running
|
|
87
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
88
|
+
expect(onTurn).toHaveBeenCalledTimes(1); // Skipped because still running
|
|
89
|
+
resolveFirst();
|
|
90
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
91
|
+
// Third tick — now it should run
|
|
92
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
93
|
+
expect(onTurn).toHaveBeenCalledTimes(2);
|
|
94
|
+
scheduler.stop();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('matchField', () => {
|
|
98
|
+
it('matches wildcard', () => {
|
|
99
|
+
expect(matchField('*', 5)).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
it('matches exact value', () => {
|
|
102
|
+
expect(matchField('5', 5)).toBe(true);
|
|
103
|
+
expect(matchField('5', 6)).toBe(false);
|
|
104
|
+
});
|
|
105
|
+
it('matches step values', () => {
|
|
106
|
+
expect(matchField('*/5', 0)).toBe(true);
|
|
107
|
+
expect(matchField('*/5', 5)).toBe(true);
|
|
108
|
+
expect(matchField('*/5', 10)).toBe(true);
|
|
109
|
+
expect(matchField('*/5', 3)).toBe(false);
|
|
110
|
+
});
|
|
111
|
+
it('matches ranges', () => {
|
|
112
|
+
expect(matchField('1-5', 1)).toBe(true);
|
|
113
|
+
expect(matchField('1-5', 3)).toBe(true);
|
|
114
|
+
expect(matchField('1-5', 5)).toBe(true);
|
|
115
|
+
expect(matchField('1-5', 0)).toBe(false);
|
|
116
|
+
expect(matchField('1-5', 6)).toBe(false);
|
|
117
|
+
});
|
|
118
|
+
it('matches lists', () => {
|
|
119
|
+
expect(matchField('1,3,5', 1)).toBe(true);
|
|
120
|
+
expect(matchField('1,3,5', 3)).toBe(true);
|
|
121
|
+
expect(matchField('1,3,5', 2)).toBe(false);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('matchesCron', () => {
|
|
125
|
+
it('matches every-minute wildcard', () => {
|
|
126
|
+
expect(matchesCron('* * * * *', new Date('2026-03-15T10:30:00Z'), 'UTC')).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
it('matches specific minute and hour', () => {
|
|
129
|
+
expect(matchesCron('30 10 * * *', new Date('2026-03-15T10:30:00Z'), 'UTC')).toBe(true);
|
|
130
|
+
expect(matchesCron('30 10 * * *', new Date('2026-03-15T10:31:00Z'), 'UTC')).toBe(false);
|
|
131
|
+
});
|
|
132
|
+
it('matches day of week (0=Sunday)', () => {
|
|
133
|
+
// 2026-03-15 is a Sunday
|
|
134
|
+
expect(matchesCron('* * * * 0', new Date('2026-03-15T10:00:00Z'), 'UTC')).toBe(true);
|
|
135
|
+
expect(matchesCron('* * * * 1', new Date('2026-03-15T10:00:00Z'), 'UTC')).toBe(false);
|
|
136
|
+
});
|
|
137
|
+
it('matches step in minutes', () => {
|
|
138
|
+
expect(matchesCron('*/15 * * * *', new Date('2026-03-15T10:00:00Z'), 'UTC')).toBe(true);
|
|
139
|
+
expect(matchesCron('*/15 * * * *', new Date('2026-03-15T10:15:00Z'), 'UTC')).toBe(true);
|
|
140
|
+
expect(matchesCron('*/15 * * * *', new Date('2026-03-15T10:07:00Z'), 'UTC')).toBe(false);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=scheduler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.test.js","sourceRoot":"","sources":["../../src/__tests__/scheduler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/worker.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { createWorker } from '../worker.js';
|
|
3
|
+
import { defineConfig } from '../config.js';
|
|
4
|
+
const mockRuntime = {
|
|
5
|
+
name: 'mock',
|
|
6
|
+
async *createStream() {
|
|
7
|
+
yield { type: 'session.init', sessionId: 'sess-1' };
|
|
8
|
+
yield { type: 'result', text: 'hello from worker' };
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
// Helper to make HTTP requests to the worker
|
|
12
|
+
async function request(port, path, options = {}) {
|
|
13
|
+
const { method = 'GET', body } = options;
|
|
14
|
+
const res = await fetch(`http://127.0.0.1:${port}${path}`, {
|
|
15
|
+
method,
|
|
16
|
+
headers: body ? { 'Content-Type': 'application/json' } : undefined,
|
|
17
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
18
|
+
});
|
|
19
|
+
const text = await res.text();
|
|
20
|
+
let json = undefined;
|
|
21
|
+
try {
|
|
22
|
+
json = JSON.parse(text);
|
|
23
|
+
}
|
|
24
|
+
catch { }
|
|
25
|
+
return { status: res.status, text, json };
|
|
26
|
+
}
|
|
27
|
+
describe('createWorker', () => {
|
|
28
|
+
let stopFn = null;
|
|
29
|
+
let originalProcessSend;
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
// Stub process.send to prevent vitest IPC conflicts
|
|
32
|
+
originalProcessSend = process.send;
|
|
33
|
+
process.send = (() => true);
|
|
34
|
+
});
|
|
35
|
+
afterEach(async () => {
|
|
36
|
+
if (stopFn) {
|
|
37
|
+
await stopFn();
|
|
38
|
+
stopFn = null;
|
|
39
|
+
}
|
|
40
|
+
process.send = originalProcessSend;
|
|
41
|
+
});
|
|
42
|
+
it('creates a worker with engine', () => {
|
|
43
|
+
const config = defineConfig({ name: 'test-worker', runtime: mockRuntime });
|
|
44
|
+
const worker = createWorker({ config, port: 0 });
|
|
45
|
+
expect(worker).toBeDefined();
|
|
46
|
+
expect(worker.engine).toBeDefined();
|
|
47
|
+
});
|
|
48
|
+
it('serves /health endpoint', async () => {
|
|
49
|
+
const config = defineConfig({ name: 'test-worker', runtime: mockRuntime });
|
|
50
|
+
const port = 19876 + Math.floor(Math.random() * 1000);
|
|
51
|
+
const worker = createWorker({ config, port });
|
|
52
|
+
await worker.start();
|
|
53
|
+
stopFn = () => worker.stop();
|
|
54
|
+
// Wait for server to be ready
|
|
55
|
+
await new Promise(r => setTimeout(r, 100));
|
|
56
|
+
const res = await request(port, '/health');
|
|
57
|
+
expect(res.status).toBe(200);
|
|
58
|
+
expect(res.text).toBe('ok');
|
|
59
|
+
});
|
|
60
|
+
it('returns 404 for unknown routes', async () => {
|
|
61
|
+
const config = defineConfig({ name: 'test-worker', runtime: mockRuntime });
|
|
62
|
+
const port = 19876 + Math.floor(Math.random() * 1000);
|
|
63
|
+
const worker = createWorker({ config, port });
|
|
64
|
+
await worker.start();
|
|
65
|
+
stopFn = () => worker.stop();
|
|
66
|
+
await new Promise(r => setTimeout(r, 100));
|
|
67
|
+
const res = await request(port, '/nonexistent');
|
|
68
|
+
expect(res.status).toBe(404);
|
|
69
|
+
});
|
|
70
|
+
it('registers connector routes and handles POST', async () => {
|
|
71
|
+
const receivedEvents = [];
|
|
72
|
+
const testConnector = {
|
|
73
|
+
name: 'test-connector',
|
|
74
|
+
registerRoutes(server, engine) {
|
|
75
|
+
server.post('/test/events', (req, res) => {
|
|
76
|
+
const body = req.body;
|
|
77
|
+
// Simulate processing
|
|
78
|
+
engine.submitTurn({
|
|
79
|
+
connector: 'test-connector',
|
|
80
|
+
conversationId: body.conversationId ?? 'conv-1',
|
|
81
|
+
userId: body.userId ?? 'user-1',
|
|
82
|
+
userName: body.userName ?? 'testuser',
|
|
83
|
+
text: body.text ?? 'hello',
|
|
84
|
+
raw: body,
|
|
85
|
+
}).then(() => {
|
|
86
|
+
res.status(200).json({ ok: true });
|
|
87
|
+
}).catch((err) => {
|
|
88
|
+
res.status(500).json({ error: err.message });
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
},
|
|
92
|
+
createOutput() {
|
|
93
|
+
return {
|
|
94
|
+
async showProgress() { },
|
|
95
|
+
async sendResult() { },
|
|
96
|
+
async sendError() { },
|
|
97
|
+
async dispose() { },
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
const config = defineConfig({
|
|
102
|
+
name: 'test-worker',
|
|
103
|
+
runtime: mockRuntime,
|
|
104
|
+
connectors: [testConnector],
|
|
105
|
+
});
|
|
106
|
+
const port = 19876 + Math.floor(Math.random() * 1000);
|
|
107
|
+
const worker = createWorker({ config, port });
|
|
108
|
+
await worker.start();
|
|
109
|
+
stopFn = () => worker.stop();
|
|
110
|
+
await new Promise(r => setTimeout(r, 100));
|
|
111
|
+
const res = await request(port, '/test/events', {
|
|
112
|
+
method: 'POST',
|
|
113
|
+
body: { text: 'test message', conversationId: 'c1', userId: 'u1', userName: 'tester' },
|
|
114
|
+
});
|
|
115
|
+
expect(res.status).toBe(200);
|
|
116
|
+
expect(res.json).toEqual({ ok: true });
|
|
117
|
+
});
|
|
118
|
+
it('parses POST body as JSON', async () => {
|
|
119
|
+
let receivedBody = null;
|
|
120
|
+
const bodyCapture = {
|
|
121
|
+
name: 'body-capture',
|
|
122
|
+
registerRoutes(server) {
|
|
123
|
+
server.post('/capture', (req, res) => {
|
|
124
|
+
receivedBody = req.body;
|
|
125
|
+
res.status(200).json({ captured: true });
|
|
126
|
+
});
|
|
127
|
+
},
|
|
128
|
+
createOutput() {
|
|
129
|
+
return {
|
|
130
|
+
async showProgress() { },
|
|
131
|
+
async sendResult() { },
|
|
132
|
+
async sendError() { },
|
|
133
|
+
async dispose() { },
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
const config = defineConfig({
|
|
138
|
+
name: 'test-worker',
|
|
139
|
+
runtime: mockRuntime,
|
|
140
|
+
connectors: [bodyCapture],
|
|
141
|
+
});
|
|
142
|
+
const port = 19876 + Math.floor(Math.random() * 1000);
|
|
143
|
+
const worker = createWorker({ config, port });
|
|
144
|
+
await worker.start();
|
|
145
|
+
stopFn = () => worker.stop();
|
|
146
|
+
await new Promise(r => setTimeout(r, 100));
|
|
147
|
+
await request(port, '/capture', {
|
|
148
|
+
method: 'POST',
|
|
149
|
+
body: { key: 'value', nested: { a: 1 } },
|
|
150
|
+
});
|
|
151
|
+
expect(receivedBody).toEqual({ key: 'value', nested: { a: 1 } });
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=worker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.test.js","sourceRoot":"","sources":["../../src/__tests__/worker.test.ts"],"names":[],"mappings":"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"}
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ResolvedSenaConfig } from './config.js';
|
|
2
|
+
import { type ProcessTurnOptions } from './engine.js';
|
|
3
|
+
import type { TurnTrace } from './types.js';
|
|
4
|
+
export type Agent = {
|
|
5
|
+
name: string;
|
|
6
|
+
processTurn(options: ProcessTurnOptions): Promise<TurnTrace>;
|
|
7
|
+
};
|
|
8
|
+
export declare function createAgent(config: ResolvedSenaConfig): Agent;
|
|
9
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;CAC7D,CAAA;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,KAAK,CAY7D"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createTurnEngine } from './engine.js';
|
|
2
|
+
export function createAgent(config) {
|
|
3
|
+
const engine = createTurnEngine({
|
|
4
|
+
name: config.name,
|
|
5
|
+
runtime: config.runtime,
|
|
6
|
+
hooks: config.hooks,
|
|
7
|
+
tools: config.tools,
|
|
8
|
+
});
|
|
9
|
+
return {
|
|
10
|
+
name: config.name,
|
|
11
|
+
processTurn: (options) => engine.processTurn(options),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAA2B,MAAM,aAAa,CAAA;AAQvE,MAAM,UAAU,WAAW,CAAC,MAA0B;IACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAA;IAEF,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;KACtD,CAAA;AACH,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SenaConfig } from './types.js';
|
|
2
|
+
export type ResolvedSenaConfig = Required<Pick<SenaConfig, 'name' | 'runtime' | 'connectors' | 'tools' | 'schedules'>> & {
|
|
3
|
+
hooks: NonNullable<SenaConfig['hooks']>;
|
|
4
|
+
orchestrator?: SenaConfig['orchestrator'];
|
|
5
|
+
};
|
|
6
|
+
export declare function defineConfig(config: SenaConfig): ResolvedSenaConfig;
|
|
7
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC,GAAG;IACvH,KAAK,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;IACvC,YAAY,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,CAAA;CAC1C,CAAA;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,kBAAkB,CAUnE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function defineConfig(config) {
|
|
2
|
+
return {
|
|
3
|
+
name: config.name,
|
|
4
|
+
runtime: config.runtime,
|
|
5
|
+
connectors: config.connectors ?? [],
|
|
6
|
+
tools: config.tools ?? [],
|
|
7
|
+
hooks: config.hooks ?? {},
|
|
8
|
+
schedules: config.schedules ?? [],
|
|
9
|
+
orchestrator: config.orchestrator,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC7C,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;QACnC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAA;AACH,CAAC"}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Runtime, ToolPort, TurnStartHook, TurnEndHook, ErrorHook, TurnContext, TurnTrace, RuntimeEvent } from './types.js';
|
|
2
|
+
export type TurnEngineConfig = {
|
|
3
|
+
name: string;
|
|
4
|
+
runtime: Runtime;
|
|
5
|
+
hooks: {
|
|
6
|
+
onTurnStart?: TurnStartHook[];
|
|
7
|
+
onTurnEnd?: TurnEndHook[];
|
|
8
|
+
onError?: ErrorHook[];
|
|
9
|
+
};
|
|
10
|
+
tools: ToolPort[];
|
|
11
|
+
};
|
|
12
|
+
export type ProcessTurnOptions = {
|
|
13
|
+
input: string;
|
|
14
|
+
trigger?: 'connector' | 'schedule' | 'programmatic';
|
|
15
|
+
sessionId?: string | null;
|
|
16
|
+
connector?: TurnContext['connector'];
|
|
17
|
+
schedule?: TurnContext['schedule'];
|
|
18
|
+
metadata?: Record<string, unknown>;
|
|
19
|
+
abortSignal?: AbortSignal;
|
|
20
|
+
onEvent?: (event: RuntimeEvent) => void;
|
|
21
|
+
};
|
|
22
|
+
export declare function createTurnEngine(config: TurnEngineConfig): {
|
|
23
|
+
processTurn: (options: ProcessTurnOptions) => Promise<TurnTrace>;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,aAAa,EACb,WAAW,EACX,SAAS,EACT,WAAW,EAEX,SAAS,EAGT,YAAY,EACb,MAAM,YAAY,CAAA;AAGnB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE;QACL,WAAW,CAAC,EAAE,aAAa,EAAE,CAAA;QAC7B,SAAS,CAAC,EAAE,WAAW,EAAE,CAAA;QACzB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAA;KACtB,CAAA;IACD,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,cAAc,CAAA;IACnD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAA;IACpC,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAA;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;CACxC,CAAA;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB;2BAGnB,kBAAkB,KAAG,OAAO,CAAC,SAAS,CAAC;EAuG5E"}
|