@indexnetwork/protocol 1.10.0-rc.155.1 → 1.10.0-rc.158.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/intent/intent.graph.d.ts.map +1 -1
  2. package/dist/intent/intent.graph.js +19 -11
  3. package/dist/intent/intent.graph.js.map +1 -1
  4. package/dist/negotiation/negotiation.graph.d.ts.map +1 -1
  5. package/dist/negotiation/negotiation.graph.js +3 -2
  6. package/dist/negotiation/negotiation.graph.js.map +1 -1
  7. package/dist/opportunity/opportunity.graph.d.ts +52 -1
  8. package/dist/opportunity/opportunity.graph.d.ts.map +1 -1
  9. package/dist/opportunity/opportunity.graph.js +135 -6
  10. package/dist/opportunity/opportunity.graph.js.map +1 -1
  11. package/dist/opportunity/opportunity.presenter.d.ts +1 -1
  12. package/dist/opportunity/opportunity.presenter.d.ts.map +1 -1
  13. package/dist/opportunity/opportunity.presenter.js +45 -0
  14. package/dist/opportunity/opportunity.presenter.js.map +1 -1
  15. package/dist/opportunity/opportunity.state.d.ts +15 -2
  16. package/dist/opportunity/opportunity.state.d.ts.map +1 -1
  17. package/dist/opportunity/opportunity.state.js +5 -0
  18. package/dist/opportunity/opportunity.state.js.map +1 -1
  19. package/dist/opportunity/opportunity.utils.d.ts.map +1 -1
  20. package/dist/opportunity/opportunity.utils.js +4 -0
  21. package/dist/opportunity/opportunity.utils.js.map +1 -1
  22. package/dist/premise/premise.analyzer.d.ts.map +1 -1
  23. package/dist/premise/premise.analyzer.js +1 -1
  24. package/dist/premise/premise.analyzer.js.map +1 -1
  25. package/dist/premise/premise.indexer.d.ts.map +1 -1
  26. package/dist/premise/premise.indexer.js +1 -1
  27. package/dist/premise/premise.indexer.js.map +1 -1
  28. package/dist/premise/premise.tools.d.ts.map +1 -1
  29. package/dist/premise/premise.tools.js +32 -4
  30. package/dist/premise/premise.tools.js.map +1 -1
  31. package/dist/profile/profile.graph.d.ts +22 -5
  32. package/dist/profile/profile.graph.d.ts.map +1 -1
  33. package/dist/profile/profile.graph.js +48 -4
  34. package/dist/profile/profile.graph.js.map +1 -1
  35. package/dist/profile/profile.state.d.ts +7 -1
  36. package/dist/profile/profile.state.d.ts.map +1 -1
  37. package/dist/profile/profile.state.js +9 -0
  38. package/dist/profile/profile.state.js.map +1 -1
  39. package/dist/questioner/questioner.presets.js.map +1 -1
  40. package/dist/shared/agent/tool.factory.d.ts.map +1 -1
  41. package/dist/shared/agent/tool.factory.js +1 -0
  42. package/dist/shared/agent/tool.factory.js.map +1 -1
  43. package/dist/shared/agent/tool.helpers.d.ts +12 -0
  44. package/dist/shared/agent/tool.helpers.d.ts.map +1 -1
  45. package/dist/shared/agent/tool.helpers.js.map +1 -1
  46. package/dist/shared/hyde/hyde.strategies.d.ts +1 -1
  47. package/dist/shared/hyde/hyde.strategies.d.ts.map +1 -1
  48. package/dist/shared/hyde/hyde.strategies.js +6 -0
  49. package/dist/shared/hyde/hyde.strategies.js.map +1 -1
  50. package/dist/shared/hyde/lens.inferrer.d.ts +1 -1
  51. package/dist/shared/hyde/lens.inferrer.d.ts.map +1 -1
  52. package/dist/shared/interfaces/database.interface.d.ts +21 -3
  53. package/dist/shared/interfaces/database.interface.d.ts.map +1 -1
  54. package/dist/shared/interfaces/embedder.interface.d.ts +1 -1
  55. package/dist/shared/interfaces/embedder.interface.d.ts.map +1 -1
  56. package/package.json +1 -1
