@tienne/gestalt 0.106.0 → 0.107.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/dist/package.json +1 -1
- package/dist/plugin/skills/interview/SKILL.md +47 -8
- package/dist/plugin/skills/solve/SKILL.md +3 -3
- package/dist/plugin/skills/spec/SKILL.md +4 -4
- package/dist/schemas/gestalt.schema.json +6 -0
- package/dist/src/agent/role-consensus-engine.d.ts.map +1 -1
- package/dist/src/agent/role-consensus-engine.js +1 -1
- package/dist/src/agent/role-consensus-engine.js.map +1 -1
- package/dist/src/agent/role-prompt-generator.d.ts.map +1 -1
- package/dist/src/agent/role-prompt-generator.js +1 -2
- package/dist/src/agent/role-prompt-generator.js.map +1 -1
- package/dist/src/cli/commands/interview.d.ts +1 -0
- package/dist/src/cli/commands/interview.d.ts.map +1 -1
- package/dist/src/cli/commands/interview.js +5 -3
- package/dist/src/cli/commands/interview.js.map +1 -1
- package/dist/src/cli/commands/spec.d.ts.map +1 -1
- package/dist/src/cli/commands/spec.js +2 -2
- package/dist/src/cli/commands/spec.js.map +1 -1
- package/dist/src/core/config.d.ts +19 -0
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +23 -15
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/constants.d.ts +5 -0
- package/dist/src/core/constants.d.ts.map +1 -1
- package/dist/src/core/constants.js +5 -0
- package/dist/src/core/constants.js.map +1 -1
- package/dist/src/core/errors.d.ts +3 -1
- package/dist/src/core/errors.d.ts.map +1 -1
- package/dist/src/core/errors.js +6 -2
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/types.d.ts +51 -2
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/events/types.d.ts +2 -0
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +2 -0
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/execute/orchestrators/evolution.d.ts.map +1 -1
- package/dist/src/execute/orchestrators/evolution.js +4 -0
- package/dist/src/execute/orchestrators/evolution.js.map +1 -1
- package/dist/src/execute/passthrough-engine.d.ts +6 -0
- package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
- package/dist/src/execute/passthrough-engine.js +10 -0
- package/dist/src/execute/passthrough-engine.js.map +1 -1
- package/dist/src/execute/termination-detector.d.ts +3 -0
- package/dist/src/execute/termination-detector.d.ts.map +1 -1
- package/dist/src/execute/termination-detector.js +2 -3
- package/dist/src/execute/termination-detector.js.map +1 -1
- package/dist/src/gestalt/analyzer.d.ts +1 -1
- package/dist/src/gestalt/analyzer.d.ts.map +1 -1
- package/dist/src/gestalt/analyzer.js +3 -2
- package/dist/src/gestalt/analyzer.js.map +1 -1
- package/dist/src/gestalt/signals.d.ts +20 -0
- package/dist/src/gestalt/signals.d.ts.map +1 -0
- package/dist/src/gestalt/signals.js +112 -0
- package/dist/src/gestalt/signals.js.map +1 -0
- package/dist/src/interview/engine.d.ts +9 -1
- package/dist/src/interview/engine.d.ts.map +1 -1
- package/dist/src/interview/engine.js +40 -11
- package/dist/src/interview/engine.js.map +1 -1
- package/dist/src/interview/passthrough-engine.d.ts +31 -7
- package/dist/src/interview/passthrough-engine.d.ts.map +1 -1
- package/dist/src/interview/passthrough-engine.js +87 -28
- package/dist/src/interview/passthrough-engine.js.map +1 -1
- package/dist/src/interview/repository.d.ts +6 -1
- package/dist/src/interview/repository.d.ts.map +1 -1
- package/dist/src/interview/repository.js +20 -2
- package/dist/src/interview/repository.js.map +1 -1
- package/dist/src/interview/rescore.d.ts +35 -0
- package/dist/src/interview/rescore.d.ts.map +1 -0
- package/dist/src/interview/rescore.js +92 -0
- package/dist/src/interview/rescore.js.map +1 -0
- package/dist/src/interview/resolution.d.ts +5 -1
- package/dist/src/interview/resolution.d.ts.map +1 -1
- package/dist/src/interview/resolution.js +15 -4
- package/dist/src/interview/resolution.js.map +1 -1
- package/dist/src/interview/session.d.ts +12 -2
- package/dist/src/interview/session.d.ts.map +1 -1
- package/dist/src/interview/session.js +57 -5
- package/dist/src/interview/session.js.map +1 -1
- package/dist/src/llm/prompts.d.ts +8 -0
- package/dist/src/llm/prompts.d.ts.map +1 -1
- package/dist/src/llm/prompts.js +7 -0
- package/dist/src/llm/prompts.js.map +1 -1
- package/dist/src/mcp/schemas.d.ts +26 -20
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +11 -3
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +10 -4
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/execute/evaluate.d.ts.map +1 -1
- package/dist/src/mcp/tools/execute/evaluate.js +3 -3
- package/dist/src/mcp/tools/execute/evaluate.js.map +1 -1
- package/dist/src/mcp/tools/interview-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/interview-passthrough.js +40 -34
- package/dist/src/mcp/tools/interview-passthrough.js.map +1 -1
- package/dist/src/mcp/tools/spec-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/spec-passthrough.js +7 -0
- package/dist/src/mcp/tools/spec-passthrough.js.map +1 -1
- package/dist/src/mcp/tools/status.d.ts.map +1 -1
- package/dist/src/mcp/tools/status.js +6 -1
- package/dist/src/mcp/tools/status.js.map +1 -1
- package/dist/src/research/schema.d.ts +3 -3
- package/dist/src/spec/extractor.js +1 -1
- package/dist/src/spec/extractor.js.map +1 -1
- package/dist/src/spec/generator.d.ts +3 -1
- package/dist/src/spec/generator.d.ts.map +1 -1
- package/dist/src/spec/generator.js +6 -4
- package/dist/src/spec/generator.js.map +1 -1
- package/dist/src/spec/passthrough-generator.d.ts +3 -1
- package/dist/src/spec/passthrough-generator.d.ts.map +1 -1
- package/dist/src/spec/passthrough-generator.js +6 -4
- package/dist/src/spec/passthrough-generator.js.map +1 -1
- package/dist/src/spec/schema.d.ts +5 -5
- package/dist/src/spec/schema.js +1 -1
- package/dist/src/spec/schema.js.map +1 -1
- package/package.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/commands/gestalt-interview.md +2 -1
- package/plugin/mcp.json +1 -1
- package/plugin/skills/interview/SKILL.md +47 -8
- package/plugin/skills/solve/SKILL.md +3 -3
- package/plugin/skills/spec/SKILL.md +4 -4
- package/schemas/gestalt.schema.json +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../../src/gestalt/signals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAE1B,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,oCAAoC;AACpC,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAsBrD,CAAC;AAEF,sCAAsC;AACtC,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAU/C,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,uBAAuB,CAEvF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI1D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,eAAe,GAAG,IAAI,GAChC,iBAAiB,CAyCnB;AAUD,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAOxF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/** 이보다 긴 답은 위임 패턴이 들어 있어도 세지 않는다. 긴 답 속 "나중에"까지 세면 잘못 세는 경우가 많아진다 */
|
|
2
|
+
export const DEFERRED_ANSWER_MAX_LENGTH = 40;
|
|
3
|
+
/** 사용자가 결정을 넘긴 답. 답 전체가 짧을 때만 본다 */
|
|
4
|
+
export const DEFERRED_ANSWER_PATTERNS = [
|
|
5
|
+
/알아서/,
|
|
6
|
+
/모르겠/,
|
|
7
|
+
/몰라/,
|
|
8
|
+
/나중에/,
|
|
9
|
+
/상관\s*없/,
|
|
10
|
+
/아무거나/,
|
|
11
|
+
/아무렇게나/,
|
|
12
|
+
/편한\s*대로/,
|
|
13
|
+
/맡길게|맡겨/,
|
|
14
|
+
/미정/,
|
|
15
|
+
/글쎄/,
|
|
16
|
+
/up to you/i,
|
|
17
|
+
/your call/i,
|
|
18
|
+
/you decide/i,
|
|
19
|
+
/don'?t know/i,
|
|
20
|
+
/not sure/i,
|
|
21
|
+
/no idea/i,
|
|
22
|
+
/whatever/i,
|
|
23
|
+
/doesn'?t matter/i,
|
|
24
|
+
/\blater\b/i,
|
|
25
|
+
/\btbd\b/i,
|
|
26
|
+
];
|
|
27
|
+
/** 이 점수 이상인 차원을 "자신 있게 매긴 차원"으로 본다 */
|
|
28
|
+
export const CONFIDENT_DIMENSION_CLARITY = 0.8;
|
|
29
|
+
const DIMENSION_NAMES = [
|
|
30
|
+
'goalClarity',
|
|
31
|
+
'constraintClarity',
|
|
32
|
+
'successCriteria',
|
|
33
|
+
'priorityClarity',
|
|
34
|
+
'contextClarity',
|
|
35
|
+
];
|
|
36
|
+
export function isResolutionDimensionName(name) {
|
|
37
|
+
return DIMENSION_NAMES.includes(name);
|
|
38
|
+
}
|
|
39
|
+
export function isDeferredAnswer(response) {
|
|
40
|
+
const trimmed = response.trim();
|
|
41
|
+
if (trimmed === '' || trimmed.length > DEFERRED_ANSWER_MAX_LENGTH)
|
|
42
|
+
return false;
|
|
43
|
+
return DEFERRED_ANSWER_PATTERNS.some((p) => p.test(trimmed));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 채점 하나에 붙는 신호를 세션 상태로 센다. LLM에게 묻지 않는다.
|
|
47
|
+
*
|
|
48
|
+
* @param session 채점 직전 세션. 라운드와 질문 주제를 읽는다
|
|
49
|
+
* @param score 지금 들어온 채점
|
|
50
|
+
* @param prevScore 직전 채점. 첫 채점이면 null
|
|
51
|
+
*/
|
|
52
|
+
export function computeSignals(session, score, prevScore) {
|
|
53
|
+
let answeredRounds = 0;
|
|
54
|
+
let emptyRounds = 0;
|
|
55
|
+
let deferredRounds = 0;
|
|
56
|
+
// 답을 기다리는 마지막 라운드(userResponse === null)는 빈 답으로 세지 않는다
|
|
57
|
+
for (const round of session.rounds) {
|
|
58
|
+
if (round.userResponse === null)
|
|
59
|
+
continue;
|
|
60
|
+
if (round.userResponse.trim() === '') {
|
|
61
|
+
emptyRounds++;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
answeredRounds++;
|
|
65
|
+
if (isDeferredAnswer(round.userResponse))
|
|
66
|
+
deferredRounds++;
|
|
67
|
+
}
|
|
68
|
+
const askedPrinciples = new Set(session.rounds.map((r) => r.gestaltFocus));
|
|
69
|
+
const unaskedConfidentDimensions = score.dimensions
|
|
70
|
+
.filter((d) => d.clarity >= CONFIDENT_DIMENSION_CLARITY)
|
|
71
|
+
.filter((d) => !askedPrinciples.has(d.gestaltPrinciple))
|
|
72
|
+
.map((d) => d.name)
|
|
73
|
+
.filter(isResolutionDimensionName);
|
|
74
|
+
const overallJump = prevScore ? round4(score.overall - prevScore.overall) : null;
|
|
75
|
+
const prevMax = prevScore?.signals?.maxOverallJump ?? null;
|
|
76
|
+
const maxOverallJump = overallJump === null
|
|
77
|
+
? prevMax
|
|
78
|
+
: prevMax === null
|
|
79
|
+
? overallJump
|
|
80
|
+
: Math.max(prevMax, overallJump);
|
|
81
|
+
return {
|
|
82
|
+
answeredRounds,
|
|
83
|
+
emptyRounds,
|
|
84
|
+
deferredRounds,
|
|
85
|
+
unaskedConfidentDimensions,
|
|
86
|
+
overallJump,
|
|
87
|
+
maxOverallJump,
|
|
88
|
+
llmDerived: { contradictions: score.contradictions?.length ?? 0 },
|
|
89
|
+
...(prevScore?.signals?.rescore && { rescore: prevScore.signals.rescore }),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const DIMENSION_SHORT_LABELS = {
|
|
93
|
+
goalClarity: '목표',
|
|
94
|
+
constraintClarity: '제약',
|
|
95
|
+
successCriteria: '성공 기준',
|
|
96
|
+
priorityClarity: '우선순위',
|
|
97
|
+
contextClarity: '맥락',
|
|
98
|
+
};
|
|
99
|
+
/** ges_status에 붙는 신호 한 줄. 예: `답변 6/7, 위임 답변 1, 안 물은 차원: 우선순위` */
|
|
100
|
+
export function formatSignalLine(signals, totalRounds) {
|
|
101
|
+
const parts = [`답변 ${signals.answeredRounds}/${totalRounds}`];
|
|
102
|
+
if (signals.emptyRounds > 0)
|
|
103
|
+
parts.push(`빈 답변 ${signals.emptyRounds}`);
|
|
104
|
+
parts.push(`위임 답변 ${signals.deferredRounds}`);
|
|
105
|
+
const unasked = signals.unaskedConfidentDimensions.map((d) => DIMENSION_SHORT_LABELS[d]);
|
|
106
|
+
parts.push(`안 물은 차원: ${unasked.length > 0 ? unasked.join(', ') : '없음'}`);
|
|
107
|
+
return parts.join(', ');
|
|
108
|
+
}
|
|
109
|
+
function round4(value) {
|
|
110
|
+
return Math.round(value * 10000) / 10000;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../../src/gestalt/signals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { InterviewSession, ResolutionScore, ProjectType } from '../core/types.js';
|
|
2
2
|
import { InterviewError } from '../core/errors.js';
|
|
3
3
|
import { type Result } from '../core/result.js';
|
|
4
|
+
import { type InterviewOptions } from './session.js';
|
|
4
5
|
import type { LLMAdapter } from '../llm/types.js';
|
|
5
6
|
import { EventStore } from '../events/store.js';
|
|
6
7
|
export interface StartResult {
|
|
@@ -19,15 +20,22 @@ export declare class InterviewEngine {
|
|
|
19
20
|
private sessionManager;
|
|
20
21
|
private questionGenerator;
|
|
21
22
|
private resolutionScorer;
|
|
23
|
+
private resolutionThreshold;
|
|
24
|
+
private rescoreSetting;
|
|
22
25
|
/**
|
|
23
26
|
* @param llm 질문 생성에 쓰는 기본 어댑터
|
|
24
27
|
* @param frugalLlm 해상도 점수 산정용 저비용 어댑터. 없으면 `llm`을 그대로 쓴다.
|
|
25
28
|
* 점수 산정은 정해진 기준에 점수를 매기는 작업이라 질문 생성만큼의 모델이 필요 없다.
|
|
26
29
|
*/
|
|
27
|
-
constructor(llm: LLMAdapter, eventStore: EventStore, frugalLlm?: LLMAdapter);
|
|
30
|
+
constructor(llm: LLMAdapter, eventStore: EventStore, frugalLlm?: LLMAdapter, options?: InterviewOptions);
|
|
28
31
|
start(topic: string, cwd?: string): Promise<Result<StartResult, InterviewError>>;
|
|
29
32
|
respond(sessionId: string, response: string): Promise<Result<RespondResult, InterviewError>>;
|
|
30
33
|
score(sessionId: string): Promise<Result<ResolutionScore, InterviewError>>;
|
|
34
|
+
/**
|
|
35
|
+
* 채점을 기록하고 다시 채점할 차례면 같은 모델로 한 번 더 부른다.
|
|
36
|
+
* gate가 판정을 미뤘으면 다음 질문에 쓸 원칙을 돌려준다.
|
|
37
|
+
*/
|
|
38
|
+
private recordScore;
|
|
31
39
|
complete(sessionId: string, force?: boolean): Result<InterviewSession, InterviewError>;
|
|
32
40
|
getSession(sessionId: string): InterviewSession;
|
|
33
41
|
getLatestSession(): InterviewSession | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/interview/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/interview/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,WAAW,EAEZ,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,mBAAmB,CAAC;AAIzD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,qBAAa,eAAe;IAcxB,OAAO,CAAC,UAAU;IAbpB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,cAAc,CAAiB;IAEvC;;;;OAIG;gBAED,GAAG,EAAE,UAAU,EACP,UAAU,EAAE,UAAU,EAC9B,SAAS,CAAC,EAAE,UAAU,EACtB,OAAO,GAAE,gBAAqB;IAU1B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAqChF,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IA8D3C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAiBhF;;;OAGG;YACW,WAAW;IAuCzB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC;IAUpF,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB;IAI/C,gBAAgB,IAAI,gBAAgB,GAAG,IAAI;IAI3C,YAAY,IAAI,gBAAgB,EAAE;CAGnC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { MAX_INTERVIEW_ROUNDS } from '../core/constants.js';
|
|
1
|
+
import { MAX_INTERVIEW_ROUNDS, RESOLUTION_THRESHOLD } from '../core/constants.js';
|
|
2
|
+
import { logger } from '../core/logger.js';
|
|
2
3
|
import { InterviewError } from '../core/errors.js';
|
|
3
4
|
import { ok, err } from '../core/result.js';
|
|
4
5
|
import { selectNextPrinciple } from '../gestalt/principles.js';
|
|
@@ -6,23 +7,28 @@ import { ResolutionScorer } from './resolution.js';
|
|
|
6
7
|
import { QuestionGenerator } from './questions.js';
|
|
7
8
|
import { SessionManager } from './session.js';
|
|
8
9
|
import { detectProjectType } from './brownfield.js';
|
|
10
|
+
import { recordScoreWithRescore, applyRescore } from './rescore.js';
|
|
9
11
|
import { EventType } from '../events/types.js';
|
|
10
12
|
export class InterviewEngine {
|
|
11
13
|
eventStore;
|
|
12
14
|
sessionManager;
|
|
13
15
|
questionGenerator;
|
|
14
16
|
resolutionScorer;
|
|
17
|
+
resolutionThreshold;
|
|
18
|
+
rescoreSetting;
|
|
15
19
|
/**
|
|
16
20
|
* @param llm 질문 생성에 쓰는 기본 어댑터
|
|
17
21
|
* @param frugalLlm 해상도 점수 산정용 저비용 어댑터. 없으면 `llm`을 그대로 쓴다.
|
|
18
22
|
* 점수 산정은 정해진 기준에 점수를 매기는 작업이라 질문 생성만큼의 모델이 필요 없다.
|
|
19
23
|
*/
|
|
20
|
-
constructor(llm, eventStore, frugalLlm) {
|
|
24
|
+
constructor(llm, eventStore, frugalLlm, options = {}) {
|
|
21
25
|
this.eventStore = eventStore;
|
|
22
|
-
this.sessionManager = new SessionManager(eventStore);
|
|
26
|
+
this.sessionManager = new SessionManager(eventStore, options);
|
|
23
27
|
this.sessionManager.loadFromStore();
|
|
24
28
|
this.questionGenerator = new QuestionGenerator(llm);
|
|
25
|
-
this.resolutionScorer = new ResolutionScorer(frugalLlm ?? llm);
|
|
29
|
+
this.resolutionScorer = new ResolutionScorer(frugalLlm ?? llm, options.resolutionThreshold);
|
|
30
|
+
this.resolutionThreshold = options.resolutionThreshold ?? RESOLUTION_THRESHOLD;
|
|
31
|
+
this.rescoreSetting = options.rescore ?? 'record';
|
|
26
32
|
}
|
|
27
33
|
async start(topic, cwd) {
|
|
28
34
|
try {
|
|
@@ -61,14 +67,15 @@ export class InterviewEngine {
|
|
|
61
67
|
}
|
|
62
68
|
// Score resolution
|
|
63
69
|
const resolutionScore = await this.resolutionScorer.score(session.topic, session.rounds, session.projectType);
|
|
64
|
-
this.
|
|
70
|
+
const afterRescore = await this.recordScore(sessionId, resolutionScore);
|
|
65
71
|
// Select next principle based on current state
|
|
66
72
|
const hasContradictions = (resolutionScore.contradictions?.length ?? 0) > 0;
|
|
67
|
-
const nextPrinciple =
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
const nextPrinciple = afterRescore ??
|
|
74
|
+
selectNextPrinciple({
|
|
75
|
+
roundNumber: session.rounds.length + 1,
|
|
76
|
+
dimensions: resolutionScore.dimensions,
|
|
77
|
+
hasContradictions,
|
|
78
|
+
});
|
|
72
79
|
this.eventStore.append('interview', sessionId, EventType.GESTALT_PRINCIPLE_APPLIED, {
|
|
73
80
|
principle: nextPrinciple,
|
|
74
81
|
roundNumber: session.rounds.length + 1,
|
|
@@ -90,13 +97,35 @@ export class InterviewEngine {
|
|
|
90
97
|
try {
|
|
91
98
|
const session = this.sessionManager.get(sessionId);
|
|
92
99
|
const resolutionScore = await this.resolutionScorer.score(session.topic, session.rounds, session.projectType);
|
|
93
|
-
this.
|
|
100
|
+
await this.recordScore(sessionId, resolutionScore);
|
|
94
101
|
return ok(resolutionScore);
|
|
95
102
|
}
|
|
96
103
|
catch (e) {
|
|
97
104
|
return err(new InterviewError(`Failed to score: ${e instanceof Error ? e.message : String(e)}`));
|
|
98
105
|
}
|
|
99
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* 채점을 기록하고 다시 채점할 차례면 같은 모델로 한 번 더 부른다.
|
|
109
|
+
* gate가 판정을 미뤘으면 다음 질문에 쓸 원칙을 돌려준다.
|
|
110
|
+
*/
|
|
111
|
+
async recordScore(sessionId, score) {
|
|
112
|
+
const request = recordScoreWithRescore(this.sessionManager, sessionId, score, this.rescoreSetting, this.resolutionThreshold);
|
|
113
|
+
if (!request)
|
|
114
|
+
return null;
|
|
115
|
+
const session = this.sessionManager.get(sessionId);
|
|
116
|
+
let second;
|
|
117
|
+
try {
|
|
118
|
+
second = await this.resolutionScorer.rescore(session.topic, session.rounds, session.projectType);
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
// 다시 채점이 실패해도 인터뷰는 이어간다. gate면 다음에 넘을 때 다시 부른다
|
|
122
|
+
const error = e instanceof Error ? e.message : String(e);
|
|
123
|
+
logger.warn('interview.rescore.failed', { sessionId, error });
|
|
124
|
+
this.sessionManager.recordRescoreFailure(sessionId, error);
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
return applyRescore(this.sessionManager, sessionId, score, second, 'isolated', this.rescoreSetting, this.resolutionThreshold).principle;
|
|
128
|
+
}
|
|
100
129
|
complete(sessionId, force = false) {
|
|
101
130
|
try {
|
|
102
131
|
return ok(this.sessionManager.complete(sessionId, { force }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/interview/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/interview/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { InterviewSession, ResolutionScore, ProjectType, GestaltPrinciple } from '../core/types.js';
|
|
1
|
+
import type { InterviewSession, ResolutionScore, ProjectType, GestaltPrinciple, RescoreMode, RescoreResult } from '../core/types.js';
|
|
2
2
|
import { InterviewError } from '../core/errors.js';
|
|
3
3
|
import { type Result } from '../core/result.js';
|
|
4
|
-
import { SessionManager } from './session.js';
|
|
4
|
+
import { SessionManager, type InterviewOptions } from './session.js';
|
|
5
5
|
import { EventStore } from '../events/store.js';
|
|
6
6
|
import type { AgentRegistry } from '../agent/registry.js';
|
|
7
7
|
export interface GestaltContext {
|
|
@@ -29,6 +29,26 @@ export interface PassthroughRespondResult {
|
|
|
29
29
|
compressionPrompt: string;
|
|
30
30
|
};
|
|
31
31
|
needsCompression?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* 다시 채점하기를 요청할 차례면 붙는 프롬프트. record는 처음 기준값을 넘을 때 한 번, gate는 다시 채점을
|
|
34
|
+
* 받기 전까지 넘을 때마다 붙고 off면 안 붙는다. 이때 nextAction은 rescore다
|
|
35
|
+
*/
|
|
36
|
+
rescorePrompt?: string;
|
|
37
|
+
nextAction?: 'rescore';
|
|
38
|
+
}
|
|
39
|
+
export interface PassthroughScoreResult {
|
|
40
|
+
resolutionScore: ResolutionScore | null;
|
|
41
|
+
scoringPrompt?: string;
|
|
42
|
+
rescorePrompt?: string;
|
|
43
|
+
nextAction?: 'rescore';
|
|
44
|
+
/** rescore: true로 받은 채점의 비교 결과 */
|
|
45
|
+
rescore?: RescoreResult;
|
|
46
|
+
/** gate가 판정을 미뤘을 때 다음 질문을 만들 컨텍스트 */
|
|
47
|
+
gestaltContext?: GestaltContext;
|
|
48
|
+
}
|
|
49
|
+
export interface RescoreOptions {
|
|
50
|
+
rescore?: boolean;
|
|
51
|
+
rescoreMode?: RescoreMode;
|
|
32
52
|
}
|
|
33
53
|
export interface ExternalResolutionScore {
|
|
34
54
|
goalClarity: number;
|
|
@@ -42,18 +62,22 @@ export declare class PassthroughEngine {
|
|
|
42
62
|
private eventStore;
|
|
43
63
|
private sessionManager;
|
|
44
64
|
private agentRegistry?;
|
|
45
|
-
|
|
65
|
+
private resolutionThreshold;
|
|
66
|
+
private rescoreSetting;
|
|
67
|
+
constructor(eventStore: EventStore, agentRegistry?: AgentRegistry, options?: InterviewOptions);
|
|
46
68
|
start(topic: string, cwd?: string, memoryContextStr?: string): Result<PassthroughStartResult, InterviewError>;
|
|
47
69
|
respond(sessionId: string, response: string, generatedQuestion: string, externalScore?: ExternalResolutionScore): Result<PassthroughRespondResult, InterviewError>;
|
|
48
|
-
score(sessionId: string, externalScore?: ExternalResolutionScore): Result<
|
|
49
|
-
resolutionScore: ResolutionScore | null;
|
|
50
|
-
scoringPrompt?: string;
|
|
51
|
-
}, InterviewError>;
|
|
70
|
+
score(sessionId: string, externalScore?: ExternalResolutionScore, options?: RescoreOptions): Result<PassthroughScoreResult, InterviewError>;
|
|
52
71
|
complete(sessionId: string, force?: boolean): Result<InterviewSession, InterviewError>;
|
|
53
72
|
getSession(sessionId: string): InterviewSession;
|
|
54
73
|
getSessionManager(): SessionManager;
|
|
55
74
|
getLatestSession(): InterviewSession | null;
|
|
56
75
|
listSessions(): InterviewSession[];
|
|
76
|
+
/** 채점을 세션에 넣는다. 다시 채점하기를 요청할 차례면 rounds로 만든 프롬프트를 돌려준다 */
|
|
77
|
+
private recordScore;
|
|
78
|
+
private rescore;
|
|
79
|
+
/** 직전 respond가 이 라운드용으로 고른 원칙. 첫 라운드나 기록이 없으면 null */
|
|
80
|
+
private appliedPrinciple;
|
|
57
81
|
private buildGestaltContext;
|
|
58
82
|
}
|
|
59
83
|
//# sourceMappingURL=passthrough-engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passthrough-engine.d.ts","sourceRoot":"","sources":["../../../src/interview/passthrough-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,
|
|
1
|
+
{"version":3,"file":"passthrough-engine.d.ts","sourceRoot":"","sources":["../../../src/interview/passthrough-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { MAX_INTERVIEW_ROUNDS, PRINCIPLE_QUESTION_STRATEGIES } from '../core/constants.js';
|
|
1
|
+
import { MAX_INTERVIEW_ROUNDS, PRINCIPLE_QUESTION_STRATEGIES, RESOLUTION_THRESHOLD, } from '../core/constants.js';
|
|
2
2
|
import { InterviewError } from '../core/errors.js';
|
|
3
3
|
import { ok, err } from '../core/result.js';
|
|
4
4
|
import { selectNextPrinciple, getPrinciplePhaseLabel } from '../gestalt/principles.js';
|
|
5
5
|
import { computeResolutionScore } from '../gestalt/analyzer.js';
|
|
6
6
|
import { SessionManager } from './session.js';
|
|
7
7
|
import { detectProjectType } from './brownfield.js';
|
|
8
|
+
import { recordScoreWithRescore, applyRescore } from './rescore.js';
|
|
8
9
|
import { EventType } from '../events/types.js';
|
|
9
|
-
import { INTERVIEW_SYSTEM_PROMPT, buildQuestionPrompt, buildResolutionPrompt, } from '../llm/prompts.js';
|
|
10
|
+
import { INTERVIEW_SYSTEM_PROMPT, buildQuestionPrompt, buildResolutionPrompt, buildRescorePrompt, } from '../llm/prompts.js';
|
|
10
11
|
import { mergeSystemPrompt, getActiveAgentNames } from '../agent/prompt-resolver.js';
|
|
11
12
|
import { ContextCompressor } from './context-compressor.js';
|
|
12
13
|
// ─── Engine ─────────────────────────────────────────────────────
|
|
@@ -14,9 +15,13 @@ export class PassthroughEngine {
|
|
|
14
15
|
eventStore;
|
|
15
16
|
sessionManager;
|
|
16
17
|
agentRegistry;
|
|
17
|
-
|
|
18
|
+
resolutionThreshold;
|
|
19
|
+
rescoreSetting;
|
|
20
|
+
constructor(eventStore, agentRegistry, options = {}) {
|
|
18
21
|
this.eventStore = eventStore;
|
|
19
|
-
this.
|
|
22
|
+
this.resolutionThreshold = options.resolutionThreshold ?? RESOLUTION_THRESHOLD;
|
|
23
|
+
this.rescoreSetting = options.rescore ?? 'record';
|
|
24
|
+
this.sessionManager = new SessionManager(eventStore, options);
|
|
20
25
|
this.sessionManager.loadFromStore();
|
|
21
26
|
this.agentRegistry = agentRegistry;
|
|
22
27
|
}
|
|
@@ -53,10 +58,12 @@ export class PassthroughEngine {
|
|
|
53
58
|
respond(sessionId, response, generatedQuestion, externalScore) {
|
|
54
59
|
try {
|
|
55
60
|
const session = this.sessionManager.get(sessionId);
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
// 호스트는 직전 응답의 gestaltContext.currentPrinciple로 질문을 만들었다.
|
|
62
|
+
// 그 원칙을 라운드에 남겨야 어느 차원을 물었는지가 기록과 맞는다
|
|
63
|
+
const principle = this.appliedPrinciple(sessionId, session.rounds.length + 1) ??
|
|
64
|
+
(session.rounds.length > 0
|
|
65
|
+
? session.rounds[session.rounds.length - 1].gestaltFocus
|
|
66
|
+
: selectNextPrinciple({ roundNumber: 1, dimensions: [], hasContradictions: false }));
|
|
60
67
|
// If there's no pending round (no unanswered question), add one
|
|
61
68
|
const lastRound = session.rounds[session.rounds.length - 1];
|
|
62
69
|
if (!lastRound || lastRound.userResponse !== null) {
|
|
@@ -73,19 +80,16 @@ export class PassthroughEngine {
|
|
|
73
80
|
}
|
|
74
81
|
// Compute resolution score if provided externally
|
|
75
82
|
let resolutionScore = null;
|
|
83
|
+
let rescorePrompt;
|
|
76
84
|
if (externalScore) {
|
|
77
|
-
resolutionScore = computeResolutionScore(
|
|
78
|
-
goalClarity: externalScore.goalClarity,
|
|
79
|
-
constraintClarity: externalScore.constraintClarity,
|
|
80
|
-
successCriteria: externalScore.successCriteria,
|
|
81
|
-
priorityClarity: externalScore.priorityClarity,
|
|
82
|
-
contextClarity: externalScore.contextClarity,
|
|
83
|
-
contradictions: externalScore.contradictions ?? [],
|
|
84
|
-
}, session.projectType);
|
|
85
|
+
resolutionScore = computeResolutionScore(rawScore(externalScore), session.projectType, this.resolutionThreshold);
|
|
85
86
|
const rejected = rejectUnbackedReadyScore(session, resolutionScore);
|
|
86
87
|
if (rejected)
|
|
87
88
|
return err(rejected);
|
|
88
|
-
|
|
89
|
+
// 같이 온 점수는 직전 respond의 scoringPrompt로 매긴 것이라 이번 답을 못 봤다.
|
|
90
|
+
// 다시 채점도 그 범위로 물어야 흔들림에 새 답으로 늘어난 몫이 안 섞인다
|
|
91
|
+
const scored = session.rounds.slice(0, -1);
|
|
92
|
+
rescorePrompt = this.recordScore(sessionId, resolutionScore, scored.some((r) => r.userResponse) ? scored : session.rounds);
|
|
89
93
|
}
|
|
90
94
|
// Select next principle
|
|
91
95
|
const hasContradictions = (externalScore?.contradictions?.length ?? 0) > 0;
|
|
@@ -118,29 +122,32 @@ export class PassthroughEngine {
|
|
|
118
122
|
resolutionScore,
|
|
119
123
|
gestaltContext,
|
|
120
124
|
...(needsCompression ? { compressionContext, needsCompression } : {}),
|
|
125
|
+
...(rescorePrompt && { rescorePrompt, nextAction: 'rescore' }),
|
|
121
126
|
});
|
|
122
127
|
}
|
|
123
128
|
catch (e) {
|
|
124
129
|
return err(new InterviewError(`Failed to process response: ${e instanceof Error ? e.message : String(e)}`));
|
|
125
130
|
}
|
|
126
131
|
}
|
|
127
|
-
score(sessionId, externalScore) {
|
|
132
|
+
score(sessionId, externalScore, options = {}) {
|
|
128
133
|
try {
|
|
129
134
|
const session = this.sessionManager.get(sessionId);
|
|
135
|
+
if (options.rescore) {
|
|
136
|
+
if (!externalScore) {
|
|
137
|
+
return err(new InterviewError('rescore: true에는 resolutionScore가 필요합니다.'));
|
|
138
|
+
}
|
|
139
|
+
return this.rescore(sessionId, externalScore, options.rescoreMode ?? 'same-context');
|
|
140
|
+
}
|
|
130
141
|
if (externalScore) {
|
|
131
|
-
const resolutionScore = computeResolutionScore(
|
|
132
|
-
goalClarity: externalScore.goalClarity,
|
|
133
|
-
constraintClarity: externalScore.constraintClarity,
|
|
134
|
-
successCriteria: externalScore.successCriteria,
|
|
135
|
-
priorityClarity: externalScore.priorityClarity,
|
|
136
|
-
contextClarity: externalScore.contextClarity,
|
|
137
|
-
contradictions: externalScore.contradictions ?? [],
|
|
138
|
-
}, session.projectType);
|
|
142
|
+
const resolutionScore = computeResolutionScore(rawScore(externalScore), session.projectType, this.resolutionThreshold);
|
|
139
143
|
const rejected = rejectUnbackedReadyScore(session, resolutionScore);
|
|
140
144
|
if (rejected)
|
|
141
145
|
return err(rejected);
|
|
142
|
-
this.
|
|
143
|
-
return ok({
|
|
146
|
+
const rescorePrompt = this.recordScore(sessionId, resolutionScore, session.rounds);
|
|
147
|
+
return ok({
|
|
148
|
+
resolutionScore,
|
|
149
|
+
...(rescorePrompt && { rescorePrompt, nextAction: 'rescore' }),
|
|
150
|
+
});
|
|
144
151
|
}
|
|
145
152
|
// No external score — return scoring prompt for the caller
|
|
146
153
|
const rounds = session.rounds
|
|
@@ -174,6 +181,48 @@ export class PassthroughEngine {
|
|
|
174
181
|
return this.sessionManager.list();
|
|
175
182
|
}
|
|
176
183
|
// ─── Private helpers ────────────────────────────────────────────
|
|
184
|
+
/** 채점을 세션에 넣는다. 다시 채점하기를 요청할 차례면 rounds로 만든 프롬프트를 돌려준다 */
|
|
185
|
+
recordScore(sessionId, score, rounds) {
|
|
186
|
+
const request = recordScoreWithRescore(this.sessionManager, sessionId, score, this.rescoreSetting, this.resolutionThreshold);
|
|
187
|
+
if (!request)
|
|
188
|
+
return undefined;
|
|
189
|
+
const session = this.sessionManager.get(sessionId);
|
|
190
|
+
return buildRescorePrompt(session.topic, rounds.map((r) => ({ question: r.question, response: r.userResponse })), session.projectType);
|
|
191
|
+
}
|
|
192
|
+
rescore(sessionId, externalScore, mode) {
|
|
193
|
+
if (this.rescoreSetting === 'off') {
|
|
194
|
+
return err(new InterviewError('interview.rescore가 off라 다시 채점을 받지 않습니다.'));
|
|
195
|
+
}
|
|
196
|
+
const state = this.sessionManager.rescoreState(sessionId);
|
|
197
|
+
if (state === 'done') {
|
|
198
|
+
return err(new InterviewError('이미 다시 채점한 인터뷰입니다. 다시 채점하기는 인터뷰마다 한 번만 받습니다.'));
|
|
199
|
+
}
|
|
200
|
+
const session = this.sessionManager.get(sessionId);
|
|
201
|
+
const first = session.resolutionScore;
|
|
202
|
+
if (state === 'none' || !first) {
|
|
203
|
+
return err(new InterviewError(`아직 기준값(${this.resolutionThreshold})을 넘은 채점이 없습니다. 다시 채점하기는 처음 넘은 채점 뒤에 받습니다.`));
|
|
204
|
+
}
|
|
205
|
+
const second = computeResolutionScore(rawScore(externalScore), session.projectType, this.resolutionThreshold);
|
|
206
|
+
const { resolutionScore, rescore, principle, roundNumber } = applyRescore(this.sessionManager, sessionId, first, second, mode, this.rescoreSetting, this.resolutionThreshold);
|
|
207
|
+
if (!principle)
|
|
208
|
+
return ok({ resolutionScore, rescore });
|
|
209
|
+
// gate가 판정을 미뤘으면 다음 질문은 흔들린 차원부터 묻는다
|
|
210
|
+
this.eventStore.append('interview', sessionId, EventType.GESTALT_PRINCIPLE_APPLIED, {
|
|
211
|
+
principle,
|
|
212
|
+
roundNumber,
|
|
213
|
+
});
|
|
214
|
+
const gestaltContext = this.buildGestaltContext(session.topic, principle, roundNumber, session.rounds.map((r) => ({ question: r.question, response: r.userResponse })), session.projectType);
|
|
215
|
+
return ok({ resolutionScore, rescore, gestaltContext });
|
|
216
|
+
}
|
|
217
|
+
/** 직전 respond가 이 라운드용으로 고른 원칙. 첫 라운드나 기록이 없으면 null */
|
|
218
|
+
appliedPrinciple(sessionId, roundNumber) {
|
|
219
|
+
const applied = this.eventStore
|
|
220
|
+
.replay('interview', sessionId)
|
|
221
|
+
.filter((e) => e.eventType === EventType.GESTALT_PRINCIPLE_APPLIED &&
|
|
222
|
+
e.payload.roundNumber === roundNumber);
|
|
223
|
+
const last = applied[applied.length - 1];
|
|
224
|
+
return last ? last.payload.principle : null;
|
|
225
|
+
}
|
|
177
226
|
buildGestaltContext(topic, principle, roundNumber, previousRounds, projectType, includeScoringPrompt = false) {
|
|
178
227
|
const questionPrompt = buildQuestionPrompt(topic, principle, previousRounds, projectType);
|
|
179
228
|
const phase = getPrinciplePhaseLabel(roundNumber);
|
|
@@ -197,6 +246,16 @@ export class PassthroughEngine {
|
|
|
197
246
|
return context;
|
|
198
247
|
}
|
|
199
248
|
}
|
|
249
|
+
function rawScore(external) {
|
|
250
|
+
return {
|
|
251
|
+
goalClarity: external.goalClarity,
|
|
252
|
+
constraintClarity: external.constraintClarity,
|
|
253
|
+
successCriteria: external.successCriteria,
|
|
254
|
+
priorityClarity: external.priorityClarity,
|
|
255
|
+
contextClarity: external.contextClarity,
|
|
256
|
+
contradictions: external.contradictions ?? [],
|
|
257
|
+
};
|
|
258
|
+
}
|
|
200
259
|
// 답을 하나도 안 받은 세션은 근거가 없으니 임계값 이상 점수를 받지 않는다.
|
|
201
260
|
// 공백만 보낸 답은 답으로 치지 않는다.
|
|
202
261
|
// 임계값 미만은 막지 않는다 — 시작 직전 상태를 낮게 기록하는 건 정상 흐름이다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passthrough-engine.js","sourceRoot":"","sources":["../../../src/interview/passthrough-engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"passthrough-engine.js","sourceRoot":"","sources":["../../../src/interview/passthrough-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,12 @@ import type { InterviewSession } from '../core/types.js';
|
|
|
6
6
|
*/
|
|
7
7
|
export declare class InterviewSessionRepository {
|
|
8
8
|
private eventStore;
|
|
9
|
-
|
|
9
|
+
private resolutionThreshold;
|
|
10
|
+
/**
|
|
11
|
+
* @param resolutionThreshold isReady가 저장되지 않은 옛 ambiguity 이벤트를 읽을 때만 쓴다.
|
|
12
|
+
* 그 밖의 채점 이벤트는 저장된 isReady를 다시 계산하지 않는다
|
|
13
|
+
*/
|
|
14
|
+
constructor(eventStore: IEventStore, resolutionThreshold?: number);
|
|
10
15
|
/**
|
|
11
16
|
* 이벤트를 fold하여 InterviewSession 상태를 완전히 복원한다.
|
|
12
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/interview/repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAEV,gBAAgB,
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/interview/repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAEV,gBAAgB,EAOjB,MAAM,kBAAkB,CAAC;AAI1B;;;GAGG;AACH,qBAAa,0BAA0B;IAMnC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,mBAAmB;IAN7B;;;OAGG;gBAEO,UAAU,EAAE,WAAW,EACvB,mBAAmB,GAAE,MAA6B;IAG5D;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIvD;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,gBAAgB,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAOjF;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;OAEG;IACH,cAAc,IAAI,gBAAgB,EAAE;IAUpC,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,UAAU;CAgGnB"}
|