@indexnetwork/protocol 6.12.1-rc.404.1 → 6.14.0-rc.406.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1180) hide show
  1. package/CHANGELOG.md +249 -0
  2. package/IMPLEMENTATION.md +20 -0
  3. package/STABILITY.md +4 -0
  4. package/dist/agent/agent.tools.d.ts +11 -3
  5. package/dist/agent/agent.tools.js +11 -301
  6. package/dist/capabilities/communities.facade.d.ts +13 -0
  7. package/dist/capabilities/communities.facade.js +12 -0
  8. package/dist/capabilities/communities.tools.port.d.ts +5 -0
  9. package/dist/capabilities/communities.tools.port.js +1 -0
  10. package/dist/capabilities/contacts.facade.d.ts +9 -0
  11. package/dist/capabilities/contacts.facade.js +8 -0
  12. package/dist/capabilities/contacts.tools.port.d.ts +9 -0
  13. package/dist/capabilities/contacts.tools.port.js +1 -0
  14. package/dist/capabilities/integrations.facade.d.ts +8 -0
  15. package/dist/capabilities/integrations.facade.js +7 -0
  16. package/dist/capabilities/integrations.tools.port.d.ts +9 -0
  17. package/dist/capabilities/integrations.tools.port.js +1 -0
  18. package/dist/capabilities/interaction-composition.facade.d.ts +10 -0
  19. package/dist/capabilities/interaction-composition.facade.js +9 -0
  20. package/dist/capabilities/negotiation.discovery.facade.d.ts +9 -0
  21. package/dist/capabilities/negotiation.discovery.facade.js +7 -0
  22. package/dist/capabilities/negotiation.facade.d.ts +23 -0
  23. package/dist/capabilities/negotiation.facade.js +17 -0
  24. package/dist/capabilities/negotiation.memory.facade.d.ts +6 -0
  25. package/dist/capabilities/negotiation.memory.facade.js +5 -0
  26. package/dist/capabilities/negotiation.questions.facade.d.ts +6 -0
  27. package/dist/capabilities/negotiation.questions.facade.js +5 -0
  28. package/dist/capabilities/negotiation.state.facade.d.ts +5 -0
  29. package/dist/capabilities/negotiation.state.facade.js +1 -0
  30. package/dist/capabilities/negotiation.summary.facade.d.ts +5 -0
  31. package/dist/capabilities/negotiation.summary.facade.js +5 -0
  32. package/dist/capabilities/negotiation.tools.port.d.ts +5 -0
  33. package/dist/capabilities/negotiation.tools.port.js +1 -0
  34. package/dist/capabilities/opportunities.facade.d.ts +50 -0
  35. package/dist/capabilities/opportunities.facade.js +50 -0
  36. package/dist/capabilities/opportunities.safety.facade.d.ts +2 -0
  37. package/dist/capabilities/opportunities.safety.facade.js +2 -0
  38. package/dist/capabilities/opportunities.tools.port.d.ts +5 -0
  39. package/dist/capabilities/opportunities.tools.port.js +1 -0
  40. package/dist/capabilities/participant-agents.debug.facade.d.ts +2 -0
  41. package/dist/capabilities/participant-agents.debug.facade.js +1 -0
  42. package/dist/capabilities/participant-agents.facade.d.ts +35 -0
  43. package/dist/capabilities/participant-agents.facade.js +35 -0
  44. package/dist/capabilities/participant-agents.tools.facade.d.ts +8 -0
  45. package/dist/capabilities/participant-agents.tools.facade.js +8 -0
  46. package/dist/capabilities/participant-agents.tools.port.d.ts +9 -0
  47. package/dist/capabilities/participant-agents.tools.port.js +1 -0
  48. package/dist/capabilities/participant-context.facade.d.ts +13 -0
  49. package/dist/capabilities/participant-context.facade.js +14 -0
  50. package/dist/capabilities/participant-context.tools.port.d.ts +9 -0
  51. package/dist/capabilities/participant-context.tools.port.js +1 -0
  52. package/dist/capabilities/questions.enqueue.facade.d.ts +5 -0
  53. package/dist/capabilities/questions.enqueue.facade.js +1 -0
  54. package/dist/capabilities/questions.facade.d.ts +8 -0
  55. package/dist/capabilities/questions.facade.js +7 -0
  56. package/dist/capabilities/questions.runtime.facade.d.ts +5 -0
  57. package/dist/capabilities/questions.runtime.facade.js +5 -0
  58. package/dist/capabilities/questions.tools.port.d.ts +5 -0
  59. package/dist/capabilities/questions.tools.port.js +1 -0
  60. package/dist/capabilities/signals.facade.d.ts +16 -0
  61. package/dist/capabilities/signals.facade.js +14 -0
  62. package/dist/capabilities/signals.indexing.facade.d.ts +12 -0
  63. package/dist/capabilities/signals.indexing.facade.js +11 -0
  64. package/dist/capabilities/signals.tools.port.d.ts +5 -0
  65. package/dist/capabilities/signals.tools.port.js +1 -0
  66. package/dist/chat/chat-streaming.types.d.ts +0 -1
  67. package/dist/chat/chat-streaming.types.js +1 -2
  68. package/dist/chat/chat.agent.d.ts +0 -1
  69. package/dist/chat/chat.agent.js +0 -1
  70. package/dist/chat/chat.graph.d.ts +0 -1
  71. package/dist/chat/chat.graph.js +0 -1
  72. package/dist/chat/chat.interrupt.classifier.d.ts +0 -1
  73. package/dist/chat/chat.interrupt.classifier.js +0 -1
  74. package/dist/chat/chat.persona.d.ts +0 -1
  75. package/dist/chat/chat.persona.js +0 -1
  76. package/dist/chat/chat.prompt.d.ts +0 -1
  77. package/dist/chat/chat.prompt.js +0 -1
  78. package/dist/chat/chat.prompt.modules.d.ts +0 -1
  79. package/dist/chat/chat.prompt.modules.js +0 -1
  80. package/dist/chat/chat.question-dedup.d.ts +0 -1
  81. package/dist/chat/chat.question-dedup.js +0 -1
  82. package/dist/chat/chat.state.d.ts +0 -1
  83. package/dist/chat/chat.state.js +0 -1
  84. package/dist/chat/chat.streamer.d.ts +0 -1
  85. package/dist/chat/chat.streamer.js +0 -1
  86. package/dist/chat/chat.suggester.d.ts +0 -1
  87. package/dist/chat/chat.suggester.js +0 -1
  88. package/dist/chat/chat.summarizer.d.ts +0 -1
  89. package/dist/chat/chat.summarizer.js +0 -1
  90. package/dist/chat/chat.title.generator.d.ts +0 -1
  91. package/dist/chat/chat.title.generator.js +0 -1
  92. package/dist/chat/chat.tools.d.ts +0 -1
  93. package/dist/chat/chat.tools.js +0 -1
  94. package/dist/chat/chat.utils.d.ts +0 -1
  95. package/dist/chat/chat.utils.js +0 -1
  96. package/dist/chat/negotiator.persona.d.ts +0 -1
  97. package/dist/chat/negotiator.persona.js +0 -1
  98. package/dist/chat/negotiator.prompt.d.ts +1 -2
  99. package/dist/chat/negotiator.prompt.js +1 -2
  100. package/dist/chat/negotiator.tools.d.ts +0 -1
  101. package/dist/chat/negotiator.tools.js +0 -1
  102. package/dist/chat/onboarding.persona.d.ts +0 -1
  103. package/dist/chat/onboarding.persona.js +0 -1
  104. package/dist/chat/onboarding.prompt.d.ts +0 -1
  105. package/dist/chat/onboarding.prompt.js +0 -1
  106. package/dist/chat/reporter.action.contracts.d.ts +36 -0
  107. package/dist/chat/reporter.action.contracts.js +1 -0
  108. package/dist/chat/reporter.action.tools.d.ts +2 -37
  109. package/dist/chat/reporter.action.tools.js +0 -1
  110. package/dist/chat/reporter.persona.d.ts +0 -1
  111. package/dist/chat/reporter.persona.js +0 -1
  112. package/dist/chat/reporter.prompt.d.ts +0 -1
  113. package/dist/chat/reporter.prompt.js +0 -1
  114. package/dist/chat/signal.persona.d.ts +0 -1
  115. package/dist/chat/signal.persona.js +0 -1
  116. package/dist/chat/signal.prompt.d.ts +0 -1
  117. package/dist/chat/signal.prompt.js +0 -1
  118. package/dist/communities/application/index.d.ts +45 -0
  119. package/dist/communities/application/index.js +50 -0
  120. package/dist/communities/application/indexer.graph.d.ts +446 -0
  121. package/dist/communities/application/indexer.graph.js +420 -0
  122. package/dist/communities/application/indexer.state.d.ts +172 -0
  123. package/dist/communities/application/indexer.state.js +116 -0
  124. package/dist/communities/application/membership.graph.d.ts +270 -0
  125. package/dist/communities/application/membership.graph.js +229 -0
  126. package/dist/communities/application/network.graph.d.ts +648 -0
  127. package/dist/communities/application/network.graph.js +303 -0
  128. package/dist/communities/application/network.recommender.d.ts +44 -0
  129. package/dist/communities/application/network.recommender.js +113 -0
  130. package/dist/communities/application/network.tools.d.ts +35 -0
  131. package/dist/communities/application/network.tools.js +578 -0
  132. package/dist/communities/domain/index.d.ts +29 -0
  133. package/dist/communities/domain/index.js +31 -0
  134. package/dist/communities/domain/membership.state.d.ts +87 -0
  135. package/dist/communities/domain/membership.state.js +53 -0
  136. package/dist/communities/domain/network.state.d.ts +192 -0
  137. package/dist/communities/domain/network.state.js +66 -0
  138. package/dist/communities/index.d.ts +14 -0
  139. package/dist/communities/index.js +14 -0
  140. package/dist/communities/ports/index.d.ts +25 -0
  141. package/dist/communities/ports/index.js +27 -0
  142. package/dist/communities/public/index.d.ts +30 -0
  143. package/dist/communities/public/index.js +33 -0
  144. package/dist/contact/contact.inviter.d.ts +7 -44
  145. package/dist/contact/contact.inviter.js +6 -59
  146. package/dist/contact/contact.tools.d.ts +7 -5
  147. package/dist/contact/contact.tools.js +7 -177
  148. package/dist/contacts/application/contact.inviter.d.ts +49 -0
  149. package/dist/contacts/application/contact.inviter.js +64 -0
  150. package/dist/contacts/application/contact.tools.d.ts +20 -0
  151. package/dist/contacts/application/contact.tools.js +191 -0
  152. package/dist/contacts/application/index.d.ts +22 -0
  153. package/dist/contacts/application/index.js +21 -0
  154. package/dist/contacts/domain/contact.types.d.ts +51 -0
  155. package/dist/contacts/domain/contact.types.js +10 -0
  156. package/dist/contacts/domain/index.d.ts +18 -0
  157. package/dist/contacts/domain/index.js +1 -0
  158. package/dist/contacts/index.d.ts +24 -0
  159. package/dist/contacts/index.js +24 -0
  160. package/dist/contacts/ports/contact.repository.port.d.ts +28 -0
  161. package/dist/contacts/ports/contact.repository.port.js +14 -0
  162. package/dist/contacts/ports/contact.tools.port.d.ts +26 -0
  163. package/dist/contacts/ports/contact.tools.port.js +21 -0
  164. package/dist/contacts/ports/index.d.ts +22 -0
  165. package/dist/contacts/ports/index.js +21 -0
  166. package/dist/contacts/public/index.d.ts +36 -0
  167. package/dist/contacts/public/index.js +33 -0
  168. package/dist/context/context.generator.d.ts +0 -1
  169. package/dist/context/context.generator.js +0 -1
  170. package/dist/enrichment/enrichment.enricher.d.ts +0 -1
  171. package/dist/enrichment/enrichment.enricher.js +0 -1
  172. package/dist/enrichment/enrichment.generator.d.ts +0 -1
  173. package/dist/enrichment/enrichment.generator.js +0 -1
  174. package/dist/enrichment/enrichment.graph.d.ts +6 -7
  175. package/dist/enrichment/enrichment.graph.js +0 -1
  176. package/dist/enrichment/enrichment.state.d.ts +2 -3
  177. package/dist/enrichment/enrichment.state.js +0 -1
  178. package/dist/enrichment/enrichment.tools.d.ts +3 -3
  179. package/dist/enrichment/enrichment.tools.js +0 -1
  180. package/dist/index.d.ts +106 -91
  181. package/dist/index.js +79 -71
  182. package/dist/integration/integration.tools.d.ts +6 -10
  183. package/dist/integration/integration.tools.js +6 -82
  184. package/dist/integrations/application/index.d.ts +14 -0
  185. package/dist/integrations/application/index.js +14 -0
  186. package/dist/integrations/application/integration.tools.d.ts +27 -0
  187. package/dist/integrations/application/integration.tools.js +98 -0
  188. package/dist/integrations/domain/index.d.ts +18 -0
  189. package/dist/integrations/domain/index.js +1 -0
  190. package/dist/integrations/domain/integration.types.d.ts +53 -0
  191. package/dist/integrations/domain/integration.types.js +11 -0
  192. package/dist/integrations/index.d.ts +27 -0
  193. package/dist/integrations/index.js +27 -0
  194. package/dist/integrations/ports/index.d.ts +28 -0
  195. package/dist/integrations/ports/index.js +26 -0
  196. package/dist/integrations/ports/integration.adapter.port.d.ts +62 -0
  197. package/dist/integrations/ports/integration.adapter.port.js +15 -0
  198. package/dist/integrations/ports/integration.importer.port.d.ts +31 -0
  199. package/dist/integrations/ports/integration.importer.port.js +15 -0
  200. package/dist/integrations/ports/integration.tools.port.d.ts +28 -0
  201. package/dist/integrations/ports/integration.tools.port.js +21 -0
  202. package/dist/integrations/public/index.d.ts +37 -0
  203. package/dist/integrations/public/index.js +34 -0
  204. package/dist/intent/intent.clarifier.d.ts +3 -52
  205. package/dist/intent/intent.clarifier.js +2 -202
  206. package/dist/intent/intent.graph.d.ts +3 -551
  207. package/dist/intent/intent.graph.js +3 -937
  208. package/dist/intent/intent.indexer.d.ts +2 -83
  209. package/dist/intent/intent.indexer.js +2 -171
  210. package/dist/intent/intent.inferrer.d.ts +2 -95
  211. package/dist/intent/intent.inferrer.js +2 -234
  212. package/dist/intent/intent.reconciler.d.ts +2 -106
  213. package/dist/intent/intent.reconciler.js +2 -187
  214. package/dist/intent/intent.specificity.d.ts +2 -3
  215. package/dist/intent/intent.specificity.js +2 -3
  216. package/dist/intent/intent.state.d.ts +8 -229
  217. package/dist/intent/intent.state.js +8 -189
  218. package/dist/intent/intent.tools.d.ts +6 -24
  219. package/dist/intent/intent.tools.js +4 -788
  220. package/dist/intent/intent.verifier.d.ts +2 -116
  221. package/dist/intent/intent.verifier.js +2 -263
  222. package/dist/maintenance/maintenance.graph.d.ts +0 -1
  223. package/dist/maintenance/maintenance.graph.js +0 -1
  224. package/dist/maintenance/maintenance.state.d.ts +0 -1
  225. package/dist/maintenance/maintenance.state.js +0 -1
  226. package/dist/mcp/elicitation.builder.d.ts +0 -1
  227. package/dist/mcp/elicitation.builder.js +0 -1
  228. package/dist/mcp/elicitation.dispatcher.d.ts +0 -1
  229. package/dist/mcp/elicitation.dispatcher.js +0 -1
  230. package/dist/mcp/mcp.server.d.ts +0 -1
  231. package/dist/mcp/mcp.server.js +1 -2
  232. package/dist/negotiation/application/index.d.ts +48 -0
  233. package/dist/negotiation/application/index.js +49 -0
  234. package/dist/negotiation/application/insight.generator.d.ts +31 -0
  235. package/dist/negotiation/application/insight.generator.js +105 -0
  236. package/dist/negotiation/application/negotiation.agent.d.ts +110 -0
  237. package/dist/negotiation/application/negotiation.agent.js +244 -0
  238. package/dist/negotiation/application/negotiation.detail-reader.d.ts +94 -0
  239. package/dist/negotiation/application/negotiation.detail-reader.js +91 -0
  240. package/dist/negotiation/application/negotiation.graph.d.ts +666 -0
  241. package/dist/negotiation/application/negotiation.graph.js +1394 -0
  242. package/dist/negotiation/application/negotiation.reflect.d.ts +194 -0
  243. package/dist/negotiation/application/negotiation.reflect.js +145 -0
  244. package/dist/negotiation/application/negotiation.screen.d.ts +78 -0
  245. package/dist/negotiation/application/negotiation.screen.js +108 -0
  246. package/dist/negotiation/application/negotiation.summarizer.d.ts +25 -0
  247. package/dist/negotiation/application/negotiation.summarizer.js +101 -0
  248. package/dist/negotiation/application/negotiation.tools.d.ts +18 -0
  249. package/dist/negotiation/application/negotiation.tools.js +782 -0
  250. package/dist/negotiation/domain/index.d.ts +48 -0
  251. package/dist/negotiation/domain/index.js +50 -0
  252. package/dist/negotiation/domain/negotiation.consultation-policy.d.ts +39 -0
  253. package/dist/negotiation/domain/negotiation.consultation-policy.js +68 -0
  254. package/dist/negotiation/domain/negotiation.deadlock.contracts.d.ts +10 -0
  255. package/dist/negotiation/domain/negotiation.deadlock.contracts.js +1 -0
  256. package/dist/negotiation/domain/negotiation.deadlock.d.ts +81 -0
  257. package/dist/negotiation/domain/negotiation.deadlock.js +103 -0
  258. package/dist/negotiation/domain/negotiation.intent-snapshot-provenance.d.ts +21 -0
  259. package/dist/negotiation/domain/negotiation.intent-snapshot-provenance.js +28 -0
  260. package/dist/negotiation/domain/negotiation.lifecycle-narration.d.ts +18 -0
  261. package/dist/negotiation/domain/negotiation.lifecycle-narration.js +87 -0
  262. package/dist/negotiation/domain/negotiation.memory.d.ts +65 -0
  263. package/dist/negotiation/domain/negotiation.memory.js +83 -0
  264. package/dist/negotiation/domain/negotiation.protocol.d.ts +536 -0
  265. package/dist/negotiation/domain/negotiation.protocol.js +202 -0
  266. package/dist/negotiation/domain/negotiation.question-safety.d.ts +25 -0
  267. package/dist/negotiation/domain/negotiation.question-safety.js +55 -0
  268. package/dist/negotiation/domain/negotiation.screen.contracts.d.ts +88 -0
  269. package/dist/negotiation/domain/negotiation.screen.contracts.js +58 -0
  270. package/dist/negotiation/domain/negotiation.state.d.ts +497 -0
  271. package/dist/negotiation/domain/negotiation.state.js +288 -0
  272. package/dist/negotiation/domain/negotiation.task-lock-policy.d.ts +10 -0
  273. package/dist/negotiation/domain/negotiation.task-lock-policy.js +22 -0
  274. package/dist/negotiation/index.d.ts +49 -0
  275. package/dist/negotiation/index.js +49 -0
  276. package/dist/negotiation/insight.generator.d.ts +3 -30
  277. package/dist/negotiation/insight.generator.js +3 -104
  278. package/dist/negotiation/negotiation.agent.d.ts +3 -109
  279. package/dist/negotiation/negotiation.agent.js +3 -248
  280. package/dist/negotiation/negotiation.attribution.d.ts +0 -1
  281. package/dist/negotiation/negotiation.attribution.js +0 -1
  282. package/dist/negotiation/negotiation.consultation-policy.d.ts +3 -38
  283. package/dist/negotiation/negotiation.consultation-policy.js +3 -67
  284. package/dist/negotiation/negotiation.deadlock.contracts.d.ts +5 -0
  285. package/dist/negotiation/negotiation.deadlock.contracts.js +5 -0
  286. package/dist/negotiation/negotiation.deadlock.d.ts +3 -94
  287. package/dist/negotiation/negotiation.deadlock.js +3 -101
  288. package/dist/negotiation/negotiation.detail-reader.d.ts +5 -0
  289. package/dist/negotiation/negotiation.detail-reader.js +5 -0
  290. package/dist/negotiation/negotiation.graph.d.ts +3 -663
  291. package/dist/negotiation/negotiation.graph.js +3 -1459
  292. package/dist/negotiation/negotiation.intent-snapshot-provenance.d.ts +5 -0
  293. package/dist/negotiation/negotiation.intent-snapshot-provenance.js +5 -0
  294. package/dist/negotiation/negotiation.lifecycle-narration.d.ts +5 -0
  295. package/dist/negotiation/negotiation.lifecycle-narration.js +5 -0
  296. package/dist/negotiation/negotiation.memory.d.ts +5 -56
  297. package/dist/negotiation/negotiation.memory.js +5 -69
  298. package/dist/negotiation/negotiation.protocol.d.ts +3 -535
  299. package/dist/negotiation/negotiation.protocol.js +3 -201
  300. package/dist/negotiation/negotiation.question-safety.d.ts +3 -24
  301. package/dist/negotiation/negotiation.question-safety.js +3 -54
  302. package/dist/negotiation/negotiation.reflect.d.ts +4 -197
  303. package/dist/negotiation/negotiation.reflect.js +4 -151
  304. package/dist/negotiation/negotiation.screen.d.ts +6 -159
  305. package/dist/negotiation/negotiation.screen.js +6 -152
  306. package/dist/negotiation/negotiation.state.d.ts +3 -495
  307. package/dist/negotiation/negotiation.state.js +3 -284
  308. package/dist/negotiation/negotiation.summarizer.d.ts +3 -24
  309. package/dist/negotiation/negotiation.summarizer.js +3 -100
  310. package/dist/negotiation/negotiation.task-lock-policy.d.ts +5 -0
  311. package/dist/negotiation/negotiation.task-lock-policy.js +5 -0
  312. package/dist/negotiation/negotiation.tools.d.ts +3 -15
  313. package/dist/negotiation/negotiation.tools.js +3 -946
  314. package/dist/negotiation/ports/index.d.ts +18 -0
  315. package/dist/negotiation/ports/index.js +18 -0
  316. package/dist/negotiation/ports/negotiation.tools.port.d.ts +18 -0
  317. package/dist/negotiation/ports/negotiation.tools.port.js +1 -0
  318. package/dist/negotiation/public/index.d.ts +58 -0
  319. package/dist/negotiation/public/index.js +60 -0
  320. package/dist/network/indexer/indexer.graph.d.ts +3 -413
  321. package/dist/network/indexer/indexer.graph.js +3 -375
  322. package/dist/network/indexer/indexer.state.d.ts +3 -149
  323. package/dist/network/indexer/indexer.state.js +3 -98
  324. package/dist/network/membership/membership.graph.d.ts +3 -248
  325. package/dist/network/membership/membership.graph.js +3 -202
  326. package/dist/network/membership/membership.state.d.ts +3 -75
  327. package/dist/network/membership/membership.state.js +3 -41
  328. package/dist/network/network.graph.d.ts +3 -629
  329. package/dist/network/network.graph.js +3 -267
  330. package/dist/network/network.recommender.d.ts +3 -40
  331. package/dist/network/network.recommender.js +3 -109
  332. package/dist/network/network.state.d.ts +3 -180
  333. package/dist/network/network.state.js +3 -54
  334. package/dist/network/network.tools.d.ts +5 -3
  335. package/dist/network/network.tools.js +5 -566
  336. package/dist/opportunity/application/delivery-card.cache.d.ts +25 -0
  337. package/dist/opportunity/application/delivery-card.cache.js +43 -0
  338. package/dist/opportunity/application/index.d.ts +63 -0
  339. package/dist/opportunity/application/index.js +68 -0
  340. package/dist/opportunity/application/negotiation-context.loader.d.ts +59 -0
  341. package/dist/opportunity/application/negotiation-context.loader.js +88 -0
  342. package/dist/opportunity/application/opportunity.card-presentation.d.ts +44 -0
  343. package/dist/opportunity/application/opportunity.card-presentation.js +104 -0
  344. package/dist/opportunity/application/opportunity.discover.d.ts +215 -0
  345. package/dist/opportunity/application/opportunity.discover.js +793 -0
  346. package/dist/opportunity/application/opportunity.discovery-continuation-finalization.d.ts +34 -0
  347. package/dist/opportunity/application/opportunity.discovery-continuation-finalization.js +74 -0
  348. package/dist/opportunity/application/opportunity.discovery-mcp-lifecycle-finalization.d.ts +44 -0
  349. package/dist/opportunity/application/opportunity.discovery-mcp-lifecycle-finalization.js +92 -0
  350. package/dist/opportunity/application/opportunity.discovery-negotiation-summary.d.ts +14 -0
  351. package/dist/opportunity/application/opportunity.discovery-negotiation-summary.js +46 -0
  352. package/dist/opportunity/application/opportunity.enricher.d.ts +71 -0
  353. package/dist/opportunity/application/opportunity.enricher.js +280 -0
  354. package/dist/opportunity/application/opportunity.evaluator.d.ts +275 -0
  355. package/dist/opportunity/application/opportunity.evaluator.js +459 -0
  356. package/dist/opportunity/application/opportunity.existing-negotiation.d.ts +79 -0
  357. package/dist/opportunity/application/opportunity.existing-negotiation.js +118 -0
  358. package/dist/opportunity/application/opportunity.feed-selection.d.ts +30 -0
  359. package/dist/opportunity/application/opportunity.feed-selection.js +96 -0
  360. package/dist/opportunity/application/opportunity.graph.d.ts +1427 -0
  361. package/dist/opportunity/application/opportunity.graph.js +3707 -0
  362. package/dist/opportunity/application/opportunity.introducer.d.ts +77 -0
  363. package/dist/opportunity/application/opportunity.introducer.js +99 -0
  364. package/dist/opportunity/application/opportunity.lifecycle.d.ts +63 -0
  365. package/dist/opportunity/application/opportunity.lifecycle.js +181 -0
  366. package/dist/opportunity/application/opportunity.newborn-stamping.d.ts +41 -0
  367. package/dist/opportunity/application/opportunity.newborn-stamping.js +81 -0
  368. package/dist/opportunity/application/opportunity.pending-questions.d.ts +33 -0
  369. package/dist/opportunity/application/opportunity.pending-questions.js +42 -0
  370. package/dist/opportunity/application/opportunity.persist.d.ts +58 -0
  371. package/dist/opportunity/application/opportunity.persist.js +145 -0
  372. package/dist/opportunity/application/opportunity.persistence-admission.d.ts +39 -0
  373. package/dist/opportunity/application/opportunity.persistence-admission.js +59 -0
  374. package/dist/opportunity/application/opportunity.presenter.d.ts +156 -0
  375. package/dist/opportunity/application/opportunity.presenter.js +736 -0
  376. package/dist/opportunity/application/opportunity.tools.d.ts +131 -0
  377. package/dist/opportunity/application/opportunity.tools.js +1834 -0
  378. package/dist/opportunity/application/opportunity.update-admission.d.ts +24 -0
  379. package/dist/opportunity/application/opportunity.update-admission.js +38 -0
  380. package/dist/opportunity/delivery-card.cache.d.ts +5 -26
  381. package/dist/opportunity/delivery-card.cache.js +5 -44
  382. package/dist/opportunity/discovery-question.helper.d.ts +3 -17
  383. package/dist/opportunity/discovery-question.helper.js +3 -14
  384. package/dist/opportunity/discriminator/discriminator.adjustments.d.ts +0 -1
  385. package/dist/opportunity/discriminator/discriminator.adjustments.js +0 -1
  386. package/dist/opportunity/discriminator/discriminator.assigner.d.ts +4 -5
  387. package/dist/opportunity/discriminator/discriminator.assigner.js +0 -1
  388. package/dist/opportunity/discriminator/discriminator.env.d.ts +0 -1
  389. package/dist/opportunity/discriminator/discriminator.env.js +0 -1
  390. package/dist/opportunity/discriminator/discriminator.miner.d.ts +0 -1
  391. package/dist/opportunity/discriminator/discriminator.miner.js +0 -1
  392. package/dist/opportunity/discriminator/discriminator.push.d.ts +0 -1
  393. package/dist/opportunity/discriminator/discriminator.push.js +0 -1
  394. package/dist/opportunity/discriminator/discriminator.question.d.ts +0 -1
  395. package/dist/opportunity/discriminator/discriminator.question.js +0 -1
  396. package/dist/opportunity/discriminator/discriminator.scorer.d.ts +0 -1
  397. package/dist/opportunity/discriminator/discriminator.scorer.js +0 -1
  398. package/dist/opportunity/discriminator/discriminator.shadow.d.ts +0 -1
  399. package/dist/opportunity/discriminator/discriminator.shadow.js +0 -1
  400. package/dist/opportunity/discriminator/discriminator.types.d.ts +0 -1
  401. package/dist/opportunity/discriminator/discriminator.types.js +0 -1
  402. package/dist/opportunity/domain/discovery-question.helper.d.ts +18 -0
  403. package/dist/opportunity/domain/discovery-question.helper.js +15 -0
  404. package/dist/opportunity/domain/index.d.ts +55 -0
  405. package/dist/opportunity/domain/index.js +52 -0
  406. package/dist/opportunity/domain/negotiation-summary.builder.d.ts +37 -0
  407. package/dist/opportunity/domain/negotiation-summary.builder.js +66 -0
  408. package/dist/opportunity/domain/opportunity.actor.d.ts +15 -0
  409. package/dist/opportunity/domain/opportunity.actor.js +39 -0
  410. package/dist/opportunity/domain/opportunity.claim-safety.d.ts +24 -0
  411. package/dist/opportunity/domain/opportunity.claim-safety.js +88 -0
  412. package/dist/opportunity/domain/opportunity.discovery-run-coalescing.d.ts +33 -0
  413. package/dist/opportunity/domain/opportunity.discovery-run-coalescing.js +33 -0
  414. package/dist/opportunity/domain/opportunity.discovery.contracts.d.ts +45 -0
  415. package/dist/opportunity/domain/opportunity.discovery.contracts.js +1 -0
  416. package/dist/opportunity/domain/opportunity.evidence.d.ts +21 -0
  417. package/dist/opportunity/domain/opportunity.evidence.js +78 -0
  418. package/dist/opportunity/domain/opportunity.labels.d.ts +8 -0
  419. package/dist/opportunity/domain/opportunity.labels.js +10 -0
  420. package/dist/opportunity/domain/opportunity.presentation-cache.d.ts +6 -0
  421. package/dist/opportunity/domain/opportunity.presentation-cache.js +14 -0
  422. package/dist/opportunity/domain/opportunity.presentation.d.ts +76 -0
  423. package/dist/opportunity/domain/opportunity.presentation.js +516 -0
  424. package/dist/opportunity/domain/opportunity.safe-presentation.d.ts +104 -0
  425. package/dist/opportunity/domain/opportunity.safe-presentation.js +102 -0
  426. package/dist/opportunity/domain/opportunity.state.d.ts +519 -0
  427. package/dist/opportunity/domain/opportunity.state.js +309 -0
  428. package/dist/opportunity/domain/opportunity.utils.d.ts +217 -0
  429. package/dist/opportunity/domain/opportunity.utils.js +395 -0
  430. package/dist/opportunity/feed/feed.categorizer.d.ts +0 -1
  431. package/dist/opportunity/feed/feed.categorizer.js +0 -1
  432. package/dist/opportunity/feed/feed.graph.d.ts +1 -2
  433. package/dist/opportunity/feed/feed.graph.js +0 -1
  434. package/dist/opportunity/feed/feed.health.d.ts +0 -1
  435. package/dist/opportunity/feed/feed.health.js +0 -1
  436. package/dist/opportunity/feed/feed.state.d.ts +1 -2
  437. package/dist/opportunity/feed/feed.state.js +0 -1
  438. package/dist/opportunity/index.d.ts +37 -0
  439. package/dist/opportunity/index.js +37 -0
  440. package/dist/opportunity/negotiation-context.loader.d.ts +3 -58
  441. package/dist/opportunity/negotiation-context.loader.js +3 -87
  442. package/dist/opportunity/negotiation-evidence/negotiation-evidence.env.d.ts +0 -1
  443. package/dist/opportunity/negotiation-evidence/negotiation-evidence.env.js +0 -1
  444. package/dist/opportunity/negotiation-evidence/negotiation-evidence.extractor.d.ts +0 -1
  445. package/dist/opportunity/negotiation-evidence/negotiation-evidence.extractor.js +0 -1
  446. package/dist/opportunity/negotiation-evidence/negotiation-evidence.miner.d.ts +0 -1
  447. package/dist/opportunity/negotiation-evidence/negotiation-evidence.miner.js +0 -1
  448. package/dist/opportunity/negotiation-evidence/negotiation-evidence.shadow.d.ts +0 -1
  449. package/dist/opportunity/negotiation-evidence/negotiation-evidence.shadow.js +0 -1
  450. package/dist/opportunity/negotiation-evidence/negotiation-evidence.types.d.ts +0 -1
  451. package/dist/opportunity/negotiation-evidence/negotiation-evidence.types.js +0 -1
  452. package/dist/opportunity/negotiation-evidence/negotiation-evidence.verifier.d.ts +0 -1
  453. package/dist/opportunity/negotiation-evidence/negotiation-evidence.verifier.js +0 -1
  454. package/dist/opportunity/negotiation-summary.builder.d.ts +3 -36
  455. package/dist/opportunity/negotiation-summary.builder.js +3 -65
  456. package/dist/opportunity/opportunity.actor.d.ts +3 -14
  457. package/dist/opportunity/opportunity.actor.js +3 -38
  458. package/dist/opportunity/opportunity.card-presentation.d.ts +5 -0
  459. package/dist/opportunity/opportunity.card-presentation.js +5 -0
  460. package/dist/opportunity/opportunity.claim-safety.d.ts +3 -23
  461. package/dist/opportunity/opportunity.claim-safety.js +3 -87
  462. package/dist/opportunity/opportunity.discover.d.ts +3 -218
  463. package/dist/opportunity/opportunity.discover.js +3 -917
  464. package/dist/opportunity/opportunity.discovery-continuation-finalization.d.ts +5 -0
  465. package/dist/opportunity/opportunity.discovery-continuation-finalization.js +5 -0
  466. package/dist/opportunity/opportunity.discovery-mcp-lifecycle-finalization.d.ts +5 -0
  467. package/dist/opportunity/opportunity.discovery-mcp-lifecycle-finalization.js +5 -0
  468. package/dist/opportunity/opportunity.discovery-negotiation-summary.d.ts +5 -0
  469. package/dist/opportunity/opportunity.discovery-negotiation-summary.js +5 -0
  470. package/dist/opportunity/opportunity.discovery-run-coalescing.d.ts +5 -0
  471. package/dist/opportunity/opportunity.discovery-run-coalescing.js +5 -0
  472. package/dist/opportunity/opportunity.discovery.contracts.d.ts +5 -0
  473. package/dist/opportunity/opportunity.discovery.contracts.js +5 -0
  474. package/dist/opportunity/opportunity.enricher.d.ts +3 -70
  475. package/dist/opportunity/opportunity.enricher.js +3 -279
  476. package/dist/opportunity/opportunity.evaluator.d.ts +5 -276
  477. package/dist/opportunity/opportunity.evaluator.js +5 -460
  478. package/dist/opportunity/opportunity.evidence.d.ts +5 -22
  479. package/dist/opportunity/opportunity.evidence.js +5 -79
  480. package/dist/opportunity/opportunity.existing-negotiation.d.ts +5 -0
  481. package/dist/opportunity/opportunity.existing-negotiation.js +5 -0
  482. package/dist/opportunity/opportunity.feed-selection.d.ts +5 -0
  483. package/dist/opportunity/opportunity.feed-selection.js +5 -0
  484. package/dist/opportunity/opportunity.graph.d.ts +3 -1489
  485. package/dist/opportunity/opportunity.graph.js +3 -4071
  486. package/dist/opportunity/opportunity.introducer.d.ts +3 -76
  487. package/dist/opportunity/opportunity.introducer.js +3 -98
  488. package/dist/opportunity/opportunity.labels.d.ts +5 -9
  489. package/dist/opportunity/opportunity.labels.js +5 -11
  490. package/dist/opportunity/opportunity.lifecycle.d.ts +5 -0
  491. package/dist/opportunity/opportunity.lifecycle.js +5 -0
  492. package/dist/opportunity/opportunity.newborn-stamping.d.ts +5 -0
  493. package/dist/opportunity/opportunity.newborn-stamping.js +5 -0
  494. package/dist/opportunity/opportunity.pending-questions.d.ts +3 -32
  495. package/dist/opportunity/opportunity.pending-questions.js +3 -41
  496. package/dist/opportunity/opportunity.persist.d.ts +3 -57
  497. package/dist/opportunity/opportunity.persist.js +3 -144
  498. package/dist/opportunity/opportunity.persistence-admission.d.ts +5 -0
  499. package/dist/opportunity/opportunity.persistence-admission.js +5 -0
  500. package/dist/opportunity/opportunity.presentation-cache.d.ts +5 -7
  501. package/dist/opportunity/opportunity.presentation-cache.js +5 -15
  502. package/dist/opportunity/opportunity.presentation.d.ts +3 -75
  503. package/dist/opportunity/opportunity.presentation.js +3 -515
  504. package/dist/opportunity/opportunity.presenter.d.ts +10 -155
  505. package/dist/opportunity/opportunity.presenter.js +10 -735
  506. package/dist/opportunity/opportunity.safe-presentation.d.ts +3 -103
  507. package/dist/opportunity/opportunity.safe-presentation.js +3 -101
  508. package/dist/opportunity/opportunity.state.d.ts +3 -518
  509. package/dist/opportunity/opportunity.state.js +3 -308
  510. package/dist/opportunity/opportunity.tools.d.ts +3 -157
  511. package/dist/opportunity/opportunity.tools.js +3 -2238
  512. package/dist/opportunity/opportunity.update-admission.d.ts +5 -0
  513. package/dist/opportunity/opportunity.update-admission.js +5 -0
  514. package/dist/opportunity/opportunity.utils.d.ts +3 -216
  515. package/dist/opportunity/opportunity.utils.js +3 -394
  516. package/dist/opportunity/outcome/outcome.env.d.ts +0 -1
  517. package/dist/opportunity/outcome/outcome.env.js +0 -1
  518. package/dist/opportunity/outcome/outcome.hypotheses.d.ts +0 -1
  519. package/dist/opportunity/outcome/outcome.hypotheses.js +0 -1
  520. package/dist/opportunity/outcome/outcome.shadow.d.ts +0 -1
  521. package/dist/opportunity/outcome/outcome.shadow.js +0 -1
  522. package/dist/opportunity/outcome/outcome.types.d.ts +0 -1
  523. package/dist/opportunity/outcome/outcome.types.js +0 -1
  524. package/dist/opportunity/ports/index.d.ts +5 -0
  525. package/dist/opportunity/ports/index.js +1 -0
  526. package/dist/opportunity/ports/opportunity.tools.port.d.ts +5 -0
  527. package/dist/opportunity/ports/opportunity.tools.port.js +1 -0
  528. package/dist/opportunity/public/index.d.ts +58 -0
  529. package/dist/opportunity/public/index.js +51 -0
  530. package/dist/participant-agents/application/agent.tools.d.ts +16 -0
  531. package/dist/participant-agents/application/agent.tools.js +313 -0
  532. package/dist/participant-agents/application/index.d.ts +21 -0
  533. package/dist/participant-agents/application/index.js +22 -0
  534. package/dist/participant-agents/domain/agent.types.d.ts +76 -0
  535. package/dist/participant-agents/domain/agent.types.js +22 -0
  536. package/dist/participant-agents/domain/index.d.ts +20 -0
  537. package/dist/participant-agents/domain/index.js +1 -0
  538. package/dist/participant-agents/index.d.ts +24 -0
  539. package/dist/participant-agents/index.js +24 -0
  540. package/dist/participant-agents/ports/agent.dispatcher.port.d.ts +25 -0
  541. package/dist/participant-agents/ports/agent.dispatcher.port.js +1 -0
  542. package/dist/participant-agents/ports/agent.repository.port.d.ts +118 -0
  543. package/dist/participant-agents/ports/agent.repository.port.js +10 -0
  544. package/dist/participant-agents/ports/agent.tools.port.d.ts +24 -0
  545. package/dist/participant-agents/ports/agent.tools.port.js +20 -0
  546. package/dist/participant-agents/ports/index.d.ts +29 -0
  547. package/dist/participant-agents/ports/index.js +27 -0
  548. package/dist/participant-agents/public/index.d.ts +39 -0
  549. package/dist/participant-agents/public/index.js +36 -0
  550. package/dist/participant-context/application/index.d.ts +73 -0
  551. package/dist/participant-context/application/index.js +83 -0
  552. package/dist/participant-context/domain/index.d.ts +67 -0
  553. package/dist/participant-context/domain/index.js +68 -0
  554. package/dist/participant-context/index.d.ts +16 -0
  555. package/dist/participant-context/index.js +16 -0
  556. package/dist/participant-context/ports/index.d.ts +37 -0
  557. package/dist/participant-context/ports/index.js +34 -0
  558. package/dist/participant-context/public/index.d.ts +48 -0
  559. package/dist/participant-context/public/index.js +55 -0
  560. package/dist/platform/index.d.ts +19 -0
  561. package/dist/platform/index.js +23 -0
  562. package/dist/premise/premise.analyzer.d.ts +0 -1
  563. package/dist/premise/premise.analyzer.js +0 -2
  564. package/dist/premise/premise.decomposer.d.ts +0 -1
  565. package/dist/premise/premise.decomposer.js +0 -2
  566. package/dist/premise/premise.graph.d.ts +1 -2
  567. package/dist/premise/premise.graph.js +0 -2
  568. package/dist/premise/premise.indexer.d.ts +0 -1
  569. package/dist/premise/premise.indexer.js +0 -2
  570. package/dist/premise/premise.state.d.ts +1 -2
  571. package/dist/premise/premise.state.js +0 -1
  572. package/dist/premise/premise.tools.d.ts +3 -3
  573. package/dist/premise/premise.tools.js +0 -2
  574. package/dist/public/index.d.ts +17 -0
  575. package/dist/public/index.js +17 -0
  576. package/dist/questioner/questioner.agent.d.ts +4 -27
  577. package/dist/questioner/questioner.agent.js +3 -133
  578. package/dist/questioner/questioner.ask.tool.d.ts +3 -12
  579. package/dist/questioner/questioner.ask.tool.js +3 -299
  580. package/dist/questioner/questioner.discovery.prompt.d.ts +3 -7
  581. package/dist/questioner/questioner.discovery.prompt.js +3 -180
  582. package/dist/questioner/questioner.env.d.ts +3 -57
  583. package/dist/questioner/questioner.env.js +3 -93
  584. package/dist/questioner/questioner.presets.d.ts +4 -19
  585. package/dist/questioner/questioner.presets.js +3 -465
  586. package/dist/questioner/questioner.qud.d.ts +3 -6
  587. package/dist/questioner/questioner.qud.js +3 -10
  588. package/dist/questioner/questioner.tools.d.ts +3 -15
  589. package/dist/questioner/questioner.tools.js +3 -186
  590. package/dist/questioner/questioner.types.d.ts +4 -218
  591. package/dist/questioner/questioner.types.js +5 -62
  592. package/dist/questions/application/index.d.ts +39 -0
  593. package/dist/questions/application/index.js +41 -0
  594. package/dist/questions/application/question.agent.d.ts +28 -0
  595. package/dist/questions/application/question.agent.js +139 -0
  596. package/dist/questions/application/question.ask.tool.d.ts +12 -0
  597. package/dist/questions/application/question.ask.tool.js +300 -0
  598. package/dist/questions/application/question.discovery.prompt.d.ts +8 -0
  599. package/dist/questions/application/question.discovery.prompt.js +181 -0
  600. package/dist/questions/application/question.env.d.ts +61 -0
  601. package/dist/questions/application/question.env.js +97 -0
  602. package/dist/questions/application/question.input.d.ts +237 -0
  603. package/dist/questions/application/question.input.js +61 -0
  604. package/dist/questions/application/question.presets.d.ts +24 -0
  605. package/dist/questions/application/question.presets.js +445 -0
  606. package/dist/questions/application/question.qud.d.ts +12 -0
  607. package/dist/questions/application/question.qud.js +16 -0
  608. package/dist/questions/application/question.tools.d.ts +15 -0
  609. package/dist/questions/application/question.tools.js +190 -0
  610. package/dist/questions/domain/index.d.ts +25 -0
  611. package/dist/questions/domain/index.js +25 -0
  612. package/dist/questions/domain/question.schema.d.ts +1537 -0
  613. package/dist/questions/domain/question.schema.js +422 -0
  614. package/dist/questions/index.d.ts +22 -0
  615. package/dist/questions/index.js +22 -0
  616. package/dist/questions/ports/index.d.ts +29 -0
  617. package/dist/questions/ports/index.js +27 -0
  618. package/dist/questions/ports/question.generator.port.d.ts +34 -0
  619. package/dist/questions/ports/question.generator.port.js +1 -0
  620. package/dist/questions/ports/question.persistence.port.d.ts +87 -0
  621. package/dist/questions/ports/question.persistence.port.js +1 -0
  622. package/dist/questions/ports/question.tools.port.d.ts +15 -0
  623. package/dist/questions/ports/question.tools.port.js +1 -0
  624. package/dist/questions/public/index.d.ts +47 -0
  625. package/dist/questions/public/index.js +49 -0
  626. package/dist/runtime/background/index.d.ts +14 -0
  627. package/dist/runtime/background/index.js +14 -0
  628. package/dist/runtime/foreground/composition/tool.factory.d.ts +16 -0
  629. package/dist/runtime/foreground/composition/tool.factory.js +224 -0
  630. package/dist/runtime/foreground/composition/tool.registry.d.ts +11 -0
  631. package/dist/runtime/foreground/composition/tool.registry.js +106 -0
  632. package/dist/runtime/foreground/index.d.ts +13 -0
  633. package/dist/runtime/foreground/index.js +13 -0
  634. package/dist/runtime/foreground/signals/intent.tools.d.ts +13 -0
  635. package/dist/runtime/foreground/signals/intent.tools.js +13 -0
  636. package/dist/shared/agent/model-signal.d.ts +0 -1
  637. package/dist/shared/agent/model-signal.js +0 -1
  638. package/dist/shared/agent/model.config.d.ts +0 -1
  639. package/dist/shared/agent/model.config.js +0 -1
  640. package/dist/shared/agent/tool.factory.d.ts +4 -15
  641. package/dist/shared/agent/tool.factory.js +4 -226
  642. package/dist/shared/agent/tool.helpers.d.ts +51 -12
  643. package/dist/shared/agent/tool.helpers.js +0 -1
  644. package/dist/shared/agent/tool.registry.d.ts +9 -9
  645. package/dist/shared/agent/tool.registry.js +9 -104
  646. package/dist/shared/agent/tool.runtime.d.ts +0 -1
  647. package/dist/shared/agent/tool.runtime.js +0 -1
  648. package/dist/shared/agent/tool.scope.d.ts +0 -1
  649. package/dist/shared/agent/tool.scope.js +0 -1
  650. package/dist/shared/agent/utility.tools.d.ts +5 -3
  651. package/dist/shared/agent/utility.tools.js +0 -1
  652. package/dist/shared/assignment/network-assignment.policy.d.ts +0 -1
  653. package/dist/shared/assignment/network-assignment.policy.js +0 -1
  654. package/dist/shared/hyde/hyde.documents.d.ts +0 -1
  655. package/dist/shared/hyde/hyde.documents.js +0 -1
  656. package/dist/shared/hyde/hyde.env.d.ts +0 -1
  657. package/dist/shared/hyde/hyde.env.js +0 -1
  658. package/dist/shared/hyde/hyde.frame.d.ts +4 -5
  659. package/dist/shared/hyde/hyde.frame.js +0 -1
  660. package/dist/shared/hyde/hyde.generator.d.ts +0 -1
  661. package/dist/shared/hyde/hyde.generator.js +0 -1
  662. package/dist/shared/hyde/hyde.graph.d.ts +0 -1
  663. package/dist/shared/hyde/hyde.graph.js +0 -1
  664. package/dist/shared/hyde/hyde.state.d.ts +0 -1
  665. package/dist/shared/hyde/hyde.state.js +0 -1
  666. package/dist/shared/hyde/hyde.strategies.d.ts +0 -1
  667. package/dist/shared/hyde/hyde.strategies.js +0 -1
  668. package/dist/shared/hyde/hyde.validator.d.ts +0 -1
  669. package/dist/shared/hyde/hyde.validator.js +0 -1
  670. package/dist/shared/hyde/lens.inferrer.d.ts +6 -7
  671. package/dist/shared/hyde/lens.inferrer.js +0 -1
  672. package/dist/shared/interfaces/agent-dispatcher.interface.d.ts +4 -1
  673. package/dist/shared/interfaces/agent-dispatcher.interface.js +4 -1
  674. package/dist/shared/interfaces/agent.interface.d.ts +13 -173
  675. package/dist/shared/interfaces/agent.interface.js +12 -12
  676. package/dist/shared/interfaces/auth.interface.d.ts +0 -1
  677. package/dist/shared/interfaces/auth.interface.js +0 -1
  678. package/dist/shared/interfaces/cache.interface.d.ts +0 -1
  679. package/dist/shared/interfaces/cache.interface.js +0 -1
  680. package/dist/shared/interfaces/chat-message-writer.interface.d.ts +0 -1
  681. package/dist/shared/interfaces/chat-message-writer.interface.js +0 -1
  682. package/dist/shared/interfaces/chat-session.interface.d.ts +0 -1
  683. package/dist/shared/interfaces/chat-session.interface.js +0 -1
  684. package/dist/shared/interfaces/chat-summary.interface.d.ts +0 -1
  685. package/dist/shared/interfaces/chat-summary.interface.js +0 -1
  686. package/dist/shared/interfaces/connect-link.interface.d.ts +0 -1
  687. package/dist/shared/interfaces/connect-link.interface.js +0 -1
  688. package/dist/shared/interfaces/contact.interface.d.ts +7 -55
  689. package/dist/shared/interfaces/contact.interface.js +7 -1
  690. package/dist/shared/interfaces/database.interface.d.ts +0 -1
  691. package/dist/shared/interfaces/database.interface.js +0 -1
  692. package/dist/shared/interfaces/delivery-ledger.interface.d.ts +0 -1
  693. package/dist/shared/interfaces/delivery-ledger.interface.js +0 -1
  694. package/dist/shared/interfaces/discovery-run.interface.d.ts +2 -3
  695. package/dist/shared/interfaces/discovery-run.interface.js +0 -1
  696. package/dist/shared/interfaces/embedder.interface.d.ts +0 -1
  697. package/dist/shared/interfaces/embedder.interface.js +0 -1
  698. package/dist/shared/interfaces/enrichment-run.interface.d.ts +2 -3
  699. package/dist/shared/interfaces/enrichment-run.interface.js +0 -1
  700. package/dist/shared/interfaces/enrichment.interface.d.ts +0 -1
  701. package/dist/shared/interfaces/enrichment.interface.js +0 -1
  702. package/dist/shared/interfaces/integration.interface.d.ts +6 -88
  703. package/dist/shared/interfaces/integration.interface.js +7 -1
  704. package/dist/shared/interfaces/negotiation-events.interface.d.ts +0 -1
  705. package/dist/shared/interfaces/negotiation-events.interface.js +0 -1
  706. package/dist/shared/interfaces/negotiation-summary.interface.d.ts +0 -1
  707. package/dist/shared/interfaces/negotiation-summary.interface.js +0 -1
  708. package/dist/shared/interfaces/negotiator-memory.interface.d.ts +0 -1
  709. package/dist/shared/interfaces/negotiator-memory.interface.js +0 -1
  710. package/dist/shared/interfaces/question-generator.interface.d.ts +3 -28
  711. package/dist/shared/interfaces/question-generator.interface.js +0 -1
  712. package/dist/shared/interfaces/questioner.interface.d.ts +3 -77
  713. package/dist/shared/interfaces/questioner.interface.js +0 -1
  714. package/dist/shared/interfaces/queue.interface.d.ts +0 -1
  715. package/dist/shared/interfaces/queue.interface.js +0 -1
  716. package/dist/shared/interfaces/scraper.interface.d.ts +0 -1
  717. package/dist/shared/interfaces/scraper.interface.js +0 -1
  718. package/dist/shared/interfaces/tool-request-context.interface.d.ts +12 -0
  719. package/dist/shared/interfaces/tool-request-context.interface.js +1 -0
  720. package/dist/shared/network/metadata.renderer.d.ts +0 -1
  721. package/dist/shared/network/metadata.renderer.js +0 -1
  722. package/dist/shared/observability/debug-meta.sanitizer.d.ts +0 -1
  723. package/dist/shared/observability/debug-meta.sanitizer.js +0 -1
  724. package/dist/shared/observability/log.d.ts +0 -1
  725. package/dist/shared/observability/log.js +0 -1
  726. package/dist/shared/observability/performance.d.ts +0 -1
  727. package/dist/shared/observability/performance.js +0 -1
  728. package/dist/shared/observability/protocol.logger.d.ts +0 -1
  729. package/dist/shared/observability/protocol.logger.js +0 -1
  730. package/dist/shared/observability/request-context.d.ts +0 -1
  731. package/dist/shared/observability/request-context.js +0 -1
  732. package/dist/shared/observability/trace.d.ts +0 -1
  733. package/dist/shared/observability/trace.js +0 -1
  734. package/dist/shared/schemas/chat-context.schema.d.ts +0 -1
  735. package/dist/shared/schemas/chat-context.schema.js +0 -1
  736. package/dist/shared/schemas/discovery-question.schema.d.ts +17 -18
  737. package/dist/shared/schemas/discovery-question.schema.js +0 -1
  738. package/dist/shared/schemas/identity.schema.d.ts +0 -1
  739. package/dist/shared/schemas/identity.schema.js +0 -1
  740. package/dist/shared/schemas/mcp-auth.schema.d.ts +0 -1
  741. package/dist/shared/schemas/mcp-auth.schema.js +0 -1
  742. package/dist/shared/schemas/negotiation-digest.schema.d.ts +5 -6
  743. package/dist/shared/schemas/negotiation-digest.schema.js +0 -1
  744. package/dist/shared/schemas/negotiation-state.schema.d.ts +4 -5
  745. package/dist/shared/schemas/negotiation-state.schema.js +0 -1
  746. package/dist/shared/schemas/network-assignment.schema.d.ts +0 -1
  747. package/dist/shared/schemas/network-assignment.schema.js +0 -1
  748. package/dist/shared/schemas/pending-question.schema.d.ts +0 -1
  749. package/dist/shared/schemas/pending-question.schema.js +0 -1
  750. package/dist/shared/schemas/question.schema.d.ts +3 -1535
  751. package/dist/shared/schemas/question.schema.js +3 -420
  752. package/dist/shared/ui/lucide.icon-catalog.d.ts +0 -1
  753. package/dist/shared/ui/lucide.icon-catalog.js +0 -1
  754. package/dist/shared/utils/social-label.d.ts +0 -1
  755. package/dist/shared/utils/social-label.js +0 -1
  756. package/dist/shared/utils/telegram-handle.d.ts +0 -1
  757. package/dist/shared/utils/telegram-handle.js +0 -1
  758. package/dist/signals/application/index.d.ts +19 -0
  759. package/dist/signals/application/index.js +22 -0
  760. package/dist/signals/application/intent.clarifier.d.ts +51 -0
  761. package/dist/signals/application/intent.clarifier.js +201 -0
  762. package/dist/signals/application/intent.graph.d.ts +552 -0
  763. package/dist/signals/application/intent.graph.js +938 -0
  764. package/dist/signals/application/intent.indexer.d.ts +82 -0
  765. package/dist/signals/application/intent.indexer.js +170 -0
  766. package/dist/signals/application/intent.inferrer.d.ts +94 -0
  767. package/dist/signals/application/intent.inferrer.js +233 -0
  768. package/dist/signals/application/intent.reconciler.d.ts +105 -0
  769. package/dist/signals/application/intent.reconciler.js +186 -0
  770. package/dist/signals/application/intent.tools.d.ts +24 -0
  771. package/dist/signals/application/intent.tools.js +789 -0
  772. package/dist/signals/application/intent.verifier.d.ts +115 -0
  773. package/dist/signals/application/intent.verifier.js +262 -0
  774. package/dist/signals/domain/index.d.ts +9 -0
  775. package/dist/signals/domain/index.js +11 -0
  776. package/dist/signals/domain/intent.state.d.ts +230 -0
  777. package/dist/signals/domain/intent.state.js +190 -0
  778. package/dist/signals/domain/signal.specificity.d.ts +2 -0
  779. package/dist/signals/domain/signal.specificity.js +2 -0
  780. package/dist/signals/index.d.ts +13 -0
  781. package/dist/signals/index.js +13 -0
  782. package/dist/signals/ports/index.d.ts +15 -0
  783. package/dist/signals/ports/index.js +13 -0
  784. package/dist/signals/public/index.d.ts +15 -0
  785. package/dist/signals/public/index.js +16 -0
  786. package/package.json +14 -3
  787. package/dist/agent/agent.tools.d.ts.map +0 -1
  788. package/dist/agent/agent.tools.js.map +0 -1
  789. package/dist/agent/tests/fakes.d.ts +0 -25
  790. package/dist/agent/tests/fakes.d.ts.map +0 -1
  791. package/dist/agent/tests/fakes.js +0 -178
  792. package/dist/agent/tests/fakes.js.map +0 -1
  793. package/dist/chat/chat-streaming.types.d.ts.map +0 -1
  794. package/dist/chat/chat-streaming.types.js.map +0 -1
  795. package/dist/chat/chat.agent.d.ts.map +0 -1
  796. package/dist/chat/chat.agent.js.map +0 -1
  797. package/dist/chat/chat.graph.d.ts.map +0 -1
  798. package/dist/chat/chat.graph.js.map +0 -1
  799. package/dist/chat/chat.interrupt.classifier.d.ts.map +0 -1
  800. package/dist/chat/chat.interrupt.classifier.js.map +0 -1
  801. package/dist/chat/chat.persona.d.ts.map +0 -1
  802. package/dist/chat/chat.persona.js.map +0 -1
  803. package/dist/chat/chat.prompt.d.ts.map +0 -1
  804. package/dist/chat/chat.prompt.js.map +0 -1
  805. package/dist/chat/chat.prompt.modules.d.ts.map +0 -1
  806. package/dist/chat/chat.prompt.modules.js.map +0 -1
  807. package/dist/chat/chat.question-dedup.d.ts.map +0 -1
  808. package/dist/chat/chat.question-dedup.js.map +0 -1
  809. package/dist/chat/chat.state.d.ts.map +0 -1
  810. package/dist/chat/chat.state.js.map +0 -1
  811. package/dist/chat/chat.streamer.d.ts.map +0 -1
  812. package/dist/chat/chat.streamer.js.map +0 -1
  813. package/dist/chat/chat.suggester.d.ts.map +0 -1
  814. package/dist/chat/chat.suggester.js.map +0 -1
  815. package/dist/chat/chat.summarizer.d.ts.map +0 -1
  816. package/dist/chat/chat.summarizer.js.map +0 -1
  817. package/dist/chat/chat.title.generator.d.ts.map +0 -1
  818. package/dist/chat/chat.title.generator.js.map +0 -1
  819. package/dist/chat/chat.tools.d.ts.map +0 -1
  820. package/dist/chat/chat.tools.js.map +0 -1
  821. package/dist/chat/chat.utils.d.ts.map +0 -1
  822. package/dist/chat/chat.utils.js.map +0 -1
  823. package/dist/chat/negotiator.persona.d.ts.map +0 -1
  824. package/dist/chat/negotiator.persona.js.map +0 -1
  825. package/dist/chat/negotiator.prompt.d.ts.map +0 -1
  826. package/dist/chat/negotiator.prompt.js.map +0 -1
  827. package/dist/chat/negotiator.tools.d.ts.map +0 -1
  828. package/dist/chat/negotiator.tools.js.map +0 -1
  829. package/dist/chat/onboarding.persona.d.ts.map +0 -1
  830. package/dist/chat/onboarding.persona.js.map +0 -1
  831. package/dist/chat/onboarding.prompt.d.ts.map +0 -1
  832. package/dist/chat/onboarding.prompt.js.map +0 -1
  833. package/dist/chat/reporter.action.tools.d.ts.map +0 -1
  834. package/dist/chat/reporter.action.tools.js.map +0 -1
  835. package/dist/chat/reporter.persona.d.ts.map +0 -1
  836. package/dist/chat/reporter.persona.js.map +0 -1
  837. package/dist/chat/reporter.prompt.d.ts.map +0 -1
  838. package/dist/chat/reporter.prompt.js.map +0 -1
  839. package/dist/chat/signal.persona.d.ts.map +0 -1
  840. package/dist/chat/signal.persona.js.map +0 -1
  841. package/dist/chat/signal.prompt.d.ts.map +0 -1
  842. package/dist/chat/signal.prompt.js.map +0 -1
  843. package/dist/chat/tests/chat.graph.mocks.d.ts +0 -98
  844. package/dist/chat/tests/chat.graph.mocks.d.ts.map +0 -1
  845. package/dist/chat/tests/chat.graph.mocks.js +0 -225
  846. package/dist/chat/tests/chat.graph.mocks.js.map +0 -1
  847. package/dist/contact/contact.inviter.d.ts.map +0 -1
  848. package/dist/contact/contact.inviter.js.map +0 -1
  849. package/dist/contact/contact.tools.d.ts.map +0 -1
  850. package/dist/contact/contact.tools.js.map +0 -1
  851. package/dist/context/context.generator.d.ts.map +0 -1
  852. package/dist/context/context.generator.js.map +0 -1
  853. package/dist/enrichment/enrichment.enricher.d.ts.map +0 -1
  854. package/dist/enrichment/enrichment.enricher.js.map +0 -1
  855. package/dist/enrichment/enrichment.generator.d.ts.map +0 -1
  856. package/dist/enrichment/enrichment.generator.js.map +0 -1
  857. package/dist/enrichment/enrichment.graph.d.ts.map +0 -1
  858. package/dist/enrichment/enrichment.graph.js.map +0 -1
  859. package/dist/enrichment/enrichment.state.d.ts.map +0 -1
  860. package/dist/enrichment/enrichment.state.js.map +0 -1
  861. package/dist/enrichment/enrichment.tools.d.ts.map +0 -1
  862. package/dist/enrichment/enrichment.tools.js.map +0 -1
  863. package/dist/index.d.ts.map +0 -1
  864. package/dist/index.js.map +0 -1
  865. package/dist/integration/integration.tools.d.ts.map +0 -1
  866. package/dist/integration/integration.tools.js.map +0 -1
  867. package/dist/intent/intent.clarifier.d.ts.map +0 -1
  868. package/dist/intent/intent.clarifier.js.map +0 -1
  869. package/dist/intent/intent.graph.d.ts.map +0 -1
  870. package/dist/intent/intent.graph.js.map +0 -1
  871. package/dist/intent/intent.indexer.d.ts.map +0 -1
  872. package/dist/intent/intent.indexer.js.map +0 -1
  873. package/dist/intent/intent.inferrer.d.ts.map +0 -1
  874. package/dist/intent/intent.inferrer.js.map +0 -1
  875. package/dist/intent/intent.reconciler.d.ts.map +0 -1
  876. package/dist/intent/intent.reconciler.js.map +0 -1
  877. package/dist/intent/intent.specificity.d.ts.map +0 -1
  878. package/dist/intent/intent.specificity.js.map +0 -1
  879. package/dist/intent/intent.state.d.ts.map +0 -1
  880. package/dist/intent/intent.state.js.map +0 -1
  881. package/dist/intent/intent.tools.d.ts.map +0 -1
  882. package/dist/intent/intent.tools.js.map +0 -1
  883. package/dist/intent/intent.verifier.d.ts.map +0 -1
  884. package/dist/intent/intent.verifier.js.map +0 -1
  885. package/dist/maintenance/maintenance.graph.d.ts.map +0 -1
  886. package/dist/maintenance/maintenance.graph.js.map +0 -1
  887. package/dist/maintenance/maintenance.state.d.ts.map +0 -1
  888. package/dist/maintenance/maintenance.state.js.map +0 -1
  889. package/dist/mcp/elicitation.builder.d.ts.map +0 -1
  890. package/dist/mcp/elicitation.builder.js.map +0 -1
  891. package/dist/mcp/elicitation.dispatcher.d.ts.map +0 -1
  892. package/dist/mcp/elicitation.dispatcher.js.map +0 -1
  893. package/dist/mcp/mcp.server.d.ts.map +0 -1
  894. package/dist/mcp/mcp.server.js.map +0 -1
  895. package/dist/negotiation/insight.generator.d.ts.map +0 -1
  896. package/dist/negotiation/insight.generator.js.map +0 -1
  897. package/dist/negotiation/negotiation.agent.d.ts.map +0 -1
  898. package/dist/negotiation/negotiation.agent.js.map +0 -1
  899. package/dist/negotiation/negotiation.attribution.d.ts.map +0 -1
  900. package/dist/negotiation/negotiation.attribution.js.map +0 -1
  901. package/dist/negotiation/negotiation.consultation-policy.d.ts.map +0 -1
  902. package/dist/negotiation/negotiation.consultation-policy.js.map +0 -1
  903. package/dist/negotiation/negotiation.deadlock.d.ts.map +0 -1
  904. package/dist/negotiation/negotiation.deadlock.js.map +0 -1
  905. package/dist/negotiation/negotiation.graph.d.ts.map +0 -1
  906. package/dist/negotiation/negotiation.graph.js.map +0 -1
  907. package/dist/negotiation/negotiation.memory.d.ts.map +0 -1
  908. package/dist/negotiation/negotiation.memory.js.map +0 -1
  909. package/dist/negotiation/negotiation.protocol.d.ts.map +0 -1
  910. package/dist/negotiation/negotiation.protocol.js.map +0 -1
  911. package/dist/negotiation/negotiation.question-safety.d.ts.map +0 -1
  912. package/dist/negotiation/negotiation.question-safety.js.map +0 -1
  913. package/dist/negotiation/negotiation.reflect.d.ts.map +0 -1
  914. package/dist/negotiation/negotiation.reflect.js.map +0 -1
  915. package/dist/negotiation/negotiation.screen.d.ts.map +0 -1
  916. package/dist/negotiation/negotiation.screen.js.map +0 -1
  917. package/dist/negotiation/negotiation.state.d.ts.map +0 -1
  918. package/dist/negotiation/negotiation.state.js.map +0 -1
  919. package/dist/negotiation/negotiation.summarizer.d.ts.map +0 -1
  920. package/dist/negotiation/negotiation.summarizer.js.map +0 -1
  921. package/dist/negotiation/negotiation.tools.d.ts.map +0 -1
  922. package/dist/negotiation/negotiation.tools.js.map +0 -1
  923. package/dist/network/indexer/indexer.graph.d.ts.map +0 -1
  924. package/dist/network/indexer/indexer.graph.js.map +0 -1
  925. package/dist/network/indexer/indexer.state.d.ts.map +0 -1
  926. package/dist/network/indexer/indexer.state.js.map +0 -1
  927. package/dist/network/membership/membership.graph.d.ts.map +0 -1
  928. package/dist/network/membership/membership.graph.js.map +0 -1
  929. package/dist/network/membership/membership.state.d.ts.map +0 -1
  930. package/dist/network/membership/membership.state.js.map +0 -1
  931. package/dist/network/network.graph.d.ts.map +0 -1
  932. package/dist/network/network.graph.js.map +0 -1
  933. package/dist/network/network.recommender.d.ts.map +0 -1
  934. package/dist/network/network.recommender.js.map +0 -1
  935. package/dist/network/network.state.d.ts.map +0 -1
  936. package/dist/network/network.state.js.map +0 -1
  937. package/dist/network/network.tools.d.ts.map +0 -1
  938. package/dist/network/network.tools.js.map +0 -1
  939. package/dist/opportunity/delivery-card.cache.d.ts.map +0 -1
  940. package/dist/opportunity/delivery-card.cache.js.map +0 -1
  941. package/dist/opportunity/discovery-question.helper.d.ts.map +0 -1
  942. package/dist/opportunity/discovery-question.helper.js.map +0 -1
  943. package/dist/opportunity/discriminator/discriminator.adjustments.d.ts.map +0 -1
  944. package/dist/opportunity/discriminator/discriminator.adjustments.js.map +0 -1
  945. package/dist/opportunity/discriminator/discriminator.assigner.d.ts.map +0 -1
  946. package/dist/opportunity/discriminator/discriminator.assigner.js.map +0 -1
  947. package/dist/opportunity/discriminator/discriminator.env.d.ts.map +0 -1
  948. package/dist/opportunity/discriminator/discriminator.env.js.map +0 -1
  949. package/dist/opportunity/discriminator/discriminator.miner.d.ts.map +0 -1
  950. package/dist/opportunity/discriminator/discriminator.miner.js.map +0 -1
  951. package/dist/opportunity/discriminator/discriminator.push.d.ts.map +0 -1
  952. package/dist/opportunity/discriminator/discriminator.push.js.map +0 -1
  953. package/dist/opportunity/discriminator/discriminator.question.d.ts.map +0 -1
  954. package/dist/opportunity/discriminator/discriminator.question.js.map +0 -1
  955. package/dist/opportunity/discriminator/discriminator.scorer.d.ts.map +0 -1
  956. package/dist/opportunity/discriminator/discriminator.scorer.js.map +0 -1
  957. package/dist/opportunity/discriminator/discriminator.shadow.d.ts.map +0 -1
  958. package/dist/opportunity/discriminator/discriminator.shadow.js.map +0 -1
  959. package/dist/opportunity/discriminator/discriminator.types.d.ts.map +0 -1
  960. package/dist/opportunity/discriminator/discriminator.types.js.map +0 -1
  961. package/dist/opportunity/feed/feed.categorizer.d.ts.map +0 -1
  962. package/dist/opportunity/feed/feed.categorizer.js.map +0 -1
  963. package/dist/opportunity/feed/feed.graph.d.ts.map +0 -1
  964. package/dist/opportunity/feed/feed.graph.js.map +0 -1
  965. package/dist/opportunity/feed/feed.health.d.ts.map +0 -1
  966. package/dist/opportunity/feed/feed.health.js.map +0 -1
  967. package/dist/opportunity/feed/feed.state.d.ts.map +0 -1
  968. package/dist/opportunity/feed/feed.state.js.map +0 -1
  969. package/dist/opportunity/negotiation-context.loader.d.ts.map +0 -1
  970. package/dist/opportunity/negotiation-context.loader.js.map +0 -1
  971. package/dist/opportunity/negotiation-evidence/negotiation-evidence.env.d.ts.map +0 -1
  972. package/dist/opportunity/negotiation-evidence/negotiation-evidence.env.js.map +0 -1
  973. package/dist/opportunity/negotiation-evidence/negotiation-evidence.extractor.d.ts.map +0 -1
  974. package/dist/opportunity/negotiation-evidence/negotiation-evidence.extractor.js.map +0 -1
  975. package/dist/opportunity/negotiation-evidence/negotiation-evidence.miner.d.ts.map +0 -1
  976. package/dist/opportunity/negotiation-evidence/negotiation-evidence.miner.js.map +0 -1
  977. package/dist/opportunity/negotiation-evidence/negotiation-evidence.shadow.d.ts.map +0 -1
  978. package/dist/opportunity/negotiation-evidence/negotiation-evidence.shadow.js.map +0 -1
  979. package/dist/opportunity/negotiation-evidence/negotiation-evidence.types.d.ts.map +0 -1
  980. package/dist/opportunity/negotiation-evidence/negotiation-evidence.types.js.map +0 -1
  981. package/dist/opportunity/negotiation-evidence/negotiation-evidence.verifier.d.ts.map +0 -1
  982. package/dist/opportunity/negotiation-evidence/negotiation-evidence.verifier.js.map +0 -1
  983. package/dist/opportunity/negotiation-summary.builder.d.ts.map +0 -1
  984. package/dist/opportunity/negotiation-summary.builder.js.map +0 -1
  985. package/dist/opportunity/opportunity.actor.d.ts.map +0 -1
  986. package/dist/opportunity/opportunity.actor.js.map +0 -1
  987. package/dist/opportunity/opportunity.claim-safety.d.ts.map +0 -1
  988. package/dist/opportunity/opportunity.claim-safety.js.map +0 -1
  989. package/dist/opportunity/opportunity.discover.d.ts.map +0 -1
  990. package/dist/opportunity/opportunity.discover.js.map +0 -1
  991. package/dist/opportunity/opportunity.enricher.d.ts.map +0 -1
  992. package/dist/opportunity/opportunity.enricher.js.map +0 -1
  993. package/dist/opportunity/opportunity.evaluator.d.ts.map +0 -1
  994. package/dist/opportunity/opportunity.evaluator.js.map +0 -1
  995. package/dist/opportunity/opportunity.evidence.d.ts.map +0 -1
  996. package/dist/opportunity/opportunity.evidence.js.map +0 -1
  997. package/dist/opportunity/opportunity.graph.d.ts.map +0 -1
  998. package/dist/opportunity/opportunity.graph.js.map +0 -1
  999. package/dist/opportunity/opportunity.introducer.d.ts.map +0 -1
  1000. package/dist/opportunity/opportunity.introducer.js.map +0 -1
  1001. package/dist/opportunity/opportunity.labels.d.ts.map +0 -1
  1002. package/dist/opportunity/opportunity.labels.js.map +0 -1
  1003. package/dist/opportunity/opportunity.pending-questions.d.ts.map +0 -1
  1004. package/dist/opportunity/opportunity.pending-questions.js.map +0 -1
  1005. package/dist/opportunity/opportunity.persist.d.ts.map +0 -1
  1006. package/dist/opportunity/opportunity.persist.js.map +0 -1
  1007. package/dist/opportunity/opportunity.presentation-cache.d.ts.map +0 -1
  1008. package/dist/opportunity/opportunity.presentation-cache.js.map +0 -1
  1009. package/dist/opportunity/opportunity.presentation.d.ts.map +0 -1
  1010. package/dist/opportunity/opportunity.presentation.js.map +0 -1
  1011. package/dist/opportunity/opportunity.presenter.d.ts.map +0 -1
  1012. package/dist/opportunity/opportunity.presenter.js.map +0 -1
  1013. package/dist/opportunity/opportunity.safe-presentation.d.ts.map +0 -1
  1014. package/dist/opportunity/opportunity.safe-presentation.js.map +0 -1
  1015. package/dist/opportunity/opportunity.state.d.ts.map +0 -1
  1016. package/dist/opportunity/opportunity.state.js.map +0 -1
  1017. package/dist/opportunity/opportunity.tools.d.ts.map +0 -1
  1018. package/dist/opportunity/opportunity.tools.js.map +0 -1
  1019. package/dist/opportunity/opportunity.utils.d.ts.map +0 -1
  1020. package/dist/opportunity/opportunity.utils.js.map +0 -1
  1021. package/dist/opportunity/outcome/outcome.env.d.ts.map +0 -1
  1022. package/dist/opportunity/outcome/outcome.env.js.map +0 -1
  1023. package/dist/opportunity/outcome/outcome.hypotheses.d.ts.map +0 -1
  1024. package/dist/opportunity/outcome/outcome.hypotheses.js.map +0 -1
  1025. package/dist/opportunity/outcome/outcome.shadow.d.ts.map +0 -1
  1026. package/dist/opportunity/outcome/outcome.shadow.js.map +0 -1
  1027. package/dist/opportunity/outcome/outcome.types.d.ts.map +0 -1
  1028. package/dist/opportunity/outcome/outcome.types.js.map +0 -1
  1029. package/dist/premise/premise.analyzer.d.ts.map +0 -1
  1030. package/dist/premise/premise.analyzer.js.map +0 -1
  1031. package/dist/premise/premise.decomposer.d.ts.map +0 -1
  1032. package/dist/premise/premise.decomposer.js.map +0 -1
  1033. package/dist/premise/premise.graph.d.ts.map +0 -1
  1034. package/dist/premise/premise.graph.js.map +0 -1
  1035. package/dist/premise/premise.indexer.d.ts.map +0 -1
  1036. package/dist/premise/premise.indexer.js.map +0 -1
  1037. package/dist/premise/premise.state.d.ts.map +0 -1
  1038. package/dist/premise/premise.state.js.map +0 -1
  1039. package/dist/premise/premise.tools.d.ts.map +0 -1
  1040. package/dist/premise/premise.tools.js.map +0 -1
  1041. package/dist/questioner/questioner.agent.d.ts.map +0 -1
  1042. package/dist/questioner/questioner.agent.js.map +0 -1
  1043. package/dist/questioner/questioner.ask.tool.d.ts.map +0 -1
  1044. package/dist/questioner/questioner.ask.tool.js.map +0 -1
  1045. package/dist/questioner/questioner.discovery.prompt.d.ts.map +0 -1
  1046. package/dist/questioner/questioner.discovery.prompt.js.map +0 -1
  1047. package/dist/questioner/questioner.env.d.ts.map +0 -1
  1048. package/dist/questioner/questioner.env.js.map +0 -1
  1049. package/dist/questioner/questioner.presets.d.ts.map +0 -1
  1050. package/dist/questioner/questioner.presets.js.map +0 -1
  1051. package/dist/questioner/questioner.qud.d.ts.map +0 -1
  1052. package/dist/questioner/questioner.qud.js.map +0 -1
  1053. package/dist/questioner/questioner.tools.d.ts.map +0 -1
  1054. package/dist/questioner/questioner.tools.js.map +0 -1
  1055. package/dist/questioner/questioner.types.d.ts.map +0 -1
  1056. package/dist/questioner/questioner.types.js.map +0 -1
  1057. package/dist/shared/agent/model-signal.d.ts.map +0 -1
  1058. package/dist/shared/agent/model-signal.js.map +0 -1
  1059. package/dist/shared/agent/model.config.d.ts.map +0 -1
  1060. package/dist/shared/agent/model.config.js.map +0 -1
  1061. package/dist/shared/agent/tests/llm-assert.d.ts +0 -11
  1062. package/dist/shared/agent/tests/llm-assert.d.ts.map +0 -1
  1063. package/dist/shared/agent/tests/llm-assert.js +0 -43
  1064. package/dist/shared/agent/tests/llm-assert.js.map +0 -1
  1065. package/dist/shared/agent/tool.factory.d.ts.map +0 -1
  1066. package/dist/shared/agent/tool.factory.js.map +0 -1
  1067. package/dist/shared/agent/tool.helpers.d.ts.map +0 -1
  1068. package/dist/shared/agent/tool.helpers.js.map +0 -1
  1069. package/dist/shared/agent/tool.registry.d.ts.map +0 -1
  1070. package/dist/shared/agent/tool.registry.js.map +0 -1
  1071. package/dist/shared/agent/tool.runtime.d.ts.map +0 -1
  1072. package/dist/shared/agent/tool.runtime.js.map +0 -1
  1073. package/dist/shared/agent/tool.scope.d.ts.map +0 -1
  1074. package/dist/shared/agent/tool.scope.js.map +0 -1
  1075. package/dist/shared/agent/utility.tools.d.ts.map +0 -1
  1076. package/dist/shared/agent/utility.tools.js.map +0 -1
  1077. package/dist/shared/assignment/network-assignment.policy.d.ts.map +0 -1
  1078. package/dist/shared/assignment/network-assignment.policy.js.map +0 -1
  1079. package/dist/shared/hyde/hyde.documents.d.ts.map +0 -1
  1080. package/dist/shared/hyde/hyde.documents.js.map +0 -1
  1081. package/dist/shared/hyde/hyde.env.d.ts.map +0 -1
  1082. package/dist/shared/hyde/hyde.env.js.map +0 -1
  1083. package/dist/shared/hyde/hyde.frame.d.ts.map +0 -1
  1084. package/dist/shared/hyde/hyde.frame.js.map +0 -1
  1085. package/dist/shared/hyde/hyde.generator.d.ts.map +0 -1
  1086. package/dist/shared/hyde/hyde.generator.js.map +0 -1
  1087. package/dist/shared/hyde/hyde.graph.d.ts.map +0 -1
  1088. package/dist/shared/hyde/hyde.graph.js.map +0 -1
  1089. package/dist/shared/hyde/hyde.state.d.ts.map +0 -1
  1090. package/dist/shared/hyde/hyde.state.js.map +0 -1
  1091. package/dist/shared/hyde/hyde.strategies.d.ts.map +0 -1
  1092. package/dist/shared/hyde/hyde.strategies.js.map +0 -1
  1093. package/dist/shared/hyde/hyde.validator.d.ts.map +0 -1
  1094. package/dist/shared/hyde/hyde.validator.js.map +0 -1
  1095. package/dist/shared/hyde/lens.inferrer.d.ts.map +0 -1
  1096. package/dist/shared/hyde/lens.inferrer.js.map +0 -1
  1097. package/dist/shared/interfaces/agent-dispatcher.interface.d.ts.map +0 -1
  1098. package/dist/shared/interfaces/agent-dispatcher.interface.js.map +0 -1
  1099. package/dist/shared/interfaces/agent.interface.d.ts.map +0 -1
  1100. package/dist/shared/interfaces/agent.interface.js.map +0 -1
  1101. package/dist/shared/interfaces/auth.interface.d.ts.map +0 -1
  1102. package/dist/shared/interfaces/auth.interface.js.map +0 -1
  1103. package/dist/shared/interfaces/cache.interface.d.ts.map +0 -1
  1104. package/dist/shared/interfaces/cache.interface.js.map +0 -1
  1105. package/dist/shared/interfaces/chat-message-writer.interface.d.ts.map +0 -1
  1106. package/dist/shared/interfaces/chat-message-writer.interface.js.map +0 -1
  1107. package/dist/shared/interfaces/chat-session.interface.d.ts.map +0 -1
  1108. package/dist/shared/interfaces/chat-session.interface.js.map +0 -1
  1109. package/dist/shared/interfaces/chat-summary.interface.d.ts.map +0 -1
  1110. package/dist/shared/interfaces/chat-summary.interface.js.map +0 -1
  1111. package/dist/shared/interfaces/connect-link.interface.d.ts.map +0 -1
  1112. package/dist/shared/interfaces/connect-link.interface.js.map +0 -1
  1113. package/dist/shared/interfaces/contact.interface.d.ts.map +0 -1
  1114. package/dist/shared/interfaces/contact.interface.js.map +0 -1
  1115. package/dist/shared/interfaces/database.interface.d.ts.map +0 -1
  1116. package/dist/shared/interfaces/database.interface.js.map +0 -1
  1117. package/dist/shared/interfaces/delivery-ledger.interface.d.ts.map +0 -1
  1118. package/dist/shared/interfaces/delivery-ledger.interface.js.map +0 -1
  1119. package/dist/shared/interfaces/discovery-run.interface.d.ts.map +0 -1
  1120. package/dist/shared/interfaces/discovery-run.interface.js.map +0 -1
  1121. package/dist/shared/interfaces/embedder.interface.d.ts.map +0 -1
  1122. package/dist/shared/interfaces/embedder.interface.js.map +0 -1
  1123. package/dist/shared/interfaces/enrichment-run.interface.d.ts.map +0 -1
  1124. package/dist/shared/interfaces/enrichment-run.interface.js.map +0 -1
  1125. package/dist/shared/interfaces/enrichment.interface.d.ts.map +0 -1
  1126. package/dist/shared/interfaces/enrichment.interface.js.map +0 -1
  1127. package/dist/shared/interfaces/integration.interface.d.ts.map +0 -1
  1128. package/dist/shared/interfaces/integration.interface.js.map +0 -1
  1129. package/dist/shared/interfaces/negotiation-events.interface.d.ts.map +0 -1
  1130. package/dist/shared/interfaces/negotiation-events.interface.js.map +0 -1
  1131. package/dist/shared/interfaces/negotiation-summary.interface.d.ts.map +0 -1
  1132. package/dist/shared/interfaces/negotiation-summary.interface.js.map +0 -1
  1133. package/dist/shared/interfaces/negotiator-memory.interface.d.ts.map +0 -1
  1134. package/dist/shared/interfaces/negotiator-memory.interface.js.map +0 -1
  1135. package/dist/shared/interfaces/question-generator.interface.d.ts.map +0 -1
  1136. package/dist/shared/interfaces/question-generator.interface.js.map +0 -1
  1137. package/dist/shared/interfaces/questioner.interface.d.ts.map +0 -1
  1138. package/dist/shared/interfaces/questioner.interface.js.map +0 -1
  1139. package/dist/shared/interfaces/queue.interface.d.ts.map +0 -1
  1140. package/dist/shared/interfaces/queue.interface.js.map +0 -1
  1141. package/dist/shared/interfaces/scraper.interface.d.ts.map +0 -1
  1142. package/dist/shared/interfaces/scraper.interface.js.map +0 -1
  1143. package/dist/shared/network/metadata.renderer.d.ts.map +0 -1
  1144. package/dist/shared/network/metadata.renderer.js.map +0 -1
  1145. package/dist/shared/observability/debug-meta.sanitizer.d.ts.map +0 -1
  1146. package/dist/shared/observability/debug-meta.sanitizer.js.map +0 -1
  1147. package/dist/shared/observability/log.d.ts.map +0 -1
  1148. package/dist/shared/observability/log.js.map +0 -1
  1149. package/dist/shared/observability/performance.d.ts.map +0 -1
  1150. package/dist/shared/observability/performance.js.map +0 -1
  1151. package/dist/shared/observability/protocol.logger.d.ts.map +0 -1
  1152. package/dist/shared/observability/protocol.logger.js.map +0 -1
  1153. package/dist/shared/observability/request-context.d.ts.map +0 -1
  1154. package/dist/shared/observability/request-context.js.map +0 -1
  1155. package/dist/shared/observability/trace.d.ts.map +0 -1
  1156. package/dist/shared/observability/trace.js.map +0 -1
  1157. package/dist/shared/schemas/chat-context.schema.d.ts.map +0 -1
  1158. package/dist/shared/schemas/chat-context.schema.js.map +0 -1
  1159. package/dist/shared/schemas/discovery-question.schema.d.ts.map +0 -1
  1160. package/dist/shared/schemas/discovery-question.schema.js.map +0 -1
  1161. package/dist/shared/schemas/identity.schema.d.ts.map +0 -1
  1162. package/dist/shared/schemas/identity.schema.js.map +0 -1
  1163. package/dist/shared/schemas/mcp-auth.schema.d.ts.map +0 -1
  1164. package/dist/shared/schemas/mcp-auth.schema.js.map +0 -1
  1165. package/dist/shared/schemas/negotiation-digest.schema.d.ts.map +0 -1
  1166. package/dist/shared/schemas/negotiation-digest.schema.js.map +0 -1
  1167. package/dist/shared/schemas/negotiation-state.schema.d.ts.map +0 -1
  1168. package/dist/shared/schemas/negotiation-state.schema.js.map +0 -1
  1169. package/dist/shared/schemas/network-assignment.schema.d.ts.map +0 -1
  1170. package/dist/shared/schemas/network-assignment.schema.js.map +0 -1
  1171. package/dist/shared/schemas/pending-question.schema.d.ts.map +0 -1
  1172. package/dist/shared/schemas/pending-question.schema.js.map +0 -1
  1173. package/dist/shared/schemas/question.schema.d.ts.map +0 -1
  1174. package/dist/shared/schemas/question.schema.js.map +0 -1
  1175. package/dist/shared/ui/lucide.icon-catalog.d.ts.map +0 -1
  1176. package/dist/shared/ui/lucide.icon-catalog.js.map +0 -1
  1177. package/dist/shared/utils/social-label.d.ts.map +0 -1
  1178. package/dist/shared/utils/social-label.js.map +0 -1
  1179. package/dist/shared/utils/telegram-handle.d.ts.map +0 -1
  1180. package/dist/shared/utils/telegram-handle.js.map +0 -1
