@indexnetwork/protocol 22.0.0-rc.498.1 → 64.0.0-rc.604.2

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 (561) hide show
  1. package/CHANGELOG.md +1841 -0
  2. package/IMPLEMENTATION.md +140 -181
  3. package/README.md +16 -20
  4. package/STABILITY.md +16 -11
  5. package/dist/{intents/intent.module.d.ts → capabilities/intents.d.ts} +182 -192
  6. package/dist/capabilities/intents.js +88 -0
  7. package/dist/capabilities/negotiations.d.ts +17 -0
  8. package/dist/capabilities/negotiations.js +16 -0
  9. package/dist/{networks/network.module.d.ts → capabilities/networks.d.ts} +33 -169
  10. package/dist/{networks/network.module.js → capabilities/networks.js} +6 -17
  11. package/dist/index.d.ts +57 -132
  12. package/dist/index.js +41 -100
  13. package/dist/internal/agents/agent.repository.port.d.ts +59 -0
  14. package/dist/internal/agents/agent.repository.port.js +7 -0
  15. package/dist/internal/agents/agent.types.d.ts +35 -0
  16. package/dist/{agents → internal/agents}/agent.types.js +1 -6
  17. package/dist/{intents → internal/intents}/graph/intent.graph.d.ts +142 -151
  18. package/dist/{intents → internal/intents}/graph/intent.graph.execute.d.ts +5 -1
  19. package/dist/{intents → internal/intents}/graph/intent.graph.execute.js +165 -46
  20. package/dist/internal/intents/graph/intent.graph.infer.d.ts +78 -0
  21. package/dist/internal/intents/graph/intent.graph.infer.js +122 -0
  22. package/dist/internal/intents/graph/intent.graph.js +108 -0
  23. package/dist/{intents → internal/intents}/graph/intent.graph.reconcile.d.ts +18 -9
  24. package/dist/internal/intents/graph/intent.graph.reconcile.js +173 -0
  25. package/dist/internal/intents/graph/intent.graph.shared.d.ts +55 -0
  26. package/dist/{intents → internal/intents}/graph/intent.graph.shared.js +25 -70
  27. package/dist/{intents → internal/intents}/graph/intent.graph.state.d.ts +96 -32
  28. package/dist/{intents → internal/intents}/graph/intent.graph.state.js +42 -31
  29. package/dist/internal/intents/intent.admission.d.ts +16 -0
  30. package/dist/internal/intents/intent.admission.js +30 -0
  31. package/dist/{intents → internal/intents}/intent.inferrer.d.ts +1 -40
  32. package/dist/{intents → internal/intents}/intent.inferrer.js +13 -49
  33. package/dist/internal/intents/intent.preparer.d.ts +52 -0
  34. package/dist/internal/intents/intent.preparer.js +87 -0
  35. package/dist/{intents → internal/intents}/intent.verifier.d.ts +3 -36
  36. package/dist/{intents → internal/intents}/intent.verifier.js +0 -17
  37. package/dist/{networks → internal/networks}/indexer.graph.d.ts +15 -200
  38. package/dist/{networks → internal/networks}/indexer.graph.js +19 -128
  39. package/dist/{networks → internal/networks}/indexer.state.d.ts +8 -63
  40. package/dist/internal/networks/indexer.state.js +70 -0
  41. package/dist/{networks → internal/networks}/membership.graph.d.ts +6 -6
  42. package/dist/{networks → internal/networks}/membership.graph.js +3 -3
  43. package/dist/{networks → internal/networks}/membership.state.d.ts +2 -2
  44. package/dist/{networks → internal/networks}/membership.state.js +2 -2
  45. package/dist/{networks → internal/networks}/network.graph.d.ts +9 -22
  46. package/dist/{networks → internal/networks}/network.graph.js +13 -27
  47. package/dist/{networks → internal/networks}/network.recommender.d.ts +2 -2
  48. package/dist/{networks → internal/networks}/network.recommender.js +2 -2
  49. package/dist/{networks → internal/networks}/network.state.d.ts +4 -7
  50. package/dist/{networks → internal/networks}/network.state.js +4 -4
  51. package/dist/internal/opportunities/negotiation-context.loader.d.ts +26 -0
  52. package/dist/internal/opportunities/negotiation-context.loader.js +36 -0
  53. package/dist/{opportunities → internal/opportunities}/opportunity.actor.d.ts +1 -1
  54. package/dist/{opportunities → internal/opportunities}/opportunity.actor.js +7 -1
  55. package/dist/internal/opportunities/opportunity.counterparties.d.ts +17 -0
  56. package/dist/internal/opportunities/opportunity.counterparties.js +19 -0
  57. package/dist/internal/opportunities/opportunity.events.d.ts +38 -0
  58. package/dist/internal/opportunities/opportunity.events.js +94 -0
  59. package/dist/{opportunities → internal/opportunities}/opportunity.feed-selection.d.ts +3 -9
  60. package/dist/internal/opportunities/opportunity.feed-selection.js +40 -0
  61. package/dist/internal/opportunities/opportunity.graph.modes.d.ts +39 -0
  62. package/dist/internal/opportunities/opportunity.graph.modes.js +138 -0
  63. package/dist/{opportunities → internal/opportunities}/opportunity.labels.d.ts +2 -3
  64. package/dist/internal/opportunities/opportunity.labels.js +9 -0
  65. package/dist/{opportunities → internal/opportunities}/opportunity.presentation.d.ts +17 -86
  66. package/dist/{opportunities → internal/opportunities}/opportunity.presentation.js +54 -447
  67. package/dist/{opportunities → internal/opportunities}/opportunity.update-admission.d.ts +2 -2
  68. package/dist/internal/opportunities/opportunity.utils.d.ts +105 -0
  69. package/dist/internal/opportunities/opportunity.utils.js +165 -0
  70. package/dist/{opportunities → internal/opportunities}/radar/radar.graph.d.ts +17 -17
  71. package/dist/{opportunities → internal/opportunities}/radar/radar.graph.js +41 -161
  72. package/dist/{opportunities → internal/opportunities}/radar/radar.state.d.ts +4 -11
  73. package/dist/{shared → internal/shared}/agent/model-signal.d.ts +1 -1
  74. package/dist/{shared → internal/shared}/agent/model-signal.js +1 -1
  75. package/dist/{shared → internal/shared}/agent/model.config.d.ts +28 -86
  76. package/dist/{shared → internal/shared}/agent/model.config.js +58 -69
  77. package/dist/internal/shared/agent/model.resolver.d.ts +33 -0
  78. package/dist/{shared → internal/shared}/agent/model.resolver.js +18 -33
  79. package/dist/internal/shared/agent/scope.d.ts +20 -0
  80. package/dist/internal/shared/agent/scope.js +24 -0
  81. package/dist/internal/shared/assignment/network-assignment.policy.d.ts +23 -0
  82. package/dist/internal/shared/assignment/network-assignment.policy.js +28 -0
  83. package/dist/{shared → internal/shared}/observability/log.d.ts +3 -6
  84. package/dist/{shared → internal/shared}/observability/log.js +9 -18
  85. package/dist/{shared → internal/shared}/observability/protocol.logger.d.ts +1 -1
  86. package/dist/{shared → internal/shared}/observability/protocol.logger.js +1 -1
  87. package/dist/internal/shared/observability/request-context.d.ts +29 -0
  88. package/dist/internal/shared/observability/request-context.js +17 -0
  89. package/dist/{shared → internal/shared}/utils/social-label.d.ts +2 -2
  90. package/dist/{shared → internal/shared}/utils/social-label.js +1 -1
  91. package/dist/platform/database/capabilities.d.ts +59 -0
  92. package/dist/{shared/interfaces/database.entities.d.ts → platform/database/entities.d.ts} +81 -121
  93. package/dist/{shared/interfaces/database.identity-queries.d.ts → platform/database/identity-queries.d.ts} +55 -20
  94. package/dist/platform/database/member-queries.d.ts +55 -0
  95. package/dist/platform/database/member-queries.js +4 -0
  96. package/dist/platform/database/negotiation.d.ts +38 -0
  97. package/dist/{shared/interfaces/database.network-queries.d.ts → platform/database/network-queries.d.ts} +66 -67
  98. package/dist/platform/database/network-queries.js +4 -0
  99. package/dist/{shared/interfaces/database.opportunity-queries.d.ts → platform/database/opportunity-queries.d.ts} +25 -109
  100. package/dist/{shared/interfaces/database.port.d.ts → platform/database/port.d.ts} +52 -117
  101. package/dist/{shared/interfaces/database.port.js → platform/database/port.js} +3 -5
  102. package/dist/platform/database.d.ts +23 -0
  103. package/dist/{shared/interfaces/database.interface.js → platform/database.js} +1 -1
  104. package/dist/{shared/interfaces/cache.interface.d.ts → platform/discovery/cache.d.ts} +2 -4
  105. package/dist/{shared/interfaces/cache.interface.js → platform/discovery/cache.js} +1 -1
  106. package/dist/platform/discovery/embedder.d.ts +31 -0
  107. package/dist/platform/runtime/errors.d.ts +6 -0
  108. package/dist/platform/runtime/errors.js +9 -0
  109. package/dist/platform/runtime/follow-up.d.ts +36 -0
  110. package/dist/platform/runtime/follow-up.js +4 -0
  111. package/dist/platform/runtime/observability.d.ts +34 -0
  112. package/dist/protocol/core.d.ts +11 -0
  113. package/dist/protocol/discovery.rules.d.ts +21 -0
  114. package/dist/protocol/discovery.rules.js +29 -0
  115. package/dist/protocol/negotiation.constants.d.ts +3 -0
  116. package/dist/protocol/negotiation.constants.js +3 -0
  117. package/dist/protocol/negotiation.rules.d.ts +73 -0
  118. package/dist/protocol/negotiation.rules.js +68 -0
  119. package/dist/protocol/protocol.prompt.d.ts +13 -0
  120. package/dist/protocol/protocol.prompt.js +190 -0
  121. package/dist/{shared → protocol}/schemas/discovery-question.schema.d.ts +13 -13
  122. package/dist/{shared → protocol}/schemas/discovery-question.schema.js +2 -2
  123. package/dist/{shared → protocol}/schemas/identity.schema.d.ts +4 -4
  124. package/dist/{shared → protocol}/schemas/identity.schema.js +4 -4
  125. package/dist/{shared → protocol}/schemas/network-assignment.schema.d.ts +11 -20
  126. package/dist/{shared → protocol}/schemas/network-assignment.schema.js +2 -9
  127. package/dist/protocol/schemas/underspecification.schema.d.ts +9 -0
  128. package/dist/protocol/schemas/underspecification.schema.js +12 -0
  129. package/package.json +7 -15
  130. package/dist/agents/agent.dispatcher.port.d.ts +0 -25
  131. package/dist/agents/agent.module.d.ts +0 -19
  132. package/dist/agents/agent.module.js +0 -11
  133. package/dist/agents/agent.repository.port.d.ts +0 -118
  134. package/dist/agents/agent.repository.port.js +0 -10
  135. package/dist/agents/agent.tools.d.ts +0 -16
  136. package/dist/agents/agent.tools.js +0 -351
  137. package/dist/agents/agent.tools.port.d.ts +0 -22
  138. package/dist/agents/agent.tools.port.js +0 -18
  139. package/dist/agents/agent.types.d.ts +0 -76
  140. package/dist/chat/chat-streaming.types.d.ts +0 -618
  141. package/dist/chat/chat-streaming.types.js +0 -297
  142. package/dist/chat/chat.agent.d.ts +0 -292
  143. package/dist/chat/chat.agent.js +0 -1010
  144. package/dist/chat/chat.graph.d.ts +0 -424
  145. package/dist/chat/chat.graph.js +0 -257
  146. package/dist/chat/chat.interrupt.classifier.d.ts +0 -25
  147. package/dist/chat/chat.interrupt.classifier.js +0 -64
  148. package/dist/chat/chat.persona.d.ts +0 -39
  149. package/dist/chat/chat.prompt.d.ts +0 -4
  150. package/dist/chat/chat.prompt.js +0 -12
  151. package/dist/chat/chat.prompt.modules.d.ts +0 -30
  152. package/dist/chat/chat.prompt.modules.js +0 -40
  153. package/dist/chat/chat.question-dedup.d.ts +0 -14
  154. package/dist/chat/chat.question-dedup.js +0 -17
  155. package/dist/chat/chat.state.d.ts +0 -135
  156. package/dist/chat/chat.state.js +0 -120
  157. package/dist/chat/chat.streamer.d.ts +0 -64
  158. package/dist/chat/chat.streamer.js +0 -217
  159. package/dist/chat/chat.suggester.d.ts +0 -23
  160. package/dist/chat/chat.suggester.js +0 -95
  161. package/dist/chat/chat.summarizer.d.ts +0 -20
  162. package/dist/chat/chat.summarizer.js +0 -97
  163. package/dist/chat/chat.title.generator.d.ts +0 -19
  164. package/dist/chat/chat.title.generator.js +0 -66
  165. package/dist/chat/chat.tools.d.ts +0 -5
  166. package/dist/chat/chat.tools.js +0 -62
  167. package/dist/chat/chat.utils.d.ts +0 -41
  168. package/dist/chat/chat.utils.js +0 -88
  169. package/dist/chat/negotiator.persona.d.ts +0 -74
  170. package/dist/chat/negotiator.persona.js +0 -154
  171. package/dist/chat/negotiator.prompt.d.ts +0 -45
  172. package/dist/chat/negotiator.prompt.js +0 -160
  173. package/dist/chat/negotiator.tools.d.ts +0 -42
  174. package/dist/chat/negotiator.tools.js +0 -134
  175. package/dist/chat/onboarding.persona.d.ts +0 -28
  176. package/dist/chat/onboarding.persona.js +0 -86
  177. package/dist/chat/onboarding.prompt.d.ts +0 -6
  178. package/dist/chat/onboarding.prompt.js +0 -63
  179. package/dist/chat/signal.persona.d.ts +0 -47
  180. package/dist/chat/signal.persona.js +0 -319
  181. package/dist/chat/signal.prompt.d.ts +0 -39
  182. package/dist/chat/signal.prompt.js +0 -136
  183. package/dist/contacts/contact.module.d.ts +0 -8
  184. package/dist/contacts/contact.module.js +0 -6
  185. package/dist/contacts/contact.repository.port.d.ts +0 -21
  186. package/dist/contacts/contact.repository.port.js +0 -12
  187. package/dist/contacts/contact.tools.d.ts +0 -17
  188. package/dist/contacts/contact.tools.js +0 -108
  189. package/dist/contacts/contact.tools.port.d.ts +0 -20
  190. package/dist/contacts/contact.tools.port.js +0 -16
  191. package/dist/contacts/contact.types.d.ts +0 -24
  192. package/dist/contacts/contact.types.js +0 -8
  193. package/dist/contexts/context.generator.d.ts +0 -95
  194. package/dist/contexts/context.generator.js +0 -127
  195. package/dist/contexts/context.module.d.ts +0 -13
  196. package/dist/contexts/context.module.js +0 -12
  197. package/dist/contexts/context.tools.port.d.ts +0 -9
  198. package/dist/discovery/hyde.documents.d.ts +0 -9
  199. package/dist/discovery/hyde.documents.js +0 -49
  200. package/dist/discovery/hyde.env.d.ts +0 -8
  201. package/dist/discovery/hyde.env.js +0 -9
  202. package/dist/discovery/hyde.frame.d.ts +0 -150
  203. package/dist/discovery/hyde.frame.js +0 -107
  204. package/dist/discovery/hyde.generator.d.ts +0 -38
  205. package/dist/discovery/hyde.generator.js +0 -103
  206. package/dist/discovery/hyde.graph.d.ts +0 -209
  207. package/dist/discovery/hyde.graph.js +0 -482
  208. package/dist/discovery/hyde.state.d.ts +0 -70
  209. package/dist/discovery/hyde.state.js +0 -85
  210. package/dist/discovery/hyde.strategies.d.ts +0 -17
  211. package/dist/discovery/hyde.strategies.js +0 -34
  212. package/dist/discovery/hyde.validator.d.ts +0 -78
  213. package/dist/discovery/hyde.validator.js +0 -48
  214. package/dist/discovery/index.d.ts +0 -26
  215. package/dist/discovery/index.js +0 -19
  216. package/dist/discovery/lens.inferrer.d.ts +0 -214
  217. package/dist/discovery/lens.inferrer.js +0 -152
  218. package/dist/enrichment/enrichment.generator.d.ts +0 -68
  219. package/dist/enrichment/enrichment.generator.js +0 -95
  220. package/dist/enrichment/enrichment.graph.d.ts +0 -544
  221. package/dist/enrichment/enrichment.graph.js +0 -695
  222. package/dist/enrichment/enrichment.state.d.ts +0 -141
  223. package/dist/enrichment/enrichment.state.js +0 -115
  224. package/dist/enrichment/enrichment.tools.context-read.d.ts +0 -10
  225. package/dist/enrichment/enrichment.tools.context-read.js +0 -353
  226. package/dist/enrichment/enrichment.tools.context-write.d.ts +0 -9
  227. package/dist/enrichment/enrichment.tools.context-write.js +0 -417
  228. package/dist/enrichment/enrichment.tools.d.ts +0 -13
  229. package/dist/enrichment/enrichment.tools.helpers.d.ts +0 -139
  230. package/dist/enrichment/enrichment.tools.helpers.js +0 -234
  231. package/dist/enrichment/enrichment.tools.js +0 -153
  232. package/dist/intents/graph/intent.graph.infer.d.ts +0 -44
  233. package/dist/intents/graph/intent.graph.infer.js +0 -97
  234. package/dist/intents/graph/intent.graph.js +0 -134
  235. package/dist/intents/graph/intent.graph.reconcile.js +0 -274
  236. package/dist/intents/graph/intent.graph.shared.d.ts +0 -68
  237. package/dist/intents/intake/intake.orchestrator.d.ts +0 -203
  238. package/dist/intents/intake/intake.orchestrator.js +0 -255
  239. package/dist/intents/intake/intake.pack.generator.d.ts +0 -57
  240. package/dist/intents/intake/intake.pack.generator.js +0 -90
  241. package/dist/intents/intent.clarifier.d.ts +0 -51
  242. package/dist/intents/intent.clarifier.js +0 -201
  243. package/dist/intents/intent.indexer.d.ts +0 -82
  244. package/dist/intents/intent.indexer.js +0 -170
  245. package/dist/intents/intent.module.js +0 -103
  246. package/dist/intents/intent.proposal.d.ts +0 -37
  247. package/dist/intents/intent.proposal.js +0 -14
  248. package/dist/intents/intent.reconciler.d.ts +0 -105
  249. package/dist/intents/intent.reconciler.js +0 -186
  250. package/dist/intents/intent.tools.d.ts +0 -27
  251. package/dist/intents/intent.tools.js +0 -808
  252. package/dist/maintenance/maintenance.graph.d.ts +0 -239
  253. package/dist/maintenance/maintenance.graph.js +0 -199
  254. package/dist/maintenance/maintenance.state.d.ts +0 -35
  255. package/dist/maintenance/maintenance.state.js +0 -55
  256. package/dist/mcp/elicitation.builder.d.ts +0 -53
  257. package/dist/mcp/elicitation.builder.js +0 -74
  258. package/dist/mcp/elicitation.dispatcher.d.ts +0 -36
  259. package/dist/mcp/elicitation.dispatcher.js +0 -86
  260. package/dist/mcp/mcp.authorization-policy.d.ts +0 -252
  261. package/dist/mcp/mcp.authorization-policy.js +0 -535
  262. package/dist/mcp/mcp.server.d.ts +0 -90
  263. package/dist/mcp/mcp.server.js +0 -631
  264. package/dist/negotiations/insight.generator.d.ts +0 -31
  265. package/dist/negotiations/insight.generator.js +0 -105
  266. package/dist/negotiations/negotiation.agent.d.ts +0 -130
  267. package/dist/negotiations/negotiation.agent.js +0 -396
  268. package/dist/negotiations/negotiation.answer-consumption.d.ts +0 -223
  269. package/dist/negotiations/negotiation.answer-consumption.js +0 -275
  270. package/dist/negotiations/negotiation.attribution.d.ts +0 -91
  271. package/dist/negotiations/negotiation.attribution.js +0 -109
  272. package/dist/negotiations/negotiation.candidates.d.ts +0 -83
  273. package/dist/negotiations/negotiation.candidates.js +0 -162
  274. package/dist/negotiations/negotiation.client-dm.d.ts +0 -50
  275. package/dist/negotiations/negotiation.client-dm.js +0 -66
  276. package/dist/negotiations/negotiation.consultation-policy.d.ts +0 -95
  277. package/dist/negotiations/negotiation.consultation-policy.js +0 -159
  278. package/dist/negotiations/negotiation.deadlock.contracts.d.ts +0 -10
  279. package/dist/negotiations/negotiation.deadlock.d.ts +0 -87
  280. package/dist/negotiations/negotiation.deadlock.js +0 -150
  281. package/dist/negotiations/negotiation.detail-reader.d.ts +0 -94
  282. package/dist/negotiations/negotiation.detail-reader.js +0 -91
  283. package/dist/negotiations/negotiation.expected-speaker.d.ts +0 -33
  284. package/dist/negotiations/negotiation.expected-speaker.js +0 -59
  285. package/dist/negotiations/negotiation.graph.d.ts +0 -694
  286. package/dist/negotiations/negotiation.graph.finalize.d.ts +0 -5
  287. package/dist/negotiations/negotiation.graph.finalize.js +0 -403
  288. package/dist/negotiations/negotiation.graph.init.d.ts +0 -54
  289. package/dist/negotiations/negotiation.graph.init.js +0 -256
  290. package/dist/negotiations/negotiation.graph.js +0 -94
  291. package/dist/negotiations/negotiation.graph.screen.d.ts +0 -23
  292. package/dist/negotiations/negotiation.graph.screen.js +0 -108
  293. package/dist/negotiations/negotiation.graph.shared.d.ts +0 -111
  294. package/dist/negotiations/negotiation.graph.shared.js +0 -168
  295. package/dist/negotiations/negotiation.graph.turn.d.ts +0 -134
  296. package/dist/negotiations/negotiation.graph.turn.js +0 -662
  297. package/dist/negotiations/negotiation.hermes-contract.d.ts +0 -31
  298. package/dist/negotiations/negotiation.hermes-contract.js +0 -72
  299. package/dist/negotiations/negotiation.intent-snapshot-provenance.d.ts +0 -21
  300. package/dist/negotiations/negotiation.intent-snapshot-provenance.js +0 -28
  301. package/dist/negotiations/negotiation.lifecycle-narration.d.ts +0 -18
  302. package/dist/negotiations/negotiation.lifecycle-narration.js +0 -87
  303. package/dist/negotiations/negotiation.memory.d.ts +0 -65
  304. package/dist/negotiations/negotiation.memory.js +0 -83
  305. package/dist/negotiations/negotiation.module.d.ts +0 -36
  306. package/dist/negotiations/negotiation.module.js +0 -23
  307. package/dist/negotiations/negotiation.protocol.d.ts +0 -1018
  308. package/dist/negotiations/negotiation.protocol.js +0 -224
  309. package/dist/negotiations/negotiation.question-safety.d.ts +0 -52
  310. package/dist/negotiations/negotiation.question-safety.js +0 -119
  311. package/dist/negotiations/negotiation.reflect.d.ts +0 -194
  312. package/dist/negotiations/negotiation.reflect.js +0 -145
  313. package/dist/negotiations/negotiation.scope.d.ts +0 -41
  314. package/dist/negotiations/negotiation.scope.js +0 -39
  315. package/dist/negotiations/negotiation.screen.contracts.d.ts +0 -88
  316. package/dist/negotiations/negotiation.screen.contracts.js +0 -58
  317. package/dist/negotiations/negotiation.screen.d.ts +0 -78
  318. package/dist/negotiations/negotiation.screen.js +0 -112
  319. package/dist/negotiations/negotiation.stall-gap.d.ts +0 -83
  320. package/dist/negotiations/negotiation.stall-gap.js +0 -152
  321. package/dist/negotiations/negotiation.stance.contracts.d.ts +0 -123
  322. package/dist/negotiations/negotiation.stance.contracts.js +0 -317
  323. package/dist/negotiations/negotiation.state.d.ts +0 -597
  324. package/dist/negotiations/negotiation.state.js +0 -286
  325. package/dist/negotiations/negotiation.summarizer.d.ts +0 -25
  326. package/dist/negotiations/negotiation.summarizer.js +0 -101
  327. package/dist/negotiations/negotiation.task-lock-policy.d.ts +0 -10
  328. package/dist/negotiations/negotiation.task-lock-policy.js +0 -22
  329. package/dist/negotiations/negotiation.tools.d.ts +0 -18
  330. package/dist/negotiations/negotiation.tools.js +0 -842
  331. package/dist/negotiations/negotiation.tools.port.d.ts +0 -17
  332. package/dist/negotiations/negotiation.turn-cap.d.ts +0 -9
  333. package/dist/negotiations/negotiation.turn-cap.js +0 -12
  334. package/dist/networks/indexer.state.js +0 -112
  335. package/dist/networks/network.tools.d.ts +0 -36
  336. package/dist/networks/network.tools.js +0 -594
  337. package/dist/opportunities/delivery-card.cache.d.ts +0 -25
  338. package/dist/opportunities/delivery-card.cache.js +0 -43
  339. package/dist/opportunities/discovery.env.d.ts +0 -20
  340. package/dist/opportunities/discovery.env.js +0 -109
  341. package/dist/opportunities/discriminator/discriminator.adjustments.d.ts +0 -90
  342. package/dist/opportunities/discriminator/discriminator.adjustments.js +0 -141
  343. package/dist/opportunities/discriminator/discriminator.assigner.d.ts +0 -78
  344. package/dist/opportunities/discriminator/discriminator.assigner.js +0 -153
  345. package/dist/opportunities/discriminator/discriminator.env.d.ts +0 -103
  346. package/dist/opportunities/discriminator/discriminator.env.js +0 -103
  347. package/dist/opportunities/discriminator/discriminator.miner.d.ts +0 -114
  348. package/dist/opportunities/discriminator/discriminator.miner.js +0 -228
  349. package/dist/opportunities/discriminator/discriminator.push.d.ts +0 -13
  350. package/dist/opportunities/discriminator/discriminator.push.js +0 -19
  351. package/dist/opportunities/discriminator/discriminator.question.d.ts +0 -58
  352. package/dist/opportunities/discriminator/discriminator.question.js +0 -155
  353. package/dist/opportunities/discriminator/discriminator.scorer.d.ts +0 -32
  354. package/dist/opportunities/discriminator/discriminator.scorer.js +0 -105
  355. package/dist/opportunities/discriminator/discriminator.shadow.d.ts +0 -32
  356. package/dist/opportunities/discriminator/discriminator.shadow.js +0 -90
  357. package/dist/opportunities/discriminator/discriminator.types.d.ts +0 -93
  358. package/dist/opportunities/discriminator/discriminator.types.js +0 -18
  359. package/dist/opportunities/negotiation-context.loader.d.ts +0 -59
  360. package/dist/opportunities/negotiation-context.loader.js +0 -90
  361. package/dist/opportunities/negotiation-evidence/negotiation-evidence.env.d.ts +0 -43
  362. package/dist/opportunities/negotiation-evidence/negotiation-evidence.env.js +0 -44
  363. package/dist/opportunities/negotiation-evidence/negotiation-evidence.extractor.d.ts +0 -24
  364. package/dist/opportunities/negotiation-evidence/negotiation-evidence.extractor.js +0 -188
  365. package/dist/opportunities/negotiation-evidence/negotiation-evidence.miner.d.ts +0 -26
  366. package/dist/opportunities/negotiation-evidence/negotiation-evidence.miner.js +0 -112
  367. package/dist/opportunities/negotiation-evidence/negotiation-evidence.shadow.d.ts +0 -19
  368. package/dist/opportunities/negotiation-evidence/negotiation-evidence.shadow.js +0 -61
  369. package/dist/opportunities/negotiation-evidence/negotiation-evidence.types.d.ts +0 -191
  370. package/dist/opportunities/negotiation-evidence/negotiation-evidence.types.js +0 -18
  371. package/dist/opportunities/negotiation-evidence/negotiation-evidence.verifier.d.ts +0 -34
  372. package/dist/opportunities/negotiation-evidence/negotiation-evidence.verifier.js +0 -91
  373. package/dist/opportunities/negotiation-summary.builder.d.ts +0 -37
  374. package/dist/opportunities/negotiation-summary.builder.js +0 -66
  375. package/dist/opportunities/opportunity.discovery-negotiation-summary.d.ts +0 -14
  376. package/dist/opportunities/opportunity.discovery-negotiation-summary.js +0 -46
  377. package/dist/opportunities/opportunity.enricher.d.ts +0 -71
  378. package/dist/opportunities/opportunity.enricher.js +0 -280
  379. package/dist/opportunities/opportunity.evaluator.d.ts +0 -289
  380. package/dist/opportunities/opportunity.evaluator.js +0 -516
  381. package/dist/opportunities/opportunity.evidence.d.ts +0 -22
  382. package/dist/opportunities/opportunity.evidence.js +0 -87
  383. package/dist/opportunities/opportunity.existing-negotiation.d.ts +0 -79
  384. package/dist/opportunities/opportunity.existing-negotiation.js +0 -118
  385. package/dist/opportunities/opportunity.feed-selection.js +0 -96
  386. package/dist/opportunities/opportunity.graph.d.ts +0 -1611
  387. package/dist/opportunities/opportunity.graph.discovery-strategies.d.ts +0 -109
  388. package/dist/opportunities/opportunity.graph.discovery-strategies.js +0 -451
  389. package/dist/opportunities/opportunity.graph.discovery.d.ts +0 -69
  390. package/dist/opportunities/opportunity.graph.discovery.js +0 -397
  391. package/dist/opportunities/opportunity.graph.evaluation.d.ts +0 -82
  392. package/dist/opportunities/opportunity.graph.evaluation.js +0 -608
  393. package/dist/opportunities/opportunity.graph.js +0 -193
  394. package/dist/opportunities/opportunity.graph.modes.d.ts +0 -538
  395. package/dist/opportunities/opportunity.graph.modes.js +0 -538
  396. package/dist/opportunities/opportunity.graph.negotiate.d.ts +0 -109
  397. package/dist/opportunities/opportunity.graph.negotiate.js +0 -392
  398. package/dist/opportunities/opportunity.graph.persist-node.d.ts +0 -93
  399. package/dist/opportunities/opportunity.graph.persist-node.js +0 -765
  400. package/dist/opportunities/opportunity.graph.prep.d.ts +0 -150
  401. package/dist/opportunities/opportunity.graph.prep.js +0 -381
  402. package/dist/opportunities/opportunity.graph.shared.d.ts +0 -173
  403. package/dist/opportunities/opportunity.graph.shared.js +0 -199
  404. package/dist/opportunities/opportunity.introducer-feature.d.ts +0 -2
  405. package/dist/opportunities/opportunity.introducer-feature.js +0 -4
  406. package/dist/opportunities/opportunity.introducer.d.ts +0 -77
  407. package/dist/opportunities/opportunity.introducer.js +0 -99
  408. package/dist/opportunities/opportunity.labels.js +0 -10
  409. package/dist/opportunities/opportunity.lifecycle.d.ts +0 -63
  410. package/dist/opportunities/opportunity.lifecycle.js +0 -181
  411. package/dist/opportunities/opportunity.module.d.ts +0 -54
  412. package/dist/opportunities/opportunity.module.js +0 -39
  413. package/dist/opportunities/opportunity.newborn-stamping.d.ts +0 -41
  414. package/dist/opportunities/opportunity.newborn-stamping.js +0 -81
  415. package/dist/opportunities/opportunity.owner-approval.d.ts +0 -118
  416. package/dist/opportunities/opportunity.owner-approval.js +0 -34
  417. package/dist/opportunities/opportunity.owner-provenance.d.ts +0 -6
  418. package/dist/opportunities/opportunity.owner-provenance.js +0 -28
  419. package/dist/opportunities/opportunity.persist.d.ts +0 -58
  420. package/dist/opportunities/opportunity.persist.js +0 -145
  421. package/dist/opportunities/opportunity.persistence-admission.d.ts +0 -39
  422. package/dist/opportunities/opportunity.persistence-admission.js +0 -59
  423. package/dist/opportunities/opportunity.state.d.ts +0 -451
  424. package/dist/opportunities/opportunity.state.js +0 -256
  425. package/dist/opportunities/opportunity.tools.cards.d.ts +0 -138
  426. package/dist/opportunities/opportunity.tools.cards.js +0 -212
  427. package/dist/opportunities/opportunity.tools.d.ts +0 -12
  428. package/dist/opportunities/opportunity.tools.js +0 -236
  429. package/dist/opportunities/opportunity.tools.list.d.ts +0 -10
  430. package/dist/opportunities/opportunity.tools.list.js +0 -489
  431. package/dist/opportunities/opportunity.tools.port.d.ts +0 -16
  432. package/dist/opportunities/opportunity.utils.d.ts +0 -217
  433. package/dist/opportunities/opportunity.utils.js +0 -395
  434. package/dist/opportunities/outcome/outcome.env.d.ts +0 -60
  435. package/dist/opportunities/outcome/outcome.env.js +0 -63
  436. package/dist/opportunities/outcome/outcome.hypotheses.d.ts +0 -29
  437. package/dist/opportunities/outcome/outcome.hypotheses.js +0 -117
  438. package/dist/opportunities/outcome/outcome.shadow.d.ts +0 -56
  439. package/dist/opportunities/outcome/outcome.shadow.js +0 -87
  440. package/dist/opportunities/outcome/outcome.types.d.ts +0 -110
  441. package/dist/opportunities/outcome/outcome.types.js +0 -26
  442. package/dist/opportunities/radar/radar.health.d.ts +0 -31
  443. package/dist/opportunities/radar/radar.health.js +0 -75
  444. package/dist/premises/premise.analyzer.d.ts +0 -35
  445. package/dist/premises/premise.analyzer.js +0 -115
  446. package/dist/premises/premise.decomposer.d.ts +0 -69
  447. package/dist/premises/premise.decomposer.js +0 -213
  448. package/dist/premises/premise.graph.d.ts +0 -345
  449. package/dist/premises/premise.graph.js +0 -278
  450. package/dist/premises/premise.indexer.d.ts +0 -35
  451. package/dist/premises/premise.indexer.js +0 -86
  452. package/dist/premises/premise.state.d.ts +0 -67
  453. package/dist/premises/premise.state.js +0 -94
  454. package/dist/premises/premise.tools.d.ts +0 -3
  455. package/dist/premises/premise.tools.js +0 -248
  456. package/dist/questions/question.env.d.ts +0 -27
  457. package/dist/questions/question.env.js +0 -27
  458. package/dist/questions/question.input.d.ts +0 -107
  459. package/dist/questions/question.module.d.ts +0 -30
  460. package/dist/questions/question.module.js +0 -28
  461. package/dist/questions/question.schema.d.ts +0 -1529
  462. package/dist/questions/question.schema.js +0 -420
  463. package/dist/shared/agent/activity-projection.d.ts +0 -271
  464. package/dist/shared/agent/activity-projection.js +0 -254
  465. package/dist/shared/agent/canonical-guidance.d.ts +0 -30
  466. package/dist/shared/agent/canonical-guidance.js +0 -246
  467. package/dist/shared/agent/model.resolver.d.ts +0 -48
  468. package/dist/shared/agent/tool.factory.d.ts +0 -17
  469. package/dist/shared/agent/tool.factory.js +0 -221
  470. package/dist/shared/agent/tool.helpers.d.ts +0 -482
  471. package/dist/shared/agent/tool.helpers.js +0 -232
  472. package/dist/shared/agent/tool.registry.d.ts +0 -25
  473. package/dist/shared/agent/tool.registry.js +0 -76
  474. package/dist/shared/agent/tool.runtime.d.ts +0 -28
  475. package/dist/shared/agent/tool.runtime.js +0 -194
  476. package/dist/shared/agent/tool.scope.d.ts +0 -44
  477. package/dist/shared/agent/tool.scope.js +0 -50
  478. package/dist/shared/agent/utility.tools.d.ts +0 -15
  479. package/dist/shared/agent/utility.tools.js +0 -322
  480. package/dist/shared/assignment/network-assignment.policy.d.ts +0 -61
  481. package/dist/shared/assignment/network-assignment.policy.js +0 -105
  482. package/dist/shared/interfaces/agent-dispatcher.interface.d.ts +0 -100
  483. package/dist/shared/interfaces/agent-dispatcher.interface.js +0 -12
  484. package/dist/shared/interfaces/auth.interface.d.ts +0 -37
  485. package/dist/shared/interfaces/auth.interface.js +0 -1
  486. package/dist/shared/interfaces/chat-message-writer.interface.d.ts +0 -18
  487. package/dist/shared/interfaces/chat-message-writer.interface.js +0 -1
  488. package/dist/shared/interfaces/chat-session.interface.d.ts +0 -23
  489. package/dist/shared/interfaces/chat-session.interface.js +0 -18
  490. package/dist/shared/interfaces/chat-summary.interface.d.ts +0 -16
  491. package/dist/shared/interfaces/chat-summary.interface.js +0 -1
  492. package/dist/shared/interfaces/database.capabilities.d.ts +0 -100
  493. package/dist/shared/interfaces/database.interface.d.ts +0 -16
  494. package/dist/shared/interfaces/database.member-queries.d.ts +0 -219
  495. package/dist/shared/interfaces/database.member-queries.js +0 -4
  496. package/dist/shared/interfaces/database.negotiation.d.ts +0 -329
  497. package/dist/shared/interfaces/database.negotiation.js +0 -26
  498. package/dist/shared/interfaces/database.network-queries.js +0 -4
  499. package/dist/shared/interfaces/database.opportunity-queries.js +0 -4
  500. package/dist/shared/interfaces/delivery-ledger.interface.d.ts +0 -40
  501. package/dist/shared/interfaces/delivery-ledger.interface.js +0 -5
  502. package/dist/shared/interfaces/embedder.interface.d.ts +0 -92
  503. package/dist/shared/interfaces/embedder.interface.js +0 -4
  504. package/dist/shared/interfaces/enrichment-run.interface.d.ts +0 -62
  505. package/dist/shared/interfaces/enrichment-run.interface.js +0 -1
  506. package/dist/shared/interfaces/enrichment.interface.js +0 -1
  507. package/dist/shared/interfaces/negotiation-events.interface.d.ts +0 -77
  508. package/dist/shared/interfaces/negotiation-events.interface.js +0 -6
  509. package/dist/shared/interfaces/negotiation-summary.interface.d.ts +0 -25
  510. package/dist/shared/interfaces/negotiation-summary.interface.js +0 -1
  511. package/dist/shared/interfaces/negotiator-memory.interface.d.ts +0 -58
  512. package/dist/shared/interfaces/negotiator-memory.interface.js +0 -11
  513. package/dist/shared/interfaces/queue.interface.d.ts +0 -23
  514. package/dist/shared/interfaces/queue.interface.js +0 -4
  515. package/dist/shared/interfaces/scraper.interface.js +0 -1
  516. package/dist/shared/interfaces/tool-request-context.interface.d.ts +0 -11
  517. package/dist/shared/interfaces/tool-request-context.interface.js +0 -1
  518. package/dist/shared/observability/request-context.d.ts +0 -27
  519. package/dist/shared/observability/request-context.js +0 -6
  520. package/dist/shared/schemas/mcp-auth.schema.d.ts +0 -87
  521. package/dist/shared/schemas/mcp-auth.schema.js +0 -56
  522. package/dist/shared/schemas/negotiation-digest.schema.d.ts +0 -58
  523. package/dist/shared/schemas/negotiation-digest.schema.js +0 -38
  524. package/dist/shared/schemas/negotiation-state.schema.d.ts +0 -343
  525. package/dist/shared/schemas/negotiation-state.schema.js +0 -81
  526. package/dist/shared/schemas/question-block.fixture.d.ts +0 -12
  527. package/dist/shared/schemas/question-block.fixture.js +0 -39
  528. package/dist/shared/schemas/question-block.schema.d.ts +0 -111
  529. package/dist/shared/schemas/question-block.schema.js +0 -124
  530. package/dist/shared/schemas/structured-question.schema.d.ts +0 -66
  531. package/dist/shared/schemas/structured-question.schema.js +0 -31
  532. package/dist/shared/schemas/underspecification.schema.d.ts +0 -13
  533. package/dist/shared/schemas/underspecification.schema.js +0 -16
  534. /package/dist/{opportunities → internal/opportunities}/opportunity.update-admission.js +0 -0
  535. /package/dist/{opportunities → internal/opportunities}/radar/radar.state.js +0 -0
  536. /package/dist/{shared → internal/shared}/network/metadata.renderer.d.ts +0 -0
  537. /package/dist/{shared → internal/shared}/network/metadata.renderer.js +0 -0
  538. /package/dist/{shared → internal/shared}/observability/debug-meta.sanitizer.d.ts +0 -0
  539. /package/dist/{shared → internal/shared}/observability/debug-meta.sanitizer.js +0 -0
  540. /package/dist/{shared → internal/shared}/observability/performance.d.ts +0 -0
  541. /package/dist/{shared → internal/shared}/observability/performance.js +0 -0
  542. /package/dist/{shared → internal/shared}/observability/trace.d.ts +0 -0
  543. /package/dist/{shared → internal/shared}/observability/trace.js +0 -0
  544. /package/dist/{shared → internal/shared}/utils/claim-safety.d.ts +0 -0
  545. /package/dist/{shared → internal/shared}/utils/claim-safety.js +0 -0
  546. /package/dist/{shared → internal/shared}/utils/telegram-handle.d.ts +0 -0
  547. /package/dist/{shared → internal/shared}/utils/telegram-handle.js +0 -0
  548. /package/dist/{shared/interfaces/database.capabilities.js → platform/database/capabilities.js} +0 -0
  549. /package/dist/{shared/interfaces/database.entities.js → platform/database/entities.js} +0 -0
  550. /package/dist/{shared/interfaces/database.identity-queries.js → platform/database/identity-queries.js} +0 -0
  551. /package/dist/{agents/agent.dispatcher.port.js → platform/database/negotiation.js} +0 -0
  552. /package/dist/{chat/chat.persona.js → platform/database/opportunity-queries.js} +0 -0
  553. /package/dist/{contexts/context.tools.port.js → platform/discovery/embedder.js} +0 -0
  554. /package/dist/{shared/interfaces/scraper.interface.d.ts → platform/discovery/scraper.d.ts} +0 -0
  555. /package/dist/{negotiations/negotiation.deadlock.contracts.js → platform/discovery/scraper.js} +0 -0
  556. /package/dist/{shared/interfaces/enrichment.interface.d.ts → platform/enrichment/ports.d.ts} +0 -0
  557. /package/dist/{negotiations/negotiation.tools.port.js → platform/enrichment/ports.js} +0 -0
  558. /package/dist/{opportunities/opportunity.tools.port.js → platform/runtime/observability.js} +0 -0
  559. /package/dist/{questions/question.input.js → protocol/core.js} +0 -0
  560. /package/dist/{shared → protocol}/schemas/chat-context.schema.d.ts +0 -0
  561. /package/dist/{shared → protocol}/schemas/chat-context.schema.js +0 -0
