UNPKG

@notes-sync/service

Version:

Background service for AI-powered note synchronization

183 lines 7.78 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createServer = createServer; const fastify_1 = __importDefault(require("fastify")); const logger_1 = require("./logger"); function createServer(config, scheduleSync, noteInteractor) { const server = (0, fastify_1.default)({ logger: true }); let lastSyncTime = new Date().toISOString(); let onAddNote = []; // GET /status - Service status server.get('/status', async (request, reply) => { return { running: true, watching: config.notesDir, lastSync: lastSyncTime, uptime: process.uptime(), }; }); // POST /sync - Trigger sync server.post('/sync', async (request, reply) => { logger_1.Logger.log('Manual sync requested:', request.body); const reason = request.body?.force ? 'manual-force' : 'manual'; scheduleSync(reason); lastSyncTime = new Date().toISOString(); return { success: true }; }); // GET /logs - Get service logs server.get('/logs', async (request, reply) => { // TODO: Implement actual log reading from files return { logs: [ 'Service started', `File watcher initialized for ${config.notesDir}`, `Watching ${config.glob} pattern`, `Last sync: ${lastSyncTime}`, ], total: 4, }; }); server.post('/add-note', async (request, reply) => { logger_1.Logger.log('Add note requested via API'); await noteInteractor.addNote(request.body.text); return { message: 'Added note' }; }); // POST /shutdown - Graceful shutdown server.post('/shutdown', async (request, reply) => { logger_1.Logger.log('Shutdown requested via API'); setTimeout(() => process.exit(0), 1000); return { message: 'Shutting down...' }; }); // POST /add-todo - Add a new todo to today's focus server.post('/add-todo', async (request, reply) => { logger_1.Logger.log('Add todo requested via API'); await noteInteractor.addTodo(request.body.text); return { message: 'Todo added' }; }); // POST /mark-todo-complete - Mark a todo as completed server.post('/mark-todo-complete', async (request, reply) => { logger_1.Logger.log(`Mark todo complete requested: ${request.body.todoText}`); const success = noteInteractor.markTodoComplete(request.body.todoText); return { success }; }); // POST /delete-todo - Delete a todo entirely server.post('/delete-todo', async (request, reply) => { logger_1.Logger.log(`Delete todo requested: ${request.body.todoText}`); const success = noteInteractor.deleteTodo(request.body.todoText); return { success, message: success ? 'Todo deleted successfully' : 'Todo not found', }; }); // POST /search-notes - Search through notes server.post('/search-notes', async (request, reply) => { logger_1.Logger.log(`Search notes requested: ${request.body.query}`); const results = noteInteractor.searchNotes(request.body.query, request.body.daysBack); return { results }; }); // GET /incomplete-todos - Get incomplete todos server.get('/incomplete-todos', async (request, reply) => { const daysBack = request.query.daysBack ? parseInt(request.query.daysBack) : undefined; logger_1.Logger.log(`Get incomplete todos requested: ${daysBack || 7} days back`); const todos = noteInteractor.getIncompleteTodos(daysBack); return { todos }; }); // POST /archive-completed-todos - Archive completed todos server.post('/archive-completed-todos', async (request, reply) => { logger_1.Logger.log('Archive completed todos requested'); const archivedCount = noteInteractor.archiveCompletedTodos(); return { archivedCount }; }); // POST /format-document - Format the entire document server.post('/format-document', async (request, reply) => { logger_1.Logger.log('Format document requested'); const result = noteInteractor.formatDocument(); return result; }); // POST /format-section - Format a specific section server.post('/format-section', async (request, reply) => { logger_1.Logger.log(`Format section requested: ${request.body.sectionName}`); const success = noteInteractor.formatSection(request.body.sectionName); return { success }; }); // GET /validate-formatting - Check document for formatting issues server.get('/validate-formatting', async (request, reply) => { logger_1.Logger.log('Validate formatting requested'); const result = noteInteractor.validateFormatting(); return result; }); // GET /daily-status - Check daily section status server.get('/daily-status', async (request, reply) => { logger_1.Logger.log('Daily status requested'); const hasToday = noteInteractor.hasTodaySection(); const missingDays = noteInteractor.checkForMissingDays(); const timeSinceLastEntry = noteInteractor.getTimeSinceLastEntry(); return { hasToday, missingDays, timeSinceLastEntry }; }); // POST /create-daily - Force create daily section server.post('/create-daily', async (request, reply) => { logger_1.Logger.log('Manual daily section creation requested'); const result = await noteInteractor.autoCreateDailySection(request.body?.force); if (result.created) { scheduleSync('manual-daily-creation'); } return result; }); server.post('/view-notes', async (request, reply) => { logger_1.Logger.log(`View notes requested: ${request.body.type}`); try { const content = await noteInteractor.viewNotes(request.body); return content; } catch (error) { logger_1.Logger.error(`View notes failed: ${error.message}`); reply.code(500); return { content: 'Error: Could not retrieve notes', metadata: { type: request.body.type, totalLines: 0, }, }; } }); server.post('/ai/query', async (request, reply) => { logger_1.Logger.log(`AI Query: "${request.body.query}" (${JSON.stringify(request.body.timeRange)})`); try { const response = await noteInteractor.processAIQuery(request.body); return response; } catch (error) { logger_1.Logger.error(`AI query failed: ${error.message}`); if (error.message.includes('API key not valid.')) { reply.code(400); return { response: 'Invalid API Key, please check your configuration.', contextUsed: { daysCovered: 0, charactersUsed: 0, truncated: false, }, }; } else { reply.code(500); return { response: 'Sorry, I encountered an error analyzing your notes. Please try again.', contextUsed: { daysCovered: 0, charactersUsed: 0, truncated: false, }, }; } } }); return server; } //# sourceMappingURL=server.js.map