@indexnetwork/protocol 4.15.0-rc.357.1 → 4.16.1-rc.359.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 (105) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/contact/contact.inviter.d.ts.map +1 -1
  3. package/dist/contact/contact.inviter.js +12 -5
  4. package/dist/contact/contact.inviter.js.map +1 -1
  5. package/dist/index.d.ts +12 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +5 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/opportunity/delivery-card.cache.d.ts.map +1 -1
  10. package/dist/opportunity/delivery-card.cache.js +7 -3
  11. package/dist/opportunity/delivery-card.cache.js.map +1 -1
  12. package/dist/opportunity/discriminator/discriminator.adjustments.d.ts +22 -15
  13. package/dist/opportunity/discriminator/discriminator.adjustments.d.ts.map +1 -1
  14. package/dist/opportunity/discriminator/discriminator.adjustments.js +39 -20
  15. package/dist/opportunity/discriminator/discriminator.adjustments.js.map +1 -1
  16. package/dist/opportunity/feed/feed.categorizer.d.ts.map +1 -1
  17. package/dist/opportunity/feed/feed.categorizer.js +6 -0
  18. package/dist/opportunity/feed/feed.categorizer.js.map +1 -1
  19. package/dist/opportunity/feed/feed.graph.d.ts +2 -0
  20. package/dist/opportunity/feed/feed.graph.d.ts.map +1 -1
  21. package/dist/opportunity/feed/feed.graph.js +53 -28
  22. package/dist/opportunity/feed/feed.graph.js.map +1 -1
  23. package/dist/opportunity/feed/feed.state.d.ts +3 -1
  24. package/dist/opportunity/feed/feed.state.d.ts.map +1 -1
  25. package/dist/opportunity/feed/feed.state.js.map +1 -1
  26. package/dist/opportunity/opportunity.claim-safety.d.ts +25 -0
  27. package/dist/opportunity/opportunity.claim-safety.d.ts.map +1 -0
  28. package/dist/opportunity/opportunity.claim-safety.js +89 -0
  29. package/dist/opportunity/opportunity.claim-safety.js.map +1 -0
  30. package/dist/opportunity/opportunity.discover.d.ts.map +1 -1
  31. package/dist/opportunity/opportunity.discover.js +6 -1
  32. package/dist/opportunity/opportunity.discover.js.map +1 -1
  33. package/dist/opportunity/opportunity.evaluator.d.ts.map +1 -1
  34. package/dist/opportunity/opportunity.evaluator.js +13 -8
  35. package/dist/opportunity/opportunity.evaluator.js.map +1 -1
  36. package/dist/opportunity/opportunity.graph.d.ts +36 -0
  37. package/dist/opportunity/opportunity.graph.d.ts.map +1 -1
  38. package/dist/opportunity/opportunity.graph.js +177 -18
  39. package/dist/opportunity/opportunity.graph.js.map +1 -1
  40. package/dist/opportunity/opportunity.persist.d.ts +8 -1
  41. package/dist/opportunity/opportunity.persist.d.ts.map +1 -1
  42. package/dist/opportunity/opportunity.persist.js +23 -2
  43. package/dist/opportunity/opportunity.persist.js.map +1 -1
  44. package/dist/opportunity/opportunity.presentation-cache.d.ts +7 -0
  45. package/dist/opportunity/opportunity.presentation-cache.d.ts.map +1 -0
  46. package/dist/opportunity/opportunity.presentation-cache.js +15 -0
  47. package/dist/opportunity/opportunity.presentation-cache.js.map +1 -0
  48. package/dist/opportunity/opportunity.presentation.d.ts.map +1 -1
  49. package/dist/opportunity/opportunity.presentation.js +8 -5
  50. package/dist/opportunity/opportunity.presentation.js.map +1 -1
  51. package/dist/opportunity/opportunity.presenter.d.ts +4 -4
  52. package/dist/opportunity/opportunity.presenter.d.ts.map +1 -1
  53. package/dist/opportunity/opportunity.presenter.js +55 -14
  54. package/dist/opportunity/opportunity.presenter.js.map +1 -1
  55. package/dist/opportunity/opportunity.safe-presentation.d.ts +1 -1
  56. package/dist/opportunity/opportunity.safe-presentation.d.ts.map +1 -1
  57. package/dist/opportunity/opportunity.safe-presentation.js +22 -9
  58. package/dist/opportunity/opportunity.safe-presentation.js.map +1 -1
  59. package/dist/opportunity/opportunity.state.d.ts +3 -0
  60. package/dist/opportunity/opportunity.state.d.ts.map +1 -1
  61. package/dist/opportunity/opportunity.state.js.map +1 -1
  62. package/dist/opportunity/opportunity.tools.d.ts +1 -17
  63. package/dist/opportunity/opportunity.tools.d.ts.map +1 -1
  64. package/dist/opportunity/opportunity.tools.js +32 -2
  65. package/dist/opportunity/opportunity.tools.js.map +1 -1
  66. package/dist/shared/agent/model.config.d.ts +5 -0
  67. package/dist/shared/agent/model.config.d.ts.map +1 -1
  68. package/dist/shared/agent/model.config.js +1 -0
  69. package/dist/shared/agent/model.config.js.map +1 -1
  70. package/dist/shared/hyde/hyde.documents.d.ts +10 -0
  71. package/dist/shared/hyde/hyde.documents.d.ts.map +1 -0
  72. package/dist/shared/hyde/hyde.documents.js +50 -0
  73. package/dist/shared/hyde/hyde.documents.js.map +1 -0
  74. package/dist/shared/hyde/hyde.env.d.ts +9 -0
  75. package/dist/shared/hyde/hyde.env.d.ts.map +1 -0
  76. package/dist/shared/hyde/hyde.env.js +10 -0
  77. package/dist/shared/hyde/hyde.env.js.map +1 -0
  78. package/dist/shared/hyde/hyde.frame.d.ts +151 -0
  79. package/dist/shared/hyde/hyde.frame.d.ts.map +1 -0
  80. package/dist/shared/hyde/hyde.frame.js +108 -0
  81. package/dist/shared/hyde/hyde.frame.js.map +1 -0
  82. package/dist/shared/hyde/hyde.generator.d.ts +23 -11
  83. package/dist/shared/hyde/hyde.generator.d.ts.map +1 -1
  84. package/dist/shared/hyde/hyde.generator.js +50 -21
  85. package/dist/shared/hyde/hyde.generator.js.map +1 -1
  86. package/dist/shared/hyde/hyde.graph.d.ts +58 -17
  87. package/dist/shared/hyde/hyde.graph.d.ts.map +1 -1
  88. package/dist/shared/hyde/hyde.graph.js +333 -89
  89. package/dist/shared/hyde/hyde.graph.js.map +1 -1
  90. package/dist/shared/hyde/hyde.state.d.ts +19 -2
  91. package/dist/shared/hyde/hyde.state.d.ts.map +1 -1
  92. package/dist/shared/hyde/hyde.state.js +23 -3
  93. package/dist/shared/hyde/hyde.state.js.map +1 -1
  94. package/dist/shared/hyde/hyde.validator.d.ts +79 -0
  95. package/dist/shared/hyde/hyde.validator.d.ts.map +1 -0
  96. package/dist/shared/hyde/hyde.validator.js +49 -0
  97. package/dist/shared/hyde/hyde.validator.js.map +1 -0
  98. package/dist/shared/hyde/lens.inferrer.d.ts +190 -12
  99. package/dist/shared/hyde/lens.inferrer.d.ts.map +1 -1
  100. package/dist/shared/hyde/lens.inferrer.js +93 -38
  101. package/dist/shared/hyde/lens.inferrer.js.map +1 -1
  102. package/dist/shared/interfaces/database.interface.d.ts +46 -2
  103. package/dist/shared/interfaces/database.interface.d.ts.map +1 -1
  104. package/dist/shared/interfaces/database.interface.js.map +1 -1
  105. package/package.json +2 -1