@@ -1,217 +0,0 @@
1
- /**
2
- * Opportunity graph utilities: role derivation from corpus type.
3
- * Used by the opportunity graph to map lens corpus to opportunity actor roles.
4
- *
5
- * With lens-based HyDE, strategy selection is handled automatically by the
6
- * LensInferrer agent. This file provides corpus-to-role mapping for opportunity actors.
7
- */
8
- import type { HydeTargetCorpus } from '../discovery/index.js';
9
- /** Actor roles in the opportunity model (agent / patient / peer). */
10
- export type OpportunityActorRole = 'agent' | 'patient' | 'peer';
11
- /** Result of mapping a corpus to source and candidate roles. */
12
- export interface DerivedRoles {
13
- sourceRole: OpportunityActorRole;
14
- candidateRole: OpportunityActorRole;
15
- }
16
- /**
17
- * Derive actor roles from the corpus type of a lens match.
18
- *
19
- * When a candidate is found via:
20
- * - "profiles" corpus → found by who they are → candidate can help → agent
21
- * - "intents" corpus → found by what they need → candidate needs something → patient
22
- *
23
- * @param corpus - The target corpus that produced the match ('profiles' | 'intents')
24
- * @returns Roles for the source (intent owner) and the candidate (matched user/intent)
25
- */
26
- export declare function deriveRolesFromCorpus(corpus: HydeTargetCorpus): DerivedRoles;
27
- /**
28
- * Validates opportunity actors: if an opportunity has an introducer, it must have
29
- * one or two non-introducer actors (1 = 1:1 intro e.g. "I want to connect with X";
30
- * 2 = introducer connecting two others).
31
- *
32
- * Also rejects self-matches — the same person occupying both sides of a
33
- * connection. The discovery/persist pipeline trusts the LLM evaluator's actor
34
- * list, which can collapse onto a single user; downstream readers then garble
35
- * identity (e.g. a connect link/greeting rendered in one party's voice while the
36
- * card shows the viewer "matched with themselves"). Two degenerate shapes are
37
- * blocked here, at the single persist chokepoint:
38
- * - every userId-bearing non-introducer actor collapses to the same user,
39
- * e.g. `[X(agent), X(patient)]`
40
- * - an introducer who is also a participant ("Amina introduced you to Amina")
41
- * Only `userId`-bearing actors are checked; role-only actors (legacy/tests) pass.
42
- * Duplicate rows for one participant are allowed when at least one other distinct
43
- * participant is present (some callers model multiple intents as multiple actor rows).
44
- *
45
- * @param actors - Array of actors with at least a role and optional userId
46
- * @throws Error when the actor set is invalid
47
- */
48
- export declare function validateOpportunityActors(actors: Array<{
49
- userId?: string;
50
- role: string;
51
- }>): void;
52
- /**
53
- * Read-level ACL: whether a user is an actor on the opportunity and may fetch
54
- * its details. Intentionally broader than `isActionableForViewer` — a user can
55
- * read an opportunity they are not currently expected to act on (e.g. an agent
56
- * viewing an accepted opportunity).
57
- *
58
- * The feed graph and debug controller chain both predicates: an opportunity only
59
- * reaches the radar view if it passes `canUserSeeOpportunity` first, then
60
- * `isActionableForViewer`. For `agent with introducer at pending`,
61
- * `canUserSeeOpportunity` returns false (read gate blocks it), so the opportunity
62
- * never surfaces even though `isActionableForViewer` Rule 4 would return true in
63
- * isolation. This is by design — the agent is not granted read access through the
64
- * home path until the introducer path completes (negotiation → accepted).
65
- *
66
- * Compact Visibility Rule (see `docs/desi./opportunity-status-lifecycle.md`, §3.E):
67
- * - Introducer or peer: always see.
68
- * - Patient or party: see if (status is not latent, or there is no introducer).
69
- * - Agent: see if (status is accepted/rejected/expired, or (status is not latent and there is no introducer)).
70
- */
71
- export declare function canUserSeeOpportunity(actors: Array<{
72
- userId: string;
73
- role: string;
74
- }>, status: string, userId: string): boolean;
75
- /**
76
- * Whether an opportunity should appear on the viewer's radar (actionable =
77
- * has a pending action for this user).
78
- *
79
- * Rules (see `docs/desi./opportunity-status-lifecycle.md`, §3.E):
80
- *
81
- * (1) `latent`, no introducer → all actors actionable
82
- * (2) `latent`, introducer `approved !== true` → introducer only
83
- * (3) `latent`, introducer `approved === true` → all non-introducer actors
84
- * (4) `pending` (any introducer config) → non-introducer actors who have not acted.
85
- * Acting is per-user, not per-actor-row: re-detection can append duplicate
86
- * actor rows for the same user without `actedAt`, so any viewer row with
87
- * `actedAt` means the viewer has already acted.
88
- * (5) `accepted`/`rejected`/`expired`/`stalled`/`draft`/`negotiating`
89
- * → never actionable
90
- *
91
- * The introducer approval signal is stored on the `introducer`-roled actor's
92
- * `approved: boolean` field within the opportunity's `actors` JSONB. It flips
93
- * from `false` to `true` when the introducer approves; status stays `latent`
94
- * across the flip while a background negotiation runs.
95
- */
96
- export declare function isActionableForViewer(actors: Array<{
97
- userId: string;
98
- role: string;
99
- approved?: boolean;
100
- actedAt?: string | null;
101
- }>, status: string, viewerId: string): boolean;
102
- /** Feed category for home composition. */
103
- export type FeedCategory = 'connection' | 'connector-flow' | 'expired';
104
- /** Soft targets for radar composition. */
105
- export declare const RADAR_SOFT_TARGETS: {
106
- readonly connection: 3;
107
- readonly connectorFlow: 2;
108
- readonly expired: 2;
109
- };
110
- /**
111
- * Classify an actionable opportunity into a feed category.
112
- * Assumes the opportunity already passed isActionableForViewer or is expired.
113
- *
114
- * @param opp - Opportunity with actors and status
115
- * @param viewerId - The viewing user's ID
116
- * @returns Feed category
117
- */
118
- export declare function classifyOpportunity(opp: {
119
- actors: Array<{
120
- userId: string;
121
- role: string;
122
- }>;
123
- status: string;
124
- }, viewerId: string): FeedCategory;
125
- /**
126
- * Select opportunities for the radar using soft composition targets.
127
- * Fills each category up to its target, then redistributes unused slots
128
- * to categories that have more items available. Preserves input order.
129
- *
130
- * @param opportunities - Pre-sorted opportunities (by confidence/recency)
131
- * @param viewerId - The viewing user's ID
132
- * @returns Composition-balanced subset
133
- */
134
- export declare function selectByComposition<T extends {
135
- actors: Array<{
136
- userId: string;
137
- role: string;
138
- }>;
139
- status: string;
140
- }>(opportunities: T[], viewerId: string): T[];
141
- /**
142
- * Deduplicate opportunities so each counterpart appears at most once.
143
- * Keeps the opportunity with the highest interpretation.confidence per
144
- * counterpart userId. On ties, the first encountered wins (stable).
145
- *
146
- * Counterpart = first actor whose userId !== viewerId and role !== 'introducer'.
147
- * Opportunities without a derivable counterpart pass through undeduped.
148
- *
149
- * @param opportunities - Pre-sorted opportunities (e.g. by confidence/recency)
150
- * @param viewerId - The viewing user's ID
151
- * @returns Deduped subset preserving original input order among winners
152
- */
153
- export declare function deduplicateByPerson<T extends {
154
- actors: Array<{
155
- userId: string;
156
- role: string;
157
- }>;
158
- interpretation?: {
159
- confidence?: number;
160
- } | null;
161
- }>(opportunities: T[], viewerId: string): T[];
162
- /**
163
- * Days a digest-delivered opportunity stays suppressed before it becomes
164
- * eligible for a "still open" reminder re-show (when nothing fresh exists).
165
- */
166
- export declare const DIGEST_REDELIVERY_COOLDOWN_DAYS = 5;
167
- /** Committed delivery row shape consumed by {@link selectDigestCandidates}. */
168
- export interface DigestDeliveredRow {
169
- opportunityId: string;
170
- deliveredAtStatus: string;
171
- deliveredAt: Date;
172
- }
173
- /**
174
- * Cross-day digest suppression for scheduled-brief candidates.
175
- *
176
- * Three rules, applied in order:
177
- * 1. **Accepted-counterpart suppression** — a direct-connection candidate whose
178
- * counterpart the viewer has already connected with (an `accepted`
179
- * opportunity exists with that person) is dropped permanently. A new
180
- * discovery run re-minting the same person must not resurface them.
181
- * Connector-flow candidates (viewer is the introducer) are exempt: being
182
- * connected with someone doesn't make an intro ask on their behalf stale.
183
- * 2. **Delivery-ledger dedup** — candidates with a committed delivery row at
184
- * the same `(opportunityId, status)` key have already been shown. While any
185
- * fresh (never-shown) candidate exists, shown ones are dropped entirely.
186
- * 3. **Cooldown re-show** — when *no* fresh candidate survives, already-shown
187
- * candidates whose latest delivery is at least `cooldownDays` old are
188
- * returned instead, least-recently-shown first, flagged via
189
- * `redeliveryIds` so the digest can frame them as reminders.
190
- *
191
- * Pure function — callers fetch accepted counterparts and ledger rows.
192
- *
193
- * @param candidates - Deduped, confidence-ordered digest candidates.
194
- * @param opts.viewerId - The digest recipient.
195
- * @param opts.acceptedCounterpartIds - userIds the viewer already connected with.
196
- * @param opts.deliveredRows - Committed ledger rows for the candidate ids.
197
- * @param opts.now - Clock override for tests.
198
- * @param opts.cooldownDays - Cooldown override (default {@link DIGEST_REDELIVERY_COOLDOWN_DAYS}).
199
- * @returns Surviving pool plus the set of candidate ids that are cooldown re-shows.
200
- */
201
- export declare function selectDigestCandidates<T extends {
202
- id: string;
203
- status: string;
204
- actors: Array<{
205
- userId: string;
206
- role: string;
207
- }>;
208
- }>(candidates: T[], opts: {
209
- viewerId: string;
210
- acceptedCounterpartIds: ReadonlySet<string>;
211
- deliveredRows: DigestDeliveredRow[];
212
- now?: Date;
213
- cooldownDays?: number;
214
- }): {
215
- pool: T[];
216
- redeliveryIds: Set<string>;
217
- };
@@ -1,395 +0,0 @@
1
- /**
2
- * Opportunity graph utilities: role derivation from corpus type.
3
- * Used by the opportunity graph to map lens corpus to opportunity actor roles.
4
- *
5
- * With lens-based HyDE, strategy selection is handled automatically by the
6
- * LensInferrer agent. This file provides corpus-to-role mapping for opportunity actors.
7
- */
8
- import { log } from '../shared/observability/log.js';
9
- const logger = log.graph.from('SelectByComposition');
10
- const dedupeByPersonLog = log.graph.from('DeduplicateByPerson');
11
- const digestCandidatesLog = log.graph.from('SelectDigestCandidates');
12
- /**
13
- * Derive actor roles from the corpus type of a lens match.
14
- *
15
- * When a candidate is found via:
16
- * - "profiles" corpus → found by who they are → candidate can help → agent
17
- * - "intents" corpus → found by what they need → candidate needs something → patient
18
- *
19
- * @param corpus - The target corpus that produced the match ('profiles' | 'intents')
20
- * @returns Roles for the source (intent owner) and the candidate (matched user/intent)
21
- */
22
- export function deriveRolesFromCorpus(corpus) {
23
- switch (corpus) {
24
- case 'profiles':
25
- // Source seeks someone who can help → source is patient, candidate can help → agent
26
- return { sourceRole: 'patient', candidateRole: 'agent' };
27
- case 'intents':
28
- // Source offers or needs; candidate has complementary goal → source is agent, candidate is patient
29
- return { sourceRole: 'agent', candidateRole: 'patient' };
30
- case 'premises':
31
- // Premise matches are symmetric: two people whose self-descriptions align.
32
- // Unlike intents (directional roles), premises express stable identity truths.
33
- return { sourceRole: 'peer', candidateRole: 'peer' };
34
- default:
35
- return { sourceRole: 'peer', candidateRole: 'peer' };
36
- }
37
- }
38
- /**
39
- * Validates opportunity actors: if an opportunity has an introducer, it must have
40
- * one or two non-introducer actors (1 = 1:1 intro e.g. "I want to connect with X";
41
- * 2 = introducer connecting two others).
42
- *
43
- * Also rejects self-matches — the same person occupying both sides of a
44
- * connection. The discovery/persist pipeline trusts the LLM evaluator's actor
45
- * list, which can collapse onto a single user; downstream readers then garble
46
- * identity (e.g. a connect link/greeting rendered in one party's voice while the
47
- * card shows the viewer "matched with themselves"). Two degenerate shapes are
48
- * blocked here, at the single persist chokepoint:
49
- * - every userId-bearing non-introducer actor collapses to the same user,
50
- * e.g. `[X(agent), X(patient)]`
51
- * - an introducer who is also a participant ("Amina introduced you to Amina")
52
- * Only `userId`-bearing actors are checked; role-only actors (legacy/tests) pass.
53
- * Duplicate rows for one participant are allowed when at least one other distinct
54
- * participant is present (some callers model multiple intents as multiple actor rows).
55
- *
56
- * @param actors - Array of actors with at least a role and optional userId
57
- * @throws Error when the actor set is invalid
58
- */
59
- export function validateOpportunityActors(actors) {
60
- const introducerCount = actors.filter((a) => a.role === 'introducer').length;
61
- const nonIntroducerCount = actors.filter((a) => a.role !== 'introducer').length;
62
- if (introducerCount > 0 && (nonIntroducerCount < 1 || nonIntroducerCount > 2)) {
63
- throw new Error('An opportunity with an introducer must have one or two other actors.');
64
- }
65
- // Self-match guard. Compare only actors that carry a userId so role-only
66
- // shapes (used by some callers/tests) are unaffected.
67
- const introducerUserIds = new Set(actors.filter((a) => a.role === 'introducer' && a.userId).map((a) => a.userId));
68
- const nonIntroducerUserIds = actors
69
- .filter((a) => a.role !== 'introducer' && a.userId)
70
- .map((a) => a.userId);
71
- for (const userId of nonIntroducerUserIds) {
72
- if (introducerUserIds.has(userId)) {
73
- throw new Error('An opportunity actor cannot be both the introducer and a participant (self-match).');
74
- }
75
- }
76
- const uniqueNonIntroducerUserIds = new Set(nonIntroducerUserIds);
77
- if (nonIntroducerUserIds.length > 1 && uniqueNonIntroducerUserIds.size === 1) {
78
- throw new Error('An opportunity cannot match a user with themselves (duplicate participant).');
79
- }
80
- }
81
- /**
82
- * Read-level ACL: whether a user is an actor on the opportunity and may fetch
83
- * its details. Intentionally broader than `isActionableForViewer` — a user can
84
- * read an opportunity they are not currently expected to act on (e.g. an agent
85
- * viewing an accepted opportunity).
86
- *
87
- * The feed graph and debug controller chain both predicates: an opportunity only
88
- * reaches the radar view if it passes `canUserSeeOpportunity` first, then
89
- * `isActionableForViewer`. For `agent with introducer at pending`,
90
- * `canUserSeeOpportunity` returns false (read gate blocks it), so the opportunity
91
- * never surfaces even though `isActionableForViewer` Rule 4 would return true in
92
- * isolation. This is by design — the agent is not granted read access through the
93
- * home path until the introducer path completes (negotiation → accepted).
94
- *
95
- * Compact Visibility Rule (see `docs/desi./opportunity-status-lifecycle.md`, §3.E):
96
- * - Introducer or peer: always see.
97
- * - Patient or party: see if (status is not latent, or there is no introducer).
98
- * - Agent: see if (status is accepted/rejected/expired, or (status is not latent and there is no introducer)).
99
- */
100
- export function canUserSeeOpportunity(actors, status, userId) {
101
- const hasIntroducer = actors.some((a) => a.role === 'introducer');
102
- const userRoles = actors.filter((a) => a.userId === userId).map((a) => a.role);
103
- if (userRoles.length === 0)
104
- return false;
105
- return userRoles.some((role) => {
106
- if (role === 'introducer')
107
- return true;
108
- if (role === 'peer')
109
- return true;
110
- if (role === 'patient' || role === 'party')
111
- return status !== 'latent' || !hasIntroducer;
112
- if (role === 'agent')
113
- return (['accepted', 'rejected', 'expired'].includes(status) ||
114
- (status !== 'latent' && !hasIntroducer));
115
- return false;
116
- });
117
- }
118
- /**
119
- * Whether an opportunity should appear on the viewer's radar (actionable =
120
- * has a pending action for this user).
121
- *
122
- * Rules (see `docs/desi./opportunity-status-lifecycle.md`, §3.E):
123
- *
124
- * (1) `latent`, no introducer → all actors actionable
125
- * (2) `latent`, introducer `approved !== true` → introducer only
126
- * (3) `latent`, introducer `approved === true` → all non-introducer actors
127
- * (4) `pending` (any introducer config) → non-introducer actors who have not acted.
128
- * Acting is per-user, not per-actor-row: re-detection can append duplicate
129
- * actor rows for the same user without `actedAt`, so any viewer row with
130
- * `actedAt` means the viewer has already acted.
131
- * (5) `accepted`/`rejected`/`expired`/`stalled`/`draft`/`negotiating`
132
- * → never actionable
133
- *
134
- * The introducer approval signal is stored on the `introducer`-roled actor's
135
- * `approved: boolean` field within the opportunity's `actors` JSONB. It flips
136
- * from `false` to `true` when the introducer approves; status stays `latent`
137
- * across the flip while a background negotiation runs.
138
- */
139
- export function isActionableForViewer(actors, status, viewerId) {
140
- const viewerActors = actors.filter((a) => a.userId === viewerId);
141
- if (viewerActors.length === 0)
142
- return false;
143
- // Per-user acted signal: duplicate actor rows appended by re-detection may
144
- // lack `actedAt` even though the viewer already accepted/rejected — a single
145
- // stamped row means the viewer has acted on this opportunity.
146
- const viewerActed = viewerActors.some((a) => !!a.actedAt);
147
- const introducer = actors.find((a) => a.role === 'introducer');
148
- const hasIntroducer = !!introducer;
149
- const introducerApproved = introducer?.approved === true;
150
- return viewerActors.some(({ role }) => {
151
- if (role === 'introducer') {
152
- // Rule 2: introducer sees own latent opp only while not yet approved.
153
- return status === 'latent' && !introducerApproved;
154
- }
155
- // Non-introducer actors: patient / party / agent / peer.
156
- if (status === 'latent') {
157
- // Rule 1: no introducer → visible.
158
- // Rule 3: introducer approved → visible.
159
- return !hasIntroducer || introducerApproved;
160
- }
161
- if (status === 'pending') {
162
- // Rule 4: pending is actionable only while the viewer has not acted.
163
- // Once any of the viewer's actor rows has `actedAt`, the opportunity is
164
- // waiting on the counterparty and should not appear in the viewer's feed.
165
- return !viewerActed;
166
- }
167
- // Rule 5: never actionable at terminal or internal statuses.
168
- return false;
169
- });
170
- }
171
- /** Soft targets for radar composition. */
172
- export const RADAR_SOFT_TARGETS = {
173
- connection: 3,
174
- connectorFlow: 2,
175
- expired: 2,
176
- };
177
- /**
178
- * Classify an actionable opportunity into a feed category.
179
- * Assumes the opportunity already passed isActionableForViewer or is expired.
180
- *
181
- * @param opp - Opportunity with actors and status
182
- * @param viewerId - The viewing user's ID
183
- * @returns Feed category
184
- */
185
- export function classifyOpportunity(opp, viewerId) {
186
- if (opp.status === 'expired')
187
- return 'expired';
188
- const viewerIsIntroducer = opp.actors.some((a) => a.userId === viewerId && a.role === 'introducer');
189
- if (viewerIsIntroducer)
190
- return 'connector-flow';
191
- return 'connection';
192
- }
193
- /**
194
- * Select opportunities for the radar using soft composition targets.
195
- * Fills each category up to its target, then redistributes unused slots
196
- * to categories that have more items available. Preserves input order.
197
- *
198
- * @param opportunities - Pre-sorted opportunities (by confidence/recency)
199
- * @param viewerId - The viewing user's ID
200
- * @returns Composition-balanced subset
201
- */
202
- export function selectByComposition(opportunities, viewerId) {
203
- const buckets = {
204
- connection: [],
205
- 'connector-flow': [],
206
- expired: [],
207
- };
208
- for (const opp of opportunities) {
209
- const category = classifyOpportunity(opp, viewerId);
210
- buckets[category].push(opp);
211
- }
212
- const targets = {
213
- connection: RADAR_SOFT_TARGETS.connection,
214
- 'connector-flow': RADAR_SOFT_TARGETS.connectorFlow,
215
- expired: RADAR_SOFT_TARGETS.expired,
216
- };
217
- // First pass: fill each category up to its target
218
- const selected = {
219
- connection: buckets.connection.slice(0, targets.connection),
220
- 'connector-flow': buckets['connector-flow'].slice(0, targets['connector-flow']),
221
- expired: buckets.expired.slice(0, targets.expired),
222
- };
223
- // Calculate unused slots and remaining items
224
- const totalTarget = targets.connection + targets['connector-flow'] + targets.expired;
225
- const usedSlots = selected.connection.length + selected['connector-flow'].length + selected.expired.length;
226
- let unusedSlots = totalTarget - usedSlots;
227
- // Second pass: redistribute unused slots to categories with remaining items
228
- // Priority: connection > connector-flow > expired
229
- const redistOrder = ['connection', 'connector-flow', 'expired'];
230
- for (const category of redistOrder) {
231
- if (unusedSlots <= 0)
232
- break;
233
- const remaining = buckets[category].slice(selected[category].length);
234
- const take = Math.min(remaining.length, unusedSlots);
235
- selected[category].push(...remaining.slice(0, take));
236
- unusedSlots -= take;
237
- }
238
- // Merge in category priority order: connection > connector-flow > expired
239
- // Within each category, preserve original input order
240
- const indexMap = new Map(opportunities.map((opp, i) => [opp, i]));
241
- const sortByOriginal = (a, b) => (indexMap.get(a) ?? 0) - (indexMap.get(b) ?? 0);
242
- selected.connection.sort(sortByOriginal);
243
- selected['connector-flow'].sort(sortByOriginal);
244
- selected.expired.sort(sortByOriginal);
245
- logger.info('Selected opportunities by composition', {
246
- input: opportunities.length,
247
- buckets: {
248
- connection: buckets.connection.length,
249
- connectorFlow: buckets['connector-flow'].length,
250
- expired: buckets.expired.length,
251
- },
252
- selected: {
253
- connection: selected.connection.length,
254
- connectorFlow: selected['connector-flow'].length,
255
- expired: selected.expired.length,
256
- },
257
- });
258
- return [
259
- ...selected.connection,
260
- ...selected['connector-flow'],
261
- ...selected.expired,
262
- ];
263
- }
264
- /**
265
- * Deduplicate opportunities so each counterpart appears at most once.
266
- * Keeps the opportunity with the highest interpretation.confidence per
267
- * counterpart userId. On ties, the first encountered wins (stable).
268
- *
269
- * Counterpart = first actor whose userId !== viewerId and role !== 'introducer'.
270
- * Opportunities without a derivable counterpart pass through undeduped.
271
- *
272
- * @param opportunities - Pre-sorted opportunities (e.g. by confidence/recency)
273
- * @param viewerId - The viewing user's ID
274
- * @returns Deduped subset preserving original input order among winners
275
- */
276
- export function deduplicateByPerson(opportunities, viewerId) {
277
- const bestByCounterpart = new Map();
278
- const noCounterpart = [];
279
- for (let i = 0; i < opportunities.length; i++) {
280
- const opp = opportunities[i];
281
- const counterpart = opp.actors.find((a) => a.userId !== viewerId && a.role !== 'introducer');
282
- if (!counterpart) {
283
- noCounterpart.push({ opp, index: i });
284
- continue;
285
- }
286
- const key = counterpart.userId;
287
- const existing = bestByCounterpart.get(key);
288
- if (!existing) {
289
- bestByCounterpart.set(key, { opp, index: i });
290
- continue;
291
- }
292
- const newConf = opp.interpretation?.confidence ?? -1;
293
- const oldConf = existing.opp.interpretation?.confidence ?? -1;
294
- if (newConf > oldConf) {
295
- bestByCounterpart.set(key, { opp, index: i });
296
- }
297
- }
298
- const all = [...bestByCounterpart.values(), ...noCounterpart];
299
- all.sort((a, b) => a.index - b.index);
300
- const result = all.map((entry) => entry.opp);
301
- if (result.length < opportunities.length) {
302
- dedupeByPersonLog.info('Deduped opportunities by person', {
303
- input: opportunities.length,
304
- output: result.length,
305
- });
306
- }
307
- return result;
308
- }
309
- /**
310
- * Days a digest-delivered opportunity stays suppressed before it becomes
311
- * eligible for a "still open" reminder re-show (when nothing fresh exists).
312
- */
313
- export const DIGEST_REDELIVERY_COOLDOWN_DAYS = 5;
314
- /**
315
- * Cross-day digest suppression for scheduled-brief candidates.
316
- *
317
- * Three rules, applied in order:
318
- * 1. **Accepted-counterpart suppression** — a direct-connection candidate whose
319
- * counterpart the viewer has already connected with (an `accepted`
320
- * opportunity exists with that person) is dropped permanently. A new
321
- * discovery run re-minting the same person must not resurface them.
322
- * Connector-flow candidates (viewer is the introducer) are exempt: being
323
- * connected with someone doesn't make an intro ask on their behalf stale.
324
- * 2. **Delivery-ledger dedup** — candidates with a committed delivery row at
325
- * the same `(opportunityId, status)` key have already been shown. While any
326
- * fresh (never-shown) candidate exists, shown ones are dropped entirely.
327
- * 3. **Cooldown re-show** — when *no* fresh candidate survives, already-shown
328
- * candidates whose latest delivery is at least `cooldownDays` old are
329
- * returned instead, least-recently-shown first, flagged via
330
- * `redeliveryIds` so the digest can frame them as reminders.
331
- *
332
- * Pure function — callers fetch accepted counterparts and ledger rows.
333
- *
334
- * @param candidates - Deduped, confidence-ordered digest candidates.
335
- * @param opts.viewerId - The digest recipient.
336
- * @param opts.acceptedCounterpartIds - userIds the viewer already connected with.
337
- * @param opts.deliveredRows - Committed ledger rows for the candidate ids.
338
- * @param opts.now - Clock override for tests.
339
- * @param opts.cooldownDays - Cooldown override (default {@link DIGEST_REDELIVERY_COOLDOWN_DAYS}).
340
- * @returns Surviving pool plus the set of candidate ids that are cooldown re-shows.
341
- */
342
- export function selectDigestCandidates(candidates, opts) {
343
- const { viewerId, acceptedCounterpartIds } = opts;
344
- // Rule 1: accepted-counterpart suppression (direct connections only).
345
- const afterAccepted = candidates.filter((opp) => {
346
- const viewerIsIntroducer = opp.actors.some((a) => a.role === 'introducer' && a.userId === viewerId);
347
- if (viewerIsIntroducer)
348
- return true;
349
- const counterpart = opp.actors.find((a) => a.userId !== viewerId && a.role !== 'introducer');
350
- return !counterpart || !acceptedCounterpartIds.has(counterpart.userId);
351
- });
352
- if (afterAccepted.length < candidates.length) {
353
- digestCandidatesLog.info('Accepted-counterpart suppression dropped candidates', {
354
- dropped: candidates.length - afterAccepted.length,
355
- total: candidates.length,
356
- });
357
- }
358
- // Rule 2: delivery-ledger dedup keyed (opportunityId, deliveredAtStatus).
359
- // Keep the LATEST committed delivery per key — cooldown measures time since
360
- // the user last saw the card, not since they first saw it.
361
- const lastDeliveredByKey = new Map();
362
- for (const row of opts.deliveredRows) {
363
- if (!(row.deliveredAt instanceof Date) || Number.isNaN(row.deliveredAt.getTime()))
364
- continue;
365
- const key = `${row.opportunityId}:${row.deliveredAtStatus}`;
366
- const existing = lastDeliveredByKey.get(key);
367
- if (!existing || row.deliveredAt > existing)
368
- lastDeliveredByKey.set(key, row.deliveredAt);
369
- }
370
- const fresh = afterAccepted.filter((opp) => !lastDeliveredByKey.has(`${opp.id}:${opp.status}`));
371
- if (fresh.length > 0) {
372
- if (fresh.length < afterAccepted.length) {
373
- digestCandidatesLog.info('Ledger dedup dropped already-shown candidates', {
374
- dropped: afterAccepted.length - fresh.length,
375
- });
376
- }
377
- return { pool: fresh, redeliveryIds: new Set() };
378
- }
379
- // Rule 3: nothing fresh — re-show the least-recently-shown candidates past cooldown.
380
- const cooldownMs = (opts.cooldownDays ?? DIGEST_REDELIVERY_COOLDOWN_DAYS) * 86400000;
381
- const now = opts.now ?? new Date();
382
- const cooled = afterAccepted
383
- .map((opp) => ({ opp, at: lastDeliveredByKey.get(`${opp.id}:${opp.status}`) }))
384
- .filter((entry) => entry.at instanceof Date && now.getTime() - entry.at.getTime() >= cooldownMs)
385
- .sort((a, b) => a.at.getTime() - b.at.getTime());
386
- if (cooled.length > 0) {
387
- digestCandidatesLog.info('No fresh candidates — re-showing past-cooldown candidates', {
388
- count: cooled.length,
389
- });
390
- }
391
- return {
392
- pool: cooled.map((entry) => entry.opp),
393
- redeliveryIds: new Set(cooled.map((entry) => entry.opp.id)),
394
- };
395
- }
@@ -1,60 +0,0 @@
1
- /**
2
- * Centralized accessors for Lens B outcome-question environment variables
3
- * (IND-434).
4
- *
5
- * OUTCOME_QUESTIONS_MODE off | shadow | on — Lens B "explicit opportunity
6
- * outcomes → grounded questions" pipeline.
7
- *
8
- * off (default): no outcome feedback events are
9
- * captured and no hypothesis mining runs. Zero
10
- * behavior change.
11
- * shadow: capture one idempotent append-only
12
- * feedback event per explicit owner action, mine
13
- * neutral trade-off hypotheses for the exact
14
- * recipient + intent + fingerprint, and emit
15
- * aggregate telemetry only. No question, ranking,
16
- * intent, premise, memory, newborn-stamp, or push
17
- * writes.
18
- * on: reserved for a later phase (IND-438) that
19
- * turns a grounded hypothesis into a user-facing
20
- * question. This slice treats "on" exactly like
21
- * "shadow" for capture + mining; it never emits
22
- * questions.
23
- *
24
- * All reads go through this module — do not read this variable via
25
- * `process.env` elsewhere. Values are read on every call (no caching) so tests
26
- * and long-lived processes observe changes.
27
- */
28
- /** Lens B outcome-question mode. */
29
- export type OutcomeQuestionsMode = "off" | "shadow" | "on";
30
- /**
31
- * Current OUTCOME_QUESTIONS_MODE (default off). Only the exact trimmed literals
32
- * "shadow" and "on" activate; every other value (including unset/empty) is off.
33
- */
34
- export declare function outcomeQuestionsMode(): OutcomeQuestionsMode;
35
- /**
36
- * True when Lens B capture + mining should run at all. Both "shadow" and "on"
37
- * activate the shadow pipeline; only the future question-emitting behavior is
38
- * gated on "on" (not part of this slice).
39
- */
40
- export declare function isOutcomeQuestionsActivated(): boolean;
41
- /**
42
- * Independent-support threshold (k). Every compared group (discriminator side)
43
- * must have at least this many INDEPENDENT (related-opportunity-deduplicated)
44
- * examples before the hypothesis is eligible. Enforced per side, so no side
45
- * can be traced back to a small handful of individuals.
46
- */
47
- export declare const OUTCOME_MIN_INDEPENDENT_SUPPORT = 5;
48
- /** Minimum number of qualified sides (each ≥ k) for a hypothesis to compare. */
49
- export declare const OUTCOME_MIN_COMPARED_SIDES = 2;
50
- /**
51
- * k-anonymity floor for attempting a mining pass at all: the number of
52
- * distinct independent examples (after related-opportunity dedup) required
53
- * before the miner is invoked. Set to k × minimum compared sides so a pass can
54
- * never produce an eligible hypothesis below the aggregate floor.
55
- */
56
- export declare const OUTCOME_MIN_INDEPENDENT_EXAMPLES: number;
57
- /** Max independent examples sent to the miner LLM (most recent first). */
58
- export declare const OUTCOME_MAX_CANDIDATES = 48;
59
- /** Max chars of presentation-safe candidate snapshot stored/sent per example. */
60
- export declare const OUTCOME_MAX_PUBLIC_CONTEXT_CHARS = 400;