@indexnetwork/protocol 1.25.4 → 1.26.0-rc.216.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/index.d.ts CHANGED
@@ -29,6 +29,7 @@ export type * from "./shared/interfaces/storage.interface.js";
29
29
  export type * from "./shared/interfaces/delivery-ledger.interface.js";
30
30
  export type * from "./shared/interfaces/connect-link.interface.js";
31
31
  export type * from "./shared/interfaces/discovery-run.interface.js";
32
+ export type * from "./shared/interfaces/profile-run.interface.js";
32
33
  export type * from "./shared/interfaces/negotiation-events.interface.js";
33
34
  export type { AgentDispatcher, AgentDispatchResult, NegotiationTurnPayload } from "./shared/interfaces/agent-dispatcher.interface.js";
34
35
  export type { AgentRecord, AgentTransportRecord, AgentPermissionRecord, AgentWithRelations, CreateAgentInput, CreateTransportInput, GrantPermissionInput, AgentDatabase, } from './shared/interfaces/agent.interface.js';
@@ -80,6 +81,7 @@ export { OpportunityEvaluator } from "./opportunity/opportunity.evaluator.js";
80
81
  export type { EvaluatorInput, OpportunityEvaluatorOptionsConstructor, } from "./opportunity/opportunity.evaluator.js";
81
82
  export { OpportunityPresenter, gatherPresenterContext } from "./opportunity/opportunity.presenter.js";
82
83
  export { createOpportunityTools } from "./opportunity/opportunity.tools.js";
84
+ export { createProfileTools } from "./profile/profile.tools.js";
83
85
  export type { PresenterDatabase } from "./opportunity/opportunity.presenter.js";
84
86
  export { QuestionGenerator } from "./opportunity/question.generator.js";
85
87
  export type { DiscoveryQuestionInput, DiscoveryNegotiation, DiscoveryOutcome, DiscoveryTurn, DiscoverySummary, DiscoverySourceProfile, NegotiationRole, } from "./opportunity/question.prompt.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -42,6 +42,7 @@ export { getPreset } from "./questioner/questioner.presets.js";
42
42
  export { OpportunityEvaluator } from "./opportunity/opportunity.evaluator.js";
43
43
  export { OpportunityPresenter, gatherPresenterContext } from "./opportunity/opportunity.presenter.js";
44
44
  export { createOpportunityTools } from "./opportunity/opportunity.tools.js";
45
+ export { createProfileTools } from "./profile/profile.tools.js";
45
46
  export { QuestionGenerator } from "./opportunity/question.generator.js";
46
47
  // ─── Support utilities ────────────────────────────────────────────────────────