@@ -174,9 +174,10 @@ export class OpportunityGraphFactory {
174
174
  };
175
175
  }
176
176
  const discoveryUserId = state.onBehalfOfUserId ?? state.userId;
177
- const [intents, profile] = await Promise.all([
177
+ const [intents, profile, userPremises] = await Promise.all([
178
178
  this.database.getActiveIntents(discoveryUserId),
179
179
  this.database.getProfile(discoveryUserId),
180
+ this.database.getPremisesForUser(discoveryUserId, 'ACTIVE'),
180
181
  ]);
181
182
  const indexedIntents = intents.map((intent) => ({
182
183
  intentId: intent.id,
@@ -192,13 +193,20 @@ export class OpportunityGraphFactory {
192
193
  attributes: profile.attributes ?? undefined,
193
194
  }
194
195
  : null;
196
+ const sourcePremises = (userPremises ?? [])
197
+ .filter(p => p.embedding && p.embedding.length > 0)
198
+ .map(p => ({
199
+ premiseId: p.id,
200
+ embedding: p.embedding,
201
+ }));
195
202
  return {
196
203
  userNetworks: userNetworkIds,
197
204
  indexedIntents,
198
205
  sourceProfile,
206
+ sourcePremises,
199
207
  trace: [{
200
208
  node: "prep",
201
- detail: `${userNetworkIds.length} network(s), ${intents.length} intent(s), ${profile ? 'profile loaded' : 'no profile'}`,
209
+ detail: `${userNetworkIds.length} network(s), ${intents.length} intent(s), ${sourcePremises.length} premise(s), ${profile ? 'profile loaded' : 'no profile'}`,
202
210
  }],
203
211
  };
204
212
  }, { context: { userId: state.userId }, logOutput: true }).catch((error) => {
@@ -696,12 +704,30 @@ export class OpportunityGraphFactory {
696
704
  merged: merged.length,
697
705
  },
698
706
  });
699
- return { candidates: filterByTarget(merged), trace: traceEntries };
707
+ const premiseCands = await runPremiseDiscovery();
708
+ const withPremises = mergePremiseCandidates(merged, premiseCands);
709
+ if (premiseCands.length > 0) {
710
+ traceEntries.push({ node: "discovery", detail: `+ Premise search → ${premiseCands.length} candidate(s), merged to ${withPremises.length}` });
711
+ }
712
+ return { candidates: filterByTarget(withPremises), trace: traceEntries };
713
+ }
714
+ const premiseCands = await runPremiseDiscovery();
715
+ const withPremises = mergePremiseCandidates(queryCandidates, premiseCands);
716
+ if (premiseCands.length > 0) {
717
+ traceEntries.push({ node: "discovery", detail: `+ Premise search → ${premiseCands.length} candidate(s), merged to ${withPremises.length}` });
700
718
  }
701
- return { candidates: filterByTarget(queryCandidates), trace: traceEntries };
719
+ return { candidates: filterByTarget(withPremises), trace: traceEntries };
702
720
  }
703
721
  // No search query - use profile embedding directly (mirror-only)
704
722
  if (!vector || vector.length === 0) {
723
+ // Still attempt premise-based discovery even without a profile vector
724
+ const premiseCands = await runPremiseDiscovery();
725
+ if (premiseCands.length > 0) {
726
+ return {
727
+ candidates: filterByTarget(premiseCands),
728
+ trace: [{ node: "discovery", detail: `No profile vector; premise search → ${premiseCands.length} candidate(s)` }],
729
+ };
730
+ }
705
731
  return { candidates: [] };
706
732
  }
707
733
  const allCandidates = [];
@@ -799,8 +825,13 @@ export class OpportunityGraphFactory {
799
825
  },
800
826
  });
801
827
  }
