@siduri-x/api 1.0.0 → 1.0.2

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.
@@ -1,119 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const supertest_1 = __importDefault(require("supertest"));
7
- const app_1 = require("./app");
8
- const runtime_1 = require("./runtime");
9
- describe('T7 Release Readiness End-to-End Verification Suite', () => {
10
- let mockBrain;
11
- let mockMemory;
12
- let mockKnowledge;
13
- let mockBehavior;
14
- let mockVoiceAdapter;
15
- let mockAvatarAdapter;
16
- let runtime;
17
- let app;
18
- beforeEach(async () => {
19
- mockBrain = {
20
- generatePlan: jest.fn().mockImplementation(async (ctx) => ({
21
- speech: 'Verified neutral response.',
22
- language: 'en',
23
- })),
24
- };
25
- mockMemory = {
26
- initialize: jest.fn().mockResolvedValue(undefined),
27
- searchClaims: jest.fn().mockResolvedValue([]),
28
- getClaims: jest.fn().mockResolvedValue([]),
29
- getDirectives: jest.fn().mockResolvedValue([]),
30
- getPendingClaims: jest.fn().mockResolvedValue([]),
31
- proposeClaim: jest.fn().mockResolvedValue({ id: 'claim-t7-1', status: 'PENDING' }),
32
- approveClaim: jest.fn().mockResolvedValue(undefined),
33
- rejectClaim: jest.fn().mockResolvedValue(undefined),
34
- };
35
- mockKnowledge = { search: jest.fn().mockResolvedValue([]) };
36
- mockBehavior = { compile: jest.fn().mockResolvedValue('') };
37
- mockVoiceAdapter = {
38
- kind: 'voice',
39
- handleEvent: jest.fn().mockImplementation(async (event) => ({
40
- accepted: true,
41
- eventId: event.eventId,
42
- lifecycle: 'STARTED',
43
- metadata: { speechId: 'speech-t7-verified' },
44
- })),
45
- };
46
- mockAvatarAdapter = {
47
- kind: 'avatar',
48
- handleEvent: jest.fn().mockImplementation(async (event) => ({
49
- accepted: true,
50
- eventId: event.eventId,
51
- lifecycle: 'STARTED',
52
- })),
53
- };
54
- const config = {
55
- name: 'NeutralCompanion',
56
- brain: { provider: 'openrouter' },
57
- memory: { provider: 'postgres' },
58
- knowledge: { provider: 'e-knowledge' },
59
- behavior: { provider: 'active-self' },
60
- voice: { provider: 'voicevox' },
61
- vision: { provider: 'none' },
62
- body: { provider: 'live2d' },
63
- };
64
- runtime = new runtime_1.SiduriRuntime('companion-a', config, {
65
- brain: mockBrain,
66
- memory: mockMemory,
67
- knowledge: mockKnowledge,
68
- behavior: mockBehavior,
69
- voice: mockVoiceAdapter,
70
- body: mockAvatarAdapter,
71
- });
72
- await runtime.initialize();
73
- const runtimes = new Map([['companion-a', runtime]]);
74
- const created = (0, app_1.createApp)(runtimes);
75
- app = created.app;
76
- });
77
- // 1. R2 Blank slate: /me returns neutral actor/auth metadata with no invented identity
78
- test('R2 Gate: /me returns neutral actor and auth role without inventing a name', async () => {
79
- const res = await (0, supertest_1.default)(app).get('/me');
80
- expect(res.status).toBe(200);
81
- expect(res.body.role).toBe('VIEWER');
82
- expect(res.body.actorId).toBe('anonymous-session');
83
- expect(res.body.authenticated).toBe(false);
84
- expect(res.body.name).toBeUndefined();
85
- });
86
- // 2. Full Positive Flow: Message -> T4 Gating -> Approved -> ExperienceEvents -> Voice & Avatar Adapters
87
- test('R6/R8 Gate: Full positive end-to-end flow dispatches to voice and avatar adapters', async () => {
88
- const res = await (0, supertest_1.default)(app)
89
- .post('/chat')
90
- .send({
91
- companionId: 'companion-a',
92
- message: 'Hello neutral companion',
93
- history: [],
94
- });
95
- expect(res.status).toBe(200);
96
- expect(res.body.status).toBe('APPROVED');
97
- expect(mockVoiceAdapter.handleEvent).toHaveBeenCalledTimes(1);
98
- expect(mockAvatarAdapter.handleEvent).toHaveBeenCalledTimes(1);
99
- const voiceArg = mockVoiceAdapter.handleEvent.mock.calls[0][0];
100
- expect(voiceArg.approval).toBe('APPROVED');
101
- expect(voiceArg.kind).toBe('voice');
102
- expect(voiceArg.text).toBe('Verified neutral response.');
103
- });
104
- // 3. Full Negative Flow: Staged gating halts ExperienceEvent dispatch
105
- test('R5/R6 Gate: Unapproved staged plan halts ExperienceEvent creation and external side effects', async () => {
106
- const stageRes = await (0, supertest_1.default)(app)
107
- .post('/dev/mock-response')
108
- .send({
109
- companionId: 'companion-a',
110
- correlation_id: 'corr-t7-staged',
111
- speech: 'Staged unapproved speech',
112
- requiresApproval: true,
113
- });
114
- expect(stageRes.status).toBe(200);
115
- expect(stageRes.body.staged).toBe(true);
116
- expect(mockVoiceAdapter.handleEvent).not.toHaveBeenCalled();
117
- expect(mockAvatarAdapter.handleEvent).not.toHaveBeenCalled();
118
- });
119
- });