47
48
  export { renderNetworkContext } from './shared/network/metadata.renderer.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["// ─── Public API (recommended for external consumers) ──────────────────────────\n\nexport { createChatTools } from \"./shared/agent/tool.factory.js\";\nexport { configureProtocol, getModelName } from \"./shared/agent/model.config.js\";\nexport type { ChatTools } from \"./shared/agent/tool.factory.js\";\nexport type { ModelConfig, ModelSettings } from \"./shared/agent/model.config.js\";\nexport type {\n ToolContext,\n ToolErrorReport,\n ResolvedToolContext,\n ToolDeps,\n ProtocolDeps,\n DefineTool,\n RawToolDefinition,\n CompiledGraph,\n ToolRegistry,\n} from \"./shared/agent/tool.helpers.js\";\nexport { ChatContextAccessError, resolveChatContext } from \"./shared/agent/tool.helpers.js\";\nexport { requestContext } from \"./shared/observability/request-context.js\";\nexport { setTimingWrapper } from \"./shared/observability/performance.js\";\nexport {\n ToolRuntimeError,\n getToolTimeoutPolicy,\n invokeToolRuntime,\n toolRuntimeErrorToResult,\n} from \"./shared/agent/tool.runtime.js\";\nexport type { ToolRuntimeErrorCode, ToolTimeoutClass, ToolTimeoutPolicy } from \"./shared/agent/tool.runtime.js\";\n\n// ─── Interfaces (implement these to wire up your infrastructure) ───────────────\n\nexport type * from \"./shared/interfaces/auth.interface.js\";\nexport type * from \"./shared/interfaces/cache.interface.js\";\nexport type * from \"./shared/interfaces/chat-session.interface.js\";\nexport type { ChatSummaryReader } from \"./shared/interfaces/chat-summary.interface.js\";\nexport type { ChatMessageWriter } from \"./shared/interfaces/chat-message-writer.interface.js\";\nexport type { QuestionGeneratorReader } from \"./shared/interfaces/question-generator.interface.js\";\nexport type {\n QuestionerDatabase,\n PersistableQuestion,\n PersistedQuestion,\n QuestionFilters,\n} from \"./shared/interfaces/questioner.interface.js\";\nexport type { NegotiationSummaryReader } from \"./shared/interfaces/negotiation-summary.interface.js\";\nexport type { DiscoveryNegotiationDigest } from \"./shared/schemas/negotiation-digest.schema.js\";\nexport { NegotiationSummarizer, buildFallbackDigest } from \"./negotiation/negotiation.summarizer.js\";\nexport type * from \"./shared/interfaces/contact.interface.js\";\nexport type * from \"./shared/interfaces/database.interface.js\";\nexport type * from \"./shared/interfaces/embedder.interface.js\";\nexport type * from \"./shared/interfaces/enrichment.interface.js\";\nexport type * from \"./shared/interfaces/integration.interface.js\";\nexport type * from \"./shared/interfaces/queue.interface.js\";\nexport type * from \"./shared/interfaces/scraper.interface.js\";\nexport type * from \"./shared/interfaces/storage.interface.js\";\nexport type * from \"./shared/interfaces/delivery-ledger.interface.js\";\nexport type * from \"./shared/interfaces/connect-link.interface.js\";\nexport type * from \"./shared/interfaces/discovery-run.interface.js\";\nexport type * from \"./shared/interfaces/negotiation-events.interface.js\";\nexport type { AgentDispatcher, AgentDispatchResult, NegotiationTurnPayload } from \"./shared/interfaces/agent-dispatcher.interface.js\";\nexport type {\n AgentRecord,\n AgentTransportRecord,\n AgentPermissionRecord,\n AgentWithRelations,\n CreateAgentInput,\n CreateTransportInput,\n GrantPermissionInput,\n AgentDatabase,\n} from './shared/interfaces/agent.interface.js';\nexport { SYSTEM_AGENT_IDS } from './shared/interfaces/agent.interface.js';\n\n// ─── Shared schemas ───────────────────────────────────────────────────────────\n\nexport {\n ChatContextDigestSchema,\n type ChatContextDigest,\n} from \"./shared/schemas/chat-context.schema.js\";\nexport {\n QuestionOptionSchema,\n QuestionSchema,\n QuestionStrategySchema,\n QuestionWithStrategySchema,\n QuestionGeneratorResponseSchema,\n QuestionModeSchema,\n QuestionDetectionSchema,\n QuestionActorSchema,\n QuestionAnswerSchema,\n type Question,\n type QuestionOption,\n type QuestionStrategy,\n type QuestionWithStrategy,\n type QuestionGeneratorResponse,\n type QuestionGenerationResult,\n type QuestionMode,\n type QuestionDetection,\n type QuestionActor,\n type QuestionAnswer,\n} from \"./shared/schemas/question.schema.js\";\nexport type { PendingQuestionSummary } from \"./shared/schemas/pending-question.schema.js\";\n\n// ─── Graph factories ──────────────────────────────────────────────────────────\n\nexport { ChatGraphFactory } from \"./chat/chat.graph.js\";\nexport { HomeGraphFactory } from \"./opportunity/feed/feed.graph.js\";\nexport { HydeGraphFactory } from \"./shared/hyde/hyde.graph.js\";\nexport { NetworkGraphFactory } from \"./network/network.graph.js\";\nexport { NetworkMembershipGraphFactory } from \"./network/membership/membership.graph.js\";\nexport { IntentGraphFactory } from \"./intent/intent.graph.js\";\nexport { IntentNetworkGraphFactory } from \"./network/indexer/indexer.graph.js\";\nexport { MaintenanceGraphFactory } from \"./maintenance/maintenance.graph.js\";\nexport type {\n MaintenanceGraphDatabase,\n MaintenanceGraphCache,\n MaintenanceGraphQueue,\n} from \"./maintenance/maintenance.graph.js\";\nexport { NegotiationGraphFactory, createDefaultNegotiationGraph, negotiateCandidates } from \"./negotiation/negotiation.graph.js\";\nexport { OpportunityGraphFactory } from \"./opportunity/opportunity.graph.js\";\nexport { ProfileGraphFactory } from \"./profile/profile.graph.js\";\nexport { PremiseGraphFactory } from \"./premise/premise.graph.js\";\n\n// ─── Agents ───────────────────────────────────────────────────────────────────\n\nexport { UserContextGenerator } from \"./context/context.generator.js\";\nexport type { UserContextInput, IncrementalContextInput, UserContextResult } from \"./context/context.generator.js\";\nexport { ChatTitleGenerator } from \"./chat/chat.title.generator.js\";\nexport { ChatSummarizer } from \"./chat/chat.summarizer.js\";\nexport type { ChatSummarizerInput, ChatSummarizerMessage } from \"./chat/chat.summarizer.js\";\nexport { HydeGenerator } from \"./shared/hyde/hyde.generator.js\";\nexport { SuggestionGenerator } from \"./chat/chat.suggester.js\";\nexport type { SuggestionGeneratorInput } from \"./chat/chat.suggester.js\";\nexport { generateInviteMessage } from \"./contact/contact.inviter.js\";\nexport type { InviteInput, InviteOutput } from \"./contact/contact.inviter.js\";\nexport { IntentIndexer } from \"./intent/intent.indexer.js\";\nexport { PremiseAnalyzer } from \"./premise/premise.analyzer.js\";\nexport type { PremiseAnalyzerOutput } from \"./premise/premise.analyzer.js\";\nexport { PremiseDecomposer } from \"./premise/premise.decomposer.js\";\nexport type { PremiseDecomposerOutput, DecomposedPremise } from \"./premise/premise.decomposer.js\";\nexport { PremiseIndexer } from \"./premise/premise.indexer.js\";\nexport type { PremiseIndexerOutput } from \"./premise/premise.indexer.js\";\nexport { LensInferrer } from \"./shared/hyde/lens.inferrer.js\";\nexport { NegotiationInsightsGenerator } from \"./negotiation/insight.generator.js\";\nexport type { NegotiationDigest } from \"./negotiation/insight.generator.js\";\nexport { IndexNegotiator } from \"./negotiation/negotiation.agent.js\";\nexport type { NegotiationAgentInput } from \"./negotiation/negotiation.agent.js\";\nexport { QuestionerAgent } from \"./questioner/questioner.agent.js\";\nexport type { QuestionerAgentConfig } from \"./questioner/questioner.agent.js\";\nexport type {\n QuestionerInput,\n QuestionerContext,\n QuestionerEnqueuePayload,\n QuestionerEnqueueFn,\n DiscoveryContext,\n IntentContext,\n ProfileContext,\n NegotiationContext,\n} from \"./questioner/questioner.types.js\";\nexport { getPreset } from \"./questioner/questioner.presets.js\";\nexport type { QuestionerPreset } from \"./questioner/questioner.presets.js\";\nexport { OpportunityEvaluator } from \"./opportunity/opportunity.evaluator.js\";\nexport type {\n EvaluatorInput,\n OpportunityEvaluatorOptionsConstructor,\n} from \"./opportunity/opportunity.evaluator.js\";\nexport { OpportunityPresenter, gatherPresenterContext } from \"./opportunity/opportunity.presenter.js\";\nexport { createOpportunityTools } from \"./opportunity/opportunity.tools.js\";\nexport type { PresenterDatabase } from \"./opportunity/opportunity.presenter.js\";\nexport { QuestionGenerator } from \"./opportunity/question.generator.js\";\nexport type {\n DiscoveryQuestionInput,\n DiscoveryNegotiation,\n DiscoveryOutcome,\n DiscoveryTurn,\n DiscoverySummary,\n DiscoverySourceProfile,\n NegotiationRole,\n} from \"./opportunity/question.prompt.js\";\n\n// ─── Support utilities ────────────────────────────────────────────────────────\n\nexport { renderNetworkContext } from './shared/network/metadata.renderer.js';\nexport {\n canUserSeeOpportunity,\n isActionableForViewer,\n validateOpportunityActors,\n classifyOpportunity,\n selectByComposition,\n FEED_SOFT_TARGETS,\n} from \"./opportunity/opportunity.utils.js\";\nexport { getPrimaryActionLabel } from \"./opportunity/opportunity.labels.js\";\nexport { computeFeedHealth } from \"./opportunity/feed/feed.health.js\";\nexport type { FeedHealthInput, FeedHealthResult } from \"./opportunity/feed/feed.health.js\";\nexport {\n selectContactsForDiscovery,\n shouldRunIntroducerDiscovery,\n runIntroducerDiscovery,\n MAX_CONTACTS_PER_CYCLE,\n MAX_CANDIDATES_PER_CONTACT,\n INTRODUCER_DISCOVERY_SOURCE,\n} from \"./opportunity/opportunity.introducer.js\";\nexport type {\n IntroducerDiscoveryDatabase,\n IntroducerDiscoveryQueue,\n ContactWithIntents,\n} from \"./opportunity/opportunity.introducer.js\";\nexport { persistOpportunities } from \"./opportunity/opportunity.persist.js\";\nexport { presentOpportunity } from \"./opportunity/opportunity.presentation.js\";\nexport type { UserInfo } from \"./opportunity/opportunity.presentation.js\";\nexport { stripUuids, stripIntroducerMentions } from \"./opportunity/opportunity.presentation.js\";\nexport {\n getOrCreateDeliveryCardBatch,\n DELIVERY_CARD_CACHE_TTL,\n type CachedDeliveryCard,\n type OpportunityWithContext,\n} from \"./opportunity/delivery-card.cache.js\";\n\n// ─── Tools ────────────────────────────────────────────────────────────────────\n\nexport { createToolRegistry } from \"./shared/agent/tool.registry.js\";\nexport { createAgentTools } from './agent/agent.tools.js';\nexport { AMBIENT_PARK_WINDOW_MS } from './negotiation/negotiation.tools.js';\nexport { normalizeTelegramHandle } from './shared/utils/telegram-handle.js';\n\n// ─── MCP ──────────────────────────────────────────────────────────────────────\n\nexport { createMcpServer, computeAgentIndexScope, buildMcpOnboardingMessage, ONBOARDING_ALLOWED } from \"./mcp/mcp.server.js\";\nexport type { ScopedDepsFactory } from \"./mcp/mcp.server.js\";\nexport { buildElicitationCreate, flattenChoice } from \"./mcp/elicitation.builder.js\";\nexport { dispatchElicitations } from \"./mcp/elicitation.dispatcher.js\";\nexport type { ElicitResultLike, ElicitInputFn, DispatchElicitationsParams } from \"./mcp/elicitation.dispatcher.js\";\n\n// ─── States (for advanced graph consumers) ────────────────────────────────────\n\nexport type {\n UserNegotiationContext,\n NegotiationTurn,\n NegotiationOutcome,\n SeedAssessment,\n NegotiationGraphLike,\n} from \"./negotiation/negotiation.state.js\";\n\n// ─── Streamers ────────────────────────────────────────────────────────────────\n\nexport { ChatStreamer } from \"./chat/chat.streamer.js\";\nexport { ResponseStreamer } from \"./shared/agent/response.streamer.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["// ─── Public API (recommended for external consumers) ──────────────────────────\n\nexport { createChatTools } from \"./shared/agent/tool.factory.js\";\nexport { configureProtocol, getModelName } from \"./shared/agent/model.config.js\";\nexport type { ChatTools } from \"./shared/agent/tool.factory.js\";\nexport type { ModelConfig, ModelSettings } from \"./shared/agent/model.config.js\";\nexport type {\n ToolContext,\n ToolErrorReport,\n ResolvedToolContext,\n ToolDeps,\n ProtocolDeps,\n DefineTool,\n RawToolDefinition,\n CompiledGraph,\n ToolRegistry,\n} from \"./shared/agent/tool.helpers.js\";\nexport { ChatContextAccessError, resolveChatContext } from \"./shared/agent/tool.helpers.js\";\nexport { requestContext } from \"./shared/observability/request-context.js\";\nexport { setTimingWrapper } from \"./shared/observability/performance.js\";\nexport {\n ToolRuntimeError,\n getToolTimeoutPolicy,\n invokeToolRuntime,\n toolRuntimeErrorToResult,\n} from \"./shared/agent/tool.runtime.js\";\nexport type { ToolRuntimeErrorCode, ToolTimeoutClass, ToolTimeoutPolicy } from \"./shared/agent/tool.runtime.js\";\n\n// ─── Interfaces (implement these to wire up your infrastructure) ───────────────\n\nexport type * from \"./shared/interfaces/auth.interface.js\";\nexport type * from \"./shared/interfaces/cache.interface.js\";\nexport type * from \"./shared/interfaces/chat-session.interface.js\";\nexport type { ChatSummaryReader } from \"./shared/interfaces/chat-summary.interface.js\";\nexport type { ChatMessageWriter } from \"./shared/interfaces/chat-message-writer.interface.js\";\nexport type { QuestionGeneratorReader } from \"./shared/interfaces/question-generator.interface.js\";\nexport type {\n QuestionerDatabase,\n PersistableQuestion,\n PersistedQuestion,\n QuestionFilters,\n} from \"./shared/interfaces/questioner.interface.js\";\nexport type { NegotiationSummaryReader } from \"./shared/interfaces/negotiation-summary.interface.js\";\nexport type { DiscoveryNegotiationDigest } from \"./shared/schemas/negotiation-digest.schema.js\";\nexport { NegotiationSummarizer, buildFallbackDigest } from \"./negotiation/negotiation.summarizer.js\";\nexport type * from \"./shared/interfaces/contact.interface.js\";\nexport type * from \"./shared/interfaces/database.interface.js\";\nexport type * from \"./shared/interfaces/embedder.interface.js\";\nexport type * from \"./shared/interfaces/enrichment.interface.js\";\nexport type * from \"./shared/interfaces/integration.interface.js\";\nexport type * from \"./shared/interfaces/queue.interface.js\";\nexport type * from \"./shared/interfaces/scraper.interface.js\";\nexport type * from \"./shared/interfaces/storage.interface.js\";\nexport type * from \"./shared/interfaces/delivery-ledger.interface.js\";\nexport type * from \"./shared/interfaces/connect-link.interface.js\";\nexport type * from \"./shared/interfaces/discovery-run.interface.js\";\nexport type * from \"./shared/interfaces/profile-run.interface.js\";\nexport type * from \"./shared/interfaces/negotiation-events.interface.js\";\nexport type { AgentDispatcher, AgentDispatchResult, NegotiationTurnPayload } from \"./shared/interfaces/agent-dispatcher.interface.js\";\nexport type {\n AgentRecord,\n AgentTransportRecord,\n AgentPermissionRecord,\n AgentWithRelations,\n CreateAgentInput,\n CreateTransportInput,\n GrantPermissionInput,\n AgentDatabase,\n} from './shared/interfaces/agent.interface.js';\nexport { SYSTEM_AGENT_IDS } from './shared/interfaces/agent.interface.js';\n\n// ─── Shared schemas ───────────────────────────────────────────────────────────\n\nexport {\n ChatContextDigestSchema,\n type ChatContextDigest,\n} from \"./shared/schemas/chat-context.schema.js\";\nexport {\n QuestionOptionSchema,\n QuestionSchema,\n QuestionStrategySchema,\n QuestionWithStrategySchema,\n QuestionGeneratorResponseSchema,\n QuestionModeSchema,\n QuestionDetectionSchema,\n QuestionActorSchema,\n QuestionAnswerSchema,\n type Question,\n type QuestionOption,\n type QuestionStrategy,\n type QuestionWithStrategy,\n type QuestionGeneratorResponse,\n type QuestionGenerationResult,\n type QuestionMode,\n type QuestionDetection,\n type QuestionActor,\n type QuestionAnswer,\n} from \"./shared/schemas/question.schema.js\";\nexport type { PendingQuestionSummary } from \"./shared/schemas/pending-question.schema.js\";\n\n// ─── Graph factories ──────────────────────────────────────────────────────────\n\nexport { ChatGraphFactory } from \"./chat/chat.graph.js\";\nexport { HomeGraphFactory } from \"./opportunity/feed/feed.graph.js\";\nexport { HydeGraphFactory } from \"./shared/hyde/hyde.graph.js\";\nexport { NetworkGraphFactory } from \"./network/network.graph.js\";\nexport { NetworkMembershipGraphFactory } from \"./network/membership/membership.graph.js\";\nexport { IntentGraphFactory } from \"./intent/intent.graph.js\";\nexport { IntentNetworkGraphFactory } from \"./network/indexer/indexer.graph.js\";\nexport { MaintenanceGraphFactory } from \"./maintenance/maintenance.graph.js\";\nexport type {\n MaintenanceGraphDatabase,\n MaintenanceGraphCache,\n MaintenanceGraphQueue,\n} from \"./maintenance/maintenance.graph.js\";\nexport { NegotiationGraphFactory, createDefaultNegotiationGraph, negotiateCandidates } from \"./negotiation/negotiation.graph.js\";\nexport { OpportunityGraphFactory } from \"./opportunity/opportunity.graph.js\";\nexport { ProfileGraphFactory } from \"./profile/profile.graph.js\";\nexport { PremiseGraphFactory } from \"./premise/premise.graph.js\";\n\n// ─── Agents ───────────────────────────────────────────────────────────────────\n\nexport { UserContextGenerator } from \"./context/context.generator.js\";\nexport type { UserContextInput, IncrementalContextInput, UserContextResult } from \"./context/context.generator.js\";\nexport { ChatTitleGenerator } from \"./chat/chat.title.generator.js\";\nexport { ChatSummarizer } from \"./chat/chat.summarizer.js\";\nexport type { ChatSummarizerInput, ChatSummarizerMessage } from \"./chat/chat.summarizer.js\";\nexport { HydeGenerator } from \"./shared/hyde/hyde.generator.js\";\nexport { SuggestionGenerator } from \"./chat/chat.suggester.js\";\nexport type { SuggestionGeneratorInput } from \"./chat/chat.suggester.js\";\nexport { generateInviteMessage } from \"./contact/contact.inviter.js\";\nexport type { InviteInput, InviteOutput } from \"./contact/contact.inviter.js\";\nexport { IntentIndexer } from \"./intent/intent.indexer.js\";\nexport { PremiseAnalyzer } from \"./premise/premise.analyzer.js\";\nexport type { PremiseAnalyzerOutput } from \"./premise/premise.analyzer.js\";\nexport { PremiseDecomposer } from \"./premise/premise.decomposer.js\";\nexport type { PremiseDecomposerOutput, DecomposedPremise } from \"./premise/premise.decomposer.js\";\nexport { PremiseIndexer } from \"./premise/premise.indexer.js\";\nexport type { PremiseIndexerOutput } from \"./premise/premise.indexer.js\";\nexport { LensInferrer } from \"./shared/hyde/lens.inferrer.js\";\nexport { NegotiationInsightsGenerator } from \"./negotiation/insight.generator.js\";\nexport type { NegotiationDigest } from \"./negotiation/insight.generator.js\";\nexport { IndexNegotiator } from \"./negotiation/negotiation.agent.js\";\nexport type { NegotiationAgentInput } from \"./negotiation/negotiation.agent.js\";\nexport { QuestionerAgent } from \"./questioner/questioner.agent.js\";\nexport type { QuestionerAgentConfig } from \"./questioner/questioner.agent.js\";\nexport type {\n QuestionerInput,\n QuestionerContext,\n QuestionerEnqueuePayload,\n QuestionerEnqueueFn,\n DiscoveryContext,\n IntentContext,\n ProfileContext,\n NegotiationContext,\n} from \"./questioner/questioner.types.js\";\nexport { getPreset } from \"./questioner/questioner.presets.js\";\nexport type { QuestionerPreset } from \"./questioner/questioner.presets.js\";\nexport { OpportunityEvaluator } from \"./opportunity/opportunity.evaluator.js\";\nexport type {\n EvaluatorInput,\n OpportunityEvaluatorOptionsConstructor,\n} from \"./opportunity/opportunity.evaluator.js\";\nexport { OpportunityPresenter, gatherPresenterContext } from \"./opportunity/opportunity.presenter.js\";\nexport { createOpportunityTools } from \"./opportunity/opportunity.tools.js\";\nexport { createProfileTools } from \"./profile/profile.tools.js\";\nexport type { PresenterDatabase } from \"./opportunity/opportunity.presenter.js\";\nexport { QuestionGenerator } from \"./opportunity/question.generator.js\";\nexport type {\n DiscoveryQuestionInput,\n DiscoveryNegotiation,\n DiscoveryOutcome,\n DiscoveryTurn,\n DiscoverySummary,\n DiscoverySourceProfile,\n NegotiationRole,\n} from \"./opportunity/question.prompt.js\";\n\n// ─── Support utilities ────────────────────────────────────────────────────────\n\nexport { renderNetworkContext } from './shared/network/metadata.renderer.js';\nexport {\n canUserSeeOpportunity,\n isActionableForViewer,\n validateOpportunityActors,\n classifyOpportunity,\n selectByComposition,\n FEED_SOFT_TARGETS,\n} from \"./opportunity/opportunity.utils.js\";\nexport { getPrimaryActionLabel } from \"./opportunity/opportunity.labels.js\";\nexport { computeFeedHealth } from \"./opportunity/feed/feed.health.js\";\nexport type { FeedHealthInput, FeedHealthResult } from \"./opportunity/feed/feed.health.js\";\nexport {\n selectContactsForDiscovery,\n shouldRunIntroducerDiscovery,\n runIntroducerDiscovery,\n MAX_CONTACTS_PER_CYCLE,\n MAX_CANDIDATES_PER_CONTACT,\n INTRODUCER_DISCOVERY_SOURCE,\n} from \"./opportunity/opportunity.introducer.js\";\nexport type {\n IntroducerDiscoveryDatabase,\n IntroducerDiscoveryQueue,\n ContactWithIntents,\n} from \"./opportunity/opportunity.introducer.js\";\nexport { persistOpportunities } from \"./opportunity/opportunity.persist.js\";\nexport { presentOpportunity } from \"./opportunity/opportunity.presentation.js\";\nexport type { UserInfo } from \"./opportunity/opportunity.presentation.js\";\nexport { stripUuids, stripIntroducerMentions } from \"./opportunity/opportunity.presentation.js\";\nexport {\n getOrCreateDeliveryCardBatch,\n DELIVERY_CARD_CACHE_TTL,\n type CachedDeliveryCard,\n type OpportunityWithContext,\n} from \"./opportunity/delivery-card.cache.js\";\n\n// ─── Tools ────────────────────────────────────────────────────────────────────\n\nexport { createToolRegistry } from \"./shared/agent/tool.registry.js\";\nexport { createAgentTools } from './agent/agent.tools.js';\nexport { AMBIENT_PARK_WINDOW_MS } from './negotiation/negotiation.tools.js';\nexport { normalizeTelegramHandle } from './shared/utils/telegram-handle.js';\n\n// ─── MCP ──────────────────────────────────────────────────────────────────────\n\nexport { createMcpServer, computeAgentIndexScope, buildMcpOnboardingMessage, ONBOARDING_ALLOWED } from \"./mcp/mcp.server.js\";\nexport type { ScopedDepsFactory } from \"./mcp/mcp.server.js\";\nexport { buildElicitationCreate, flattenChoice } from \"./mcp/elicitation.builder.js\";\nexport { dispatchElicitations } from \"./mcp/elicitation.dispatcher.js\";\nexport type { ElicitResultLike, ElicitInputFn, DispatchElicitationsParams } from \"./mcp/elicitation.dispatcher.js\";\n\n// ─── States (for advanced graph consumers) ────────────────────────────────────\n\nexport type {\n UserNegotiationContext,\n NegotiationTurn,\n NegotiationOutcome,\n SeedAssessment,\n NegotiationGraphLike,\n} from \"./negotiation/negotiation.state.js\";\n\n// ─── Streamers ────────────────────────────────────────────────────────────────\n\nexport { ChatStreamer } from \"./chat/chat.streamer.js\";\nexport { ResponseStreamer } from \"./shared/agent/response.streamer.js\";\n"]}
