Files
foxhunt/.claude/helpers/session.js
jgrusewski 12fdd18223 refactor: remove entire CPU training path — 5,307 lines of dead code
Deleted:
- DQN::compute_loss_internal (280 lines) — old Candle forward+loss
- DQN::train_step (55 lines) — old Candle training step
- DQN::compute_gradients (47 lines) — old gradient accumulation
- ComputeLossResult struct — only used by deleted functions
- RegimeConditionalDQN::train_step (65 lines) — old dispatch
- RegimeConditionalDQN::train_step_gpu_regime (100 lines) — old GPU path
- RegimeConditionalDQN::compute_gradients_gpu (130 lines) — old regime gradients
- RegimeConditionalDQN::compute_gradients (92 lines) — old dispatch
- DQNAgentType::train_step dispatch — dead
- DQNAgentType::compute_gradients dispatch — dead
- GpuDqnTrainer::upload_batch (71 lines) — old CPU→GPU upload
- train_step.rs (500 lines) — entire module including ensure_fused_ctx
- dqn_benchmark.rs — used old train_step
- examples.rs — used old train_step
- validation/adapters.rs (289 lines) — used old train_step
- dqn/trainable_adapter.rs — used old train_step
- gpu_smoketest.rs — tested old train_step
- Gradient accumulation path in training_loop.rs (144 lines)
- IQN d_h_s2().clone() → raw pointer (zero alloc)
- Causal intervention format! string alloc removed
- Dead HER relabel functions (320 lines)

Kept:
- ensure_fused_ctx logic inlined into training_loop.rs
- set_noise_sigma_scale re-added to RegimeConditionalDQN

Fixed:
- GpuReplayBuffer max_batch_size wired from batch_size parameter
  (was hardcoded 1024, blocking batch_size=8192)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:06:23 +02:00

136 lines
3.6 KiB
JavaScript

#!/usr/bin/env node
/**
* Claude Flow Session Manager
* Handles session lifecycle: start, restore, end
*/
const fs = require('fs');
const path = require('path');
const SESSION_DIR = path.join(process.cwd(), '.claude-flow', 'sessions');
const SESSION_FILE = path.join(SESSION_DIR, 'current.json');
const commands = {
start: () => {
const sessionId = `session-${Date.now()}`;
const session = {
id: sessionId,
startedAt: new Date().toISOString(),
cwd: process.cwd(),
context: {},
metrics: {
edits: 0,
commands: 0,
tasks: 0,
errors: 0,
},
};
fs.mkdirSync(SESSION_DIR, { recursive: true });
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
console.log(`Session started: ${sessionId}`);
return session;
},
restore: () => {
if (!fs.existsSync(SESSION_FILE)) {
console.log('No session to restore');
return null;
}
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
session.restoredAt = new Date().toISOString();
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
console.log(`Session restored: ${session.id}`);
return session;
},
end: () => {
if (!fs.existsSync(SESSION_FILE)) {
console.log('No active session');
return null;
}
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
session.endedAt = new Date().toISOString();
session.duration = Date.now() - new Date(session.startedAt).getTime();
// Archive session
const archivePath = path.join(SESSION_DIR, `${session.id}.json`);
fs.writeFileSync(archivePath, JSON.stringify(session, null, 2));
fs.unlinkSync(SESSION_FILE);
console.log(`Session ended: ${session.id}`);
console.log(`Duration: ${Math.round(session.duration / 1000 / 60)} minutes`);
console.log(`Metrics: ${JSON.stringify(session.metrics)}`);
return session;
},
status: () => {
if (!fs.existsSync(SESSION_FILE)) {
console.log('No active session');
return null;
}
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
const duration = Date.now() - new Date(session.startedAt).getTime();
console.log(`Session: ${session.id}`);
console.log(`Started: ${session.startedAt}`);
console.log(`Duration: ${Math.round(duration / 1000 / 60)} minutes`);
console.log(`Metrics: ${JSON.stringify(session.metrics)}`);
return session;
},
update: (key, value) => {
if (!fs.existsSync(SESSION_FILE)) {
console.log('No active session');
return null;
}
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
session.context[key] = value;
session.updatedAt = new Date().toISOString();
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
return session;
},
get: (key) => {
if (!fs.existsSync(SESSION_FILE)) return null;
try {
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
return key ? (session.context || {})[key] : session.context;
} catch { return null; }
},
metric: (name) => {
if (!fs.existsSync(SESSION_FILE)) {
return null;
}
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
if (session.metrics[name] !== undefined) {
session.metrics[name]++;
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
}
return session;
},
};
// CLI
const [,, command, ...args] = process.argv;
if (command && commands[command]) {
commands[command](...args);
} else {
console.log('Usage: session.js <start|restore|end|status|update|metric> [args]');
}
module.exports = commands;