reviewflow 3.30.0 → 3.31.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.
- package/CHANGELOG.md +17 -0
- package/dist/dashboard/index.html +35 -11
- package/dist/dashboard/styles.css +139 -5
- package/dist/frameworks/claude/claudeInvoker.d.ts +7 -0
- package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
- package/dist/frameworks/claude/claudeInvoker.js +1 -1
- package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
- package/dist/main/routes.d.ts.map +1 -1
- package/dist/main/routes.js +6 -16
- package/dist/main/routes.js.map +1 -1
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.d.ts +1 -1
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.d.ts.map +1 -1
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.d.ts +1 -1
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.d.ts +2 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.d.ts.map +1 -1
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.js +1 -1
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.js.map +1 -1
- package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.d.ts +24 -0
- package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.d.ts.map +1 -0
- package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.js +2 -0
- package/dist/modules/ember-chat/entities/emberAnswer/emberAnswerTransport.gateway.js.map +1 -0
- package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.d.ts +2 -3
- package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.d.ts.map +1 -1
- package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.js +6 -4
- package/dist/modules/ember-chat/interface-adapters/controllers/http/emberChat.routes.js.map +1 -1
- package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.d.ts +46 -0
- package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.d.ts.map +1 -0
- package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.js +176 -0
- package/dist/modules/ember-chat/interface-adapters/gateways/emberAnswerTransport.claude.gateway.js.map +1 -0
- package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.d.ts +2 -1
- package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.d.ts.map +1 -1
- package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.js +8 -2
- package/dist/modules/ember-chat/interface-adapters/gateways/emberStreamJson.parser.js.map +1 -1
- package/dist/modules/ember-chat/interface-adapters/presenters/emberStatus.presenter.d.ts +1 -1
- package/dist/modules/ember-chat/interface-adapters/presenters/emberStatus.presenter.d.ts.map +1 -1
- package/dist/modules/ember-chat/services/emberSystemPrompt.d.ts.map +1 -1
- package/dist/modules/ember-chat/services/emberSystemPrompt.js +47 -4
- package/dist/modules/ember-chat/services/emberSystemPrompt.js.map +1 -1
- package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.d.ts +5 -4
- package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.d.ts.map +1 -1
- package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.js +61 -9
- package/dist/modules/ember-chat/usecases/askEmber/askEmber.usecase.js.map +1 -1
- package/dist/modules/ember-chat/usecases/askEmber/emberStream.d.ts +8 -0
- package/dist/modules/ember-chat/usecases/askEmber/emberStream.d.ts.map +1 -0
- package/dist/modules/ember-chat/usecases/askEmber/emberStream.js +2 -0
- package/dist/modules/ember-chat/usecases/askEmber/emberStream.js.map +1 -0
- package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.d.ts +2 -0
- package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.js +158 -0
- package/dist/tests/acceptance/190-ember-live-answers-subscription.acceptance.test.js.map +1 -0
- package/dist/tests/stubs/emberAnswerTransport.stub.d.ts +21 -0
- package/dist/tests/stubs/emberAnswerTransport.stub.d.ts.map +1 -0
- package/dist/tests/stubs/emberAnswerTransport.stub.js +54 -0
- package/dist/tests/stubs/emberAnswerTransport.stub.js.map +1 -0
- package/dist/tests/units/modules/ember-chat/controllers/emberChat.routes.test.js +21 -14
- package/dist/tests/units/modules/ember-chat/controllers/emberChat.routes.test.js.map +1 -1
- package/dist/tests/units/modules/ember-chat/gateways/emberStreamJson.parser.test.js +13 -0
- package/dist/tests/units/modules/ember-chat/gateways/emberStreamJson.parser.test.js.map +1 -1
- package/dist/tests/units/modules/ember-chat/services/emberSystemPrompt.test.js +19 -0
- package/dist/tests/units/modules/ember-chat/services/emberSystemPrompt.test.js.map +1 -1
- package/dist/tests/units/modules/ember-chat/usecases/askEmber.usecase.test.js +53 -20
- package/dist/tests/units/modules/ember-chat/usecases/askEmber.usecase.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.d.ts +0 -7
- package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.d.ts.map +0 -1
- package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.js +0 -3
- package/dist/modules/ember-chat/entities/emberSession/emberSession.schema.js.map +0 -1
- package/dist/modules/ember-chat/entities/emberSession/emberSessionState.d.ts +0 -13
- package/dist/modules/ember-chat/entities/emberSession/emberSessionState.d.ts.map +0 -1
- package/dist/modules/ember-chat/entities/emberSession/emberSessionState.js +0 -35
- package/dist/modules/ember-chat/entities/emberSession/emberSessionState.js.map +0 -1
- package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.d.ts +0 -26
- package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.d.ts.map +0 -1
- package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.js +0 -2
- package/dist/modules/ember-chat/entities/emberSession/emberSessionTransport.gateway.js.map +0 -1
- package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.d.ts +0 -13
- package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.d.ts.map +0 -1
- package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.js +0 -130
- package/dist/modules/ember-chat/interface-adapters/gateways/emberSessionTransport.claude.gateway.js.map +0 -1
- package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.d.ts +0 -36
- package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.d.ts.map +0 -1
- package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.js +0 -59
- package/dist/modules/ember-chat/usecases/emberSession/emberSessionRegistry.js.map +0 -1
- package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.d.ts +0 -2
- package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.d.ts.map +0 -1
- package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.js +0 -124
- package/dist/tests/acceptance/189-ember-readonly-review-chat.acceptance.test.js.map +0 -1
- package/dist/tests/stubs/emberSessionTransport.stub.d.ts +0 -18
- package/dist/tests/stubs/emberSessionTransport.stub.d.ts.map +0 -1
- package/dist/tests/stubs/emberSessionTransport.stub.js +0 -75
- package/dist/tests/stubs/emberSessionTransport.stub.js.map +0 -1
- package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.d.ts +0 -2
- package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.d.ts.map +0 -1
- package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.js +0 -42
- package/dist/tests/units/modules/ember-chat/entities/emberSessionState.test.js.map +0 -1
- package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.d.ts +0 -2
- package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.d.ts.map +0 -1
- package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.js +0 -88
- package/dist/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.js.map +0 -1
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { createIdleEmberSessionState } from '../../../../../modules/ember-chat/entities/emberSession/emberSessionState.js';
|
|
3
|
-
const IDLE_TIMEOUT_MS = 60_000;
|
|
4
|
-
describe('EmberSessionState', () => {
|
|
5
|
-
it('starts idle with no live process', () => {
|
|
6
|
-
const state = createIdleEmberSessionState();
|
|
7
|
-
expect(state.phase).toBe('idle');
|
|
8
|
-
});
|
|
9
|
-
it('becomes live when a question is asked', () => {
|
|
10
|
-
const state = createIdleEmberSessionState().onQuestion(new Date('2026-05-28T10:00:00Z'));
|
|
11
|
-
expect(state.phase).toBe('live');
|
|
12
|
-
});
|
|
13
|
-
it('stays live after an answer completes', () => {
|
|
14
|
-
const state = createIdleEmberSessionState()
|
|
15
|
-
.onQuestion(new Date('2026-05-28T10:00:00Z'))
|
|
16
|
-
.onAnswerDone(new Date('2026-05-28T10:00:05Z'));
|
|
17
|
-
expect(state.phase).toBe('live');
|
|
18
|
-
});
|
|
19
|
-
it('releases to idle when inactivity exceeds the timeout', () => {
|
|
20
|
-
const state = createIdleEmberSessionState()
|
|
21
|
-
.onQuestion(new Date('2026-05-28T10:00:00Z'))
|
|
22
|
-
.onAnswerDone(new Date('2026-05-28T10:00:05Z'))
|
|
23
|
-
.onIdleTick(new Date('2026-05-28T10:02:00Z'), IDLE_TIMEOUT_MS);
|
|
24
|
-
expect(state.phase).toBe('idle');
|
|
25
|
-
});
|
|
26
|
-
it('stays live when inactivity is within the timeout', () => {
|
|
27
|
-
const state = createIdleEmberSessionState()
|
|
28
|
-
.onQuestion(new Date('2026-05-28T10:00:00Z'))
|
|
29
|
-
.onAnswerDone(new Date('2026-05-28T10:00:05Z'))
|
|
30
|
-
.onIdleTick(new Date('2026-05-28T10:00:30Z'), IDLE_TIMEOUT_MS);
|
|
31
|
-
expect(state.phase).toBe('live');
|
|
32
|
-
});
|
|
33
|
-
it('reports needing a process when idle and a question arrives', () => {
|
|
34
|
-
const idle = createIdleEmberSessionState();
|
|
35
|
-
expect(idle.needsProcess()).toBe(true);
|
|
36
|
-
});
|
|
37
|
-
it('does not need a new process when already live', () => {
|
|
38
|
-
const live = createIdleEmberSessionState().onQuestion(new Date('2026-05-28T10:00:00Z'));
|
|
39
|
-
expect(live.needsProcess()).toBe(false);
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
//# sourceMappingURL=emberSessionState.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"emberSessionState.test.js","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/ember-chat/entities/emberSessionState.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AAE9G,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,2BAA2B,EAAE,CAAC;QAE5C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,2BAA2B,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAEzF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAG,2BAA2B,EAAE;aACxC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAC5C,YAAY,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAElD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,KAAK,GAAG,2BAA2B,EAAE;aACxC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAC5C,YAAY,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAC9C,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,eAAe,CAAC,CAAC;QAEjE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,KAAK,GAAG,2BAA2B,EAAE;aACxC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAC5C,YAAY,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;aAC9C,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,eAAe,CAAC,CAAC;QAEjE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,IAAI,GAAG,2BAA2B,EAAE,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,2BAA2B,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAExF,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"emberSessionRegistry.test.d.ts","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { StubEmberSessionTransportGateway } from '../../../../../tests/stubs/emberSessionTransport.stub.js';
|
|
3
|
-
import { EmberSessionRegistry } from '../../../../../modules/ember-chat/usecases/emberSession/emberSessionRegistry.js';
|
|
4
|
-
const SYSTEM_PROMPT = 'you are ember';
|
|
5
|
-
const PROJECT_PATH = '/projects/alpha';
|
|
6
|
-
function drain(subscribe) {
|
|
7
|
-
return new Promise((resolve) => {
|
|
8
|
-
let answer = '';
|
|
9
|
-
const statuses = [];
|
|
10
|
-
subscribe({
|
|
11
|
-
onStatus: (state) => statuses.push(state),
|
|
12
|
-
onChunk: (text) => {
|
|
13
|
-
answer += text;
|
|
14
|
-
},
|
|
15
|
-
onDone: () => resolve({ answer, statuses }),
|
|
16
|
-
onError: () => resolve({ answer, statuses }),
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
describe('EmberSessionRegistry', () => {
|
|
21
|
-
it('reuses one transport handle across consecutive questions', async () => {
|
|
22
|
-
const transport = new StubEmberSessionTransportGateway();
|
|
23
|
-
let clock = new Date('2026-05-28T10:00:00Z');
|
|
24
|
-
const registry = new EmberSessionRegistry({
|
|
25
|
-
transport,
|
|
26
|
-
now: () => clock,
|
|
27
|
-
idleTimeoutMs: 60_000,
|
|
28
|
-
});
|
|
29
|
-
const first = registry.ask({ question: 'q1', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
|
|
30
|
-
if (first.status === 'streaming') {
|
|
31
|
-
await drain(first.subscribe);
|
|
32
|
-
}
|
|
33
|
-
clock = new Date('2026-05-28T10:00:10Z');
|
|
34
|
-
const second = registry.ask({ question: 'q2', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
|
|
35
|
-
if (second.status === 'streaming') {
|
|
36
|
-
await drain(second.subscribe);
|
|
37
|
-
}
|
|
38
|
-
expect(transport.spawnCount).toBe(1);
|
|
39
|
-
});
|
|
40
|
-
it('emits a working then idle status sequence for one question', async () => {
|
|
41
|
-
const transport = new StubEmberSessionTransportGateway();
|
|
42
|
-
const registry = new EmberSessionRegistry({
|
|
43
|
-
transport,
|
|
44
|
-
now: () => new Date('2026-05-28T10:00:00Z'),
|
|
45
|
-
idleTimeoutMs: 60_000,
|
|
46
|
-
});
|
|
47
|
-
const result = registry.ask({ question: 'q', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
|
|
48
|
-
expect(result.status).toBe('streaming');
|
|
49
|
-
if (result.status !== 'streaming') {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const { statuses } = await drain(result.subscribe);
|
|
53
|
-
expect(statuses[0]).toBe('working');
|
|
54
|
-
expect(statuses.at(-1)).toBe('idle');
|
|
55
|
-
});
|
|
56
|
-
it('transparently revives with a fresh spawn after the idle timeout releases the session', async () => {
|
|
57
|
-
const transport = new StubEmberSessionTransportGateway();
|
|
58
|
-
let clock = new Date('2026-05-28T10:00:00Z');
|
|
59
|
-
const registry = new EmberSessionRegistry({
|
|
60
|
-
transport,
|
|
61
|
-
now: () => clock,
|
|
62
|
-
idleTimeoutMs: 60_000,
|
|
63
|
-
});
|
|
64
|
-
const first = registry.ask({ question: 'q1', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
|
|
65
|
-
if (first.status === 'streaming') {
|
|
66
|
-
await drain(first.subscribe);
|
|
67
|
-
}
|
|
68
|
-
clock = new Date('2026-05-28T10:05:00Z');
|
|
69
|
-
registry.onIdle(clock);
|
|
70
|
-
const second = registry.ask({ question: 'q2', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
|
|
71
|
-
if (second.status === 'streaming') {
|
|
72
|
-
await drain(second.subscribe);
|
|
73
|
-
}
|
|
74
|
-
expect(transport.spawnCount).toBe(2);
|
|
75
|
-
});
|
|
76
|
-
it('returns unavailable when the transport fails to spawn', () => {
|
|
77
|
-
const transport = new StubEmberSessionTransportGateway();
|
|
78
|
-
transport.failSpawn();
|
|
79
|
-
const registry = new EmberSessionRegistry({
|
|
80
|
-
transport,
|
|
81
|
-
now: () => new Date('2026-05-28T10:00:00Z'),
|
|
82
|
-
idleTimeoutMs: 60_000,
|
|
83
|
-
});
|
|
84
|
-
const result = registry.ask({ question: 'q', systemPrompt: SYSTEM_PROMPT, projectPath: PROJECT_PATH });
|
|
85
|
-
expect(result.status).toBe('unavailable');
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
//# sourceMappingURL=emberSessionRegistry.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"emberSessionRegistry.test.js","sourceRoot":"","sources":["../../../../../../src/tests/units/modules/ember-chat/usecases/emberSessionRegistry.test.ts"],"names":[],"mappings":"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"}
|