@@ -8,6 +8,12 @@ import { McpServer } from '@modelcontextprotocol/server';
8
8
  import type { McpAuthResolver } from '../shared/interfaces/auth.interface.js';
9
9
  import type { ToolDeps, ResolvedToolContext } from '../shared/agent/tool.helpers.js';
10
10
  import type { Question } from '../shared/schemas/question.schema.js';
11
+ /**
12
+ * Runtime/auth failures are converted into structured MCP `isError` tool
13
+ * results for the caller. Reporting them as application exceptions produces
14
+ * Sentry noise for expected client failures and policy-enforced timeouts.
15
+ */
16
+ export declare function shouldReportMcpToolError(err: unknown): boolean;
11
17
  /**
12
18
  * Strips internal `_`-prefixed keys from `data` and promotes `isError`
13
19
  * from the inner `success: false` signal to the MCP envelope level.
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.server.d.ts","sourceRoot":"/","sources":["mcp/mcp.server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAkB,MAAM,8BAA8B,CAAC;AAGzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAErF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAsFrE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAqBlF;AAKD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,IAAI,CAkBxE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAErE;AAMD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAAC,CAAC;CACrF;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,cAAc;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,EAAE,EAClE,gBAAgB,MAAM,GAAG,IAAI,GAAG,SAAS,KACxC,MAAM,EAOR,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,0BAA0B,GACrC,SAAS,mBAAmB,EAC5B,gBAAgB,MAAM,GAAG,IAAI,GAAG,SAAS,KACxC,IAyBF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAejD,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAyB1E;AAwCD,eAAO,MAAM,gBAAgB,QAsDrB,CAAC;AAET,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,eAAe,EAC7B,iBAAiB,EAAE,iBAAiB,GACnC,SAAS,CA0NX"}
1
+ {"version":3,"file":"mcp.server.d.ts","sourceRoot":"/","sources":["mcp/mcp.server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAkB,MAAM,8BAA8B,CAAC;AAGzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAErF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAiBrE;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAI9D;AA8ED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAqBlF;AAKD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,IAAI,CAkBxE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAErE;AAMD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAAC,CAAC;CACrF;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,cAAc;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,EAAE,EAClE,gBAAgB,MAAM,GAAG,IAAI,GAAG,SAAS,KACxC,MAAM,EAOR,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,0BAA0B,GACrC,SAAS,mBAAmB,EAC5B,gBAAgB,MAAM,GAAG,IAAI,GAAG,SAAS,KACxC,IAyBF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAiBjD,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAyB1E;AAwCD,eAAO,MAAM,gBAAgB,QAsDrB,CAAC;AAET,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,eAAe,EAC7B,iBAAiB,EAAE,iBAAiB,GACnC,SAAS,CA4NX"}
@@ -10,9 +10,26 @@ import { resolveChatContext } from '../shared/agent/tool.helpers.js';
10
10
  import { QuestionSchema } from '../shared/schemas/question.schema.js';
11
11
  import { dispatchElicitations } from './elicitation.dispatcher.js';
12
12
  import { createToolRegistry } from '../shared/agent/tool.registry.js';
13
- import { invokeToolRuntime, toolRuntimeErrorToResult } from '../shared/agent/tool.runtime.js';
13
+ import { ToolRuntimeError, invokeToolRuntime, toolRuntimeErrorToResult } from '../shared/agent/tool.runtime.js';
14
14
  import { protocolLogger } from '../shared/observability/protocol.logger.js';
15
15
  const logger = protocolLogger('McpServer');
16
+ function isExpectedMcpAuthError(message) {
17
+ return message.includes('Authentication required') ||
18
+ message.includes('Invalid API key') ||
19
+ message.includes('Invalid or expired access token') ||
20
+ message.includes('JWT payload missing user ID');
21
+ }
22
+ /**
23
+ * Runtime/auth failures are converted into structured MCP `isError` tool
24
+ * results for the caller. Reporting them as application exceptions produces
25
+ * Sentry noise for expected client failures and policy-enforced timeouts.
26
+ */
27
+ export function shouldReportMcpToolError(err) {
28
+ if (err instanceof ToolRuntimeError)
29
+ return false;
30
+ const message = err instanceof Error ? err.message : String(err);
31
+ return !isExpectedMcpAuthError(message);
32
+ }
16
33
  // ═══════════════════════════════════════════════════════════════════════════════
17
34
  // ZOD 3 → JSON SCHEMA CONVERSION
18
35
  // ═══════════════════════════════════════════════════════════════════════════════