@@ -1,1461 +1,5 @@
1
- import { StateGraph } from "@langchain/langgraph";
2
- import { invokeWithAbortSignal } from "../shared/agent/model-signal.js";
3
- import { requestContext } from "../shared/observability/request-context.js";
4
- import { NegotiationGraphState } from "./negotiation.state.js";
5
- import { IndexNegotiator } from "./negotiation.agent.js";
6
- import { ASK_USER_LOCK_SLACK_MS, allowedActionsFor, askUserAnswerWindowMs, configuredAskUserEnabled, configuredProtocolVersion, fallbackActionFor, isRejectLikeAction, isTerminalAction, readProtocolVersion, rejectActionFor } from "./negotiation.protocol.js";
7
- import { assessConsultationEligibility, consultationPromptFor, negotiationConsultationPolicyMode } from "./negotiation.consultation-policy.js";
8
- import { NegotiationScreener, configuredScreenMode } from "./negotiation.screen.js";
9
- import { assessDeadlock, configuredDeadlockShiftEnabled, configuredDeadlockThreshold } from "./negotiation.deadlock.js";
10
- import { protocolLogger } from "../shared/observability/protocol.logger.js";
11
- import { NEGOTIATION_QUESTION_GENERIC_COUNTERPARTY, NEGOTIATION_QUESTION_GENERIC_NETWORK, negotiationQuestionSettlementId, validateInflightAskUserFields } from './negotiation.question-safety.js';
12
- import { attributedDialogueIsEmpty, buildSeededAttribution, combineAttributedDialogue } from './negotiation.attribution.js';
13
- const logger = protocolLogger("NegotiationGraph");
14
- const initLog = protocolLogger("NegotiationGraph:Init");
15
- const screenNodeLog = protocolLogger("NegotiationGraph:Screen");
16
- const turnLog = protocolLogger("NegotiationGraph:Turn");
17
- const finalizeLog = protocolLogger("NegotiationGraph:Finalize");
18
- const negotiateCandidatesLog = protocolLogger("NegotiationGraph:negotiateCandidates");
19
- /** Extracts the ordered NegotiationTurn list from A2A message data parts. */
20
- function turnsFromMessages(messages) {
21
- return messages
22
- .map((m) => {
23
- const dataPart = m.parts.find((p) => p.kind === "data");
24
- return dataPart?.data;
25
- })
26
- .filter(Boolean);
27
- }
28
1
  /**
29
- * Whether `userId`'s side has already spent its one `ask_user` client
30
- * consultation in this conversation (P3.2 rationing: max one per negotiation
31
- * per side, checked against the full message history so continuations count
32
- * prior sessions' consultations too).
2
+ * Thin backward-compat shim IND-550.
3
+ * Canonical location: negotiation/application/negotiation.graph.ts
33
4
  */
