feat(agent): unify MCP tools and adopt Responses delivery
Move project and host queries into native MCP with host-owned OAuth/context, while retaining memory, skills, actions and publication plugins. Add nearby-model queries and explicit chat/task/learning model defaults. Adopt Responses HTTP/SSE and native steer/queue inbox delivery, preserving scoped session ownership, pending input edits and investigation communication. Disable local-provider discovery: Server /health allowed native vLLM to probe /v1/models on port 8000. A native before/after regression prevents recurrence. Validation: 170 focused Bun tests; service/plugin typechecks; native discovery, provider-discovery and input-inbox smoke checks; no paid model inference.
This commit is contained in:
+20
-5
@@ -1,4 +1,4 @@
|
||||
import { Router } from "express";
|
||||
import { Router, type NextFunction, type Request, type Response } from "express";
|
||||
|
||||
import { agentModelOptions, resolveDefaultModel } from "../chat/models.js";
|
||||
import { type ChatSessionBridge } from "../chat/sessionBridge.js";
|
||||
@@ -7,9 +7,9 @@ import { type FrontendActionCoordinator } from "../frontendAction/coordinator.js
|
||||
import { frontendActionRegistryResponse } from "../frontendAction/registry.js";
|
||||
import { type LearningOrchestrator } from "../learning/orchestrator.js";
|
||||
import { type MemoryStore } from "../memory/store.js";
|
||||
import { type ResultReferenceResolver } from "../results/resolver.js";
|
||||
import { type OpencodeRuntimeAdapter } from "../runtime/opencode.js";
|
||||
import { type SessionMetadataStore } from "../sessions/metadataStore.js";
|
||||
import { SessionContextMismatchError } from "../sessions/metadataStore.js";
|
||||
import { type SessionTranscriptStore } from "../sessions/transcriptStore.js";
|
||||
import { type SessionUiStateStore } from "../sessions/uiStateStore.js";
|
||||
import { uiRegistryResponse } from "../uiEnvelope/registry.js";
|
||||
@@ -23,13 +23,17 @@ import { registerChatInteractionRoutes } from "./chatInteractionRoutes.js";
|
||||
import { createChatRunState } from "./chatRunState.js";
|
||||
import { registerChatSessionRoutes } from "./chatSessionRoutes.js";
|
||||
import { registerChatStreamRoute } from "./chatStreamRoute.js";
|
||||
import { registerResponseInputRoutes } from "./response-input-routes.js";
|
||||
import { registerMcpStatusRoutes } from "./mcpRoutes.js";
|
||||
import { registerChatSuggestionRoutes } from "./chatSuggestionRoutes.js";
|
||||
import { registerAgentMessageRoutes } from "./agent-message-routes.js";
|
||||
import type { AgentMessageCoordinator } from "../chat/agent-message-coordinator.js";
|
||||
|
||||
export type BuildChatRouterOptions = {
|
||||
agentMessages?: AgentMessageCoordinator;
|
||||
frontendActionCoordinator: FrontendActionCoordinator;
|
||||
learningOrchestrator: LearningOrchestrator;
|
||||
memoryStore: MemoryStore;
|
||||
resultReferenceResolver: ResultReferenceResolver;
|
||||
runtime: OpencodeRuntimeAdapter;
|
||||
sessionBridge: ChatSessionBridge;
|
||||
sessionMetadataStore: SessionMetadataStore;
|
||||
@@ -44,12 +48,12 @@ export const buildChatRouter = (options: BuildChatRouterOptions) => {
|
||||
frontendActionCoordinator,
|
||||
learningOrchestrator,
|
||||
memoryStore,
|
||||
resultReferenceResolver,
|
||||
runtime,
|
||||
sessionBridge,
|
||||
sessionMetadataStore,
|
||||
sessionTranscriptStore,
|
||||
sessionUiStateStore,
|
||||
agentMessages,
|
||||
} = options;
|
||||
const chatRouter = Router();
|
||||
const { activeRuns, lastRunStatuses } = runState;
|
||||
@@ -125,6 +129,7 @@ export const buildChatRouter = (options: BuildChatRouterOptions) => {
|
||||
});
|
||||
|
||||
registerChatSessionRoutes(chatRouter, {
|
||||
learningOrchestrator,
|
||||
frontendActionCoordinator,
|
||||
runState,
|
||||
runtime,
|
||||
@@ -134,11 +139,12 @@ export const buildChatRouter = (options: BuildChatRouterOptions) => {
|
||||
sessionUiStateStore,
|
||||
});
|
||||
registerMcpStatusRoutes(chatRouter, { sessionMetadataStore, runtime });
|
||||
registerChatSuggestionRoutes(chatRouter, runtime);
|
||||
if (agentMessages) registerAgentMessageRoutes(chatRouter, { sessions: sessionMetadataStore, messages: agentMessages });
|
||||
|
||||
registerChatAuxiliaryRoutes(chatRouter, {
|
||||
activeRuns,
|
||||
lastRunStatuses,
|
||||
resultReferenceResolver,
|
||||
sessionBridge,
|
||||
sessionMetadataStore,
|
||||
sessionUiStateStore,
|
||||
@@ -152,7 +158,9 @@ export const buildChatRouter = (options: BuildChatRouterOptions) => {
|
||||
sessionUiStateStore,
|
||||
});
|
||||
|
||||
registerResponseInputRoutes(chatRouter, { runtime, sessionMetadataStore, runState });
|
||||
registerChatStreamRoute(chatRouter, {
|
||||
agentMessages,
|
||||
frontendActionCoordinator,
|
||||
learningOrchestrator,
|
||||
memoryStore,
|
||||
@@ -164,5 +172,12 @@ export const buildChatRouter = (options: BuildChatRouterOptions) => {
|
||||
sessionUiStateStore,
|
||||
});
|
||||
|
||||
chatRouter.use((error: unknown, _req: Request, res: Response, next: NextFunction) => {
|
||||
if (error instanceof SessionContextMismatchError && !res.headersSent) {
|
||||
res.status(404).json({ message: "session not found" });
|
||||
return;
|
||||
}
|
||||
next(error);
|
||||
});
|
||||
return chatRouter;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user