@@ -7,17 +7,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- /**
11
- * HyDE Generator Agent: pure LLM agent for generating hypothetical documents
12
- * in the target corpus voice. Uses free-text lens labels instead of enum strategies.
13
- */
14
10
  import { HumanMessage, SystemMessage } from '@langchain/core/messages';
15
11
  import { z } from 'zod';
16
- import { HYDE_CORPUS_PROMPTS } from './hyde.strategies.js';
17
- import { Timed } from "../observability/performance.js";
18
- import { protocolLogger } from '../observability/protocol.logger.js';
19
12
  import { createStructuredModel } from "../agent/model.config.js";
20
13
  import { invokeWithAbortSignal } from "../agent/model-signal.js";
14
+ import { protocolLogger } from '../observability/protocol.logger.js';
15
+ import { Timed } from "../observability/performance.js";
16
+ import { HYDE_CORPUS_PROMPTS } from './hyde.strategies.js';
21
17
  const logger = protocolLogger("HydeGenerator");
22
18
  const SYSTEM_PROMPT = `You are a Hypothetical Document Generator for semantic search.
23
19
 
@@ -33,35 +29,68 @@ const responseFormat = z.object({
33
29
  .string()
34
30
  .describe('The hypothetical document text in the target voice, suitable for embedding and retrieval'),
35
31
  });
36
- /**
37
- * Generates hypothetical documents in a target corpus voice for semantic search.
38
- * Uses free-text lens labels (from LensInferrer) instead of enum strategies.
39
- */
32
+ function renderList(items) {
33
+ return items.length > 0 ? items.join('; ') : '(none)';
34
+ }
35
+ /** Build the frame-v1 generation prompt from sanitized source evidence. */
36
+ export function buildFrameHydePrompt(input) {
37
+ const { sourceText, corpus, sourceFrame } = input;
38
+ const corpusInstruction = {
39
+ profiles: 'Write a first-person professional biography in the target profile voice.',
40
+ intents: 'Write a first-person goal or aspiration in the target intent voice.',
41
+ premises: 'Write a first-person stable identity, values, or worldview statement in the target premise voice.',
42
+ }[corpus];
43
+ return `${corpusInstruction}
44
+
45
+ Source text: "${sourceText}"
46
+
47
+ Sanitized source frame:
48
+ - Source roles: ${renderList(sourceFrame.sourceRoles.map((item) => `${item.role} [evidence: "${item.evidence}"]`))}
49
+ - Counterpart/complementary roles: ${renderList(sourceFrame.counterpartRoles.map((item) => `${item.role} [evidence: "${item.evidence}"]`))}
50
+ - Explicit hard constraints: ${renderList(sourceFrame.hardConstraints.map((item) => `${item.type}: ${item.value} [evidence: "${item.evidence}"]`))}
51
+ - Named entities: ${renderList(sourceFrame.namedEntities.map((item) => `${item.type}: ${item.name} [evidence: "${item.evidence}"]`))}
52
+ - Domain vocabulary: ${renderList(sourceFrame.domainVocabulary.map((item) => `${item.term} [evidence: "${item.evidence}"]`))}
53
+
54
+ Generation constraints:
55
+ - You MAY elaborate generic roles and generic domain language.
56
+ - You MAY use reciprocal/complementary inversion and write in the target voice.
57
+ - You MUST NOT introduce any new proper noun or named entity.
58
+ - You MUST NOT introduce any new hard location, time, numeric, credential, organization, or exclusivity constraint.
59
+ - Preserve explicit source-frame constraints when they apply to the reciprocal target.
60
+ - Output only a few sentences or one short paragraph.`;
61
+ }
62
+ /** Generates hypothetical documents in a target corpus voice for semantic search. */
40
63
  export class HydeGenerator {
41
- constructor() {
42
- this.model = createStructuredModel("hydeGenerator", responseFormat, {
64
+ constructor(model) {
65
+ // Preserve the legacy production model construction path; injected models
66
+ // keep prompt tests provider-free.
67
+ this.model = model ?? createStructuredModel("hydeGenerator", responseFormat, {
43
68
  name: "hyde_generator",
44
69
  });
45
70
  }
46
- /**
47
- * Generate a hypothetical document for the given source text and lens.
48
- *
49
- * @param input - Source text, lens label, and target corpus
50
- * @returns Generated hypothetical document text
51
- */
71
+ getModel() {
72
+ this.model ?? (this.model = createStructuredModel("hydeGenerator", responseFormat, {
73
+ name: "hyde_generator",
74
+ }));
75
+ return this.model;
76
+ }
77
+ /** Generate a hypothetical document for the given source text and lens. */
52
78
  async generate(input) {
53
- const promptText = HYDE_CORPUS_PROMPTS[input.corpus](input.sourceText, input.lens);
79
+ const promptText = input.sourceFrame
80
+ ? buildFrameHydePrompt(input)
81
+ : HYDE_CORPUS_PROMPTS[input.corpus](input.sourceText, input.lens);
54
82
  const messages = [
55
83
  new SystemMessage(SYSTEM_PROMPT),
56
84
  new HumanMessage(promptText),
57
85
  ];
58
- const result = await invokeWithAbortSignal(this.model, messages);
86
+ const result = await invokeWithAbortSignal(this.getModel(), messages);
59
87
  const parsed = responseFormat.parse(result);
60
88
  const text = parsed.hypotheticalDocument ?? '';
61
89
  logger.verbose('Generated HyDE document', {
62
90
  lens: input.lens,
63
91
  corpus: input.corpus,
64
92
  textLength: text.length,
93
+ frameConstrained: !!input.sourceFrame,
65
94
  });
66
95
  return { text };
67
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hyde.generator.js","sourceRoot":"/","sources":["shared/hyde/hyde.generator.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,MAAM,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;AAE/C,MAAM,aAAa,GAAG;;;;;;;;yDAQmC,CAAC;AAE1D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,QAAQ,CAAC,0FAA0F,CAAC;CACxG,CAAC,CAAC;AAeH;;;GAGG;AACH,MAAM,OAAO,aAAa;IAA1B;QACU,UAAK,GAAG,qBAAqB,CAAC,eAAe,EAAE,cAAc,EAAE;YACrE,IAAI,EAAE,gBAAgB;SACvB,CAAC,CAAC;IA6BL,CAAC;IA3BC;;;;;OAKG;IAEG,AAAN,KAAK,CAAC,QAAQ,CAAC,KAAwB;QACrC,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEnF,MAAM,QAAQ,GAAG;YACf,IAAI,aAAa,CAAC,aAAa,CAAC;YAChC,IAAI,YAAY,CAAC,UAAU,CAAC;SAC7B,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC;QAE/C,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE;YACxC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,IAAI,CAAC,MAAM;SACxB,CAAC,CAAC;QAEH,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;CACF;AApBO;IADL,KAAK,EAAE;;;;6CAoBP","sourcesContent":["/**\n * HyDE Generator Agent: pure LLM agent for generating hypothetical documents\n * in the target corpus voice. Uses free-text lens labels instead of enum strategies.\n */\nimport { HumanMessage, SystemMessage } from '@langchain/core/messages';\nimport { z } from 'zod';\nimport { HYDE_CORPUS_PROMPTS } from './hyde.strategies.js';\nimport type { HydeTargetCorpus } from './lens.inferrer.js';\nimport { Timed } from \"../observability/performance.js\";\nimport { protocolLogger } from '../observability/protocol.logger.js';\nimport { createStructuredModel } from \"../agent/model.config.js\";\nimport { invokeWithAbortSignal } from \"../agent/model-signal.js\";\n\nconst logger = protocolLogger(\"HydeGenerator\");\n\nconst SYSTEM_PROMPT = `You are a Hypothetical Document Generator for semantic search.\n\nYour task: Given a source statement (e.g. an intent or goal), write a short hypothetical document in the voice of the TARGET side—the kind of person or statement that would be an ideal match for that source.\n\nRules:\n- Write in first person as the target.\n- Be concrete and specific so the text is good for vector similarity search.\n- Output only the hypothetical document text, no meta-commentary.\n- Keep length to a few sentences or one short paragraph.`;\n\nconst responseFormat = z.object({\n hypotheticalDocument: z\n .string()\n .describe('The hypothetical document text in the target voice, suitable for embedding and retrieval'),\n});\n\nexport interface HydeGeneratorOutput {\n text: string;\n}\n\nexport interface HydeGenerateInput {\n /** Original intent or query text. */\n sourceText: string;\n /** Free-text lens label from LensInferrer (e.g. \"crypto infra VC\"). */\n lens: string;\n /** Which corpus voice to generate in. */\n corpus: HydeTargetCorpus;\n}\n\n/**\n * Generates hypothetical documents in a target corpus voice for semantic search.\n * Uses free-text lens labels (from LensInferrer) instead of enum strategies.\n */\nexport class HydeGenerator {\n private model = createStructuredModel(\"hydeGenerator\", responseFormat, {\n name: \"hyde_generator\",\n });\n\n /**\n * Generate a hypothetical document for the given source text and lens.\n *\n * @param input - Source text, lens label, and target corpus\n * @returns Generated hypothetical document text\n */\n @Timed()\n async generate(input: HydeGenerateInput): Promise<HydeGeneratorOutput> {\n const promptText = HYDE_CORPUS_PROMPTS[input.corpus](input.sourceText, input.lens);\n\n const messages = [\n new SystemMessage(SYSTEM_PROMPT),\n new HumanMessage(promptText),\n ];\n\n const result = await invokeWithAbortSignal(this.model, messages);\n const parsed = responseFormat.parse(result);\n const text = parsed.hypotheticalDocument ?? '';\n\n logger.verbose('Generated HyDE document', {\n lens: input.lens,\n corpus: input.corpus,\n textLength: text.length,\n });\n\n return { text };\n }\n}\n"]}
1
+ {"version":3,"file":"hyde.generator.js","sourceRoot":"/","sources":["shared/hyde/hyde.generator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * HyDE Generator Agent: pure LLM agent for generating hypothetical documents\n * in the target corpus voice. Uses free-text lens labels instead of enum strategies.\n */\nimport type { BaseLanguageModelInput } from '@langchain/core/language_models/base';\nimport { HumanMessage, SystemMessage } from '@langchain/core/messages';\nimport { z } from 'zod';\n\nimport { createStructuredModel } from \"../agent/model.config.js\";\nimport { invokeWithAbortSignal } from \"../agent/model-signal.js\";\nimport { protocolLogger } from '../observability/protocol.logger.js';\nimport { Timed } from \"../observability/performance.js\";\nimport type { HydeSourceFrame } from './hyde.frame.js';\nimport { HYDE_CORPUS_PROMPTS } from './hyde.strategies.js';\nimport type { HydeTargetCorpus } from './lens.inferrer.js';\n\nconst logger = protocolLogger(\"HydeGenerator\");\n\nconst SYSTEM_PROMPT = `You are a Hypothetical Document Generator for semantic search.\n\nYour task: Given a source statement (e.g. an intent or goal), write a short hypothetical document in the voice of the TARGET side—the kind of person or statement that would be an ideal match for that source.\n\nRules:\n- Write in first person as the target.\n- Be concrete and specific so the text is good for vector similarity search.\n- Output only the hypothetical document text, no meta-commentary.\n- Keep length to a few sentences or one short paragraph.`;\n\nconst responseFormat = z.object({\n hypotheticalDocument: z\n .string()\n .describe('The hypothetical document text in the target voice, suitable for embedding and retrieval'),\n});\n\nexport interface HydeGeneratorOutput {\n text: string;\n}\n\nexport interface HydeGenerateInput {\n /** Original intent or query text. */\n sourceText: string;\n /** Free-text lens label from LensInferrer (e.g. \"crypto infra VC\"). */\n lens: string;\n /** Which corpus voice to generate in. */\n corpus: HydeTargetCorpus;\n /** Sanitized source-grounded frame. Absence preserves the exact legacy prompt. */\n sourceFrame?: HydeSourceFrame;\n}\n\n/** Minimal structured model contract used for deterministic injection in tests. */\nexport interface HydeGeneratorStructuredModel {\n invoke(input: BaseLanguageModelInput, config?: { signal?: AbortSignal }): Promise<unknown>;\n}\n\nfunction renderList(items: string[]): string {\n return items.length > 0 ? items.join('; ') : '(none)';\n}\n\n/** Build the frame-v1 generation prompt from sanitized source evidence. */\nexport function buildFrameHydePrompt(input: HydeGenerateInput & { sourceFrame: HydeSourceFrame }): string {\n const { sourceText, corpus, sourceFrame } = input;\n const corpusInstruction = {\n profiles: 'Write a first-person professional biography in the target profile voice.',\n intents: 'Write a first-person goal or aspiration in the target intent voice.',\n premises: 'Write a first-person stable identity, values, or worldview statement in the target premise voice.',\n }[corpus];\n\n return `${corpusInstruction}\n\nSource text: \"${sourceText}\"\n\nSanitized source frame:\n- Source roles: ${renderList(sourceFrame.sourceRoles.map((item) => `${item.role} [evidence: \"${item.evidence}\"]`))}\n- Counterpart/complementary roles: ${renderList(sourceFrame.counterpartRoles.map((item) => `${item.role} [evidence: \"${item.evidence}\"]`))}\n- Explicit hard constraints: ${renderList(sourceFrame.hardConstraints.map((item) => `${item.type}: ${item.value} [evidence: \"${item.evidence}\"]`))}\n- Named entities: ${renderList(sourceFrame.namedEntities.map((item) => `${item.type}: ${item.name} [evidence: \"${item.evidence}\"]`))}\n- Domain vocabulary: ${renderList(sourceFrame.domainVocabulary.map((item) => `${item.term} [evidence: \"${item.evidence}\"]`))}\n\nGeneration constraints:\n- You MAY elaborate generic roles and generic domain language.\n- You MAY use reciprocal/complementary inversion and write in the target voice.\n- You MUST NOT introduce any new proper noun or named entity.\n- You MUST NOT introduce any new hard location, time, numeric, credential, organization, or exclusivity constraint.\n- Preserve explicit source-frame constraints when they apply to the reciprocal target.\n- Output only a few sentences or one short paragraph.`;\n}\n\n/** Generates hypothetical documents in a target corpus voice for semantic search. */\nexport class HydeGenerator {\n private model?: HydeGeneratorStructuredModel;\n\n constructor(model?: HydeGeneratorStructuredModel) {\n // Preserve the legacy production model construction path; injected models\n // keep prompt tests provider-free.\n this.model = model ?? createStructuredModel(\"hydeGenerator\", responseFormat, {\n name: \"hyde_generator\",\n });\n }\n\n private getModel(): HydeGeneratorStructuredModel {\n this.model ??= createStructuredModel(\"hydeGenerator\", responseFormat, {\n name: \"hyde_generator\",\n });\n return this.model;\n }\n\n /** Generate a hypothetical document for the given source text and lens. */\n @Timed()\n async generate(input: HydeGenerateInput): Promise<HydeGeneratorOutput> {\n const promptText = input.sourceFrame\n ? buildFrameHydePrompt(input as HydeGenerateInput & { sourceFrame: HydeSourceFrame })\n : HYDE_CORPUS_PROMPTS[input.corpus](input.sourceText, input.lens);\n\n const messages = [\n new SystemMessage(SYSTEM_PROMPT),\n new HumanMessage(promptText),\n ];\n\n const result = await invokeWithAbortSignal(this.getModel(), messages);\n const parsed = responseFormat.parse(result);\n const text = parsed.hypotheticalDocument ?? '';\n\n logger.verbose('Generated HyDE document', {\n lens: input.lens,\n corpus: input.corpus,\n textLength: text.length,\n frameConstrained: !!input.sourceFrame,\n });\n\n return { text };\n }\n}\n"]}
@@ -1,27 +1,39 @@
1
- /**
2
- * HyDE Graph: cache-aware hypothetical document generation with lens inference.
3
- *
4
- * Flow: infer_lenses → check_cache → (generate_missing if needed) → embed → cache_results.
5
- * Constructor injects Database, Embedder, Cache, LensInferrer, HydeGenerator.
6
- */
7
- import { type HydeDocumentState } from './hyde.state.js';
8
- import { LensInferrer } from './lens.inferrer.js';
9
- import { HydeGenerator } from './hyde.generator.js';
1
+ import type { DebugMetaAgent } from '../../chat/chat-streaming.types.js';
2
+ import type { HydeCache } from '../interfaces/cache.interface.js';
10
3
  import type { HydeGraphDatabase } from '../interfaces/database.interface.js';
