@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.
Files changed (73) hide show
  1. package/dist/__tests__/agent.test.d.ts +2 -0
  2. package/dist/__tests__/agent.test.d.ts.map +1 -0
  3. package/dist/__tests__/agent.test.js +25 -0
  4. package/dist/__tests__/agent.test.js.map +1 -0
  5. package/dist/__tests__/config.test.d.ts +2 -0
  6. package/dist/__tests__/config.test.d.ts.map +1 -0
  7. package/dist/__tests__/config.test.js +31 -0
  8. package/dist/__tests__/config.test.js.map +1 -0
  9. package/dist/__tests__/engine.test.d.ts +2 -0
  10. package/dist/__tests__/engine.test.d.ts.map +1 -0
  11. package/dist/__tests__/engine.test.js +208 -0
  12. package/dist/__tests__/engine.test.js.map +1 -0
  13. package/dist/__tests__/env.test.d.ts +2 -0
  14. package/dist/__tests__/env.test.d.ts.map +1 -0
  15. package/dist/__tests__/env.test.js +30 -0
  16. package/dist/__tests__/env.test.js.map +1 -0
  17. package/dist/__tests__/full-config.test.d.ts +2 -0
  18. package/dist/__tests__/full-config.test.d.ts.map +1 -0
  19. package/dist/__tests__/full-config.test.js +138 -0
  20. package/dist/__tests__/full-config.test.js.map +1 -0
  21. package/dist/__tests__/helpers.d.ts +16 -0
  22. package/dist/__tests__/helpers.d.ts.map +1 -0
  23. package/dist/__tests__/helpers.js +48 -0
  24. package/dist/__tests__/helpers.js.map +1 -0
  25. package/dist/__tests__/integration.test.d.ts +2 -0
  26. package/dist/__tests__/integration.test.d.ts.map +1 -0
  27. package/dist/__tests__/integration.test.js +57 -0
  28. package/dist/__tests__/integration.test.js.map +1 -0
  29. package/dist/__tests__/scheduler.test.d.ts +2 -0
  30. package/dist/__tests__/scheduler.test.d.ts.map +1 -0
  31. package/dist/__tests__/scheduler.test.js +143 -0
  32. package/dist/__tests__/scheduler.test.js.map +1 -0
  33. package/dist/__tests__/worker.test.d.ts +2 -0
  34. package/dist/__tests__/worker.test.d.ts.map +1 -0
  35. package/dist/__tests__/worker.test.js +154 -0
  36. package/dist/__tests__/worker.test.js.map +1 -0
  37. package/dist/agent.d.ts +9 -0
  38. package/dist/agent.d.ts.map +1 -0
  39. package/dist/agent.js +14 -0
  40. package/dist/agent.js.map +1 -0
  41. package/dist/config.d.ts +7 -0
  42. package/dist/config.d.ts.map +1 -0
  43. package/dist/config.js +12 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/engine.d.ts +25 -0
  46. package/dist/engine.d.ts.map +1 -0
  47. package/dist/engine.js +167 -0
  48. package/dist/engine.js.map +1 -0
  49. package/dist/env.d.ts +4 -0
  50. package/dist/env.d.ts.map +1 -0
  51. package/dist/env.js +22 -0
  52. package/dist/env.js.map +1 -0
  53. package/dist/index.d.ts +13 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +9 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/orchestrator.d.ts +18 -0
  58. package/dist/orchestrator.d.ts.map +1 -0
  59. package/dist/orchestrator.js +106 -0
  60. package/dist/orchestrator.js.map +1 -0
  61. package/dist/scheduler.d.ts +15 -0
  62. package/dist/scheduler.d.ts.map +1 -0
  63. package/dist/scheduler.js +100 -0
  64. package/dist/scheduler.js.map +1 -0
  65. package/dist/types.d.ts +178 -0
  66. package/dist/types.d.ts.map +1 -0
  67. package/dist/types.js +3 -0
  68. package/dist/types.js.map +1 -0
  69. package/dist/worker.d.ts +16 -0
  70. package/dist/worker.d.ts.map +1 -0
  71. package/dist/worker.js +111 -0
  72. package/dist/worker.js.map +1 -0
  73. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scheduler.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worker.test.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG3C,MAAM,WAAW,GAAY;IAC3B,IAAI,EAAE,MAAM;IACZ,KAAK,CAAC,CAAC,YAAY;QACjB,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;QACnD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAA;IACrD,CAAC;CACF,CAAA;AAED,6CAA6C;AAC7C,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,IAAY,EAAE,UAA+C,EAAE;IAClG,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IACxC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,GAAG,IAAI,EAAE,EAAE;QACzD,MAAM;QACN,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS;QAClE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAC7B,IAAI,IAAI,GAAY,SAAS,CAAA;IAC7B,IAAI,CAAC;QAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACxC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AAC3C,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,MAAM,GAAiC,IAAI,CAAA;IAC/C,IAAI,mBAAwC,CAAA;IAE5C,UAAU,CAAC,GAAG,EAAE;QACd,oDAAoD;QACpD,mBAAmB,GAAG,OAAO,CAAC,IAAK,CAAA;QACnC,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAQ,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,EAAE,CAAA;YACd,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;QACD,OAAO,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;QAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;QAC1E,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QAE5B,8BAA8B;QAC9B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAE1C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;QAC1E,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QAE5B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAE1C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QAC/C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,cAAc,GAAmB,EAAE,CAAA;QAEzC,MAAM,aAAa,GAAc;YAC/B,IAAI,EAAE,gBAAgB;YACtB,cAAc,CAAC,MAAkB,EAAE,MAAkB;gBACnD,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,GAAQ,EAAE,GAAQ,EAAE,EAAE;oBACjD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;oBACrB,sBAAsB;oBACtB,MAAM,CAAC,UAAU,CAAC;wBAChB,SAAS,EAAE,gBAAgB;wBAC3B,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,QAAQ;wBAC/C,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ;wBAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,UAAU;wBACrC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO;wBAC1B,GAAG,EAAE,IAAI;qBACV,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;wBACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;oBACpC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;wBACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;oBAC9C,CAAC,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,YAAY;gBACV,OAAO;oBACL,KAAK,CAAC,YAAY,KAAI,CAAC;oBACvB,KAAK,CAAC,UAAU,KAAI,CAAC;oBACrB,KAAK,CAAC,SAAS,KAAI,CAAC;oBACpB,KAAK,CAAC,OAAO,KAAI,CAAC;iBACnB,CAAA;YACH,CAAC;SACF,CAAA;QAED,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,CAAC,aAAa,CAAC;SAC5B,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QAE5B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAE1C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;SACvF,CAAC,CAAA;QAEF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,IAAI,YAAY,GAAY,IAAI,CAAA;QAEhC,MAAM,WAAW,GAAc;YAC7B,IAAI,EAAE,cAAc;YACpB,cAAc,CAAC,MAAkB;gBAC/B,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAQ,EAAE,GAAQ,EAAE,EAAE;oBAC7C,YAAY,GAAG,GAAG,CAAC,IAAI,CAAA;oBACvB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC1C,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,YAAY;gBACV,OAAO;oBACL,KAAK,CAAC,YAAY,KAAI,CAAC;oBACvB,KAAK,CAAC,UAAU,KAAI,CAAC;oBACrB,KAAK,CAAC,SAAS,KAAI,CAAC;oBACpB,KAAK,CAAC,OAAO,KAAI,CAAC;iBACnB,CAAA;YACH,CAAC;SACF,CAAA;QAED,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,CAAC,WAAW,CAAC;SAC1B,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QAE5B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAE1C,MAAM,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE;YAC9B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;SACzC,CAAC,CAAA;QAEF,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -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"}
@@ -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"}
@@ -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"}