@yuaone/core 0.1.2 → 0.2.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/agent-loop.d.ts +112 -0
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +715 -9
- package/dist/agent-loop.js.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +16 -0
- package/dist/constants.js.map +1 -1
- package/dist/context-budget.d.ts +1 -1
- package/dist/context-budget.d.ts.map +1 -1
- package/dist/context-budget.js +4 -2
- package/dist/context-budget.js.map +1 -1
- package/dist/context-compressor.d.ts +1 -1
- package/dist/context-compressor.d.ts.map +1 -1
- package/dist/context-compressor.js +5 -3
- package/dist/context-compressor.js.map +1 -1
- package/dist/context-manager.d.ts +7 -1
- package/dist/context-manager.d.ts.map +1 -1
- package/dist/context-manager.js +34 -2
- package/dist/context-manager.js.map +1 -1
- package/dist/continuation-engine.d.ts +168 -0
- package/dist/continuation-engine.d.ts.map +1 -0
- package/dist/continuation-engine.js +421 -0
- package/dist/continuation-engine.js.map +1 -0
- package/dist/execution-engine.d.ts.map +1 -1
- package/dist/execution-engine.js +9 -4
- package/dist/execution-engine.js.map +1 -1
- package/dist/index.d.ts +14 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/llm-client.d.ts +1 -1
- package/dist/llm-client.d.ts.map +1 -1
- package/dist/llm-client.js +74 -7
- package/dist/llm-client.js.map +1 -1
- package/dist/memory-updater.d.ts +189 -0
- package/dist/memory-updater.d.ts.map +1 -0
- package/dist/memory-updater.js +481 -0
- package/dist/memory-updater.js.map +1 -0
- package/dist/prompt-defense.d.ts +59 -0
- package/dist/prompt-defense.d.ts.map +1 -0
- package/dist/prompt-defense.js +311 -0
- package/dist/prompt-defense.js.map +1 -0
- package/dist/reflexion.d.ts +211 -0
- package/dist/reflexion.d.ts.map +1 -0
- package/dist/reflexion.js +559 -0
- package/dist/reflexion.js.map +1 -0
- package/dist/system-prompt.d.ts +19 -3
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +203 -38
- package/dist/system-prompt.js.map +1 -1
- package/dist/task-classifier.d.ts +92 -0
- package/dist/task-classifier.d.ts.map +1 -0
- package/dist/task-classifier.js +566 -0
- package/dist/task-classifier.js.map +1 -0
- package/dist/token-budget.d.ts +131 -0
- package/dist/token-budget.d.ts.map +1 -0
- package/dist/token-budget.js +321 -0
- package/dist/token-budget.js.map +1 -0
- package/dist/types.d.ts +20 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +18 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../src/context-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../src/context-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module continuation-engine
|
|
3
|
+
* @description Continuation Engine — 컨텍스트 소진 시 자동 체크포인트 저장/복원.
|
|
4
|
+
*
|
|
5
|
+
* 에이전트 세션이 토큰 예산에 근접하면 자동으로 체크포인트를 저장하고,
|
|
6
|
+
* 새 세션 시작 시 이전 체크포인트에서 이어갈 수 있도록 한다.
|
|
7
|
+
*
|
|
8
|
+
* 주요 기능:
|
|
9
|
+
* - 토큰 사용량 기반 체크포인트 트리거 감지
|
|
10
|
+
* - `.yuan/checkpoints/` 디렉토리에 JSON 파일로 체크포인트 저장
|
|
11
|
+
* - Atomic write (`.tmp` → `rename`) 로 데이터 손실 방지
|
|
12
|
+
* - 세션 체인 추적 (parent → child → ...)
|
|
13
|
+
* - 이전 세션에서 이어갈 수 있는 continuation prompt 생성
|
|
14
|
+
* - 오래된 체크포인트 자동 정리 (pruning)
|
|
15
|
+
*
|
|
16
|
+
* 모든 파일 I/O는 node:fs/promises 기반이며, 에러 시 throw하지 않고
|
|
17
|
+
* null/false/0 등 안전한 기본값을 반환한다.
|
|
18
|
+
*/
|
|
19
|
+
import type { ContinuationCheckpoint } from "./types.js";
|
|
20
|
+
/** ContinuationEngine 설정 */
|
|
21
|
+
export interface ContinuationEngineConfig {
|
|
22
|
+
/** 프로젝트 루트 경로 */
|
|
23
|
+
projectPath: string;
|
|
24
|
+
/** 체크포인트 트리거 토큰 사용 비율 (기본 0.8) */
|
|
25
|
+
checkpointThreshold?: number;
|
|
26
|
+
/** 세션 체인당 최대 체크포인트 수 (기본 10) */
|
|
27
|
+
maxCheckpoints?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Continuation Engine.
|
|
31
|
+
*
|
|
32
|
+
* 컨텍스트/토큰 소진 시 자동 체크포인트를 저장하고,
|
|
33
|
+
* 새 세션에서 이전 상태를 복원하여 이어가기를 지원한다.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const engine = new ContinuationEngine({
|
|
38
|
+
* projectPath: "/home/user/project",
|
|
39
|
+
* checkpointThreshold: 0.8,
|
|
40
|
+
* maxCheckpoints: 10,
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* // 토큰 사용량 체크
|
|
44
|
+
* if (engine.shouldCheckpoint(tokensUsed, totalBudget)) {
|
|
45
|
+
* const filePath = await engine.saveCheckpoint(checkpoint);
|
|
46
|
+
* console.log("Checkpoint saved:", filePath);
|
|
47
|
+
* }
|
|
48
|
+
*
|
|
49
|
+
* // 이전 세션 복원
|
|
50
|
+
* const latest = await engine.findLatestCheckpoint();
|
|
51
|
+
* if (latest) {
|
|
52
|
+
* const prompt = engine.formatContinuationPrompt(latest);
|
|
53
|
+
* // prompt를 새 세션의 system prompt에 주입
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare class ContinuationEngine {
|
|
58
|
+
private readonly projectPath;
|
|
59
|
+
private readonly checkpointDir;
|
|
60
|
+
private readonly threshold;
|
|
61
|
+
private readonly maxCheckpoints;
|
|
62
|
+
/** 디렉토리 생성 여부 캐시 (중복 mkdir 방지) */
|
|
63
|
+
private dirEnsured;
|
|
64
|
+
constructor(config: ContinuationEngineConfig);
|
|
65
|
+
/**
|
|
66
|
+
* 토큰 사용량 기반으로 체크포인트를 저장해야 하는지 판단한다.
|
|
67
|
+
*
|
|
68
|
+
* `tokensUsed / totalBudget >= threshold` 이면 true.
|
|
69
|
+
*
|
|
70
|
+
* @param tokensUsed - 현재까지 사용한 토큰 수
|
|
71
|
+
* @param totalBudget - 전체 토큰 예산
|
|
72
|
+
* @returns 체크포인트 저장 필요 여부
|
|
73
|
+
*/
|
|
74
|
+
shouldCheckpoint(tokensUsed: number, totalBudget: number): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* 체크포인트를 파일로 저장한다.
|
|
77
|
+
*
|
|
78
|
+
* - sessionId가 없으면 crypto.randomUUID()로 자동 생성
|
|
79
|
+
* - `.yuan/checkpoints/checkpoint-{sessionId}.json` 경로에 저장
|
|
80
|
+
* - Atomic write: `.tmp` 파일에 먼저 쓰고 `rename()`
|
|
81
|
+
*
|
|
82
|
+
* @param checkpoint - 저장할 체크포인트 데이터
|
|
83
|
+
* @returns 저장된 파일 경로 (실패 시 빈 문자열)
|
|
84
|
+
*/
|
|
85
|
+
saveCheckpoint(checkpoint: ContinuationCheckpoint): Promise<string>;
|
|
86
|
+
/**
|
|
87
|
+
* 이 프로젝트의 가장 최근 체크포인트를 찾는다.
|
|
88
|
+
*
|
|
89
|
+
* 체크포인트 디렉토리를 스캔하여 `createdAt` 기준으로 정렬,
|
|
90
|
+
* 가장 최신 체크포인트를 반환한다.
|
|
91
|
+
*
|
|
92
|
+
* @returns 최신 체크포인트 (없으면 null)
|
|
93
|
+
*/
|
|
94
|
+
findLatestCheckpoint(): Promise<ContinuationCheckpoint | null>;
|
|
95
|
+
/**
|
|
96
|
+
* 특정 세션 ID의 체크포인트를 찾는다.
|
|
97
|
+
*
|
|
98
|
+
* @param sessionId - 찾을 세션 ID
|
|
99
|
+
* @returns 체크포인트 (없으면 null)
|
|
100
|
+
*/
|
|
101
|
+
findCheckpoint(sessionId: string): Promise<ContinuationCheckpoint | null>;
|
|
102
|
+
/**
|
|
103
|
+
* 세션 체인을 추적한다 (parent → child → ...).
|
|
104
|
+
*
|
|
105
|
+
* 주어진 sessionId에서 시작하여 parentSessionId를 따라
|
|
106
|
+
* 루트까지 올라간 뒤, 시간순으로 정렬하여 반환한다.
|
|
107
|
+
*
|
|
108
|
+
* @param sessionId - 시작 세션 ID
|
|
109
|
+
* @returns 시간순 정렬된 세션 체인 (빈 배열 가능)
|
|
110
|
+
*/
|
|
111
|
+
getSessionChain(sessionId: string): Promise<ContinuationCheckpoint[]>;
|
|
112
|
+
/**
|
|
113
|
+
* 체크포인트를 기반으로 continuation prompt를 생성한다.
|
|
114
|
+
*
|
|
115
|
+
* 새 세션의 시스템 프롬프트에 주입하여 이전 작업을 이어갈 수 있다.
|
|
116
|
+
*
|
|
117
|
+
* @param checkpoint - 이전 세션의 체크포인트
|
|
118
|
+
* @returns 포맷팅된 continuation prompt 문자열
|
|
119
|
+
*/
|
|
120
|
+
formatContinuationPrompt(checkpoint: ContinuationCheckpoint): string;
|
|
121
|
+
/**
|
|
122
|
+
* 오래된 체크포인트를 정리한다.
|
|
123
|
+
*
|
|
124
|
+
* `maxCheckpoints`를 초과하는 가장 오래된 체크포인트를 삭제한다.
|
|
125
|
+
* createdAt 기준 내림차순 정렬 → 최신 N개 유지 → 나머지 삭제.
|
|
126
|
+
*
|
|
127
|
+
* @returns 삭제된 체크포인트 수 (실패 시 0)
|
|
128
|
+
*/
|
|
129
|
+
pruneOldCheckpoints(): Promise<number>;
|
|
130
|
+
/**
|
|
131
|
+
* 특정 세션의 체크포인트를 삭제한다.
|
|
132
|
+
*
|
|
133
|
+
* @param sessionId - 삭제할 세션 ID
|
|
134
|
+
* @returns 삭제 성공 여부
|
|
135
|
+
*/
|
|
136
|
+
deleteCheckpoint(sessionId: string): Promise<boolean>;
|
|
137
|
+
/**
|
|
138
|
+
* 체크포인트 디렉토리가 존재하는지 확인하고, 없으면 생성한다.
|
|
139
|
+
* 한 번 생성 확인되면 이후 호출에서는 스킵 (dirEnsured 캐시).
|
|
140
|
+
*/
|
|
141
|
+
private ensureDir;
|
|
142
|
+
/**
|
|
143
|
+
* 체크포인트 파일 하나를 읽어 ContinuationCheckpoint로 파싱한다.
|
|
144
|
+
*
|
|
145
|
+
* JSON의 `createdAt` 문자열을 Date 객체로 복원한다.
|
|
146
|
+
*
|
|
147
|
+
* @param filePath - 체크포인트 파일 절대 경로
|
|
148
|
+
* @returns 파싱된 체크포인트 (실패 시 null)
|
|
149
|
+
*/
|
|
150
|
+
private readCheckpointFile;
|
|
151
|
+
/**
|
|
152
|
+
* 체크포인트 디렉토리의 모든 체크포인트를 로드한다.
|
|
153
|
+
*
|
|
154
|
+
* 유효하지 않은 파일(파싱 실패 등)은 건너뛴다.
|
|
155
|
+
*
|
|
156
|
+
* @returns 모든 유효한 체크포인트 배열
|
|
157
|
+
*/
|
|
158
|
+
private loadAllCheckpoints;
|
|
159
|
+
/**
|
|
160
|
+
* 모든 체크포인트를 파일 경로와 함께 로드한다.
|
|
161
|
+
*
|
|
162
|
+
* pruneOldCheckpoints에서 삭제할 파일 경로가 필요하므로 별도 메서드.
|
|
163
|
+
*
|
|
164
|
+
* @returns { checkpoint, filePath } 배열
|
|
165
|
+
*/
|
|
166
|
+
private loadAllCheckpointsWithPaths;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=continuation-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continuation-engine.d.ts","sourceRoot":"","sources":["../src/continuation-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAIzD,4BAA4B;AAC5B,MAAM,WAAW,wBAAwB;IACvC,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gCAAgC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA+BD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,kCAAkC;IAClC,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,wBAAwB;IAS5C;;;;;;;;OAQG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAKlE;;;;;;;;;OASG;IACG,cAAc,CAAC,UAAU,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCzE;;;;;;;OAOG;IACG,oBAAoB,IAAI,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAgBpE;;;;;OAKG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAU/E;;;;;;;;OAQG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAoD3E;;;;;;;OAOG;IACH,wBAAwB,CAAC,UAAU,EAAE,sBAAsB,GAAG,MAAM;IAiEpE;;;;;;;OAOG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IA6B5C;;;;;OAKG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa3D;;;OAGG;YACW,SAAS;IAavB;;;;;;;OAOG;YACW,kBAAkB;IAehC;;;;;;OAMG;YACW,kBAAkB;IAuBhC;;;;;;OAMG;YACW,2BAA2B;CAwB1C"}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module continuation-engine
|
|
3
|
+
* @description Continuation Engine — 컨텍스트 소진 시 자동 체크포인트 저장/복원.
|
|
4
|
+
*
|
|
5
|
+
* 에이전트 세션이 토큰 예산에 근접하면 자동으로 체크포인트를 저장하고,
|
|
6
|
+
* 새 세션 시작 시 이전 체크포인트에서 이어갈 수 있도록 한다.
|
|
7
|
+
*
|
|
8
|
+
* 주요 기능:
|
|
9
|
+
* - 토큰 사용량 기반 체크포인트 트리거 감지
|
|
10
|
+
* - `.yuan/checkpoints/` 디렉토리에 JSON 파일로 체크포인트 저장
|
|
11
|
+
* - Atomic write (`.tmp` → `rename`) 로 데이터 손실 방지
|
|
12
|
+
* - 세션 체인 추적 (parent → child → ...)
|
|
13
|
+
* - 이전 세션에서 이어갈 수 있는 continuation prompt 생성
|
|
14
|
+
* - 오래된 체크포인트 자동 정리 (pruning)
|
|
15
|
+
*
|
|
16
|
+
* 모든 파일 I/O는 node:fs/promises 기반이며, 에러 시 throw하지 않고
|
|
17
|
+
* null/false/0 등 안전한 기본값을 반환한다.
|
|
18
|
+
*/
|
|
19
|
+
import { readdir, readFile, writeFile, rename, unlink, mkdir, stat } from "node:fs/promises";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
import { randomUUID } from "node:crypto";
|
|
22
|
+
// ─── Constants ────────────────────────────────────────────────────
|
|
23
|
+
/** 기본 체크포인트 트리거 비율 */
|
|
24
|
+
const DEFAULT_THRESHOLD = 0.8;
|
|
25
|
+
/** 기본 최대 체크포인트 수 */
|
|
26
|
+
const DEFAULT_MAX_CHECKPOINTS = 10;
|
|
27
|
+
/** 체크포인트 파일 접두사 */
|
|
28
|
+
const CHECKPOINT_PREFIX = "checkpoint-";
|
|
29
|
+
/** 체크포인트 파일 확장자 */
|
|
30
|
+
const CHECKPOINT_EXT = ".json";
|
|
31
|
+
/** 임시 파일 확장자 (atomic write용) */
|
|
32
|
+
const TMP_EXT = ".tmp";
|
|
33
|
+
/** continuation prompt에 포함할 diff 최대 길이 (파일당) */
|
|
34
|
+
const MAX_DIFF_LENGTH = 500;
|
|
35
|
+
// ─── ContinuationEngine ──────────────────────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* Continuation Engine.
|
|
38
|
+
*
|
|
39
|
+
* 컨텍스트/토큰 소진 시 자동 체크포인트를 저장하고,
|
|
40
|
+
* 새 세션에서 이전 상태를 복원하여 이어가기를 지원한다.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const engine = new ContinuationEngine({
|
|
45
|
+
* projectPath: "/home/user/project",
|
|
46
|
+
* checkpointThreshold: 0.8,
|
|
47
|
+
* maxCheckpoints: 10,
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* // 토큰 사용량 체크
|
|
51
|
+
* if (engine.shouldCheckpoint(tokensUsed, totalBudget)) {
|
|
52
|
+
* const filePath = await engine.saveCheckpoint(checkpoint);
|
|
53
|
+
* console.log("Checkpoint saved:", filePath);
|
|
54
|
+
* }
|
|
55
|
+
*
|
|
56
|
+
* // 이전 세션 복원
|
|
57
|
+
* const latest = await engine.findLatestCheckpoint();
|
|
58
|
+
* if (latest) {
|
|
59
|
+
* const prompt = engine.formatContinuationPrompt(latest);
|
|
60
|
+
* // prompt를 새 세션의 system prompt에 주입
|
|
61
|
+
* }
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export class ContinuationEngine {
|
|
65
|
+
projectPath;
|
|
66
|
+
checkpointDir;
|
|
67
|
+
threshold;
|
|
68
|
+
maxCheckpoints;
|
|
69
|
+
/** 디렉토리 생성 여부 캐시 (중복 mkdir 방지) */
|
|
70
|
+
dirEnsured = false;
|
|
71
|
+
constructor(config) {
|
|
72
|
+
this.projectPath = config.projectPath;
|
|
73
|
+
this.checkpointDir = join(config.projectPath, ".yuan", "checkpoints");
|
|
74
|
+
this.threshold = config.checkpointThreshold ?? DEFAULT_THRESHOLD;
|
|
75
|
+
this.maxCheckpoints = config.maxCheckpoints ?? DEFAULT_MAX_CHECKPOINTS;
|
|
76
|
+
}
|
|
77
|
+
// ─── Public Methods ─────────────────────────────────────────────
|
|
78
|
+
/**
|
|
79
|
+
* 토큰 사용량 기반으로 체크포인트를 저장해야 하는지 판단한다.
|
|
80
|
+
*
|
|
81
|
+
* `tokensUsed / totalBudget >= threshold` 이면 true.
|
|
82
|
+
*
|
|
83
|
+
* @param tokensUsed - 현재까지 사용한 토큰 수
|
|
84
|
+
* @param totalBudget - 전체 토큰 예산
|
|
85
|
+
* @returns 체크포인트 저장 필요 여부
|
|
86
|
+
*/
|
|
87
|
+
shouldCheckpoint(tokensUsed, totalBudget) {
|
|
88
|
+
if (totalBudget <= 0)
|
|
89
|
+
return false;
|
|
90
|
+
return tokensUsed / totalBudget >= this.threshold;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 체크포인트를 파일로 저장한다.
|
|
94
|
+
*
|
|
95
|
+
* - sessionId가 없으면 crypto.randomUUID()로 자동 생성
|
|
96
|
+
* - `.yuan/checkpoints/checkpoint-{sessionId}.json` 경로에 저장
|
|
97
|
+
* - Atomic write: `.tmp` 파일에 먼저 쓰고 `rename()`
|
|
98
|
+
*
|
|
99
|
+
* @param checkpoint - 저장할 체크포인트 데이터
|
|
100
|
+
* @returns 저장된 파일 경로 (실패 시 빈 문자열)
|
|
101
|
+
*/
|
|
102
|
+
async saveCheckpoint(checkpoint) {
|
|
103
|
+
try {
|
|
104
|
+
await this.ensureDir();
|
|
105
|
+
// sessionId가 비어있으면 자동 생성
|
|
106
|
+
const sessionId = checkpoint.sessionId || randomUUID();
|
|
107
|
+
const safeCheckpoint = {
|
|
108
|
+
...checkpoint,
|
|
109
|
+
sessionId,
|
|
110
|
+
};
|
|
111
|
+
const fileName = `${CHECKPOINT_PREFIX}${sessionId}${CHECKPOINT_EXT}`;
|
|
112
|
+
const filePath = join(this.checkpointDir, fileName);
|
|
113
|
+
const tmpPath = `${filePath}${TMP_EXT}`;
|
|
114
|
+
// Date 객체를 ISO 문자열로 직렬화
|
|
115
|
+
const serialized = {
|
|
116
|
+
...safeCheckpoint,
|
|
117
|
+
createdAt: safeCheckpoint.createdAt.toISOString(),
|
|
118
|
+
};
|
|
119
|
+
const json = JSON.stringify(serialized, null, 2);
|
|
120
|
+
// Atomic write: tmp에 쓰고 rename
|
|
121
|
+
await writeFile(tmpPath, json, "utf-8");
|
|
122
|
+
await rename(tmpPath, filePath);
|
|
123
|
+
return filePath;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// 파일 I/O 실패 — 빈 문자열 반환 (non-throwing)
|
|
127
|
+
return "";
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 이 프로젝트의 가장 최근 체크포인트를 찾는다.
|
|
132
|
+
*
|
|
133
|
+
* 체크포인트 디렉토리를 스캔하여 `createdAt` 기준으로 정렬,
|
|
134
|
+
* 가장 최신 체크포인트를 반환한다.
|
|
135
|
+
*
|
|
136
|
+
* @returns 최신 체크포인트 (없으면 null)
|
|
137
|
+
*/
|
|
138
|
+
async findLatestCheckpoint() {
|
|
139
|
+
try {
|
|
140
|
+
const checkpoints = await this.loadAllCheckpoints();
|
|
141
|
+
if (checkpoints.length === 0)
|
|
142
|
+
return null;
|
|
143
|
+
// createdAt 기준 내림차순 정렬 → 가장 최신 반환
|
|
144
|
+
checkpoints.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
145
|
+
return checkpoints[0];
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 특정 세션 ID의 체크포인트를 찾는다.
|
|
153
|
+
*
|
|
154
|
+
* @param sessionId - 찾을 세션 ID
|
|
155
|
+
* @returns 체크포인트 (없으면 null)
|
|
156
|
+
*/
|
|
157
|
+
async findCheckpoint(sessionId) {
|
|
158
|
+
try {
|
|
159
|
+
const fileName = `${CHECKPOINT_PREFIX}${sessionId}${CHECKPOINT_EXT}`;
|
|
160
|
+
const filePath = join(this.checkpointDir, fileName);
|
|
161
|
+
return await this.readCheckpointFile(filePath);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 세션 체인을 추적한다 (parent → child → ...).
|
|
169
|
+
*
|
|
170
|
+
* 주어진 sessionId에서 시작하여 parentSessionId를 따라
|
|
171
|
+
* 루트까지 올라간 뒤, 시간순으로 정렬하여 반환한다.
|
|
172
|
+
*
|
|
173
|
+
* @param sessionId - 시작 세션 ID
|
|
174
|
+
* @returns 시간순 정렬된 세션 체인 (빈 배열 가능)
|
|
175
|
+
*/
|
|
176
|
+
async getSessionChain(sessionId) {
|
|
177
|
+
try {
|
|
178
|
+
const allCheckpoints = await this.loadAllCheckpoints();
|
|
179
|
+
if (allCheckpoints.length === 0)
|
|
180
|
+
return [];
|
|
181
|
+
// sessionId → checkpoint 매핑
|
|
182
|
+
const byId = new Map();
|
|
183
|
+
for (const cp of allCheckpoints) {
|
|
184
|
+
byId.set(cp.sessionId, cp);
|
|
185
|
+
}
|
|
186
|
+
// 주어진 sessionId에서 시작하여 parent 체인을 거슬러 올라감
|
|
187
|
+
const chain = [];
|
|
188
|
+
const visited = new Set();
|
|
189
|
+
let currentId = sessionId;
|
|
190
|
+
// 먼저 parent 체인을 거슬러 올라가서 루트를 찾는다
|
|
191
|
+
while (currentId && !visited.has(currentId)) {
|
|
192
|
+
visited.add(currentId);
|
|
193
|
+
const cp = byId.get(currentId);
|
|
194
|
+
if (!cp)
|
|
195
|
+
break;
|
|
196
|
+
chain.unshift(cp); // 앞쪽에 삽입 (루트가 먼저)
|
|
197
|
+
currentId = cp.parentSessionId;
|
|
198
|
+
}
|
|
199
|
+
// 주어진 sessionId의 자식 체인도 추가
|
|
200
|
+
// child → 모든 checkpoint 중 parentSessionId가 현재 체인 끝인 것
|
|
201
|
+
let lastId = chain.length > 0 ? chain[chain.length - 1].sessionId : sessionId;
|
|
202
|
+
const childVisited = new Set(visited);
|
|
203
|
+
// eslint-disable-next-line no-constant-condition
|
|
204
|
+
while (true) {
|
|
205
|
+
const child = allCheckpoints.find((cp) => cp.parentSessionId === lastId && !childVisited.has(cp.sessionId));
|
|
206
|
+
if (!child)
|
|
207
|
+
break;
|
|
208
|
+
childVisited.add(child.sessionId);
|
|
209
|
+
chain.push(child);
|
|
210
|
+
lastId = child.sessionId;
|
|
211
|
+
}
|
|
212
|
+
// 시간순 정렬
|
|
213
|
+
chain.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
|
|
214
|
+
return chain;
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return [];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* 체크포인트를 기반으로 continuation prompt를 생성한다.
|
|
222
|
+
*
|
|
223
|
+
* 새 세션의 시스템 프롬프트에 주입하여 이전 작업을 이어갈 수 있다.
|
|
224
|
+
*
|
|
225
|
+
* @param checkpoint - 이전 세션의 체크포인트
|
|
226
|
+
* @returns 포맷팅된 continuation prompt 문자열
|
|
227
|
+
*/
|
|
228
|
+
formatContinuationPrompt(checkpoint) {
|
|
229
|
+
const { sessionId, parentSessionId, goal, progress, changedFiles, workingMemory, errors } = checkpoint;
|
|
230
|
+
// 세션 ID 라인
|
|
231
|
+
const sessionLine = parentSessionId
|
|
232
|
+
? `**Session ID:** ${sessionId} (continued from ${parentSessionId})`
|
|
233
|
+
: `**Session ID:** ${sessionId}`;
|
|
234
|
+
// 완료된 태스크
|
|
235
|
+
const completedList = progress.completedTasks.length > 0
|
|
236
|
+
? progress.completedTasks.map((t) => ` - ${t}`).join("\n")
|
|
237
|
+
: " (none)";
|
|
238
|
+
// 남은 태스크
|
|
239
|
+
const remainingList = progress.remainingTasks.length > 0
|
|
240
|
+
? progress.remainingTasks.map((t) => ` - ${t}`).join("\n")
|
|
241
|
+
: " (none)";
|
|
242
|
+
// 변경된 파일 (diff는 길이 제한)
|
|
243
|
+
const changedFilesList = changedFiles.length > 0
|
|
244
|
+
? changedFiles
|
|
245
|
+
.map((f) => {
|
|
246
|
+
const truncatedDiff = f.diff.length > MAX_DIFF_LENGTH
|
|
247
|
+
? `${f.diff.slice(0, MAX_DIFF_LENGTH)}... (truncated)`
|
|
248
|
+
: f.diff;
|
|
249
|
+
return `- \`${f.path}\`\n\`\`\`diff\n${truncatedDiff}\n\`\`\``;
|
|
250
|
+
})
|
|
251
|
+
.join("\n")
|
|
252
|
+
: "(no files changed)";
|
|
253
|
+
// 에러 목록
|
|
254
|
+
const errorList = errors.length > 0 ? errors.map((e) => `- ${e}`).join("\n") : "(no errors)";
|
|
255
|
+
return `## Continuation from Previous Session
|
|
256
|
+
|
|
257
|
+
${sessionLine}
|
|
258
|
+
**Original Goal:** ${goal}
|
|
259
|
+
|
|
260
|
+
### Progress
|
|
261
|
+
- Completed:
|
|
262
|
+
${completedList}
|
|
263
|
+
- Current (was in progress): ${progress.currentTask || "(none)"}
|
|
264
|
+
- Remaining:
|
|
265
|
+
${remainingList}
|
|
266
|
+
|
|
267
|
+
### Changed Files
|
|
268
|
+
${changedFilesList}
|
|
269
|
+
|
|
270
|
+
### Working Memory
|
|
271
|
+
${workingMemory || "(empty)"}
|
|
272
|
+
|
|
273
|
+
### Errors Encountered
|
|
274
|
+
${errorList}
|
|
275
|
+
|
|
276
|
+
### Instructions
|
|
277
|
+
Continue from where the previous session left off. The current task "${progress.currentTask}" may need to be restarted or completed.
|
|
278
|
+
Resume with the remaining tasks in order.`;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 오래된 체크포인트를 정리한다.
|
|
282
|
+
*
|
|
283
|
+
* `maxCheckpoints`를 초과하는 가장 오래된 체크포인트를 삭제한다.
|
|
284
|
+
* createdAt 기준 내림차순 정렬 → 최신 N개 유지 → 나머지 삭제.
|
|
285
|
+
*
|
|
286
|
+
* @returns 삭제된 체크포인트 수 (실패 시 0)
|
|
287
|
+
*/
|
|
288
|
+
async pruneOldCheckpoints() {
|
|
289
|
+
try {
|
|
290
|
+
const checkpoints = await this.loadAllCheckpointsWithPaths();
|
|
291
|
+
if (checkpoints.length <= this.maxCheckpoints)
|
|
292
|
+
return 0;
|
|
293
|
+
// createdAt 기준 내림차순 정렬 (최신이 먼저)
|
|
294
|
+
checkpoints.sort((a, b) => new Date(b.checkpoint.createdAt).getTime() - new Date(a.checkpoint.createdAt).getTime());
|
|
295
|
+
// maxCheckpoints 이후의 항목 삭제
|
|
296
|
+
const toDelete = checkpoints.slice(this.maxCheckpoints);
|
|
297
|
+
let deleted = 0;
|
|
298
|
+
for (const item of toDelete) {
|
|
299
|
+
try {
|
|
300
|
+
await unlink(item.filePath);
|
|
301
|
+
deleted++;
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
// 개별 파일 삭제 실패는 무시
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return deleted;
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return 0;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* 특정 세션의 체크포인트를 삭제한다.
|
|
315
|
+
*
|
|
316
|
+
* @param sessionId - 삭제할 세션 ID
|
|
317
|
+
* @returns 삭제 성공 여부
|
|
318
|
+
*/
|
|
319
|
+
async deleteCheckpoint(sessionId) {
|
|
320
|
+
try {
|
|
321
|
+
const fileName = `${CHECKPOINT_PREFIX}${sessionId}${CHECKPOINT_EXT}`;
|
|
322
|
+
const filePath = join(this.checkpointDir, fileName);
|
|
323
|
+
await unlink(filePath);
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// ─── Private Helpers ────────────────────────────────────────────
|
|
331
|
+
/**
|
|
332
|
+
* 체크포인트 디렉토리가 존재하는지 확인하고, 없으면 생성한다.
|
|
333
|
+
* 한 번 생성 확인되면 이후 호출에서는 스킵 (dirEnsured 캐시).
|
|
334
|
+
*/
|
|
335
|
+
async ensureDir() {
|
|
336
|
+
if (this.dirEnsured)
|
|
337
|
+
return;
|
|
338
|
+
try {
|
|
339
|
+
await stat(this.checkpointDir);
|
|
340
|
+
this.dirEnsured = true;
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// 디렉토리가 없으면 생성
|
|
344
|
+
await mkdir(this.checkpointDir, { recursive: true });
|
|
345
|
+
this.dirEnsured = true;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* 체크포인트 파일 하나를 읽어 ContinuationCheckpoint로 파싱한다.
|
|
350
|
+
*
|
|
351
|
+
* JSON의 `createdAt` 문자열을 Date 객체로 복원한다.
|
|
352
|
+
*
|
|
353
|
+
* @param filePath - 체크포인트 파일 절대 경로
|
|
354
|
+
* @returns 파싱된 체크포인트 (실패 시 null)
|
|
355
|
+
*/
|
|
356
|
+
async readCheckpointFile(filePath) {
|
|
357
|
+
try {
|
|
358
|
+
const raw = await readFile(filePath, "utf-8");
|
|
359
|
+
const parsed = JSON.parse(raw);
|
|
360
|
+
// createdAt을 Date 객체로 복원
|
|
361
|
+
return {
|
|
362
|
+
...parsed,
|
|
363
|
+
createdAt: new Date(parsed.createdAt),
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
return null;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* 체크포인트 디렉토리의 모든 체크포인트를 로드한다.
|
|
372
|
+
*
|
|
373
|
+
* 유효하지 않은 파일(파싱 실패 등)은 건너뛴다.
|
|
374
|
+
*
|
|
375
|
+
* @returns 모든 유효한 체크포인트 배열
|
|
376
|
+
*/
|
|
377
|
+
async loadAllCheckpoints() {
|
|
378
|
+
try {
|
|
379
|
+
await this.ensureDir();
|
|
380
|
+
const entries = await readdir(this.checkpointDir);
|
|
381
|
+
const checkpointFiles = entries.filter((name) => name.startsWith(CHECKPOINT_PREFIX) && name.endsWith(CHECKPOINT_EXT));
|
|
382
|
+
const results = [];
|
|
383
|
+
for (const fileName of checkpointFiles) {
|
|
384
|
+
const filePath = join(this.checkpointDir, fileName);
|
|
385
|
+
const cp = await this.readCheckpointFile(filePath);
|
|
386
|
+
if (cp)
|
|
387
|
+
results.push(cp);
|
|
388
|
+
}
|
|
389
|
+
return results;
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
return [];
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* 모든 체크포인트를 파일 경로와 함께 로드한다.
|
|
397
|
+
*
|
|
398
|
+
* pruneOldCheckpoints에서 삭제할 파일 경로가 필요하므로 별도 메서드.
|
|
399
|
+
*
|
|
400
|
+
* @returns { checkpoint, filePath } 배열
|
|
401
|
+
*/
|
|
402
|
+
async loadAllCheckpointsWithPaths() {
|
|
403
|
+
try {
|
|
404
|
+
await this.ensureDir();
|
|
405
|
+
const entries = await readdir(this.checkpointDir);
|
|
406
|
+
const checkpointFiles = entries.filter((name) => name.startsWith(CHECKPOINT_PREFIX) && name.endsWith(CHECKPOINT_EXT));
|
|
407
|
+
const results = [];
|
|
408
|
+
for (const fileName of checkpointFiles) {
|
|
409
|
+
const filePath = join(this.checkpointDir, fileName);
|
|
410
|
+
const cp = await this.readCheckpointFile(filePath);
|
|
411
|
+
if (cp)
|
|
412
|
+
results.push({ checkpoint: cp, filePath });
|
|
413
|
+
}
|
|
414
|
+
return results;
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
return [];
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=continuation-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continuation-engine.js","sourceRoot":"","sources":["../src/continuation-engine.ts"],"names":[],"mappings":"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"}
|