@indexnetwork/protocol 4.3.4-rc.310.1 → 4.3.4-rc.312.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat/chat.graph.d.ts +8 -8
- package/dist/chat/chat.prompt.d.ts.map +1 -1
- package/dist/chat/chat.prompt.js +18 -8
- package/dist/chat/chat.prompt.js.map +1 -1
- package/dist/chat/chat.state.d.ts +4 -3
- package/dist/chat/chat.state.d.ts.map +1 -1
- package/dist/chat/chat.state.js +2 -2
- package/dist/chat/chat.state.js.map +1 -1
- package/dist/chat/chat.streamer.d.ts +3 -2
- package/dist/chat/chat.streamer.d.ts.map +1 -1
- package/dist/chat/chat.streamer.js +2 -2
- package/dist/chat/chat.streamer.js.map +1 -1
- package/dist/intent/intent.graph.d.ts +5 -5
- package/dist/intent/intent.state.d.ts +2 -1
- package/dist/intent/intent.state.d.ts.map +1 -1
- package/dist/intent/intent.tools.d.ts.map +1 -1
- package/dist/intent/intent.tools.js +54 -2
- package/dist/intent/intent.tools.js.map +1 -1
- package/dist/opportunity/feed/feed.graph.d.ts +10 -0
- package/dist/opportunity/feed/feed.graph.d.ts.map +1 -1
- package/dist/opportunity/feed/feed.graph.js +4 -0
- package/dist/opportunity/feed/feed.graph.js.map +1 -1
- package/dist/opportunity/feed/feed.state.d.ts +2 -0
- package/dist/opportunity/feed/feed.state.d.ts.map +1 -1
- package/dist/opportunity/feed/feed.state.js +8 -0
- package/dist/opportunity/feed/feed.state.js.map +1 -1
- package/dist/opportunity/opportunity.graph.d.ts +6 -6
- package/dist/opportunity/opportunity.pending-questions.d.ts +5 -0
- package/dist/opportunity/opportunity.pending-questions.d.ts.map +1 -1
- package/dist/opportunity/opportunity.pending-questions.js +2 -1
- package/dist/opportunity/opportunity.pending-questions.js.map +1 -1
- package/dist/opportunity/opportunity.state.d.ts +1 -1
- package/dist/opportunity/opportunity.tools.d.ts.map +1 -1
- package/dist/opportunity/opportunity.tools.js +80 -7
- package/dist/opportunity/opportunity.tools.js.map +1 -1
- package/dist/premise/premise.graph.d.ts +4 -4
- package/dist/premise/premise.state.d.ts +2 -1
- package/dist/premise/premise.state.d.ts.map +1 -1
- package/dist/questioner/questioner.tools.d.ts.map +1 -1
- package/dist/questioner/questioner.tools.js +21 -8
- package/dist/questioner/questioner.tools.js.map +1 -1
- package/dist/shared/agent/tool.factory.d.ts.map +1 -1
- package/dist/shared/agent/tool.factory.js +4 -0
- package/dist/shared/agent/tool.factory.js.map +1 -1
- package/dist/shared/agent/tool.helpers.d.ts +22 -6
- package/dist/shared/agent/tool.helpers.d.ts.map +1 -1
- package/dist/shared/agent/tool.helpers.js.map +1 -1
- package/dist/shared/agent/tool.scope.d.ts +7 -1
- package/dist/shared/agent/tool.scope.d.ts.map +1 -1
- package/dist/shared/agent/tool.scope.js +10 -0
- package/dist/shared/agent/tool.scope.js.map +1 -1
- package/dist/shared/hyde/hyde.graph.d.ts +6 -6
- package/dist/shared/hyde/hyde.state.d.ts +2 -2
- package/dist/shared/interfaces/database.interface.d.ts +3 -0
- package/dist/shared/interfaces/database.interface.d.ts.map +1 -1
- package/dist/shared/interfaces/database.interface.js.map +1 -1
- package/dist/shared/interfaces/questioner.interface.d.ts +3 -0
- package/dist/shared/interfaces/questioner.interface.d.ts.map +1 -1
- package/dist/shared/interfaces/questioner.interface.js.map +1 -1
- package/dist/shared/schemas/network-assignment.schema.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.streamer.js","sourceRoot":"/","sources":["chat/chat.streamer.ts"],"names":[],"mappings":"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","sourcesContent":["import { AIMessage, BaseMessage, HumanMessage } from \"@langchain/core/messages\";\nimport { BaseCheckpointSaver } from \"@langchain/langgraph\";\nimport { protocolLogger } from \"../shared/observability/protocol.logger.js\";\nimport type { ChatStreamEvent, DebugMetaDiscoveryQuestions, DebugMetaToolCall, DebugMetaLlm, DebugMetaOrchestratorNegotiations } from \"./chat-streaming.types.js\";\nimport { createAgentEndEvent, createAgentStartEvent, createDebugMetaEvent, createDecisionQuestionsEvent, createErrorEvent, createGraphEndEvent, createPhaseStartEvent, createPhaseEndEvent, createGraphStartEvent, createIterationStartEvent, createLlmStartEvent, createLlmEndEvent, createResponseCompleteEvent, createResponseResetEvent, createHallucinationDetectedEvent, createStatusEvent, createTokenEvent, createToolActivityEvent, createChatSummarizerStartEvent, createChatSummarizerEndEvent, createQuestionGeneratorStartEvent, createQuestionGeneratorEndEvent } from \"./chat-streaming.types.js\";\nimport type { AgentStreamEvent } from \"./chat.agent.js\";\n\nconst logger = protocolLogger(\"ChatStreamer\");\n\n// ══════════════════════════════════════════════════════════════════════════════\n// CHAT STREAMER (Streaming Narration Architecture)\n// ══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Top-level streaming service for Chat Graph events.\n *\n * Uses `graph.stream()` with `streamMode: [\"custom\", \"updates\"]` so that\n * the agent's `config.writer()` calls arrive as `\"custom\"` chunks (text\n * tokens and tool-activity events) and the final state update arrives as\n * an `\"updates\"` chunk.\n */\nexport class ChatStreamer {\n constructor(\n private loadSessionContext: (\n sessionId: string,\n maxMessages: number,\n ) => Promise<BaseMessage[]>,\n private createStreamingGraph: (\n checkpointer?: BaseCheckpointSaver,\n ) => any,\n ) {}\n\n /**\n * Streams chat events with full session context.\n * Loads previous conversation history and optionally uses a checkpointer\n * for state persistence.\n *\n * @param input - Configuration for context-aware streaming\n * @param checkpointer - Optional checkpointer for state persistence\n * @yields ChatStreamEvent objects\n */\n public async *streamChatEventsWithContext(\n input: {\n userId: string;\n message: string;\n sessionId: string;\n maxContextMessages?: number;\n /** @deprecated Use scopeType/scopeId. Kept for REST/session edge compatibility. */\n networkId?: string;\n scopeType?: 'network';\n scopeId?: string;\n prefillMessages?: Array<{ role: \"assistant\" | \"user\"; content: string }>;\n /** Per-run identifier used to form a composite LangGraph thread_id (sessionId:runId).\n * When provided, prevents stale checkpoint state from a prior run being resumed.\n * Defaults to sessionId alone when absent (backward compatible). */\n runId?: string;\n },\n checkpointer?: BaseCheckpointSaver,\n signal?: AbortSignal,\n ): AsyncGenerator<ChatStreamEvent> {\n const {\n userId,\n message,\n sessionId,\n maxContextMessages = 20,\n networkId,\n scopeType,\n scopeId,\n prefillMessages,\n runId,\n } = input;\n const effectiveScopeType = scopeType ?? (networkId ? 'network' as const : undefined);\n const effectiveScopeId = scopeId ?? networkId;\n logger.verbose(\"Starting context-aware streaming\", {\n userId,\n sessionId,\n maxContextMessages,\n hasCheckpointer: !!checkpointer,\n hasIndexScope: !!effectiveScopeId,\n scopeType: effectiveScopeType,\n scopeId: effectiveScopeId,\n });\n\n try {\n // Load previous conversation context\n const previousMessages = await this.loadSessionContext(\n sessionId,\n maxContextMessages,\n );\n\n // Inject prefill messages (e.g. hardcoded onboarding greeting) only for fresh sessions\n const prefill: BaseMessage[] = previousMessages.length === 0\n ? (prefillMessages ?? []).map((pm) =>\n pm.role === \"assistant\" ? new AIMessage(pm.content) : new HumanMessage(pm.content),\n )\n : [];\n\n const allMessages = [...previousMessages, ...prefill, new HumanMessage(message)];\n\n logger.verbose(\"Context prepared\", {\n previousCount: previousMessages.length,\n totalCount: allMessages.length,\n });\n\n // Form composite thread_id when a runId is provided\n const threadId = runId ? `${sessionId}:${runId}` : sessionId;\n\n // Stream with context using the optional checkpointer\n yield* this.streamChatEvents(\n { userId, messages: allMessages, scopeType: effectiveScopeType, scopeId: effectiveScopeId },\n sessionId,\n checkpointer,\n signal,\n threadId,\n );\n } catch (error) {\n logger.error(\"Stream error\", {\n error: error instanceof Error ? error.message : String(error),\n });\n yield createErrorEvent(\n sessionId,\n error instanceof Error\n ? error.message\n : \"Unknown error during context-aware streaming\",\n \"CONTEXT_STREAM_ERROR\",\n );\n }\n }\n\n /**\n * Streams chat events from the graph execution.\n *\n * Uses `graph.stream()` with `streamMode: [\"custom\", \"updates\"]`:\n * - `\"custom\"` chunks carry {@link AgentStreamEvent} objects emitted by\n * `ChatAgent.streamRun()` via `config.writer()`\n * - `\"updates\"` chunks carry the final state update from `agentLoopNode`\n *\n * @param input - The input state for the graph (userId and messages)\n * @param sessionId - The session ID for event attribution\n * @param checkpointer - Optional checkpointer for persistence\n * @yields ChatStreamEvent objects\n */\n public async *streamChatEvents(\n input: { userId: string; messages: BaseMessage[]; networkId?: string; scopeType?: 'network'; scopeId?: string },\n sessionId: string,\n checkpointer?: BaseCheckpointSaver,\n signal?: AbortSignal,\n threadId?: string,\n ): AsyncGenerator<ChatStreamEvent> {\n const graph = this.createStreamingGraph(checkpointer);\n\n try {\n const initialState: {\n userId: string;\n messages: BaseMessage[];\n networkId?: string;\n scopeType?: 'network';\n scopeId?: string;\n sessionId?: string;\n } = {\n userId: input.userId,\n messages: input.messages,\n };\n const effectiveScopeType = input.scopeType ?? (input.networkId ? 'network' as const : undefined);\n const effectiveScopeId = input.scopeId ?? input.networkId;\n if (input.networkId) initialState.networkId = input.networkId;\n if (effectiveScopeType && effectiveScopeId) {\n initialState.scopeType = effectiveScopeType;\n initialState.scopeId = effectiveScopeId;\n }\n initialState.sessionId = sessionId;\n\n // Use graph.stream() with custom + updates modes.\n // Custom events come from config.writer() inside agentLoopNode.\n const eventStream = await graph.stream(initialState, {\n streamMode: [\"custom\", \"updates\"] as const,\n configurable: { thread_id: threadId ?? sessionId, signal },\n signal,\n });\n\n // Emit initial status\n yield createStatusEvent(sessionId, \"Processing your message...\");\n\n for await (const tuple of eventStream) {\n if (signal?.aborted) break;\n // graph.stream with multiple modes yields [mode, chunk] tuples\n const [mode, chunk] = tuple as [string, unknown];\n\n // ─────────────────────────────────────────────────────────────────\n // CUSTOM: writer events from ChatAgent.streamRun()\n // ─────────────────────────────────────────────────────────────────\n if (mode === \"custom\") {\n const event = chunk as AgentStreamEvent;\n\n if (event.type === \"iteration_start\") {\n yield createIterationStartEvent(sessionId, event.iteration);\n }\n\n if (event.type === \"llm_start\") {\n yield createLlmStartEvent(sessionId, event.iteration);\n }\n\n if (event.type === \"text_chunk\" && event.content) {\n yield createTokenEvent(sessionId, event.content);\n }\n\n if (event.type === \"response_reset\") {\n yield createResponseResetEvent(sessionId, event.reason);\n }\n\n if (event.type === \"hallucination_detected\") {\n yield createHallucinationDetectedEvent(sessionId, event.blockType, event.tool);\n }\n\n if (event.type === \"llm_end\") {\n yield createLlmEndEvent(\n sessionId,\n event.iteration,\n event.hasToolCalls,\n event.toolNames,\n );\n }\n\n if (event.type === \"tool_activity\") {\n logger.debug(\"Tool activity\", { name: event.name, phase: event.phase });\n if (event.phase === \"start\") {\n yield createToolActivityEvent(\n sessionId,\n event.name,\n event.name,\n \"start\",\n );\n } else {\n yield createToolActivityEvent(\n sessionId,\n event.name,\n event.name,\n \"end\",\n event.success,\n event.summary,\n event.steps,\n );\n }\n }\n\n if (event.type === \"graph_start\") {\n yield createGraphStartEvent(sessionId, event.name);\n }\n\n if (event.type === \"graph_end\") {\n yield createGraphEndEvent(sessionId, event.name, event.durationMs);\n }\n\n if (event.type === \"phase_start\") {\n yield createPhaseStartEvent(sessionId, event.name);\n }\n\n if (event.type === \"phase_end\") {\n yield createPhaseEndEvent(sessionId, event.name, event.durationMs);\n }\n\n if (event.type === \"agent_start\") {\n yield createAgentStartEvent(sessionId, event.name);\n }\n\n if (event.type === \"agent_end\") {\n yield createAgentEndEvent(sessionId, event.name, event.durationMs, event.summary);\n }\n\n if (event.type === \"decision_questions\") {\n yield createDecisionQuestionsEvent(sessionId, { questions: event.questions });\n }\n\n if (event.type === \"chat_summarizer_start\") {\n yield createChatSummarizerStartEvent(sessionId, event.payload);\n }\n\n if (event.type === \"chat_summarizer_end\") {\n yield createChatSummarizerEndEvent(sessionId, event.payload);\n }\n\n if (event.type === \"question_generator_start\") {\n yield createQuestionGeneratorStartEvent(sessionId, event.payload);\n }\n\n if (event.type === \"question_generator_end\") {\n yield createQuestionGeneratorEndEvent(sessionId, event.payload);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────\n // UPDATES: final state from agentLoopNode\n // ─────────────────────────────────────────────────────────────────\n if (mode === \"updates\") {\n // The updates chunk is { agent_loop: { responseText, error, ... } }\n const updates = chunk as Record<string, Record<string, unknown>>;\n const agentOutput = updates?.agent_loop;\n\n if (agentOutput?.error) {\n logger.warn(\"Agent loop returned error via updates\", {\n error: agentOutput.error,\n });\n yield createErrorEvent(\n sessionId,\n String(agentOutput.error),\n \"AGENT_ERROR\",\n );\n }\n\n // Yield the agent's authoritative response text so the\n // controller can persist it without relying on token accumulation.\n const responseText = typeof agentOutput?.responseText === \"string\"\n ? (agentOutput.responseText as string)\n : \"\";\n yield createResponseCompleteEvent(sessionId, responseText);\n\n const debugMeta = agentOutput?.debugMeta as\n | { graph: string; iterations: number; tools?: DebugMetaToolCall[]; llm?: DebugMetaLlm; orchestratorNegotiations?: DebugMetaOrchestratorNegotiations; discoveryQuestions?: DebugMetaDiscoveryQuestions }\n | undefined;\n if (\n debugMeta?.graph != null &&\n typeof debugMeta.iterations === \"number\"\n ) {\n const llmFallback: DebugMetaLlm = { calls: 0, totalDurationMs: 0, resets: [], hallucinations: [] };\n yield createDebugMetaEvent(\n sessionId,\n debugMeta.graph,\n debugMeta.iterations,\n Array.isArray(debugMeta.tools) ? debugMeta.tools : [],\n debugMeta.llm ?? llmFallback,\n debugMeta.orchestratorNegotiations,\n debugMeta.discoveryQuestions,\n );\n }\n\n logger.verbose(\"Agent loop complete (updates)\", {\n responseLength: responseText.length,\n });\n }\n }\n } catch (error) {\n logger.error(\"Stream error\", {\n error: error instanceof Error ? error.message : String(error),\n });\n yield createErrorEvent(\n sessionId,\n error instanceof Error\n ? error.message\n : \"Unknown error during streaming\",\n \"STREAM_ERROR\",\n );\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chat.streamer.js","sourceRoot":"/","sources":["chat/chat.streamer.ts"],"names":[],"mappings":"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","sourcesContent":["import { AIMessage, BaseMessage, HumanMessage } from \"@langchain/core/messages\";\nimport { BaseCheckpointSaver } from \"@langchain/langgraph\";\nimport { protocolLogger } from \"../shared/observability/protocol.logger.js\";\nimport type { ToolScopeType } from \"../shared/agent/tool.scope.js\";\nimport type { ChatStreamEvent, DebugMetaDiscoveryQuestions, DebugMetaToolCall, DebugMetaLlm, DebugMetaOrchestratorNegotiations } from \"./chat-streaming.types.js\";\nimport { createAgentEndEvent, createAgentStartEvent, createDebugMetaEvent, createDecisionQuestionsEvent, createErrorEvent, createGraphEndEvent, createPhaseStartEvent, createPhaseEndEvent, createGraphStartEvent, createIterationStartEvent, createLlmStartEvent, createLlmEndEvent, createResponseCompleteEvent, createResponseResetEvent, createHallucinationDetectedEvent, createStatusEvent, createTokenEvent, createToolActivityEvent, createChatSummarizerStartEvent, createChatSummarizerEndEvent, createQuestionGeneratorStartEvent, createQuestionGeneratorEndEvent } from \"./chat-streaming.types.js\";\nimport type { AgentStreamEvent } from \"./chat.agent.js\";\n\nconst logger = protocolLogger(\"ChatStreamer\");\n\n// ══════════════════════════════════════════════════════════════════════════════\n// CHAT STREAMER (Streaming Narration Architecture)\n// ══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Top-level streaming service for Chat Graph events.\n *\n * Uses `graph.stream()` with `streamMode: [\"custom\", \"updates\"]` so that\n * the agent's `config.writer()` calls arrive as `\"custom\"` chunks (text\n * tokens and tool-activity events) and the final state update arrives as\n * an `\"updates\"` chunk.\n */\nexport class ChatStreamer {\n constructor(\n private loadSessionContext: (\n sessionId: string,\n maxMessages: number,\n ) => Promise<BaseMessage[]>,\n private createStreamingGraph: (\n checkpointer?: BaseCheckpointSaver,\n ) => any,\n ) {}\n\n /**\n * Streams chat events with full session context.\n * Loads previous conversation history and optionally uses a checkpointer\n * for state persistence.\n *\n * @param input - Configuration for context-aware streaming\n * @param checkpointer - Optional checkpointer for state persistence\n * @yields ChatStreamEvent objects\n */\n public async *streamChatEventsWithContext(\n input: {\n userId: string;\n message: string;\n sessionId: string;\n maxContextMessages?: number;\n /** @deprecated Use scopeType/scopeId. Kept for REST/session edge compatibility. */\n networkId?: string;\n scopeType?: ToolScopeType;\n scopeId?: string;\n prefillMessages?: Array<{ role: \"assistant\" | \"user\"; content: string }>;\n /** Per-run identifier used to form a composite LangGraph thread_id (sessionId:runId).\n * When provided, prevents stale checkpoint state from a prior run being resumed.\n * Defaults to sessionId alone when absent (backward compatible). */\n runId?: string;\n },\n checkpointer?: BaseCheckpointSaver,\n signal?: AbortSignal,\n ): AsyncGenerator<ChatStreamEvent> {\n const {\n userId,\n message,\n sessionId,\n maxContextMessages = 20,\n networkId,\n scopeType,\n scopeId,\n prefillMessages,\n runId,\n } = input;\n const effectiveScopeType: ToolScopeType | undefined = scopeType ?? (networkId ? 'network' : undefined);\n const effectiveScopeId = scopeId ?? (effectiveScopeType === 'network' ? networkId : undefined);\n logger.verbose(\"Starting context-aware streaming\", {\n userId,\n sessionId,\n maxContextMessages,\n hasCheckpointer: !!checkpointer,\n hasIndexScope: !!effectiveScopeId,\n scopeType: effectiveScopeType,\n scopeId: effectiveScopeId,\n });\n\n try {\n // Load previous conversation context\n const previousMessages = await this.loadSessionContext(\n sessionId,\n maxContextMessages,\n );\n\n // Inject prefill messages (e.g. hardcoded onboarding greeting) only for fresh sessions\n const prefill: BaseMessage[] = previousMessages.length === 0\n ? (prefillMessages ?? []).map((pm) =>\n pm.role === \"assistant\" ? new AIMessage(pm.content) : new HumanMessage(pm.content),\n )\n : [];\n\n const allMessages = [...previousMessages, ...prefill, new HumanMessage(message)];\n\n logger.verbose(\"Context prepared\", {\n previousCount: previousMessages.length,\n totalCount: allMessages.length,\n });\n\n // Form composite thread_id when a runId is provided\n const threadId = runId ? `${sessionId}:${runId}` : sessionId;\n\n // Stream with context using the optional checkpointer\n yield* this.streamChatEvents(\n { userId, messages: allMessages, scopeType: effectiveScopeType, scopeId: effectiveScopeId },\n sessionId,\n checkpointer,\n signal,\n threadId,\n );\n } catch (error) {\n logger.error(\"Stream error\", {\n error: error instanceof Error ? error.message : String(error),\n });\n yield createErrorEvent(\n sessionId,\n error instanceof Error\n ? error.message\n : \"Unknown error during context-aware streaming\",\n \"CONTEXT_STREAM_ERROR\",\n );\n }\n }\n\n /**\n * Streams chat events from the graph execution.\n *\n * Uses `graph.stream()` with `streamMode: [\"custom\", \"updates\"]`:\n * - `\"custom\"` chunks carry {@link AgentStreamEvent} objects emitted by\n * `ChatAgent.streamRun()` via `config.writer()`\n * - `\"updates\"` chunks carry the final state update from `agentLoopNode`\n *\n * @param input - The input state for the graph (userId and messages)\n * @param sessionId - The session ID for event attribution\n * @param checkpointer - Optional checkpointer for persistence\n * @yields ChatStreamEvent objects\n */\n public async *streamChatEvents(\n input: { userId: string; messages: BaseMessage[]; networkId?: string; scopeType?: ToolScopeType; scopeId?: string },\n sessionId: string,\n checkpointer?: BaseCheckpointSaver,\n signal?: AbortSignal,\n threadId?: string,\n ): AsyncGenerator<ChatStreamEvent> {\n const graph = this.createStreamingGraph(checkpointer);\n\n try {\n const initialState: {\n userId: string;\n messages: BaseMessage[];\n networkId?: string;\n scopeType?: ToolScopeType;\n scopeId?: string;\n sessionId?: string;\n } = {\n userId: input.userId,\n messages: input.messages,\n };\n const effectiveScopeType: ToolScopeType | undefined = input.scopeType ?? (input.networkId ? 'network' : undefined);\n const effectiveScopeId = input.scopeId ?? (effectiveScopeType === 'network' ? input.networkId : undefined);\n if (input.networkId) initialState.networkId = input.networkId;\n if (effectiveScopeType && effectiveScopeId) {\n initialState.scopeType = effectiveScopeType;\n initialState.scopeId = effectiveScopeId;\n }\n initialState.sessionId = sessionId;\n\n // Use graph.stream() with custom + updates modes.\n // Custom events come from config.writer() inside agentLoopNode.\n const eventStream = await graph.stream(initialState, {\n streamMode: [\"custom\", \"updates\"] as const,\n configurable: { thread_id: threadId ?? sessionId, signal },\n signal,\n });\n\n // Emit initial status\n yield createStatusEvent(sessionId, \"Processing your message...\");\n\n for await (const tuple of eventStream) {\n if (signal?.aborted) break;\n // graph.stream with multiple modes yields [mode, chunk] tuples\n const [mode, chunk] = tuple as [string, unknown];\n\n // ─────────────────────────────────────────────────────────────────\n // CUSTOM: writer events from ChatAgent.streamRun()\n // ─────────────────────────────────────────────────────────────────\n if (mode === \"custom\") {\n const event = chunk as AgentStreamEvent;\n\n if (event.type === \"iteration_start\") {\n yield createIterationStartEvent(sessionId, event.iteration);\n }\n\n if (event.type === \"llm_start\") {\n yield createLlmStartEvent(sessionId, event.iteration);\n }\n\n if (event.type === \"text_chunk\" && event.content) {\n yield createTokenEvent(sessionId, event.content);\n }\n\n if (event.type === \"response_reset\") {\n yield createResponseResetEvent(sessionId, event.reason);\n }\n\n if (event.type === \"hallucination_detected\") {\n yield createHallucinationDetectedEvent(sessionId, event.blockType, event.tool);\n }\n\n if (event.type === \"llm_end\") {\n yield createLlmEndEvent(\n sessionId,\n event.iteration,\n event.hasToolCalls,\n event.toolNames,\n );\n }\n\n if (event.type === \"tool_activity\") {\n logger.debug(\"Tool activity\", { name: event.name, phase: event.phase });\n if (event.phase === \"start\") {\n yield createToolActivityEvent(\n sessionId,\n event.name,\n event.name,\n \"start\",\n );\n } else {\n yield createToolActivityEvent(\n sessionId,\n event.name,\n event.name,\n \"end\",\n event.success,\n event.summary,\n event.steps,\n );\n }\n }\n\n if (event.type === \"graph_start\") {\n yield createGraphStartEvent(sessionId, event.name);\n }\n\n if (event.type === \"graph_end\") {\n yield createGraphEndEvent(sessionId, event.name, event.durationMs);\n }\n\n if (event.type === \"phase_start\") {\n yield createPhaseStartEvent(sessionId, event.name);\n }\n\n if (event.type === \"phase_end\") {\n yield createPhaseEndEvent(sessionId, event.name, event.durationMs);\n }\n\n if (event.type === \"agent_start\") {\n yield createAgentStartEvent(sessionId, event.name);\n }\n\n if (event.type === \"agent_end\") {\n yield createAgentEndEvent(sessionId, event.name, event.durationMs, event.summary);\n }\n\n if (event.type === \"decision_questions\") {\n yield createDecisionQuestionsEvent(sessionId, { questions: event.questions });\n }\n\n if (event.type === \"chat_summarizer_start\") {\n yield createChatSummarizerStartEvent(sessionId, event.payload);\n }\n\n if (event.type === \"chat_summarizer_end\") {\n yield createChatSummarizerEndEvent(sessionId, event.payload);\n }\n\n if (event.type === \"question_generator_start\") {\n yield createQuestionGeneratorStartEvent(sessionId, event.payload);\n }\n\n if (event.type === \"question_generator_end\") {\n yield createQuestionGeneratorEndEvent(sessionId, event.payload);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────\n // UPDATES: final state from agentLoopNode\n // ─────────────────────────────────────────────────────────────────\n if (mode === \"updates\") {\n // The updates chunk is { agent_loop: { responseText, error, ... } }\n const updates = chunk as Record<string, Record<string, unknown>>;\n const agentOutput = updates?.agent_loop;\n\n if (agentOutput?.error) {\n logger.warn(\"Agent loop returned error via updates\", {\n error: agentOutput.error,\n });\n yield createErrorEvent(\n sessionId,\n String(agentOutput.error),\n \"AGENT_ERROR\",\n );\n }\n\n // Yield the agent's authoritative response text so the\n // controller can persist it without relying on token accumulation.\n const responseText = typeof agentOutput?.responseText === \"string\"\n ? (agentOutput.responseText as string)\n : \"\";\n yield createResponseCompleteEvent(sessionId, responseText);\n\n const debugMeta = agentOutput?.debugMeta as\n | { graph: string; iterations: number; tools?: DebugMetaToolCall[]; llm?: DebugMetaLlm; orchestratorNegotiations?: DebugMetaOrchestratorNegotiations; discoveryQuestions?: DebugMetaDiscoveryQuestions }\n | undefined;\n if (\n debugMeta?.graph != null &&\n typeof debugMeta.iterations === \"number\"\n ) {\n const llmFallback: DebugMetaLlm = { calls: 0, totalDurationMs: 0, resets: [], hallucinations: [] };\n yield createDebugMetaEvent(\n sessionId,\n debugMeta.graph,\n debugMeta.iterations,\n Array.isArray(debugMeta.tools) ? debugMeta.tools : [],\n debugMeta.llm ?? llmFallback,\n debugMeta.orchestratorNegotiations,\n debugMeta.discoveryQuestions,\n );\n }\n\n logger.verbose(\"Agent loop complete (updates)\", {\n responseLength: responseText.length,\n });\n }\n }\n } catch (error) {\n logger.error(\"Stream error\", {\n error: error instanceof Error ? error.message : String(error),\n });\n yield createErrorEvent(\n sessionId,\n error instanceof Error\n ? error.message\n : \"Unknown error during streaming\",\n \"STREAM_ERROR\",\n );\n }\n }\n}\n"]}
|
|
@@ -21,7 +21,7 @@ export declare class IntentGraphFactory {
|
|
|
21
21
|
operationMode: "update" | "create" | "delete" | "propose" | "read";
|
|
22
22
|
targetIntentIds: string[] | undefined;
|
|
23
23
|
networkId: string | undefined;
|
|
24
|
-
scopeType: "
|
|
24
|
+
scopeType: import("../index.js").ToolScopeType | undefined;
|
|
25
25
|
scopeId: string | undefined;
|
|
26
26
|
activeIntents: string;
|
|
27
27
|
inferredIntents: {
|
|
@@ -64,7 +64,7 @@ export declare class IntentGraphFactory {
|
|
|
64
64
|
operationMode?: "update" | "create" | "delete" | "propose" | "read" | import("@langchain/langgraph").OverwriteValue<"update" | "create" | "delete" | "propose" | "read"> | undefined;
|
|
65
65
|
targetIntentIds?: string[] | import("@langchain/langgraph").OverwriteValue<string[] | undefined> | undefined;
|
|
66
66
|
networkId?: string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined;
|
|
67
|
-
scopeType?: "
|
|
67
|
+
scopeType?: import("../index.js").ToolScopeType | import("@langchain/langgraph").OverwriteValue<import("../index.js").ToolScopeType | undefined> | undefined;
|
|
68
68
|
scopeId?: string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined;
|
|
69
69
|
activeIntents?: string | import("@langchain/langgraph").OverwriteValue<string> | undefined;
|
|
70
70
|
inferredIntents?: {
|
|
@@ -140,7 +140,7 @@ export declare class IntentGraphFactory {
|
|
|
140
140
|
operationMode: import("@langchain/langgraph").BaseChannel<"update" | "create" | "delete" | "propose" | "read", "update" | "create" | "delete" | "propose" | "read" | import("@langchain/langgraph").OverwriteValue<"update" | "create" | "delete" | "propose" | "read">, unknown>;
|
|
141
141
|
targetIntentIds: import("@langchain/langgraph").BaseChannel<string[] | undefined, string[] | import("@langchain/langgraph").OverwriteValue<string[] | undefined> | undefined, unknown>;
|
|
142
142
|
networkId: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
|
|
143
|
-
scopeType: import("@langchain/langgraph").BaseChannel<"
|
|
143
|
+
scopeType: import("@langchain/langgraph").BaseChannel<import("../index.js").ToolScopeType | undefined, import("../index.js").ToolScopeType | import("@langchain/langgraph").OverwriteValue<import("../index.js").ToolScopeType | undefined> | undefined, unknown>;
|
|
144
144
|
scopeId: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
|
|
145
145
|
activeIntents: import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
|
|
146
146
|
inferredIntents: import("@langchain/langgraph").BaseChannel<{
|
|
@@ -237,7 +237,7 @@ export declare class IntentGraphFactory {
|
|
|
237
237
|
operationMode: import("@langchain/langgraph").BaseChannel<"update" | "create" | "delete" | "propose" | "read", "update" | "create" | "delete" | "propose" | "read" | import("@langchain/langgraph").OverwriteValue<"update" | "create" | "delete" | "propose" | "read">, unknown>;
|
|
238
238
|
targetIntentIds: import("@langchain/langgraph").BaseChannel<string[] | undefined, string[] | import("@langchain/langgraph").OverwriteValue<string[] | undefined> | undefined, unknown>;
|
|
239
239
|
networkId: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
|
|
240
|
-
scopeType: import("@langchain/langgraph").BaseChannel<"
|
|
240
|
+
scopeType: import("@langchain/langgraph").BaseChannel<import("../index.js").ToolScopeType | undefined, import("../index.js").ToolScopeType | import("@langchain/langgraph").OverwriteValue<import("../index.js").ToolScopeType | undefined> | undefined, unknown>;
|
|
241
241
|
scopeId: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
|
|
242
242
|
activeIntents: import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
|
|
243
243
|
inferredIntents: import("@langchain/langgraph").BaseChannel<{
|
|
@@ -424,7 +424,7 @@ export declare class IntentGraphFactory {
|
|
|
424
424
|
operationMode: import("@langchain/langgraph").BaseChannel<"update" | "create" | "delete" | "propose" | "read", "update" | "create" | "delete" | "propose" | "read" | import("@langchain/langgraph").OverwriteValue<"update" | "create" | "delete" | "propose" | "read">, unknown>;
|
|
425
425
|
targetIntentIds: import("@langchain/langgraph").BaseChannel<string[] | undefined, string[] | import("@langchain/langgraph").OverwriteValue<string[] | undefined> | undefined, unknown>;
|
|
426
426
|
networkId: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
|
|
427
|
-
scopeType: import("@langchain/langgraph").BaseChannel<"
|
|
427
|
+
scopeType: import("@langchain/langgraph").BaseChannel<import("../index.js").ToolScopeType | undefined, import("../index.js").ToolScopeType | import("@langchain/langgraph").OverwriteValue<import("../index.js").ToolScopeType | undefined> | undefined, unknown>;
|
|
428
428
|
scopeId: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
|
|
429
429
|
activeIntents: import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
|
|
430
430
|
inferredIntents: import("@langchain/langgraph").BaseChannel<{
|
|
@@ -2,6 +2,7 @@ import { BaseMessage } from "@langchain/core/messages";
|
|
|
2
2
|
import { InferredIntent } from "./intent.inferrer.js";
|
|
3
3
|
import { SemanticVerifierOutput } from "./intent.verifier.js";
|
|
4
4
|
import type { DebugMetaAgent } from '../chat/chat-streaming.types.js';
|
|
5
|
+
import type { ToolScopeType } from '../shared/agent/tool.scope.js';
|
|
5
6
|
/**
|
|
6
7
|
* Extended InferredIntent that includes verification results.
|
|
7
8
|
* We attach the verification output directly to the intent object
|
|
@@ -87,7 +88,7 @@ export declare const IntentGraphState: import("@langchain/langgraph").Annotation
|
|
|
87
88
|
*/
|
|
88
89
|
networkId: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
|
|
89
90
|
/** Focused request scope type for write-side assignment and follow-up queues. */
|
|
90
|
-
scopeType: import("@langchain/langgraph").BaseChannel<
|
|
91
|
+
scopeType: import("@langchain/langgraph").BaseChannel<ToolScopeType | undefined, ToolScopeType | import("@langchain/langgraph").OverwriteValue<ToolScopeType | undefined> | undefined, unknown>;
|
|
91
92
|
/** Focused request scope id. When scopeType is `network`, this is the focused network id. */
|
|
92
93
|
scopeId: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
|
|
93
94
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent.state.d.ts","sourceRoot":"/","sources":["intent/intent.state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"intent.state.d.ts","sourceRoot":"/","sources":["intent/intent.state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG;IAC5C,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3C,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB;IAG3B;;;OAGG;;;;;;IAGH;;OAEG;;;;;;IAGH;;;OAGG;;;;;;IAGH;;;;;OAKG;;IAMH;;;;;;;;;OASG;;IAMH;;;OAGG;;IAMH;;;;OAIG;;IAMH,iFAAiF;;IAMjF,6FAA6F;;IAQ7F;;;OAGG;;IAQH;;OAEG;;;;;;;;;;;;;;;;;IAMH;;;OAGG;;IAQH;;OAEG;;IAMH;;;OAGG;;IAQH;;;OAGG;;IAQH;;;;OAIG;;cAC6B,MAAM;iBAAW,MAAM;eAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;cAAvD,MAAM;iBAAW,MAAM;eAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;cAAvD,MAAM;iBAAW,MAAM;eAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;IAKvF,sEAAsE;;IAQtE;;;;;OAKG;;IAMH;;;OAGG;;IAMH;;;OAGG;;IAMH;;OAEG;;eAEM,MAAM;iBACJ,KAAK,CAAC;YACb,EAAE,EAAE,MAAM,CAAC;YACX,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YACvB,SAAS,EAAE,IAAI,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;SAC1B,CAAC;kBACQ,MAAM;oBACJ,MAAM;;eAVX,MAAM;iBACJ,KAAK,CAAC;YACb,EAAE,EAAE,MAAM,CAAC;YACX,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YACvB,SAAS,EAAE,IAAI,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;SAC1B,CAAC;kBACQ,MAAM;oBACJ,MAAM;;eAVX,MAAM;iBACJ,KAAK,CAAC;YACb,EAAE,EAAE,MAAM,CAAC;YACX,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YACvB,SAAS,EAAE,IAAI,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;SAC1B,CAAC;kBACQ,MAAM;oBACJ,MAAM;;EAKpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent.tools.d.ts","sourceRoot":"/","sources":["intent/intent.tools.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AA8D5E,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"intent.tools.d.ts","sourceRoot":"/","sources":["intent/intent.tools.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AA8D5E,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,qDAgwBvE"}
|
|
@@ -4,7 +4,7 @@ import { protocolLogger } from "../shared/observability/protocol.logger.js";
|
|
|
4
4
|
import { traceGraph } from "../shared/observability/trace.js";
|
|
5
5
|
import { success, error, UUID_REGEX } from "../shared/agent/tool.helpers.js";
|
|
6
6
|
import { invokeWithAbortSignal } from "../shared/agent/model-signal.js";
|
|
7
|
-
import { deriveAllowedNetworkIds, focusedNetworkId, focusedNetworkLabel } from "../shared/agent/tool.scope.js";
|
|
7
|
+
import { deriveAllowedNetworkIds, focusedIntentId, focusedNetworkId, focusedNetworkLabel } from "../shared/agent/tool.scope.js";
|
|
8
8
|
const logger = protocolLogger("ChatTools:Intent");
|
|
9
9
|
/**
|
|
10
10
|
* Sanitize JSON string for use inside a markdown code fence (```). Escapes backticks
|
|
@@ -82,9 +82,13 @@ export function createIntentTools(defineTool, deps) {
|
|
|
82
82
|
return error(scopeErr);
|
|
83
83
|
// Distinguish "explicit network browse" from "implicit scope-aware read"
|
|
84
84
|
const scopedNetworkId = focusedNetworkId(context);
|
|
85
|
+
const scopedIntentId = focusedIntentId(context);
|
|
85
86
|
const scopedIndexLabel = focusedNetworkLabel(context);
|
|
86
87
|
const explicitNetworkId = query.networkId?.trim();
|
|
87
88
|
const explicitUserId = query.userId?.trim();
|
|
89
|
+
if (scopedIntentId && (explicitNetworkId || (explicitUserId && explicitUserId !== context.userId))) {
|
|
90
|
+
return error("This chat is scoped to one selected intent. Only that intent is available here.");
|
|
91
|
+
}
|
|
88
92
|
// Validate explicit networkId format
|
|
89
93
|
if (explicitNetworkId && !UUID_REGEX.test(explicitNetworkId)) {
|
|
90
94
|
return error("Invalid network ID format.");
|
|
@@ -124,6 +128,27 @@ export function createIntentTools(defineTool, deps) {
|
|
|
124
128
|
userProfile: "",
|
|
125
129
|
operationMode: 'read',
|
|
126
130
|
};
|
|
131
|
+
if (scopedIntentId) {
|
|
132
|
+
const intent = await deps.systemDb.getIntent(scopedIntentId);
|
|
133
|
+
if (!intent || intent.userId !== context.userId || intent.archivedAt) {
|
|
134
|
+
return error("This selected intent is no longer available.");
|
|
135
|
+
}
|
|
136
|
+
return success({
|
|
137
|
+
count: 1,
|
|
138
|
+
totalCount: 1,
|
|
139
|
+
intents: [{
|
|
140
|
+
id: intent.id,
|
|
141
|
+
description: intent.payload,
|
|
142
|
+
summary: intent.summary,
|
|
143
|
+
createdAt: intent.createdAt,
|
|
144
|
+
}],
|
|
145
|
+
scopeRestriction: {
|
|
146
|
+
isScoped: true,
|
|
147
|
+
scopedToIntent: scopedIntentId,
|
|
148
|
+
message: "Results are restricted to the selected intent.",
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
}
|
|
127
152
|
if (explicitNetworkId) {
|
|
128
153
|
graphInput.networkId = explicitNetworkId;
|
|
129
154
|
if (explicitUserId)
|
|
@@ -217,7 +242,11 @@ export function createIntentTools(defineTool, deps) {
|
|
|
217
242
|
return error("Description is required.");
|
|
218
243
|
}
|
|
219
244
|
const scopedNetworkId = focusedNetworkId(context);
|
|
245
|
+
const scopedIntentId = focusedIntentId(context);
|
|
220
246
|
const scopedIndexLabel = focusedNetworkLabel(context);
|
|
247
|
+
if (scopedIntentId) {
|
|
248
|
+
return error("This chat is scoped to an existing selected intent. Update that intent instead of creating a different one here.");
|
|
249
|
+
}
|
|
221
250
|
// Strict scope enforcement
|
|
222
251
|
if (scopedNetworkId && query.networkId?.trim() && query.networkId.trim() !== scopedNetworkId) {
|
|
223
252
|
return error(`This chat is scoped to ${scopedIndexLabel}. You can only create intents in this community.`);
|
|
@@ -385,7 +414,11 @@ export function createIntentTools(defineTool, deps) {
|
|
|
385
414
|
return error("This intent is archived and cannot be updated. Create a new intent instead.");
|
|
386
415
|
}
|
|
387
416
|
const scopedNetworkId = focusedNetworkId(context);
|
|
417
|
+
const scopedIntentId = focusedIntentId(context);
|
|
388
418
|
const scopedIndexLabel = focusedNetworkLabel(context);
|
|
419
|
+
if (scopedIntentId && scopedIntentId !== intentId) {
|
|
420
|
+
return error("This chat is scoped to one selected intent. You can only update that intent here.");
|
|
421
|
+
}
|
|
389
422
|
// Strict scope enforcement: when chat is network-scoped, verify intent is linked to that index
|
|
390
423
|
if (scopedNetworkId) {
|
|
391
424
|
const db = deps.userDb;
|
|
@@ -451,7 +484,11 @@ export function createIntentTools(defineTool, deps) {
|
|
|
451
484
|
return error("Intent not found or you can only delete your own intents.");
|
|
452
485
|
}
|
|
453
486
|
const scopedNetworkId = focusedNetworkId(context);
|
|
487
|
+
const scopedIntentId = focusedIntentId(context);
|
|
454
488
|
const scopedIndexLabel = focusedNetworkLabel(context);
|
|
489
|
+
if (scopedIntentId && scopedIntentId !== intentId) {
|
|
490
|
+
return error("This chat is scoped to one selected intent. You can only delete that intent here.");
|
|
491
|
+
}
|
|
455
492
|
// Strict scope enforcement: when chat is network-scoped, verify intent is linked to that index
|
|
456
493
|
if (scopedNetworkId) {
|
|
457
494
|
const db = deps.userDb;
|
|
@@ -497,9 +534,13 @@ export function createIntentTools(defineTool, deps) {
|
|
|
497
534
|
if (scopeErr)
|
|
498
535
|
return error(scopeErr);
|
|
499
536
|
const scopedNetworkId = focusedNetworkId(context);
|
|
537
|
+
const scopedIntentId = focusedIntentId(context);
|
|
500
538
|
const scopedIndexLabel = focusedNetworkLabel(context);
|
|
501
539
|
const intentId = query.intentId?.trim() ?? "";
|
|
502
540
|
const networkId = query.networkId?.trim() || scopedNetworkId || "";
|
|
541
|
+
if (scopedIntentId && intentId !== scopedIntentId) {
|
|
542
|
+
return error("This chat is scoped to one selected intent. You can only link that intent here.");
|
|
543
|
+
}
|
|
503
544
|
if (!UUID_REGEX.test(intentId) || !UUID_REGEX.test(networkId)) {
|
|
504
545
|
return error("Invalid ID format. Both must be UUIDs.");
|
|
505
546
|
}
|
|
@@ -551,10 +592,17 @@ export function createIntentTools(defineTool, deps) {
|
|
|
551
592
|
if (scopeErr)
|
|
552
593
|
return error(scopeErr);
|
|
553
594
|
const scopedNetworkId = focusedNetworkId(context);
|
|
595
|
+
const scopedIntentId = focusedIntentId(context);
|
|
554
596
|
const scopedIndexLabel = focusedNetworkLabel(context);
|
|
555
|
-
const intentId = query.intentId?.trim() || undefined;
|
|
597
|
+
const intentId = query.intentId?.trim() || scopedIntentId || undefined;
|
|
556
598
|
let networkId = query.networkId?.trim() || scopedNetworkId || undefined;
|
|
557
599
|
const queryUserId = query.userId?.trim() || undefined;
|
|
600
|
+
if (scopedIntentId && query.intentId?.trim() && query.intentId.trim() !== scopedIntentId) {
|
|
601
|
+
return error("This chat is scoped to one selected intent. You can only read links for that intent here.");
|
|
602
|
+
}
|
|
603
|
+
if (scopedIntentId && queryUserId && queryUserId !== context.userId) {
|
|
604
|
+
return error("This chat is scoped to one selected intent. Other users' intent links are not available here.");
|
|
605
|
+
}
|
|
558
606
|
if (intentId && !UUID_REGEX.test(intentId)) {
|
|
559
607
|
return error("Invalid intent ID format.");
|
|
560
608
|
}
|
|
@@ -613,9 +661,13 @@ export function createIntentTools(defineTool, deps) {
|
|
|
613
661
|
if (scopeErr)
|
|
614
662
|
return error(scopeErr);
|
|
615
663
|
const scopedNetworkId = focusedNetworkId(context);
|
|
664
|
+
const scopedIntentId = focusedIntentId(context);
|
|
616
665
|
const scopedIndexLabel = focusedNetworkLabel(context);
|
|
617
666
|
const intentId = query.intentId?.trim() ?? "";
|
|
618
667
|
const networkId = query.networkId?.trim() || scopedNetworkId || "";
|
|
668
|
+
if (scopedIntentId && intentId !== scopedIntentId) {
|
|
669
|
+
return error("This chat is scoped to one selected intent. You can only unlink that intent here.");
|
|
670
|
+
}
|
|
619
671
|
if (!UUID_REGEX.test(intentId) || !UUID_REGEX.test(networkId)) {
|
|
620
672
|
return error("Invalid ID format. Both must be UUIDs.");
|
|
621
673
|
}
|