11
4
  import type { EmbeddingGenerator } from '../interfaces/embedder.interface.js';
12
- import type { HydeCache } from '../interfaces/cache.interface.js';
13
- import type { DebugMetaAgent } from '../../chat/chat-streaming.types.js';
14
- /**
15
- * Factory for the HyDE generation graph.
16
- * Injects Database, Embedder, Cache, LensInferrer, and HydeGenerator.
17
- */
5
+ import { type HydeGenerationMode } from './hyde.env.js';
6
+ import { type HydeSourceFrame } from './hyde.frame.js';
7
+ import type { HydeGenerateInput, HydeGeneratorOutput } from './hyde.generator.js';
8
+ import { type HydeDocumentState } from './hyde.state.js';
9
+ import type { LensInferenceInput, LensInferenceOutput } from './lens.inferrer.js';
10
+ import { type HydeValidationInput, type HydeValidationOutput } from './hyde.validator.js';
11
+ /** Narrow lens inferrer contract accepted by the graph. */
12
+ export interface HydeLensInferrerLike {
13
+ infer(input: LensInferenceInput): Promise<LensInferenceOutput>;
14
+ }
15
+ /** Narrow document generator contract accepted by the graph. */
16
+ export interface HydeGeneratorLike {
17
+ generate(input: HydeGenerateInput): Promise<HydeGeneratorOutput>;
18
+ }
19
+ /** Narrow batch validator contract accepted by the graph. */
20
+ export interface HydeValidatorLike {
21
+ validate(input: HydeValidationInput): Promise<HydeValidationOutput>;
22
+ }
23
+ export interface HydeGraphOptions {
24
+ /** Test override. Production derives the mode from HYDE_FRAME_CONSTRAINTS_ENABLED. */
25
+ mode?: HydeGenerationMode;
26
+ validator?: HydeValidatorLike;
27
+ }
28
+ /** Factory for the HyDE generation graph. Existing five-argument calls remain valid. */
18
29
  export declare class HydeGraphFactory {
19
30
  private database;
20
31
  private embedder;
21
32
  private cache;
22
33
  private inferrer;
23
34
  private generator;
24
- constructor(database: HydeGraphDatabase, embedder: EmbeddingGenerator, cache: HydeCache, inferrer: LensInferrer, generator: HydeGenerator);
35
+ private options;
36
+ constructor(database: HydeGraphDatabase, embedder: EmbeddingGenerator, cache: HydeCache, inferrer: HydeLensInferrerLike, generator: HydeGeneratorLike, options?: HydeGraphOptions);
25
37
  createGraph(): import("@langchain/langgraph").CompiledStateGraph<{
26
38
  sourceType: "intent" | "context" | "query";
27
39
  sourceId: import("../interfaces/database.interface.js").Id<"users"> | import("../interfaces/database.interface.js").Id<"intents"> | undefined;
@@ -30,6 +42,10 @@ export declare class HydeGraphFactory {
30
42
  maxLenses: number;
31
43
  forceRegenerate: boolean;
32
44
  lenses: import("./lens.inferrer.js").Lens[];
45
+ sourceFrame: HydeSourceFrame | undefined;
46
+ frameFingerprint: string | undefined;
47
+ sourceTextHash: string | undefined;
48
+ generatedAt: string | undefined;
33
49
  hydeDocuments: Record<string, HydeDocumentState>;
34
50
  hydeEmbeddings: Record<string, number[]>;
35
51
  error: string | undefined;
@@ -42,6 +58,10 @@ export declare class HydeGraphFactory {
42
58
  maxLenses?: number | import("@langchain/langgraph").OverwriteValue<number> | undefined;
43
59
  forceRegenerate?: boolean | import("@langchain/langgraph").OverwriteValue<boolean> | undefined;
44
60
  lenses?: import("./lens.inferrer.js").Lens[] | import("@langchain/langgraph").OverwriteValue<import("./lens.inferrer.js").Lens[]> | undefined;
61
+ sourceFrame?: HydeSourceFrame | import("@langchain/langgraph").OverwriteValue<HydeSourceFrame | undefined> | undefined;
62
+ frameFingerprint?: string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined;
63
+ sourceTextHash?: string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined;
64
+ generatedAt?: string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined;
45
65
  hydeDocuments?: Record<string, HydeDocumentState> | import("@langchain/langgraph").OverwriteValue<Record<string, HydeDocumentState>> | undefined;
46
66
  hydeEmbeddings?: Record<string, number[]> | import("@langchain/langgraph").OverwriteValue<Record<string, number[]>> | undefined;
47
67
  error?: string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined;
@@ -62,6 +82,10 @@ export declare class HydeGraphFactory {
62
82
  maxLenses: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
63
83
  forceRegenerate: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
64
84
  lenses: import("@langchain/langgraph").BaseChannel<import("./lens.inferrer.js").Lens[], import("./lens.inferrer.js").Lens[] | import("@langchain/langgraph").OverwriteValue<import("./lens.inferrer.js").Lens[]>, unknown>;
85
+ sourceFrame: import("@langchain/langgraph").BaseChannel<HydeSourceFrame | undefined, HydeSourceFrame | import("@langchain/langgraph").OverwriteValue<HydeSourceFrame | undefined> | undefined, unknown>;
86
+ frameFingerprint: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
87
+ sourceTextHash: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
88
+ generatedAt: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
65
89
  hydeDocuments: import("@langchain/langgraph").BaseChannel<Record<string, HydeDocumentState>, Record<string, HydeDocumentState> | import("@langchain/langgraph").OverwriteValue<Record<string, HydeDocumentState>>, unknown>;
66
90
  hydeEmbeddings: import("@langchain/langgraph").BaseChannel<Record<string, number[]>, Record<string, number[]> | import("@langchain/langgraph").OverwriteValue<Record<string, number[]>>, unknown>;
67
91
  error: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
@@ -82,17 +106,34 @@ export declare class HydeGraphFactory {
82
106
  maxLenses: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
83
107
  forceRegenerate: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
84
108
  lenses: import("@langchain/langgraph").BaseChannel<import("./lens.inferrer.js").Lens[], import("./lens.inferrer.js").Lens[] | import("@langchain/langgraph").OverwriteValue<import("./lens.inferrer.js").Lens[]>, unknown>;
109
+ sourceFrame: import("@langchain/langgraph").BaseChannel<HydeSourceFrame | undefined, HydeSourceFrame | import("@langchain/langgraph").OverwriteValue<HydeSourceFrame | undefined> | undefined, unknown>;
110
+ frameFingerprint: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
111
+ sourceTextHash: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
112
+ generatedAt: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
85
113
  hydeDocuments: import("@langchain/langgraph").BaseChannel<Record<string, HydeDocumentState>, Record<string, HydeDocumentState> | import("@langchain/langgraph").OverwriteValue<Record<string, HydeDocumentState>>, unknown>;
86
114
  hydeEmbeddings: import("@langchain/langgraph").BaseChannel<Record<string, number[]>, Record<string, number[]> | import("@langchain/langgraph").OverwriteValue<Record<string, number[]>>, unknown>;
87
115
  error: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
88
116
  agentTimings: import("@langchain/langgraph").BaseChannel<DebugMetaAgent[], DebugMetaAgent[] | import("@langchain/langgraph").OverwriteValue<DebugMetaAgent[]>, unknown>;
89
117
  }, import("@langchain/langgraph").StateDefinition, {
90
118
  infer_lenses: {
119
+ lenses: import("./lens.inferrer.js").Lens[];
120
+ sourceFrame: HydeSourceFrame;
121
+ frameFingerprint: string;
122
+ sourceTextHash: string;
123
+ generatedAt: string;
124
+ agentTimings: DebugMetaAgent[];
125
+ } | {
91
126
  lenses: import("./lens.inferrer.js").Lens[];
92
127
  agentTimings: DebugMetaAgent[];
128
+ sourceFrame?: undefined;
129
+ frameFingerprint?: undefined;
130
+ sourceTextHash?: undefined;
131
+ generatedAt?: undefined;
93
132
  };
94
133
  check_cache: {
95
- hydeDocuments: Record<string, HydeDocumentState>;
134
+ hydeDocuments: {
135
+ [k: string]: HydeDocumentState;
136
+ };
96
137
  };
97
138
  generate_missing: {
98
139
  hydeDocuments: {
@@ -1 +1 @@
1
- {"version":3,"file":"hyde.graph.d.ts","sourceRoot":"/","sources":["shared/hyde/hyde.graph.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAKlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAyBzE;;;GAGG;AACH,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;gBAJT,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,aAAa;IAGlC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqOZ"}
1
+ {"version":3,"file":"hyde.graph.d.ts","sourceRoot":"/","sources":["shared/hyde/hyde.graph.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAK9E,OAAO,EAAwD,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC9G,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAAiB,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAA8B,MAAM,qBAAqB,CAAC;AAUrI,2DAA2D;AAC3D,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAChE;AAED,gEAAgE;AAChE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAClE;AAED,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,gBAAgB;IAC/B,sFAAsF;IACtF,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAsID,wFAAwF;AACxF,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;gBALP,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,EAAE,iBAAiB,EAC5B,OAAO,GAAE,gBAAqB;IAGxC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiZZ"}