@indexnetwork/protocol 4.3.2 → 4.3.4-rc.309.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.
Files changed (119) hide show
  1. package/dist/chat/chat.agent.d.ts.map +1 -1
  2. package/dist/chat/chat.agent.js +11 -1
  3. package/dist/chat/chat.agent.js.map +1 -1
  4. package/dist/chat/chat.graph.d.ts +16 -0
  5. package/dist/chat/chat.graph.d.ts.map +1 -1
  6. package/dist/chat/chat.graph.js +5 -2
  7. package/dist/chat/chat.graph.js.map +1 -1
  8. package/dist/chat/chat.prompt.d.ts.map +1 -1
  9. package/dist/chat/chat.prompt.js +20 -13
  10. package/dist/chat/chat.prompt.js.map +1 -1
  11. package/dist/chat/chat.state.d.ts +6 -3
  12. package/dist/chat/chat.state.d.ts.map +1 -1
  13. package/dist/chat/chat.state.js +12 -3
  14. package/dist/chat/chat.state.js.map +1 -1
  15. package/dist/chat/chat.streamer.d.ts +5 -0
  16. package/dist/chat/chat.streamer.d.ts.map +1 -1
  17. package/dist/chat/chat.streamer.js +13 -4
  18. package/dist/chat/chat.streamer.js.map +1 -1
  19. package/dist/enrichment/enrichment.tools.d.ts.map +1 -1
  20. package/dist/enrichment/enrichment.tools.js +16 -19
  21. package/dist/enrichment/enrichment.tools.js.map +1 -1
  22. package/dist/index.d.ts +5 -3
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +2 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/intent/intent.graph.d.ts +10 -0
  27. package/dist/intent/intent.graph.d.ts.map +1 -1
  28. package/dist/intent/intent.graph.js +6 -2
  29. package/dist/intent/intent.graph.js.map +1 -1
  30. package/dist/intent/intent.state.d.ts +5 -1
  31. package/dist/intent/intent.state.d.ts.map +1 -1
  32. package/dist/intent/intent.state.js +11 -1
  33. package/dist/intent/intent.state.js.map +1 -1
  34. package/dist/intent/intent.tools.d.ts.map +1 -1
  35. package/dist/intent/intent.tools.js +63 -39
  36. package/dist/intent/intent.tools.js.map +1 -1
  37. package/dist/mcp/mcp.server.d.ts +45 -18
  38. package/dist/mcp/mcp.server.d.ts.map +1 -1
  39. package/dist/mcp/mcp.server.js +86 -45
  40. package/dist/mcp/mcp.server.js.map +1 -1
  41. package/dist/negotiation/negotiation.tools.d.ts.map +1 -1
  42. package/dist/negotiation/negotiation.tools.js +11 -7
  43. package/dist/negotiation/negotiation.tools.js.map +1 -1
  44. package/dist/network/network.graph.js +2 -2
  45. package/dist/network/network.graph.js.map +1 -1
  46. package/dist/network/network.tools.d.ts.map +1 -1
  47. package/dist/network/network.tools.js +50 -38
  48. package/dist/network/network.tools.js.map +1 -1
  49. package/dist/opportunity/opportunity.discover.d.ts +5 -0
  50. package/dist/opportunity/opportunity.discover.d.ts.map +1 -1
  51. package/dist/opportunity/opportunity.discover.js +3 -0
  52. package/dist/opportunity/opportunity.discover.js.map +1 -1
  53. package/dist/opportunity/opportunity.graph.d.ts +6 -6
  54. package/dist/opportunity/opportunity.graph.js +1 -1
  55. package/dist/opportunity/opportunity.graph.js.map +1 -1
  56. package/dist/opportunity/opportunity.pending-questions.d.ts +3 -0
  57. package/dist/opportunity/opportunity.pending-questions.d.ts.map +1 -1
  58. package/dist/opportunity/opportunity.pending-questions.js +7 -2
  59. package/dist/opportunity/opportunity.pending-questions.js.map +1 -1
  60. package/dist/opportunity/opportunity.state.d.ts +1 -1
  61. package/dist/opportunity/opportunity.tools.d.ts.map +1 -1
  62. package/dist/opportunity/opportunity.tools.js +46 -36
  63. package/dist/opportunity/opportunity.tools.js.map +1 -1
  64. package/dist/premise/premise.graph.d.ts +13 -1
  65. package/dist/premise/premise.graph.d.ts.map +1 -1
  66. package/dist/premise/premise.graph.js +11 -6
  67. package/dist/premise/premise.graph.js.map +1 -1
  68. package/dist/premise/premise.state.d.ts +5 -0
  69. package/dist/premise/premise.state.d.ts.map +1 -1
  70. package/dist/premise/premise.state.js +11 -0
  71. package/dist/premise/premise.state.js.map +1 -1
  72. package/dist/premise/premise.tools.d.ts.map +1 -1
  73. package/dist/premise/premise.tools.js +5 -0
  74. package/dist/premise/premise.tools.js.map +1 -1
  75. package/dist/questioner/questioner.tools.d.ts +1 -1
  76. package/dist/questioner/questioner.tools.d.ts.map +1 -1
  77. package/dist/questioner/questioner.tools.js +24 -13
  78. package/dist/questioner/questioner.tools.js.map +1 -1
  79. package/dist/questioner/questioner.types.d.ts +5 -0
  80. package/dist/questioner/questioner.types.d.ts.map +1 -1
  81. package/dist/questioner/questioner.types.js.map +1 -1
  82. package/dist/shared/agent/tool.factory.d.ts.map +1 -1
  83. package/dist/shared/agent/tool.factory.js +25 -16
  84. package/dist/shared/agent/tool.factory.js.map +1 -1
  85. package/dist/shared/agent/tool.helpers.d.ts +17 -18
  86. package/dist/shared/agent/tool.helpers.d.ts.map +1 -1
  87. package/dist/shared/agent/tool.helpers.js +10 -11
  88. package/dist/shared/agent/tool.helpers.js.map +1 -1
  89. package/dist/shared/agent/tool.registry.js +1 -1
  90. package/dist/shared/agent/tool.registry.js.map +1 -1
  91. package/dist/shared/agent/tool.scope.d.ts +39 -0
  92. package/dist/shared/agent/tool.scope.d.ts.map +1 -0
  93. package/dist/shared/agent/tool.scope.js +41 -0
  94. package/dist/shared/agent/tool.scope.js.map +1 -0
  95. package/dist/shared/assignment/network-assignment.policy.d.ts +8 -5
  96. package/dist/shared/assignment/network-assignment.policy.d.ts.map +1 -1
  97. package/dist/shared/assignment/network-assignment.policy.js +11 -6
  98. package/dist/shared/assignment/network-assignment.policy.js.map +1 -1
  99. package/dist/shared/hyde/hyde.graph.d.ts +6 -6
  100. package/dist/shared/hyde/hyde.state.d.ts +2 -2
  101. package/dist/shared/interfaces/auth.interface.d.ts +3 -3
  102. package/dist/shared/interfaces/auth.interface.js.map +1 -1
  103. package/dist/shared/interfaces/database.interface.d.ts +15 -3
  104. package/dist/shared/interfaces/database.interface.d.ts.map +1 -1
  105. package/dist/shared/interfaces/database.interface.js.map +1 -1
  106. package/dist/shared/interfaces/discovery-run.interface.d.ts +1 -1
  107. package/dist/shared/interfaces/discovery-run.interface.d.ts.map +1 -1
  108. package/dist/shared/interfaces/discovery-run.interface.js.map +1 -1
  109. package/dist/shared/interfaces/enrichment-run.interface.d.ts +1 -1
  110. package/dist/shared/interfaces/enrichment-run.interface.d.ts.map +1 -1
  111. package/dist/shared/interfaces/enrichment-run.interface.js.map +1 -1
  112. package/dist/shared/interfaces/queue.interface.d.ts +8 -2
  113. package/dist/shared/interfaces/queue.interface.d.ts.map +1 -1
  114. package/dist/shared/interfaces/queue.interface.js.map +1 -1
  115. package/dist/shared/schemas/network-assignment.schema.d.ts +2 -2
  116. package/dist/shared/schemas/pending-question.schema.d.ts +5 -0
  117. package/dist/shared/schemas/pending-question.schema.d.ts.map +1 -1
  118. package/dist/shared/schemas/pending-question.schema.js.map +1 -1
  119. 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 networkId?: 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 prefillMessages,\n runId,\n } = input;\n logger.verbose(\"Starting context-aware streaming\", {\n userId,\n sessionId,\n maxContextMessages,\n hasCheckpointer: !!checkpointer,\n hasIndexId: !!networkId,\n networkId: networkId ?? undefined,\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, networkId },\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 },\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 sessionId?: string;\n } = {\n userId: input.userId,\n messages: input.messages,\n };\n if (input.networkId) initialState.networkId = input.networkId;\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 { 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 +1 @@
1
- {"version":3,"file":"enrichment.tools.d.ts","sourceRoot":"/","sources":["enrichment/enrichment.tools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAuB,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAgCjG,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,0DA+tC3E"}
1
+ {"version":3,"file":"enrichment.tools.d.ts","sourceRoot":"/","sources":["enrichment/enrichment.tools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAuB,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAiCjG,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,0DAqtC3E"}
@@ -6,6 +6,7 @@ import { socialsToEnrichmentRequest, detectSocialLabel } from "../shared/utils/s
6
6
  import { normalizeTelegramHandle } from "../shared/utils/telegram-handle.js";
7
7
  import { EnrichmentGenerator } from "./enrichment.generator.js";
8
8
  import { invokeWithAbortSignal } from "../shared/agent/model-signal.js";
9
+ import { focusedNetworkId, focusedNetworkLabel } from "../shared/agent/tool.scope.js";
9
10
  const logger = protocolLogger("ChatTools:Enrichment");
10
11
  function isMeaningfulEnrichment(enrichment) {
11
12
  return !!enrichment &&
@@ -116,9 +117,8 @@ export function createEnrichmentTools(defineTool, deps) {
116
117
  userId: context.userId,
117
118
  userName: context.userName,
118
119
  userEmail: context.userEmail,
119
- ...(context.networkId ? { networkId: context.networkId } : {}),
120
+ ...(focusedNetworkId(context) ? { scopeType: 'network', scopeId: focusedNetworkId(context) } : {}),
120
121
  ...(context.indexName ? { indexName: context.indexName } : {}),
121
- indexScope: context.indexScope,
122
122
  ...(context.sessionId ? { sessionId: context.sessionId } : {}),
123
123
  ...(context.agentId ? { agentId: context.agentId } : {}),
124
124
  ...(context.clientSurface ? { clientSurface: context.clientSurface } : {}),
@@ -276,6 +276,8 @@ export function createEnrichmentTools(defineTool, deps) {
276
276
  query: z.string().optional().describe("Name to search for (case-insensitive substring match). Searches across all the user's indexes unless networkId is also provided. Use this when the user asks to 'find' or 'look up' someone."),
277
277
  }),
278
278
  handler: async ({ context, query }) => {
279
+ const scopedNetworkId = focusedNetworkId(context);
280
+ const scopedIndexLabel = focusedNetworkLabel(context);
279
281
  const effectiveIndexId = query.networkId?.trim() || undefined;
280
282
  const targetUserId = query.userId?.trim() || undefined;
281
283
  const nameQuery = query.query?.trim() || undefined;
@@ -287,14 +289,12 @@ export function createEnrichmentTools(defineTool, deps) {
287
289
  const pattern = nameQuery.toLowerCase();
288
290
  const MAX_RESULTS = 20;
289
291
  // When chat is index-scoped, restrict name search to that index
290
- const searchIndexId = effectiveIndexId || context.networkId || undefined;
292
+ const searchIndexId = effectiveIndexId || scopedNetworkId || undefined;
291
293
  let candidates;
292
294
  if (searchIndexId) {
293
295
  // Scoped to a specific index
294
- if (context.networkId && searchIndexId !== context.networkId) {
295
- return error(context.indexName
296
- ? `This chat is scoped to ${context.indexName}. You can only look up people in this community.`
297
- : `This chat is scoped to this index. You can only look up people in this community.`);
296
+ if (scopedNetworkId && searchIndexId !== scopedNetworkId) {
297
+ return error(`This chat is scoped to ${scopedIndexLabel}. You can only look up people in this community.`);
298
298
  }
299
299
  const callerIsMember = await systemDb.isNetworkMember(searchIndexId, context.userId);
300
300
  if (!callerIsMember) {
@@ -349,10 +349,8 @@ export function createEnrichmentTools(defineTool, deps) {
349
349
  // --- Mode 3: networkId provided → fetch all member profiles ---
350
350
  if (effectiveIndexId) {
351
351
  // Strict scope enforcement: when chat is index-scoped, only allow querying that index
352
- if (context.networkId && effectiveIndexId !== context.networkId) {
353
- return error(context.indexName
354
- ? `This chat is scoped to ${context.indexName}. You can only read profiles from this community.`
355
- : `This chat is scoped to this index. You can only read profiles from this community.`);
352
+ if (scopedNetworkId && effectiveIndexId !== scopedNetworkId) {
353
+ return error(`This chat is scoped to ${scopedIndexLabel}. You can only read profiles from this community.`);
356
354
  }
357
355
  // Verify the caller is a member of the index they're querying
358
356
  const callerIsMember = await systemDb.isNetworkMember(effectiveIndexId, context.userId);
@@ -379,12 +377,10 @@ export function createEnrichmentTools(defineTool, deps) {
379
377
  // --- Mode 2: userId provided (different user) → fetch single profile directly ---
380
378
  if (targetUserId && targetUserId !== context.userId) {
381
379
  // Strict scope enforcement: when chat is index-scoped, verify user is in that index
382
- if (context.networkId) {
383
- const isInScopedIndex = await systemDb.isNetworkMember(context.networkId, targetUserId);
380
+ if (scopedNetworkId) {
381
+ const isInScopedIndex = await systemDb.isNetworkMember(scopedNetworkId, targetUserId);
384
382
  if (!isInScopedIndex) {
385
- return error(context.indexName
386
- ? `This chat is scoped to ${context.indexName}. You can only read profiles of members in this community.`
387
- : `This chat is scoped to this index. You can only read profiles of members in this community.`);
383
+ return error(`This chat is scoped to ${scopedIndexLabel}. You can only read profiles of members in this community.`);
388
384
  }
389
385
  }
390
386
  // Use systemDb for cross-user profile access (requires shared index)
@@ -522,9 +518,10 @@ export function createEnrichmentTools(defineTool, deps) {
522
518
  message: `Profile preview started. Call get_enrichment_run with profileRunId="${profileRunId}" until it succeeds, fails, or is cancelled.`,
523
519
  });
524
520
  }
521
+ const scopedNetworkId = focusedNetworkId(context);
525
522
  const onboarding = user.onboarding ?? context.user.onboarding;
526
523
  const hasEdgeosConsent = hasEdgeosImportConsent(onboarding);
527
- const seed = hasEdgeosConsent ? selectProfileSeed(onboarding, context.networkId) : undefined;
524
+ const seed = hasEdgeosConsent ? selectProfileSeed(onboarding, scopedNetworkId) : undefined;
528
525
  const authenticatedIdentity = resolveAuthenticatedLookupIdentity(user, context);
529
526
  const name = seed?.name || authenticatedIdentity.name || query.name?.trim() || undefined;
530
527
  const location = query.location?.trim() || seed?.location || user.location || undefined;
@@ -602,7 +599,7 @@ export function createEnrichmentTools(defineTool, deps) {
602
599
  if (query.draft) {
603
600
  const profile = { ...query.draft, userId: context.userId };
604
601
  await userDb.saveProfile({ userId: context.userId, identity: profile.identity, context: profile.narrative?.context ?? '' });
605
- await persistApprovedProfileContext(profile, user, context.networkId);
602
+ await persistApprovedProfileContext(profile, user, focusedNetworkId(context));
606
603
  const decomposeLogLabel = context.isMcp
607
604
  ? 'Approved draft premise decomposition failed'
608
605
  : 'Approved draft premise decomposition failed (web)';
@@ -638,7 +635,7 @@ export function createEnrichmentTools(defineTool, deps) {
638
635
  location: approvedLocation && approvedLocation.length > 0 ? approvedLocation : user?.location ?? '',
639
636
  },
640
637
  };
641
- await persistApprovedProfileContext(rawProfile, user, context.networkId);
638
+ await persistApprovedProfileContext(rawProfile, user, focusedNetworkId(context));
642
639
  const _confirmTraceEmitter = requestContext.getStore()?.traceEmitter;
643
640
  const _confirmGraphStart = Date.now();
644
641
  _confirmTraceEmitter?.({ type: "graph_start", name: "enrichment" });