@indexnetwork/protocol 22.0.0-rc.499.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 -134
  12. package/dist/index.js +41 -105
  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,239 +0,0 @@
1
- import { MaintenanceGraphState } from './maintenance.state.js';
2
- /** Database methods needed by the maintenance graph (includes introducer discovery). */
3
- export interface MaintenanceGraphDatabase {
4
- getOpportunitiesForUser(userId: string, options?: {
5
- limit?: number;
6
- }): Promise<Array<{
7
- id: string;
8
- actors: Array<{
9
- userId: string;
10
- role: string;
11
- }>;
12
- status: string;
13
- [key: string]: unknown;
14
- }>>;
15
- getActiveIntents(userId: string): Promise<Array<{
16
- id: string;
17
- payload: string;
18
- }>>;
19
- /** Get the user's personal network ID (for introducer discovery). */
20
- getPersonalIndexId(userId: string): Promise<string | null>;
21
- /** Get contacts with intent freshness data from a personal network (for introducer discovery). */
22
- getContactsWithIntentFreshness(personalIndexId: string, ownerId: string, limit: number): Promise<Array<{
23
- userId: string;
24
- latestIntentAt: string | null;
25
- intentCount: number;
26
- }>>;
27
- }
28
- /** Cache methods needed by the maintenance graph. */
29
- export interface MaintenanceGraphCache {
30
- get<T = unknown>(key: string): Promise<T | null>;
31
- set(key: string, value: unknown, options?: {
32
- ttl?: number;
33
- }): Promise<void>;
34
- }
35
- /** Queue methods needed by the maintenance graph. */
36
- export interface MaintenanceGraphQueue {
37
- addJob(data: {
38
- intentId: string;
39
- userId: string;
40
- indexIds?: string[];
41
- contactUserId?: string;
42
- }, options?: {
43
- priority?: number;
44
- jobId?: string;
45
- }): Promise<unknown>;
46
- }
47
- /**
48
- * Factory for the Maintenance Graph.
49
- * Accepts database, cache, and queue dependencies via constructor injection.
50
- */
51
- /** The graph's channel state, as every node sees it. */
52
- export type MaintenanceState = typeof MaintenanceGraphState.State;
53
- /** Everything the maintenance nodes reach for. */
54
- export interface MaintenanceGraphDeps {
55
- database: MaintenanceGraphDatabase;
56
- cache: MaintenanceGraphCache;
57
- queue: MaintenanceGraphQueue;
58
- }
59
- /**
60
- * Factory for the Maintenance Graph.
61
- * Accepts database, cache, and queue dependencies via constructor injection.
62
- */
63
- export declare class MaintenanceGraphFactory {
64
- /** Resolved dependency bag shared by every node. */
65
- readonly deps: MaintenanceGraphDeps;
66
- constructor(database: MaintenanceGraphDatabase, cache: MaintenanceGraphCache, queue: MaintenanceGraphQueue);
67
- /** Compile and return the maintenance graph. */
68
- createGraph(): import("@langchain/langgraph").CompiledStateGraph<{
69
- userId: string;
70
- activeIntents: {
71
- id: string;
72
- payload: string;
73
- }[];
74
- currentOpportunities: import("../index.js").Opportunity[];
75
- expiredCount: number;
76
- lastRediscoveryAt: number | null;
77
- healthResult: import("../opportunities/radar/radar.health.js").RadarHealthResult | null;
78
- rediscoveryJobsEnqueued: number;
79
- connectorFlowCount: number;
80
- introducerDiscoveryJobsEnqueued: number;
81
- error: string | undefined;
82
- }, {
83
- userId?: string | import("@langchain/langgraph").OverwriteValue<string> | undefined;
84
- activeIntents?: {
85
- id: string;
86
- payload: string;
87
- }[] | import("@langchain/langgraph").OverwriteValue<{
88
- id: string;
89
- payload: string;
90
- }[]> | undefined;
91
- currentOpportunities?: import("../index.js").Opportunity[] | import("@langchain/langgraph").OverwriteValue<import("../index.js").Opportunity[]> | undefined;
92
- expiredCount?: number | import("@langchain/langgraph").OverwriteValue<number> | undefined;
93
- lastRediscoveryAt?: number | import("@langchain/langgraph").OverwriteValue<number | null> | null | undefined;
94
- healthResult?: import("../opportunities/radar/radar.health.js").RadarHealthResult | import("@langchain/langgraph").OverwriteValue<import("../opportunities/radar/radar.health.js").RadarHealthResult | null> | null | undefined;
95
- rediscoveryJobsEnqueued?: number | import("@langchain/langgraph").OverwriteValue<number> | undefined;
96
- connectorFlowCount?: number | import("@langchain/langgraph").OverwriteValue<number> | undefined;
97
- introducerDiscoveryJobsEnqueued?: number | import("@langchain/langgraph").OverwriteValue<number> | undefined;
98
- error?: string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined;
99
- }, "__start__" | "loadCurrentRadar" | "scoreRadarHealth" | "rediscover" | "introducerDiscovery" | "logMaintenance", {
100
- userId: import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
101
- activeIntents: import("@langchain/langgraph").BaseChannel<{
102
- id: string;
103
- payload: string;
104
- }[], {
105
- id: string;
106
- payload: string;
107
- }[] | import("@langchain/langgraph").OverwriteValue<{
108
- id: string;
109
- payload: string;
110
- }[]>, unknown>;
111
- currentOpportunities: import("@langchain/langgraph").BaseChannel<import("../index.js").Opportunity[], import("../index.js").Opportunity[] | import("@langchain/langgraph").OverwriteValue<import("../index.js").Opportunity[]>, unknown>;
112
- expiredCount: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
113
- lastRediscoveryAt: import("@langchain/langgraph").BaseChannel<number | null, number | import("@langchain/langgraph").OverwriteValue<number | null> | null, unknown>;
114
- healthResult: import("@langchain/langgraph").BaseChannel<import("../opportunities/radar/radar.health.js").RadarHealthResult | null, import("../opportunities/radar/radar.health.js").RadarHealthResult | import("@langchain/langgraph").OverwriteValue<import("../opportunities/radar/radar.health.js").RadarHealthResult | null> | null, unknown>;
115
- rediscoveryJobsEnqueued: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
116
- connectorFlowCount: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
117
- introducerDiscoveryJobsEnqueued: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
118
- error: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
119
- }, {
120
- userId: import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
121
- activeIntents: import("@langchain/langgraph").BaseChannel<{
122
- id: string;
123
- payload: string;
124
- }[], {
125
- id: string;
126
- payload: string;
127
- }[] | import("@langchain/langgraph").OverwriteValue<{
128
- id: string;
129
- payload: string;
130
- }[]>, unknown>;
131
- currentOpportunities: import("@langchain/langgraph").BaseChannel<import("../index.js").Opportunity[], import("../index.js").Opportunity[] | import("@langchain/langgraph").OverwriteValue<import("../index.js").Opportunity[]>, unknown>;
132
- expiredCount: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
133
- lastRediscoveryAt: import("@langchain/langgraph").BaseChannel<number | null, number | import("@langchain/langgraph").OverwriteValue<number | null> | null, unknown>;
134
- healthResult: import("@langchain/langgraph").BaseChannel<import("../opportunities/radar/radar.health.js").RadarHealthResult | null, import("../opportunities/radar/radar.health.js").RadarHealthResult | import("@langchain/langgraph").OverwriteValue<import("../opportunities/radar/radar.health.js").RadarHealthResult | null> | null, unknown>;
135
- rediscoveryJobsEnqueued: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
136
- connectorFlowCount: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
137
- introducerDiscoveryJobsEnqueued: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
138
- error: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
139
- }, import("@langchain/langgraph").StateDefinition, {
140
- loadCurrentRadar: import("@langchain/langgraph").UpdateType<{
141
- userId: import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
142
- activeIntents: import("@langchain/langgraph").BaseChannel<{
143
- id: string;
144
- payload: string;
145
- }[], {
146
- id: string;
147
- payload: string;
148
- }[] | import("@langchain/langgraph").OverwriteValue<{
149
- id: string;
150
- payload: string;
151
- }[]>, unknown>;
152
- currentOpportunities: import("@langchain/langgraph").BaseChannel<import("../index.js").Opportunity[], import("../index.js").Opportunity[] | import("@langchain/langgraph").OverwriteValue<import("../index.js").Opportunity[]>, unknown>;
153
- expiredCount: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
154
- lastRediscoveryAt: import("@langchain/langgraph").BaseChannel<number | null, number | import("@langchain/langgraph").OverwriteValue<number | null> | null, unknown>;
155
- healthResult: import("@langchain/langgraph").BaseChannel<import("../opportunities/radar/radar.health.js").RadarHealthResult | null, import("../opportunities/radar/radar.health.js").RadarHealthResult | import("@langchain/langgraph").OverwriteValue<import("../opportunities/radar/radar.health.js").RadarHealthResult | null> | null, unknown>;
156
- rediscoveryJobsEnqueued: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
157
- connectorFlowCount: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
158
- introducerDiscoveryJobsEnqueued: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
159
- error: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
160
- }>;
161
- scoreRadarHealth: {
162
- healthResult?: undefined;
163
- connectorFlowCount?: undefined;
164
- error?: undefined;
165
- } | {
166
- healthResult: import("../opportunities/radar/radar.health.js").RadarHealthResult;
167
- connectorFlowCount: number;
168
- error?: undefined;
169
- } | {
170
- error: string;
171
- healthResult?: undefined;
172
- connectorFlowCount?: undefined;
173
- };
174
- rediscover: {
175
- rediscoveryJobsEnqueued: number;
176
- error?: undefined;
177
- } | {
178
- error: string;
179
- rediscoveryJobsEnqueued?: undefined;
180
- };
181
- introducerDiscovery: {
182
- introducerDiscoveryJobsEnqueued?: undefined;
183
- } | {
184
- introducerDiscoveryJobsEnqueued: number;
185
- };
186
- logMaintenance: {};
187
- }, unknown, unknown, []>;
188
- }
189
- export declare function loadCurrentRadarNode(state: MaintenanceState, deps: MaintenanceGraphDeps): Promise<{
190
- error: string;
191
- currentOpportunities?: undefined;
192
- expiredCount?: undefined;
193
- activeIntents?: undefined;
194
- lastRediscoveryAt?: undefined;
195
- } | {
196
- currentOpportunities: {
197
- [key: string]: unknown;
198
- id: string;
199
- actors: Array<{
200
- userId: string;
201
- role: string;
202
- }>;
203
- status: string;
204
- }[];
205
- expiredCount: number;
206
- activeIntents: {
207
- id: string;
208
- payload: string;
209
- }[];
210
- lastRediscoveryAt: number | null;
211
- error?: undefined;
212
- }>;
213
- export declare function scoreRadarHealthNode(state: MaintenanceState): Promise<{
214
- healthResult?: undefined;
215
- connectorFlowCount?: undefined;
216
- error?: undefined;
217
- } | {
218
- healthResult: import("../opportunities/radar/radar.health.js").RadarHealthResult;
219
- connectorFlowCount: number;
220
- error?: undefined;
221
- } | {
222
- error: string;
223
- healthResult?: undefined;
224
- connectorFlowCount?: undefined;
225
- }>;
226
- export declare function shouldRediscover(state: MaintenanceState): string;
227
- export declare function rediscoverNode(state: MaintenanceState, deps: MaintenanceGraphDeps): Promise<{
228
- rediscoveryJobsEnqueued: number;
229
- error?: undefined;
230
- } | {
231
- error: string;
232
- rediscoveryJobsEnqueued?: undefined;
233
- }>;
234
- export declare function introducerDiscoveryNode(state: MaintenanceState, deps: MaintenanceGraphDeps): Promise<{
235
- introducerDiscoveryJobsEnqueued?: undefined;
236
- } | {
237
- introducerDiscoveryJobsEnqueued: number;
238
- }>;
239
- export declare function logMaintenanceNode(state: MaintenanceState): Promise<{}>;
@@ -1,199 +0,0 @@
1
- /**
2
- * Maintenance Graph: evaluate radar health and trigger rediscovery when unhealthy.
3
- * Also runs introducer discovery when connector-flow slots are underfilled.
4
- *
5
- * Write path — separate from the read-only RadarGraph.
6
- * Flow: loadCurrentRadar → scoreRadarHealth → [shouldRediscover] → rediscover → introducerDiscovery → logMaintenance → END
7
- * └─ [skip rediscovery] ─────────────→ introducerDiscovery → logMaintenance → END
8
- */
9
- import { StateGraph, START, END } from '@langchain/langgraph';
10
- import { MaintenanceGraphState } from './maintenance.state.js';
11
- import { computeRadarHealth } from '../opportunities/radar/radar.health.js';
12
- import { canUserSeeOpportunity, classifyOpportunity, isActionableForViewer, RADAR_SOFT_TARGETS } from '../opportunities/opportunity.utils.js';
13
- import { shouldRunIntroducerDiscovery, runIntroducerDiscovery } from '../opportunities/opportunity.introducer.js';
14
- import { isIntroducerDiscoveryEnabled } from '../opportunities/opportunity.introducer-feature.js';
15
- import { protocolLogger } from '../shared/observability/protocol.logger.js';
16
- const logger = protocolLogger('MaintenanceGraph');
17
- const FRESHNESS_WINDOW_MS = 12 * 60 * 60 * 1000; // 12 hours
18
- /**
19
- * Factory for the Maintenance Graph.
20
- * Accepts database, cache, and queue dependencies via constructor injection.
21
- */
22
- export class MaintenanceGraphFactory {
23
- constructor(database, cache, queue) {
24
- this.deps = { database, cache, queue };
25
- }
26
- /** Compile and return the maintenance graph. */
27
- createGraph() {
28
- const deps = this.deps;
29
- const graph = new StateGraph(MaintenanceGraphState)
30
- .addNode('loadCurrentRadar', (state) => loadCurrentRadarNode(state, deps))
31
- .addNode('scoreRadarHealth', scoreRadarHealthNode)
32
- .addNode('rediscover', (state) => rediscoverNode(state, deps))
33
- .addNode('introducerDiscovery', (state) => introducerDiscoveryNode(state, deps))
34
- .addNode('logMaintenance', logMaintenanceNode)
35
- .addEdge(START, 'loadCurrentRadar')
36
- .addConditionalEdges('loadCurrentRadar', (state) => (state.error ? 'end' : 'scoreRadarHealth'), {
37
- scoreRadarHealth: 'scoreRadarHealth',
38
- end: END,
39
- })
40
- .addConditionalEdges('scoreRadarHealth', shouldRediscover, {
41
- rediscover: 'rediscover',
42
- introducerDiscovery: 'introducerDiscovery',
43
- })
44
- .addEdge('rediscover', 'introducerDiscovery')
45
- .addEdge('introducerDiscovery', 'logMaintenance')
46
- .addEdge('logMaintenance', END);
47
- return graph.compile();
48
- }
49
- }
50
- export async function loadCurrentRadarNode(state, deps) {
51
- if (!state.userId) {
52
- return { error: 'userId is required' };
53
- }
54
- try {
55
- const raw = await deps.database.getOpportunitiesForUser(state.userId, { limit: 150 });
56
- const actionable = raw.filter((opp) => isActionableForViewer(opp.actors, opp.status, state.userId));
57
- const expired = raw.filter((opp) => opp.status === 'expired' && canUserSeeOpportunity(opp.actors, opp.status, state.userId));
58
- const activeIntents = await deps.database.getActiveIntents(state.userId);
59
- // Read last rediscovery timestamp from cache
60
- let lastRediscoveryAt = null;
61
- try {
62
- const cached = await deps.cache.get(`rediscovery:lastRun:${state.userId}`);
63
- if (typeof cached?.triggeredAt === 'string') {
64
- const parsed = Date.parse(cached.triggeredAt);
65
- if (Number.isFinite(parsed)) {
66
- lastRediscoveryAt = parsed;
67
- }
68
- }
69
- }
70
- catch {
71
- // Cache unavailable — treat as no data
72
- }
73
- return {
74
- currentOpportunities: actionable,
75
- expiredCount: expired.length,
76
- activeIntents: activeIntents ?? [],
77
- lastRediscoveryAt,
78
- };
79
- }
80
- catch (e) {
81
- logger.error('MaintenanceGraph loadCurrentRadar failed', { error: e });
82
- return { error: 'Failed to load current radar' };
83
- }
84
- }
85
- export async function scoreRadarHealthNode(state) {
86
- if (state.error)
87
- return {};
88
- try {
89
- const opps = state.currentOpportunities ?? [];
90
- let connectionCount = 0;
91
- let connectorFlowCount = 0;
92
- for (const opp of opps) {
93
- const category = classifyOpportunity(opp, state.userId);
94
- if (category === 'connection')
95
- connectionCount++;
96
- else if (category === 'connector-flow')
97
- connectorFlowCount++;
98
- }
99
- const healthResult = computeRadarHealth({
100
- connectionCount,
101
- connectorFlowCount,
102
- expiredCount: state.expiredCount,
103
- totalActionable: opps.length,
104
- lastRediscoveryAt: state.lastRediscoveryAt,
105
- freshnessWindowMs: FRESHNESS_WINDOW_MS,
106
- });
107
- logger.verbose('Radar health scored', {
108
- userId: state.userId,
109
- score: healthResult.score,
110
- shouldMaintain: healthResult.shouldMaintain,
111
- connectorFlowCount,
112
- });
113
- return { healthResult, connectorFlowCount };
114
- }
115
- catch (e) {
116
- logger.error('MaintenanceGraph scoreRadarHealth failed', { error: e });
117
- return { error: 'Failed to score radar health' };
118
- }
119
- }
120
- export function shouldRediscover(state) {
121
- if (state.error)
122
- return 'introducerDiscovery';
123
- if (state.healthResult?.shouldMaintain && state.activeIntents.length > 0) {
124
- return 'rediscover';
125
- }
126
- return 'introducerDiscovery';
127
- }
128
- export async function rediscoverNode(state, deps) {
129
- try {
130
- const bucket = Math.floor(Date.now() / (6 * 60 * 60 * 1000));
131
- const results = await Promise.allSettled(state.activeIntents.map((intent) => deps.queue.addJob({ intentId: intent.id, userId: state.userId }, { priority: 10, jobId: `rediscovery-${state.userId}-${intent.id}-${bucket}` })));
132
- for (const r of results) {
133
- if (r.status === 'rejected') {
134
- const errMsg = r.reason instanceof Error ? r.reason.message : String(r.reason);
135
- logger.error('Rediscovery job enqueue failed', { error: errMsg });
136
- }
137
- }
138
- const enqueued = results.filter((r) => r.status === 'fulfilled').length;
139
- // Record last run timestamp
140
- if (enqueued > 0) {
141
- try {
142
- await deps.cache.set(`rediscovery:lastRun:${state.userId}`, { triggeredAt: new Date().toISOString() }, { ttl: 24 * 60 * 60 });
143
- }
144
- catch {
145
- // Cache write failure is non-fatal
146
- }
147
- }
148
- return { rediscoveryJobsEnqueued: enqueued };
149
- }
150
- catch (e) {
151
- logger.error('MaintenanceGraph rediscover failed', { error: e });
152
- return { error: 'Failed to enqueue rediscovery jobs' };
153
- }
154
- }
155
- export async function introducerDiscoveryNode(state, deps) {
156
- if (!isIntroducerDiscoveryEnabled()) {
157
- logger.info('Introducer discovery skipped — disabled by configuration', {
158
- userId: state.userId,
159
- });
160
- return {};
161
- }
162
- try {
163
- const connectorFlowTarget = RADAR_SOFT_TARGETS.connectorFlow;
164
- if (!shouldRunIntroducerDiscovery(state.connectorFlowCount, connectorFlowTarget)) {
165
- logger.verbose('Introducer discovery skipped — connector-flow target met', {
166
- userId: state.userId,
167
- connectorFlowCount: state.connectorFlowCount,
168
- connectorFlowTarget,
169
- });
170
- return {};
171
- }
172
- // Cast database/queue to introducer discovery interfaces (they are compatible)
173
- const result = await runIntroducerDiscovery(deps.database, deps.queue, state.userId);
174
- logger.info('Introducer discovery complete', {
175
- userId: state.userId,
176
- contactsEvaluated: result.contactsEvaluated,
177
- jobsEnqueued: result.jobsEnqueued,
178
- skippedReason: result.skippedReason,
179
- });
180
- return { introducerDiscoveryJobsEnqueued: result.jobsEnqueued };
181
- }
182
- catch (e) {
183
- logger.error('MaintenanceGraph introducerDiscovery failed', { error: e });
184
- // Non-fatal: do not set error, just log and continue
185
- return {};
186
- }
187
- }
188
- export async function logMaintenanceNode(state) {
189
- logger.info('Maintenance complete', {
190
- userId: state.userId,
191
- score: state.healthResult?.score,
192
- shouldMaintain: state.healthResult?.shouldMaintain,
193
- rediscoveryJobs: state.rediscoveryJobsEnqueued,
194
- introducerDiscoveryJobs: state.introducerDiscoveryJobsEnqueued,
195
- activeIntents: state.activeIntents.length,
196
- connectorFlowCount: state.connectorFlowCount,
197
- });
198
- return {};
199
- }
@@ -1,35 +0,0 @@
1
- import type { Opportunity } from '../shared/interfaces/database.interface.js';
2
- import type { RadarHealthResult } from '../opportunities/radar/radar.health.js';
3
- /**
4
- * Maintenance Graph State (Annotation-based).
5
- * Flow: loadCurrentRadar → scoreRadarHealth → [conditional: rediscover | END] → logMaintenance → END
6
- */
7
- export declare const MaintenanceGraphState: import("@langchain/langgraph").AnnotationRoot<{
8
- userId: import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
9
- /** Active intents for the user (used for rediscovery). */
10
- activeIntents: import("@langchain/langgraph").BaseChannel<{
11
- id: string;
12
- payload: string;
13
- }[], {
14
- id: string;
15
- payload: string;
16
- }[] | import("@langchain/langgraph").OverwriteValue<{
17
- id: string;
18
- payload: string;
19
- }[]>, unknown>;
20
- /** Current actionable opportunities for the user. */
21
- currentOpportunities: import("@langchain/langgraph").BaseChannel<Opportunity[], Opportunity[] | import("@langchain/langgraph").OverwriteValue<Opportunity[]>, unknown>;
22
- /** Current expired opportunities count. */
23
- expiredCount: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
24
- /** Unix ms timestamp of last rediscovery for this user. */
25
- lastRediscoveryAt: import("@langchain/langgraph").BaseChannel<number | null, number | import("@langchain/langgraph").OverwriteValue<number | null> | null, unknown>;
26
- /** Radar health score result. */
27
- healthResult: import("@langchain/langgraph").BaseChannel<RadarHealthResult | null, RadarHealthResult | import("@langchain/langgraph").OverwriteValue<RadarHealthResult | null> | null, unknown>;
28
- /** Number of rediscovery jobs enqueued. */
29
- rediscoveryJobsEnqueued: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
30
- /** Current connector-flow opportunity count (from scoreRadarHealth). */
31
- connectorFlowCount: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
32
- /** Number of introducer discovery jobs enqueued. */
33
- introducerDiscoveryJobsEnqueued: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
34
- error: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
35
- }>;
@@ -1,55 +0,0 @@
1
- import { Annotation } from '@langchain/langgraph';
2
- /**
3
- * Maintenance Graph State (Annotation-based).
4
- * Flow: loadCurrentRadar → scoreRadarHealth → [conditional: rediscover | END] → logMaintenance → END
5
- */
6
- export const MaintenanceGraphState = Annotation.Root({
7
- userId: Annotation({
8
- reducer: (curr, next) => next ?? curr,
9
- default: () => '',
10
- }),
11
- /** Active intents for the user (used for rediscovery). */
12
- activeIntents: Annotation({
13
- reducer: (curr, next) => next ?? curr,
14
- default: () => [],
15
- }),
16
- /** Current actionable opportunities for the user. */
17
- currentOpportunities: Annotation({
18
- reducer: (curr, next) => next ?? curr,
19
- default: () => [],
20
- }),
21
- /** Current expired opportunities count. */
22
- expiredCount: Annotation({
23
- reducer: (curr, next) => next ?? curr,
24
- default: () => 0,
25
- }),
26
- /** Unix ms timestamp of last rediscovery for this user. */
27
- lastRediscoveryAt: Annotation({
28
- reducer: (curr, next) => next ?? curr,
29
- default: () => null,
30
- }),
31
- /** Radar health score result. */
32
- healthResult: Annotation({
33
- reducer: (curr, next) => next ?? curr,
34
- default: () => null,
35
- }),
36
- /** Number of rediscovery jobs enqueued. */
37
- rediscoveryJobsEnqueued: Annotation({
38
- reducer: (curr, next) => next ?? curr,
39
- default: () => 0,
40
- }),
41
- /** Current connector-flow opportunity count (from scoreRadarHealth). */
42
- connectorFlowCount: Annotation({
43
- reducer: (curr, next) => next ?? curr,
44
- default: () => 0,
45
- }),
46
- /** Number of introducer discovery jobs enqueued. */
47
- introducerDiscoveryJobsEnqueued: Annotation({
48
- reducer: (curr, next) => next ?? curr,
49
- default: () => 0,
50
- }),
51
- error: Annotation({
52
- reducer: (curr, next) => next ?? curr,
53
- default: () => undefined,
54
- }),
55
- });
@@ -1,53 +0,0 @@
1
- import type { Question } from "../questions/question.schema.js";
2
- type SingleChoiceSchema = {
3
- type: "string";
4
- enum: string[];
5
- description: string;
6
- };
7
- type MultiChoiceSchema = {
8
- type: "array";
9
- items: {
10
- type: "string";
11
- enum: string[];
12
- };
13
- description: string;
14
- };
15
- type ChoiceSchema = SingleChoiceSchema | MultiChoiceSchema;
16
- /**
17
- * Translates a Question into an MCP `elicitation/create` request payload.
18
- * The schema has one property named `choice` — a string-with-enum for
19
- * single-select, an array-of-enum-strings for multi-select.
20
- *
21
- * Per-option `description` text is packed into the property `description`
22
- * joined by ` | ` (MCP `requestedSchema` has no slot for per-option
23
- * descriptions; this is the spec's accepted lossy mapping).
24
- *
25
- * @param q - The question to translate.
26
- * @returns An MCP `elicitation/create` request payload.
27
- */
28
- export declare function buildElicitationCreate(q: Question): {
29
- message: string;
30
- requestedSchema: {
31
- type: "object";
32
- properties: {
33
- choice: ChoiceSchema;
34
- };
35
- required: ["choice"];
36
- };
37
- };
38
- /**
39
- * Flattens an accepted elicitation `choice` value into the user-message
40
- * format Slice 4 produces. Returns `null` when the choice is missing,
41
- * empty, or contains no values that match `q.options` — MCP clients can
42
- * be buggy or non-conformant, so values are validated against the
43
- * declared enum before being persisted as a user message.
44
- *
45
- * For multi-select questions, items that are not strings or not in the
46
- * options list are dropped silently; if no items remain, returns null.
47
- *
48
- * @param q - The question the choice answers.
49
- * @param choice - The raw value from the elicitation response.
50
- * @returns A formatted string or `null` if no valid choice remains.
51
- */
52
- export declare function flattenChoice(q: Question, choice: unknown): string | null;
53
- export {};
@@ -1,74 +0,0 @@
1
- /**
2
- * Translates a Question into an MCP `elicitation/create` request payload.
3
- * The schema has one property named `choice` — a string-with-enum for
4
- * single-select, an array-of-enum-strings for multi-select.
5
- *
6
- * Per-option `description` text is packed into the property `description`
7
- * joined by ` | ` (MCP `requestedSchema` has no slot for per-option
8
- * descriptions; this is the spec's accepted lossy mapping).
9
- *
10
- * @param q - The question to translate.
11
- * @returns An MCP `elicitation/create` request payload.
12
- */
13
- export function buildElicitationCreate(q) {
14
- const propertyDescription = q.options
15
- .map((opt) => `${opt.label}: ${opt.description}`)
16
- .join(" | ");
17
- const labels = q.options.map((o) => o.label);
18
- const choiceSchema = q.multiSelect
19
- ? {
20
- type: "array",
21
- items: { type: "string", enum: labels },
22
- description: propertyDescription,
23
- }
24
- : {
25
- type: "string",
26
- enum: labels,
27
- description: propertyDescription,
28
- };
29
- return {
30
- message: `${q.title}: ${q.prompt}`,
31
- requestedSchema: {
32
- type: "object",
33
- properties: { choice: choiceSchema },
34
- required: ["choice"],
35
- },
36
- };
37
- }
38
- /**
39
- * Flattens an accepted elicitation `choice` value into the user-message
40
- * format Slice 4 produces. Returns `null` when the choice is missing,
41
- * empty, or contains no values that match `q.options` — MCP clients can
42
- * be buggy or non-conformant, so values are validated against the
43
- * declared enum before being persisted as a user message.
44
- *
45
- * For multi-select questions, items that are not strings or not in the
46
- * options list are dropped silently; if no items remain, returns null.
47
- *
48
- * @param q - The question the choice answers.
49
- * @param choice - The raw value from the elicitation response.
50
- * @returns A formatted string or `null` if no valid choice remains.
51
- */
52
- export function flattenChoice(q, choice) {
53
- const prefix = `${q.title} (${q.prompt})`;
54
- const allowedLabels = new Set(q.options.map((o) => o.label));
55
- if (Array.isArray(choice)) {
56
- // Only multi-select questions accept arrays. A single-select question
57
- // receiving an array means a non-conformant client — reject the response
58
- // rather than recording an impossible multi-answer.
59
- if (!q.multiSelect)
60
- return null;
61
- const validItems = choice.filter((c) => typeof c === "string" && allowedLabels.has(c));
62
- if (validItems.length === 0)
63
- return null;
64
- return `${prefix}: ${validItems.join(", ")}`;
65
- }
66
- if (typeof choice === "string" && allowedLabels.has(choice)) {
67
- // Symmetric guard: multi-select questions must receive arrays. A bare
68
- // string here means a non-conformant client; reject for the same reason.
69
- if (q.multiSelect)
70
- return null;
71
- return `${prefix}: ${choice}`;
72
- }
73
- return null;
74
- }