CI / build + unit (pull_request) Successful in 1m15s
#rss subcommands on the command channel: help / add <url> <name> / remove <name> / tags / sources / get <name|#tag>. Sources are stored in a new rss_sources table in the existing MESH_DB_PATH file (second node:sqlite connection, case-insensitive names); feeds parsed with fast-xml-parser (RSS 2.0 + Atom); AI tags and headline summaries via injected LlmService.chat() with bounded maxTokens (50/200). CommandService gains prefix registration so one handler owns the whole #rss family while #ping stays an exact match; wired in CommandModule's factory — still no constructor-level cycle, no forwardRef. One dead feed does not sink a tag summary.
25 lines
1010 B
TypeScript
25 lines
1010 B
TypeScript
import { Module } from '@nestjs/common';
|
|
import { MeshModule } from '../mesh/mesh.module.js';
|
|
import { MeshService } from '../mesh/mesh.service.js';
|
|
import { RssModule } from '../rss/rss.module.js';
|
|
import { RssService } from '../rss/rss.service.js';
|
|
import { CommandService } from './command.service.js';
|
|
|
|
@Module({
|
|
imports: [MeshModule, RssModule], // one-way only — the MeshService reverse edge is wired in the factory below, not via DI
|
|
providers: [
|
|
{
|
|
provide: CommandService,
|
|
useFactory: (mesh: MeshService, rss: RssService) => {
|
|
const commands = new CommandService(mesh, rss);
|
|
// break the cycle: MeshService can't inject us (its own factory would deadlock on this edge), so attach ourselves once we exist — mesh is guaranteed created here because it's our injected dependency
|
|
mesh.attachCommands(commands);
|
|
return commands;
|
|
},
|
|
inject: [MeshService, RssService],
|
|
},
|
|
],
|
|
exports: [CommandService],
|
|
})
|
|
export class CommandModule {}
|