@kodus/cli 0.4.0 → 0.4.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.
- package/dist/agents/agent.interface.d.ts +41 -0
- package/dist/agents/agent.interface.d.ts.map +1 -0
- package/dist/agents/agent.interface.js +2 -0
- package/dist/agents/agent.interface.js.map +1 -0
- package/dist/agents/claude-code.agent.d.ts +14 -0
- package/dist/agents/claude-code.agent.d.ts.map +1 -0
- package/dist/agents/claude-code.agent.js +79 -0
- package/dist/agents/claude-code.agent.js.map +1 -0
- package/dist/commands/memory/capture.d.ts.map +1 -1
- package/dist/commands/memory/capture.js +16 -46
- package/dist/commands/memory/capture.js.map +1 -1
- package/dist/commands/memory/disable.d.ts.map +1 -1
- package/dist/commands/memory/disable.js +7 -5
- package/dist/commands/memory/disable.js.map +1 -1
- package/dist/commands/memory/enable.d.ts +0 -1
- package/dist/commands/memory/enable.d.ts.map +1 -1
- package/dist/commands/memory/enable.js +14 -42
- package/dist/commands/memory/enable.js.map +1 -1
- package/dist/commands/memory/hooks.d.ts +0 -15
- package/dist/commands/memory/hooks.d.ts.map +1 -1
- package/dist/commands/memory/hooks.js +0 -92
- package/dist/commands/memory/hooks.js.map +1 -1
- package/dist/commands/memory/index.d.ts.map +1 -1
- package/dist/commands/memory/index.js +6 -23
- package/dist/commands/memory/index.js.map +1 -1
- package/dist/commands/memory/session-hooks/claude-code.d.ts +2 -0
- package/dist/commands/memory/session-hooks/claude-code.d.ts.map +1 -0
- package/dist/commands/memory/session-hooks/claude-code.js +21 -0
- package/dist/commands/memory/session-hooks/claude-code.js.map +1 -0
- package/dist/commands/memory/session-hooks/cursor.d.ts +2 -0
- package/dist/commands/memory/session-hooks/cursor.d.ts.map +1 -0
- package/dist/commands/memory/session-hooks/cursor.js +25 -0
- package/dist/commands/memory/session-hooks/cursor.js.map +1 -0
- package/dist/commands/memory/session-hooks/index.d.ts +3 -0
- package/dist/commands/memory/session-hooks/index.d.ts.map +1 -0
- package/dist/commands/memory/session-hooks/index.js +16 -0
- package/dist/commands/memory/session-hooks/index.js.map +1 -0
- package/dist/commands/memory/session-hooks/shared.d.ts +7 -0
- package/dist/commands/memory/session-hooks/shared.d.ts.map +1 -0
- package/dist/commands/memory/session-hooks/shared.js +76 -0
- package/dist/commands/memory/session-hooks/shared.js.map +1 -0
- package/dist/commands/memory/session-hooks-install.d.ts +9 -0
- package/dist/commands/memory/session-hooks-install.d.ts.map +1 -0
- package/dist/commands/memory/session-hooks-install.js +139 -0
- package/dist/commands/memory/session-hooks-install.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +0 -10
- package/dist/commands/status.js.map +1 -1
- package/dist/services/api/api.interface.d.ts +5 -0
- package/dist/services/api/api.interface.d.ts.map +1 -1
- package/dist/services/api/api.real.d.ts +3 -1
- package/dist/services/api/api.real.d.ts.map +1 -1
- package/dist/services/api/api.real.js +3 -1
- package/dist/services/api/api.real.js.map +1 -1
- package/dist/services/api/index.d.ts +1 -1
- package/dist/services/api/index.d.ts.map +1 -1
- package/dist/services/api/sessions.api.d.ts +6 -0
- package/dist/services/api/sessions.api.d.ts.map +1 -0
- package/dist/services/api/sessions.api.js +119 -0
- package/dist/services/api/sessions.api.js.map +1 -0
- package/dist/services/git-hooks.service.d.ts +20 -0
- package/dist/services/git-hooks.service.d.ts.map +1 -0
- package/dist/services/git-hooks.service.js +118 -0
- package/dist/services/git-hooks.service.js.map +1 -0
- package/dist/services/hook-logger.service.d.ts +18 -0
- package/dist/services/hook-logger.service.d.ts.map +1 -0
- package/dist/services/hook-logger.service.js +47 -0
- package/dist/services/hook-logger.service.js.map +1 -0
- package/dist/services/lifecycle.service.d.ts +13 -0
- package/dist/services/lifecycle.service.d.ts.map +1 -0
- package/dist/services/lifecycle.service.js +257 -0
- package/dist/services/lifecycle.service.js.map +1 -0
- package/dist/services/session-local.service.d.ts +9 -0
- package/dist/services/session-local.service.d.ts.map +1 -0
- package/dist/services/session-local.service.js +33 -0
- package/dist/services/session-local.service.js.map +1 -0
- package/dist/services/transcript.service.d.ts +33 -0
- package/dist/services/transcript.service.d.ts.map +1 -0
- package/dist/services/transcript.service.js +233 -0
- package/dist/services/transcript.service.js.map +1 -0
- package/dist/types/memory.d.ts +0 -46
- package/dist/types/memory.d.ts.map +1 -1
- package/dist/types/session-events.d.ts +47 -0
- package/dist/types/session-events.d.ts.map +1 -0
- package/dist/types/session-events.js +2 -0
- package/dist/types/session-events.js.map +1 -0
- package/dist/types/session.d.ts +148 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +5 -0
- package/dist/types/session.js.map +1 -0
- package/package.json +1 -1
- package/dist/commands/memory/promote.d.ts +0 -7
- package/dist/commands/memory/promote.d.ts.map +0 -1
- package/dist/commands/memory/promote.js +0 -42
- package/dist/commands/memory/promote.js.map +0 -1
- package/dist/commands/memory/show.d.ts +0 -2
- package/dist/commands/memory/show.d.ts.map +0 -1
- package/dist/commands/memory/show.js +0 -45
- package/dist/commands/memory/show.js.map +0 -1
- package/dist/commands/memory/status.d.ts +0 -2
- package/dist/commands/memory/status.d.ts.map +0 -1
- package/dist/commands/memory/status.js +0 -56
- package/dist/commands/memory/status.js.map +0 -1
- package/dist/services/memory.service.d.ts +0 -49
- package/dist/services/memory.service.d.ts.map +0 -1
- package/dist/services/memory.service.js +0 -508
- package/dist/services/memory.service.js.map +0 -1
- package/dist/utils/module-matcher.d.ts +0 -6
- package/dist/utils/module-matcher.d.ts.map +0 -1
- package/dist/utils/module-matcher.js +0 -99
- package/dist/utils/module-matcher.js.map +0 -1
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { gitService } from './git.service.js';
|
|
3
|
+
import { hookLogger } from './hook-logger.service.js';
|
|
4
|
+
import { transcriptService } from './transcript.service.js';
|
|
5
|
+
import { saveLocal, loadLocal, removeLocal } from './session-local.service.js';
|
|
6
|
+
import { api } from './api/index.js';
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const pkg = require('../../package.json');
|
|
9
|
+
async function getBranch() {
|
|
10
|
+
try {
|
|
11
|
+
return (await gitService.getCurrentBranch()).trim();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return '';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function getHead() {
|
|
18
|
+
return (await gitService.getHeadSha()) ?? '';
|
|
19
|
+
}
|
|
20
|
+
async function getRemote() {
|
|
21
|
+
return (await gitService.getRemoteUrl()) ?? '';
|
|
22
|
+
}
|
|
23
|
+
function sendEvent(event, repoRoot) {
|
|
24
|
+
// Fire and forget — never blocks the agent
|
|
25
|
+
api.sessions.sendEvent(event, repoRoot).catch(() => { });
|
|
26
|
+
}
|
|
27
|
+
class LifecycleService {
|
|
28
|
+
async dispatch(repoRoot, agentType, event) {
|
|
29
|
+
await hookLogger.init(repoRoot);
|
|
30
|
+
switch (event.type) {
|
|
31
|
+
case 'SessionStart':
|
|
32
|
+
await this.handleSessionStart(repoRoot, agentType, event);
|
|
33
|
+
break;
|
|
34
|
+
case 'TurnStart':
|
|
35
|
+
await this.handleTurnStart(repoRoot, agentType, event);
|
|
36
|
+
break;
|
|
37
|
+
case 'TurnEnd':
|
|
38
|
+
await this.handleTurnEnd(repoRoot, agentType, event);
|
|
39
|
+
break;
|
|
40
|
+
case 'SessionEnd':
|
|
41
|
+
await this.handleSessionEnd(repoRoot, agentType, event);
|
|
42
|
+
break;
|
|
43
|
+
case 'SubagentStart':
|
|
44
|
+
await this.handleSubagentStart(repoRoot, agentType, event);
|
|
45
|
+
break;
|
|
46
|
+
case 'SubagentEnd':
|
|
47
|
+
await this.handleSubagentEnd(repoRoot, agentType, event);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// -------------------------------------------------------------------------
|
|
52
|
+
// Session Start
|
|
53
|
+
// -------------------------------------------------------------------------
|
|
54
|
+
async handleSessionStart(repoRoot, agentType, event) {
|
|
55
|
+
await hookLogger.info('session-start', 'lifecycle', {
|
|
56
|
+
agent: agentType,
|
|
57
|
+
model_session_id: event.sessionId,
|
|
58
|
+
transcript_path: event.sessionRef,
|
|
59
|
+
});
|
|
60
|
+
const [branch, baseCommit, gitRemote] = await Promise.all([
|
|
61
|
+
getBranch(),
|
|
62
|
+
getHead(),
|
|
63
|
+
getRemote(),
|
|
64
|
+
]);
|
|
65
|
+
sendEvent({
|
|
66
|
+
type: 'session_start',
|
|
67
|
+
sessionId: event.sessionId,
|
|
68
|
+
branch,
|
|
69
|
+
timestamp: new Date().toISOString(),
|
|
70
|
+
agentType,
|
|
71
|
+
gitRemote,
|
|
72
|
+
baseCommit,
|
|
73
|
+
cliVersion: pkg.version,
|
|
74
|
+
}, repoRoot);
|
|
75
|
+
}
|
|
76
|
+
// -------------------------------------------------------------------------
|
|
77
|
+
// Turn Start (user-prompt-submit)
|
|
78
|
+
// -------------------------------------------------------------------------
|
|
79
|
+
async handleTurnStart(repoRoot, agentType, event) {
|
|
80
|
+
await hookLogger.info('turn-start', 'lifecycle', {
|
|
81
|
+
agent: agentType,
|
|
82
|
+
model_session_id: event.sessionId,
|
|
83
|
+
prompt: event.prompt?.slice(0, 200),
|
|
84
|
+
});
|
|
85
|
+
const [branch, commitBefore] = await Promise.all([
|
|
86
|
+
getBranch(),
|
|
87
|
+
getHead(),
|
|
88
|
+
]);
|
|
89
|
+
const turnId = `${Date.now()}`;
|
|
90
|
+
// Save local state for correlation on TurnEnd
|
|
91
|
+
const transcriptPath = event.sessionRef ?? '';
|
|
92
|
+
let transcriptOffset = 0;
|
|
93
|
+
if (transcriptPath) {
|
|
94
|
+
try {
|
|
95
|
+
const fs = await import('fs/promises');
|
|
96
|
+
const s = await fs.stat(transcriptPath);
|
|
97
|
+
transcriptOffset = s.size;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// File may not exist yet
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
await saveLocal(repoRoot, event.sessionId, {
|
|
104
|
+
turnId,
|
|
105
|
+
transcriptPath,
|
|
106
|
+
transcriptOffset,
|
|
107
|
+
});
|
|
108
|
+
sendEvent({
|
|
109
|
+
type: 'turn_start',
|
|
110
|
+
sessionId: event.sessionId,
|
|
111
|
+
branch,
|
|
112
|
+
timestamp: new Date().toISOString(),
|
|
113
|
+
turnId,
|
|
114
|
+
prompt: event.prompt ?? '',
|
|
115
|
+
commitBefore,
|
|
116
|
+
}, repoRoot);
|
|
117
|
+
}
|
|
118
|
+
// -------------------------------------------------------------------------
|
|
119
|
+
// Turn End (stop / post-todo)
|
|
120
|
+
// -------------------------------------------------------------------------
|
|
121
|
+
async handleTurnEnd(repoRoot, agentType, event) {
|
|
122
|
+
await hookLogger.info('turn-end', 'lifecycle', {
|
|
123
|
+
agent: agentType,
|
|
124
|
+
model_session_id: event.sessionId,
|
|
125
|
+
});
|
|
126
|
+
const local = await loadLocal(repoRoot, event.sessionId);
|
|
127
|
+
const turnId = local?.turnId ?? '';
|
|
128
|
+
const transcriptPath = local?.transcriptPath ?? event.sessionRef ?? '';
|
|
129
|
+
const transcriptOffset = local?.transcriptOffset ?? 0;
|
|
130
|
+
const emptyTokenUsage = {
|
|
131
|
+
inputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0,
|
|
132
|
+
outputTokens: 0, apiCallCount: 0,
|
|
133
|
+
};
|
|
134
|
+
let toolCalls = [];
|
|
135
|
+
let filesModified = [];
|
|
136
|
+
let filesRead = [];
|
|
137
|
+
let commands = [];
|
|
138
|
+
let tokenUsage = emptyTokenUsage;
|
|
139
|
+
if (transcriptPath) {
|
|
140
|
+
const flushed = await transcriptService.waitForFlush(transcriptPath, 3000);
|
|
141
|
+
if (flushed) {
|
|
142
|
+
try {
|
|
143
|
+
const parseResult = await transcriptService.parse(transcriptPath, transcriptOffset);
|
|
144
|
+
toolCalls = parseResult.toolCalls;
|
|
145
|
+
filesRead = parseResult.filesRead;
|
|
146
|
+
commands = parseResult.commands;
|
|
147
|
+
tokenUsage = parseResult.tokenUsage;
|
|
148
|
+
filesModified = parseResult.modifiedFiles.map(p => ({ path: p, action: 'modified' }));
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
await hookLogger.warn('transcript-parse-error', 'transcript', {
|
|
152
|
+
error: error instanceof Error ? error.message : String(error),
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const [branch, commitAfter] = await Promise.all([
|
|
158
|
+
getBranch(),
|
|
159
|
+
getHead(),
|
|
160
|
+
]);
|
|
161
|
+
sendEvent({
|
|
162
|
+
type: 'turn_end',
|
|
163
|
+
sessionId: event.sessionId,
|
|
164
|
+
branch,
|
|
165
|
+
timestamp: new Date().toISOString(),
|
|
166
|
+
turnId,
|
|
167
|
+
toolCalls,
|
|
168
|
+
filesModified,
|
|
169
|
+
filesRead,
|
|
170
|
+
commands,
|
|
171
|
+
tokenUsage,
|
|
172
|
+
commitAfter,
|
|
173
|
+
}, repoRoot);
|
|
174
|
+
}
|
|
175
|
+
// -------------------------------------------------------------------------
|
|
176
|
+
// Session End
|
|
177
|
+
// -------------------------------------------------------------------------
|
|
178
|
+
async handleSessionEnd(repoRoot, agentType, event) {
|
|
179
|
+
await hookLogger.info('session-end', 'lifecycle', {
|
|
180
|
+
agent: agentType,
|
|
181
|
+
model_session_id: event.sessionId,
|
|
182
|
+
});
|
|
183
|
+
const branch = await getBranch();
|
|
184
|
+
sendEvent({
|
|
185
|
+
type: 'session_end',
|
|
186
|
+
sessionId: event.sessionId,
|
|
187
|
+
branch,
|
|
188
|
+
timestamp: new Date().toISOString(),
|
|
189
|
+
}, repoRoot);
|
|
190
|
+
// Clean up local session file
|
|
191
|
+
await removeLocal(repoRoot, event.sessionId);
|
|
192
|
+
}
|
|
193
|
+
// -------------------------------------------------------------------------
|
|
194
|
+
// Subagent Start (pre-task)
|
|
195
|
+
// -------------------------------------------------------------------------
|
|
196
|
+
async handleSubagentStart(repoRoot, agentType, event) {
|
|
197
|
+
await hookLogger.info('subagent-start', 'lifecycle', {
|
|
198
|
+
agent: agentType,
|
|
199
|
+
model_session_id: event.sessionId,
|
|
200
|
+
tool_use_id: event.toolUseId,
|
|
201
|
+
subagent_type: event.subagentType,
|
|
202
|
+
task_description: event.taskDescription?.slice(0, 200),
|
|
203
|
+
});
|
|
204
|
+
if (!event.toolUseId)
|
|
205
|
+
return;
|
|
206
|
+
const branch = await getBranch();
|
|
207
|
+
// subagentType/taskDescription may live inside toolInput (Claude Code payload)
|
|
208
|
+
const toolInput = (event.toolInput && typeof event.toolInput === 'object')
|
|
209
|
+
? event.toolInput
|
|
210
|
+
: {};
|
|
211
|
+
const subagentType = event.subagentType
|
|
212
|
+
?? pickString(toolInput, 'subagent_type', 'subagentType')
|
|
213
|
+
?? 'unknown';
|
|
214
|
+
const taskDescription = event.taskDescription
|
|
215
|
+
?? pickString(toolInput, 'task_description', 'taskDescription', 'description', 'prompt')
|
|
216
|
+
?? '';
|
|
217
|
+
sendEvent({
|
|
218
|
+
type: 'subagent_start',
|
|
219
|
+
sessionId: event.sessionId,
|
|
220
|
+
branch,
|
|
221
|
+
timestamp: new Date().toISOString(),
|
|
222
|
+
toolUseId: event.toolUseId,
|
|
223
|
+
subagentType,
|
|
224
|
+
taskDescription,
|
|
225
|
+
}, repoRoot);
|
|
226
|
+
}
|
|
227
|
+
// -------------------------------------------------------------------------
|
|
228
|
+
// Subagent End (post-task)
|
|
229
|
+
// -------------------------------------------------------------------------
|
|
230
|
+
async handleSubagentEnd(repoRoot, agentType, event) {
|
|
231
|
+
await hookLogger.info('subagent-end', 'lifecycle', {
|
|
232
|
+
agent: agentType,
|
|
233
|
+
model_session_id: event.sessionId,
|
|
234
|
+
tool_use_id: event.toolUseId,
|
|
235
|
+
});
|
|
236
|
+
if (!event.toolUseId)
|
|
237
|
+
return;
|
|
238
|
+
const branch = await getBranch();
|
|
239
|
+
sendEvent({
|
|
240
|
+
type: 'subagent_end',
|
|
241
|
+
sessionId: event.sessionId,
|
|
242
|
+
branch,
|
|
243
|
+
timestamp: new Date().toISOString(),
|
|
244
|
+
toolUseId: event.toolUseId,
|
|
245
|
+
}, repoRoot);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function pickString(obj, ...keys) {
|
|
249
|
+
for (const key of keys) {
|
|
250
|
+
const val = obj[key];
|
|
251
|
+
if (typeof val === 'string' && val.trim())
|
|
252
|
+
return val.trim();
|
|
253
|
+
}
|
|
254
|
+
return undefined;
|
|
255
|
+
}
|
|
256
|
+
export const lifecycleService = new LifecycleService();
|
|
257
|
+
//# sourceMappingURL=lifecycle.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.service.js","sourceRoot":"","sources":["../../src/services/lifecycle.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface LocalSessionData {
|
|
2
|
+
turnId: string;
|
|
3
|
+
transcriptPath: string;
|
|
4
|
+
transcriptOffset: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function saveLocal(repoRoot: string, sessionId: string, data: LocalSessionData): Promise<void>;
|
|
7
|
+
export declare function loadLocal(repoRoot: string, sessionId: string): Promise<LocalSessionData | null>;
|
|
8
|
+
export declare function removeLocal(repoRoot: string, sessionId: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=session-local.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-local.service.d.ts","sourceRoot":"","sources":["../../src/services/session-local.service.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAYD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1G;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAOrG;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const SESSION_DIR = '.kody/sessions';
|
|
4
|
+
function sessionPath(repoRoot, sessionId) {
|
|
5
|
+
// Prevent path traversal attacks by ensuring sessionId is a simple filename.
|
|
6
|
+
if (path.basename(sessionId) !== sessionId) {
|
|
7
|
+
throw new Error(`Invalid sessionId: ${sessionId}`);
|
|
8
|
+
}
|
|
9
|
+
return path.join(repoRoot, SESSION_DIR, `${sessionId}.json`);
|
|
10
|
+
}
|
|
11
|
+
export async function saveLocal(repoRoot, sessionId, data) {
|
|
12
|
+
const filePath = sessionPath(repoRoot, sessionId);
|
|
13
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
14
|
+
await fs.writeFile(filePath, JSON.stringify(data) + '\n', 'utf-8');
|
|
15
|
+
}
|
|
16
|
+
export async function loadLocal(repoRoot, sessionId) {
|
|
17
|
+
try {
|
|
18
|
+
const content = await fs.readFile(sessionPath(repoRoot, sessionId), 'utf-8');
|
|
19
|
+
return JSON.parse(content);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function removeLocal(repoRoot, sessionId) {
|
|
26
|
+
try {
|
|
27
|
+
await fs.unlink(sessionPath(repoRoot, sessionId));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Ignore if file doesn't exist
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=session-local.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-local.service.js","sourceRoot":"","sources":["../../src/services/session-local.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAErC,SAAS,WAAW,CAAC,QAAgB,EAAE,SAAiB;IACtD,6EAA6E;IAC7E,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,SAAiB,EAAE,IAAsB;IACzF,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,SAAiB;IACjE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,SAAiB;IACnE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { TokenUsage, TranscriptParseResult } from '../types/session.js';
|
|
2
|
+
declare class TranscriptService {
|
|
3
|
+
/**
|
|
4
|
+
* Parse a JSONL transcript file from disk.
|
|
5
|
+
* @param transcriptPath Absolute path to the .jsonl file.
|
|
6
|
+
* @param fromOffset Start parsing from this character offset (for incremental).
|
|
7
|
+
*/
|
|
8
|
+
parse(transcriptPath: string, fromOffset?: number): Promise<TranscriptParseResult>;
|
|
9
|
+
/**
|
|
10
|
+
* Extract only modified file paths from a transcript.
|
|
11
|
+
*/
|
|
12
|
+
extractModifiedFiles(transcriptPath: string): Promise<string[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Extract only prompts from a transcript.
|
|
15
|
+
*/
|
|
16
|
+
extractPrompts(transcriptPath: string): Promise<string[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Get the last assistant message as summary.
|
|
19
|
+
*/
|
|
20
|
+
extractSummary(transcriptPath: string): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Calculate total token usage from assistant messages.
|
|
23
|
+
*/
|
|
24
|
+
calculateTokenUsage(transcriptPath: string): Promise<TokenUsage>;
|
|
25
|
+
/**
|
|
26
|
+
* Wait for transcript file to stabilize (no new writes for ~150ms).
|
|
27
|
+
*/
|
|
28
|
+
waitForFlush(transcriptPath: string, timeoutMs?: number): Promise<boolean>;
|
|
29
|
+
private processMessage;
|
|
30
|
+
}
|
|
31
|
+
export declare const transcriptService: TranscriptService;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=transcript.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.service.d.ts","sourceRoot":"","sources":["../../src/services/transcript.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,qBAAqB,EAGtB,MAAM,qBAAqB,CAAC;AAM7B,cAAM,iBAAiB;IACrB;;;;OAIG;IACG,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwEnF;;OAEG;IACG,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKrE;;OAEG;IACG,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/D;;OAEG;IACG,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7D;;OAEG;IACG,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKtE;;OAEG;IACG,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA8B9E,OAAO,CAAC,cAAc;CA8EvB;AAmCD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
const WRITE_TOOLS = new Set(['Write', 'Edit', 'MultiEdit', 'NotebookEdit']);
|
|
3
|
+
const READ_TOOLS = new Set(['Read', 'Glob', 'Grep']);
|
|
4
|
+
const COMMAND_TOOLS = new Set(['Bash']);
|
|
5
|
+
class TranscriptService {
|
|
6
|
+
/**
|
|
7
|
+
* Parse a JSONL transcript file from disk.
|
|
8
|
+
* @param transcriptPath Absolute path to the .jsonl file.
|
|
9
|
+
* @param fromOffset Start parsing from this character offset (for incremental).
|
|
10
|
+
*/
|
|
11
|
+
async parse(transcriptPath, fromOffset = 0) {
|
|
12
|
+
const result = {
|
|
13
|
+
prompts: [],
|
|
14
|
+
assistantMessages: [],
|
|
15
|
+
modifiedFiles: [],
|
|
16
|
+
tokenUsage: emptyTokenUsage(),
|
|
17
|
+
summary: '',
|
|
18
|
+
subagentIds: [],
|
|
19
|
+
entryCount: 0,
|
|
20
|
+
toolCalls: [],
|
|
21
|
+
filesRead: [],
|
|
22
|
+
commands: [],
|
|
23
|
+
};
|
|
24
|
+
const modifiedFilesSet = new Set();
|
|
25
|
+
const filesReadSet = new Set();
|
|
26
|
+
const subagentIdsSet = new Set();
|
|
27
|
+
let lastAssistantText = '';
|
|
28
|
+
let content;
|
|
29
|
+
try {
|
|
30
|
+
content = await fs.readFile(transcriptPath, 'utf-8');
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error.code === 'ENOENT') {
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
const lines = content.slice(fromOffset).split('\n');
|
|
39
|
+
for (const line of lines) {
|
|
40
|
+
const trimmed = line.trim();
|
|
41
|
+
if (!trimmed)
|
|
42
|
+
continue;
|
|
43
|
+
let entry;
|
|
44
|
+
try {
|
|
45
|
+
entry = JSON.parse(trimmed);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
result.entryCount++;
|
|
51
|
+
// Handle top-level entries with message field
|
|
52
|
+
const message = entry['message'];
|
|
53
|
+
if (message) {
|
|
54
|
+
this.processMessage(message, result, modifiedFilesSet, filesReadSet, (text) => {
|
|
55
|
+
lastAssistantText = text;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// Handle flat entries (role at top level)
|
|
59
|
+
if (!message && typeof entry['role'] === 'string') {
|
|
60
|
+
this.processMessage(entry, result, modifiedFilesSet, filesReadSet, (text) => {
|
|
61
|
+
lastAssistantText = text;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// Subagent tracking
|
|
65
|
+
const subagentId = entry['subagent_id'];
|
|
66
|
+
if (subagentId)
|
|
67
|
+
subagentIdsSet.add(subagentId);
|
|
68
|
+
}
|
|
69
|
+
result.modifiedFiles = [...modifiedFilesSet];
|
|
70
|
+
result.filesRead = [...filesReadSet];
|
|
71
|
+
result.subagentIds = [...subagentIdsSet];
|
|
72
|
+
result.summary = lastAssistantText.slice(0, 500);
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extract only modified file paths from a transcript.
|
|
77
|
+
*/
|
|
78
|
+
async extractModifiedFiles(transcriptPath) {
|
|
79
|
+
const result = await this.parse(transcriptPath);
|
|
80
|
+
return result.modifiedFiles;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Extract only prompts from a transcript.
|
|
84
|
+
*/
|
|
85
|
+
async extractPrompts(transcriptPath) {
|
|
86
|
+
const result = await this.parse(transcriptPath);
|
|
87
|
+
return result.prompts;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get the last assistant message as summary.
|
|
91
|
+
*/
|
|
92
|
+
async extractSummary(transcriptPath) {
|
|
93
|
+
const result = await this.parse(transcriptPath);
|
|
94
|
+
return result.summary;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Calculate total token usage from assistant messages.
|
|
98
|
+
*/
|
|
99
|
+
async calculateTokenUsage(transcriptPath) {
|
|
100
|
+
const result = await this.parse(transcriptPath);
|
|
101
|
+
return result.tokenUsage;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Wait for transcript file to stabilize (no new writes for ~150ms).
|
|
105
|
+
*/
|
|
106
|
+
async waitForFlush(transcriptPath, timeoutMs = 3000) {
|
|
107
|
+
const pollInterval = 50;
|
|
108
|
+
const startTime = Date.now();
|
|
109
|
+
let lastSize = -1;
|
|
110
|
+
let stableCount = 0;
|
|
111
|
+
const requiredStable = 3;
|
|
112
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
113
|
+
try {
|
|
114
|
+
const stat = await fs.stat(transcriptPath);
|
|
115
|
+
if (stat.size === lastSize) {
|
|
116
|
+
stableCount++;
|
|
117
|
+
if (stableCount >= requiredStable)
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
stableCount = 0;
|
|
122
|
+
lastSize = stat.size;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
stableCount = 0;
|
|
127
|
+
}
|
|
128
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
129
|
+
}
|
|
130
|
+
return stableCount >= requiredStable;
|
|
131
|
+
}
|
|
132
|
+
// -------------------------------------------------------------------------
|
|
133
|
+
// Private
|
|
134
|
+
// -------------------------------------------------------------------------
|
|
135
|
+
processMessage(message, result, modifiedFilesSet, filesReadSet, onAssistantText) {
|
|
136
|
+
const role = message['role'];
|
|
137
|
+
if (role === 'human' || role === 'user') {
|
|
138
|
+
const text = extractTextFromContent(message['content']);
|
|
139
|
+
if (text)
|
|
140
|
+
result.prompts.push(text);
|
|
141
|
+
}
|
|
142
|
+
if (role === 'assistant') {
|
|
143
|
+
const text = extractTextFromContent(message['content']);
|
|
144
|
+
if (text) {
|
|
145
|
+
result.assistantMessages.push(text);
|
|
146
|
+
onAssistantText(text);
|
|
147
|
+
}
|
|
148
|
+
// Token usage
|
|
149
|
+
const usage = message['usage'];
|
|
150
|
+
if (usage) {
|
|
151
|
+
result.tokenUsage.inputTokens += toNumber(usage['input_tokens']);
|
|
152
|
+
result.tokenUsage.outputTokens += toNumber(usage['output_tokens']);
|
|
153
|
+
result.tokenUsage.cacheCreationTokens += toNumber(usage['cache_creation_input_tokens']);
|
|
154
|
+
result.tokenUsage.cacheReadTokens += toNumber(usage['cache_read_input_tokens']);
|
|
155
|
+
result.tokenUsage.apiCallCount++;
|
|
156
|
+
}
|
|
157
|
+
// Extract tool calls from content blocks
|
|
158
|
+
const content = message['content'];
|
|
159
|
+
if (Array.isArray(content)) {
|
|
160
|
+
for (const block of content) {
|
|
161
|
+
if (!block || typeof block !== 'object')
|
|
162
|
+
continue;
|
|
163
|
+
const b = block;
|
|
164
|
+
if (b.type !== 'tool_use' || !b.name)
|
|
165
|
+
continue;
|
|
166
|
+
const toolName = b.name;
|
|
167
|
+
const isMcp = toolName.includes('__') || toolName.startsWith('mcp_');
|
|
168
|
+
const input = b.input ?? {};
|
|
169
|
+
const filePath = input['file_path'] ?? input['filePath'];
|
|
170
|
+
// Build structured ToolCall
|
|
171
|
+
const toolCall = {
|
|
172
|
+
toolName,
|
|
173
|
+
toolUseId: b.id ?? '',
|
|
174
|
+
timestamp: new Date().toISOString(),
|
|
175
|
+
input: input,
|
|
176
|
+
isMcp,
|
|
177
|
+
mcpServer: isMcp ? toolName.split('__')[1] ?? toolName.split('_')[1] : undefined,
|
|
178
|
+
fileAffected: typeof filePath === 'string' ? filePath : undefined,
|
|
179
|
+
};
|
|
180
|
+
result.toolCalls.push(toolCall);
|
|
181
|
+
// Track modified files
|
|
182
|
+
if (WRITE_TOOLS.has(toolName) && typeof filePath === 'string') {
|
|
183
|
+
modifiedFilesSet.add(filePath);
|
|
184
|
+
}
|
|
185
|
+
// Track read files
|
|
186
|
+
if (READ_TOOLS.has(toolName) && typeof filePath === 'string') {
|
|
187
|
+
filesReadSet.add(filePath);
|
|
188
|
+
}
|
|
189
|
+
// Track bash commands
|
|
190
|
+
if (COMMAND_TOOLS.has(toolName)) {
|
|
191
|
+
const command = input['command'];
|
|
192
|
+
if (typeof command === 'string') {
|
|
193
|
+
result.commands.push(command);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
// Helpers
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
function extractTextFromContent(content) {
|
|
205
|
+
if (typeof content === 'string')
|
|
206
|
+
return content;
|
|
207
|
+
if (!Array.isArray(content))
|
|
208
|
+
return '';
|
|
209
|
+
const texts = [];
|
|
210
|
+
for (const block of content) {
|
|
211
|
+
if (!block || typeof block !== 'object')
|
|
212
|
+
continue;
|
|
213
|
+
const b = block;
|
|
214
|
+
if (b['type'] === 'text' && typeof b['text'] === 'string') {
|
|
215
|
+
texts.push(b['text']);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return texts.join('\n');
|
|
219
|
+
}
|
|
220
|
+
function toNumber(value) {
|
|
221
|
+
return typeof value === 'number' ? value : 0;
|
|
222
|
+
}
|
|
223
|
+
function emptyTokenUsage() {
|
|
224
|
+
return {
|
|
225
|
+
inputTokens: 0,
|
|
226
|
+
cacheCreationTokens: 0,
|
|
227
|
+
cacheReadTokens: 0,
|
|
228
|
+
outputTokens: 0,
|
|
229
|
+
apiCallCount: 0,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
export const transcriptService = new TranscriptService();
|
|
233
|
+
//# sourceMappingURL=transcript.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.service.js","sourceRoot":"","sources":["../../src/services/transcript.service.ts"],"names":[],"mappings":"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"}
|
package/dist/types/memory.d.ts
CHANGED
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
export type DecisionType = 'architectural_decision' | 'business_rule' | 'tradeoff' | 'deferral' | 'task' | 'convention';
|
|
2
|
-
export interface DecisionEntry {
|
|
3
|
-
id: string;
|
|
4
|
-
type: DecisionType;
|
|
5
|
-
title: string;
|
|
6
|
-
rationale: string;
|
|
7
|
-
scope: {
|
|
8
|
-
files: string[];
|
|
9
|
-
modules: string[];
|
|
10
|
-
};
|
|
11
|
-
source: {
|
|
12
|
-
agent: string;
|
|
13
|
-
event: string;
|
|
14
|
-
session?: string;
|
|
15
|
-
sha?: string;
|
|
16
|
-
branch: string;
|
|
17
|
-
};
|
|
18
|
-
createdAt: string;
|
|
19
|
-
}
|
|
20
1
|
export interface TranscriptSignals {
|
|
21
2
|
sessionId?: string;
|
|
22
3
|
turnId?: string;
|
|
@@ -30,33 +11,6 @@ export interface ToolUseSignal {
|
|
|
30
11
|
filePath?: string;
|
|
31
12
|
summary?: string;
|
|
32
13
|
}
|
|
33
|
-
export interface PrMemoryMeta {
|
|
34
|
-
branch: string;
|
|
35
|
-
createdAt: string;
|
|
36
|
-
updatedAt: string;
|
|
37
|
-
lastSha: string;
|
|
38
|
-
agent: string;
|
|
39
|
-
sessionCount: number;
|
|
40
|
-
}
|
|
41
|
-
export interface ModuleConfig {
|
|
42
|
-
id: string;
|
|
43
|
-
name: string;
|
|
44
|
-
paths: string[];
|
|
45
|
-
memoryFile: string;
|
|
46
|
-
}
|
|
47
|
-
export interface ModulesYml {
|
|
48
|
-
version: number;
|
|
49
|
-
modules: ModuleConfig[];
|
|
50
|
-
}
|
|
51
|
-
export interface MemoryCaptureInput {
|
|
52
|
-
repoRoot: string;
|
|
53
|
-
headSha: string | null;
|
|
54
|
-
agent: string;
|
|
55
|
-
event: string;
|
|
56
|
-
branch: string;
|
|
57
|
-
payload?: unknown;
|
|
58
|
-
summary?: string;
|
|
59
|
-
}
|
|
60
14
|
export interface MemoryCaptureApiRequest {
|
|
61
15
|
branch: string;
|
|
62
16
|
sha: string | null;
|