@@ -227,6 +244,8 @@ export const ONBOARDING_ALLOWED = new Set([
227
244
  'scrape_url',
228
245
  'record_onboarding_privacy_consent',
229
246
  'preview_user_profile',
247
+ 'get_profile_run',
248
+ 'cancel_profile_run',
230
249
  'confirm_user_profile',
231
250
  'create_user_profile',
232
251
  'complete_onboarding',
@@ -257,7 +276,7 @@ export function buildMcpOnboardingMessage(ctx) {
257
276
  `${nameStep}\n` +
258
277
  `2. Ask whether the user allows use of event/EdgeOS profile data, then call record_onboarding_privacy_consent(edgeosImportGranted=...).\n` +
259
278
  `3. Ask separately whether the user allows public internet/profile lookup, then call record_onboarding_privacy_consent(publicProfileLookupGranted=...).\n` +
260
- `4. Call preview_user_profile(...) using only allowed inputs; do not run public lookup unless consent was granted.\n` +
279
+ `4. Call preview_user_profile(...) using only allowed inputs; do not run public lookup unless consent was granted. If it returns profileRunId, poll get_profile_run(profileRunId=...) until status is succeeded, then use its result as the draft.\n` +
261
280
  `5. Present the profile draft and ask "Does that look right?" On approval/correction, call confirm_user_profile(...).\n` +
262
281
  `${communityStep}\n` +
263
282
  `6. Ask what the user is looking for and call create_intent(description="...").\n` +
@@ -520,21 +539,23 @@ export function createMcpServer(deps, authResolver, scopedDepsFactory) {
520
539
  catch (err) {
521
540
  const message = err instanceof Error ? err.message : String(err);
522
541
  logger.error(`MCP tool "${toolName}" failed`, { error: message });
523
- reportDeps.reportToolError?.(err, {
524
- subsystem: 'mcp',
525
- operation: 'mcp.tool',
526
- toolName,
527
- userId: reportUserId,
528
- tags: {
529
- transport: 'mcp',
542
+ if (shouldReportMcpToolError(err)) {
543
+ reportDeps.reportToolError?.(err, {
544
+ subsystem: 'mcp',
545
+ operation: 'mcp.tool',
530
546
  toolName,
531
- },
532
- context: {
533
- agentId: reportContext?.agentId,
534
- networkId: reportContext?.networkId,
535
- indexScope: reportContext?.indexScope,
536
- },
537
- });
547
+ userId: reportUserId,
548
+ tags: {
549
+ transport: 'mcp',
550
+ toolName,
551
+ },
552
+ context: {
553
+ agentId: reportContext?.agentId,
554
+ networkId: reportContext?.networkId,
555
+ indexScope: reportContext?.indexScope,
556
+ },
557
+ });
558
+ }
538
559
  const runtimeResult = toolRuntimeErrorToResult(err);
539
560
  return {
540
561
  content: [{ type: 'text', text: runtimeResult ?? JSON.stringify({ error: message }) }],
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.server.js","sourceRoot":"/","sources":["mcp/mcp.server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP Server Factory — creates an McpServer instance with all protocol tools\n * registered from the existing tool registry. Each tool invocation resolves\n * auth from the HTTP request, builds a ResolvedToolContext, and delegates\n * to the raw tool handler.\n */\n\nimport { z } from 'zod';\nimport { McpServer, fromJsonSchema } from '@modelcontextprotocol/server';\nimport type { ServerContext, JsonSchemaType } from '@modelcontextprotocol/server';\n\nimport type { McpAuthResolver } from '../shared/interfaces/auth.interface.js';\nimport type { ToolDeps, ResolvedToolContext } from '../shared/agent/tool.helpers.js';\nimport { resolveChatContext } from '../shared/agent/tool.helpers.js';\nimport type { Question } from '../shared/schemas/question.schema.js';\nimport { QuestionSchema } from '../shared/schemas/question.schema.js';\nimport { dispatchElicitations } from './elicitation.dispatcher.js';\nimport { createToolRegistry } from '../shared/agent/tool.registry.js';\nimport { invokeToolRuntime, toolRuntimeErrorToResult } from '../shared/agent/tool.runtime.js';\nimport type { TraceEmitter } from '../shared/observability/request-context.js';\nimport { protocolLogger } from '../shared/observability/protocol.logger.js';\n\nconst logger = protocolLogger('McpServer');\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// ZOD 3 → JSON SCHEMA CONVERSION\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Minimal Zod-to-JSON-Schema conversion for MCP tool registration.\n * Converts Zod 3.x schemas to plain JSON Schema objects that can be\n * wrapped with `fromJsonSchema()` for MCP SDK compatibility.\n */\nfunction zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n if (schema instanceof z.ZodObject) {\n const shape = schema.shape;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n const zodValue = value as z.ZodType;\n properties[key] = zodToJsonSchema(zodValue);\n if (!(zodValue instanceof z.ZodOptional) && !(zodValue instanceof z.ZodDefault)) {\n required.push(key);\n }\n }\n return { type: 'object', properties, ...(required.length ? { required } : {}) };\n }\n if (schema instanceof z.ZodString) {\n const result: Record<string, unknown> = { type: 'string' };\n // Detect .url(), .email(), .uuid() etc. via Zod's internal checks array\n const checks = (schema as z.ZodString & { _def: { checks: Array<{ kind: string }> } })._def?.checks;\n if (checks) {\n for (const check of checks) {\n if (check.kind === 'url') result.format = 'uri';\n else if (check.kind === 'email') result.format = 'email';\n else if (check.kind === 'uuid') result.format = 'uuid';\n else if (check.kind === 'datetime') result.format = 'date-time';\n }\n }\n return result;\n }\n if (schema instanceof z.ZodNumber) {\n const checks = (schema as z.ZodNumber & { _def: { checks: Array<{ kind: string; value?: number }> } })._def?.checks;\n const result: Record<string, unknown> = { type: 'number' };\n if (checks) {\n for (const check of checks) {\n if (check.kind === 'int') result.type = 'integer';\n else if (check.kind === 'min') result.minimum = check.value;\n else if (check.kind === 'max') result.maximum = check.value;\n }\n }\n return result;\n }\n if (schema instanceof z.ZodBoolean) return { type: 'boolean' };\n if (schema instanceof z.ZodArray) {\n return { type: 'array', items: zodToJsonSchema((schema as z.ZodArray<z.ZodType>).element) };\n }\n if (schema instanceof z.ZodOptional) {\n return zodToJsonSchema((schema as z.ZodOptional<z.ZodType>).unwrap());\n }\n if (schema instanceof z.ZodDefault) {\n return zodToJsonSchema((schema as z.ZodDefault<z.ZodType>).removeDefault());\n }\n if (schema instanceof z.ZodEnum) {\n return { type: 'string', enum: (schema as z.ZodEnum<[string, ...string[]]>).options };\n }\n if (schema instanceof z.ZodNullable) {\n const inner = zodToJsonSchema((schema as z.ZodNullable<z.ZodType>).unwrap());\n return { ...inner, nullable: true };\n }\n if (schema instanceof z.ZodRecord) {\n return { type: 'object', additionalProperties: true };\n }\n return { type: 'object' };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// RESULT POST-PROCESSING\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Strips internal `_`-prefixed keys from `data` and promotes `isError`\n * from the inner `success: false` signal to the MCP envelope level.\n * Fail-open: if JSON parsing throws, returns the original text with isError: false.\n */\nexport function sanitizeMcpResult(text: string): { text: string; isError: boolean } {\n try {\n const parsed = JSON.parse(text);\n if (\n parsed &&\n typeof parsed === 'object' &&\n parsed.data &&\n typeof parsed.data === 'object' &&\n !Array.isArray(parsed.data)\n ) {\n for (const key of Object.keys(parsed.data)) {\n if (key.startsWith('_') || key === 'debugSteps') {\n delete parsed.data[key];\n }\n }\n }\n const isError = parsed?.success === false;\n return { text: JSON.stringify(parsed), isError };\n } catch {\n return { text, isError: false };\n }\n}\n\n/** Spec cap on the number of decision questions surfaced per turn. */\nconst MAX_DECISION_QUESTIONS = 3;\n\n/**\n * Extracts decision questions from a parsed tool-result text, if present.\n * Validates each entry against `QuestionSchema` and drops malformed items;\n * caps the array at `MAX_DECISION_QUESTIONS` (defense-in-depth — Slice 2's\n * generator already caps at 3, but we don't trust the cast here).\n *\n * Returns null when the text isn't JSON, has no `data.questions`, or\n * contains zero valid questions after validation.\n */\nexport function extractDecisionQuestions(text: string): Question[] | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return null;\n }\n\n const rawQs = (parsed as { data?: { questions?: unknown } } | null)?.data?.questions;\n if (!Array.isArray(rawQs) || rawQs.length === 0) return null;\n\n const valid: Question[] = [];\n for (const raw of rawQs) {\n const result = QuestionSchema.safeParse(raw);\n if (result.success) valid.push(result.data);\n if (valid.length === MAX_DECISION_QUESTIONS) break;\n }\n return valid.length > 0 ? valid : null;\n}\n\n/**\n * Renders the JSON-envelope text block appended to the tool result content\n * when decision questions are present. The leading sentinel string lets the\n * LLM client recognize and surface the questions in prose for clients\n * without elicitation support.\n */\nexport function renderQuestionsEnvelope(questions: Question[]): string {\n return `Decision questions (structured): ${JSON.stringify({ questions })}`;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// MCP SERVER FACTORY\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Factory for creating per-request scoped database instances.\n * Injected from the controller/handler layer to keep the protocol layer\n * free of direct adapter imports.\n */\nexport interface ScopedDepsFactory {\n /** Creates scoped userDb and systemDb for the given user and index scope. */\n create(userId: string, indexScope: string[]): Pick<ToolDeps, 'userDb' | 'systemDb'>;\n}\n\n/**\n * Computes the index scope passed to the per-request scoped DB factory. When\n * `networkScopeId` is non-null, the agent is bound to a single network and\n * may only reach that network plus the user's personal index. Otherwise the\n * full set of the user's network memberships is returned.\n */\nexport const computeAgentIndexScope = (\n userNetworks: { networkId: string; isPersonal?: boolean | null }[],\n networkScopeId: string | null | undefined,\n): string[] => {\n if (!networkScopeId) {\n return userNetworks.map((m) => m.networkId);\n }\n return userNetworks\n .filter((m) => m.networkId === networkScopeId || m.isPersonal === true)\n .map((m) => m.networkId);\n};\n\n/**\n * Promotes a network-scoped agent's bound network into the resolved tool\n * context as the implicit chat scope. Every tool that branches on\n * `context.networkId` (read_networks, read_intents, read_user_profiles,\n * opportunity tools, etc.) then enforces scope automatically — without this\n * step the DB-level `indexScope` clamp guards cross-user data but tools that\n * shape their response off `context.networkId` (notably `read_networks`'\n * `publicNetworks` branch) would still leak the global view.\n *\n * No-op when there is no scope, or when an explicit chat scope is already\n * set (a user-driven index-scoped chat must keep precedence over the agent\n * binding — which would be a strict subset anyway, since the API key cannot\n * reach beyond its bound network).\n */\nexport const applyNetworkScopeToContext = (\n context: ResolvedToolContext,\n networkScopeId: string | null | undefined,\n): void => {\n if (!networkScopeId) return;\n if (context.networkId) return;\n\n context.networkId = networkScopeId;\n // Clamp indexScope to [boundNetwork, personalIndex] BEFORE the membership\n // check below. If the bound network is not in userNetworks (defensive case),\n // the filter still produces a safe scope (personal index only) rather than\n // leaving the unclamped scope set by resolveChatContext.\n context.indexScope = context.userNetworks\n .filter((m) => m.networkId === networkScopeId || m.isPersonal === true)\n .map((m) => m.networkId);\n\n const bound = context.userNetworks.find((m) => m.networkId === networkScopeId);\n if (!bound) return;\n\n context.indexName = bound.networkTitle;\n context.scopedIndex = {\n id: bound.networkId,\n title: bound.networkTitle,\n prompt: bound.indexPrompt ?? null,\n };\n const isOwner = bound.permissions?.includes('owner') ?? false;\n context.scopedMembershipRole = isOwner ? 'owner' : 'member';\n context.isOwner = isOwner;\n};\n\n/**\n * Tools allowed during onboarding — everything else is gated until\n * complete_onboarding is called. Includes the agent-gate-exempt tools\n * (register_agent, read_docs, scrape_url) because they are informational /\n * registration primitives needed at every lifecycle stage.\n */\nexport const ONBOARDING_ALLOWED: ReadonlySet<string> = new Set([\n 'register_agent',\n 'read_docs',\n 'scrape_url',\n 'record_onboarding_privacy_consent',\n 'preview_user_profile',\n 'confirm_user_profile',\n 'create_user_profile',\n 'complete_onboarding',\n 'import_gmail_contacts',\n 'read_networks',\n 'create_network_membership',\n 'create_intent',\n 'discover_opportunities',\n 'read_user_profiles',\n]);\n\n/**\n * Builds the onboarding gate message for MCP callers. Condensed from the\n * chat orchestrator's 8-step flow (chat.prompt.ts buildOnboarding) into a\n * 7-step tool-error guide suited for non-interactive MCP clients.\n */\nexport function buildMcpOnboardingMessage(ctx: ResolvedToolContext): string {\n const nameStep = ctx.hasName\n ? `1. Greet the user and confirm their name (\"You're ${ctx.userName}, right?\").`\n : `1. Ask the user for their name and a short self-description.`;\n\n const communityStep = ctx.networkId\n ? `5. (Skipped — user is already in \"${ctx.indexName ?? 'their community'}\".)`\n : `5. Call read_networks() and let the user pick communities to join via create_network_membership(networkId=...).`;\n\n const allowedList = Array.from(ONBOARDING_ALLOWED).join(', ');\n\n return (\n `This user has not completed onboarding. You must guide them through setup before they can use other tools. ` +\n `Only the following tools are available until onboarding is complete: ` +\n `${allowedList}.\\n\\n` +\n `Onboarding flow:\\n` +\n `${nameStep}\\n` +\n `2. Ask whether the user allows use of event/EdgeOS profile data, then call record_onboarding_privacy_consent(edgeosImportGranted=...).\\n` +\n `3. Ask separately whether the user allows public internet/profile lookup, then call record_onboarding_privacy_consent(publicProfileLookupGranted=...).\\n` +\n `4. Call preview_user_profile(...) using only allowed inputs; do not run public lookup unless consent was granted.\\n` +\n `5. Present the profile draft and ask \"Does that look right?\" On approval/correction, call confirm_user_profile(...).\\n` +\n `${communityStep}\\n` +\n `6. Ask what the user is looking for and call create_intent(description=\"...\").\\n` +\n `7. Call complete_onboarding() to finish setup. Gmail/contact import and discovery are optional after onboarding, never mandatory.`\n );\n}\n\n/**\n * Creates an MCP server with all protocol tools registered.\n * Tools resolve auth per-request via the HTTP request available in ServerContext.\n *\n * @param deps - Shared tool dependencies (graphs, database, embedder, etc.)\n * @param authResolver - Resolves authenticated identity from the HTTP request\n * @param scopedDepsFactory - Factory for creating per-request scoped databases\n * @returns A configured McpServer ready to be connected to a transport\n */\nfunction createMcpTraceEmitter(toolName: string, ctx: ServerContext): TraceEmitter | undefined {\n const token = ctx.mcpReq._meta?.progressToken;\n if (typeof token !== 'string' && typeof token !== 'number') return undefined;\n\n let progress = 0;\n return (event) => {\n progress += 1;\n const message = (() => {\n if (event.type === 'graph_start') return `${toolName}: ${event.name} started`;\n if (event.type === 'graph_end') return `${toolName}: ${event.name} finished${event.durationMs != null ? ` in ${event.durationMs}ms` : ''}`;\n if (event.type === 'agent_start') return `${toolName}: ${event.name} agent started`;\n if (event.type === 'agent_end') return `${toolName}: ${event.name} agent finished${event.durationMs != null ? ` in ${event.durationMs}ms` : ''}`;\n if (event.type === 'opportunity_draft_ready') return `${toolName}: opportunity draft ready`;\n return `${toolName}: progress`;\n })();\n\n const notification: Parameters<ServerContext['mcpReq']['notify']>[0] = {\n method: 'notifications/progress',\n params: { progressToken: token, progress, message },\n };\n void ctx.mcpReq.notify(notification).catch((err) => {\n logger.debug('Failed to send MCP progress notification', {\n toolName,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n };\n}\n\nexport const MCP_INSTRUCTIONS = `\nIndex Network is a private, intent-driven discovery protocol. You help users find the right people and help the right people find them, via Index Network MCP tools.\n\n# Voice\nCalm, direct, analytical, concise. Preferred vocabulary: opportunity, overlap, signal, pattern, emerging, relevant, adjacency.\n\n# Banned vocabulary\nNEVER use \"search\" in any form. Use \"looking up\" for indexed data, \"find\" / \"look for\" for discovery, \"check\" for verification, \"discover\" for exploration. Banned: leverage, unlock, optimize, scale, disrupt, revolutionary, AI-powered, maximize value, act fast, networking, match.\n\n# Entity model\n- User — has one Profile, many Memberships, many Intents.\n- Profile — identity (bio, skills, interests, location).\n- Index — community with title, prompt (purpose), join policy. Has Members.\n- Membership — User↔Index junction. \\`isPersonal: true\\` marks the user's personal index (contacts).\n- Intent — what a user is looking for (signal). Description, summary, embedding.\n- IntentIndex — Intent↔Index junction (auto-assigned).\n- Opportunity — discovered connection between users. Roles, status, reasoning.\n\n# Output rules\n- NEVER expose internal IDs, UUIDs, field names, or tool names — EXCEPT when an ID is actionable for the user (e.g. a \\`conversationId\\` they need to open a chat). Surface such IDs verbatim when the tool returns them.\n- NEVER use internal vocabulary — say \"signal\" not \"intent\", \"community\" not \"index\".\n- NEVER dump raw JSON. Synthesize in natural language.\n- Surface top 1–3 relevant points unless asked for the full list.\n- Prefer first names; use full names only to disambiguate.\n- Translate statuses: draft/latent → \"draft\", pending → \"sent\", accepted → \"connected\".\n- NEVER fabricate data. If you don't have it, call the appropriate tool.\n\n# Tool guidance\nEach tool's description contains its own usage rules (when to call, when NOT to call, required prerequisites, post-call follow-ups). Read the description of every tool you call — that is where the per-tool workflow patterns live.\n\n# Authentication\nPass your API key in the \\`x-api-key\\` request header (not \\`Authorization: Bearer\\`).\n\n# Opportunity lifecycle\nOpportunities move through: draft → pending → accepted (or rejected).\n\n- **draft** (you created it, not yet sent): offer to send it; confirm before calling update_opportunity with pending.\n- **pending, you sent it**: waiting for the other side — nothing to do.\n- **pending, you received it**: the other person is waiting for your response. Surface it to the user and ask if they want to start a chat. Only call update_opportunity with accepted after explicit user confirmation.\n- **accepted**: both sides are connected — a direct conversation exists. Surface the conversationId to the user if available.\n\nNever accept a received opportunity without explicit user approval in the current conversation.\n\n# Decision questions after discovery\n\nAfter \\`discover_opportunities\\`, the tool result may include a second text block starting with \\`Decision questions (structured): ...\\`. This means the discovery engine ran negotiations but needs human input to sharpen the next turn — e.g. clarify timing, role, stage, or location.\n\n**When this block is present:**\n1. Parse the \\`questions\\` array from the JSON after the sentinel.\n2. Each question has \\`title\\` (decision domain, ≤12 chars), \\`prompt\\` (ends in \\`?\\`), \\`options\\` (2–4 items, each with \\`label\\` and \\`description\\`), and \\`multiSelect\\`. The safest option is labeled \\`... (Recommended)\\`.\n3. Present each question in natural language: ask the \\`prompt\\`, list options as \\`**{label}** — {description}\\`. Never expose the JSON or technical field names.\n4. Wait for the user's answer, then fold it into the next \\`discover_opportunities(searchQuery=...)\\` call.\n\n**Elicitation-capable clients** (those that declared \\`elicitation\\` support in \\`initialize\\`): the server dispatches \\`elicitation/create\\` requests directly — answers are written back to the chat session automatically. You will not see the envelope as a follow-up task in that case.\n`.trim();\n\nexport function createMcpServer(\n deps: ToolDeps,\n authResolver: McpAuthResolver,\n scopedDepsFactory: ScopedDepsFactory,\n): McpServer {\n // Tools exempt from the agent-registration gate — available before registration is complete.\n const AGENT_GATE_EXEMPT = new Set(['register_agent', 'read_docs', 'scrape_url']);\n\n const server = new McpServer(\n { name: 'index-network', version: '1.0.0' },\n { instructions: MCP_INSTRUCTIONS },\n );\n\n const registry = createToolRegistry(deps);\n\n for (const [toolName, toolDef] of registry) {\n // Convert Zod 3 schema to JSON Schema, then wrap with fromJsonSchema\n // for MCP SDK's StandardSchemaWithJSON compatibility\n const jsonSchema = zodToJsonSchema(toolDef.schema) as JsonSchemaType;\n const mcpSchema = fromJsonSchema(jsonSchema);\n\n server.registerTool(\n toolName,\n {\n description: toolDef.description,\n inputSchema: mcpSchema,\n },\n async (args: unknown, ctx: ServerContext) => {\n let reportDeps = deps;\n let reportUserId: string | undefined;\n let reportContext: ResolvedToolContext | undefined;\n\n try {\n // Extract the original HTTP request from the MCP server context\n const httpReq = ctx.http?.req;\n if (!httpReq) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: 'No HTTP request available in MCP context' }) }],\n isError: true,\n };\n }\n\n // Resolve authenticated identity (userId + optional agentId + optional network scope + optional surface)\n const { userId, agentId, isSessionAuth, networkScopeId, clientSurface } = await authResolver.resolveIdentity(httpReq);\n reportUserId = userId;\n\n // Resolve chat context for the user (mark as MCP — no interactive UI available)\n const context = await resolveChatContext({ database: deps.database, userId });\n reportContext = context;\n context.isMcp = true;\n if (agentId) {\n context.agentId = agentId;\n }\n if (clientSurface) {\n context.clientSurface = clientSurface;\n }\n\n // Network-scoped agents inherit their bound network as the implicit chat\n // scope. Every tool that branches on `context.networkId` then enforces\n // the same boundary the DB-level `indexScope` clamp enforces below —\n // most importantly `read_networks`, which would otherwise return the\n // global `publicNetworks` catalog for unscoped contexts.\n applyNetworkScopeToContext(context, networkScopeId);\n\n // Gate: API-key callers (background agents) must register before using most tools.\n // OAuth/JWT session callers (human MCP clients such as Claude Code) are exempt —\n // their identity is already established via the auth flow and they have no agent entity.\n if (!isSessionAuth && !context.agentId && !AGENT_GATE_EXEMPT.has(toolName)) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: 'Agent not registered',\n message:\n 'You must register as an agent before using Index tools. ' +\n 'Call register_agent with your agent name to establish an identity. ' +\n 'The tools register_agent, read_docs, and scrape_url are available without registration.',\n }),\n }],\n isError: true,\n };\n }\n\n // Gate: non-onboarded users can only use onboarding-related tools.\n // Mirrors the chat orchestrator's ONBOARDING MODE — the MCP client must\n // walk the user through profile creation, Gmail connect, intent capture,\n // and complete_onboarding() before full tool access is granted.\n if (context.isOnboarding && !ONBOARDING_ALLOWED.has(toolName)) {\n const onboardingSteps = buildMcpOnboardingMessage(context);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: 'Onboarding required',\n message: onboardingSteps,\n }),\n }],\n isError: true,\n };\n }\n\n // Build per-request scoped databases via injected factory.\n // Network-scoped agents are clamped to their bound network plus the user's\n // personal index — they cannot reach other networks even when the user is\n // a member of them. The personal-index reachability is preserved so the\n // agent can still manage its owner's profile and contacts.\n // context.indexScope is now the single source of truth: set by\n // resolveChatContext (full set) and narrowed by applyNetworkScopeToContext.\n const scopedDbs = scopedDepsFactory.create(userId, context.indexScope);\n\n // Override deps with per-request scoped databases\n const requestDeps: ToolDeps = { ...deps, ...scopedDbs };\n reportDeps = requestDeps;\n\n // Re-create registry with per-request deps for scoped database access\n const requestRegistry = createToolRegistry(requestDeps);\n const requestTool = requestRegistry.get(toolName);\n\n if (!requestTool) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: `Tool \"${toolName}\" not found` }) }],\n isError: true,\n };\n }\n\n // Validate input against the original Zod schema\n const parseResult = (toolDef.schema as z.ZodType).safeParse(args);\n if (!parseResult.success) {\n const issues = parseResult.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ success: false, error: `Invalid input: ${issues}` }) }],\n isError: true,\n };\n }\n const validatedArgs = parseResult.data;\n\n // Execute the tool handler through the shared runtime so MCP calls have\n // consistent timeout, cancellation, progress, and requestContext plumbing.\n const result = await invokeToolRuntime({\n toolName,\n tool: requestTool,\n context,\n query: validatedArgs,\n signal: ctx.mcpReq.signal,\n traceEmitter: createMcpTraceEmitter(toolName, ctx),\n });\n\n const { text: sanitizedText, isError: toolIsError } = sanitizeMcpResult(result);\n\n // Slice 5: decision questions post-processing for discover_opportunities only.\n if (toolName === \"discover_opportunities\" && !toolIsError) {\n const questions = extractDecisionQuestions(sanitizedText);\n if (questions) {\n const envelopeBlock = {\n type: \"text\" as const,\n text: renderQuestionsEnvelope(questions),\n };\n\n const supportsElicitation =\n !!server.server.getClientCapabilities()?.elicitation;\n\n // Capture into a local const so TS preserves the narrowing\n // inside the callback below. Optional chains don't survive\n // across closure boundaries under strict mode.\n const elicitInput = ctx.mcpReq?.elicitInput;\n\n if (supportsElicitation && elicitInput) {\n // Sequential — never parallel (day-one rule). We await the loop\n // before returning the tool result so test harnesses can observe\n // the dispatched calls deterministically.\n await dispatchElicitations({\n userId,\n questions,\n elicitInput: (params) => elicitInput(params),\n chatMessageWriter: deps.chatMessageWriter,\n });\n }\n\n return {\n content: [\n { type: \"text\" as const, text: sanitizedText },\n envelopeBlock,\n ],\n ...(toolIsError ? { isError: true } : {}),\n };\n }\n }\n\n return {\n content: [{ type: 'text' as const, text: sanitizedText }],\n ...(toolIsError ? { isError: true } : {}),\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.error(`MCP tool \"${toolName}\" failed`, { error: message });\n reportDeps.reportToolError?.(err, {\n subsystem: 'mcp',\n operation: 'mcp.tool',\n toolName,\n userId: reportUserId,\n tags: {\n transport: 'mcp',\n toolName,\n },\n context: {\n agentId: reportContext?.agentId,\n networkId: reportContext?.networkId,\n indexScope: reportContext?.indexScope,\n },\n });\n const runtimeResult = toolRuntimeErrorToResult(err);\n return {\n content: [{ type: 'text' as const, text: runtimeResult ?? JSON.stringify({ error: message }) }],\n isError: true,\n };\n }\n },\n );\n }\n\n logger.verbose(`MCP server created with ${registry.size} tools`);\n return server;\n}\n"]}
1
+ {"version":3,"file":"mcp.server.js","sourceRoot":"/","sources":["mcp/mcp.server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAKzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhH,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAE5E,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;AAE3C,SAAS,sBAAsB,CAAC,OAAe;IAC7C,OAAO,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACnC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACnD,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,IAAI,GAAG,YAAY,gBAAgB;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,kFAAkF;AAClF,iCAAiC;AACjC,kFAAkF;AAElF;;;;GAIG;AACH,SAAS,eAAe,CAAC,MAAiB;IACxC,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,KAAkB,CAAC;YACpC,UAAU,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChF,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,MAAM,GAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3D,wEAAwE;QACxE,MAAM,MAAM,GAAI,MAAsE,CAAC,IAAI,EAAE,MAAM,CAAC;QACpG,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;oBAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;qBAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;oBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;qBACpD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;oBAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;qBAClD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;oBAAE,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC;YAClE,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,MAAM,GAAI,MAAsF,CAAC,IAAI,EAAE,MAAM,CAAC;QACpH,MAAM,MAAM,GAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3D,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;oBAAE,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;qBAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;oBAAE,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;qBACvD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;oBAAE,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/D,IAAI,MAAM,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAE,MAAgC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,eAAe,CAAE,MAAmC,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC;QACnC,OAAO,eAAe,CAAE,MAAkC,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAG,MAA2C,CAAC,OAAO,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,eAAe,CAAE,MAAmC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,kFAAkF;AAClF,yBAAyB;AACzB,kFAAkF;AAElF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IACE,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,CAAC,IAAI;YACX,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAC3B,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;oBAChD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAI,MAAoD,EAAE,IAAI,EAAE,SAAS,CAAC;IACrF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7D,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,sBAAsB;YAAE,MAAM;IACrD,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAqB;IAC3D,OAAO,oCAAoC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAC7E,CAAC;AAgBD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,YAAkE,EAClE,cAAyC,EAC/B,EAAE;IACZ,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,YAAY;SAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,cAAc,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC;SACtE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAA4B,EAC5B,cAAyC,EACnC,EAAE;IACR,IAAI,CAAC,cAAc;QAAE,OAAO;IAC5B,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO;IAE9B,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC;IACnC,0EAA0E;IAC1E,6EAA6E;IAC7E,2EAA2E;IAC3E,yDAAyD;IACzD,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,YAAY;SACtC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,cAAc,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC;SACtE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC;IAC/E,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC;IACvC,OAAO,CAAC,WAAW,GAAG;QACpB,EAAE,EAAE,KAAK,CAAC,SAAS;QACnB,KAAK,EAAE,KAAK,CAAC,YAAY;QACzB,MAAM,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;KAClC,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;IAC9D,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC5D,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;AAC5B,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IAC7D,gBAAgB;IAChB,WAAW;IACX,YAAY;IACZ,mCAAmC;IACnC,sBAAsB;IACtB,iBAAiB;IACjB,oBAAoB;IACpB,sBAAsB;IACtB,qBAAqB;IACrB,qBAAqB;IACrB,uBAAuB;IACvB,eAAe;IACf,2BAA2B;IAC3B,eAAe;IACf,wBAAwB;IACxB,oBAAoB;CACrB,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAwB;IAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO;QAC1B,CAAC,CAAC,qDAAqD,GAAG,CAAC,QAAQ,aAAa;QAChF,CAAC,CAAC,8DAA8D,CAAC;IAEnE,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS;QACjC,CAAC,CAAC,qCAAqC,GAAG,CAAC,SAAS,IAAI,iBAAiB,KAAK;QAC9E,CAAC,CAAC,iHAAiH,CAAC;IAEtH,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9D,OAAO,CACL,6GAA6G;QAC7G,uEAAuE;QACvE,GAAG,WAAW,OAAO;QACrB,oBAAoB;QACpB,GAAG,QAAQ,IAAI;QACf,0IAA0I;QAC1I,0JAA0J;QAC1J,qPAAqP;QACrP,wHAAwH;QACxH,GAAG,aAAa,IAAI;QACpB,kFAAkF;QAClF,mIAAmI,CACpI,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAAC,QAAgB,EAAE,GAAkB;IACjE,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE7E,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,QAAQ,IAAI,CAAC,CAAC;QACd,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;gBAAE,OAAO,GAAG,QAAQ,KAAK,KAAK,CAAC,IAAI,UAAU,CAAC;YAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,GAAG,QAAQ,KAAK,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC3I,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;gBAAE,OAAO,GAAG,QAAQ,KAAK,KAAK,CAAC,IAAI,gBAAgB,CAAC;YACpF,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,GAAG,QAAQ,KAAK,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACjJ,IAAI,KAAK,CAAC,IAAI,KAAK,yBAAyB;gBAAE,OAAO,GAAG,QAAQ,2BAA2B,CAAC;YAC5F,OAAO,GAAG,QAAQ,YAAY,CAAC;QACjC,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,YAAY,GAAqD;YACrE,MAAM,EAAE,wBAAwB;YAChC,MAAM,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;SACpD,CAAC;QACF,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjD,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE;gBACvD,QAAQ;gBACR,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsD/B,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,UAAU,eAAe,CAC7B,IAAc,EACd,YAA6B,EAC7B,iBAAoC;IAEpC,6FAA6F;IAC7F,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAEjF,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,EAC3C,EAAE,YAAY,EAAE,gBAAgB,EAAE,CACnC,CAAC;IAEF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE1C,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC3C,qEAAqE;QACrE,qDAAqD;QACrD,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAmB,CAAC;QACrE,MAAM,SAAS,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAE7C,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;YACE,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,WAAW,EAAE,SAAS;SACvB,EACD,KAAK,EAAE,IAAa,EAAE,GAAkB,EAAE,EAAE;YAC1C,IAAI,UAAU,GAAG,IAAI,CAAC;YACtB,IAAI,YAAgC,CAAC;YACrC,IAAI,aAA8C,CAAC;YAEnD,IAAI,CAAC;gBACH,gEAAgE;gBAChE,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;gBAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC,EAAE,CAAC;wBACjH,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,yGAAyG;gBACzG,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBACtH,YAAY,GAAG,MAAM,CAAC;gBAEtB,gFAAgF;gBAChF,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9E,aAAa,GAAG,OAAO,CAAC;gBACxB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC5B,CAAC;gBACD,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;gBACxC,CAAC;gBAED,yEAAyE;gBACzE,uEAAuE;gBACvE,qEAAqE;gBACrE,qEAAqE;gBACrE,yDAAyD;gBACzD,0BAA0B,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;gBAEpD,mFAAmF;gBACnF,iFAAiF;gBACjF,yFAAyF;gBACzF,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3E,OAAO;wBACL,OAAO,EAAE,CAAC;gCACR,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACnB,KAAK,EAAE,sBAAsB;oCAC7B,OAAO,EACL,0DAA0D;wCAC1D,qEAAqE;wCACrE,yFAAyF;iCAC5F,CAAC;6BACH,CAAC;wBACF,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,mEAAmE;gBACnE,wEAAwE;gBACxE,yEAAyE;gBACzE,gEAAgE;gBAChE,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9D,MAAM,eAAe,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;oBAC3D,OAAO;wBACL,OAAO,EAAE,CAAC;gCACR,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACnB,KAAK,EAAE,qBAAqB;oCAC5B,OAAO,EAAE,eAAe;iCACzB,CAAC;6BACH,CAAC;wBACF,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,2DAA2D;gBAC3D,2EAA2E;gBAC3E,0EAA0E;gBAC1E,wEAAwE;gBACxE,2DAA2D;gBAC3D,+DAA+D;gBAC/D,4EAA4E;gBAC5E,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;gBAEvE,kDAAkD;gBAClD,MAAM,WAAW,GAAa,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;gBACxD,UAAU,GAAG,WAAW,CAAC;gBAEzB,sEAAsE;gBACtE,MAAM,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;gBACxD,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAElD,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,QAAQ,aAAa,EAAE,CAAC,EAAE,CAAC;wBACrG,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,iDAAiD;gBACjD,MAAM,WAAW,GAAI,OAAO,CAAC,MAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAClE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnG,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;wBACjH,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBACD,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC;gBAEvC,wEAAwE;gBACxE,2EAA2E;gBAC3E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;oBACrC,QAAQ;oBACR,IAAI,EAAE,WAAW;oBACjB,OAAO;oBACP,KAAK,EAAE,aAAa;oBACpB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;oBACzB,YAAY,EAAE,qBAAqB,CAAC,QAAQ,EAAE,GAAG,CAAC;iBACnD,CAAC,CAAC;gBAEH,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAEhF,+EAA+E;gBAC/E,IAAI,QAAQ,KAAK,wBAAwB,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC1D,MAAM,SAAS,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;oBAC1D,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,aAAa,GAAG;4BACpB,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,uBAAuB,CAAC,SAAS,CAAC;yBACzC,CAAC;wBAEF,MAAM,mBAAmB,GACvB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,WAAW,CAAC;wBAEvD,2DAA2D;wBAC3D,2DAA2D;wBAC3D,+CAA+C;wBAC/C,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;wBAE5C,IAAI,mBAAmB,IAAI,WAAW,EAAE,CAAC;4BACvC,gEAAgE;4BAChE,iEAAiE;4BACjE,0CAA0C;4BAC1C,MAAM,oBAAoB,CAAC;gCACzB,MAAM;gCACN,SAAS;gCACT,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC;gCAC5C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;6BAC1C,CAAC,CAAC;wBACL,CAAC;wBAED,OAAO;4BACL,OAAO,EAAE;gCACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,EAAE;gCAC9C,aAAa;6BACd;4BACD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC1C,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;oBACzD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1C,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,CAAC,KAAK,CAAC,aAAa,QAAQ,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAClE,IAAI,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClC,UAAU,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE;wBAChC,SAAS,EAAE,KAAK;wBAChB,SAAS,EAAE,UAAU;wBACrB,QAAQ;wBACR,MAAM,EAAE,YAAY;wBACpB,IAAI,EAAE;4BACJ,SAAS,EAAE,KAAK;4BAChB,QAAQ;yBACT;wBACD,OAAO,EAAE;4BACP,OAAO,EAAE,aAAa,EAAE,OAAO;4BAC/B,SAAS,EAAE,aAAa,EAAE,SAAS;4BACnC,UAAU,EAAE,aAAa,EAAE,UAAU;yBACtC;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,aAAa,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;gBACpD,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;oBAC/F,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,2BAA2B,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["/**\n * MCP Server Factory — creates an McpServer instance with all protocol tools\n * registered from the existing tool registry. Each tool invocation resolves\n * auth from the HTTP request, builds a ResolvedToolContext, and delegates\n * to the raw tool handler.\n */\n\nimport { z } from 'zod';\nimport { McpServer, fromJsonSchema } from '@modelcontextprotocol/server';\nimport type { ServerContext, JsonSchemaType } from '@modelcontextprotocol/server';\n\nimport type { McpAuthResolver } from '../shared/interfaces/auth.interface.js';\nimport type { ToolDeps, ResolvedToolContext } from '../shared/agent/tool.helpers.js';\nimport { resolveChatContext } from '../shared/agent/tool.helpers.js';\nimport type { Question } from '../shared/schemas/question.schema.js';\nimport { QuestionSchema } from '../shared/schemas/question.schema.js';\nimport { dispatchElicitations } from './elicitation.dispatcher.js';\nimport { createToolRegistry } from '../shared/agent/tool.registry.js';\nimport { ToolRuntimeError, invokeToolRuntime, toolRuntimeErrorToResult } from '../shared/agent/tool.runtime.js';\nimport type { TraceEmitter } from '../shared/observability/request-context.js';\nimport { protocolLogger } from '../shared/observability/protocol.logger.js';\n\nconst logger = protocolLogger('McpServer');\n\nfunction isExpectedMcpAuthError(message: string): boolean {\n return message.includes('Authentication required') ||\n message.includes('Invalid API key') ||\n message.includes('Invalid or expired access token') ||\n message.includes('JWT payload missing user ID');\n}\n\n/**\n * Runtime/auth failures are converted into structured MCP `isError` tool\n * results for the caller. Reporting them as application exceptions produces\n * Sentry noise for expected client failures and policy-enforced timeouts.\n */\nexport function shouldReportMcpToolError(err: unknown): boolean {\n if (err instanceof ToolRuntimeError) return false;\n const message = err instanceof Error ? err.message : String(err);\n return !isExpectedMcpAuthError(message);\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// ZOD 3 → JSON SCHEMA CONVERSION\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Minimal Zod-to-JSON-Schema conversion for MCP tool registration.\n * Converts Zod 3.x schemas to plain JSON Schema objects that can be\n * wrapped with `fromJsonSchema()` for MCP SDK compatibility.\n */\nfunction zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n if (schema instanceof z.ZodObject) {\n const shape = schema.shape;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n const zodValue = value as z.ZodType;\n properties[key] = zodToJsonSchema(zodValue);\n if (!(zodValue instanceof z.ZodOptional) && !(zodValue instanceof z.ZodDefault)) {\n required.push(key);\n }\n }\n return { type: 'object', properties, ...(required.length ? { required } : {}) };\n }\n if (schema instanceof z.ZodString) {\n const result: Record<string, unknown> = { type: 'string' };\n // Detect .url(), .email(), .uuid() etc. via Zod's internal checks array\n const checks = (schema as z.ZodString & { _def: { checks: Array<{ kind: string }> } })._def?.checks;\n if (checks) {\n for (const check of checks) {\n if (check.kind === 'url') result.format = 'uri';\n else if (check.kind === 'email') result.format = 'email';\n else if (check.kind === 'uuid') result.format = 'uuid';\n else if (check.kind === 'datetime') result.format = 'date-time';\n }\n }\n return result;\n }\n if (schema instanceof z.ZodNumber) {\n const checks = (schema as z.ZodNumber & { _def: { checks: Array<{ kind: string; value?: number }> } })._def?.checks;\n const result: Record<string, unknown> = { type: 'number' };\n if (checks) {\n for (const check of checks) {\n if (check.kind === 'int') result.type = 'integer';\n else if (check.kind === 'min') result.minimum = check.value;\n else if (check.kind === 'max') result.maximum = check.value;\n }\n }\n return result;\n }\n if (schema instanceof z.ZodBoolean) return { type: 'boolean' };\n if (schema instanceof z.ZodArray) {\n return { type: 'array', items: zodToJsonSchema((schema as z.ZodArray<z.ZodType>).element) };\n }\n if (schema instanceof z.ZodOptional) {\n return zodToJsonSchema((schema as z.ZodOptional<z.ZodType>).unwrap());\n }\n if (schema instanceof z.ZodDefault) {\n return zodToJsonSchema((schema as z.ZodDefault<z.ZodType>).removeDefault());\n }\n if (schema instanceof z.ZodEnum) {\n return { type: 'string', enum: (schema as z.ZodEnum<[string, ...string[]]>).options };\n }\n if (schema instanceof z.ZodNullable) {\n const inner = zodToJsonSchema((schema as z.ZodNullable<z.ZodType>).unwrap());\n return { ...inner, nullable: true };\n }\n if (schema instanceof z.ZodRecord) {\n return { type: 'object', additionalProperties: true };\n }\n return { type: 'object' };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// RESULT POST-PROCESSING\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Strips internal `_`-prefixed keys from `data` and promotes `isError`\n * from the inner `success: false` signal to the MCP envelope level.\n * Fail-open: if JSON parsing throws, returns the original text with isError: false.\n */\nexport function sanitizeMcpResult(text: string): { text: string; isError: boolean } {\n try {\n const parsed = JSON.parse(text);\n if (\n parsed &&\n typeof parsed === 'object' &&\n parsed.data &&\n typeof parsed.data === 'object' &&\n !Array.isArray(parsed.data)\n ) {\n for (const key of Object.keys(parsed.data)) {\n if (key.startsWith('_') || key === 'debugSteps') {\n delete parsed.data[key];\n }\n }\n }\n const isError = parsed?.success === false;\n return { text: JSON.stringify(parsed), isError };\n } catch {\n return { text, isError: false };\n }\n}\n\n/** Spec cap on the number of decision questions surfaced per turn. */\nconst MAX_DECISION_QUESTIONS = 3;\n\n/**\n * Extracts decision questions from a parsed tool-result text, if present.\n * Validates each entry against `QuestionSchema` and drops malformed items;\n * caps the array at `MAX_DECISION_QUESTIONS` (defense-in-depth — Slice 2's\n * generator already caps at 3, but we don't trust the cast here).\n *\n * Returns null when the text isn't JSON, has no `data.questions`, or\n * contains zero valid questions after validation.\n */\nexport function extractDecisionQuestions(text: string): Question[] | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return null;\n }\n\n const rawQs = (parsed as { data?: { questions?: unknown } } | null)?.data?.questions;\n if (!Array.isArray(rawQs) || rawQs.length === 0) return null;\n\n const valid: Question[] = [];\n for (const raw of rawQs) {\n const result = QuestionSchema.safeParse(raw);\n if (result.success) valid.push(result.data);\n if (valid.length === MAX_DECISION_QUESTIONS) break;\n }\n return valid.length > 0 ? valid : null;\n}\n\n/**\n * Renders the JSON-envelope text block appended to the tool result content\n * when decision questions are present. The leading sentinel string lets the\n * LLM client recognize and surface the questions in prose for clients\n * without elicitation support.\n */\nexport function renderQuestionsEnvelope(questions: Question[]): string {\n return `Decision questions (structured): ${JSON.stringify({ questions })}`;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// MCP SERVER FACTORY\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Factory for creating per-request scoped database instances.\n * Injected from the controller/handler layer to keep the protocol layer\n * free of direct adapter imports.\n */\nexport interface ScopedDepsFactory {\n /** Creates scoped userDb and systemDb for the given user and index scope. */\n create(userId: string, indexScope: string[]): Pick<ToolDeps, 'userDb' | 'systemDb'>;\n}\n\n/**\n * Computes the index scope passed to the per-request scoped DB factory. When\n * `networkScopeId` is non-null, the agent is bound to a single network and\n * may only reach that network plus the user's personal index. Otherwise the\n * full set of the user's network memberships is returned.\n */\nexport const computeAgentIndexScope = (\n userNetworks: { networkId: string; isPersonal?: boolean | null }[],\n networkScopeId: string | null | undefined,\n): string[] => {\n if (!networkScopeId) {\n return userNetworks.map((m) => m.networkId);\n }\n return userNetworks\n .filter((m) => m.networkId === networkScopeId || m.isPersonal === true)\n .map((m) => m.networkId);\n};\n\n/**\n * Promotes a network-scoped agent's bound network into the resolved tool\n * context as the implicit chat scope. Every tool that branches on\n * `context.networkId` (read_networks, read_intents, read_user_profiles,\n * opportunity tools, etc.) then enforces scope automatically — without this\n * step the DB-level `indexScope` clamp guards cross-user data but tools that\n * shape their response off `context.networkId` (notably `read_networks`'\n * `publicNetworks` branch) would still leak the global view.\n *\n * No-op when there is no scope, or when an explicit chat scope is already\n * set (a user-driven index-scoped chat must keep precedence over the agent\n * binding — which would be a strict subset anyway, since the API key cannot\n * reach beyond its bound network).\n */\nexport const applyNetworkScopeToContext = (\n context: ResolvedToolContext,\n networkScopeId: string | null | undefined,\n): void => {\n if (!networkScopeId) return;\n if (context.networkId) return;\n\n context.networkId = networkScopeId;\n // Clamp indexScope to [boundNetwork, personalIndex] BEFORE the membership\n // check below. If the bound network is not in userNetworks (defensive case),\n // the filter still produces a safe scope (personal index only) rather than\n // leaving the unclamped scope set by resolveChatContext.\n context.indexScope = context.userNetworks\n .filter((m) => m.networkId === networkScopeId || m.isPersonal === true)\n .map((m) => m.networkId);\n\n const bound = context.userNetworks.find((m) => m.networkId === networkScopeId);\n if (!bound) return;\n\n context.indexName = bound.networkTitle;\n context.scopedIndex = {\n id: bound.networkId,\n title: bound.networkTitle,\n prompt: bound.indexPrompt ?? null,\n };\n const isOwner = bound.permissions?.includes('owner') ?? false;\n context.scopedMembershipRole = isOwner ? 'owner' : 'member';\n context.isOwner = isOwner;\n};\n\n/**\n * Tools allowed during onboarding — everything else is gated until\n * complete_onboarding is called. Includes the agent-gate-exempt tools\n * (register_agent, read_docs, scrape_url) because they are informational /\n * registration primitives needed at every lifecycle stage.\n */\nexport const ONBOARDING_ALLOWED: ReadonlySet<string> = new Set([\n 'register_agent',\n 'read_docs',\n 'scrape_url',\n 'record_onboarding_privacy_consent',\n 'preview_user_profile',\n 'get_profile_run',\n 'cancel_profile_run',\n 'confirm_user_profile',\n 'create_user_profile',\n 'complete_onboarding',\n 'import_gmail_contacts',\n 'read_networks',\n 'create_network_membership',\n 'create_intent',\n 'discover_opportunities',\n 'read_user_profiles',\n]);\n\n/**\n * Builds the onboarding gate message for MCP callers. Condensed from the\n * chat orchestrator's 8-step flow (chat.prompt.ts buildOnboarding) into a\n * 7-step tool-error guide suited for non-interactive MCP clients.\n */\nexport function buildMcpOnboardingMessage(ctx: ResolvedToolContext): string {\n const nameStep = ctx.hasName\n ? `1. Greet the user and confirm their name (\"You're ${ctx.userName}, right?\").`\n : `1. Ask the user for their name and a short self-description.`;\n\n const communityStep = ctx.networkId\n ? `5. (Skipped — user is already in \"${ctx.indexName ?? 'their community'}\".)`\n : `5. Call read_networks() and let the user pick communities to join via create_network_membership(networkId=...).`;\n\n const allowedList = Array.from(ONBOARDING_ALLOWED).join(', ');\n\n return (\n `This user has not completed onboarding. You must guide them through setup before they can use other tools. ` +\n `Only the following tools are available until onboarding is complete: ` +\n `${allowedList}.\\n\\n` +\n `Onboarding flow:\\n` +\n `${nameStep}\\n` +\n `2. Ask whether the user allows use of event/EdgeOS profile data, then call record_onboarding_privacy_consent(edgeosImportGranted=...).\\n` +\n `3. Ask separately whether the user allows public internet/profile lookup, then call record_onboarding_privacy_consent(publicProfileLookupGranted=...).\\n` +\n `4. Call preview_user_profile(...) using only allowed inputs; do not run public lookup unless consent was granted. If it returns profileRunId, poll get_profile_run(profileRunId=...) until status is succeeded, then use its result as the draft.\\n` +\n `5. Present the profile draft and ask \"Does that look right?\" On approval/correction, call confirm_user_profile(...).\\n` +\n `${communityStep}\\n` +\n `6. Ask what the user is looking for and call create_intent(description=\"...\").\\n` +\n `7. Call complete_onboarding() to finish setup. Gmail/contact import and discovery are optional after onboarding, never mandatory.`\n );\n}\n\n/**\n * Creates an MCP server with all protocol tools registered.\n * Tools resolve auth per-request via the HTTP request available in ServerContext.\n *\n * @param deps - Shared tool dependencies (graphs, database, embedder, etc.)\n * @param authResolver - Resolves authenticated identity from the HTTP request\n * @param scopedDepsFactory - Factory for creating per-request scoped databases\n * @returns A configured McpServer ready to be connected to a transport\n */\nfunction createMcpTraceEmitter(toolName: string, ctx: ServerContext): TraceEmitter | undefined {\n const token = ctx.mcpReq._meta?.progressToken;\n if (typeof token !== 'string' && typeof token !== 'number') return undefined;\n\n let progress = 0;\n return (event) => {\n progress += 1;\n const message = (() => {\n if (event.type === 'graph_start') return `${toolName}: ${event.name} started`;\n if (event.type === 'graph_end') return `${toolName}: ${event.name} finished${event.durationMs != null ? ` in ${event.durationMs}ms` : ''}`;\n if (event.type === 'agent_start') return `${toolName}: ${event.name} agent started`;\n if (event.type === 'agent_end') return `${toolName}: ${event.name} agent finished${event.durationMs != null ? ` in ${event.durationMs}ms` : ''}`;\n if (event.type === 'opportunity_draft_ready') return `${toolName}: opportunity draft ready`;\n return `${toolName}: progress`;\n })();\n\n const notification: Parameters<ServerContext['mcpReq']['notify']>[0] = {\n method: 'notifications/progress',\n params: { progressToken: token, progress, message },\n };\n void ctx.mcpReq.notify(notification).catch((err) => {\n logger.debug('Failed to send MCP progress notification', {\n toolName,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n };\n}\n\nexport const MCP_INSTRUCTIONS = `\nIndex Network is a private, intent-driven discovery protocol. You help users find the right people and help the right people find them, via Index Network MCP tools.\n\n# Voice\nCalm, direct, analytical, concise. Preferred vocabulary: opportunity, overlap, signal, pattern, emerging, relevant, adjacency.\n\n# Banned vocabulary\nNEVER use \"search\" in any form. Use \"looking up\" for indexed data, \"find\" / \"look for\" for discovery, \"check\" for verification, \"discover\" for exploration. Banned: leverage, unlock, optimize, scale, disrupt, revolutionary, AI-powered, maximize value, act fast, networking, match.\n\n# Entity model\n- User — has one Profile, many Memberships, many Intents.\n- Profile — identity (bio, skills, interests, location).\n- Index — community with title, prompt (purpose), join policy. Has Members.\n- Membership — User↔Index junction. \\`isPersonal: true\\` marks the user's personal index (contacts).\n- Intent — what a user is looking for (signal). Description, summary, embedding.\n- IntentIndex — Intent↔Index junction (auto-assigned).\n- Opportunity — discovered connection between users. Roles, status, reasoning.\n\n# Output rules\n- NEVER expose internal IDs, UUIDs, field names, or tool names — EXCEPT when an ID is actionable for the user (e.g. a \\`conversationId\\` they need to open a chat). Surface such IDs verbatim when the tool returns them.\n- NEVER use internal vocabulary — say \"signal\" not \"intent\", \"community\" not \"index\".\n- NEVER dump raw JSON. Synthesize in natural language.\n- Surface top 1–3 relevant points unless asked for the full list.\n- Prefer first names; use full names only to disambiguate.\n- Translate statuses: draft/latent → \"draft\", pending → \"sent\", accepted → \"connected\".\n- NEVER fabricate data. If you don't have it, call the appropriate tool.\n\n# Tool guidance\nEach tool's description contains its own usage rules (when to call, when NOT to call, required prerequisites, post-call follow-ups). Read the description of every tool you call — that is where the per-tool workflow patterns live.\n\n# Authentication\nPass your API key in the \\`x-api-key\\` request header (not \\`Authorization: Bearer\\`).\n\n# Opportunity lifecycle\nOpportunities move through: draft → pending → accepted (or rejected).\n\n- **draft** (you created it, not yet sent): offer to send it; confirm before calling update_opportunity with pending.\n- **pending, you sent it**: waiting for the other side — nothing to do.\n- **pending, you received it**: the other person is waiting for your response. Surface it to the user and ask if they want to start a chat. Only call update_opportunity with accepted after explicit user confirmation.\n- **accepted**: both sides are connected — a direct conversation exists. Surface the conversationId to the user if available.\n\nNever accept a received opportunity without explicit user approval in the current conversation.\n\n# Decision questions after discovery\n\nAfter \\`discover_opportunities\\`, the tool result may include a second text block starting with \\`Decision questions (structured): ...\\`. This means the discovery engine ran negotiations but needs human input to sharpen the next turn — e.g. clarify timing, role, stage, or location.\n\n**When this block is present:**\n1. Parse the \\`questions\\` array from the JSON after the sentinel.\n2. Each question has \\`title\\` (decision domain, ≤12 chars), \\`prompt\\` (ends in \\`?\\`), \\`options\\` (2–4 items, each with \\`label\\` and \\`description\\`), and \\`multiSelect\\`. The safest option is labeled \\`... (Recommended)\\`.\n3. Present each question in natural language: ask the \\`prompt\\`, list options as \\`**{label}** — {description}\\`. Never expose the JSON or technical field names.\n4. Wait for the user's answer, then fold it into the next \\`discover_opportunities(searchQuery=...)\\` call.\n\n**Elicitation-capable clients** (those that declared \\`elicitation\\` support in \\`initialize\\`): the server dispatches \\`elicitation/create\\` requests directly — answers are written back to the chat session automatically. You will not see the envelope as a follow-up task in that case.\n`.trim();\n\nexport function createMcpServer(\n deps: ToolDeps,\n authResolver: McpAuthResolver,\n scopedDepsFactory: ScopedDepsFactory,\n): McpServer {\n // Tools exempt from the agent-registration gate — available before registration is complete.\n const AGENT_GATE_EXEMPT = new Set(['register_agent', 'read_docs', 'scrape_url']);\n\n const server = new McpServer(\n { name: 'index-network', version: '1.0.0' },\n { instructions: MCP_INSTRUCTIONS },\n );\n\n const registry = createToolRegistry(deps);\n\n for (const [toolName, toolDef] of registry) {\n // Convert Zod 3 schema to JSON Schema, then wrap with fromJsonSchema\n // for MCP SDK's StandardSchemaWithJSON compatibility\n const jsonSchema = zodToJsonSchema(toolDef.schema) as JsonSchemaType;\n const mcpSchema = fromJsonSchema(jsonSchema);\n\n server.registerTool(\n toolName,\n {\n description: toolDef.description,\n inputSchema: mcpSchema,\n },\n async (args: unknown, ctx: ServerContext) => {\n let reportDeps = deps;\n let reportUserId: string | undefined;\n let reportContext: ResolvedToolContext | undefined;\n\n try {\n // Extract the original HTTP request from the MCP server context\n const httpReq = ctx.http?.req;\n if (!httpReq) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: 'No HTTP request available in MCP context' }) }],\n isError: true,\n };\n }\n\n // Resolve authenticated identity (userId + optional agentId + optional network scope + optional surface)\n const { userId, agentId, isSessionAuth, networkScopeId, clientSurface } = await authResolver.resolveIdentity(httpReq);\n reportUserId = userId;\n\n // Resolve chat context for the user (mark as MCP — no interactive UI available)\n const context = await resolveChatContext({ database: deps.database, userId });\n reportContext = context;\n context.isMcp = true;\n if (agentId) {\n context.agentId = agentId;\n }\n if (clientSurface) {\n context.clientSurface = clientSurface;\n }\n\n // Network-scoped agents inherit their bound network as the implicit chat\n // scope. Every tool that branches on `context.networkId` then enforces\n // the same boundary the DB-level `indexScope` clamp enforces below —\n // most importantly `read_networks`, which would otherwise return the\n // global `publicNetworks` catalog for unscoped contexts.\n applyNetworkScopeToContext(context, networkScopeId);\n\n // Gate: API-key callers (background agents) must register before using most tools.\n // OAuth/JWT session callers (human MCP clients such as Claude Code) are exempt —\n // their identity is already established via the auth flow and they have no agent entity.\n if (!isSessionAuth && !context.agentId && !AGENT_GATE_EXEMPT.has(toolName)) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: 'Agent not registered',\n message:\n 'You must register as an agent before using Index tools. ' +\n 'Call register_agent with your agent name to establish an identity. ' +\n 'The tools register_agent, read_docs, and scrape_url are available without registration.',\n }),\n }],\n isError: true,\n };\n }\n\n // Gate: non-onboarded users can only use onboarding-related tools.\n // Mirrors the chat orchestrator's ONBOARDING MODE — the MCP client must\n // walk the user through profile creation, Gmail connect, intent capture,\n // and complete_onboarding() before full tool access is granted.\n if (context.isOnboarding && !ONBOARDING_ALLOWED.has(toolName)) {\n const onboardingSteps = buildMcpOnboardingMessage(context);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: 'Onboarding required',\n message: onboardingSteps,\n }),\n }],\n isError: true,\n };\n }\n\n // Build per-request scoped databases via injected factory.\n // Network-scoped agents are clamped to their bound network plus the user's\n // personal index — they cannot reach other networks even when the user is\n // a member of them. The personal-index reachability is preserved so the\n // agent can still manage its owner's profile and contacts.\n // context.indexScope is now the single source of truth: set by\n // resolveChatContext (full set) and narrowed by applyNetworkScopeToContext.\n const scopedDbs = scopedDepsFactory.create(userId, context.indexScope);\n\n // Override deps with per-request scoped databases\n const requestDeps: ToolDeps = { ...deps, ...scopedDbs };\n reportDeps = requestDeps;\n\n // Re-create registry with per-request deps for scoped database access\n const requestRegistry = createToolRegistry(requestDeps);\n const requestTool = requestRegistry.get(toolName);\n\n if (!requestTool) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: `Tool \"${toolName}\" not found` }) }],\n isError: true,\n };\n }\n\n // Validate input against the original Zod schema\n const parseResult = (toolDef.schema as z.ZodType).safeParse(args);\n if (!parseResult.success) {\n const issues = parseResult.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ success: false, error: `Invalid input: ${issues}` }) }],\n isError: true,\n };\n }\n const validatedArgs = parseResult.data;\n\n // Execute the tool handler through the shared runtime so MCP calls have\n // consistent timeout, cancellation, progress, and requestContext plumbing.\n const result = await invokeToolRuntime({\n toolName,\n tool: requestTool,\n context,\n query: validatedArgs,\n signal: ctx.mcpReq.signal,\n traceEmitter: createMcpTraceEmitter(toolName, ctx),\n });\n\n const { text: sanitizedText, isError: toolIsError } = sanitizeMcpResult(result);\n\n // Slice 5: decision questions post-processing for discover_opportunities only.\n if (toolName === \"discover_opportunities\" && !toolIsError) {\n const questions = extractDecisionQuestions(sanitizedText);\n if (questions) {\n const envelopeBlock = {\n type: \"text\" as const,\n text: renderQuestionsEnvelope(questions),\n };\n\n const supportsElicitation =\n !!server.server.getClientCapabilities()?.elicitation;\n\n // Capture into a local const so TS preserves the narrowing\n // inside the callback below. Optional chains don't survive\n // across closure boundaries under strict mode.\n const elicitInput = ctx.mcpReq?.elicitInput;\n\n if (supportsElicitation && elicitInput) {\n // Sequential — never parallel (day-one rule). We await the loop\n // before returning the tool result so test harnesses can observe\n // the dispatched calls deterministically.\n await dispatchElicitations({\n userId,\n questions,\n elicitInput: (params) => elicitInput(params),\n chatMessageWriter: deps.chatMessageWriter,\n });\n }\n\n return {\n content: [\n { type: \"text\" as const, text: sanitizedText },\n envelopeBlock,\n ],\n ...(toolIsError ? { isError: true } : {}),\n };\n }\n }\n\n return {\n content: [{ type: 'text' as const, text: sanitizedText }],\n ...(toolIsError ? { isError: true } : {}),\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.error(`MCP tool \"${toolName}\" failed`, { error: message });\n if (shouldReportMcpToolError(err)) {\n reportDeps.reportToolError?.(err, {\n subsystem: 'mcp',\n operation: 'mcp.tool',\n toolName,\n userId: reportUserId,\n tags: {\n transport: 'mcp',\n toolName,\n },\n context: {\n agentId: reportContext?.agentId,\n networkId: reportContext?.networkId,\n indexScope: reportContext?.indexScope,\n },\n });\n }\n const runtimeResult = toolRuntimeErrorToResult(err);\n return {\n content: [{ type: 'text' as const, text: runtimeResult ?? JSON.stringify({ error: message }) }],\n isError: true,\n };\n }\n },\n );\n }\n\n logger.verbose(`MCP server created with ${registry.size} tools`);\n return server;\n}\n"]}
@@ -18,6 +18,7 @@ export type ProfileDocument = Profile & {
18
18
  userId: string;
19
19
  };
20
20
  export declare class ProfileGenerator {
21
+ private static baseModel;
21
22
  private model;
22
23
  constructor();
23
24
  private toString;
@@ -1 +1 @@
1
- {"version":3,"file":"profile.generator.d.ts","sourceRoot":"/","sources":["profile/profile.generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAoB3B,QAAA,MAAM,cAAc;;;;;;;;;;;;;iBAalB,CAAC;AAEH,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAM;;IAOnB,OAAO,CAAC,QAAQ;IAiBH,MAAM,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;;;;;;;;WAgBnB,MAAM;;;;;;;;;;;;;;;;;;;;;;;CAerB"}
1
+ {"version":3,"file":"profile.generator.d.ts","sourceRoot":"/","sources":["profile/profile.generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAkB3B,QAAA,MAAM,cAAc;;;;;;;;;;;;;iBAalB,CAAC;AAEH,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAA6C;IACrE,OAAO,CAAC,KAAK,CAAkF;;IAS/F,OAAO,CAAC,QAAQ;IAiBH,MAAM,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;;;;;;;;WAgBnB,MAAM;;;;;;;;;;;;;;;;;;;;;;;CAerB"}
@@ -15,7 +15,6 @@ import { Timed } from "../shared/observability/performance.js";
15
15
  import { createModel } from "../shared/agent/model.config.js";
16
16
  import { invokeWithAbortSignal } from "../shared/agent/model-signal.js";
17
17
  const logger = protocolLogger("ProfileGenerator");
18
- const model = createModel("profileGenerator");
19
18
  const systemPrompt = `
20
19
  You are an expert profiler. Your task is to synthesize a structured User Profile from raw data or user requests.
21
20
 
@@ -41,7 +40,8 @@ const responseFormat = z.object({
41
40
  });
42
41
  export class ProfileGenerator {
43
42
  constructor() {
44
- this.model = model.withStructuredOutput(responseFormat, {
43
+ const baseModel = ProfileGenerator.baseModel ?? (ProfileGenerator.baseModel = createModel("profileGenerator"));
44
+ this.model = baseModel.withStructuredOutput(responseFormat, {
45
45
  name: "profile_generator"
46
46
  });
47
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"profile.generator.js","sourceRoot":"/","sources":["profile/profile.generator.ts"],"names":[],"mappings":"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","sourcesContent":["import { HumanMessage, SystemMessage } from \"@langchain/core/messages\";\nimport { tool } from \"@langchain/core/tools\";\nimport { z } from \"zod/v4\";\nimport { protocolLogger } from \"../shared/observability/protocol.logger.js\";\nimport { Timed } from \"../shared/observability/performance.js\";\nimport { createModel } from \"../shared/agent/model.config.js\";\nimport { invokeWithAbortSignal } from \"../shared/agent/model-signal.js\";\n\nconst logger = protocolLogger(\"ProfileGenerator\");\n\nconst model = createModel(\"profileGenerator\");\n\nconst systemPrompt = `\n You are an expert profiler. Your task is to synthesize a structured User Profile from raw data or user requests.\n\n When given EXISTING PROFILE + USER REQUEST: Apply the request to the existing profile. Add, update, or remove skills and interests as the user asks. Preserve everything else. Output the full updated profile.\n\n When given raw data only: Infer name, bio, location, narrative.context, and extract skills and interests.\n\n PRIVACY: identity.bio and narrative.context are public-facing. Never include email addresses, phone numbers, physical addresses, government IDs, or other contact identifiers — even if they appear in the raw data. Describe the person professionally; do not embed ways to contact them.\n`;\n\nconst responseFormat = z.object({\n identity: z.object({\n name: z.string().describe(\"The user's full name\"),\n bio: z.string().describe(\"Professional summary (2-3 sentences) only; no email, phone, physical address, government ID, or other contact identifiers\"),\n location: z.string().describe(\"Inferred location (City, Country) or 'Remote'\"),\n }),\n narrative: z.object({\n context: z.string().describe(\"Rich narrative without email, phone, physical address, government ID, or other contact identifiers\"),\n }),\n attributes: z.object({\n interests: z.array(z.string()).describe(\"Inferred or explicit interests\"),\n skills: z.array(z.string()).describe(\"Professional skills\"),\n }),\n});\n\ntype Profile = z.infer<typeof responseFormat>;\nexport type ProfileDocument = Profile & { userId: string };\n\nexport class ProfileGenerator {\n private model: any;\n constructor() {\n this.model = model.withStructuredOutput(responseFormat, {\n name: \"profile_generator\"\n });\n }\n\n private toString(profile: Profile): string {\n const textToEmbed = [\n '# Identity',\n '## Name', profile.identity.name,\n '## Bio', profile.identity.bio,\n '## Location', profile.identity.location,\n '# Narrative',\n '## Context', profile.narrative.context,\n '# Attributes',\n '## Interests', profile.attributes.interests.join(', '),\n '## Skills', profile.attributes.skills.join(', ')\n ].join('\\n');\n\n return textToEmbed;\n }\n\n @Timed()\n public async invoke(input: string) {\n logger.verbose(\"Received input\", { inputLength: input?.length });\n const messages = [\n new SystemMessage(systemPrompt),\n new HumanMessage(`Here is the raw data:\\n${input}`)\n ];\n const result = await invokeWithAbortSignal(this.model, messages);\n const output = responseFormat.parse(result);\n const textToEmbed = this.toString(output);\n logger.verbose(\"Generated profile\", {\n skillsCount: output.attributes.skills.length,\n interestsCount: output.attributes.interests.length\n });\n return { output, textToEmbed };\n }\n\n public static asTool() {\n return tool(\n async (args: { input: string }) => {\n const profileGenerator = new ProfileGenerator();\n return await profileGenerator.invoke(args.input);\n },\n {\n name: 'profileGenerator',\n description: 'Profile Generator',\n schema: z.object({\n input: z.string().describe('Raw data scraped from the web (via Parallel.ai)'),\n })\n }\n );\n }\n}"]}
1
+ {"version":3,"file":"profile.generator.js","sourceRoot":"/","sources":["profile/profile.generator.ts"],"names":[],"mappings":"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","sourcesContent":["import { HumanMessage, SystemMessage } from \"@langchain/core/messages\";\nimport { tool } from \"@langchain/core/tools\";\nimport { z } from \"zod/v4\";\nimport { protocolLogger } from \"../shared/observability/protocol.logger.js\";\nimport { Timed } from \"../shared/observability/performance.js\";\nimport { createModel } from \"../shared/agent/model.config.js\";\nimport { invokeWithAbortSignal } from \"../shared/agent/model-signal.js\";\n\nconst logger = protocolLogger(\"ProfileGenerator\");\n\nconst systemPrompt = `\n You are an expert profiler. Your task is to synthesize a structured User Profile from raw data or user requests.\n\n When given EXISTING PROFILE + USER REQUEST: Apply the request to the existing profile. Add, update, or remove skills and interests as the user asks. Preserve everything else. Output the full updated profile.\n\n When given raw data only: Infer name, bio, location, narrative.context, and extract skills and interests.\n\n PRIVACY: identity.bio and narrative.context are public-facing. Never include email addresses, phone numbers, physical addresses, government IDs, or other contact identifiers — even if they appear in the raw data. Describe the person professionally; do not embed ways to contact them.\n`;\n\nconst responseFormat = z.object({\n identity: z.object({\n name: z.string().describe(\"The user's full name\"),\n bio: z.string().describe(\"Professional summary (2-3 sentences) only; no email, phone, physical address, government ID, or other contact identifiers\"),\n location: z.string().describe(\"Inferred location (City, Country) or 'Remote'\"),\n }),\n narrative: z.object({\n context: z.string().describe(\"Rich narrative without email, phone, physical address, government ID, or other contact identifiers\"),\n }),\n attributes: z.object({\n interests: z.array(z.string()).describe(\"Inferred or explicit interests\"),\n skills: z.array(z.string()).describe(\"Professional skills\"),\n }),\n});\n\ntype Profile = z.infer<typeof responseFormat>;\nexport type ProfileDocument = Profile & { userId: string };\n\nexport class ProfileGenerator {\n private static baseModel: ReturnType<typeof createModel> | undefined;\n private model: { invoke(input: unknown, config?: { signal?: AbortSignal }): Promise<unknown> };\n\n constructor() {\n const baseModel = ProfileGenerator.baseModel ??= createModel(\"profileGenerator\");\n this.model = baseModel.withStructuredOutput(responseFormat, {\n name: \"profile_generator\"\n });\n }\n\n private toString(profile: Profile): string {\n const textToEmbed = [\n '# Identity',\n '## Name', profile.identity.name,\n '## Bio', profile.identity.bio,\n '## Location', profile.identity.location,\n '# Narrative',\n '## Context', profile.narrative.context,\n '# Attributes',\n '## Interests', profile.attributes.interests.join(', '),\n '## Skills', profile.attributes.skills.join(', ')\n ].join('\\n');\n\n return textToEmbed;\n }\n\n @Timed()\n public async invoke(input: string) {\n logger.verbose(\"Received input\", { inputLength: input?.length });\n const messages = [\n new SystemMessage(systemPrompt),\n new HumanMessage(`Here is the raw data:\\n${input}`)\n ];\n const result = await invokeWithAbortSignal(this.model, messages);\n const output = responseFormat.parse(result);\n const textToEmbed = this.toString(output);\n logger.verbose(\"Generated profile\", {\n skillsCount: output.attributes.skills.length,\n interestsCount: output.attributes.interests.length\n });\n return { output, textToEmbed };\n }\n\n public static asTool() {\n return tool(\n async (args: { input: string }) => {\n const profileGenerator = new ProfileGenerator();\n return await profileGenerator.invoke(args.input);\n },\n {\n name: 'profileGenerator',\n description: 'Profile Generator',\n schema: z.object({\n input: z.string().describe('Raw data scraped from the web (via Parallel.ai)'),\n })\n }\n );\n }\n}"]}
@@ -1,3 +1,3 @@
1
1
  import type { DefineTool, ToolDeps } from "../shared/agent/tool.helpers.js";
2
- export declare function createProfileTools(defineTool: DefineTool, deps: ToolDeps): readonly [any, any, any, any, any, any, any];
2
+ export declare function createProfileTools(defineTool: DefineTool, deps: ToolDeps): readonly [any, any, any, any, any, any, any, any, any];
3
3
  //# sourceMappingURL=profile.tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"profile.tools.d.ts","sourceRoot":"/","sources":["profile/profile.tools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAuB5E,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,gDA08BxE"}
1
+ {"version":3,"file":"profile.tools.d.ts","sourceRoot":"/","sources":["profile/profile.tools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAuB,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAwBjG,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,0DAynCxE"}