@indexnetwork/protocol 0.1.0
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/agents/chat.agent.d.ts +218 -0
- package/dist/agents/chat.agent.d.ts.map +1 -0
- package/dist/agents/chat.agent.js +884 -0
- package/dist/agents/chat.agent.js.map +1 -0
- package/dist/agents/chat.prompt.d.ts +18 -0
- package/dist/agents/chat.prompt.d.ts.map +1 -0
- package/dist/agents/chat.prompt.js +372 -0
- package/dist/agents/chat.prompt.js.map +1 -0
- package/dist/agents/chat.prompt.modules.d.ts +61 -0
- package/dist/agents/chat.prompt.modules.d.ts.map +1 -0
- package/dist/agents/chat.prompt.modules.js +366 -0
- package/dist/agents/chat.prompt.modules.js.map +1 -0
- package/dist/agents/chat.title.generator.d.ts +20 -0
- package/dist/agents/chat.title.generator.d.ts.map +1 -0
- package/dist/agents/chat.title.generator.js +66 -0
- package/dist/agents/chat.title.generator.js.map +1 -0
- package/dist/agents/home.categorizer.d.ts +28 -0
- package/dist/agents/home.categorizer.d.ts.map +1 -0
- package/dist/agents/home.categorizer.js +170 -0
- package/dist/agents/home.categorizer.js.map +1 -0
- package/dist/agents/hyde.generator.d.ts +27 -0
- package/dist/agents/hyde.generator.d.ts.map +1 -0
- package/dist/agents/hyde.generator.js +75 -0
- package/dist/agents/hyde.generator.js.map +1 -0
- package/dist/agents/hyde.strategies.d.ts +17 -0
- package/dist/agents/hyde.strategies.d.ts.map +1 -0
- package/dist/agents/hyde.strategies.js +29 -0
- package/dist/agents/hyde.strategies.js.map +1 -0
- package/dist/agents/intent.clarifier.d.ts +29 -0
- package/dist/agents/intent.clarifier.d.ts.map +1 -0
- package/dist/agents/intent.clarifier.js +186 -0
- package/dist/agents/intent.clarifier.js.map +1 -0
- package/dist/agents/intent.indexer.d.ts +77 -0
- package/dist/agents/intent.indexer.d.ts.map +1 -0
- package/dist/agents/intent.indexer.js +164 -0
- package/dist/agents/intent.indexer.js.map +1 -0
- package/dist/agents/intent.inferrer.d.ts +95 -0
- package/dist/agents/intent.inferrer.d.ts.map +1 -0
- package/dist/agents/intent.inferrer.js +238 -0
- package/dist/agents/intent.inferrer.js.map +1 -0
- package/dist/agents/intent.reconciler.d.ts +106 -0
- package/dist/agents/intent.reconciler.d.ts.map +1 -0
- package/dist/agents/intent.reconciler.js +184 -0
- package/dist/agents/intent.reconciler.js.map +1 -0
- package/dist/agents/intent.verifier.d.ts +97 -0
- package/dist/agents/intent.verifier.d.ts.map +1 -0
- package/dist/agents/intent.verifier.js +234 -0
- package/dist/agents/intent.verifier.js.map +1 -0
- package/dist/agents/invite.generator.d.ts +47 -0
- package/dist/agents/invite.generator.d.ts.map +1 -0
- package/dist/agents/invite.generator.js +56 -0
- package/dist/agents/invite.generator.js.map +1 -0
- package/dist/agents/lens.inferrer.d.ts +37 -0
- package/dist/agents/lens.inferrer.d.ts.map +1 -0
- package/dist/agents/lens.inferrer.js +98 -0
- package/dist/agents/lens.inferrer.js.map +1 -0
- package/dist/agents/model.config.d.ts +120 -0
- package/dist/agents/model.config.d.ts.map +1 -0
- package/dist/agents/model.config.js +76 -0
- package/dist/agents/model.config.js.map +1 -0
- package/dist/agents/negotiation.insights.generator.d.ts +32 -0
- package/dist/agents/negotiation.insights.generator.d.ts.map +1 -0
- package/dist/agents/negotiation.insights.generator.js +105 -0
- package/dist/agents/negotiation.insights.generator.js.map +1 -0
- package/dist/agents/negotiation.proposer.d.ts +26 -0
- package/dist/agents/negotiation.proposer.d.ts.map +1 -0
- package/dist/agents/negotiation.proposer.js +67 -0
- package/dist/agents/negotiation.proposer.js.map +1 -0
- package/dist/agents/negotiation.responder.d.ts +26 -0
- package/dist/agents/negotiation.responder.d.ts.map +1 -0
- package/dist/agents/negotiation.responder.js +71 -0
- package/dist/agents/negotiation.responder.js.map +1 -0
- package/dist/agents/opportunity.evaluator.d.ts +253 -0
- package/dist/agents/opportunity.evaluator.d.ts.map +1 -0
- package/dist/agents/opportunity.evaluator.js +413 -0
- package/dist/agents/opportunity.evaluator.js.map +1 -0
- package/dist/agents/opportunity.presenter.d.ts +115 -0
- package/dist/agents/opportunity.presenter.d.ts.map +1 -0
- package/dist/agents/opportunity.presenter.js +524 -0
- package/dist/agents/opportunity.presenter.js.map +1 -0
- package/dist/agents/profile.generator.d.ts +67 -0
- package/dist/agents/profile.generator.d.ts.map +1 -0
- package/dist/agents/profile.generator.js +97 -0
- package/dist/agents/profile.generator.js.map +1 -0
- package/dist/agents/profile.hyde.generator.d.ts +43 -0
- package/dist/agents/profile.hyde.generator.d.ts.map +1 -0
- package/dist/agents/profile.hyde.generator.js +113 -0
- package/dist/agents/profile.hyde.generator.js.map +1 -0
- package/dist/agents/suggestion.generator.d.ts +24 -0
- package/dist/agents/suggestion.generator.d.ts.map +1 -0
- package/dist/agents/suggestion.generator.js +96 -0
- package/dist/agents/suggestion.generator.js.map +1 -0
- package/dist/graphs/chat.graph.d.ts +312 -0
- package/dist/graphs/chat.graph.d.ts.map +1 -0
- package/dist/graphs/chat.graph.js +267 -0
- package/dist/graphs/chat.graph.js.map +1 -0
- package/dist/graphs/home.graph.d.ts +180 -0
- package/dist/graphs/home.graph.d.ts.map +1 -0
- package/dist/graphs/home.graph.js +598 -0
- package/dist/graphs/home.graph.js.map +1 -0
- package/dist/graphs/hyde.graph.d.ts +110 -0
- package/dist/graphs/hyde.graph.d.ts.map +1 -0
- package/dist/graphs/hyde.graph.js +235 -0
- package/dist/graphs/hyde.graph.js.map +1 -0
- package/dist/graphs/index.graph.d.ts +620 -0
- package/dist/graphs/index.graph.d.ts.map +1 -0
- package/dist/graphs/index.graph.js +226 -0
- package/dist/graphs/index.graph.js.map +1 -0
- package/dist/graphs/index_membership.graph.d.ts +250 -0
- package/dist/graphs/index_membership.graph.d.ts.map +1 -0
- package/dist/graphs/index_membership.graph.js +204 -0
- package/dist/graphs/index_membership.graph.js.map +1 -0
- package/dist/graphs/intent.graph.d.ts +490 -0
- package/dist/graphs/intent.graph.d.ts.map +1 -0
- package/dist/graphs/intent.graph.js +787 -0
- package/dist/graphs/intent.graph.js.map +1 -0
- package/dist/graphs/intent_index.graph.d.ts +396 -0
- package/dist/graphs/intent_index.graph.d.ts.map +1 -0
- package/dist/graphs/intent_index.graph.js +331 -0
- package/dist/graphs/intent_index.graph.js.map +1 -0
- package/dist/graphs/maintenance.graph.d.ts +177 -0
- package/dist/graphs/maintenance.graph.d.ts.map +1 -0
- package/dist/graphs/maintenance.graph.js +173 -0
- package/dist/graphs/maintenance.graph.js.map +1 -0
- package/dist/graphs/negotiation.graph.d.ts +819 -0
- package/dist/graphs/negotiation.graph.d.ts.map +1 -0
- package/dist/graphs/negotiation.graph.js +255 -0
- package/dist/graphs/negotiation.graph.js.map +1 -0
- package/dist/graphs/opportunity.graph.d.ts +1082 -0
- package/dist/graphs/opportunity.graph.d.ts.map +1 -0
- package/dist/graphs/opportunity.graph.js +2534 -0
- package/dist/graphs/opportunity.graph.js.map +1 -0
- package/dist/graphs/profile.graph.d.ts +617 -0
- package/dist/graphs/profile.graph.d.ts.map +1 -0
- package/dist/graphs/profile.graph.js +839 -0
- package/dist/graphs/profile.graph.js.map +1 -0
- package/dist/graphs/tests/chat.graph.mocks.d.ts +104 -0
- package/dist/graphs/tests/chat.graph.mocks.d.ts.map +1 -0
- package/dist/graphs/tests/chat.graph.mocks.js +225 -0
- package/dist/graphs/tests/chat.graph.mocks.js.map +1 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/auth.interface.d.ts +15 -0
- package/dist/interfaces/auth.interface.d.ts.map +1 -0
- package/dist/interfaces/auth.interface.js +2 -0
- package/dist/interfaces/auth.interface.js.map +1 -0
- package/dist/interfaces/cache.interface.d.ts +43 -0
- package/dist/interfaces/cache.interface.d.ts.map +1 -0
- package/dist/interfaces/cache.interface.js +6 -0
- package/dist/interfaces/cache.interface.js.map +1 -0
- package/dist/interfaces/chat-session.interface.d.ts +11 -0
- package/dist/interfaces/chat-session.interface.d.ts.map +1 -0
- package/dist/interfaces/chat-session.interface.js +2 -0
- package/dist/interfaces/chat-session.interface.js.map +1 -0
- package/dist/interfaces/contact.interface.d.ts +48 -0
- package/dist/interfaces/contact.interface.d.ts.map +1 -0
- package/dist/interfaces/contact.interface.js +2 -0
- package/dist/interfaces/contact.interface.js.map +1 -0
- package/dist/interfaces/database.interface.d.ts +1495 -0
- package/dist/interfaces/database.interface.d.ts.map +1 -0
- package/dist/interfaces/database.interface.js +2 -0
- package/dist/interfaces/database.interface.js.map +1 -0
- package/dist/interfaces/embedder.interface.d.ts +85 -0
- package/dist/interfaces/embedder.interface.d.ts.map +1 -0
- package/dist/interfaces/embedder.interface.js +5 -0
- package/dist/interfaces/embedder.interface.js.map +1 -0
- package/dist/interfaces/enrichment.interface.d.ts +40 -0
- package/dist/interfaces/enrichment.interface.d.ts.map +1 -0
- package/dist/interfaces/enrichment.interface.js +2 -0
- package/dist/interfaces/enrichment.interface.js.map +1 -0
- package/dist/interfaces/integration.interface.d.ts +91 -0
- package/dist/interfaces/integration.interface.d.ts.map +1 -0
- package/dist/interfaces/integration.interface.js +2 -0
- package/dist/interfaces/integration.interface.js.map +1 -0
- package/dist/interfaces/queue.interface.d.ts +17 -0
- package/dist/interfaces/queue.interface.d.ts.map +1 -0
- package/dist/interfaces/queue.interface.js +5 -0
- package/dist/interfaces/queue.interface.js.map +1 -0
- package/dist/interfaces/scraper.interface.d.ts +31 -0
- package/dist/interfaces/scraper.interface.d.ts.map +1 -0
- package/dist/interfaces/scraper.interface.js +2 -0
- package/dist/interfaces/scraper.interface.js.map +1 -0
- package/dist/interfaces/storage.interface.d.ts +46 -0
- package/dist/interfaces/storage.interface.d.ts.map +1 -0
- package/dist/interfaces/storage.interface.js +6 -0
- package/dist/interfaces/storage.interface.js.map +1 -0
- package/dist/mcp/mcp.server.d.ts +29 -0
- package/dist/mcp/mcp.server.d.ts.map +1 -0
- package/dist/mcp/mcp.server.js +171 -0
- package/dist/mcp/mcp.server.js.map +1 -0
- package/dist/states/chat.state.d.ts +126 -0
- package/dist/states/chat.state.d.ts.map +1 -0
- package/dist/states/chat.state.js +112 -0
- package/dist/states/chat.state.js.map +1 -0
- package/dist/states/home.state.d.ts +100 -0
- package/dist/states/home.state.d.ts.map +1 -0
- package/dist/states/home.state.js +74 -0
- package/dist/states/home.state.js.map +1 -0
- package/dist/states/hyde.state.d.ts +54 -0
- package/dist/states/hyde.state.d.ts.map +1 -0
- package/dist/states/hyde.state.js +66 -0
- package/dist/states/hyde.state.js.map +1 -0
- package/dist/states/index.state.d.ts +179 -0
- package/dist/states/index.state.d.ts.map +1 -0
- package/dist/states/index.state.js +56 -0
- package/dist/states/index.state.js.map +1 -0
- package/dist/states/index_membership.state.d.ts +77 -0
- package/dist/states/index_membership.state.d.ts.map +1 -0
- package/dist/states/index_membership.state.js +43 -0
- package/dist/states/index_membership.state.js.map +1 -0
- package/dist/states/intent.state.d.ts +203 -0
- package/dist/states/intent.state.d.ts.map +1 -0
- package/dist/states/intent.state.js +153 -0
- package/dist/states/intent.state.js.map +1 -0
- package/dist/states/intent_index.state.d.ts +148 -0
- package/dist/states/intent_index.state.d.ts.map +1 -0
- package/dist/states/intent_index.state.js +100 -0
- package/dist/states/intent_index.state.js.map +1 -0
- package/dist/states/maintenance.state.d.ts +36 -0
- package/dist/states/maintenance.state.d.ts.map +1 -0
- package/dist/states/maintenance.state.js +56 -0
- package/dist/states/maintenance.state.js.map +1 -0
- package/dist/states/negotiation.state.d.ts +230 -0
- package/dist/states/negotiation.state.d.ts.map +1 -0
- package/dist/states/negotiation.state.js +82 -0
- package/dist/states/negotiation.state.js.map +1 -0
- package/dist/states/opportunity.state.d.ts +300 -0
- package/dist/states/opportunity.state.d.ts.map +1 -0
- package/dist/states/opportunity.state.js +207 -0
- package/dist/states/opportunity.state.js.map +1 -0
- package/dist/states/profile.state.d.ts +172 -0
- package/dist/states/profile.state.d.ts.map +1 -0
- package/dist/states/profile.state.js +133 -0
- package/dist/states/profile.state.js.map +1 -0
- package/dist/streamers/chat.streamer.d.ts +55 -0
- package/dist/streamers/chat.streamer.d.ts.map +1 -0
- package/dist/streamers/chat.streamer.js +186 -0
- package/dist/streamers/chat.streamer.js.map +1 -0
- package/dist/streamers/index.d.ts +3 -0
- package/dist/streamers/index.d.ts.map +1 -0
- package/dist/streamers/index.js +3 -0
- package/dist/streamers/index.js.map +1 -0
- package/dist/streamers/response.streamer.d.ts +36 -0
- package/dist/streamers/response.streamer.d.ts.map +1 -0
- package/dist/streamers/response.streamer.js +46 -0
- package/dist/streamers/response.streamer.js.map +1 -0
- package/dist/support/chat.utils.d.ts +42 -0
- package/dist/support/chat.utils.d.ts.map +1 -0
- package/dist/support/chat.utils.js +89 -0
- package/dist/support/chat.utils.js.map +1 -0
- package/dist/support/debug-meta.sanitizer.d.ts +18 -0
- package/dist/support/debug-meta.sanitizer.d.ts.map +1 -0
- package/dist/support/debug-meta.sanitizer.js +82 -0
- package/dist/support/debug-meta.sanitizer.js.map +1 -0
- package/dist/support/feed.health.d.ts +32 -0
- package/dist/support/feed.health.d.ts.map +1 -0
- package/dist/support/feed.health.js +76 -0
- package/dist/support/feed.health.js.map +1 -0
- package/dist/support/introducer.discovery.d.ts +78 -0
- package/dist/support/introducer.discovery.d.ts.map +1 -0
- package/dist/support/introducer.discovery.js +101 -0
- package/dist/support/introducer.discovery.js.map +1 -0
- package/dist/support/log.d.ts +65 -0
- package/dist/support/log.d.ts.map +1 -0
- package/dist/support/log.js +76 -0
- package/dist/support/log.js.map +1 -0
- package/dist/support/lucide.icon-catalog.d.ts +22 -0
- package/dist/support/lucide.icon-catalog.d.ts.map +1 -0
- package/dist/support/lucide.icon-catalog.js +101 -0
- package/dist/support/lucide.icon-catalog.js.map +1 -0
- package/dist/support/opportunity.card-text.d.ts +39 -0
- package/dist/support/opportunity.card-text.d.ts.map +1 -0
- package/dist/support/opportunity.card-text.js +333 -0
- package/dist/support/opportunity.card-text.js.map +1 -0
- package/dist/support/opportunity.constants.d.ts +9 -0
- package/dist/support/opportunity.constants.d.ts.map +1 -0
- package/dist/support/opportunity.constants.js +11 -0
- package/dist/support/opportunity.constants.js.map +1 -0
- package/dist/support/opportunity.discover.d.ts +144 -0
- package/dist/support/opportunity.discover.d.ts.map +1 -0
- package/dist/support/opportunity.discover.js +610 -0
- package/dist/support/opportunity.discover.js.map +1 -0
- package/dist/support/opportunity.enricher.d.ts +44 -0
- package/dist/support/opportunity.enricher.d.ts.map +1 -0
- package/dist/support/opportunity.enricher.js +245 -0
- package/dist/support/opportunity.enricher.js.map +1 -0
- package/dist/support/opportunity.persist.d.ts +39 -0
- package/dist/support/opportunity.persist.d.ts.map +1 -0
- package/dist/support/opportunity.persist.js +63 -0
- package/dist/support/opportunity.persist.js.map +1 -0
- package/dist/support/opportunity.presentation.d.ts +21 -0
- package/dist/support/opportunity.presentation.d.ts.map +1 -0
- package/dist/support/opportunity.presentation.js +75 -0
- package/dist/support/opportunity.presentation.js.map +1 -0
- package/dist/support/opportunity.sanitize.d.ts +18 -0
- package/dist/support/opportunity.sanitize.d.ts.map +1 -0
- package/dist/support/opportunity.sanitize.js +89 -0
- package/dist/support/opportunity.sanitize.js.map +1 -0
- package/dist/support/opportunity.utils.d.ts +99 -0
- package/dist/support/opportunity.utils.d.ts.map +1 -0
- package/dist/support/opportunity.utils.js +184 -0
- package/dist/support/opportunity.utils.js.map +1 -0
- package/dist/support/performance.d.ts +19 -0
- package/dist/support/performance.d.ts.map +1 -0
- package/dist/support/performance.js +43 -0
- package/dist/support/performance.js.map +1 -0
- package/dist/support/profile.enrichment-display-name.d.ts +16 -0
- package/dist/support/profile.enrichment-display-name.d.ts.map +1 -0
- package/dist/support/profile.enrichment-display-name.js +22 -0
- package/dist/support/profile.enrichment-display-name.js.map +1 -0
- package/dist/support/protocol.logger.d.ts +22 -0
- package/dist/support/protocol.logger.d.ts.map +1 -0
- package/dist/support/protocol.logger.js +44 -0
- package/dist/support/protocol.logger.js.map +1 -0
- package/dist/support/request-context.d.ts +19 -0
- package/dist/support/request-context.d.ts.map +1 -0
- package/dist/support/request-context.js +7 -0
- package/dist/support/request-context.js.map +1 -0
- package/dist/tools/contact.tools.d.ts +7 -0
- package/dist/tools/contact.tools.d.ts.map +1 -0
- package/dist/tools/contact.tools.js +115 -0
- package/dist/tools/contact.tools.js.map +1 -0
- package/dist/tools/index.d.ts +17 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +140 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/index.tools.d.ts +3 -0
- package/dist/tools/index.tools.d.ts.map +1 -0
- package/dist/tools/index.tools.js +423 -0
- package/dist/tools/index.tools.js.map +1 -0
- package/dist/tools/integration.tools.d.ts +13 -0
- package/dist/tools/integration.tools.d.ts.map +1 -0
- package/dist/tools/integration.tools.js +77 -0
- package/dist/tools/integration.tools.js.map +1 -0
- package/dist/tools/intent.tools.d.ts +3 -0
- package/dist/tools/intent.tools.d.ts.map +1 -0
- package/dist/tools/intent.tools.js +458 -0
- package/dist/tools/intent.tools.js.map +1 -0
- package/dist/tools/opportunity.tools.d.ts +44 -0
- package/dist/tools/opportunity.tools.d.ts.map +1 -0
- package/dist/tools/opportunity.tools.js +814 -0
- package/dist/tools/opportunity.tools.js.map +1 -0
- package/dist/tools/profile.tools.d.ts +3 -0
- package/dist/tools/profile.tools.d.ts.map +1 -0
- package/dist/tools/profile.tools.js +513 -0
- package/dist/tools/profile.tools.js.map +1 -0
- package/dist/tools/tool.helpers.d.ts +225 -0
- package/dist/tools/tool.helpers.d.ts.map +1 -0
- package/dist/tools/tool.helpers.js +172 -0
- package/dist/tools/tool.helpers.js.map +1 -0
- package/dist/tools/tool.registry.d.ts +12 -0
- package/dist/tools/tool.registry.d.ts.map +1 -0
- package/dist/tools/tool.registry.js +62 -0
- package/dist/tools/tool.registry.js.map +1 -0
- package/dist/tools/utility.tools.d.ts +3 -0
- package/dist/tools/utility.tools.d.ts.map +1 -0
- package/dist/tools/utility.tools.js +107 -0
- package/dist/tools/utility.tools.js.map +1 -0
- package/dist/types/chat-streaming.types.d.ts +472 -0
- package/dist/types/chat-streaming.types.d.ts.map +1 -0
- package/dist/types/chat-streaming.types.js +260 -0
- package/dist/types/chat-streaming.types.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run discovery from an ad-hoc query (e.g. chat "find me a mentor", "who needs a React developer").
|
|
3
|
+
*
|
|
4
|
+
* Invokes the opportunity graph with the query as sourceText. The HyDE graph's
|
|
5
|
+
* LensInferrer automatically infers search lenses from the query, replacing the
|
|
6
|
+
* old hardcoded strategy selection. Returns formatted candidates (enriched with
|
|
7
|
+
* profile name/bio) for chat display.
|
|
8
|
+
*
|
|
9
|
+
* Used by the create_opportunities chat tool.
|
|
10
|
+
*/
|
|
11
|
+
import { gatherPresenterContext, } from "../agents/opportunity.presenter.js";
|
|
12
|
+
import { MINIMAL_MAIN_TEXT_MAX_CHARS, getPrimaryActionLabel, SECONDARY_ACTION_LABEL } from "./opportunity.constants.js";
|
|
13
|
+
import { viewerCentricCardSummary, narratorRemarkFromReasoning } from "./opportunity.card-text.js";
|
|
14
|
+
import { protocolLogger, withCallLogging } from "./protocol.logger.js";
|
|
15
|
+
const logger = protocolLogger("OpportunityDiscover");
|
|
16
|
+
/** Max chars for bio and matchReason in chat tool results to keep context manageable. */
|
|
17
|
+
const MAX_FIELD_CHARS = 100;
|
|
18
|
+
function truncateForChat(s, max = MAX_FIELD_CHARS) {
|
|
19
|
+
if (s == null || s === "")
|
|
20
|
+
return undefined;
|
|
21
|
+
const trimmed = s.trim();
|
|
22
|
+
if (trimmed.length <= max)
|
|
23
|
+
return trimmed;
|
|
24
|
+
return trimmed.slice(0, max) + "...";
|
|
25
|
+
}
|
|
26
|
+
/** Statuses for which an existing connection may be shown as a card; others (accepted, rejected, expired) are only mentioned in text. */
|
|
27
|
+
const EXISTING_CONNECTION_CARD_STATUSES = ['draft', 'latent', 'pending'];
|
|
28
|
+
/**
|
|
29
|
+
* Enrich raw opportunities with profile data, presentation (LLM or minimal),
|
|
30
|
+
* and narrator chips. Shared by both `runDiscoverFromQuery` and `continueDiscovery`
|
|
31
|
+
* to avoid duplicating the profile-lookup / presenter / card-formatting logic.
|
|
32
|
+
*
|
|
33
|
+
* @param input - Enrichment context (opportunities, database, viewer, presentation options).
|
|
34
|
+
* @returns Formatted discovery candidates ready for chat or home card display.
|
|
35
|
+
*/
|
|
36
|
+
async function enrichOpportunities(input) {
|
|
37
|
+
const { opportunities, database, userId, chatSessionId, minimalForChat, presenter, useHomeCardFormat, debugSteps, existingOpportunityIds, targetUserId, } = input;
|
|
38
|
+
const baseEnrichedRaw = await Promise.all(opportunities.map(async (opp) => {
|
|
39
|
+
const viewerIsIntroducer = opp.actors.some((a) => a.role === 'introducer' && a.userId === userId);
|
|
40
|
+
// When the viewer is the introducer, the "candidate" for the card is the agent
|
|
41
|
+
// (the discovered person), not the patient (the intro target / onBehalfOfUserId).
|
|
42
|
+
// For non-introducer views, pick the first non-viewer, non-introducer actor.
|
|
43
|
+
const nonViewerNonIntroducerActors = opp.actors.filter((a) => a.userId !== userId && a.role !== 'introducer');
|
|
44
|
+
const candidateActor = viewerIsIntroducer
|
|
45
|
+
? (nonViewerNonIntroducerActors.find((a) => a.role === 'agent') ?? nonViewerNonIntroducerActors[0])
|
|
46
|
+
: nonViewerNonIntroducerActors[0];
|
|
47
|
+
const candidateUserId = candidateActor?.userId ?? "";
|
|
48
|
+
const viewerActor = opp.actors.find((a) => a.userId === userId);
|
|
49
|
+
const [profile, candidateUser] = candidateUserId
|
|
50
|
+
? await Promise.all([database.getProfile(candidateUserId), database.getUser(candidateUserId)])
|
|
51
|
+
: [null, null];
|
|
52
|
+
// Skip soft-deleted users (deletedAt is set)
|
|
53
|
+
if (candidateUser && 'deletedAt' in candidateUser && candidateUser.deletedAt)
|
|
54
|
+
return null;
|
|
55
|
+
// Skip non-onboarded real users (registered but haven't completed onboarding),
|
|
56
|
+
// unless this is an explicit direct-connection target (targetUserId bypass).
|
|
57
|
+
const isDirectTarget = targetUserId && candidateUserId === targetUserId;
|
|
58
|
+
if (candidateUser && !candidateUser.isGhost && !candidateUser.onboarding?.completedAt && !isDirectTarget)
|
|
59
|
+
return null;
|
|
60
|
+
const confidence = typeof opp.interpretation?.confidence === "number"
|
|
61
|
+
? opp.interpretation.confidence
|
|
62
|
+
: parseFloat(String(opp.interpretation?.confidence ?? 0)) || 0;
|
|
63
|
+
return {
|
|
64
|
+
opportunity: opp,
|
|
65
|
+
candidateUserId,
|
|
66
|
+
viewerRole: viewerActor?.role ?? "party",
|
|
67
|
+
profile,
|
|
68
|
+
confidence,
|
|
69
|
+
};
|
|
70
|
+
}));
|
|
71
|
+
const baseEnriched = baseEnrichedRaw.filter((item) => item !== null);
|
|
72
|
+
debugSteps.push({
|
|
73
|
+
step: "enrich_profiles",
|
|
74
|
+
detail: `${baseEnriched.length} profile(s)`,
|
|
75
|
+
});
|
|
76
|
+
// Batch-fetch user records (candidates, introducers, and other party actors) for name/avatar fallback.
|
|
77
|
+
const allActorUserIds = new Set();
|
|
78
|
+
for (const item of baseEnriched) {
|
|
79
|
+
for (const actor of item.opportunity.actors) {
|
|
80
|
+
if (actor.userId && actor.userId !== userId) {
|
|
81
|
+
allActorUserIds.add(actor.userId);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const candidateUserIds = [...allActorUserIds];
|
|
86
|
+
const [viewerUser, ...userResults] = await Promise.all([
|
|
87
|
+
database.getUser(userId),
|
|
88
|
+
...candidateUserIds.map((id) => database.getUser(id)),
|
|
89
|
+
]);
|
|
90
|
+
const avatarByUserId = new Map();
|
|
91
|
+
const nameByUserId = new Map();
|
|
92
|
+
const isGhostByUserId = new Map();
|
|
93
|
+
candidateUserIds.forEach((id, i) => {
|
|
94
|
+
const user = userResults[i] ?? null;
|
|
95
|
+
avatarByUserId.set(id, user?.avatar ?? null);
|
|
96
|
+
nameByUserId.set(id, user?.name ?? null);
|
|
97
|
+
isGhostByUserId.set(id, user?.isGhost ?? false);
|
|
98
|
+
});
|
|
99
|
+
const viewerName = viewerUser?.name ?? undefined;
|
|
100
|
+
// Retry name resolution for candidates whose name is still missing.
|
|
101
|
+
// The profile or user record may not have been ready on the first fetch
|
|
102
|
+
// (e.g. profile generation still in flight). One retry covers transient gaps.
|
|
103
|
+
const missingNameIds = baseEnriched
|
|
104
|
+
.map((item) => item.candidateUserId)
|
|
105
|
+
.filter((id) => id && !nameByUserId.get(id) && !baseEnriched.find((b) => b.candidateUserId === id && b.profile?.identity?.name));
|
|
106
|
+
if (missingNameIds.length > 0) {
|
|
107
|
+
const retried = await Promise.all(missingNameIds.map(async (id) => {
|
|
108
|
+
const [profile, user] = await Promise.all([
|
|
109
|
+
database.getProfile(id),
|
|
110
|
+
database.getUser(id),
|
|
111
|
+
]);
|
|
112
|
+
return { id, profile, user };
|
|
113
|
+
}));
|
|
114
|
+
for (const r of retried) {
|
|
115
|
+
const name = r.profile?.identity?.name ?? r.user?.name ?? null;
|
|
116
|
+
if (name)
|
|
117
|
+
nameByUserId.set(r.id, name);
|
|
118
|
+
// Also update the baseEnriched profile so counterpartName picks it up
|
|
119
|
+
if (r.profile) {
|
|
120
|
+
const item = baseEnriched.find((b) => b.candidateUserId === r.id);
|
|
121
|
+
if (item && !item.profile)
|
|
122
|
+
item.profile = r.profile;
|
|
123
|
+
}
|
|
124
|
+
if (r.user?.avatar && !avatarByUserId.get(r.id)) {
|
|
125
|
+
avatarByUserId.set(r.id, r.user.avatar);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
logger.verbose("[enrichOpportunities] Retried name lookup for candidates with missing names", {
|
|
129
|
+
attempted: missingNameIds.length,
|
|
130
|
+
resolved: retried.filter((r) => r.profile?.identity?.name ?? r.user?.name).length,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
let presentations;
|
|
134
|
+
let homeCardPresentations;
|
|
135
|
+
let presenterContexts;
|
|
136
|
+
if (minimalForChat && baseEnriched.length > 0) {
|
|
137
|
+
// Minimal path: no LLM, viewer-centric card text (introduce counterpart to viewer)
|
|
138
|
+
const counterpartName = (n) => n.profile?.identity?.name ?? nameByUserId.get(n.candidateUserId) ?? "";
|
|
139
|
+
homeCardPresentations = baseEnriched.map((item) => {
|
|
140
|
+
const name = counterpartName(item)?.trim();
|
|
141
|
+
const reasoning = item.opportunity.interpretation?.reasoning ?? "";
|
|
142
|
+
const introducerName = item.opportunity.detection?.createdByName ?? undefined;
|
|
143
|
+
const viewerIsIntroducer = item.opportunity.actors.some((a) => a.role === "introducer" && a.userId === userId);
|
|
144
|
+
// For introducer view, find the second party (target user) name
|
|
145
|
+
let secondPartyName;
|
|
146
|
+
if (viewerIsIntroducer) {
|
|
147
|
+
const otherPartyActors = item.opportunity.actors.filter((a) => a.role !== "introducer" && a.userId !== item.candidateUserId);
|
|
148
|
+
if (otherPartyActors.length > 0) {
|
|
149
|
+
const otherUserId = otherPartyActors[0].userId;
|
|
150
|
+
secondPartyName = nameByUserId.get(otherUserId) ?? undefined;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const isCounterpartGhost = isGhostByUserId.get(item.candidateUserId) ?? false;
|
|
154
|
+
return {
|
|
155
|
+
headline: viewerIsIntroducer && secondPartyName
|
|
156
|
+
? `${name} → ${secondPartyName}`
|
|
157
|
+
: (name ? `Connection with ${name}` : "Suggested connection"),
|
|
158
|
+
personalizedSummary: viewerCentricCardSummary(reasoning, name, MINIMAL_MAIN_TEXT_MAX_CHARS, viewerName, introducerName),
|
|
159
|
+
suggestedAction: "Start a conversation to connect.",
|
|
160
|
+
narratorRemark: narratorRemarkFromReasoning(reasoning, name, viewerName),
|
|
161
|
+
primaryActionLabel: getPrimaryActionLabel(viewerIsIntroducer ? "introducer" : "party"),
|
|
162
|
+
secondaryActionLabel: SECONDARY_ACTION_LABEL,
|
|
163
|
+
mutualIntentsLabel: "Suggested connection",
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
presenterContexts = baseEnriched.map((item) => ({
|
|
167
|
+
introducerName: item.opportunity.detection.createdByName ?? undefined,
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
else if (presenter && baseEnriched.length > 0) {
|
|
171
|
+
try {
|
|
172
|
+
presenterContexts = await Promise.all(baseEnriched.map(({ opportunity }) => gatherPresenterContext(database, opportunity, userId)));
|
|
173
|
+
if (useHomeCardFormat) {
|
|
174
|
+
// Use full home card format with action labels, narrator remark, etc.
|
|
175
|
+
const fullContexts = presenterContexts;
|
|
176
|
+
const homeCardInputs = fullContexts.map((ctx, idx) => ({
|
|
177
|
+
...ctx,
|
|
178
|
+
mutualIntentCount: undefined,
|
|
179
|
+
opportunityStatus: baseEnriched[idx].opportunity.status,
|
|
180
|
+
}));
|
|
181
|
+
const llmResults = await presenter.presentHomeCardBatch(homeCardInputs, { concurrency: 5 });
|
|
182
|
+
// Append hardcoded button labels to LLM results
|
|
183
|
+
homeCardPresentations = llmResults.map((llm, idx) => ({
|
|
184
|
+
...llm,
|
|
185
|
+
primaryActionLabel: getPrimaryActionLabel(baseEnriched[idx].viewerRole),
|
|
186
|
+
secondaryActionLabel: SECONDARY_ACTION_LABEL,
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
// Use basic presentation format
|
|
191
|
+
presentations = await presenter.presentBatch(presenterContexts, {
|
|
192
|
+
concurrency: 5,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
logger.warn("Presenter enrichment failed during opportunity discovery; returning base results without presentations", {
|
|
198
|
+
userId,
|
|
199
|
+
opportunitiesCount: baseEnriched.length,
|
|
200
|
+
useHomeCardFormat,
|
|
201
|
+
error: error instanceof Error ? error.message : String(error),
|
|
202
|
+
});
|
|
203
|
+
presentations = undefined;
|
|
204
|
+
homeCardPresentations = undefined;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const enriched = baseEnriched.map((item, idx) => {
|
|
208
|
+
const homeCard = homeCardPresentations?.[idx];
|
|
209
|
+
const ctx = presenterContexts?.[idx];
|
|
210
|
+
// Build narrator chip for home card format
|
|
211
|
+
let narratorChip;
|
|
212
|
+
if (homeCard) {
|
|
213
|
+
const viewerIsIntroducer = item.opportunity.actors.some((a) => a.role === "introducer" && a.userId === userId);
|
|
214
|
+
if (viewerIsIntroducer) {
|
|
215
|
+
narratorChip = {
|
|
216
|
+
name: "You",
|
|
217
|
+
text: homeCard.narratorRemark,
|
|
218
|
+
userId: userId,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
const introducerActor = item.opportunity.actors.find((a) => a.role === "introducer" && a.userId !== userId);
|
|
223
|
+
if (introducerActor) {
|
|
224
|
+
const introducerName = ctx?.introducerName ??
|
|
225
|
+
nameByUserId.get(introducerActor.userId) ??
|
|
226
|
+
"Someone";
|
|
227
|
+
narratorChip = {
|
|
228
|
+
name: introducerName,
|
|
229
|
+
text: homeCard.narratorRemark,
|
|
230
|
+
userId: introducerActor.userId,
|
|
231
|
+
avatar: avatarByUserId.get(introducerActor.userId) ?? null,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
narratorChip = {
|
|
236
|
+
name: "Index",
|
|
237
|
+
text: homeCard.narratorRemark,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const isGhost = isGhostByUserId.get(item.candidateUserId) ?? false;
|
|
243
|
+
// Build secondParty for introducer view (the other non-introducer party)
|
|
244
|
+
let secondParty;
|
|
245
|
+
const viewerIsIntroducerForCard = item.opportunity.actors.some((a) => a.role === "introducer" && a.userId === userId);
|
|
246
|
+
if (viewerIsIntroducerForCard) {
|
|
247
|
+
const otherPartyActor = item.opportunity.actors.find((a) => a.role !== "introducer" && a.userId !== item.candidateUserId);
|
|
248
|
+
if (otherPartyActor) {
|
|
249
|
+
const otherName = nameByUserId.get(otherPartyActor.userId) ?? undefined;
|
|
250
|
+
if (otherName) {
|
|
251
|
+
secondParty = {
|
|
252
|
+
name: otherName,
|
|
253
|
+
avatar: avatarByUserId.get(otherPartyActor.userId) ?? null,
|
|
254
|
+
userId: otherPartyActor.userId,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
opportunityId: item.opportunity.id,
|
|
261
|
+
userId: item.candidateUserId,
|
|
262
|
+
name: item.profile?.identity?.name ?? nameByUserId.get(item.candidateUserId) ?? undefined,
|
|
263
|
+
avatar: avatarByUserId.get(item.candidateUserId) ?? null,
|
|
264
|
+
bio: truncateForChat(item.profile?.identity?.bio),
|
|
265
|
+
matchReason: truncateForChat(item.opportunity.interpretation?.reasoning ?? "") ?? "",
|
|
266
|
+
score: item.confidence,
|
|
267
|
+
status: chatSessionId && !existingOpportunityIds?.has(item.opportunity.id) ? "draft" : item.opportunity.status,
|
|
268
|
+
viewerRole: item.viewerRole,
|
|
269
|
+
isGhost,
|
|
270
|
+
...(presentations?.[idx] && { presentation: presentations[idx] }),
|
|
271
|
+
...(homeCard && {
|
|
272
|
+
homeCardPresentation: homeCard,
|
|
273
|
+
}),
|
|
274
|
+
...(narratorChip && { narratorChip }),
|
|
275
|
+
...(secondParty && { secondParty }),
|
|
276
|
+
};
|
|
277
|
+
});
|
|
278
|
+
debugSteps.push({
|
|
279
|
+
step: "format_cards",
|
|
280
|
+
detail: `${enriched.length} card(s)`,
|
|
281
|
+
});
|
|
282
|
+
return enriched;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Run discovery from an ad-hoc query (e.g. "find me a mentor", "who needs a React developer").
|
|
286
|
+
* The HyDE graph's LensInferrer automatically infers search lenses from the query.
|
|
287
|
+
* Invokes the opportunity graph and returns formatted candidates suitable for chat display.
|
|
288
|
+
*/
|
|
289
|
+
export async function runDiscoverFromQuery(input) {
|
|
290
|
+
const { opportunityGraph, database, userId, query, indexScope, limit = 5, triggerIntentId, targetUserId, onBehalfOfUserId, chatSessionId, } = input;
|
|
291
|
+
if (indexScope.length === 0) {
|
|
292
|
+
return {
|
|
293
|
+
found: false,
|
|
294
|
+
count: 0,
|
|
295
|
+
message: "You need to join at least one index (community) to discover opportunities. Use read_indexes to see available indexes, or create one.",
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
const debugSteps = [];
|
|
299
|
+
// When query is empty, the opportunity graph uses the user's intents in scope (indexedIntents[0].payload)
|
|
300
|
+
// Lens inference is handled automatically by the HyDE graph's LensInferrer
|
|
301
|
+
const queryOrEmpty = query?.trim() ?? "";
|
|
302
|
+
const options = {
|
|
303
|
+
limit,
|
|
304
|
+
initialStatus: chatSessionId ? "draft" : "latent",
|
|
305
|
+
...(chatSessionId ? { conversationId: chatSessionId } : {}),
|
|
306
|
+
};
|
|
307
|
+
return withCallLogging(logger, "runDiscoverFromQuery", {
|
|
308
|
+
userId,
|
|
309
|
+
queryPreview: queryOrEmpty
|
|
310
|
+
? queryOrEmpty.substring(0, 50)
|
|
311
|
+
: "(using user intents in scope)",
|
|
312
|
+
indexScopeCount: indexScope.length,
|
|
313
|
+
limit,
|
|
314
|
+
}, async () => {
|
|
315
|
+
const result = await opportunityGraph.invoke({
|
|
316
|
+
userId,
|
|
317
|
+
searchQuery: queryOrEmpty || undefined,
|
|
318
|
+
indexId: indexScope.length === 1 ? indexScope[0] : undefined,
|
|
319
|
+
triggerIntentId,
|
|
320
|
+
targetUserId,
|
|
321
|
+
onBehalfOfUserId,
|
|
322
|
+
options,
|
|
323
|
+
});
|
|
324
|
+
// Extract trace from graph and append to debugSteps
|
|
325
|
+
const graphTrace = Array.isArray(result.trace) ? result.trace : [];
|
|
326
|
+
for (const t of graphTrace) {
|
|
327
|
+
debugSteps.push({
|
|
328
|
+
step: t.node,
|
|
329
|
+
detail: t.detail,
|
|
330
|
+
...(t.data ? { data: t.data } : {}),
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
// Bail early if the graph returned an error
|
|
334
|
+
if (result.error) {
|
|
335
|
+
logger.warn("runDiscoverFromQuery graph returned error", { error: result.error });
|
|
336
|
+
return {
|
|
337
|
+
found: false,
|
|
338
|
+
count: 0,
|
|
339
|
+
message: "Failed to find opportunities. Please try again.",
|
|
340
|
+
debugSteps,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
// Cache remaining candidates for pagination
|
|
344
|
+
let pagination;
|
|
345
|
+
const remainingCandidates = result.remainingCandidates || [];
|
|
346
|
+
if (remainingCandidates.length > 0 && input.cache) {
|
|
347
|
+
try {
|
|
348
|
+
const discoveryId = crypto.randomUUID();
|
|
349
|
+
const cacheKey = `discovery:${userId}:${discoveryId}`;
|
|
350
|
+
await input.cache.set(cacheKey, {
|
|
351
|
+
candidates: remainingCandidates,
|
|
352
|
+
userId,
|
|
353
|
+
onBehalfOfUserId,
|
|
354
|
+
query: queryOrEmpty,
|
|
355
|
+
indexScope,
|
|
356
|
+
options,
|
|
357
|
+
}, { ttl: 1800 }); // 30 minutes
|
|
358
|
+
pagination = {
|
|
359
|
+
discoveryId,
|
|
360
|
+
evaluated: (result.candidates?.length ?? 0) - remainingCandidates.length,
|
|
361
|
+
remaining: remainingCandidates.length,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
catch (cacheErr) {
|
|
365
|
+
logger.warn("Failed to cache discovery pagination", {
|
|
366
|
+
userId,
|
|
367
|
+
error: cacheErr instanceof Error ? cacheErr.message : String(cacheErr),
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (result.createIntentSuggested && result.suggestedIntentDescription) {
|
|
372
|
+
if (chatSessionId) {
|
|
373
|
+
return {
|
|
374
|
+
found: false,
|
|
375
|
+
count: 0,
|
|
376
|
+
message: "No matching opportunities found. Try a different query.",
|
|
377
|
+
pagination,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
found: false,
|
|
382
|
+
count: 0,
|
|
383
|
+
createIntentSuggested: true,
|
|
384
|
+
suggestedIntentDescription: result.suggestedIntentDescription,
|
|
385
|
+
message: "No matching opportunities; add an intent with the suggested description to improve discovery.",
|
|
386
|
+
debugSteps,
|
|
387
|
+
pagination,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
let opportunities = Array.isArray(result.opportunities)
|
|
391
|
+
? result.opportunities
|
|
392
|
+
: [];
|
|
393
|
+
let existingOpportunityIds;
|
|
394
|
+
const rawExistingBetweenActors = Array.isArray(result.existingBetweenActors)
|
|
395
|
+
? result.existingBetweenActors
|
|
396
|
+
: [];
|
|
397
|
+
// Enrich existing-between-actors with names so the tool can say "You already have a connection with X (pending)."
|
|
398
|
+
const existingConnections = await Promise.all(rawExistingBetweenActors.map(async (item) => {
|
|
399
|
+
const user = await database.getUser(item.candidateUserId);
|
|
400
|
+
return {
|
|
401
|
+
userId: item.candidateUserId,
|
|
402
|
+
name: user?.name ?? "Someone",
|
|
403
|
+
...(item.existingStatus ? { status: item.existingStatus } : {}),
|
|
404
|
+
...(item.existingOpportunityId ? { opportunityId: item.existingOpportunityId } : {}),
|
|
405
|
+
};
|
|
406
|
+
}));
|
|
407
|
+
if (existingConnections.length > 0) {
|
|
408
|
+
logger.verbose("[runDiscoverFromQuery] Skipped duplicates; existing connections", {
|
|
409
|
+
count: existingConnections.length,
|
|
410
|
+
userIds: existingConnections.map((c) => c.userId),
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
// Only expose existing connections as cards when status is in EXISTING_CONNECTION_CARD_STATUSES (draft, latent, pending); others are mention-only.
|
|
414
|
+
const existingConnectionsForCards = existingConnections.filter((c) => c.status != null && EXISTING_CONNECTION_CARD_STATUSES.includes(c.status));
|
|
415
|
+
// Fetch full opportunity data for existing connections that should be shown as cards
|
|
416
|
+
// and merge them with the newly created opportunities
|
|
417
|
+
if (existingConnectionsForCards.length > 0) {
|
|
418
|
+
const existingOpps = await Promise.all(existingConnectionsForCards
|
|
419
|
+
.filter((c) => c.opportunityId)
|
|
420
|
+
.map((c) => database.getOpportunity(c.opportunityId)));
|
|
421
|
+
const validExistingOpps = existingOpps.filter((o) => o != null);
|
|
422
|
+
if (validExistingOpps.length > 0) {
|
|
423
|
+
logger.verbose("[runDiscoverFromQuery] Including existing opportunities as cards", {
|
|
424
|
+
count: validExistingOpps.length,
|
|
425
|
+
ids: validExistingOpps.map((o) => o.id),
|
|
426
|
+
});
|
|
427
|
+
existingOpportunityIds = new Set(validExistingOpps.map((o) => o.id));
|
|
428
|
+
opportunities = [...opportunities, ...validExistingOpps];
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// Chat discovery: when we have chatSessionId we just invoked the graph; all result.opportunities
|
|
432
|
+
// were created in this call and belong to this session. Do not filter by status: the enricher
|
|
433
|
+
// may set status to pending/latent when merging with related opportunities, so filtering to
|
|
434
|
+
// "draft" would incorrectly drop them.
|
|
435
|
+
if (chatSessionId && (result.opportunities?.length ?? 0) > 0) {
|
|
436
|
+
logger.verbose("[runDiscoverFromQuery] Chat session opportunities from graph", {
|
|
437
|
+
count: opportunities.length,
|
|
438
|
+
statuses: opportunities.map((o) => o.status),
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
debugSteps.push({
|
|
442
|
+
step: "opportunity_graph",
|
|
443
|
+
detail: `${opportunities.length} opportunity(ies)${existingConnections.length > 0 ? `, ${existingConnections.length} existing` : ""}`,
|
|
444
|
+
});
|
|
445
|
+
if (opportunities.length === 0) {
|
|
446
|
+
if (existingConnections.length > 0) {
|
|
447
|
+
return {
|
|
448
|
+
found: true,
|
|
449
|
+
count: 0,
|
|
450
|
+
message: "No new opportunities created; you already have a connection with: " +
|
|
451
|
+
existingConnections.map((c) => `${c.name}${c.status ? ` (${c.status})` : ""}`).join(", ") +
|
|
452
|
+
". View on your home page.",
|
|
453
|
+
existingConnections: existingConnectionsForCards,
|
|
454
|
+
existingConnectionsForMention: existingConnections,
|
|
455
|
+
debugSteps,
|
|
456
|
+
pagination,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
found: false,
|
|
461
|
+
count: 0,
|
|
462
|
+
message: "No matching opportunities found. Try a different query or create intents to improve matching.",
|
|
463
|
+
debugSteps,
|
|
464
|
+
pagination,
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
const enriched = await enrichOpportunities({
|
|
468
|
+
opportunities,
|
|
469
|
+
database,
|
|
470
|
+
userId,
|
|
471
|
+
chatSessionId,
|
|
472
|
+
minimalForChat: input.minimalForChat,
|
|
473
|
+
presenter: input.presenter,
|
|
474
|
+
useHomeCardFormat: input.useHomeCardFormat,
|
|
475
|
+
debugSteps,
|
|
476
|
+
existingOpportunityIds,
|
|
477
|
+
targetUserId,
|
|
478
|
+
});
|
|
479
|
+
return {
|
|
480
|
+
found: true,
|
|
481
|
+
count: enriched.length,
|
|
482
|
+
opportunities: enriched,
|
|
483
|
+
...(existingConnectionsForCards.length > 0 ? { existingConnections: existingConnectionsForCards } : {}),
|
|
484
|
+
...(existingConnections.length > 0 ? { existingConnectionsForMention: existingConnections } : {}),
|
|
485
|
+
debugSteps,
|
|
486
|
+
pagination,
|
|
487
|
+
};
|
|
488
|
+
}, { context: { userId }, logOutput: false }).catch((err) => {
|
|
489
|
+
return {
|
|
490
|
+
found: false,
|
|
491
|
+
count: 0,
|
|
492
|
+
message: "Failed to find opportunities. Please try again.",
|
|
493
|
+
};
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Continue a paginated discovery by evaluating the next batch of cached candidates.
|
|
498
|
+
* Loads candidates from Redis, invokes the opportunity graph in continue_discovery mode,
|
|
499
|
+
* then enriches and returns the results with updated pagination metadata.
|
|
500
|
+
*
|
|
501
|
+
* @param input - Continuation context (graph, database, cache, discoveryId, etc.).
|
|
502
|
+
* @returns Discovery result with enriched opportunities and pagination state.
|
|
503
|
+
*/
|
|
504
|
+
export async function continueDiscovery(input) {
|
|
505
|
+
const { opportunityGraph, database, cache, userId, discoveryId, expectedIndexId, limit = 20, chatSessionId, } = input;
|
|
506
|
+
const cacheKey = `discovery:${userId}:${discoveryId}`;
|
|
507
|
+
const cached = await cache.get(cacheKey);
|
|
508
|
+
if (!cached) {
|
|
509
|
+
return {
|
|
510
|
+
found: false,
|
|
511
|
+
count: 0,
|
|
512
|
+
message: "Discovery session expired or not found. Please start a new search.",
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
// Validate that the cached session's scope matches the current chat context
|
|
516
|
+
if (expectedIndexId && !cached.indexScope.includes(expectedIndexId)) {
|
|
517
|
+
return {
|
|
518
|
+
found: false,
|
|
519
|
+
count: 0,
|
|
520
|
+
message: "Discovery session was created in a different context. Please start a new search.",
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
const debugSteps = [];
|
|
524
|
+
const result = await opportunityGraph.invoke({
|
|
525
|
+
userId,
|
|
526
|
+
searchQuery: cached.query || undefined,
|
|
527
|
+
candidates: cached.candidates,
|
|
528
|
+
operationMode: 'continue_discovery',
|
|
529
|
+
onBehalfOfUserId: cached.onBehalfOfUserId,
|
|
530
|
+
options: {
|
|
531
|
+
...cached.options,
|
|
532
|
+
limit,
|
|
533
|
+
...(chatSessionId ? { conversationId: chatSessionId } : {}),
|
|
534
|
+
},
|
|
535
|
+
});
|
|
536
|
+
// Extract trace from graph and append to debugSteps
|
|
537
|
+
const graphTrace = result.trace || [];
|
|
538
|
+
for (const t of graphTrace) {
|
|
539
|
+
debugSteps.push({
|
|
540
|
+
step: t.node,
|
|
541
|
+
detail: t.detail,
|
|
542
|
+
...(t.data ? { data: t.data } : {}),
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
// Bail early if the graph returned an error
|
|
546
|
+
if (result.error) {
|
|
547
|
+
logger.warn("continueDiscovery graph returned error", { error: result.error });
|
|
548
|
+
return {
|
|
549
|
+
found: false,
|
|
550
|
+
count: 0,
|
|
551
|
+
message: "Discovery continuation failed. Please start a new search.",
|
|
552
|
+
debugSteps,
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
// Update cache with remaining candidates or delete if exhausted
|
|
556
|
+
const remaining = result.remainingCandidates || [];
|
|
557
|
+
let pagination;
|
|
558
|
+
try {
|
|
559
|
+
if (remaining.length > 0) {
|
|
560
|
+
await cache.set(cacheKey, {
|
|
561
|
+
...cached,
|
|
562
|
+
candidates: remaining,
|
|
563
|
+
}, { ttl: 1800 });
|
|
564
|
+
pagination = {
|
|
565
|
+
discoveryId,
|
|
566
|
+
evaluated: cached.candidates.length - remaining.length,
|
|
567
|
+
remaining: remaining.length,
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
await cache.delete(cacheKey);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
catch (cacheErr) {
|
|
575
|
+
logger.warn("Failed to update discovery pagination cache", {
|
|
576
|
+
userId,
|
|
577
|
+
discoveryId,
|
|
578
|
+
error: cacheErr instanceof Error ? cacheErr.message : String(cacheErr),
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
// Check for opportunities in result
|
|
582
|
+
const opportunities = Array.isArray(result.opportunities) ? result.opportunities : [];
|
|
583
|
+
if (opportunities.length === 0) {
|
|
584
|
+
return {
|
|
585
|
+
found: false,
|
|
586
|
+
count: 0,
|
|
587
|
+
message: "No more matching opportunities found in the remaining candidates.",
|
|
588
|
+
debugSteps,
|
|
589
|
+
pagination,
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
const enriched = await enrichOpportunities({
|
|
593
|
+
opportunities,
|
|
594
|
+
database,
|
|
595
|
+
userId,
|
|
596
|
+
chatSessionId,
|
|
597
|
+
minimalForChat: input.minimalForChat,
|
|
598
|
+
presenter: input.presenter,
|
|
599
|
+
useHomeCardFormat: input.useHomeCardFormat,
|
|
600
|
+
debugSteps,
|
|
601
|
+
});
|
|
602
|
+
return {
|
|
603
|
+
found: true,
|
|
604
|
+
count: enriched.length,
|
|
605
|
+
opportunities: enriched,
|
|
606
|
+
debugSteps,
|
|
607
|
+
pagination,
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
//# sourceMappingURL=opportunity.discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opportunity.discover.js","sourceRoot":"","sources":["../../src/support/opportunity.discover.ts"],"names":[],"mappings":"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"}
|