828
+ const premiseCands = await runPremiseDiscovery();
829
+ const withPremises = mergePremiseCandidates(candidates, premiseCands);
830
+ if (premiseCands.length > 0) {
831
+ traceEntries.push({ node: "discovery", detail: `+ Premise search → ${premiseCands.length} candidate(s), merged to ${withPremises.length}` });
832
+ }
802
833
  return {
803
- candidates: filterByTarget(candidates),
834
+ candidates: filterByTarget(withPremises),
804
835
  trace: traceEntries,
805
836
  };
806
837
  }
@@ -892,12 +923,85 @@ export class OpportunityGraphFactory {
892
923
  }
893
924
  return Array.from(byKey.values());
894
925
  }
926
+ /**
927
+ * Premise-to-premise discovery (path D).
928
+ * Searches for other users' premises similar to the discoverer's premises,
929
+ * scoped to target networks. Additive — merges into existing candidates.
930
+ */
931
+ async function runPremiseDiscovery() {
932
+ if (!state.sourcePremises?.length)
933
+ return [];
934
+ const targetNetworkIds = state.targetNetworks.map(t => t.networkId);
935
+ if (targetNetworkIds.length === 0)
936
+ return [];
937
+ logger.verbose('[Graph:Discovery] runPremiseDiscovery start', {
938
+ premiseCount: state.sourcePremises.length,
939
+ targetNetworks: targetNetworkIds.length,
940
+ });
941
+ const searchResults = await Promise.all(state.sourcePremises.map(sp => self.database.searchPremisesBySimilarity({
942
+ embedding: sp.embedding,
943
+ networkIds: targetNetworkIds,
944
+ excludeUserId: discoveryUserId,
945
+ limit: 20,
946
+ })));
947
+ const premiseCandidates = [];
948
+ for (const results of searchResults) {
949
+ for (const r of results) {
950
+ premiseCandidates.push({
951
+ candidateUserId: r.userId,
952
+ candidatePremiseId: r.premiseId,
953
+ networkId: r.networkId,
954
+ similarity: typeof r.similarity === 'number' ? r.similarity : parseFloat(String(r.similarity)),
955
+ lens: 'premise_match',
956
+ candidatePayload: r.assertionText ?? '',
957
+ discoverySource: 'premise-similarity',
958
+ });
959
+ }
960
+ }
961
+ // Dedup by userId + premiseId + networkId (a premise can appear in multiple networks)
962
+ const byKey = new Map();
963
+ for (const c of premiseCandidates) {
964
+ const key = `${c.candidateUserId}:${c.candidatePremiseId ?? 'none'}:${c.networkId}`;
965
+ if (!byKey.has(key) || c.similarity > (byKey.get(key)?.similarity ?? 0)) {
966
+ byKey.set(key, c);
967
+ }
968
+ }
969
+ const deduped = Array.from(byKey.values());
970
+ logger.verbose('[Graph:Discovery] runPremiseDiscovery complete', {
971
+ rawCount: premiseCandidates.length,
972
+ dedupedCount: deduped.length,
973
+ });
974
+ return deduped;
975
+ }
976
+ /**
977
+ * Merge premise candidates into an existing candidate list.
978
+ * Deduplicates by userId + networkId + discoverySource + entityId.
979
+ */
980
+ function mergePremiseCandidates(existing, premise) {
981
+ if (premise.length === 0)
982
+ return existing;
983
+ const merged = new Map();
984
+ for (const c of [...existing, ...premise]) {
985
+ const key = `${c.candidateUserId}:${c.networkId}:${c.discoverySource}:${c.candidateIntentId ?? c.candidatePremiseId ?? 'none'}`;
986
+ if (!merged.has(key) || c.similarity > (merged.get(key)?.similarity ?? 0)) {
987
+ merged.set(key, c);
988
+ }
989
+ }
990
+ return Array.from(merged.values());
991
+ }
895
992
  const resolvedIntent = state.resolvedTriggerIntentId
896
993
  ? state.indexedIntents.find((i) => i.intentId === state.resolvedTriggerIntentId)
