@notes-sync/service
Version:
Background service for AI-powered note synchronization
183 lines • 7.78 kB
JavaScript
;
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