@enruana/claude-orka 0.1.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/README.md +240 -0
- package/bin/orka.js +19 -0
- package/dist/core/ClaudeOrka.d.ts +111 -0
- package/dist/core/ClaudeOrka.d.ts.map +1 -0
- package/dist/core/ClaudeOrka.js +160 -0
- package/dist/core/ClaudeOrka.js.map +1 -0
- package/dist/core/SessionManager.d.ts +82 -0
- package/dist/core/SessionManager.d.ts.map +1 -0
- package/dist/core/SessionManager.js +519 -0
- package/dist/core/SessionManager.js.map +1 -0
- package/dist/core/StateManager.d.ts +92 -0
- package/dist/core/StateManager.d.ts.map +1 -0
- package/dist/core/StateManager.js +307 -0
- package/dist/core/StateManager.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +20 -0
- package/dist/core/index.js.map +1 -0
- package/dist/electron/main/ipc-handlers.d.ts +5 -0
- package/dist/electron/main/ipc-handlers.d.ts.map +1 -0
- package/dist/electron/main/ipc-handlers.js +169 -0
- package/dist/electron/main/ipc-handlers.js.map +1 -0
- package/dist/electron/main/main.d.ts +5 -0
- package/dist/electron/main/main.d.ts.map +1 -0
- package/dist/electron/main/main.js +66 -0
- package/dist/electron/main/main.js.map +1 -0
- package/dist/electron/preload/preload.d.ts +25 -0
- package/dist/electron/preload/preload.d.ts.map +1 -0
- package/dist/electron/preload/preload.js +31 -0
- package/dist/electron/preload/preload.js.map +1 -0
- package/dist/electron/renderer/app.js +808 -0
- package/dist/electron/renderer/index.html +189 -0
- package/dist/electron/renderer/styles.css +736 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/models/Fork.d.ts +26 -0
- package/dist/models/Fork.d.ts.map +1 -0
- package/dist/models/Fork.js +3 -0
- package/dist/models/Fork.js.map +1 -0
- package/dist/models/Session.d.ts +38 -0
- package/dist/models/Session.d.ts.map +1 -0
- package/dist/models/Session.js +3 -0
- package/dist/models/Session.js.map +1 -0
- package/dist/models/State.d.ts +24 -0
- package/dist/models/State.d.ts.map +1 -0
- package/dist/models/State.js +3 -0
- package/dist/models/State.js.map +1 -0
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +20 -0
- package/dist/models/index.js.map +1 -0
- package/dist/src/cli/commands/doctor.d.ts +3 -0
- package/dist/src/cli/commands/doctor.d.ts.map +1 -0
- package/dist/src/cli/commands/doctor.js +266 -0
- package/dist/src/cli/commands/doctor.js.map +1 -0
- package/dist/src/cli/commands/fork.d.ts +3 -0
- package/dist/src/cli/commands/fork.d.ts.map +1 -0
- package/dist/src/cli/commands/fork.js +136 -0
- package/dist/src/cli/commands/fork.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts +3 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -0
- package/dist/src/cli/commands/init.js +22 -0
- package/dist/src/cli/commands/init.js.map +1 -0
- package/dist/src/cli/commands/merge.d.ts +3 -0
- package/dist/src/cli/commands/merge.d.ts.map +1 -0
- package/dist/src/cli/commands/merge.js +84 -0
- package/dist/src/cli/commands/merge.js.map +1 -0
- package/dist/src/cli/commands/prepare.d.ts +3 -0
- package/dist/src/cli/commands/prepare.d.ts.map +1 -0
- package/dist/src/cli/commands/prepare.js +154 -0
- package/dist/src/cli/commands/prepare.js.map +1 -0
- package/dist/src/cli/commands/session.d.ts +3 -0
- package/dist/src/cli/commands/session.d.ts.map +1 -0
- package/dist/src/cli/commands/session.js +166 -0
- package/dist/src/cli/commands/session.js.map +1 -0
- package/dist/src/cli/commands/status.d.ts +3 -0
- package/dist/src/cli/commands/status.d.ts.map +1 -0
- package/dist/src/cli/commands/status.js +28 -0
- package/dist/src/cli/commands/status.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +25 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/utils/errors.d.ts +24 -0
- package/dist/src/cli/utils/errors.d.ts.map +1 -0
- package/dist/src/cli/utils/errors.js +57 -0
- package/dist/src/cli/utils/errors.js.map +1 -0
- package/dist/src/cli/utils/output.d.ts +59 -0
- package/dist/src/cli/utils/output.d.ts.map +1 -0
- package/dist/src/cli/utils/output.js +222 -0
- package/dist/src/cli/utils/output.js.map +1 -0
- package/dist/src/core/ClaudeOrka.d.ts +158 -0
- package/dist/src/core/ClaudeOrka.d.ts.map +1 -0
- package/dist/src/core/ClaudeOrka.js +264 -0
- package/dist/src/core/ClaudeOrka.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +84 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +501 -0
- package/dist/src/core/SessionManager.js.map +1 -0
- package/dist/src/core/StateManager.d.ts +108 -0
- package/dist/src/core/StateManager.d.ts.map +1 -0
- package/dist/src/core/StateManager.js +317 -0
- package/dist/src/core/StateManager.js.map +1 -0
- package/dist/src/core/index.d.ts +4 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/core/index.js +4 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/models/Fork.d.ts +24 -0
- package/dist/src/models/Fork.d.ts.map +1 -0
- package/dist/src/models/Fork.js +2 -0
- package/dist/src/models/Fork.js.map +1 -0
- package/dist/src/models/Session.d.ts +36 -0
- package/dist/src/models/Session.d.ts.map +1 -0
- package/dist/src/models/Session.js +2 -0
- package/dist/src/models/Session.js.map +1 -0
- package/dist/src/models/State.d.ts +24 -0
- package/dist/src/models/State.d.ts.map +1 -0
- package/dist/src/models/State.js +2 -0
- package/dist/src/models/State.js.map +1 -0
- package/dist/src/models/Summary.d.ts +68 -0
- package/dist/src/models/Summary.d.ts.map +1 -0
- package/dist/src/models/Summary.js +2 -0
- package/dist/src/models/Summary.js.map +1 -0
- package/dist/src/models/index.d.ts +5 -0
- package/dist/src/models/index.d.ts.map +1 -0
- package/dist/src/models/index.js +5 -0
- package/dist/src/models/index.js.map +1 -0
- package/dist/src/utils/claude-history.d.ts +34 -0
- package/dist/src/utils/claude-history.d.ts.map +1 -0
- package/dist/src/utils/claude-history.js +82 -0
- package/dist/src/utils/claude-history.js.map +1 -0
- package/dist/src/utils/index.d.ts +4 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +4 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +20 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +38 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/tmux.d.ts +89 -0
- package/dist/src/utils/tmux.d.ts.map +1 -0
- package/dist/src/utils/tmux.js +299 -0
- package/dist/src/utils/tmux.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +19 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +41 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/tmux.d.ts +77 -0
- package/dist/utils/tmux.d.ts.map +1 -0
- package/dist/utils/tmux.js +270 -0
- package/dist/utils/tmux.js.map +1 -0
- package/package.json +110 -0
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
import { StateManager } from './StateManager';
|
|
2
|
+
import { TmuxCommands, logger, getExistingSessionIds, detectNewSessionId } from '../utils';
|
|
3
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import fs from 'fs-extra';
|
|
6
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
7
|
+
/**
|
|
8
|
+
* Gestiona sesiones de Claude Code usando tmux
|
|
9
|
+
*/
|
|
10
|
+
export class SessionManager {
|
|
11
|
+
stateManager;
|
|
12
|
+
projectPath;
|
|
13
|
+
constructor(projectPath) {
|
|
14
|
+
this.projectPath = projectPath;
|
|
15
|
+
this.stateManager = new StateManager(projectPath);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Initialize el manager
|
|
19
|
+
*/
|
|
20
|
+
async initialize() {
|
|
21
|
+
await this.stateManager.initialize();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Obtener el state
|
|
25
|
+
*/
|
|
26
|
+
async getState() {
|
|
27
|
+
return await this.stateManager.getState();
|
|
28
|
+
}
|
|
29
|
+
// ==========================================
|
|
30
|
+
// SESIONES
|
|
31
|
+
// ==========================================
|
|
32
|
+
/**
|
|
33
|
+
* Crear una nueva sesión de Claude Code
|
|
34
|
+
*/
|
|
35
|
+
async createSession(name, openTerminal = true) {
|
|
36
|
+
const sessionId = uuidv4();
|
|
37
|
+
const sessionName = name || `Session-${Date.now()}`;
|
|
38
|
+
const tmuxSessionId = `orka-${sessionId}`;
|
|
39
|
+
logger.info(`Creating session: ${sessionName}`);
|
|
40
|
+
// 1. Create tmux session
|
|
41
|
+
await TmuxCommands.createSession(tmuxSessionId, this.projectPath);
|
|
42
|
+
if (openTerminal) {
|
|
43
|
+
await TmuxCommands.openTerminalWindow(tmuxSessionId);
|
|
44
|
+
}
|
|
45
|
+
await sleep(2000);
|
|
46
|
+
// 2. Obtener pane ID
|
|
47
|
+
const paneId = await TmuxCommands.getMainPaneId(tmuxSessionId);
|
|
48
|
+
logger.debug(`Main pane ID: ${paneId}`);
|
|
49
|
+
// 3. Generar Claude session ID y crear sesión con prompt inicial
|
|
50
|
+
const claudeSessionId = uuidv4();
|
|
51
|
+
await this.initializeClaude(paneId, {
|
|
52
|
+
type: 'new',
|
|
53
|
+
sessionId: claudeSessionId,
|
|
54
|
+
sessionName: sessionName,
|
|
55
|
+
});
|
|
56
|
+
// 4. Crear y guardar session
|
|
57
|
+
const session = {
|
|
58
|
+
id: sessionId,
|
|
59
|
+
name: sessionName,
|
|
60
|
+
tmuxSessionId,
|
|
61
|
+
status: 'active',
|
|
62
|
+
createdAt: new Date().toISOString(),
|
|
63
|
+
lastActivity: new Date().toISOString(),
|
|
64
|
+
main: {
|
|
65
|
+
claudeSessionId,
|
|
66
|
+
tmuxPaneId: paneId,
|
|
67
|
+
status: 'active',
|
|
68
|
+
},
|
|
69
|
+
forks: [],
|
|
70
|
+
};
|
|
71
|
+
await this.stateManager.addSession(session);
|
|
72
|
+
logger.info(`Session created: ${sessionName} (${sessionId})`);
|
|
73
|
+
return session;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Restaurar una sesión guardada
|
|
77
|
+
*/
|
|
78
|
+
async resumeSession(sessionId, openTerminal = true) {
|
|
79
|
+
const session = await this.getSession(sessionId);
|
|
80
|
+
if (!session) {
|
|
81
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
82
|
+
}
|
|
83
|
+
logger.info(`Resuming session: ${session.name}`);
|
|
84
|
+
const tmuxSessionId = `orka-${sessionId}`;
|
|
85
|
+
// 1. Crear nueva tmux session
|
|
86
|
+
await TmuxCommands.createSession(tmuxSessionId, this.projectPath);
|
|
87
|
+
if (openTerminal) {
|
|
88
|
+
await TmuxCommands.openTerminalWindow(tmuxSessionId);
|
|
89
|
+
}
|
|
90
|
+
await sleep(2000);
|
|
91
|
+
// 2. Obtener pane ID
|
|
92
|
+
const paneId = await TmuxCommands.getMainPaneId(tmuxSessionId);
|
|
93
|
+
// 3. Resume Claude session (Claude handles context automatically)
|
|
94
|
+
await this.initializeClaude(paneId, {
|
|
95
|
+
type: 'resume',
|
|
96
|
+
resumeSessionId: session.main.claudeSessionId,
|
|
97
|
+
sessionName: session.name,
|
|
98
|
+
});
|
|
99
|
+
// 4. Update session
|
|
100
|
+
session.tmuxSessionId = tmuxSessionId;
|
|
101
|
+
session.main.tmuxPaneId = paneId;
|
|
102
|
+
session.main.status = 'active';
|
|
103
|
+
session.status = 'active';
|
|
104
|
+
session.lastActivity = new Date().toISOString();
|
|
105
|
+
await this.stateManager.replaceSession(session);
|
|
106
|
+
// 5. Resume non-merged forks
|
|
107
|
+
const forksToRestore = session.forks.filter((f) => f.status !== 'merged');
|
|
108
|
+
if (forksToRestore.length > 0) {
|
|
109
|
+
logger.info(`Restoring ${forksToRestore.length} fork(s)...`);
|
|
110
|
+
for (const fork of forksToRestore) {
|
|
111
|
+
await this.resumeFork(sessionId, fork.id);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
logger.info(`Session resumed: ${session.name}`);
|
|
115
|
+
return session;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Close a session (save and kill tmux)
|
|
119
|
+
*/
|
|
120
|
+
async closeSession(sessionId) {
|
|
121
|
+
const session = await this.getSession(sessionId);
|
|
122
|
+
if (!session) {
|
|
123
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
124
|
+
}
|
|
125
|
+
logger.info(`Closing session: ${session.name}`);
|
|
126
|
+
// 1. Close all active forks
|
|
127
|
+
const activeForks = session.forks.filter((f) => f.status === 'active');
|
|
128
|
+
for (const fork of activeForks) {
|
|
129
|
+
await this.closeFork(sessionId, fork.id);
|
|
130
|
+
}
|
|
131
|
+
// 2. Kill tmux session (Claude session persists automatically)
|
|
132
|
+
if (session.tmuxSessionId) {
|
|
133
|
+
await TmuxCommands.killSession(session.tmuxSessionId);
|
|
134
|
+
}
|
|
135
|
+
// 3. Update state
|
|
136
|
+
session.main.status = 'saved';
|
|
137
|
+
session.main.tmuxPaneId = undefined;
|
|
138
|
+
session.status = 'saved';
|
|
139
|
+
session.lastActivity = new Date().toISOString();
|
|
140
|
+
await this.stateManager.replaceSession(session);
|
|
141
|
+
logger.info(`Session closed: ${session.name}`);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Eliminar una sesión permanentemente
|
|
145
|
+
*/
|
|
146
|
+
async deleteSession(sessionId) {
|
|
147
|
+
const session = await this.getSession(sessionId);
|
|
148
|
+
if (!session) {
|
|
149
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
150
|
+
}
|
|
151
|
+
logger.info(`Deleting session: ${session.name}`);
|
|
152
|
+
// Cerrar si está activa
|
|
153
|
+
if (session.status === 'active') {
|
|
154
|
+
await this.closeSession(sessionId);
|
|
155
|
+
}
|
|
156
|
+
// Eliminar del state
|
|
157
|
+
await this.stateManager.deleteSession(sessionId);
|
|
158
|
+
logger.info(`Session deleted: ${session.name}`);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Listar sesiones con filtros opcionales
|
|
162
|
+
*/
|
|
163
|
+
async listSessions(filters) {
|
|
164
|
+
return await this.stateManager.listSessions(filters);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Obtener una sesión por ID
|
|
168
|
+
*/
|
|
169
|
+
async getSession(sessionId) {
|
|
170
|
+
return await this.stateManager.getSession(sessionId);
|
|
171
|
+
}
|
|
172
|
+
// ==========================================
|
|
173
|
+
// FORKS
|
|
174
|
+
// ==========================================
|
|
175
|
+
/**
|
|
176
|
+
* Crear un fork (rama de conversación)
|
|
177
|
+
*/
|
|
178
|
+
async createFork(sessionId, name, vertical = false) {
|
|
179
|
+
const session = await this.getSession(sessionId);
|
|
180
|
+
if (!session) {
|
|
181
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
182
|
+
}
|
|
183
|
+
const forkId = uuidv4();
|
|
184
|
+
const forkName = name || `Fork-${session.forks.length + 1}`;
|
|
185
|
+
logger.info(`Creating fork: ${forkName} in session ${session.name}`);
|
|
186
|
+
// 1. Crear split en tmux
|
|
187
|
+
await TmuxCommands.splitPane(session.tmuxSessionId, vertical);
|
|
188
|
+
await sleep(1000);
|
|
189
|
+
// 2. Obtener nuevo pane ID (último pane creado)
|
|
190
|
+
const allPanes = await TmuxCommands.listPanes(session.tmuxSessionId);
|
|
191
|
+
const forkPaneId = allPanes[allPanes.length - 1];
|
|
192
|
+
logger.debug(`Fork pane ID: ${forkPaneId}`);
|
|
193
|
+
// 3. 🔑 CLAVE: Capturar session IDs ANTES de crear el fork
|
|
194
|
+
const existingIds = await getExistingSessionIds();
|
|
195
|
+
logger.debug(`Existing sessions before fork: ${existingIds.size}`);
|
|
196
|
+
// 4. Start Claude fork con prompt inicial
|
|
197
|
+
await this.initializeClaude(forkPaneId, {
|
|
198
|
+
type: 'fork',
|
|
199
|
+
parentSessionId: session.main.claudeSessionId,
|
|
200
|
+
forkName: forkName,
|
|
201
|
+
});
|
|
202
|
+
// 5. 🔍 Detectar el fork session ID del history
|
|
203
|
+
logger.info('Detecting fork session ID from history...');
|
|
204
|
+
const detectedForkId = await detectNewSessionId(existingIds, 30000, 500);
|
|
205
|
+
if (!detectedForkId) {
|
|
206
|
+
throw new Error('Failed to detect fork session ID. Fork may not have been created. Check if the parent session is valid.');
|
|
207
|
+
}
|
|
208
|
+
logger.info(`Fork session ID detected: ${detectedForkId}`);
|
|
209
|
+
// 6. Crear fork con el ID detectado
|
|
210
|
+
const fork = {
|
|
211
|
+
id: forkId,
|
|
212
|
+
name: forkName,
|
|
213
|
+
claudeSessionId: detectedForkId, // ✅ ID real detectado
|
|
214
|
+
tmuxPaneId: forkPaneId,
|
|
215
|
+
status: 'active',
|
|
216
|
+
createdAt: new Date().toISOString(),
|
|
217
|
+
};
|
|
218
|
+
session.forks.push(fork);
|
|
219
|
+
session.lastActivity = new Date().toISOString();
|
|
220
|
+
await this.stateManager.replaceSession(session);
|
|
221
|
+
logger.info(`Fork created: ${forkName} (${forkId})`);
|
|
222
|
+
return fork;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Restaurar un fork guardado
|
|
226
|
+
*/
|
|
227
|
+
async resumeFork(sessionId, forkId) {
|
|
228
|
+
const session = await this.getSession(sessionId);
|
|
229
|
+
if (!session) {
|
|
230
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
231
|
+
}
|
|
232
|
+
const fork = session.forks.find((f) => f.id === forkId);
|
|
233
|
+
if (!fork) {
|
|
234
|
+
throw new Error(`Fork ${forkId} not found`);
|
|
235
|
+
}
|
|
236
|
+
logger.info(`Resuming fork: ${fork.name}`);
|
|
237
|
+
// 1. Crear split en tmux
|
|
238
|
+
await TmuxCommands.splitPane(session.tmuxSessionId, false);
|
|
239
|
+
await sleep(1000);
|
|
240
|
+
// 2. Obtener nuevo pane ID
|
|
241
|
+
const allPanes = await TmuxCommands.listPanes(session.tmuxSessionId);
|
|
242
|
+
const forkPaneId = allPanes[allPanes.length - 1];
|
|
243
|
+
// 3. Restaurar Claude fork session (Claude maneja el contexto)
|
|
244
|
+
await this.initializeClaude(forkPaneId, {
|
|
245
|
+
type: 'resume',
|
|
246
|
+
resumeSessionId: fork.claudeSessionId,
|
|
247
|
+
sessionName: fork.name,
|
|
248
|
+
});
|
|
249
|
+
// 4. Actualizar fork
|
|
250
|
+
fork.tmuxPaneId = forkPaneId;
|
|
251
|
+
fork.status = 'active';
|
|
252
|
+
session.lastActivity = new Date().toISOString();
|
|
253
|
+
await this.stateManager.replaceSession(session);
|
|
254
|
+
logger.info(`Fork resumed: ${fork.name}`);
|
|
255
|
+
return fork;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Cerrar un fork
|
|
259
|
+
*/
|
|
260
|
+
async closeFork(sessionId, forkId) {
|
|
261
|
+
const session = await this.getSession(sessionId);
|
|
262
|
+
if (!session) {
|
|
263
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
264
|
+
}
|
|
265
|
+
const fork = session.forks.find((f) => f.id === forkId);
|
|
266
|
+
if (!fork) {
|
|
267
|
+
throw new Error(`Fork ${forkId} not found`);
|
|
268
|
+
}
|
|
269
|
+
logger.info(`Closing fork: ${fork.name}`);
|
|
270
|
+
// Matar el pane de tmux si existe (Claude session persiste)
|
|
271
|
+
if (fork.tmuxPaneId) {
|
|
272
|
+
await TmuxCommands.killPane(fork.tmuxPaneId);
|
|
273
|
+
}
|
|
274
|
+
// Actualizar estado
|
|
275
|
+
fork.status = 'saved';
|
|
276
|
+
fork.tmuxPaneId = undefined;
|
|
277
|
+
session.lastActivity = new Date().toISOString();
|
|
278
|
+
await this.stateManager.replaceSession(session);
|
|
279
|
+
logger.info(`Fork closed: ${fork.name}`);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Eliminar un fork permanentemente
|
|
283
|
+
*/
|
|
284
|
+
async deleteFork(sessionId, forkId) {
|
|
285
|
+
const session = await this.getSession(sessionId);
|
|
286
|
+
if (!session) {
|
|
287
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
288
|
+
}
|
|
289
|
+
const forkIndex = session.forks.findIndex((f) => f.id === forkId);
|
|
290
|
+
if (forkIndex === -1) {
|
|
291
|
+
throw new Error(`Fork ${forkId} not found`);
|
|
292
|
+
}
|
|
293
|
+
const fork = session.forks[forkIndex];
|
|
294
|
+
logger.info(`Deleting fork: ${fork.name}`);
|
|
295
|
+
// Cerrar si está activo
|
|
296
|
+
if (fork.status === 'active') {
|
|
297
|
+
await this.closeFork(sessionId, forkId);
|
|
298
|
+
}
|
|
299
|
+
// Eliminar del array
|
|
300
|
+
session.forks.splice(forkIndex, 1);
|
|
301
|
+
session.lastActivity = new Date().toISOString();
|
|
302
|
+
await this.stateManager.replaceSession(session);
|
|
303
|
+
logger.info(`Fork deleted: ${fork.name}`);
|
|
304
|
+
}
|
|
305
|
+
// ==========================================
|
|
306
|
+
// COMANDOS
|
|
307
|
+
// ==========================================
|
|
308
|
+
/**
|
|
309
|
+
* Enviar comando a main
|
|
310
|
+
*/
|
|
311
|
+
async sendToMain(sessionId, command) {
|
|
312
|
+
const session = await this.getSession(sessionId);
|
|
313
|
+
if (!session) {
|
|
314
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
315
|
+
}
|
|
316
|
+
if (!session.main.tmuxPaneId) {
|
|
317
|
+
throw new Error('Main pane is not active');
|
|
318
|
+
}
|
|
319
|
+
logger.info(`Sending command to main: ${command}`);
|
|
320
|
+
await TmuxCommands.sendKeys(session.main.tmuxPaneId, command);
|
|
321
|
+
await TmuxCommands.sendEnter(session.main.tmuxPaneId);
|
|
322
|
+
session.lastActivity = new Date().toISOString();
|
|
323
|
+
await this.stateManager.replaceSession(session);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Enviar comando a un fork
|
|
327
|
+
*/
|
|
328
|
+
async sendToFork(sessionId, forkId, command) {
|
|
329
|
+
const session = await this.getSession(sessionId);
|
|
330
|
+
if (!session) {
|
|
331
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
332
|
+
}
|
|
333
|
+
const fork = session.forks.find((f) => f.id === forkId);
|
|
334
|
+
if (!fork) {
|
|
335
|
+
throw new Error(`Fork ${forkId} not found`);
|
|
336
|
+
}
|
|
337
|
+
if (!fork.tmuxPaneId) {
|
|
338
|
+
throw new Error('Fork pane is not active');
|
|
339
|
+
}
|
|
340
|
+
logger.info(`Sending command to fork ${fork.name}: ${command}`);
|
|
341
|
+
await TmuxCommands.sendKeys(fork.tmuxPaneId, command);
|
|
342
|
+
await TmuxCommands.sendEnter(fork.tmuxPaneId);
|
|
343
|
+
session.lastActivity = new Date().toISOString();
|
|
344
|
+
await this.stateManager.replaceSession(session);
|
|
345
|
+
}
|
|
346
|
+
// ==========================================
|
|
347
|
+
// EXPORT & MERGE
|
|
348
|
+
// ==========================================
|
|
349
|
+
/**
|
|
350
|
+
* Generar export de un fork con resumen
|
|
351
|
+
* Envía un prompt a Claude pidiendo que genere resumen y exporte
|
|
352
|
+
*/
|
|
353
|
+
async generateForkExport(sessionId, forkId) {
|
|
354
|
+
const session = await this.getSession(sessionId);
|
|
355
|
+
if (!session) {
|
|
356
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
357
|
+
}
|
|
358
|
+
const fork = session.forks.find((f) => f.id === forkId);
|
|
359
|
+
if (!fork) {
|
|
360
|
+
throw new Error(`Fork ${forkId} not found`);
|
|
361
|
+
}
|
|
362
|
+
logger.info(`Generating export for fork: ${fork.name}`);
|
|
363
|
+
// Path del export
|
|
364
|
+
const exportsDir = path.join(this.projectPath, '.claude-orka', 'exports');
|
|
365
|
+
await fs.ensureDir(exportsDir);
|
|
366
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
367
|
+
const exportName = `fork-${fork.name}-${timestamp}.md`;
|
|
368
|
+
const relativeExportPath = `.claude-orka/exports/${exportName}`;
|
|
369
|
+
// Prompt for Claude
|
|
370
|
+
const prompt = `
|
|
371
|
+
Please generate a complete summary of this fork conversation "${fork.name}" and save it to the file:
|
|
372
|
+
\`${relativeExportPath}\`
|
|
373
|
+
|
|
374
|
+
The summary should include:
|
|
375
|
+
|
|
376
|
+
## Executive Summary
|
|
377
|
+
- What was attempted to achieve in this fork
|
|
378
|
+
- Why this exploration branch was created
|
|
379
|
+
|
|
380
|
+
## Changes Made
|
|
381
|
+
- Detailed list of changes, modified files, written code
|
|
382
|
+
- Technical decisions made
|
|
383
|
+
|
|
384
|
+
## Results
|
|
385
|
+
- What works correctly
|
|
386
|
+
- What problems were encountered
|
|
387
|
+
- What remains pending
|
|
388
|
+
|
|
389
|
+
## Recommendations
|
|
390
|
+
- Suggested next steps
|
|
391
|
+
- How to integrate this to main
|
|
392
|
+
- Important considerations
|
|
393
|
+
|
|
394
|
+
Write the summary in Markdown format and save it to the specified file.
|
|
395
|
+
`.trim();
|
|
396
|
+
// Send to Claude
|
|
397
|
+
if (!fork.tmuxPaneId) {
|
|
398
|
+
throw new Error('Fork pane is not active. Cannot send export command.');
|
|
399
|
+
}
|
|
400
|
+
await TmuxCommands.sendKeys(fork.tmuxPaneId, prompt);
|
|
401
|
+
await TmuxCommands.sendEnter(fork.tmuxPaneId);
|
|
402
|
+
// Save path in fork
|
|
403
|
+
fork.contextPath = relativeExportPath;
|
|
404
|
+
await this.stateManager.replaceSession(session);
|
|
405
|
+
logger.info(`Export generation requested. Path: ${relativeExportPath}`);
|
|
406
|
+
logger.warn('IMPORTANT: Wait for Claude to complete before calling merge()');
|
|
407
|
+
return relativeExportPath;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Hacer merge de un fork a main
|
|
411
|
+
* PREREQUISITO: Debes llamar a generateForkExport() primero y esperar
|
|
412
|
+
*/
|
|
413
|
+
async mergeFork(sessionId, forkId) {
|
|
414
|
+
const session = await this.getSession(sessionId);
|
|
415
|
+
if (!session) {
|
|
416
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
417
|
+
}
|
|
418
|
+
const fork = session.forks.find((f) => f.id === forkId);
|
|
419
|
+
if (!fork) {
|
|
420
|
+
throw new Error(`Fork ${forkId} not found`);
|
|
421
|
+
}
|
|
422
|
+
if (!fork.contextPath) {
|
|
423
|
+
throw new Error('Fork does not have an exported context. Call generateForkExport() first.');
|
|
424
|
+
}
|
|
425
|
+
logger.info(`Merging fork ${fork.name} to main`);
|
|
426
|
+
// Verificar que el archivo existe
|
|
427
|
+
const fullPath = path.join(this.projectPath, fork.contextPath);
|
|
428
|
+
const exists = await fs.pathExists(fullPath);
|
|
429
|
+
if (!exists) {
|
|
430
|
+
throw new Error(`Export file not found: ${fork.contextPath}. Make sure generateForkExport() completed.`);
|
|
431
|
+
}
|
|
432
|
+
// Send merge prompt to main
|
|
433
|
+
const mergePrompt = `
|
|
434
|
+
I have completed work on the fork "${fork.name}".
|
|
435
|
+
Please read the file \`${fork.contextPath}\` which contains:
|
|
436
|
+
1. An executive summary of the work completed
|
|
437
|
+
2. The complete context of the fork conversation
|
|
438
|
+
|
|
439
|
+
Analyze the content and help me integrate the changes and learnings from the fork into this main conversation.
|
|
440
|
+
`.trim();
|
|
441
|
+
if (!session.main.tmuxPaneId) {
|
|
442
|
+
throw new Error('Main pane is not active. Cannot send merge command.');
|
|
443
|
+
}
|
|
444
|
+
await TmuxCommands.sendKeys(session.main.tmuxPaneId, mergePrompt);
|
|
445
|
+
await TmuxCommands.sendEnter(session.main.tmuxPaneId);
|
|
446
|
+
// Update fork as merged
|
|
447
|
+
fork.status = 'merged';
|
|
448
|
+
fork.mergedToMain = true;
|
|
449
|
+
fork.mergedAt = new Date().toISOString();
|
|
450
|
+
// Close fork pane if active
|
|
451
|
+
if (fork.tmuxPaneId) {
|
|
452
|
+
await TmuxCommands.killPane(fork.tmuxPaneId);
|
|
453
|
+
fork.tmuxPaneId = undefined;
|
|
454
|
+
}
|
|
455
|
+
session.lastActivity = new Date().toISOString();
|
|
456
|
+
await this.stateManager.replaceSession(session);
|
|
457
|
+
logger.info(`Fork ${fork.name} merged to main`);
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Export manual de un fork (deprecated - usa generateForkExport)
|
|
461
|
+
*/
|
|
462
|
+
async exportFork(sessionId, forkId) {
|
|
463
|
+
logger.warn('exportFork() is deprecated. Use generateForkExport() instead.');
|
|
464
|
+
return await this.generateForkExport(sessionId, forkId);
|
|
465
|
+
}
|
|
466
|
+
// ==========================================
|
|
467
|
+
// HELPERS PRIVADOS
|
|
468
|
+
// ==========================================
|
|
469
|
+
/**
|
|
470
|
+
* Initialize Claude en un pane con prompt inicial
|
|
471
|
+
*/
|
|
472
|
+
async initializeClaude(paneId, options) {
|
|
473
|
+
const { type, sessionId, resumeSessionId, parentSessionId, sessionName, forkName } = options;
|
|
474
|
+
// 1. cd al proyecto
|
|
475
|
+
await TmuxCommands.sendKeys(paneId, `cd ${this.projectPath}`);
|
|
476
|
+
await TmuxCommands.sendEnter(paneId);
|
|
477
|
+
await sleep(500);
|
|
478
|
+
// 2. Build command based on type
|
|
479
|
+
let command = '';
|
|
480
|
+
switch (type) {
|
|
481
|
+
case 'new':
|
|
482
|
+
const newPrompt = `Hello, this is a new main session called "${sessionName}". We are working on the project.`;
|
|
483
|
+
command = `claude --session-id ${sessionId} "${newPrompt}"`;
|
|
484
|
+
break;
|
|
485
|
+
case 'resume':
|
|
486
|
+
const resumePrompt = `Resuming session "${sessionName}".`;
|
|
487
|
+
command = `claude --resume ${resumeSessionId} "${resumePrompt}"`;
|
|
488
|
+
break;
|
|
489
|
+
case 'fork':
|
|
490
|
+
const forkPrompt = `This is a fork called "${forkName}". Keep in mind we are exploring an alternative to the main conversation.`;
|
|
491
|
+
command = `claude --resume ${parentSessionId} --fork-session "${forkPrompt}"`;
|
|
492
|
+
break;
|
|
493
|
+
}
|
|
494
|
+
logger.info(`Executing: ${command}`);
|
|
495
|
+
await TmuxCommands.sendKeys(paneId, command);
|
|
496
|
+
await TmuxCommands.sendEnter(paneId);
|
|
497
|
+
// 3. Esperar a que Claude inicie y procese el prompt
|
|
498
|
+
await sleep(8000); // 8 segundos para que Claude inicie y registre la sesión
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=SessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../../src/core/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { ProjectState, Session, Fork, SessionFilters } from '../models';
|
|
2
|
+
/**
|
|
3
|
+
* Manages state persistence in .claude-orka/state.json
|
|
4
|
+
*/
|
|
5
|
+
export declare class StateManager {
|
|
6
|
+
private projectPath;
|
|
7
|
+
private orkaDir;
|
|
8
|
+
private statePath;
|
|
9
|
+
constructor(projectPath: string);
|
|
10
|
+
/**
|
|
11
|
+
* Initialize StateManager
|
|
12
|
+
* Creates necessary folders if they don't exist
|
|
13
|
+
*/
|
|
14
|
+
initialize(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Create directory structure
|
|
17
|
+
*/
|
|
18
|
+
private ensureDirectories;
|
|
19
|
+
/**
|
|
20
|
+
* Read current state
|
|
21
|
+
*/
|
|
22
|
+
read(): Promise<ProjectState>;
|
|
23
|
+
/**
|
|
24
|
+
* Save state
|
|
25
|
+
*/
|
|
26
|
+
save(state: ProjectState): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Obtener el estado completo
|
|
29
|
+
*/
|
|
30
|
+
getState(): Promise<ProjectState>;
|
|
31
|
+
/**
|
|
32
|
+
* Listar todas las sesiones con filtros opcionales
|
|
33
|
+
*/
|
|
34
|
+
listSessions(filters?: SessionFilters): Promise<Session[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Agregar una nueva sesión
|
|
37
|
+
*/
|
|
38
|
+
addSession(session: Session): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Obtener una sesión por ID
|
|
41
|
+
*/
|
|
42
|
+
getSession(sessionId: string): Promise<Session | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Obtener todas las sesiones con filtros opcionales
|
|
45
|
+
*/
|
|
46
|
+
getAllSessions(filters?: SessionFilters): Promise<Session[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Actualizar el estado de una sesión
|
|
49
|
+
*/
|
|
50
|
+
updateSessionStatus(sessionId: string, status: Session['status']): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Actualizar una sesión completa
|
|
53
|
+
*/
|
|
54
|
+
updateSession(sessionId: string, updates: Partial<Session>): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Reemplazar una sesión completa
|
|
57
|
+
*/
|
|
58
|
+
replaceSession(session: Session): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Eliminar una sesión permanentemente
|
|
61
|
+
*/
|
|
62
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Agregar un fork a una sesión
|
|
65
|
+
*/
|
|
66
|
+
addFork(sessionId: string, fork: Fork): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Obtener un fork específico
|
|
69
|
+
*/
|
|
70
|
+
getFork(sessionId: string, forkId: string): Promise<Fork | null>;
|
|
71
|
+
/**
|
|
72
|
+
* Actualizar el estado de un fork
|
|
73
|
+
*/
|
|
74
|
+
updateForkStatus(sessionId: string, forkId: string, status: Fork['status']): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Actualizar el path del contexto de un fork
|
|
77
|
+
*/
|
|
78
|
+
updateForkContext(sessionId: string, forkId: string, contextPath: string): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Actualizar un fork completo
|
|
81
|
+
*/
|
|
82
|
+
updateFork(sessionId: string, forkId: string, updates: Partial<Fork>): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Eliminar un fork
|
|
85
|
+
*/
|
|
86
|
+
deleteFork(sessionId: string, forkId: string): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Guardar un contexto en archivo
|
|
89
|
+
*/
|
|
90
|
+
saveContext(type: 'session' | 'fork', id: string, content: string): Promise<string>;
|
|
91
|
+
/**
|
|
92
|
+
* Leer un contexto desde archivo
|
|
93
|
+
*/
|
|
94
|
+
readContext(contextPath: string): Promise<string>;
|
|
95
|
+
/**
|
|
96
|
+
* Obtener el path para el contexto de una sesión
|
|
97
|
+
*/
|
|
98
|
+
getSessionContextPath(sessionId: string): string;
|
|
99
|
+
/**
|
|
100
|
+
* Obtener el path para el contexto de un fork
|
|
101
|
+
*/
|
|
102
|
+
getForkContextPath(forkId: string): string;
|
|
103
|
+
/**
|
|
104
|
+
* Obtener el path para un export manual
|
|
105
|
+
*/
|
|
106
|
+
getExportPath(forkId: string, name: string): string;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=StateManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateManager.d.ts","sourceRoot":"","sources":["../../../src/core/StateManager.ts"],"names":[],"mappings":"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"}
|