@indexnetwork/protocol 1.26.1-rc.218.1 → 1.26.1-rc.220.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/opportunity/opportunity.graph.d.ts.map +1 -1
- package/dist/opportunity/opportunity.graph.js +62 -30
- package/dist/opportunity/opportunity.graph.js.map +1 -1
- package/dist/opportunity/opportunity.tools.d.ts +0 -2
- package/dist/opportunity/opportunity.tools.d.ts.map +1 -1
- package/dist/opportunity/opportunity.tools.js +0 -10
- package/dist/opportunity/opportunity.tools.js.map +1 -1
- package/dist/shared/interfaces/database.interface.d.ts +30 -2
- package/dist/shared/interfaces/database.interface.d.ts.map +1 -1
- package/dist/shared/interfaces/database.interface.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opportunity.graph.d.ts","sourceRoot":"/","sources":["opportunity/opportunity.graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,4CAA4C,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,KAAK,gBAAgB,EAErB,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAK3F,yDAAyD;AACzD,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,CAAC,EAAE,CACP,oBAAoB,EAAE,MAAM,EAC5B,UAAU,EAAE,gBAAgB,EAAE,EAC9B,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC3B,OAAO,CAAC,KAAK,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;KAC3C,CAAC,CAAC,CAAC;IACJ,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,KAAK,CAAC;QAC5F,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC,CAAC;KACjG,CAAC,CAAC,CAAC;CACL,CAAC;AACF,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,4CAA4C,CAAC;AAC1F,OAAO,KAAK,EAEV,WAAW,EAGZ,MAAM,4CAA4C,CAAC;AAUpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oDAAoD,CAAC;
|
|
1
|
+
{"version":3,"file":"opportunity.graph.d.ts","sourceRoot":"/","sources":["opportunity/opportunity.graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,18 @@ import { requestContext } from "../shared/observability/request-context.js";
|
|
|
30
30
|
const logger = protocolLogger('OpportunityGraph');
|
|
31
31
|
/** Time window for persist-node dedup. Parallel jobs arrive within seconds; 10 min catches those while allowing new opportunities for long-connected pairs. */
|
|
32
32
|
const DEDUP_WINDOW_MS = 10 * 60 * 1000;
|
|
33
|
+
/** Default cap for source premises used by premise-to-premise discovery. Prevents BACKEND-5-style fan-out. */
|
|
34
|
+
const DEFAULT_SOURCE_PREMISE_DISCOVERY_LIMIT = 40;
|
|
35
|
+
/** Per-source cap for candidate premise matches. */
|
|
36
|
+
const PREMISE_MATCH_LIMIT_PER_SOURCE = 20;
|
|
37
|
+
/** Resolve the source premise discovery cap from env, preserving 0 as an explicit disable switch. */
|
|
38
|
+
function getSourcePremiseDiscoveryLimit() {
|
|
39
|
+
const raw = process.env.DISCOVERY_SOURCE_PREMISE_LIMIT;
|
|
40
|
+
if (raw === undefined || raw.trim() === '')
|
|
41
|
+
return DEFAULT_SOURCE_PREMISE_DISCOVERY_LIMIT;
|
|
42
|
+
const parsed = Number.parseInt(raw, 10);
|
|
43
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : DEFAULT_SOURCE_PREMISE_DISCOVERY_LIMIT;
|
|
44
|
+
}
|
|
33
45
|
/**
|
|
34
46
|
* Builds a compact text summary of the discoverer's profile and active intents
|
|
35
47
|
* for use as profileContext in HyDE generation.
|
|
@@ -174,10 +186,9 @@ export class OpportunityGraphFactory {
|
|
|
174
186
|
};
|
|
175
187
|
}
|
|
176
188
|
const discoveryUserId = state.onBehalfOfUserId ?? state.userId;
|
|
177
|
-
const [intents, profile
|
|
189
|
+
const [intents, profile] = await Promise.all([
|
|
178
190
|
this.database.getActiveIntents(discoveryUserId),
|
|
179
191
|
this.database.getProfile(discoveryUserId),
|
|
180
|
-
this.database.getPremisesForUser(discoveryUserId, 'ACTIVE'),
|
|
181
192
|
]);
|
|
182
193
|
const indexedIntents = intents.map((intent) => ({
|
|
183
194
|
intentId: intent.id,
|
|
@@ -192,12 +203,11 @@ export class OpportunityGraphFactory {
|
|
|
192
203
|
attributes: profile.attributes ?? undefined,
|
|
193
204
|
}
|
|
194
205
|
: null;
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}));
|
|
206
|
+
// Source premises are loaded after scope is resolved so premise discovery
|
|
207
|
+
// only uses premises assigned to the target network(s), and only up to
|
|
208
|
+
// DISCOVERY_SOURCE_PREMISE_LIMIT. Loading all premises here caused
|
|
209
|
+
// BACKEND-5: thousands of parallel vector searches for premise-rich users.
|
|
210
|
+
const sourcePremises = [];
|
|
201
211
|
const contextToIntentEnabled = process.env.DISCOVERY_CONTEXT_TO_INTENT !== '0';
|
|
202
212
|
const rawContexts = contextToIntentEnabled
|
|
203
213
|
? await this.database.getUserContexts(discoveryUserId)
|
|
@@ -217,7 +227,7 @@ export class OpportunityGraphFactory {
|
|
|
217
227
|
sourceContexts,
|
|
218
228
|
trace: [{
|
|
219
229
|
node: "prep",
|
|
220
|
-
detail: `${userNetworkIds.length} network(s), ${intents.length} intent(s),
|
|
230
|
+
detail: `${userNetworkIds.length} network(s), ${intents.length} intent(s), premise discovery deferred, ${sourceContexts.length} context(s), ${profile ? 'profile loaded' : 'no profile'}`,
|
|
221
231
|
}],
|
|
222
232
|
};
|
|
223
233
|
}, { context: { userId: state.userId }, logOutput: true }).catch((error) => {
|
|
@@ -804,34 +814,55 @@ export class OpportunityGraphFactory {
|
|
|
804
814
|
* scoped to target networks. Additive — merges into existing candidates.
|
|
805
815
|
*/
|
|
806
816
|
async function runPremiseDiscovery() {
|
|
807
|
-
if (!state.sourcePremises?.length)
|
|
808
|
-
return [];
|
|
809
817
|
const targetNetworkIds = state.targetNetworks.map(t => t.networkId);
|
|
810
818
|
if (targetNetworkIds.length === 0)
|
|
811
819
|
return [];
|
|
820
|
+
const sourceLimit = getSourcePremiseDiscoveryLimit();
|
|
821
|
+
if (sourceLimit === 0) {
|
|
822
|
+
logger.verbose('[Graph:Discovery] runPremiseDiscovery disabled by DISCOVERY_SOURCE_PREMISE_LIMIT=0');
|
|
823
|
+
return [];
|
|
824
|
+
}
|
|
825
|
+
const sourcePremisesFromDb = self.database.getPremisesForUserInNetworks
|
|
826
|
+
? await self.database.getPremisesForUserInNetworks(discoveryUserId, targetNetworkIds, 'ACTIVE', sourceLimit)
|
|
827
|
+
: await self.database.getPremisesForUser(discoveryUserId, 'ACTIVE');
|
|
828
|
+
const sourcePremises = (sourcePremisesFromDb.length > 0
|
|
829
|
+
? sourcePremisesFromDb
|
|
830
|
+
.filter(p => p.embedding && p.embedding.length > 0)
|
|
831
|
+
.slice(0, sourceLimit)
|
|
832
|
+
.map(p => ({ premiseId: p.id, embedding: p.embedding }))
|
|
833
|
+
: (state.sourcePremises ?? []).slice(0, sourceLimit));
|
|
834
|
+
if (sourcePremises.length === 0)
|
|
835
|
+
return [];
|
|
812
836
|
logger.verbose('[Graph:Discovery] runPremiseDiscovery start', {
|
|
813
|
-
premiseCount:
|
|
837
|
+
premiseCount: sourcePremises.length,
|
|
838
|
+
sourceLimit,
|
|
814
839
|
targetNetworks: targetNetworkIds.length,
|
|
840
|
+
batched: !!self.database.searchPremisesBySimilarityBatch,
|
|
815
841
|
});
|
|
816
|
-
const
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
842
|
+
const rawResults = self.database.searchPremisesBySimilarityBatch
|
|
843
|
+
? await self.database.searchPremisesBySimilarityBatch({
|
|
844
|
+
sources: sourcePremises,
|
|
845
|
+
networkIds: targetNetworkIds,
|
|
846
|
+
excludeUserId: discoveryUserId,
|
|
847
|
+
limitPerSource: PREMISE_MATCH_LIMIT_PER_SOURCE,
|
|
848
|
+
})
|
|
849
|
+
: (await Promise.all(sourcePremises.map(sp => self.database.searchPremisesBySimilarity({
|
|
850
|
+
embedding: sp.embedding,
|
|
851
|
+
networkIds: targetNetworkIds,
|
|
852
|
+
excludeUserId: discoveryUserId,
|
|
853
|
+
limit: PREMISE_MATCH_LIMIT_PER_SOURCE,
|
|
854
|
+
})))).flat();
|
|
822
855
|
const premiseCandidates = [];
|
|
823
|
-
for (const
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
});
|
|
834
|
-
}
|
|
856
|
+
for (const r of rawResults) {
|
|
857
|
+
premiseCandidates.push({
|
|
858
|
+
candidateUserId: r.userId,
|
|
859
|
+
candidatePremiseId: r.premiseId,
|
|
860
|
+
networkId: r.networkId,
|
|
861
|
+
similarity: typeof r.similarity === 'number' ? r.similarity : parseFloat(String(r.similarity)),
|
|
862
|
+
lens: 'premise_match',
|
|
863
|
+
candidatePayload: r.assertionText ?? '',
|
|
864
|
+
discoverySource: 'premise-similarity',
|
|
865
|
+
});
|
|
835
866
|
}
|
|
836
867
|
// Dedup by userId + premiseId + networkId (a premise can appear in multiple networks)
|
|
837
868
|
const byKey = new Map();
|
|
@@ -843,6 +874,7 @@ export class OpportunityGraphFactory {
|
|
|
843
874
|
}
|
|
844
875
|
const deduped = Array.from(byKey.values());
|
|
845
876
|
logger.verbose('[Graph:Discovery] runPremiseDiscovery complete', {
|
|
877
|
+
sourcePremiseCount: sourcePremises.length,
|
|
846
878
|
rawCount: premiseCandidates.length,
|
|
847
879
|
dedupedCount: deduped.length,
|
|
848
880
|
});
|