--- a/src/cli/simple-commands/hive-mind.js +++ b/src/cli/simple-commands/hive-mind.js @@ -26,6 +26,7 @@ import { QueenCoordinator } from './hive-mind/queen.js'; import { CollectiveMemory } from './hive-mind/memory.js'; import { SwarmCommunication } from './hive-mind/communication.js'; import { HiveMindSessionManager } from './hive-mind/session-manager.js'; +import { getLocalTimestamp, formatTimestampForDisplay, getTimezoneInfo } from '../../utils/timezone-utils.js'; function showHiveMindHelp() { console.log(` @@ -200,7 +201,8 @@ async function spawnHiveMind(objective, flags) { // Create session const sessionManager = new HiveMindSessionManager(sessionDir); - const sessionId = await sessionManager.createSession({ + const timezoneInfo = getTimezoneInfo(); + const sessionId = await sessionManager.createSession({ objective, namespace: flags.namespace, queenType: flags.queenType || 'strategic', @@ -208,7 +210,9 @@ async function spawnHiveMind(objective, flags) { consensus: flags.consensus || 'majority', memorySize: flags.memorySize || 100, encryption: flags.encryption || false, - monitoring: flags.monitor || false + monitoring: flags.monitor || false, + timezone: timezoneInfo, + createdAtLocal: getLocalTimestamp() }); console.log(`šŸ“‹ Session ID: ${sessionId}`); @@ -350,11 +354,13 @@ function displaySwarmSummary(config, sessionId) { console.log(`šŸ ${chalk.bold('Hive Mind Swarm Successfully Initialized!')}\n`); console.log(`${chalk.cyan('⇅ Swarm Status:')} ${chalk.green('ACTIVE')}`); - console.log(`${chalk.cyan('šŸ“‹ Session ID:')} ${sessionId}`); + console.log(`${chalk.cyan('šŸ“‹ Session:')} ${sessionId}`); console.log(`${chalk.cyan('šŸ—‚ Topology:')} ${config.topology}`); console.log(`${chalk.cyan('šŸ‘‘ Queen:')} ${config.queenType} (${config.queenCount} active)`); console.log(`${chalk.cyan('šŸ‘„ Workers:')} ${config.workerCount}/${config.maxWorkers} active`); console.log(`${chalk.cyan('🧠 Memory:')} ${config.memorySize}MB collective storage`); + const timeDisplay = formatTimestampForDisplay(new Date()); + console.log(`${chalk.cyan('ā° Created:')} ${timeDisplay.relative} (${getTimezoneInfo().abbreviation})`); if (config.encryption) { console.log(`${chalk.cyan('šŸ”’ Security:')} Encrypted communication enabled`); @@ -420,6 +426,24 @@ async function showSessions(flags) { if (sessions.length > 0) { console.log('\nšŸ“‹ Available Sessions:\n'); + + // Display timezone info + const tz = getTimezoneInfo(); + console.log(`šŸŒ Displaying times in: ${tz.name} (${tz.abbreviation})\n`); + + // Table header with proper spacing + const headers = ['Session ID', 'Objective', 'Created', 'Status', 'Progress']; + const colWidths = [25, 35, 25, 12, 10]; + + console.log(headers.map((header, i) => header.padEnd(colWidths[i])).join(' ')); + console.log('-'.repeat(colWidths.reduce((a, b) => a + b + 1, 0))); + + sessions.forEach(session => { + const timeDisplay = formatTimestampForDisplay(session.createdAt || session.created_at); + const values = [ + (session.session_id || session.id).substr(-22), + session.objective.length > 32 ? session.objective.substr(0, 32) + '...' : session.objective, + timeDisplay.relative, sessions.forEach((session, index) => { console.log(`${index + 1}. ${session.session_id}`); console.log(` Objective: ${session.objective}`); --- a/src/cli/simple-commands/hive-mind/session-manager.js +++ b/src/cli/simple-commands/hive-mind/session-manager.js @@ -4,6 +4,7 @@ import Database from 'better-sqlite3'; import path from 'path'; +import { getLocalTimestamp, getLocalISOTimestamp, getTimezoneInfo } from '../../../utils/timezone-utils.js'; export class HiveMindSessionManager { constructor(sessionDir = '.hive-mind/sessions') { @@ -45,12 +46,16 @@ export class HiveMindSessionManager { async createSession(config) { const sessionId = `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; + const now = new Date(); + const timezone = config.timezone || getTimezoneInfo(); const stmt = this.db.prepare(` INSERT INTO sessions ( - session_id, objective, namespace, status, queen_type, worker_count, created_at, updated_at + session_id, objective, namespace, status, queen_type, worker_count, + created_at, created_at_local, timezone_name, timezone_offset, updated_at ) VALUES ( - ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now') + ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) `); @@ -61,7 +66,11 @@ export class HiveMindSessionManager { config.status || 'active', config.queenType || 'strategic', config.maxWorkers || 8, - sessionId + now.toISOString(), + config.createdAtLocal || getLocalTimestamp(), + timezone.name, + timezone.offset, + now.toISOString() ); return sessionId; @@ -95,6 +104,9 @@ export class HiveMindSessionManager { session_id TEXT PRIMARY KEY, objective TEXT NOT NULL, namespace TEXT, + created_at_local TEXT, + timezone_name TEXT, + timezone_offset REAL, status TEXT DEFAULT 'active', queen_type TEXT, worker_count INTEGER,