34
- function hasPriorAskUser(messages, userId) {
35
- const sender = `agent:${userId}`;
36
- return messages.some((m) => {
37
- if (m.senderId !== sender)
38
- return false;
39
- const dataPart = m.parts.find((p) => p.kind === "data");
40
- return dataPart?.data?.action === "ask_user";
41
- });
42
- }
43
- /** Capture immutable, internal-only intent provenance at task creation time. */
44
- function buildIntentSnapshots(sourceUser, candidateUser) {
45
- const snapshots = [];
46
- const seen = new Set();
47
- for (const user of [sourceUser, candidateUser]) {
48
- if (typeof user.id !== 'string' || user.id.trim().length === 0)
49
- continue;
50
- for (const intent of Array.isArray(user.intents) ? user.intents : []) {
51
- if (typeof intent?.id !== 'string' || intent.id.trim().length === 0)
52
- continue;
53
- const key = `${user.id}\u0000${intent.id}`;
54
- if (seen.has(key))
55
- continue;
56
- seen.add(key);
57
- snapshots.push({
58
- userId: user.id,
59
- intentId: intent.id,
60
- title: typeof intent.title === 'string' ? intent.title : '',
61
- description: typeof intent.description === 'string' ? intent.description : '',
62
- });
63
- }
64
- }
65
- return snapshots;
66
- }
67
- /**
68
- * Factory for the bilateral negotiation LangGraph state machine.
69
- * @remarks Accepts an AgentDispatcher for per-turn agent resolution.
70
- */
71
- export class NegotiationGraphFactory {
72
- constructor(database, dispatcher, timeoutQueue, questionerEnqueue, reflectEnqueue, memoryRetrieve) {
73
- this.database = database;
74
- this.dispatcher = dispatcher;
75
- this.timeoutQueue = timeoutQueue;
76
- this.questionerEnqueue = questionerEnqueue;
77
- this.reflectEnqueue = reflectEnqueue;
78
- this.memoryRetrieve = memoryRetrieve;
79
- }
80
- createGraph() {
81
- const { database, dispatcher, timeoutQueue, questionerEnqueue, reflectEnqueue, memoryRetrieve } = this;
82
- const systemAgent = new IndexNegotiator();
83
- const screener = new NegotiationScreener();
84
- /**
85
- * P5.3 memory retrieval — never throws, never blocks a negotiation. The
86
- * injected fn already resolves [] when NEGOTIATOR_MEMORY_INJECT is off;
87
- * this wrapper adds the graph-side failure guard.
88
- */
89
- const retrieveMemory = async (userId, counterpartyUserId, queryText, scope) => {
90
- if (!memoryRetrieve)
91
- return [];
92
- try {
93
- return await memoryRetrieve({ userId, counterpartyUserId, queryText, scope });
94
- }
95
- catch (err) {
96
- logger.warn("Negotiator memory retrieval failed; proceeding without memory", {
97
- userId,
98
- scope,
99
- error: err instanceof Error ? err.message : String(err),
100
- });
101
- return [];
102
- }
103
- };
104
- /**
105
- * IND-569: resolve a prior negotiation task's attribution metadata for the
106
- * per-opportunity prior-dialogue labels. Never throws — any failure returns
107
- * null so the turns degrade to the unattributed block instead of leaking
108
- * into the current opportunity's context.
109
- */
110
- const resolveTaskAttribution = async (taskId) => {
111
- try {
112
- const task = await database.getTask(taskId);
113
- if (!task)
114
- return null;
115
- const md = (task.metadata ?? {});
116
- const opportunityId = typeof md.opportunityId === 'string' && md.opportunityId.length > 0 ? md.opportunityId : null;
117
- const snapshots = Array.isArray(md.intentSnapshots) ? md.intentSnapshots : [];
118
- const sourceIntentId = typeof md.sourceIntentId === 'string' ? md.sourceIntentId : null;
119
- const snap = snapshots.find((s) => s && s.intentId === sourceIntentId) ?? snapshots[0];
120
- const opportunityTitle = snap && typeof snap.title === 'string' && snap.title.trim().length > 0 ? snap.title : null;
121
- let outcome = null;
122
- try {
123
- const artifacts = await database.getArtifactsForTask(taskId);
124
- const outArtifact = artifacts.find((a) => a.name === 'negotiation-outcome');
125
- if (outArtifact) {
126
- const firstPart = Array.isArray(outArtifact.parts) ? outArtifact.parts[0] : undefined;
127
- const data = firstPart?.data;
128
- if (data && typeof data.hasOpportunity === 'boolean') {
129
- outcome = data.hasOpportunity ? 'accepted' : (data.reason === 'screened_out' ? 'not pursued' : 'declined');
130
- }
131
- else if (typeof outArtifact.metadata?.continuationOutcome === 'string') {
132
- outcome = outArtifact.metadata.continuationOutcome;
133
- }
134
- }
135
- }
136
- catch { /* outcome stays null; header degrades to "outcome unknown" */ }
137
- const concludedAt = task.updatedAt instanceof Date
138
- ? task.updatedAt.toISOString()
139
- : (task.updatedAt ? new Date(task.updatedAt).toISOString() : null);
140
- return { opportunityId, opportunityTitle, outcome, concludedAt };
141
- }
142
- catch {
143
- return null;
144
- }
145
- };
146
- /**
147
- * IND-569: build the attributed prior dialogue passed to the screener and
148
- * turn prompts. Combines the immutable seeded attribution (earlier + legacy
149
- * unattributed blocks, resolved once in init) with this session's own turns
150
- * (task-id-matched). Null when there is no seeded attribution.
151
- */
152
- const buildAttributedDialogue = (state) => {
153
- if (!state.isContinuation || !state.priorAttribution)
154
- return null;
155
- const currentSessionTurns = turnsFromMessages(state.messages.filter((m) => m.taskId === state.taskId));
156
- const dialogue = combineAttributedDialogue(state.priorAttribution, currentSessionTurns);
157
- return attributedDialogueIsEmpty(dialogue) ? null : dialogue;
158
- };
159
- /** Similarity query text: seed reasoning + counterparty context. */
160
- const memoryQueryText = (state, counterparty) => [
161
- state.discoveryQuery ? `Search: ${state.discoveryQuery}` : "",
162
- state.seedAssessment?.reasoning ?? "",
163
- counterparty?.profile?.name ?? "",
164
- counterparty?.profile?.bio ?? "",
165
- (counterparty?.intents ?? []).slice(0, 5).map((i) => `${i.title}: ${i.description}`).join("\n"),
166
- ].filter(Boolean).join("\n");
167
- const initNode = async (state) => {
168
- try {
169
- // Exact continuations reuse the prior conversation and preclaimed
170
- // successor; they must not create any mutable state before the fence.
171
- const agentIdA = `agent:${state.sourceUser.id}`;
172
- const agentIdB = `agent:${state.candidateUser.id}`;
173
- const execution = state.continuationExecution;
174
- const conversation = execution
175
- ? { id: execution.conversationId }
176
- : await database.getOrCreateDM(agentIdA, agentIdB, 'agent');
177
- // --- Lock gate: check for an active task on this conversation ---
178
- const priorMessages = await database.getMessagesForConversation(conversation.id);
179
- const activeStates = ['submitted', 'working', 'input_required', 'waiting_for_agent', 'claimed'];
180
- const isActiveAndFresh = (t) => {
181
- if (!activeStates.includes(t.state))
182
- return false;
183
- // State-aware freshness (IND-401): an `input_required` task is an
184
- // ask_user pause — it holds the conversation lock for its full answer
185
- // window (+ slack for the expiry worker), not the 5-min turn window.
186
- // Otherwise ambient rediscovery / chat negotiate_existing would start
187
- // a fresh negotiation right past the pause after 5 minutes.
188
- const freshnessMs = t.state === 'input_required'
189
- ? askUserAnswerWindowMs() + ASK_USER_LOCK_SLACK_MS
190
- : 5 * 60 * 1000;
191
- return (Date.now() - new Date(t.updatedAt).getTime()) < freshnessMs;
192
- };
193
- if (Boolean(state.resumeFromTaskId) !== Boolean(state.continuationSettlementId)
194
- || Boolean(state.resumeFromTaskId) !== Boolean(execution))
195
- return { error: 'invalid continuation correlation' };
196
- const exactContinuation = state.resumeFromTaskId && state.continuationSettlementId && execution
197
- ? { taskId: state.resumeFromTaskId, settlementId: state.continuationSettlementId, execution }
198
- : null;
199
- const priorTask = exactContinuation
200
- ? await database.getTask(exactContinuation.taskId)
201
- : state.opportunityId
202
- ? await database.getNegotiationTaskForOpportunity(state.opportunityId)
203
- : null;
204
- const claimedSuccessor = exactContinuation
205
- ? await database.getTask(exactContinuation.execution.successorTaskId)
206
- : null;
207
- if (exactContinuation) {
208
- const settlement = priorTask?.metadata?.questionSettlement;
209
- const storedExecution = claimedSuccessor?.metadata?.continuationExecution;
210
- if (!priorTask
211
- || priorTask.conversationId !== conversation.id
212
- || priorTask.state !== 'canceled'
213
- || priorTask.metadata?.opportunityId !== state.opportunityId
214
- || settlement?.settlementId !== exactContinuation.settlementId
215
- || settlement?.taskId !== exactContinuation.taskId
216
- || !claimedSuccessor
217
- || claimedSuccessor.conversationId !== conversation.id
218
- || storedExecution?.token !== exactContinuation.execution.token
219
- || storedExecution?.fence !== exactContinuation.execution.fence
220
- || storedExecution?.status !== 'claimed')
221
- return { error: 'invalid exact continuation task' };
222
- }
223
- const isLocked = !exactContinuation && !!priorTask && isActiveAndFresh(priorTask);
224
- if (isLocked) {
225
- initLog.info('Conversation locked by active task, returning busy', {
226
- conversationId: conversation.id,
227
- opportunityId: state.opportunityId,
228
- });
229
- return { error: 'busy' };
230
- }
231
- // --- Load prior messages and determine continuation ---
232
- const priorTurns = turnsFromMessages(priorMessages);
233
- const isContinuation = priorTurns.length > 0;
234
- // Determine currentSpeaker from last prior message. An `ask_user` last
235
- // turn does NOT pass the floor: the sender paused to consult its own
236
- // client, so on resume the same side speaks again — now armed with the
237
- // client's answer (or its recorded absence). Flipping here would hand
238
- // the turn to the counterparty, who has nothing to respond to.
239
- let currentSpeaker = 'source';
240
- if (isContinuation && priorMessages.length > 0) {
241
- const lastMessage = priorMessages[priorMessages.length - 1];
242
- const lastAction = turnsFromMessages([lastMessage])[0]?.action;
243
- if (lastAction === 'ask_user') {
244
- currentSpeaker = lastMessage.senderId === agentIdA ? 'source' : 'candidate';
245
- }
246
- else {
247
- currentSpeaker = lastMessage.senderId === agentIdA ? 'candidate' : 'source';
248
- }
249
- }
250
- // Determine scenario-based maxTurns
251
- const scope = { action: 'manage:negotiations', scopeType: 'network', scopeId: state.indexContext.networkId };
252
- const [sourceHasAgent, candidateHasAgent] = await Promise.all([
253
- dispatcher.hasExternalAgent(state.sourceUser.id, scope),
254
- dispatcher.hasExternalAgent(state.candidateUser.id, scope),
255
- ]);
256
- const ambientMax = Number(process.env.NEGOTIATION_MAX_TURNS_AMBIENT) || 6;
257
- let maxTurns = state.maxTurns;
258
- if (maxTurns == null) {
259
- maxTurns = (sourceHasAgent && candidateHasAgent) ? 0 : ambientMax;
260
- }
261
- // --- Initiator seat resolution (v2: rigid per match, stamped at discovery) ---
262
- // 1. Continuations inherit from the prior task for the same opportunity —
263
- // never re-derive, so the seat cannot flip between sessions.
264
- // 2. Conversation-scoped tie-break: if another negotiation on this DM is
265
- // active and fresh (symmetric concurrent start under a different
266
- // opportunityId — the opportunity-scoped lock above cannot see it),
267
- // the first created task keeps the seat; this run inherits its stamp.
268
- // 3. Otherwise: explicit stamp from the caller, falling back to the
269
- // session's sourceUser (pre-stamp heuristic behavior, unchanged).
270
- const readInitiator = (metadata) => {
271
- const v = metadata?.initiatorUserId;
272
- return typeof v === 'string' && v.length > 0 ? v : null;
273
- };
274
- let initiatorUserId = readInitiator(priorTask?.metadata) ?? state.initiatorUserId ?? state.sourceUser.id;
275
- // Conversation-scoped prior task: used only for the initiator tie-break
276
- // (and only when active+fresh).
277
- const convTask = !exactContinuation && !readInitiator(priorTask?.metadata)
278
- ? await database.getLatestNegotiationTaskForConversation?.(conversation.id).catch(() => null)
279
- : null;
280
- if (!readInitiator(priorTask?.metadata)) {
281
- if (convTask && convTask.id !== priorTask?.id && isActiveAndFresh(convTask)) {
282
- const convInitiator = readInitiator(convTask.metadata);
283
- if (convInitiator) {
284
- initLog.info('Conversation-scoped tie-break: inheriting initiator seat from concurrent task', {
285
- conversationId: conversation.id,
286
- winningTaskId: convTask.id,
287
- initiatorUserId: convInitiator,
288
- });
289
- initiatorUserId = convInitiator;
290
- }
291
- }
292
- }
293
- // --- Protocol version: pinned per negotiation, re-stamped per match ---
294
- // A prior task for this same negotiation (exact continuation resume or
295
- // a re-run of the same opportunity) pins the version, so one
296
- // negotiation never flips semantics mid-flight (absent field on a
297
- // genuine prior = pre-v2 task = v1). Everything else — including
298
- // continuations of older conversations between the same pair — stamps
299
- // fresh from NEGOTIATION_PROTOCOL_VERSION, so a version cutover
300
- // reaches existing pairs on their next new match instead of being
301
- // pinned to v1 forever by conversation history.
302
- const protocolVersion = priorTask
303
- ? (readProtocolVersion(priorTask.metadata) ?? 'v1')
304
- : configuredProtocolVersion();
305
- const taskMetadata = {
306
- type: 'negotiation',
307
- sourceUserId: state.sourceUser.id,
308
- initiatorUserId,
309
- protocolVersion,
310
- candidateUserId: state.candidateUser.id,
311
- networkId: state.indexContext.networkId,
312
- sourceIntentId: state.sourceIntentId,
313
- candidateIntentId: state.candidateIntentId,
314
- participantBindings: [
315
- ...(state.sourceIntentId ? [{ userId: state.sourceUser.id, intentId: state.sourceIntentId, networkId: state.indexContext.networkId }] : []),
316
- ...(state.candidateIntentId ? [{ userId: state.candidateUser.id, intentId: state.candidateIntentId, networkId: state.indexContext.networkId }] : []),
317
- ],
318
- intentSnapshots: buildIntentSnapshots(state.sourceUser, state.candidateUser),
319
- ...(state.opportunityId && { opportunityId: state.opportunityId }),
320
- maxTurns,
321
- isContinuation,
322
- priorTurnCount: priorTurns.length,
323
- ...(exactContinuation ? {
324
- resumeFromTaskId: exactContinuation.taskId,
325
- continuationSettlementId: exactContinuation.settlementId,
326
- } : {}),
327
- };
328
- if (state.opportunityId && Boolean(state.opportunityStatus) !== Boolean(state.opportunityUpdatedAt)) {
329
- throw new Error('Negotiation attempt requires both opportunity status and updatedAt');
330
- }
331
- const task = exactContinuation
332
- ? claimedSuccessor
333
- : state.opportunityId && state.opportunityStatus && state.opportunityUpdatedAt
334
- ? await database.createNegotiationTaskForAttempt({
335
- conversationId: conversation.id,
336
- opportunityId: state.opportunityId,
337
- expectedStatus: state.opportunityStatus,
338
- expectedUpdatedAt: state.opportunityUpdatedAt,
339
- metadata: taskMetadata,
340
- })
341
- : await database.createTask(conversation.id, taskMetadata);
342
- if (!task) {
343
- throw new Error('Negotiation attempt is stale or already claimed');
344
- }
345
- // Attempt-bound discovery atomically promoted the exact persisted state
346
- // to `negotiating` while inserting the task. Legacy/direct invocations
347
- // with only an opportunity ID retain the prior best-effort status update.
348
- if (state.opportunityId && !state.opportunityUpdatedAt) {
349
- await database.updateOpportunityStatus(state.opportunityId, 'negotiating').catch((err) => {
350
- initLog.error('Failed to set opportunity status to negotiating', { opportunityId: state.opportunityId, error: err });
351
- });
352
- }
353
- // Load user answers collected by the questioner between sessions
354
- const userAnswers = (isContinuation && state.opportunityId)
355
- ? await database.getOpportunityUserAnswers(state.opportunityId).catch((err) => {
356
- initLog.error('Failed to load user answers', { opportunityId: state.opportunityId, error: err });
357
- return [];
358
- })
359
- : [];
360
- // Seed messages with prior turns (additive reducer appends new turns on top).
361
- // taskId is preserved so the turn/screen nodes can separate this
362
- // session's turns from seeded prior-task turns (IND-569).
363
- const seedMessages = isContinuation ? priorMessages.map((m) => ({
364
- id: m.id,
365
- senderId: m.senderId,
366
- role: 'agent',
367
- parts: m.parts,
368
- createdAt: m.createdAt,
369
- taskId: m.taskId ?? null,
370
- })) : [];
371
- // IND-569: attribute seeded prior turns to their originating opportunity
372
- // once, up front. Earlier-opportunity and legacy unattributed blocks are
373
- // immutable for the session; the current block is composed per turn.
374
- const priorAttribution = isContinuation
375
- ? await buildSeededAttribution(priorMessages
376
- .map((m) => ({ taskId: m.taskId ?? null, turn: turnsFromMessages([m])[0] }))
377
- .filter((e) => Boolean(e.turn)), state.opportunityId, resolveTaskAttribution)
378
- : null;
379
- return {
380
- conversationId: conversation.id,
381
- taskId: task.id,
382
- currentSpeaker,
383
- turnCount: 0,
384
- maxTurns,
385
- isContinuation,
386
- initiatorUserId,
387
- protocolVersion,
388
- priorTurnCount: priorTurns.length,
389
- ...(priorAttribution && { priorAttribution }),
390
- ...(userAnswers.length > 0 && { userAnswers }),
391
- ...(exactContinuation?.execution.consultation
392
- ? { privateConsultation: exactContinuation.execution.consultation }
393
- : {}),
394
- ...(exactContinuation && (() => {
395
- const turnContext = priorTask?.metadata?.turnContext;
396
- const reason = turnContext?.consultationPolicyReason;
397
- return typeof reason === 'string' ? { consultationPolicyReason: reason } : {};
398
- })()),
399
- ...(seedMessages.length > 0 && { messages: seedMessages }),
400
- };
401
- }
402
- catch (err) {
403
- return { error: `Init failed: ${err instanceof Error ? err.message : String(err)}` };
404
- }
405
- };
406
- /**
407
- * Screen node (P2.1) — the outreach gate. Runs between init and the first
408
- * turn on FRESH negotiations only (routing skips it on continuations and
409
- * when NEGOTIATION_SCREEN_MODE=off). The reaching client's negotiator
410
- * decides whether the match is worth its client's name; in shadow mode the
411
- * decision is recorded (task metadata + trace event + log line) but never
412
- * blocks — the negotiation always proceeds to the first turn. In enforce
413
- * mode (P2.2) a `pass` routes straight to finalize: zero turns, zero
414
- * counterparty involvement, outcome `reason: "screened_out"`, opportunity
415
- * quietly `rejected` (init had already flipped it to `negotiating`).
416
- * A failed screen still fails OPEN in every mode.
417
- */
418
- const screenNode = async (state) => {
419
- const traceEmitter = requestContext.getStore()?.traceEmitter;
420
- const emitWide = (event) => traceEmitter?.(event);
421
- const mode = configuredScreenMode();
422
- const start = Date.now();
423
- // The client is the initiator seat's user — the side whose negotiator is
424
- // reaching out. Fresh runs stamp initiatorUserId in init; fall back to
425
- // sourceUser (what the stamp defaults to anyway).
426
- const initiatorId = state.initiatorUserId ?? state.sourceUser.id;
427
- const clientIsSource = initiatorId !== state.candidateUser.id;
428
- const clientUser = clientIsSource ? state.sourceUser : state.candidateUser;
429
- const counterpartyUser = clientIsSource ? state.candidateUser : state.sourceUser;
430
- // P5.3: the client's own negotiator memory informs the outreach gate.
431
- // Cached into state so the client's first turn reuses it.
432
- const clientSide = clientIsSource ? "source" : "candidate";
433
- const clientMemory = state.memoryBySide?.[clientSide]
434
- ?? (memoryRetrieve
435
- ? await retrieveMemory(clientUser.id, counterpartyUser.id, memoryQueryText(state, counterpartyUser), "screen")
436
- : []);
437
- let decision;
438
- let failedOpen = false;
439
- let screenError;
440
- // On continuations the seeded prior turns are the dialogue this pair
441
- // already had. Pass them so the gate evaluates the NEW signal
442
- // (discoveryQuery / seedAssessment) on its own merits with that context
443
- // available — mirroring the continuation policy in negotiation.agent.ts
444
- // ("if materially different, evaluate on its own merits").
445
- const priorDialogue = state.isContinuation ? turnsFromMessages(state.messages) : [];
446
- // IND-569: labeled per-opportunity attribution of that prior dialogue.
447
- const attributedPrior = buildAttributedDialogue(state);
448
- try {
449
- const counterpartyContext = (await database.getUserContext(counterpartyUser.id, null).catch(() => null))?.text ?? "";
450
- decision = await screener.invoke({
451
- clientUser,
452
- counterpartyUser,
453
- ...(counterpartyContext && { counterpartyContext }),
454
- ...(clientMemory.length > 0 && { memory: clientMemory }),
455
- // discoveryQuery belongs to the discovery session's source user; only
456
- // meaningful for the client when the client holds the source side.
457
- ...(clientIsSource && state.discoveryQuery && { discoveryQuery: state.discoveryQuery }),
458
- seedAssessment: state.seedAssessment,
459
- indexContext: state.indexContext,
460
- ...(priorDialogue.length > 0 && { isContinuation: true, priorDialogue }),
461
- ...(attributedPrior && { isContinuation: true, priorDialogueAttributed: attributedPrior }),
462
- });
463
- }
464
- catch (err) {
465
- // Fail open: a screen failure must never block a negotiation.
466
- failedOpen = true;
467
- screenError = err instanceof Error ? err.message : String(err);
468
- screenNodeLog.warn("Screen failed; proceeding open (reach_out)", {
469
- taskId: state.taskId,
470
- opportunityId: state.opportunityId || undefined,
471
- error: screenError,
472
- });
473
- decision = {
474
- decision: "reach_out",
475
- reasoning: `screen_error: ${screenError}`,
476
- evidence: { counterpartyPremiseFit: "", intentAlignment: "" },
477
- };
478
- }
479
- const durationMs = Date.now() - start;
480
- const record = {
481
- ...decision,
482
- mode,
483
- ...(failedOpen && { failedOpen, error: screenError }),
484
- screenedAt: new Date().toISOString(),
485
- durationMs,
486
- };
487
- await database.setTaskScreenDecision?.(state.taskId, record, state.continuationExecution).catch((err) => {
488
- screenNodeLog.error("Failed to persist screen decision", { taskId: state.taskId, error: err });
489
- });
490
- screenNodeLog.info("negotiation_screen", {
491
- taskId: state.taskId,
492
- opportunityId: state.opportunityId || undefined,
493
- decision: decision.decision,
494
- mode,
495
- failedOpen,
496
- durationMs,
497
- });
498
- if (state.opportunityId) {
499
- emitWide({
500
- type: "negotiation_screen",
501
- opportunityId: state.opportunityId,
502
- negotiationConversationId: state.conversationId,
503
- decision: decision.decision,
504
- reasoning: decision.reasoning,
505
- mode,
506
- failedOpen,
507
- durationMs,
508
- });
509
- }
510
- // Routing happens on the conditional edge: shadow always proceeds to
511
- // the first turn; enforce routes a (non-failed-open) pass to finalize.
512
- return { screenDecision: record, memoryBySide: { [clientSide]: clientMemory } };
513
- };
514
- /**
515
- * P2.2 — true when the screen gate blocked this negotiation: enforce mode,
516
- * a genuine `pass` (never failed-open), before any turn was exchanged.
517
- * Shadow-mode passes and fail-open records never block.
518
- */
519
- const isScreenBlocked = (state) => state.screenDecision?.mode === "enforce"
520
- && state.screenDecision.decision === "pass"
521
- && state.screenDecision.failedOpen !== true
522
- && state.turnCount === 0;
523
- const turnNode = async (state) => {
524
- const traceEmitter = requestContext.getStore()?.traceEmitter;
525
- // Local helper to emit events whose shape is wider than the declared
526
- // `TraceEmitter` union. The chat agent already casts at its relay sink;
527
- // here we localize the cast at the callsite so the rest of the body stays typed.
528
- const emitWide = (event) => traceEmitter?.(event);
529
- const agentName = "Index negotiator";
530
- const agentStart = Date.now();
531
- traceEmitter?.({ type: "agent_start", name: agentName });
532
- try {
533
- const history = turnsFromMessages(state.messages);
534
- // IND-569: labeled per-opportunity attribution of prior dialogue on a
535
- // continuation. Null on fresh runs (history renders flat, unchanged).
536
- const attributedPrior = buildAttributedDialogue(state);
537
- const isSource = state.currentSpeaker === "source";
538
- const ownUser = isSource ? state.sourceUser : state.candidateUser;
539
- const otherUser = isSource ? state.candidateUser : state.sourceUser;
540
- const ownIntentId = isSource ? state.sourceIntentId : state.candidateIntentId;
541
- // Determine if this is the system agent's final allowed turn
542
- const maxTurns = state.maxTurns ?? 0;
543
- const isFinalTurn = maxTurns > 0 && (state.turnCount + 1) >= maxTurns;
544
- // Seat attribution keys on initiatorUserId (rigid v2 stamp), never on
545
- // parity or source/candidate position — under the conversation-scoped
546
- // tie-break this run's source may hold the counterparty seat.
547
- const version = state.protocolVersion ?? 'v1';
548
- const seat = ownUser.id === (state.initiatorUserId ?? state.sourceUser.id)
549
- ? 'initiator'
550
- : 'counterparty';
551
- // Legacy ask_user availability (P3.2): flag on, full pause loop wired
552
- // (questioner + answer-window timer + an opportunity to resume
553
- // against), v2 non-final non-opening turn, and this side's one client
554
- // consultation not yet spent (rationing). Shadow is observational and
555
- // must preserve this legacy path byte-for-byte except for telemetry.
556
- const policyMode = negotiationConsultationPolicyMode();
557
- const askUserAvailable = version === 'v2'
558
- && !isFinalTurn
559
- && configuredAskUserEnabled()
560
- && !!questionerEnqueue
561
- && !!timeoutQueue?.enqueueAskUserExpiry
562
- && !!state.opportunityId
563
- && !!ownIntentId
564
- && !!state.indexContext.networkId
565
- && !(state.turnCount === 0 && !state.isContinuation)
566
- && !hasPriorAskUser(state.messages, ownUser.id);
567
- // ─── Deadlock detection → persuasion→bargaining stance (IND-428) ──────
568
- // Deterministic trailing-run inspection of the persisted history — no
569
- // LLM in the decision. Gated on the strict default-off flag AND v2,
570
- // checked alongside the protocol-version plumbing so v1 semantics stay
571
- // untouched. Fail-open: any detection error means "no deadlock" and
572
- // the legacy path proceeds byte-identically. The shift changes the
573
- // system agent's drafting stance only — allowedActions, the dispatch
574
- // payload, and all termination rules are untouched.
575
- let deadlock = null;
576
- if (version === 'v2' && configuredDeadlockShiftEnabled()) {
577
- try {
578
- deadlock = assessDeadlock(history, configuredDeadlockThreshold());
579
- }
580
- catch (err) {
581
- turnLog.warn('Deadlock detection failed; proceeding without mode shift', {
582
- taskId: state.taskId,
583
- error: err instanceof Error ? err.message : String(err),
584
- });
585
- deadlock = null;
586
- }
587
- }
588
- const bargainingMode = deadlock?.deadlocked === true;
589
- // P5.3: the speaker's own negotiator memory (cached per side across
590
- // turns). Injected into both the dispatch payload (the user's own
591
- // agent — scope-correct) and the system-agent prompt.
592
- const ownSide = isSource ? "source" : "candidate";
593
- const ownMemory = state.memoryBySide?.[ownSide]
594
- ?? (memoryRetrieve
595
- ? await retrieveMemory(ownUser.id, otherUser.id, memoryQueryText(state, otherUser), "turn")
596
- : []);
597
- const payload = {
598
- negotiationId: state.taskId,
599
- ownUser,
600
- otherUser,
601
- indexContext: state.indexContext,
602
- seedAssessment: state.seedAssessment,
603
- history,
604
- isFinalTurn,
605
- isDiscoverer: isSource,
606
- seat,
607
- protocolVersion: version,
608
- allowedActions: [...allowedActionsFor(version, seat, isFinalTurn, { askUser: askUserAvailable })],
609
- ...(state.discoveryQuery && isSource && { discoveryQuery: state.discoveryQuery }),
610
- ...(attributedPrior && { priorDialogue: attributedPrior }),
611
- ...(ownMemory.length > 0 && { negotiatorMemory: ownMemory }),
612
- ...(state.privateConsultation?.recipientUserId === ownUser.id
613
- ? { privateConsultation: state.privateConsultation }
614
- : {}),
615
- };
616
- const scope = { action: 'manage:negotiations', scopeType: 'network', scopeId: state.indexContext.networkId };
617
- const dispatchResult = await dispatcher.dispatch(ownUser.id, scope, payload, { timeoutMs: state.timeoutMs });
618
- let turn;
619
- if (dispatchResult.handled) {
620
- // Personal agent responded. Under v2, coerce out-of-seat actions to
621
- // the conservative fallback — the polling/respond surfaces reject
622
- // these with a 400, but locally-dispatched turns land here directly.
623
- turn = dispatchResult.turn;
624
- if (version === 'v2' && !allowedActionsFor(version, seat, isFinalTurn, { askUser: askUserAvailable }).includes(turn.action)) {
625
- turnLog.warn('Personal agent returned out-of-seat action, coercing to conservative fallback', {
626
- action: turn.action, seat, isFinalTurn,
627
- });
628
- turn = { ...turn, action: fallbackActionFor(version, seat, isFinalTurn) };
629
- }
630
- }
631
- else if (dispatchResult.reason === 'waiting') {
632
- // Long timeout — graph suspends. Persist the full turn context so the
633
- // polling agent (and MCP consumers via get_negotiation) reconstruct
634
- // the same view the in-process system agent would see. The view is
635
- // stored in absolute source/candidate terms; perspective is projected
636
- // at pickup time using the claiming user's id.
637
- traceEmitter?.({ type: "agent_end", name: agentName, durationMs: Date.now() - agentStart, summary: "waiting_for_agent" });
638
- await database.setTaskTurnContext(state.taskId, {
639
- sourceUser: state.sourceUser,
640
- candidateUser: state.candidateUser,
641
- indexContext: state.indexContext,
642
- seedAssessment: state.seedAssessment,
643
- // Keep discoveryQuery speaker-scoped: include it only when the
644
- // parked turn belongs to the discoverer (source). Persisting it on
645
- // candidate-side turns would make the pickup prompt frame the
646
- // search as "your user searched for X" for the wrong user.
647
- ...(isSource && state.discoveryQuery && { discoveryQuery: state.discoveryQuery }),
648
- ...(state.privateConsultation && state.privateConsultation.recipientUserId === ownUser.id
649
- ? { privateConsultation: state.privateConsultation }
650
- : {}),
651
- }, state.continuationExecution);
652
- await database.updateTaskState(state.taskId, "waiting_for_agent", undefined, state.continuationExecution);
653
- return { status: 'waiting_for_agent' };
654
- }
655
- else {
656
- // No personal agent or timeout — run system agent
657
- turn = await systemAgent.invoke({
658
- ownUser,
659
- otherUser,
660
- indexContext: state.indexContext,
661
- seedAssessment: state.seedAssessment,
662
- history,
663
- isFinalTurn,
664
- isDiscoverer: isSource,
665
- seat,
666
- protocolVersion: version,
667
- ...(state.discoveryQuery && isSource && { discoveryQuery: state.discoveryQuery }),
668
- isContinuation: state.isContinuation,
669
- ...(attributedPrior && { priorDialogue: attributedPrior }),
670
- ...(state.userAnswers.length > 0 && { userAnswers: state.userAnswers }),
671
- ...(askUserAvailable && { canAskUser: true }),
672
- ...(bargainingMode && { bargaining: { consecutiveNonConvergent: deadlock.consecutiveNonConvergent } }),
673
- ...(ownMemory.length > 0 && { memory: ownMemory }),
674
- ...(state.privateConsultation?.recipientUserId === ownUser.id
675
- ? { privateConsultation: state.privateConsultation }
676
- : {}),
677
- });
678
- }
679
- traceEmitter?.({ type: "agent_end", name: agentName, durationMs: Date.now() - agentStart, summary: `${turn.action}` });
680
- // First turn must open the negotiation (unless continuing a prior
681
- // conversation): v1 → "propose"; v2 initiator → "outreach". A v2 turn-0
682
- // speaker holding the counterparty seat (tie-break inheritance) is left
683
- // unforced — it is responding, not opening.
684
- if (state.turnCount === 0 && !state.isContinuation) {
685
- const openingAction = version === 'v2' ? 'outreach' : 'propose';
686
- if ((version !== 'v2' || seat === 'initiator') && turn.action !== openingAction) {
687
- turnLog.warn(`Agent returned unexpected action on turn 0, forcing to ${openingAction}`, { action: turn.action });
688
- turn.action = openingAction;
689
- }
690
- }
691
- // IND-508 deterministic admission is evaluated only after the opening
692
- // guard but before any turn is persisted. It consumes action/role enums
693
- // only; free-form reasoning, messages, profiles, and evaluator inputs
694
- // are intentionally unavailable to the policy.
695
- let consultationPolicyReason;
696
- const policyEligibility = policyMode === 'off' ? { eligible: false } : assessConsultationEligibility({
697
- protocolVersion: version,
698
- seat,
699
- isOpeningTurn: state.turnCount === 0 && !state.isContinuation,
700
- isFinalTurn,
701
- screenedOut: isScreenBlocked(state),
702
- action: turn.action,
703
- ownSuggestedRole: turn.assessment?.suggestedRoles?.ownUser,
704
- priorActions: history.map((prior) => prior.action),
705
- previouslyConsulted: hasPriorAskUser(state.messages, ownUser.id),
706
- hasExactResumeCoordinate: Boolean(configuredAskUserEnabled()
707
- && questionerEnqueue
708
- && timeoutQueue?.enqueueAskUserExpiry
709
- && state.taskId
710
- && state.opportunityId
711
- && ownIntentId
712
- && state.indexContext.networkId),
713
- lifecycleValid: Boolean(state.taskId && state.opportunityId && ownIntentId && state.indexContext.networkId),
714
- });
715
- const emitConsultationTelemetry = (stage, reason) => {
716
- turnLog.info('negotiation_consultation_policy', { stage, mode: policyMode, reason });
717
- emitWide({ type: 'negotiation_consultation_policy', stage, mode: policyMode, reason });
718
- };
719
- if (policyEligibility.eligible && policyEligibility.reason) {
720
- emitConsultationTelemetry('eligible', policyEligibility.reason);
721
- if (policyMode === 'on') {
722
- consultationPolicyReason = policyEligibility.reason;
723
- turn = {
724
- ...turn,
725
- action: 'ask_user',
726
- message: null,
727
- assessment: {
728
- reasoning: 'Client consultation required.',
729
- suggestedRoles: turn.assessment.suggestedRoles,
730
- },
731
- askUser: consultationPromptFor(consultationPolicyReason),
732
- };
733
- emitConsultationTelemetry('asked', consultationPolicyReason);
734
- }
735
- }
736
- // Safety net: off/shadow retain legacy behavior. In on, a spontaneous
737
- // ask_user is admissible only when the deterministic policy just
738
- // authorized it, so no unbounded pause can enter shared history.
739
- if (turn.action === 'ask_user' && (!askUserAvailable || (policyMode === 'on' && !consultationPolicyReason))) {
740
- turnLog.warn('ask_user emitted while unavailable, coercing to conservative fallback', {
741
- seat, isFinalTurn, taskId: state.taskId,
742
- });
743
- turn = { ...turn, action: fallbackActionFor(version, seat, isFinalTurn) };
744
- }
745
- // ─── Deadlock shift record (IND-428) ───────────────────────────────
746
- // Applied-stance analytics: recorded once per session, on the first
747
- // turn actually drafted in the bargaining stance (the system agent —
748
- // externally dispatched turns never receive the stance). Internal
749
- // metadata only: persisted to tasks.metadata.deadlockShift via the
750
- // optional hook; negotiation API surfaces project specific fields and
751
- // never return task metadata verbatim. Every step fails open.
752
- const bargainingApplied = bargainingMode && !dispatchResult.handled;
753
- let deadlockShiftRecord = null;
754
- if (bargainingApplied && !state.deadlockShift) {
755
- deadlockShiftRecord = {
756
- reason: 'consecutive_non_convergent',
757
- consecutiveNonConvergent: deadlock.consecutiveNonConvergent,
758
- threshold: deadlock.threshold,
759
- shiftedAtTurn: state.turnCount,
760
- seat,
761
- detectedAt: new Date().toISOString(),
762
- };
763
- await database.setTaskDeadlockShift?.(state.taskId, deadlockShiftRecord, state.continuationExecution).catch((err) => {
764
- turnLog.error('Failed to persist deadlock shift record', { taskId: state.taskId, error: err });
765
- });
766
- turnLog.info('negotiation_deadlock_shift', {
767
- taskId: state.taskId,
768
- opportunityId: state.opportunityId || undefined,
769
- seat,
770
- consecutiveNonConvergent: deadlockShiftRecord.consecutiveNonConvergent,
771
- threshold: deadlockShiftRecord.threshold,
772
- turnIndex: state.turnCount,
773
- });
774
- if (state.opportunityId) {
775
- emitWide({
776
- type: 'negotiation_deadlock_shift',
777
- opportunityId: state.opportunityId,
778
- negotiationConversationId: state.conversationId,
779
- turnIndex: state.turnCount,
780
- actor: isSource ? 'source' : 'candidate',
781
- consecutiveNonConvergent: deadlockShiftRecord.consecutiveNonConvergent,
782
- threshold: deadlockShiftRecord.threshold,
783
- });
784
- }
785
- }
786
- // ─── IND-564: `withdraw` requires a prior in-task outreach ────────────
787
- // `withdraw` semantically retracts an outreach the initiator made. In a
788
- // continuation whose first initiator move is `withdraw` (or any withdraw
789
- // before this task opened outreach), there is nothing to retract —
790
- // persisting it would drop a spurious "connection withdrawn" message
791
- // into the shared dm_pair thread as if an accepted connection were
792
- // pulled. Seeded prior-task turns (state.messages) do NOT count as an
793
- // in-task outreach. Map it to the quiet screen-out outcome instead: no
794
- // message persisted, turnCount unchanged, opportunity quietly rejected
795
- // in finalize. This is the backstop for whatever the screen gate (IND-
796
- // 563) does not catch (screen off/shadow, or a fail-open reach_out).
797
- //
798
- // Exact ask_user resumes (continuationExecution) are exempt: the
799
- // successor task is the SAME logical negotiation resumed after the
800
- // client answered, so a post-consultation `withdraw` is a legitimate
801
- // terminal decision, not an opening move.
802
- if (turn.action === 'withdraw' && !state.outreachOpened && !state.continuationExecution) {
803
- turnLog.info('negotiation_opening_withdraw_screened_out', {
804
- taskId: state.taskId,
805
- opportunityId: state.opportunityId || undefined,
806
- seat,
807
- turnCount: state.turnCount,
808
- isContinuation: state.isContinuation,
809
- });
810
- traceEmitter?.({ type: "agent_end", name: agentName, durationMs: Date.now() - agentStart, summary: "screened_out: opening withdraw" });
811
- return { lastTurn: turn, firstTurnScreenedOut: true };
812
- }
813
- const parts = [{ kind: "data", data: turn }];
814
- const message = await database.createMessage({
815
- conversationId: state.conversationId,
816
- senderId: `agent:${ownUser.id}`,
817
- role: "agent",
818
- parts,
819
- taskId: state.taskId,
820
- ...(state.continuationExecution ? { continuationExecution: state.continuationExecution } : {}),
821
- });
822
- // ─── ask_user pause (P3.2) ────────────────────────────────────────────
823
- // The negotiator consults its OWN client: persist the turn (done above),
824
- // park the full turn context, arm the answer-window timer, enqueue the
825
- // question through the negotiation_inflight preset, then suspend the
826
- // task as input_required. The graph exits at this turn boundary exactly
827
- // like the waiting_for_agent suspend; the answer (or window expiry)
828
- // resumes via the run-existing continuation path.
829
- if (turn.action === 'ask_user') {
830
- const counterparty = isSource ? state.candidateUser : state.sourceUser;
831
- const safeAskUser = validateInflightAskUserFields({
832
- disclosureSubject: turn.askUser?.disclosureSubject,
833
- draftQuestion: turn.askUser?.draftQuestion,
834
- forbiddenIdentifiers: [
835
- counterparty.id,
836
- counterparty.profile.name ?? '',
837
- state.opportunityId,
838
- state.taskId,
839
- state.indexContext.networkId,
840
- isSource ? state.candidateIntentId ?? '' : state.sourceIntentId ?? '',
841
- ],
842
- forbiddenSourceText: [
843
- counterparty.profile.bio ?? '',
844
- counterparty.profile.location ?? '',
845
- ...counterparty.intents.flatMap((intent) => [intent.title, intent.description]),
846
- state.seedAssessment.reasoning,
847
- state.indexContext.prompt,
848
- state.discoveryQuery ?? '',
849
- ],
850
- });
851
- const settlementId = negotiationQuestionSettlementId(state.taskId);
852
- const askUserBinding = await database.captureNegotiationAskUserBinding({
853
- taskId: state.taskId,
854
- settlementId,
855
- recipientUserId: ownUser.id,
856
- recipientIntentId: ownIntentId,
857
- opportunityId: state.opportunityId,
858
- networkId: state.indexContext.networkId,
859
- turnContext: {
860
- sourceUser: state.sourceUser,
861
- candidateUser: state.candidateUser,
862
- indexContext: state.indexContext,
863
- seedAssessment: state.seedAssessment,
864
- ...(isSource && state.discoveryQuery && { discoveryQuery: state.discoveryQuery }),
865
- ...(consultationPolicyReason && { consultationPolicyReason }),
866
- },
867
- ...(state.continuationExecution ? { continuationExecution: state.continuationExecution } : {}),
868
- });
869
- // Arm the timer BEFORE flipping state: it is the durable recovery
870
- // trigger even when generation enqueues no job or persists no row.
871
- const windowMs = askUserAnswerWindowMs();
872
- await timeoutQueue.enqueueAskUserExpiry(state.taskId, {
873
- settlementId,
874
- opportunityId: state.opportunityId,
875
- userId: ownUser.id,
876
- recipientIntentId: ownIntentId,
877
- networkId: state.indexContext.networkId,
878
- intentFingerprint: askUserBinding.intentFingerprint,
879
- opportunityStatus: askUserBinding.opportunityStatus,
880
- opportunityUpdatedAt: askUserBinding.opportunityUpdatedAt,
881
- counterpartyUserId: askUserBinding.counterpartyUserId,
882
- counterpartyIntentId: askUserBinding.counterpartyIntentId,
883
- }, windowMs);
884
- // Persistence admission requires the exact task to be input_required.
885
- // Flip before enqueue; if the structured ask_user fields fail the
886
- // deterministic privacy gate, the timer alone closes the exact task.
887
- await database.updateTaskState(state.taskId, 'input_required', undefined, state.continuationExecution);
888
- if (safeAskUser) {
889
- const userContext = (await database.getUserContext(ownUser.id, null).catch(() => null))?.text ?? '';
890
- await questionerEnqueue({
891
- mode: 'negotiation_inflight',
892
- purpose: 'inflight_consultation',
893
- userId: ownUser.id,
894
- sourceType: 'opportunity',
895
- sourceId: state.opportunityId,
896
- negotiation: {
897
- purpose: 'inflight_consultation',
898
- recipientUserId: ownUser.id,
899
- recipientIntentId: ownIntentId,
900
- opportunityId: state.opportunityId,
901
- taskId: state.taskId,
902
- networkId: state.indexContext.networkId,
903
- },
904
- context: {
905
- negotiationId: state.taskId,
906
- counterpartyHint: NEGOTIATION_QUESTION_GENERIC_COUNTERPARTY,
907
- disclosureSubject: safeAskUser.disclosureSubject,
908
- ...(safeAskUser.draftQuestion && { draftQuestion: safeAskUser.draftQuestion }),
909
- indexContext: NEGOTIATION_QUESTION_GENERIC_NETWORK,
910
- ...(consultationPolicyReason && { consultationPolicyReason }),
911
- ...(userContext && { userContext }),
912
- },
913
- }).catch((error) => {
914
- turnLog.error('Failed to enqueue safe ask_user question; timeout recovery remains armed', {
915
- taskId: state.taskId,
916
- opportunityId: state.opportunityId,
917
- error,
918
- });
919
- });
920
- }
921
- else {
922
- turnLog.warn('Skipping unsafe or incomplete ask_user question generation', {
923
- taskId: state.taskId,
924
- opportunityId: state.opportunityId,
925
- });
926
- }
927
- turnLog.info('negotiation_ask_user_pause', {
928
- taskId: state.taskId,
929
- opportunityId: state.opportunityId,
930
- seat,
931
- askingUserId: ownUser.id,
932
- windowMs,
933
- });
934
- traceEmitter?.({ type: "agent_end", name: agentName, durationMs: Date.now() - agentStart, summary: "ask_user" });
935
- emitWide({
936
- type: 'negotiation_ask_user',
937
- opportunityId: state.opportunityId,
938
- negotiationConversationId: state.conversationId,
939
- turnIndex: state.turnCount,
940
- actor: isSource ? 'source' : 'candidate',
941
- questionGenerationSafe: Boolean(safeAskUser),
942
- windowMs,
943
- });
944
- return {
945
- messages: [{
946
- id: message.id,
947
- senderId: message.senderId,
948
- role: "agent",
949
- parts: message.parts,
950
- createdAt: message.createdAt,
951
- taskId: state.taskId,
952
- }],
953
- turnCount: state.turnCount + 1,
954
- lastTurn: turn,
955
- status: 'input_required',
956
- ...(deadlockShiftRecord && { deadlockShift: deadlockShiftRecord }),
957
- };
958
- }
959
- await database.updateTaskState(state.taskId, "working", undefined, state.continuationExecution);
960
- if (state.opportunityId) {
961
- emitWide({
962
- type: "negotiation_turn",
963
- opportunityId: state.opportunityId,
964
- negotiationConversationId: state.conversationId,
965
- turnIndex: state.turnCount,
966
- actor: isSource ? "source" : "candidate",
967
- action: turn.action,
968
- ...(turn.assessment?.reasoning && { reasoning: turn.assessment.reasoning }),
969
- ...(turn.message && { message: turn.message }),
970
- ...(turn.assessment?.suggestedRoles && { suggestedRoles: turn.assessment.suggestedRoles }),
971
- durationMs: Date.now() - agentStart,
972
- });
973
- }
974
- return {
975
- messages: [{
976
- id: message.id,
977
- senderId: message.senderId,
978
- role: "agent",
979
- parts: message.parts,
980
- createdAt: message.createdAt,
981
- taskId: state.taskId,
982
- }],
983
- turnCount: state.turnCount + 1,
984
- currentSpeaker: (isSource ? "candidate" : "source"),
985
- lastTurn: turn,
986
- memoryBySide: { [ownSide]: ownMemory },
987
- // Record the in-task outreach so a later `withdraw` is legal (IND-564).
988
- ...(turn.action === 'outreach' && { outreachOpened: true }),
989
- ...(deadlockShiftRecord && { deadlockShift: deadlockShiftRecord }),
990
- };
991
- }
992
- catch (err) {
993
- const errMsg = err instanceof Error ? err.message : String(err);
994
- turnLog.error("Agent invocation failed", { error: errMsg, stack: err instanceof Error ? err.stack : undefined, turnCount: state.turnCount });
995
- traceEmitter?.({ type: "agent_end", name: agentName, durationMs: Date.now() - agentStart, summary: `error: ${errMsg}` });
996
- const errorSeat = (state.currentSpeaker === 'source' ? state.sourceUser.id : state.candidateUser.id) === (state.initiatorUserId ?? state.sourceUser.id)
997
- ? 'initiator'
998
- : 'counterparty';
999
- return {
1000
- lastTurn: {
1001
- action: rejectActionFor(state.protocolVersion ?? 'v1', errorSeat),
1002
- assessment: { reasoning: `Agent error: ${errMsg}`, suggestedRoles: { ownUser: "peer", otherUser: "peer" } },
1003
- },
1004
- turnCount: state.turnCount + 1,
1005
- error: `Turn failed: ${errMsg}`,
1006
- };
1007
- }
1008
- };
1009
- const evaluateNode = (state) => {
1010
- if (state.status === 'waiting_for_agent')
1011
- return "finalize";
1012
- if (state.status === 'input_required')
1013
- return "finalize";
1014
- if (state.error)
1015
- return "finalize";
1016
- if (!state.lastTurn)
1017
- return "finalize";
1018
- // Terminal actions: accept (v1+v2), reject (v1), withdraw/decline (v2)
1019
- if (isTerminalAction(state.lastTurn.action))
1020
- return "finalize";
1021
- // question routes same as counter — next turn
1022
- if ((state.maxTurns ?? 0) > 0 && state.turnCount >= state.maxTurns)
1023
- return "finalize";
1024
- return "turn";
1025
- };
1026
- const finalizeNode = async (state) => {
1027
- const traceEmitter = requestContext.getStore()?.traceEmitter;
1028
- const emitWide = (event) => traceEmitter?.(event);
1029
- const pauseReceipt = (outcome) => state.continuationExecution
1030
- ? {
1031
- continuationReceipt: {
1032
- priorTaskId: state.continuationExecution.taskId,
1033
- settlementId: state.continuationExecution.settlementId,
1034
- successorTaskId: state.continuationExecution.successorTaskId,
1035
- fence: state.continuationExecution.fence,
1036
- outcome,
1037
- },
1038
- }
1039
- : undefined;
1040
- if (state.status === 'waiting_for_agent') {
1041
- if (state.opportunityId) {
1042
- emitWide({
1043
- type: "negotiation_outcome",
1044
- opportunityId: state.opportunityId,
1045
- outcome: "waiting_for_agent",
1046
- turnCount: state.turnCount,
1047
- isContinuation: state.isContinuation,
1048
- });
1049
- }
1050
- return pauseReceipt('waiting_for_agent') ?? {};
1051
- }
1052
- // ask_user pause: no outcome, no completed state — the task stays
1053
- // input_required until the client answers or the window expires.
1054
- if (state.status === 'input_required') {
1055
- if (state.opportunityId) {
1056
- emitWide({
1057
- type: "negotiation_outcome",
1058
- opportunityId: state.opportunityId,
1059
- outcome: "input_required",
1060
- turnCount: state.turnCount,
1061
- isContinuation: state.isContinuation,
1062
- });
1063
- }
1064
- return pauseReceipt('input_required') ?? {};
1065
- }
1066
- // Init can fail closed before an attempt owns a task. Such a rejection is
1067
- // not a completed negotiation and must not write through an empty task ID,
1068
- // create an artifact, or advance the opportunity lifecycle.
1069
- if (!state.taskId) {
1070
- finalizeLog.info('Skipping outcome persistence because no negotiation task was claimed', {
1071
- opportunityId: state.opportunityId || undefined,
1072
- error: state.error || undefined,
1073
- });
1074
- return {};
1075
- }
1076
- const history = turnsFromMessages(state.messages);
1077
- const lastTurn = state.lastTurn;
1078
- const hasOpportunity = lastTurn?.action === "accept";
1079
- // P2.2: the client's own outreach gate declined before any turn — the
1080
- // negotiation never happened from the counterparty's perspective.
1081
- // IND-564: an opening-move `withdraw` blocked before any message was
1082
- // persisted is the same quiet screen-out outcome (no in-task outreach to
1083
- // retract), reached from the turn node rather than the screen node.
1084
- const screenedOut = isScreenBlocked(state) || state.firstTurnScreenedOut === true;
1085
- const atCap = !screenedOut && (state.maxTurns ?? 0) > 0 && state.turnCount >= state.maxTurns && !isTerminalAction(lastTurn?.action);
1086
- let agreedRoles = [];
1087
- if (hasOpportunity && history.length >= 2) {
1088
- const acceptTurn = history[history.length - 1];
1089
- const precedingTurn = history[history.length - 2];
1090
- const accepterIsSource = state.currentSpeaker === "candidate";
1091
- const [sourceRole, candidateRole] = accepterIsSource
1092
- ? [acceptTurn.assessment.suggestedRoles.ownUser, precedingTurn.assessment.suggestedRoles.ownUser]
1093
- : [precedingTurn.assessment.suggestedRoles.ownUser, acceptTurn.assessment.suggestedRoles.ownUser];
1094
- agreedRoles = [
1095
- { userId: state.sourceUser.id, role: sourceRole },
1096
- { userId: state.candidateUser.id, role: candidateRole },
1097
- ];
1098
- }
1099
- const outcome = {
1100
- hasOpportunity,
1101
- agreedRoles,
1102
- reasoning: screenedOut
1103
- ? (state.screenDecision?.reasoning ?? lastTurn?.assessment?.reasoning ?? "")
1104
- : (lastTurn?.assessment.reasoning ?? ""),
1105
- turnCount: state.turnCount,
1106
- ...(screenedOut
1107
- ? { reason: "screened_out" }
1108
- : atCap
1109
- ? { reason: "turn_cap" }
1110
- : {}),
1111
- };
1112
- try {
1113
- await database.updateTaskState(state.taskId, "completed", undefined, state.continuationExecution);
1114
- await database.createArtifact({
1115
- taskId: state.taskId,
1116
- name: "negotiation-outcome",
1117
- parts: [{ kind: "data", data: outcome }],
1118
- metadata: {
1119
- hasOpportunity,
1120
- turnCount: state.turnCount,
1121
- ...(state.continuationExecution ? {
1122
- continuationOutcome: hasOpportunity
1123
- ? 'accepted'
1124
- : (screenedOut || isRejectLikeAction(lastTurn?.action)) ? 'rejected' : 'stalled',
1125
- } : {}),
1126
- },
1127
- ...(state.continuationExecution ? { continuationExecution: state.continuationExecution } : {}),
1128
- });
1129
- finalizeLog.info('Session complete', {
1130
- conversationId: state.conversationId,
1131
- taskId: state.taskId,
1132
- isContinuation: state.isContinuation,
1133
- turnsAdded: state.turnCount,
1134
- priorTurnCount: state.priorTurnCount,
1135
- outcome: hasOpportunity ? 'accepted' : screenedOut ? 'screened_out' : (atCap ? 'turn_cap' : (lastTurn?.action ?? 'unknown')),
1136
- opportunityId: state.opportunityId || undefined,
1137
- });
1138
- if (state.opportunityId) {
1139
- // screened_out → 'rejected': quiet terminal status (hidden from
1140
- // default lists), never 'stalled' — with zero turns the generic
1141
- // mapping would misfile the client's own gate decision.
1142
- const nextStatus = lastTurn?.action === 'accept'
1143
- ? 'pending'
1144
- : (screenedOut || isRejectLikeAction(lastTurn?.action))
1145
- ? 'rejected'
1146
- : 'stalled';
1147
- await database.updateOpportunityStatus(state.opportunityId, nextStatus, undefined, state.continuationExecution).catch((err) => {
1148
- finalizeLog.error("Failed to update opportunity status", { opportunityId: state.opportunityId, nextStatus, error: err });
1149
- });
1150
- }
1151
- }
1152
- catch (err) {
1153
- finalizeLog.error("Failed to persist outcome", { error: err });
1154
- }
1155
- if (state.opportunityId) {
1156
- const emittedOutcome = hasOpportunity
1157
- ? "accepted"
1158
- : screenedOut
1159
- ? "screened_out"
1160
- : atCap
1161
- ? "turn_cap"
1162
- : state.error && /timeout/i.test(state.error)
1163
- ? "timed_out"
1164
- : "rejected_stalled";
1165
- emitWide({
1166
- type: "negotiation_outcome",
1167
- opportunityId: state.opportunityId,
1168
- outcome: emittedOutcome,
1169
- turnCount: state.turnCount,
1170
- isContinuation: state.isContinuation,
1171
- turnsAdded: state.turnCount,
1172
- priorTurnCount: state.priorTurnCount,
1173
- ...(outcome.reasoning && { reasoning: outcome.reasoning }),
1174
- ...(hasOpportunity && agreedRoles.length >= 2 && {
1175
- agreedRoles: {
1176
- ownUser: agreedRoles[0]?.role,
1177
- otherUser: agreedRoles[1]?.role,
1178
- },
1179
- }),
1180
- });
1181
- }
1182
- if (state.consultationPolicyReason) {
1183
- // Stable, content-free terminal funnel telemetry. This executes only
1184
- // after a fenced continuation has reached its terminal outcome.
1185
- finalizeLog.info('negotiation_consultation_policy', {
1186
- stage: 'terminal_outcome',
1187
- reason: state.consultationPolicyReason,
1188
- outcome: hasOpportunity ? 'accepted' : (screenedOut || isRejectLikeAction(lastTurn?.action)) ? 'rejected' : 'stalled',
1189
- });
1190
- emitWide({
1191
- type: 'negotiation_consultation_policy',
1192
- stage: 'terminal_outcome',
1193
- reason: state.consultationPolicyReason,
1194
- outcome: hasOpportunity ? 'accepted' : (screenedOut || isRejectLikeAction(lastTurn?.action)) ? 'rejected' : 'stalled',
1195
- });
1196
- }
1197
- // Enqueue post-negotiation reflection (P5.2 memory write path) — fire
1198
- // and forget: a reflection failure must never affect the outcome. Only
1199
- // sessions that actually exchanged turns teach anything; init/turn
1200
- // errors with turnCount 0 are skipped.
1201
- if (reflectEnqueue && state.turnCount > 0 && !state.continuationExecution) {
1202
- reflectEnqueue({
1203
- negotiationId: state.taskId,
1204
- conversationId: state.conversationId,
1205
- ...(state.opportunityId && { opportunityId: state.opportunityId }),
1206
- sourceUser: {
1207
- id: state.sourceUser.id,
1208
- ...(state.sourceUser.profile.name && { name: state.sourceUser.profile.name }),
1209
- ...(state.sourceUser.profile.bio && { bio: state.sourceUser.profile.bio }),
1210
- },
1211
- candidateUser: {
1212
- id: state.candidateUser.id,
1213
- ...(state.candidateUser.profile.name && { name: state.candidateUser.profile.name }),
1214
- ...(state.candidateUser.profile.bio && { bio: state.candidateUser.profile.bio }),
1215
- },
1216
- initiatorUserId: state.initiatorUserId ?? state.sourceUser.id,
1217
- outcome: { hasOpportunity, reasoning: outcome.reasoning, turnCount: state.turnCount },
1218
- }).catch((err) => finalizeLog.error('Failed to enqueue negotiation reflection', {
1219
- taskId: state.taskId,
1220
- error: err,
1221
- }));
1222
- }
1223
- // Enqueue question generation for stalled/capped negotiations (not accepted or explicitly rejected).
1224
- // Require turnCount > 0 so early init/turn errors don't enqueue with empty context.
1225
- if (!hasOpportunity && !isRejectLikeAction(lastTurn?.action) && state.turnCount > 0 && state.opportunityId && state.sourceIntentId && state.indexContext.networkId && questionerEnqueue && !state.continuationExecution) {
1226
- const stallReason = atCap
1227
- ? 'turn_cap'
1228
- : (state.error && /timeout/i.test(state.error))
1229
- ? 'timeout'
1230
- : 'stalled';
1231
- const userContext = (await database.getUserContext(state.sourceUser.id, null))?.text ?? '';
1232
- const sourceIntent = state.sourceUser.intents.find((intent) => intent.id === state.sourceIntentId);
1233
- questionerEnqueue({
1234
- mode: 'negotiation',
1235
- purpose: 'stalled_followup',
1236
- userId: state.sourceUser.id,
1237
- sourceType: 'opportunity',
1238
- sourceId: state.opportunityId,
1239
- negotiation: {
1240
- purpose: 'stalled_followup',
1241
- recipientUserId: state.sourceUser.id,
1242
- recipientIntentId: state.sourceIntentId,
1243
- opportunityId: state.opportunityId,
1244
- taskId: state.taskId,
1245
- networkId: state.indexContext.networkId,
1246
- },
1247
- context: {
1248
- negotiationId: state.taskId,
1249
- counterpartyHint: NEGOTIATION_QUESTION_GENERIC_COUNTERPARTY,
1250
- indexContext: NEGOTIATION_QUESTION_GENERIC_NETWORK,
1251
- outcomeReason: stallReason,
1252
- recipientIntent: sourceIntent
1253
- ? `${sourceIntent.title}: ${sourceIntent.description}`
1254
- : 'the signal attached to this match',
1255
- userContext,
1256
- },
1257
- }).catch((err) => finalizeLog.error('Failed to enqueue negotiation question generation', {
1258
- opportunityId: state.opportunityId,
1259
- error: err,
1260
- }));
1261
- }
1262
- const terminalReceipt = state.continuationExecution
1263
- ? {
1264
- continuationReceipt: {
1265
- priorTaskId: state.continuationExecution.taskId,
1266
- settlementId: state.continuationExecution.settlementId,
1267
- successorTaskId: state.continuationExecution.successorTaskId,
1268
- fence: state.continuationExecution.fence,
1269
- outcome: hasOpportunity
1270
- ? 'accepted'
1271
- : (screenedOut || isRejectLikeAction(lastTurn?.action)) ? 'rejected' : 'stalled',
1272
- },
1273
- }
1274
- : undefined;
1275
- return { outcome, status: 'completed', ...terminalReceipt };
1276
- };
1277
- const workflow = new StateGraph(NegotiationGraphState)
1278
- .addNode("init", initNode)
1279
- .addNode("screen", screenNode)
1280
- .addNode("turn", turnNode)
1281
- .addNode("finalize", finalizeNode)
1282
- .addConditionalEdges("turn", evaluateNode, {
1283
- turn: "turn",
1284
- finalize: "finalize",
1285
- })
1286
- .addConditionalEdges("init", (state) => {
1287
- if (state.error)
1288
- return "finalize";
1289
- // Screen gate (P2.1). Runs on fresh negotiations AND regular
1290
- // continuations (IND-563): a new opportunity/intent reusing an existing
1291
- // conversation must still pass the outreach gate before entering the
1292
- // shared thread — a bad continuation match should be quietly screened
1293
- // out, never dropped into the dm_pair. Exact ask_user resumes
1294
- // (continuationExecution) are mid-flight and must never be re-screened.
1295
- // `off` disables the node entirely.
1296
- if (configuredScreenMode() !== "off" && !state.continuationExecution)
1297
- return "screen";
1298
- return "turn";
1299
- }, { screen: "screen", turn: "turn", finalize: "finalize" })
1300
- // P2.2: enforce-mode pass → finalize (screened_out); everything else → turn.
1301
- .addConditionalEdges("screen", (state) => isScreenBlocked(state) ? "finalize" : "turn", { turn: "turn", finalize: "finalize" })
1302
- .addEdge("__start__", "init")
1303
- .addEdge("finalize", "__end__");
1304
- return workflow.compile();
1305
- }
1306
- }
1307
- /**
1308
- * Runs bilateral negotiation for each candidate in parallel.
1309
- * @returns Only candidates that produced an opportunity
1310
- */
1311
- export async function negotiateCandidates(negotiationGraph, sourceUser, candidates, indexContext, opts) {
1312
- const { maxTurns, traceEmitter, indexContextOverrides, timeoutMs, onCandidateResolved, trigger, initiatorUserId, resumeFromTaskId, continuationSettlementId, continuationExecution, } = opts ?? {};
1313
- // Local helper to emit events whose shape is wider than the declared
1314
- // `TraceEmitter` union (mirrors the cast used in chat.agent at the relay sink
1315
- // and inside turn/finalize nodes above).
1316
- const emitWide = (event) => traceEmitter?.(event);
1317
- const results = await Promise.all(candidates.map(async (candidate) => {
1318
- const start = Date.now();
1319
- if (candidate.opportunityId) {
1320
- const candidateName = candidate.candidateUser?.profile?.name;
1321
- emitWide({
1322
- type: "negotiation_session_start",
1323
- opportunityId: candidate.opportunityId,
1324
- negotiationConversationId: "", // filled in on session_end
1325
- sourceUserId: sourceUser.id,
1326
- candidateUserId: candidate.userId,
1327
- initiatorUserId: initiatorUserId ?? sourceUser.id,
1328
- ...(candidateName && { candidateName }),
1329
- trigger: trigger ?? "ambient",
1330
- startedAt: start,
1331
- });
1332
- }
1333
- traceEmitter?.({ type: "agent_start", name: "Negotiating candidate" });
1334
- try {
1335
- const candidateIndexContext = candidate.networkId
1336
- ? { networkId: candidate.networkId, prompt: indexContextOverrides?.get(candidate.networkId) ?? '' }
1337
- : indexContext;
1338
- const result = await invokeWithAbortSignal(negotiationGraph, {
1339
- sourceUser,
1340
- candidateUser: candidate.candidateUser,
1341
- ...(candidate.sourceIntentId && { sourceIntentId: candidate.sourceIntentId }),
1342
- ...(candidate.candidateIntentId && { candidateIntentId: candidate.candidateIntentId }),
1343
- indexContext: candidateIndexContext,
1344
- seedAssessment: {
1345
- reasoning: candidate.reasoning,
1346
- valencyRole: candidate.valencyRole,
1347
- },
1348
- ...(candidate.discoveryQuery && { discoveryQuery: candidate.discoveryQuery }),
1349
- ...(candidate.opportunityId && { opportunityId: candidate.opportunityId }),
1350
- ...(candidate.opportunityStatus && { opportunityStatus: candidate.opportunityStatus }),
1351
- ...(candidate.opportunityUpdatedAt && { opportunityUpdatedAt: candidate.opportunityUpdatedAt }),
1352
- ...(initiatorUserId && { initiatorUserId }),
1353
- ...(resumeFromTaskId && continuationSettlementId && continuationExecution ? {
1354
- resumeFromTaskId,
1355
- continuationSettlementId,
1356
- continuationExecution,
1357
- } : {}),
1358
- ...(maxTurns !== undefined && { maxTurns }),
1359
- ...(timeoutMs !== undefined && { timeoutMs }),
1360
- });
1361
- const durationMs = Date.now() - start;
1362
- const outcome = result.outcome;
1363
- const hasOpportunity = outcome?.hasOpportunity === true;
1364
- const isContinuation = result.isContinuation ?? false;
1365
- const priorTurnCount = result.priorTurnCount ?? 0;
1366
- const turnFlow = (result.messages ?? [])
1367
- .map((m) => {
1368
- const dataPart = m.parts?.find((p) => p.kind === "data");
1369
- if (!dataPart?.data)
1370
- return null;
1371
- const turn = dataPart.data;
1372
- return turn.action ?? "unknown";
1373
- })
1374
- .filter(Boolean)
1375
- .join(" → ");
1376
- const statusTag = hasOpportunity ? "✓ opportunity" : "✗ rejected";
1377
- traceEmitter?.({ type: "agent_end", name: "Negotiating candidate", durationMs, summary: `${candidate.userId}: ${turnFlow} ${statusTag}` });
1378
- if (candidate.opportunityId) {
1379
- emitWide({
1380
- type: "negotiation_session_end",
1381
- opportunityId: candidate.opportunityId,
1382
- negotiationConversationId: result.conversationId ?? "",
1383
- durationMs: Date.now() - start,
1384
- isContinuation,
1385
- turnsAdded: outcome?.turnCount ?? 0,
1386
- priorTurnCount,
1387
- });
1388
- }
1389
- const accepted = hasOpportunity && outcome
1390
- ? {
1391
- userId: candidate.userId,
1392
- agreedRoles: outcome.agreedRoles,
1393
- reasoning: outcome.reasoning,
1394
- turnCount: outcome.turnCount,
1395
- }
1396
- : null;
1397
- if (onCandidateResolved) {
1398
- const turnHistory = turnsFromMessages(result.messages ?? []);
1399
- const resolvedOutcome = result.outcome ?? {
1400
- hasOpportunity: false,
1401
- agreedRoles: [],
1402
- reasoning: "no outcome returned by negotiation graph",
1403
- turnCount: turnHistory.length,
1404
- };
1405
- try {
1406
- await onCandidateResolved({
1407
- candidate,
1408
- accepted,
1409
- turns: turnHistory,
1410
- outcome: resolvedOutcome,
1411
- ...(result.continuationReceipt ? { continuationReceipt: result.continuationReceipt } : {}),
1412
- });
1413
- }
1414
- catch (hookErr) {
1415
- // Hook failures must not sink the candidate result — the aggregate
1416
- // return is still useful, and the orchestrator branch logs its own
1417
- // failures inline.
1418
- negotiateCandidatesLog.error("onCandidateResolved hook threw", {
1419
- candidateUserId: candidate.userId,
1420
- error: hookErr,
1421
- });
1422
- }
1423
- }
1424
- return accepted;
1425
- }
1426
- catch (err) {
1427
- const durationMs = Date.now() - start;
1428
- traceEmitter?.({ type: "agent_end", name: "Negotiating candidate", durationMs, summary: `${candidate.userId}: error` });
1429
- if (candidate.opportunityId) {
1430
- emitWide({
1431
- type: "negotiation_session_end",
1432
- opportunityId: candidate.opportunityId,
1433
- negotiationConversationId: "",
1434
- durationMs: Date.now() - start,
1435
- });
1436
- }
1437
- negotiateCandidatesLog.error("Negotiation failed", { candidateUserId: candidate.userId, error: err });
1438
- if (onCandidateResolved) {
1439
- try {
1440
- await onCandidateResolved({
1441
- candidate,
1442
- accepted: null,
1443
- turns: [],
1444
- outcome: {
1445
- hasOpportunity: false,
1446
- agreedRoles: [],
1447
- reasoning: err instanceof Error ? err.message : String(err),
1448
- turnCount: 0,
1449
- },
1450
- });
1451
- }
1452
- catch {
1453
- // ignore hook failure on error path
1454
- }
1455
- }
1456
- return null;
1457
- }
1458
- }));
1459
- return results.filter((r) => r !== null);
1460
- }
1461
- //# sourceMappingURL=negotiation.graph.js.map
5
+ export * from "./application/negotiation.graph.js";