897
994
  : state.indexedIntents[0];
898
995
  const searchText = state.searchQuery ?? resolvedIntent?.payload ?? '';
899
996
  if (!searchText) {
900
997
  logger.warn('[Graph:Discovery] No search text available for intent path');
998
+ const premiseCands = await runPremiseDiscovery();
999
+ if (premiseCands.length > 0) {
1000
+ return {
1001
+ candidates: filterByTarget(premiseCands),
1002
+ trace: [{ node: "discovery", detail: `No search text; premise search → ${premiseCands.length} candidate(s)` }],
1003
+ };
1004
+ }
901
1005
  return { candidates: [] };
902
1006
  }
903
1007
  const discovererContext = buildDiscovererContext(state.sourceProfile, state.indexedIntents);
@@ -914,6 +1018,14 @@ export class OpportunityGraphFactory {
914
1018
  const hydeEmbeddings = hydeResult.hydeEmbeddings;
915
1019
  const lenses = hydeResult.lenses ?? [];
916
1020
  if (!hydeEmbeddings || Object.keys(hydeEmbeddings).length === 0) {
1021
+ const premiseCands = await runPremiseDiscovery();
1022
+ if (premiseCands.length > 0) {
1023
+ return {
1024
+ hydeEmbeddings: {},
1025
+ candidates: filterByTarget(premiseCands),
1026
+ trace: [{ node: "discovery", detail: `No HyDE embeddings; premise search → ${premiseCands.length} candidate(s)` }],
1027
+ };
1028
+ }
917
1029
  return { hydeEmbeddings: {}, candidates: [] };
918
1030
  }
919
1031
  const lensMap = new Map(lenses.map(l => [l.label, l]));
@@ -1039,9 +1151,14 @@ export class OpportunityGraphFactory {
1039
1151
  },
1040
1152
  });
1041
1153
  }
1154
+ const premiseCands = await runPremiseDiscovery();
1155
+ const withPremises = mergePremiseCandidates(candidates, premiseCands);
1156
+ if (premiseCands.length > 0) {
1157
+ traceEntries.push({ node: "discovery", detail: `+ Premise search → ${premiseCands.length} candidate(s), merged to ${withPremises.length}` });
1158
+ }
1042
1159
  return {
1043
1160
  hydeEmbeddings: hydeEmbeddings,
1044
- candidates: filterByTarget(candidates),
1161
+ candidates: filterByTarget(withPremises),
1045
1162
  trace: traceEntries,
1046
1163
  };
1047
1164
  }
@@ -2326,11 +2443,23 @@ export class OpportunityGraphFactory {
2326
2443
  }
2327
2444
  else {
2328
2445
  // Discovery path: opportunity_graph source, no introducer, lifecycle guard for agent/patient.
2446
+ // Build premise lookup from discovery candidates for premise tracking.
2447
+ // When multiple premise candidates exist for the same user, keep the highest-similarity one.
2448
+ const premiseLookup = new Map();
2449
+ for (const c of state.candidates ?? []) {
2450
+ if (c.discoverySource === 'premise-similarity' && c.candidatePremiseId) {
2451
+ const existing = premiseLookup.get(c.candidateUserId);
2452
+ if (!existing || c.similarity > existing.similarity) {
2453
+ premiseLookup.set(c.candidateUserId, { premiseId: c.candidatePremiseId, similarity: c.similarity });
2454
+ }
2455
+ }
2456
+ }
2329
2457
  const evaluatorActors = evaluated.actors.map((a) => ({
2330
2458
  networkId: a.networkId ?? indexIdForActors,
2331
2459
  userId: a.userId,
2332
2460
  role: a.role,
2333
2461
  ...(a.intentId ? { intent: a.intentId } : {}),
2462
+ ...(premiseLookup.has(a.userId) ? { premise: premiseLookup.get(a.userId).premiseId } : {}),
2334
2463
  }));
2335
2464
  actors = evaluatorActors;
2336
2465
  const hasIntroducerActor = actors.some(a => a.role === 'introducer');