@indexnetwork/protocol 22.0.0-rc.499.1 → 64.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. package/CHANGELOG.md +1841 -0
  2. package/IMPLEMENTATION.md +140 -181
  3. package/README.md +16 -20
  4. package/STABILITY.md +16 -11
  5. package/dist/{intents/intent.module.d.ts → capabilities/intents.d.ts} +182 -192
  6. package/dist/capabilities/intents.js +88 -0
  7. package/dist/capabilities/negotiations.d.ts +17 -0
  8. package/dist/capabilities/negotiations.js +16 -0
  9. package/dist/{networks/network.module.d.ts → capabilities/networks.d.ts} +33 -169
  10. package/dist/{networks/network.module.js → capabilities/networks.js} +6 -17
  11. package/dist/index.d.ts +57 -134
  12. package/dist/index.js +41 -105
  13. package/dist/internal/agents/agent.repository.port.d.ts +59 -0
  14. package/dist/internal/agents/agent.repository.port.js +7 -0
  15. package/dist/internal/agents/agent.types.d.ts +35 -0
  16. package/dist/{agents → internal/agents}/agent.types.js +1 -6
  17. package/dist/{intents → internal/intents}/graph/intent.graph.d.ts +142 -151
  18. package/dist/{intents → internal/intents}/graph/intent.graph.execute.d.ts +5 -1
  19. package/dist/{intents → internal/intents}/graph/intent.graph.execute.js +165 -46
  20. package/dist/internal/intents/graph/intent.graph.infer.d.ts +78 -0
  21. package/dist/internal/intents/graph/intent.graph.infer.js +122 -0
  22. package/dist/internal/intents/graph/intent.graph.js +108 -0
  23. package/dist/{intents → internal/intents}/graph/intent.graph.reconcile.d.ts +18 -9
  24. package/dist/internal/intents/graph/intent.graph.reconcile.js +173 -0
  25. package/dist/internal/intents/graph/intent.graph.shared.d.ts +55 -0
  26. package/dist/{intents → internal/intents}/graph/intent.graph.shared.js +25 -70
  27. package/dist/{intents → internal/intents}/graph/intent.graph.state.d.ts +96 -32
  28. package/dist/{intents → internal/intents}/graph/intent.graph.state.js +42 -31
  29. package/dist/internal/intents/intent.admission.d.ts +16 -0
  30. package/dist/internal/intents/intent.admission.js +30 -0
  31. package/dist/{intents → internal/intents}/intent.inferrer.d.ts +1 -40
  32. package/dist/{intents → internal/intents}/intent.inferrer.js +13 -49
  33. package/dist/internal/intents/intent.preparer.d.ts +52 -0
  34. package/dist/internal/intents/intent.preparer.js +87 -0
  35. package/dist/{intents → internal/intents}/intent.verifier.d.ts +3 -36
  36. package/dist/{intents → internal/intents}/intent.verifier.js +0 -17
  37. package/dist/{networks → internal/networks}/indexer.graph.d.ts +15 -200
  38. package/dist/{networks → internal/networks}/indexer.graph.js +19 -128
  39. package/dist/{networks → internal/networks}/indexer.state.d.ts +8 -63
  40. package/dist/internal/networks/indexer.state.js +70 -0
  41. package/dist/{networks → internal/networks}/membership.graph.d.ts +6 -6
  42. package/dist/{networks → internal/networks}/membership.graph.js +3 -3
  43. package/dist/{networks → internal/networks}/membership.state.d.ts +2 -2
  44. package/dist/{networks → internal/networks}/membership.state.js +2 -2
  45. package/dist/{networks → internal/networks}/network.graph.d.ts +9 -22
  46. package/dist/{networks → internal/networks}/network.graph.js +13 -27
  47. package/dist/{networks → internal/networks}/network.recommender.d.ts +2 -2
  48. package/dist/{networks → internal/networks}/network.recommender.js +2 -2
  49. package/dist/{networks → internal/networks}/network.state.d.ts +4 -7
  50. package/dist/{networks → internal/networks}/network.state.js +4 -4
  51. package/dist/internal/opportunities/negotiation-context.loader.d.ts +26 -0
  52. package/dist/internal/opportunities/negotiation-context.loader.js +36 -0
  53. package/dist/{opportunities → internal/opportunities}/opportunity.actor.d.ts +1 -1
  54. package/dist/{opportunities → internal/opportunities}/opportunity.actor.js +7 -1
  55. package/dist/internal/opportunities/opportunity.counterparties.d.ts +17 -0
  56. package/dist/internal/opportunities/opportunity.counterparties.js +19 -0
  57. package/dist/internal/opportunities/opportunity.events.d.ts +38 -0
  58. package/dist/internal/opportunities/opportunity.events.js +94 -0
  59. package/dist/{opportunities → internal/opportunities}/opportunity.feed-selection.d.ts +3 -9
  60. package/dist/internal/opportunities/opportunity.feed-selection.js +40 -0
  61. package/dist/internal/opportunities/opportunity.graph.modes.d.ts +39 -0
  62. package/dist/internal/opportunities/opportunity.graph.modes.js +138 -0
  63. package/dist/{opportunities → internal/opportunities}/opportunity.labels.d.ts +2 -3
  64. package/dist/internal/opportunities/opportunity.labels.js +9 -0
  65. package/dist/{opportunities → internal/opportunities}/opportunity.presentation.d.ts +17 -86
  66. package/dist/{opportunities → internal/opportunities}/opportunity.presentation.js +54 -447
  67. package/dist/{opportunities → internal/opportunities}/opportunity.update-admission.d.ts +2 -2
  68. package/dist/internal/opportunities/opportunity.utils.d.ts +105 -0
  69. package/dist/internal/opportunities/opportunity.utils.js +165 -0
  70. package/dist/{opportunities → internal/opportunities}/radar/radar.graph.d.ts +17 -17
  71. package/dist/{opportunities → internal/opportunities}/radar/radar.graph.js +41 -161
  72. package/dist/{opportunities → internal/opportunities}/radar/radar.state.d.ts +4 -11
  73. package/dist/{shared → internal/shared}/agent/model-signal.d.ts +1 -1
  74. package/dist/{shared → internal/shared}/agent/model-signal.js +1 -1
  75. package/dist/{shared → internal/shared}/agent/model.config.d.ts +28 -86
  76. package/dist/{shared → internal/shared}/agent/model.config.js +58 -69
  77. package/dist/internal/shared/agent/model.resolver.d.ts +33 -0
  78. package/dist/{shared → internal/shared}/agent/model.resolver.js +18 -33
  79. package/dist/internal/shared/agent/scope.d.ts +20 -0
  80. package/dist/internal/shared/agent/scope.js +24 -0
  81. package/dist/internal/shared/assignment/network-assignment.policy.d.ts +23 -0
  82. package/dist/internal/shared/assignment/network-assignment.policy.js +28 -0
  83. package/dist/{shared → internal/shared}/observability/log.d.ts +3 -6
  84. package/dist/{shared → internal/shared}/observability/log.js +9 -18
  85. package/dist/{shared → internal/shared}/observability/protocol.logger.d.ts +1 -1
  86. package/dist/{shared → internal/shared}/observability/protocol.logger.js +1 -1
  87. package/dist/internal/shared/observability/request-context.d.ts +29 -0
  88. package/dist/internal/shared/observability/request-context.js +17 -0
  89. package/dist/{shared → internal/shared}/utils/social-label.d.ts +2 -2
  90. package/dist/{shared → internal/shared}/utils/social-label.js +1 -1
  91. package/dist/platform/database/capabilities.d.ts +59 -0
  92. package/dist/{shared/interfaces/database.entities.d.ts → platform/database/entities.d.ts} +81 -121
  93. package/dist/{shared/interfaces/database.identity-queries.d.ts → platform/database/identity-queries.d.ts} +55 -20
  94. package/dist/platform/database/member-queries.d.ts +55 -0
  95. package/dist/platform/database/member-queries.js +4 -0
  96. package/dist/platform/database/negotiation.d.ts +38 -0
  97. package/dist/{shared/interfaces/database.network-queries.d.ts → platform/database/network-queries.d.ts} +66 -67
  98. package/dist/platform/database/network-queries.js +4 -0
  99. package/dist/{shared/interfaces/database.opportunity-queries.d.ts → platform/database/opportunity-queries.d.ts} +25 -109
  100. package/dist/{shared/interfaces/database.port.d.ts → platform/database/port.d.ts} +52 -117
  101. package/dist/{shared/interfaces/database.port.js → platform/database/port.js} +3 -5
  102. package/dist/platform/database.d.ts +23 -0
  103. package/dist/{shared/interfaces/database.interface.js → platform/database.js} +1 -1
  104. package/dist/{shared/interfaces/cache.interface.d.ts → platform/discovery/cache.d.ts} +2 -4
  105. package/dist/{shared/interfaces/cache.interface.js → platform/discovery/cache.js} +1 -1
  106. package/dist/platform/discovery/embedder.d.ts +31 -0
  107. package/dist/platform/runtime/errors.d.ts +6 -0
  108. package/dist/platform/runtime/errors.js +9 -0
  109. package/dist/platform/runtime/follow-up.d.ts +36 -0
  110. package/dist/platform/runtime/follow-up.js +4 -0
  111. package/dist/platform/runtime/observability.d.ts +34 -0
  112. package/dist/protocol/core.d.ts +11 -0
  113. package/dist/protocol/discovery.rules.d.ts +21 -0
  114. package/dist/protocol/discovery.rules.js +29 -0
  115. package/dist/protocol/negotiation.constants.d.ts +3 -0
  116. package/dist/protocol/negotiation.constants.js +3 -0
  117. package/dist/protocol/negotiation.rules.d.ts +73 -0
  118. package/dist/protocol/negotiation.rules.js +68 -0
  119. package/dist/protocol/protocol.prompt.d.ts +13 -0
  120. package/dist/protocol/protocol.prompt.js +190 -0
  121. package/dist/{shared → protocol}/schemas/discovery-question.schema.d.ts +13 -13
  122. package/dist/{shared → protocol}/schemas/discovery-question.schema.js +2 -2
  123. package/dist/{shared → protocol}/schemas/identity.schema.d.ts +4 -4
  124. package/dist/{shared → protocol}/schemas/identity.schema.js +4 -4
  125. package/dist/{shared → protocol}/schemas/network-assignment.schema.d.ts +11 -20
  126. package/dist/{shared → protocol}/schemas/network-assignment.schema.js +2 -9
  127. package/dist/protocol/schemas/underspecification.schema.d.ts +9 -0
  128. package/dist/protocol/schemas/underspecification.schema.js +12 -0
  129. package/package.json +7 -15
  130. package/dist/agents/agent.dispatcher.port.d.ts +0 -25
  131. package/dist/agents/agent.module.d.ts +0 -19
  132. package/dist/agents/agent.module.js +0 -11
  133. package/dist/agents/agent.repository.port.d.ts +0 -118
  134. package/dist/agents/agent.repository.port.js +0 -10
  135. package/dist/agents/agent.tools.d.ts +0 -16
  136. package/dist/agents/agent.tools.js +0 -351
  137. package/dist/agents/agent.tools.port.d.ts +0 -22
  138. package/dist/agents/agent.tools.port.js +0 -18
  139. package/dist/agents/agent.types.d.ts +0 -76
  140. package/dist/chat/chat-streaming.types.d.ts +0 -618
  141. package/dist/chat/chat-streaming.types.js +0 -297
  142. package/dist/chat/chat.agent.d.ts +0 -292
  143. package/dist/chat/chat.agent.js +0 -1010
  144. package/dist/chat/chat.graph.d.ts +0 -424
  145. package/dist/chat/chat.graph.js +0 -257
  146. package/dist/chat/chat.interrupt.classifier.d.ts +0 -25
  147. package/dist/chat/chat.interrupt.classifier.js +0 -64
  148. package/dist/chat/chat.persona.d.ts +0 -39
  149. package/dist/chat/chat.prompt.d.ts +0 -4
  150. package/dist/chat/chat.prompt.js +0 -12
  151. package/dist/chat/chat.prompt.modules.d.ts +0 -30
  152. package/dist/chat/chat.prompt.modules.js +0 -40
  153. package/dist/chat/chat.question-dedup.d.ts +0 -14
  154. package/dist/chat/chat.question-dedup.js +0 -17
  155. package/dist/chat/chat.state.d.ts +0 -135
  156. package/dist/chat/chat.state.js +0 -120
  157. package/dist/chat/chat.streamer.d.ts +0 -64
  158. package/dist/chat/chat.streamer.js +0 -217
  159. package/dist/chat/chat.suggester.d.ts +0 -23
  160. package/dist/chat/chat.suggester.js +0 -95
  161. package/dist/chat/chat.summarizer.d.ts +0 -20
  162. package/dist/chat/chat.summarizer.js +0 -97
  163. package/dist/chat/chat.title.generator.d.ts +0 -19
  164. package/dist/chat/chat.title.generator.js +0 -66
  165. package/dist/chat/chat.tools.d.ts +0 -5
  166. package/dist/chat/chat.tools.js +0 -62
  167. package/dist/chat/chat.utils.d.ts +0 -41
  168. package/dist/chat/chat.utils.js +0 -88
  169. package/dist/chat/negotiator.persona.d.ts +0 -74
  170. package/dist/chat/negotiator.persona.js +0 -154
  171. package/dist/chat/negotiator.prompt.d.ts +0 -45
  172. package/dist/chat/negotiator.prompt.js +0 -160
  173. package/dist/chat/negotiator.tools.d.ts +0 -42
  174. package/dist/chat/negotiator.tools.js +0 -134
  175. package/dist/chat/onboarding.persona.d.ts +0 -28
  176. package/dist/chat/onboarding.persona.js +0 -86
  177. package/dist/chat/onboarding.prompt.d.ts +0 -6
  178. package/dist/chat/onboarding.prompt.js +0 -63
  179. package/dist/chat/signal.persona.d.ts +0 -47
  180. package/dist/chat/signal.persona.js +0 -319
  181. package/dist/chat/signal.prompt.d.ts +0 -39
  182. package/dist/chat/signal.prompt.js +0 -136
  183. package/dist/contacts/contact.module.d.ts +0 -8
  184. package/dist/contacts/contact.module.js +0 -6
  185. package/dist/contacts/contact.repository.port.d.ts +0 -21
  186. package/dist/contacts/contact.repository.port.js +0 -12
  187. package/dist/contacts/contact.tools.d.ts +0 -17
  188. package/dist/contacts/contact.tools.js +0 -108
  189. package/dist/contacts/contact.tools.port.d.ts +0 -20
  190. package/dist/contacts/contact.tools.port.js +0 -16
  191. package/dist/contacts/contact.types.d.ts +0 -24
  192. package/dist/contacts/contact.types.js +0 -8
  193. package/dist/contexts/context.generator.d.ts +0 -95
  194. package/dist/contexts/context.generator.js +0 -127
  195. package/dist/contexts/context.module.d.ts +0 -13
  196. package/dist/contexts/context.module.js +0 -12
  197. package/dist/contexts/context.tools.port.d.ts +0 -9
  198. package/dist/discovery/hyde.documents.d.ts +0 -9
  199. package/dist/discovery/hyde.documents.js +0 -49
  200. package/dist/discovery/hyde.env.d.ts +0 -8
  201. package/dist/discovery/hyde.env.js +0 -9
  202. package/dist/discovery/hyde.frame.d.ts +0 -150
  203. package/dist/discovery/hyde.frame.js +0 -107
  204. package/dist/discovery/hyde.generator.d.ts +0 -38
  205. package/dist/discovery/hyde.generator.js +0 -103
  206. package/dist/discovery/hyde.graph.d.ts +0 -209
  207. package/dist/discovery/hyde.graph.js +0 -482
  208. package/dist/discovery/hyde.state.d.ts +0 -70
  209. package/dist/discovery/hyde.state.js +0 -85
  210. package/dist/discovery/hyde.strategies.d.ts +0 -17
  211. package/dist/discovery/hyde.strategies.js +0 -34
  212. package/dist/discovery/hyde.validator.d.ts +0 -78
  213. package/dist/discovery/hyde.validator.js +0 -48
  214. package/dist/discovery/index.d.ts +0 -26
  215. package/dist/discovery/index.js +0 -19
  216. package/dist/discovery/lens.inferrer.d.ts +0 -214
  217. package/dist/discovery/lens.inferrer.js +0 -152
  218. package/dist/enrichment/enrichment.generator.d.ts +0 -68
  219. package/dist/enrichment/enrichment.generator.js +0 -95
  220. package/dist/enrichment/enrichment.graph.d.ts +0 -544
  221. package/dist/enrichment/enrichment.graph.js +0 -695
  222. package/dist/enrichment/enrichment.state.d.ts +0 -141
  223. package/dist/enrichment/enrichment.state.js +0 -115
  224. package/dist/enrichment/enrichment.tools.context-read.d.ts +0 -10
  225. package/dist/enrichment/enrichment.tools.context-read.js +0 -353
  226. package/dist/enrichment/enrichment.tools.context-write.d.ts +0 -9
  227. package/dist/enrichment/enrichment.tools.context-write.js +0 -417
  228. package/dist/enrichment/enrichment.tools.d.ts +0 -13
  229. package/dist/enrichment/enrichment.tools.helpers.d.ts +0 -139
  230. package/dist/enrichment/enrichment.tools.helpers.js +0 -234
  231. package/dist/enrichment/enrichment.tools.js +0 -153
  232. package/dist/intents/graph/intent.graph.infer.d.ts +0 -44
  233. package/dist/intents/graph/intent.graph.infer.js +0 -97
  234. package/dist/intents/graph/intent.graph.js +0 -134
  235. package/dist/intents/graph/intent.graph.reconcile.js +0 -274
  236. package/dist/intents/graph/intent.graph.shared.d.ts +0 -68
  237. package/dist/intents/intake/intake.orchestrator.d.ts +0 -203
  238. package/dist/intents/intake/intake.orchestrator.js +0 -255
  239. package/dist/intents/intake/intake.pack.generator.d.ts +0 -57
  240. package/dist/intents/intake/intake.pack.generator.js +0 -90
  241. package/dist/intents/intent.clarifier.d.ts +0 -51
  242. package/dist/intents/intent.clarifier.js +0 -201
  243. package/dist/intents/intent.indexer.d.ts +0 -82
  244. package/dist/intents/intent.indexer.js +0 -170
  245. package/dist/intents/intent.module.js +0 -103
  246. package/dist/intents/intent.proposal.d.ts +0 -37
  247. package/dist/intents/intent.proposal.js +0 -14
  248. package/dist/intents/intent.reconciler.d.ts +0 -105
  249. package/dist/intents/intent.reconciler.js +0 -186
  250. package/dist/intents/intent.tools.d.ts +0 -27
  251. package/dist/intents/intent.tools.js +0 -808
  252. package/dist/maintenance/maintenance.graph.d.ts +0 -239
  253. package/dist/maintenance/maintenance.graph.js +0 -199
  254. package/dist/maintenance/maintenance.state.d.ts +0 -35
  255. package/dist/maintenance/maintenance.state.js +0 -55
  256. package/dist/mcp/elicitation.builder.d.ts +0 -53
  257. package/dist/mcp/elicitation.builder.js +0 -74
  258. package/dist/mcp/elicitation.dispatcher.d.ts +0 -36
  259. package/dist/mcp/elicitation.dispatcher.js +0 -86
  260. package/dist/mcp/mcp.authorization-policy.d.ts +0 -252
  261. package/dist/mcp/mcp.authorization-policy.js +0 -535
  262. package/dist/mcp/mcp.server.d.ts +0 -90
  263. package/dist/mcp/mcp.server.js +0 -631
  264. package/dist/negotiations/insight.generator.d.ts +0 -31
  265. package/dist/negotiations/insight.generator.js +0 -105
  266. package/dist/negotiations/negotiation.agent.d.ts +0 -130
  267. package/dist/negotiations/negotiation.agent.js +0 -396
  268. package/dist/negotiations/negotiation.answer-consumption.d.ts +0 -223
  269. package/dist/negotiations/negotiation.answer-consumption.js +0 -275
  270. package/dist/negotiations/negotiation.attribution.d.ts +0 -91
  271. package/dist/negotiations/negotiation.attribution.js +0 -109
  272. package/dist/negotiations/negotiation.candidates.d.ts +0 -83
  273. package/dist/negotiations/negotiation.candidates.js +0 -162
  274. package/dist/negotiations/negotiation.client-dm.d.ts +0 -50
  275. package/dist/negotiations/negotiation.client-dm.js +0 -66
  276. package/dist/negotiations/negotiation.consultation-policy.d.ts +0 -95
  277. package/dist/negotiations/negotiation.consultation-policy.js +0 -159
  278. package/dist/negotiations/negotiation.deadlock.contracts.d.ts +0 -10
  279. package/dist/negotiations/negotiation.deadlock.d.ts +0 -87
  280. package/dist/negotiations/negotiation.deadlock.js +0 -150
  281. package/dist/negotiations/negotiation.detail-reader.d.ts +0 -94
  282. package/dist/negotiations/negotiation.detail-reader.js +0 -91
  283. package/dist/negotiations/negotiation.expected-speaker.d.ts +0 -33
  284. package/dist/negotiations/negotiation.expected-speaker.js +0 -59
  285. package/dist/negotiations/negotiation.graph.d.ts +0 -694
  286. package/dist/negotiations/negotiation.graph.finalize.d.ts +0 -5
  287. package/dist/negotiations/negotiation.graph.finalize.js +0 -403
  288. package/dist/negotiations/negotiation.graph.init.d.ts +0 -54
  289. package/dist/negotiations/negotiation.graph.init.js +0 -256
  290. package/dist/negotiations/negotiation.graph.js +0 -94
  291. package/dist/negotiations/negotiation.graph.screen.d.ts +0 -23
  292. package/dist/negotiations/negotiation.graph.screen.js +0 -108
  293. package/dist/negotiations/negotiation.graph.shared.d.ts +0 -111
  294. package/dist/negotiations/negotiation.graph.shared.js +0 -168
  295. package/dist/negotiations/negotiation.graph.turn.d.ts +0 -134
  296. package/dist/negotiations/negotiation.graph.turn.js +0 -662
  297. package/dist/negotiations/negotiation.hermes-contract.d.ts +0 -31
  298. package/dist/negotiations/negotiation.hermes-contract.js +0 -72
  299. package/dist/negotiations/negotiation.intent-snapshot-provenance.d.ts +0 -21
  300. package/dist/negotiations/negotiation.intent-snapshot-provenance.js +0 -28
  301. package/dist/negotiations/negotiation.lifecycle-narration.d.ts +0 -18
  302. package/dist/negotiations/negotiation.lifecycle-narration.js +0 -87
  303. package/dist/negotiations/negotiation.memory.d.ts +0 -65
  304. package/dist/negotiations/negotiation.memory.js +0 -83
  305. package/dist/negotiations/negotiation.module.d.ts +0 -36
  306. package/dist/negotiations/negotiation.module.js +0 -23
  307. package/dist/negotiations/negotiation.protocol.d.ts +0 -1018
  308. package/dist/negotiations/negotiation.protocol.js +0 -224
  309. package/dist/negotiations/negotiation.question-safety.d.ts +0 -52
  310. package/dist/negotiations/negotiation.question-safety.js +0 -119
  311. package/dist/negotiations/negotiation.reflect.d.ts +0 -194
  312. package/dist/negotiations/negotiation.reflect.js +0 -145
  313. package/dist/negotiations/negotiation.scope.d.ts +0 -41
  314. package/dist/negotiations/negotiation.scope.js +0 -39
  315. package/dist/negotiations/negotiation.screen.contracts.d.ts +0 -88
  316. package/dist/negotiations/negotiation.screen.contracts.js +0 -58
  317. package/dist/negotiations/negotiation.screen.d.ts +0 -78
  318. package/dist/negotiations/negotiation.screen.js +0 -112
  319. package/dist/negotiations/negotiation.stall-gap.d.ts +0 -83
  320. package/dist/negotiations/negotiation.stall-gap.js +0 -152
  321. package/dist/negotiations/negotiation.stance.contracts.d.ts +0 -123
  322. package/dist/negotiations/negotiation.stance.contracts.js +0 -317
  323. package/dist/negotiations/negotiation.state.d.ts +0 -597
  324. package/dist/negotiations/negotiation.state.js +0 -286
  325. package/dist/negotiations/negotiation.summarizer.d.ts +0 -25
  326. package/dist/negotiations/negotiation.summarizer.js +0 -101
  327. package/dist/negotiations/negotiation.task-lock-policy.d.ts +0 -10
  328. package/dist/negotiations/negotiation.task-lock-policy.js +0 -22
  329. package/dist/negotiations/negotiation.tools.d.ts +0 -18
  330. package/dist/negotiations/negotiation.tools.js +0 -842
  331. package/dist/negotiations/negotiation.tools.port.d.ts +0 -17
  332. package/dist/negotiations/negotiation.turn-cap.d.ts +0 -9
  333. package/dist/negotiations/negotiation.turn-cap.js +0 -12
  334. package/dist/networks/indexer.state.js +0 -112
  335. package/dist/networks/network.tools.d.ts +0 -36
  336. package/dist/networks/network.tools.js +0 -594
  337. package/dist/opportunities/delivery-card.cache.d.ts +0 -25
  338. package/dist/opportunities/delivery-card.cache.js +0 -43
  339. package/dist/opportunities/discovery.env.d.ts +0 -20
  340. package/dist/opportunities/discovery.env.js +0 -109
  341. package/dist/opportunities/discriminator/discriminator.adjustments.d.ts +0 -90
  342. package/dist/opportunities/discriminator/discriminator.adjustments.js +0 -141
  343. package/dist/opportunities/discriminator/discriminator.assigner.d.ts +0 -78
  344. package/dist/opportunities/discriminator/discriminator.assigner.js +0 -153
  345. package/dist/opportunities/discriminator/discriminator.env.d.ts +0 -103
  346. package/dist/opportunities/discriminator/discriminator.env.js +0 -103
  347. package/dist/opportunities/discriminator/discriminator.miner.d.ts +0 -114
  348. package/dist/opportunities/discriminator/discriminator.miner.js +0 -228
  349. package/dist/opportunities/discriminator/discriminator.push.d.ts +0 -13
  350. package/dist/opportunities/discriminator/discriminator.push.js +0 -19
  351. package/dist/opportunities/discriminator/discriminator.question.d.ts +0 -58
  352. package/dist/opportunities/discriminator/discriminator.question.js +0 -155
  353. package/dist/opportunities/discriminator/discriminator.scorer.d.ts +0 -32
  354. package/dist/opportunities/discriminator/discriminator.scorer.js +0 -105
  355. package/dist/opportunities/discriminator/discriminator.shadow.d.ts +0 -32
  356. package/dist/opportunities/discriminator/discriminator.shadow.js +0 -90
  357. package/dist/opportunities/discriminator/discriminator.types.d.ts +0 -93
  358. package/dist/opportunities/discriminator/discriminator.types.js +0 -18
  359. package/dist/opportunities/negotiation-context.loader.d.ts +0 -59
  360. package/dist/opportunities/negotiation-context.loader.js +0 -90
  361. package/dist/opportunities/negotiation-evidence/negotiation-evidence.env.d.ts +0 -43
  362. package/dist/opportunities/negotiation-evidence/negotiation-evidence.env.js +0 -44
  363. package/dist/opportunities/negotiation-evidence/negotiation-evidence.extractor.d.ts +0 -24
  364. package/dist/opportunities/negotiation-evidence/negotiation-evidence.extractor.js +0 -188
  365. package/dist/opportunities/negotiation-evidence/negotiation-evidence.miner.d.ts +0 -26
  366. package/dist/opportunities/negotiation-evidence/negotiation-evidence.miner.js +0 -112
  367. package/dist/opportunities/negotiation-evidence/negotiation-evidence.shadow.d.ts +0 -19
  368. package/dist/opportunities/negotiation-evidence/negotiation-evidence.shadow.js +0 -61
  369. package/dist/opportunities/negotiation-evidence/negotiation-evidence.types.d.ts +0 -191
  370. package/dist/opportunities/negotiation-evidence/negotiation-evidence.types.js +0 -18
  371. package/dist/opportunities/negotiation-evidence/negotiation-evidence.verifier.d.ts +0 -34
  372. package/dist/opportunities/negotiation-evidence/negotiation-evidence.verifier.js +0 -91
  373. package/dist/opportunities/negotiation-summary.builder.d.ts +0 -37
  374. package/dist/opportunities/negotiation-summary.builder.js +0 -66
  375. package/dist/opportunities/opportunity.discovery-negotiation-summary.d.ts +0 -14
  376. package/dist/opportunities/opportunity.discovery-negotiation-summary.js +0 -46
  377. package/dist/opportunities/opportunity.enricher.d.ts +0 -71
  378. package/dist/opportunities/opportunity.enricher.js +0 -280
  379. package/dist/opportunities/opportunity.evaluator.d.ts +0 -289
  380. package/dist/opportunities/opportunity.evaluator.js +0 -516
  381. package/dist/opportunities/opportunity.evidence.d.ts +0 -22
  382. package/dist/opportunities/opportunity.evidence.js +0 -87
  383. package/dist/opportunities/opportunity.existing-negotiation.d.ts +0 -79
  384. package/dist/opportunities/opportunity.existing-negotiation.js +0 -118
  385. package/dist/opportunities/opportunity.feed-selection.js +0 -96
  386. package/dist/opportunities/opportunity.graph.d.ts +0 -1611
  387. package/dist/opportunities/opportunity.graph.discovery-strategies.d.ts +0 -109
  388. package/dist/opportunities/opportunity.graph.discovery-strategies.js +0 -451
  389. package/dist/opportunities/opportunity.graph.discovery.d.ts +0 -69
  390. package/dist/opportunities/opportunity.graph.discovery.js +0 -397
  391. package/dist/opportunities/opportunity.graph.evaluation.d.ts +0 -82
  392. package/dist/opportunities/opportunity.graph.evaluation.js +0 -608
  393. package/dist/opportunities/opportunity.graph.js +0 -193
  394. package/dist/opportunities/opportunity.graph.modes.d.ts +0 -538
  395. package/dist/opportunities/opportunity.graph.modes.js +0 -538
  396. package/dist/opportunities/opportunity.graph.negotiate.d.ts +0 -109
  397. package/dist/opportunities/opportunity.graph.negotiate.js +0 -392
  398. package/dist/opportunities/opportunity.graph.persist-node.d.ts +0 -93
  399. package/dist/opportunities/opportunity.graph.persist-node.js +0 -765
  400. package/dist/opportunities/opportunity.graph.prep.d.ts +0 -150
  401. package/dist/opportunities/opportunity.graph.prep.js +0 -381
  402. package/dist/opportunities/opportunity.graph.shared.d.ts +0 -173
  403. package/dist/opportunities/opportunity.graph.shared.js +0 -199
  404. package/dist/opportunities/opportunity.introducer-feature.d.ts +0 -2
  405. package/dist/opportunities/opportunity.introducer-feature.js +0 -4
  406. package/dist/opportunities/opportunity.introducer.d.ts +0 -77
  407. package/dist/opportunities/opportunity.introducer.js +0 -99
  408. package/dist/opportunities/opportunity.labels.js +0 -10
  409. package/dist/opportunities/opportunity.lifecycle.d.ts +0 -63
  410. package/dist/opportunities/opportunity.lifecycle.js +0 -181
  411. package/dist/opportunities/opportunity.module.d.ts +0 -54
  412. package/dist/opportunities/opportunity.module.js +0 -39
  413. package/dist/opportunities/opportunity.newborn-stamping.d.ts +0 -41
  414. package/dist/opportunities/opportunity.newborn-stamping.js +0 -81
  415. package/dist/opportunities/opportunity.owner-approval.d.ts +0 -118
  416. package/dist/opportunities/opportunity.owner-approval.js +0 -34
  417. package/dist/opportunities/opportunity.owner-provenance.d.ts +0 -6
  418. package/dist/opportunities/opportunity.owner-provenance.js +0 -28
  419. package/dist/opportunities/opportunity.persist.d.ts +0 -58
  420. package/dist/opportunities/opportunity.persist.js +0 -145
  421. package/dist/opportunities/opportunity.persistence-admission.d.ts +0 -39
  422. package/dist/opportunities/opportunity.persistence-admission.js +0 -59
  423. package/dist/opportunities/opportunity.state.d.ts +0 -451
  424. package/dist/opportunities/opportunity.state.js +0 -256
  425. package/dist/opportunities/opportunity.tools.cards.d.ts +0 -138
  426. package/dist/opportunities/opportunity.tools.cards.js +0 -212
  427. package/dist/opportunities/opportunity.tools.d.ts +0 -12
  428. package/dist/opportunities/opportunity.tools.js +0 -236
  429. package/dist/opportunities/opportunity.tools.list.d.ts +0 -10
  430. package/dist/opportunities/opportunity.tools.list.js +0 -489
  431. package/dist/opportunities/opportunity.tools.port.d.ts +0 -16
  432. package/dist/opportunities/opportunity.utils.d.ts +0 -217
  433. package/dist/opportunities/opportunity.utils.js +0 -395
  434. package/dist/opportunities/outcome/outcome.env.d.ts +0 -60
  435. package/dist/opportunities/outcome/outcome.env.js +0 -63
  436. package/dist/opportunities/outcome/outcome.hypotheses.d.ts +0 -29
  437. package/dist/opportunities/outcome/outcome.hypotheses.js +0 -117
  438. package/dist/opportunities/outcome/outcome.shadow.d.ts +0 -56
  439. package/dist/opportunities/outcome/outcome.shadow.js +0 -87
  440. package/dist/opportunities/outcome/outcome.types.d.ts +0 -110
  441. package/dist/opportunities/outcome/outcome.types.js +0 -26
  442. package/dist/opportunities/radar/radar.health.d.ts +0 -31
  443. package/dist/opportunities/radar/radar.health.js +0 -75
  444. package/dist/premises/premise.analyzer.d.ts +0 -35
  445. package/dist/premises/premise.analyzer.js +0 -115
  446. package/dist/premises/premise.decomposer.d.ts +0 -69
  447. package/dist/premises/premise.decomposer.js +0 -213
  448. package/dist/premises/premise.graph.d.ts +0 -345
  449. package/dist/premises/premise.graph.js +0 -278
  450. package/dist/premises/premise.indexer.d.ts +0 -35
  451. package/dist/premises/premise.indexer.js +0 -86
  452. package/dist/premises/premise.state.d.ts +0 -67
  453. package/dist/premises/premise.state.js +0 -94
  454. package/dist/premises/premise.tools.d.ts +0 -3
  455. package/dist/premises/premise.tools.js +0 -248
  456. package/dist/questions/question.env.d.ts +0 -27
  457. package/dist/questions/question.env.js +0 -27
  458. package/dist/questions/question.input.d.ts +0 -107
  459. package/dist/questions/question.module.d.ts +0 -30
  460. package/dist/questions/question.module.js +0 -28
  461. package/dist/questions/question.schema.d.ts +0 -1529
  462. package/dist/questions/question.schema.js +0 -420
  463. package/dist/shared/agent/activity-projection.d.ts +0 -271
  464. package/dist/shared/agent/activity-projection.js +0 -254
  465. package/dist/shared/agent/canonical-guidance.d.ts +0 -30
  466. package/dist/shared/agent/canonical-guidance.js +0 -246
  467. package/dist/shared/agent/model.resolver.d.ts +0 -48
  468. package/dist/shared/agent/tool.factory.d.ts +0 -17
  469. package/dist/shared/agent/tool.factory.js +0 -221
  470. package/dist/shared/agent/tool.helpers.d.ts +0 -482
  471. package/dist/shared/agent/tool.helpers.js +0 -232
  472. package/dist/shared/agent/tool.registry.d.ts +0 -25
  473. package/dist/shared/agent/tool.registry.js +0 -76
  474. package/dist/shared/agent/tool.runtime.d.ts +0 -28
  475. package/dist/shared/agent/tool.runtime.js +0 -194
  476. package/dist/shared/agent/tool.scope.d.ts +0 -44
  477. package/dist/shared/agent/tool.scope.js +0 -50
  478. package/dist/shared/agent/utility.tools.d.ts +0 -15
  479. package/dist/shared/agent/utility.tools.js +0 -322
  480. package/dist/shared/assignment/network-assignment.policy.d.ts +0 -61
  481. package/dist/shared/assignment/network-assignment.policy.js +0 -105
  482. package/dist/shared/interfaces/agent-dispatcher.interface.d.ts +0 -100
  483. package/dist/shared/interfaces/agent-dispatcher.interface.js +0 -12
  484. package/dist/shared/interfaces/auth.interface.d.ts +0 -37
  485. package/dist/shared/interfaces/auth.interface.js +0 -1
  486. package/dist/shared/interfaces/chat-message-writer.interface.d.ts +0 -18
  487. package/dist/shared/interfaces/chat-message-writer.interface.js +0 -1
  488. package/dist/shared/interfaces/chat-session.interface.d.ts +0 -23
  489. package/dist/shared/interfaces/chat-session.interface.js +0 -18
  490. package/dist/shared/interfaces/chat-summary.interface.d.ts +0 -16
  491. package/dist/shared/interfaces/chat-summary.interface.js +0 -1
  492. package/dist/shared/interfaces/database.capabilities.d.ts +0 -100
  493. package/dist/shared/interfaces/database.interface.d.ts +0 -16
  494. package/dist/shared/interfaces/database.member-queries.d.ts +0 -219
  495. package/dist/shared/interfaces/database.member-queries.js +0 -4
  496. package/dist/shared/interfaces/database.negotiation.d.ts +0 -329
  497. package/dist/shared/interfaces/database.negotiation.js +0 -26
  498. package/dist/shared/interfaces/database.network-queries.js +0 -4
  499. package/dist/shared/interfaces/database.opportunity-queries.js +0 -4
  500. package/dist/shared/interfaces/delivery-ledger.interface.d.ts +0 -40
  501. package/dist/shared/interfaces/delivery-ledger.interface.js +0 -5
  502. package/dist/shared/interfaces/embedder.interface.d.ts +0 -92
  503. package/dist/shared/interfaces/embedder.interface.js +0 -4
  504. package/dist/shared/interfaces/enrichment-run.interface.d.ts +0 -62
  505. package/dist/shared/interfaces/enrichment-run.interface.js +0 -1
  506. package/dist/shared/interfaces/enrichment.interface.js +0 -1
  507. package/dist/shared/interfaces/negotiation-events.interface.d.ts +0 -77
  508. package/dist/shared/interfaces/negotiation-events.interface.js +0 -6
  509. package/dist/shared/interfaces/negotiation-summary.interface.d.ts +0 -25
  510. package/dist/shared/interfaces/negotiation-summary.interface.js +0 -1
  511. package/dist/shared/interfaces/negotiator-memory.interface.d.ts +0 -58
  512. package/dist/shared/interfaces/negotiator-memory.interface.js +0 -11
  513. package/dist/shared/interfaces/queue.interface.d.ts +0 -23
  514. package/dist/shared/interfaces/queue.interface.js +0 -4
  515. package/dist/shared/interfaces/scraper.interface.js +0 -1
  516. package/dist/shared/interfaces/tool-request-context.interface.d.ts +0 -11
  517. package/dist/shared/interfaces/tool-request-context.interface.js +0 -1
  518. package/dist/shared/observability/request-context.d.ts +0 -27
  519. package/dist/shared/observability/request-context.js +0 -6
  520. package/dist/shared/schemas/mcp-auth.schema.d.ts +0 -87
  521. package/dist/shared/schemas/mcp-auth.schema.js +0 -56
  522. package/dist/shared/schemas/negotiation-digest.schema.d.ts +0 -58
  523. package/dist/shared/schemas/negotiation-digest.schema.js +0 -38
  524. package/dist/shared/schemas/negotiation-state.schema.d.ts +0 -343
  525. package/dist/shared/schemas/negotiation-state.schema.js +0 -81
  526. package/dist/shared/schemas/question-block.fixture.d.ts +0 -12
  527. package/dist/shared/schemas/question-block.fixture.js +0 -39
  528. package/dist/shared/schemas/question-block.schema.d.ts +0 -111
  529. package/dist/shared/schemas/question-block.schema.js +0 -124
  530. package/dist/shared/schemas/structured-question.schema.d.ts +0 -66
  531. package/dist/shared/schemas/structured-question.schema.js +0 -31
  532. package/dist/shared/schemas/underspecification.schema.d.ts +0 -13
  533. package/dist/shared/schemas/underspecification.schema.js +0 -16
  534. /package/dist/{opportunities → internal/opportunities}/opportunity.update-admission.js +0 -0
  535. /package/dist/{opportunities → internal/opportunities}/radar/radar.state.js +0 -0
  536. /package/dist/{shared → internal/shared}/network/metadata.renderer.d.ts +0 -0
  537. /package/dist/{shared → internal/shared}/network/metadata.renderer.js +0 -0
  538. /package/dist/{shared → internal/shared}/observability/debug-meta.sanitizer.d.ts +0 -0
  539. /package/dist/{shared → internal/shared}/observability/debug-meta.sanitizer.js +0 -0
  540. /package/dist/{shared → internal/shared}/observability/performance.d.ts +0 -0
  541. /package/dist/{shared → internal/shared}/observability/performance.js +0 -0
  542. /package/dist/{shared → internal/shared}/observability/trace.d.ts +0 -0
  543. /package/dist/{shared → internal/shared}/observability/trace.js +0 -0
  544. /package/dist/{shared → internal/shared}/utils/claim-safety.d.ts +0 -0
  545. /package/dist/{shared → internal/shared}/utils/claim-safety.js +0 -0
  546. /package/dist/{shared → internal/shared}/utils/telegram-handle.d.ts +0 -0
  547. /package/dist/{shared → internal/shared}/utils/telegram-handle.js +0 -0
  548. /package/dist/{shared/interfaces/database.capabilities.js → platform/database/capabilities.js} +0 -0
  549. /package/dist/{shared/interfaces/database.entities.js → platform/database/entities.js} +0 -0
  550. /package/dist/{shared/interfaces/database.identity-queries.js → platform/database/identity-queries.js} +0 -0
  551. /package/dist/{agents/agent.dispatcher.port.js → platform/database/negotiation.js} +0 -0
  552. /package/dist/{chat/chat.persona.js → platform/database/opportunity-queries.js} +0 -0
  553. /package/dist/{contexts/context.tools.port.js → platform/discovery/embedder.js} +0 -0
  554. /package/dist/{shared/interfaces/scraper.interface.d.ts → platform/discovery/scraper.d.ts} +0 -0
  555. /package/dist/{negotiations/negotiation.deadlock.contracts.js → platform/discovery/scraper.js} +0 -0
  556. /package/dist/{shared/interfaces/enrichment.interface.d.ts → platform/enrichment/ports.d.ts} +0 -0
  557. /package/dist/{negotiations/negotiation.tools.port.js → platform/enrichment/ports.js} +0 -0
  558. /package/dist/{opportunities/opportunity.tools.port.js → platform/runtime/observability.js} +0 -0
  559. /package/dist/{questions/question.input.js → protocol/core.js} +0 -0
  560. /package/dist/{shared → protocol}/schemas/chat-context.schema.d.ts +0 -0
  561. /package/dist/{shared → protocol}/schemas/chat-context.schema.js +0 -0
@@ -1,152 +0,0 @@
1
- /**
2
- * Post-stall gap authoring (conversational-questions plan).
3
- *
4
- * When a negotiation ends unconcluded — no opportunity, no explicit reject:
5
- * turn cap, timeout, or stall — the finalize node asks the negotiator for the
6
- * ONE question whose answer would let a retry conclude, and parks the
7
- * negotiation carrying that gap as an `ask_user` message in its own record.
8
- * This module owns that single extra model call.
9
- *
10
- * Grounding is exactly what mid-flight authoring (P3.2 / IND-401 A2H) uses:
11
- * this negotiation's transcript, plus the client's own negotiator DM for the
12
- * signal when the caller retrieved one. Same non-naming and non-echo rules;
13
- * the caller re-checks the output with `isSafeAuthoredNegotiationQuestion`
14
- * (identifiers in hand) before persisting anything.
15
- *
16
- * Fail-open contract: any model failure, timeout, or invalid output resolves
17
- * to null — the negotiation then stalls exactly as it did before this feature,
18
- * never half-parks.
19
- */
20
- import { z } from "zod";
21
- import { createStructuredModel } from "../shared/agent/model.config.js";
22
- import { invokeWithAbortSignal } from "../shared/agent/model-signal.js";
23
- import { StructuredQuestionSchema } from "../shared/schemas/structured-question.schema.js";
24
- import { NegotiationConsultationReasonSchema } from "../shared/schemas/negotiation-state.schema.js";
25
- import { renderNegotiatorClientDmSection } from "./negotiation.client-dm.js";
26
- import { resolveTurnTimeoutMs } from "./negotiation.agent.js";
27
- import { protocolLogger } from "../shared/observability/protocol.logger.js";
28
- const stallGapLog = protocolLogger("NegotiationStallGapAuthor");
29
- /**
30
- * Fixed transcript reasoning for a post-stall park turn. Deliberately not
31
- * model-authored: assessment reasoning enters the shared A2A record, and the
32
- * park's "why" already lives in the guarded question itself — a second,
33
- * unguarded free-text channel would reopen the leak surface the question gate
34
- * closes.
35
- */
36
- export const NEGOTIATION_PARK_REASONING = "Negotiation parked pending the client's answer.";
37
- const STALL_REASON_LABELS = {
38
- turn_cap: "the turn limit was reached without agreement",
39
- timeout: "the negotiation timed out",
40
- stalled: "the exchange stalled without reaching a conclusion",
41
- };
42
- /**
43
- * Structured output for the gap call. `hasGap: false` is a first-class answer:
44
- * when no single client answer would change a retry's outcome, the negotiation
45
- * must stall terminally rather than park on a filler question. Nullable
46
- * declarations mirror `AskUserPayloadSchema.question` — strict structured-output
47
- * conversion rejects optional-without-nullable, and a returned null reads as
48
- * absent.
49
- */
50
- const StallGapOutputSchema = z.object({
51
- hasGap: z.boolean(),
52
- reason: NegotiationConsultationReasonSchema.nullable().optional().transform((value) => value ?? undefined),
53
- question: StructuredQuestionSchema.nullable().optional().transform((value) => value ?? undefined),
54
- });
55
- const SYSTEM_PROMPT = `You are the Index Negotiator, an AI agent acting on behalf of {userName}. A negotiation you conducted for them about a potential connection has just ended without conclusion: {stallReasonLabel}.
56
-
57
- Your job now is a single decision: is there ONE piece of information only {userName} holds whose answer would let a retry of this negotiation reach a conclusion? Read the exchange below and judge where it actually stuck.
58
-
59
- - If no single answer from {userName} would change a retry's outcome — the match is simply weak, the counterparty is the blocker, or the stall had nothing to do with missing input from {userName} — set hasGap to false and omit the question. Do not invent a question to have something to ask; asking costs {userName} attention and pauses nothing useful.
60
- - If yes, set hasGap to true and author the question:
61
- - reason: exactly one closed server category recording WHY the pause is warranted: "unresolved_owner_constraint" | "consequential_disclosure_permission" | "repeated_non_convergence" | "insufficient_commitment_authority". It is not the wording {userName} sees.
62
- - title: at most 12 characters — a noun for the decision domain, e.g. "Stage", "Timing", "Budget", "Scope".
63
- - prompt: at most 2 sentences and 400 characters, ending in a question mark. Ask about the specific thing that was actually stuck in this negotiation, in {userName}'s own terms, grounded in the exchange below. Never a generic template.
64
- - options: 2–4 of {userName}'s real decision options. Each label at most 120 characters; each description at most 280 characters, stating the CONSEQUENCE of choosing that option — what the retry would do with it — not what it means. Never add an "Other" option; clients provide a free-text fallback automatically.
65
- - multiSelect: true ONLY when the options are not mutually exclusive; false for a single either/or decision.
66
- - Do not name, quote, or describe the counterparty. {userName} can read the transcript, but the question itself must stand on its own without their identity or profile in it.
67
- - Do NOT reference internal system details like scores, pre-screens, or evaluator outputs.{dmGroundingRule}`;
68
- /**
69
- * Appended only when the call actually carries a client-DM excerpt, mirroring
70
- * `ASK_USER_DM_GROUNDING_RULE`: a call with no DM must not carry a rule that
71
- * dangles with nothing in the prompt to check against.
72
- */
73
- const DM_GROUNDING_RULE = `
74
- - Ground the question in your conversation with {userName} about this signal (shown below) as well as in the exchange. Do NOT ask what they have already answered there: if their own words settle the point, there is no gap on it. Use their terms for the thing at stake — the words, numbers, and framing they used, not your paraphrase of them.`;
75
- function formatTurnLine(turn, index) {
76
- const msgPart = turn.message ? ` — message: ${turn.message}` : "";
77
- return `Turn ${index + 1}: ${turn.action} — reasoning: ${turn.assessment.reasoning}${msgPart}`;
78
- }
79
- /**
80
- * Authors the post-stall gap. One instance lives in the graph's dependency bag
81
- * beside `systemAgent`; the finalize node calls it at most once per stalled
82
- * session.
83
- */
84
- export class NegotiationStallGapAuthor {
85
- constructor(config) {
86
- this.timeoutMs = resolveTurnTimeoutMs(config?.timeoutMs);
87
- }
88
- /**
89
- * @returns The authored gap, or null when there is none to ask — the model
90
- * said so, produced invalid output after a retry, or failed. The
91
- * caller treats every null identically: terminal stall, no park.
92
- */
93
- async author(input) {
94
- const clientDm = input.clientDm ?? [];
95
- const model = createStructuredModel("negotiator", StallGapOutputSchema, { name: "negotiation_stall_gap" });
96
- const systemPrompt = SYSTEM_PROMPT
97
- .replace("{stallReasonLabel}", STALL_REASON_LABELS[input.stallReason])
98
- .replace("{dmGroundingRule}", clientDm.length > 0 ? DM_GROUNDING_RULE : "")
99
- .replace(/{userName}/g, input.userName);
100
- const transcript = input.history.length > 0
101
- ? `\n\nNegotiation transcript:\n${input.history.map(formatTurnLine).join("\n")}`
102
- : "";
103
- const userMessage = `{userName}'s signal under negotiation:
104
- - ${input.signal.title}: ${input.signal.description}
105
-
106
- Why this match was suggested: ${input.seedReasoning}${transcript}${renderNegotiatorClientDmSection(clientDm, input.userName)}
107
-
108
- Decide whether one question to {userName} would let a retry conclude, and author it if so.`.replace(/{userName}/g, input.userName);
109
- const chatMessages = [
110
- { role: "system", content: systemPrompt },
111
- { role: "user", content: userMessage },
112
- ];
113
- try {
114
- // Same validate → retry-once → give-up loop as the negotiator turn,
115
- // except giving up resolves to null (terminal stall) instead of a
116
- // fallback action — there is no conservative fallback question.
117
- for (let attempt = 0; attempt < 2; attempt++) {
118
- const result = await this.callModel(model, chatMessages);
119
- const parsed = StallGapOutputSchema.safeParse(result);
120
- if (!parsed.success) {
121
- stallGapLog.warn("Stall-gap output failed schema validation", {
122
- attempt: attempt + 1,
123
- issues: parsed.error.issues.map((issue) => issue.message).slice(0, 3),
124
- });
125
- continue;
126
- }
127
- if (!parsed.data.hasGap)
128
- return null;
129
- if (!parsed.data.question || !parsed.data.reason) {
130
- stallGapLog.warn("Stall-gap output claimed a gap without question or reason", { attempt: attempt + 1 });
131
- continue;
132
- }
133
- return { reason: parsed.data.reason, question: parsed.data.question };
134
- }
135
- return null;
136
- }
137
- catch (err) {
138
- stallGapLog.warn("Stall-gap authoring failed; negotiation stalls without a park", {
139
- error: err instanceof Error ? err.message : String(err),
140
- });
141
- return null;
142
- }
143
- }
144
- /**
145
- * Raw structured-model round trip. Split out as a seam so tests can drive
146
- * the validate→retry→null loop without a live provider — same pattern as
147
- * `IndexNegotiator.callModel`.
148
- */
149
- async callModel(model, chatMessages) {
150
- return invokeWithAbortSignal(model, chatMessages, AbortSignal.timeout(this.timeoutMs));
151
- }
152
- }
@@ -1,123 +0,0 @@
1
- /**
2
- * negotiations/domain — negotiator stance contracts (IND-611).
3
- *
4
- * The acting negotiator prompt is structurally biased toward producing matches
5
- * rather than finding valuable ones: it frames the job as advocacy, treats a
6
- * discovery-query match as a mandate to connect, and carries no
7
- * opportunity-cost term — the only decline bar is the purely negative "does not
8
- * serve {userName}'s needs", so absence of harm reads as grounds to accept.
9
- *
10
- * `NEGOTIATOR_STANCE` makes that stance configurable instead of hard-coded:
11
- *
12
- * | stance | framing | value bar | query rule | consult propensity | evidence provenance | responder check | deadlock |
13
- * |-------------|--------------------------------------|------------------|-------------------------|-------------------------|--------------------------|--------------------------|-----------|
14
- * | `advocate` | argue the case (today) | none | mandate (today) | none (today) | none (today) | none (today) | bargain |
15
- * | `evaluator` | assess first, advocate if it survives | opportunity-cost | necessary-not-sufficient| prefer over assumption | own record ≠ client's evidence | verify the opening | bargain |
16
- * | `skeptic` | + "most matches are not worth making" | opportunity-cost | necessary-not-sufficient| + unverified = don't proceed | (same — no sharpening) | + probe before accepting | stalemate |
17
- *
18
- * Design constraints (hard):
19
- * - **`advocate` is byte-identical.** Every fragment below is additive and
20
- * gated; under `advocate` each renderer returns the exact legacy string, so
21
- * the rendered prompt is byte-for-byte the pre-IND-611 build. Existing prompt
22
- * specs are the guard.
23
- * - **Prompt-only.** The stance changes drafting stance and nothing else:
24
- * no seat vocabulary change (`allowedActionsFor`), no schema change, no graph
25
- * routing change. In particular the continuation-screen bypass at
26
- * `negotiation.graph.ts` (`!state.continuationExecution`) is identical under
27
- * all three stances — deliberately deferred so evals isolate wording as the
28
- * single variable.
29
- * - **Domain layer.** Placed here (not in `application/`) so both the
30
- * application-layer agent and the domain-layer deadlock renderer can read the
31
- * stance without a domain → application cycle.
32
- * - **Fail-safe default.** Unset or unrecognized falls back to `advocate`
33
- * (today's behavior), same operational pattern as `configuredScreenMode()`.
34
- *
35
- * Fragments deliberately never contain the literal `ask_user` or a quoted
36
- * `"withdraw"`: they render into every seat and protocol version, and the seat
37
- * specs pin that those tokens appear only where the seat legally holds them.
38
- *
39
- * One family of fragments is the exception to that seat-blindness by
40
- * construction rather than by accident: the responder verification rules
41
- * (`stanceVerifiesResponderFit`) address a duty only the RESPONDING seat has —
42
- * reading someone else's opening — so `stanceActionRules` takes the seat and
43
- * renders them only there. They still name no action and no mechanism, so the
44
- * seat's own rules and the graph's grants stay the sole authority on what this
45
- * turn may actually do.
46
- *
47
- * The seat parameter is a scoping tool, not a licence to fork: a duty both
48
- * seats hold stays in the shared prefix even when the failure that motivated it
49
- * showed up on one seat. `EVIDENCE_PROVENANCE_RULE` is the case in point — it
50
- * was written for a responder accept, and it renders seat-blind, because an
51
- * initiator can cite its own prior openings' claims exactly as readily.
52
- */
53
- import type { NegotiationSeat } from "../shared/schemas/negotiation-state.schema.js";
54
- export declare const NEGOTIATOR_STANCES: readonly ["advocate", "evaluator", "skeptic"];
55
- export type NegotiatorStance = (typeof NEGOTIATOR_STANCES)[number];
56
- export declare const DEFAULT_NEGOTIATOR_STANCE: NegotiatorStance;
57
- /**
58
- * Resolve the negotiator stance from `NEGOTIATOR_STANCE`.
59
- *
60
- * Defaults to `advocate` when unset or unrecognized — the stance shift is an
61
- * explicit opt-in flip (same operational pattern as `NEGOTIATION_SCREEN_MODE` /
62
- * `NEGOTIATION_PROTOCOL_VERSION`): the code ships dark, the environment turns
63
- * it on.
64
- */
65
- export declare function configuredNegotiatorStance(): NegotiatorStance;
66
- /** Whether this stance applies the opportunity-cost value bar. */
67
- export declare function stanceAppliesValueBar(stance: NegotiatorStance): boolean;
68
- /**
69
- * Whether this stance treats a discovery-query match as a precondition for
70
- * continuing to evaluate rather than as a mandate to connect.
71
- */
72
- export declare function stanceQueryMatchIsNecessaryNotSufficient(stance: NegotiatorStance): boolean;
73
- /**
74
- * Whether this stance asks the RESPONDING seat to verify the opening's account
75
- * of the fit before accepting it, rather than reading that account as evidence.
76
- */
77
- export declare function stanceVerifiesResponderFit(stance: NegotiatorStance): boolean;
78
- /** Whether a detected deadlock resolves by stalemate rather than bargaining. */
79
- export declare function stanceResolvesDeadlockByStalemate(stance: NegotiatorStance): boolean;
80
- /**
81
- * The job-framing sentence for a stance. Under `advocate` this is the exact
82
- * legacy sentence, so the rendered prompt is byte-identical.
83
- *
84
- * `{userName}` placeholders are left intact for the caller's existing global
85
- * replace.
86
- */
87
- export declare function stanceJobFraming(stance: NegotiatorStance): string;
88
- /**
89
- * Extra action-rule lines contributed by the stance, appended after the seat's
90
- * own rules. Empty under `advocate` → byte-identical.
91
- *
92
- * `seat` scopes the responder verification rules to the seat that did NOT
93
- * open. Everything else here is seat-blind: the value bar, the consult
94
- * propensity and the evidence-provenance rule are duties of both seats, and
95
- * the seat parameter must not become a reason to fork them.
96
- *
97
- * Order matters twice over. The seat-blind rules come first, so the initiator's
98
- * rendering stays a strict PREFIX of the responder's — the invariant the stance
99
- * spec checks by subtraction. And provenance lands immediately before the
100
- * responder rules, so "ground the accept in what {userName} themselves stated"
101
- * is already qualified by whose statements count when the responder reads it.
102
- */
103
- export declare function stanceActionRules(stance: NegotiatorStance, seat: NegotiationSeat): string;
104
- /**
105
- * Stance contribution to the pre-contact consultation rule. Empty under
106
- * `advocate` and `evaluator` — the base seat-level rule already states when
107
- * the verdict applies, and only the skeptic's not-worth-making prior changes
108
- * which way a close call should fall.
109
- */
110
- export declare function stancePreContactConsultRule(stance: NegotiatorStance): string;
111
- /**
112
- * The discovery-query satisfaction rule.
113
- *
114
- * `advocate` keeps today's mandate wording verbatim ("PROPOSE or ACCEPT the
115
- * connection…"), which converts a filter into an instruction to connect.
116
- * `evaluator`/`skeptic` make query satisfaction necessary-but-not-sufficient: a
117
- * precondition for continuing to evaluate, never itself a reason to connect.
118
- *
119
- * Names are interpolated eagerly here: this fragment is spliced into the system
120
- * prompt *after* the caller's global `{userName}` substitution has already run,
121
- * so a placeholder would survive into the rendered prompt.
122
- */
123
- export declare function stanceQuerySatisfiedRule(stance: NegotiatorStance, otherName: string, userName: string): string;
@@ -1,317 +0,0 @@
1
- /**
2
- * negotiations/domain — negotiator stance contracts (IND-611).
3
- *
4
- * The acting negotiator prompt is structurally biased toward producing matches
5
- * rather than finding valuable ones: it frames the job as advocacy, treats a
6
- * discovery-query match as a mandate to connect, and carries no
7
- * opportunity-cost term — the only decline bar is the purely negative "does not
8
- * serve {userName}'s needs", so absence of harm reads as grounds to accept.
9
- *
10
- * `NEGOTIATOR_STANCE` makes that stance configurable instead of hard-coded:
11
- *
12
- * | stance | framing | value bar | query rule | consult propensity | evidence provenance | responder check | deadlock |
13
- * |-------------|--------------------------------------|------------------|-------------------------|-------------------------|--------------------------|--------------------------|-----------|
14
- * | `advocate` | argue the case (today) | none | mandate (today) | none (today) | none (today) | none (today) | bargain |
15
- * | `evaluator` | assess first, advocate if it survives | opportunity-cost | necessary-not-sufficient| prefer over assumption | own record ≠ client's evidence | verify the opening | bargain |
16
- * | `skeptic` | + "most matches are not worth making" | opportunity-cost | necessary-not-sufficient| + unverified = don't proceed | (same — no sharpening) | + probe before accepting | stalemate |
17
- *
18
- * Design constraints (hard):
19
- * - **`advocate` is byte-identical.** Every fragment below is additive and
20
- * gated; under `advocate` each renderer returns the exact legacy string, so
21
- * the rendered prompt is byte-for-byte the pre-IND-611 build. Existing prompt
22
- * specs are the guard.
23
- * - **Prompt-only.** The stance changes drafting stance and nothing else:
24
- * no seat vocabulary change (`allowedActionsFor`), no schema change, no graph
25
- * routing change. In particular the continuation-screen bypass at
26
- * `negotiation.graph.ts` (`!state.continuationExecution`) is identical under
27
- * all three stances — deliberately deferred so evals isolate wording as the
28
- * single variable.
29
- * - **Domain layer.** Placed here (not in `application/`) so both the
30
- * application-layer agent and the domain-layer deadlock renderer can read the
31
- * stance without a domain → application cycle.
32
- * - **Fail-safe default.** Unset or unrecognized falls back to `advocate`
33
- * (today's behavior), same operational pattern as `configuredScreenMode()`.
34
- *
35
- * Fragments deliberately never contain the literal `ask_user` or a quoted
36
- * `"withdraw"`: they render into every seat and protocol version, and the seat
37
- * specs pin that those tokens appear only where the seat legally holds them.
38
- *
39
- * One family of fragments is the exception to that seat-blindness by
40
- * construction rather than by accident: the responder verification rules
41
- * (`stanceVerifiesResponderFit`) address a duty only the RESPONDING seat has —
42
- * reading someone else's opening — so `stanceActionRules` takes the seat and
43
- * renders them only there. They still name no action and no mechanism, so the
44
- * seat's own rules and the graph's grants stay the sole authority on what this
45
- * turn may actually do.
46
- *
47
- * The seat parameter is a scoping tool, not a licence to fork: a duty both
48
- * seats hold stays in the shared prefix even when the failure that motivated it
49
- * showed up on one seat. `EVIDENCE_PROVENANCE_RULE` is the case in point — it
50
- * was written for a responder accept, and it renders seat-blind, because an
51
- * initiator can cite its own prior openings' claims exactly as readily.
52
- */
53
- export const NEGOTIATOR_STANCES = ["advocate", "evaluator", "skeptic"];
54
- export const DEFAULT_NEGOTIATOR_STANCE = "advocate";
55
- /**
56
- * Resolve the negotiator stance from `NEGOTIATOR_STANCE`.
57
- *
58
- * Defaults to `advocate` when unset or unrecognized — the stance shift is an
59
- * explicit opt-in flip (same operational pattern as `NEGOTIATION_SCREEN_MODE` /
60
- * `NEGOTIATION_PROTOCOL_VERSION`): the code ships dark, the environment turns
61
- * it on.
62
- */
63
- export function configuredNegotiatorStance() {
64
- const raw = process.env.NEGOTIATOR_STANCE;
65
- if (raw === "advocate" || raw === "evaluator" || raw === "skeptic")
66
- return raw;
67
- return DEFAULT_NEGOTIATOR_STANCE;
68
- }
69
- /** Whether this stance applies the opportunity-cost value bar. */
70
- export function stanceAppliesValueBar(stance) {
71
- return stance !== "advocate";
72
- }
73
- /**
74
- * Whether this stance treats a discovery-query match as a precondition for
75
- * continuing to evaluate rather than as a mandate to connect.
76
- */
77
- export function stanceQueryMatchIsNecessaryNotSufficient(stance) {
78
- return stance !== "advocate";
79
- }
80
- /**
81
- * Whether this stance asks the RESPONDING seat to verify the opening's account
82
- * of the fit before accepting it, rather than reading that account as evidence.
83
- */
84
- export function stanceVerifiesResponderFit(stance) {
85
- return stance !== "advocate";
86
- }
87
- /** Whether a detected deadlock resolves by stalemate rather than bargaining. */
88
- export function stanceResolvesDeadlockByStalemate(stance) {
89
- return stance === "skeptic";
90
- }
91
- // ─── Prompt fragments ────────────────────────────────────────────────────────
92
- /**
93
- * The `advocate` job framing — byte-identical to the pre-IND-611 sentence that
94
- * followed "Your job: Evaluate whether this connection genuinely serves
95
- * {userName}'s interests given their role." in the system prompt.
96
- */
97
- const ADVOCATE_FRAMING = `Argue their case honestly — acknowledge weaknesses, but advocate for genuine fit.`;
98
- /**
99
- * `evaluator`: assessment precedes advocacy. Advocacy is still available — it is
100
- * conditioned on the match surviving an honest judgment first.
101
- */
102
- const EVALUATOR_FRAMING = `Assess before you advocate: first form an honest judgment about whether this connection is actually worth making for {userName}. Advocate only for a match that survives that judgment, and say so plainly when one does not.`;
103
- /**
104
- * `skeptic`: the evaluator framing plus an explicit prior. Borrows the finite-
105
- * attention framing already proven in the outreach gate prompt
106
- * (`negotiation.screen.ts`) — {userName}'s name and attention are spent on
107
- * every connection made for them.
108
- */
109
- const SKEPTIC_FRAMING = `${EVALUATOR_FRAMING} Start from the prior that most candidate matches are NOT worth making: {userName}'s attention is finite and a mediocre connection costs them more than no connection. The burden is on the match to earn their time, not on you to find a way to say yes.`;
110
- /**
111
- * The job-framing sentence for a stance. Under `advocate` this is the exact
112
- * legacy sentence, so the rendered prompt is byte-identical.
113
- *
114
- * `{userName}` placeholders are left intact for the caller's existing global
115
- * replace.
116
- */
117
- export function stanceJobFraming(stance) {
118
- switch (stance) {
119
- case "evaluator":
120
- return EVALUATOR_FRAMING;
121
- case "skeptic":
122
- return SKEPTIC_FRAMING;
123
- default:
124
- return ADVOCATE_FRAMING;
125
- }
126
- }
127
- /**
128
- * The opportunity-cost value bar, appended as an extra action rule.
129
- *
130
- * Today the only decline bar in the prompt is "does not serve {userName}'s
131
- * needs" — a purely negative test, so absence of harm reads as grounds to
132
- * proceed. This adds the missing positive bar without touching any seat's
133
- * action vocabulary.
134
- */
135
- const VALUE_BAR_RULE = `
136
- - OPPORTUNITY COST: {userName}'s attention is finite and their name is spent on every connection made on their behalf. The bar is "worth that spend", not "does no harm" — absence of a downside is NOT a reason to proceed. Ask what {userName} gives up by spending this attention here instead of on a better match, and say no when the answer is "too much".`;
137
- /**
138
- * Consult propensity — assessing stances only.
139
- *
140
- * The assessing stances demand a judgment ("is this actually worth making for
141
- * {userName}?") that sometimes turns on a fact only the client holds: their
142
- * current priorities, their real constraints, what "alignment" would mean to
143
- * them. The legacy failure mode is resolving that gap by assumption —
144
- * guessing, conceding, or accepting on vibes. This rule names the resolution
145
- * path instead: consult the client.
146
- *
147
- * Deliberately names no action and no mechanism: like every fragment here it
148
- * renders into all seats and protocol versions, including seats with no
149
- * consultation vocabulary, so the seat's own rules decide HOW a consultation
150
- * happens and whether one is still available this turn. This only sets when
151
- * the agent should WANT one — which is also why it stays conditional on the
152
- * uncertainty being client-resolvable: no "always"/"regardless" wording that
153
- * would fight the per-negotiation consultation cap
154
- * (`negotiationAskRoundsCap`).
155
- */
156
- const CONSULT_PROPENSITY_RULE = `
157
- - CONSULT, DON'T ASSUME: when your judgment turns on a fact about {userName}'s OWN intent that you do not hold — their current priorities, their real constraints, what "alignment" would actually mean to them — prefer consulting {userName} over resolving that uncertainty by assumption. Guessing their answer, conceding to keep things moving, or proceeding because nothing contradicts the match are all ways of deciding for them what only they can decide.`;
158
- /**
159
- * `skeptic` sharpening of the consult rule, appended to the same bullet (the
160
- * same additive pattern as `SKEPTIC_FRAMING` over `EVALUATOR_FRAMING`): under
161
- * the not-worth-making prior an unverified alignment assumption is itself a
162
- * reason not to proceed, and consulting the client is how it gets verified.
163
- */
164
- const SKEPTIC_CONSULT_SHARPENING = ` For you this is a gate, not a preference: an UNVERIFIED assumption that the two sides' intents actually align is a reason NOT to proceed, and consulting {userName} is how that assumption gets verified.`;
165
- /**
166
- * Evidence provenance — assessing stances, BOTH seats.
167
- *
168
- * The third sibling of the consult-propensity and responder-verification
169
- * fragments, and written for the way the second one was formally obeyed and
170
- * substantively evaded. A responder accepted a first contact grounded — as the
171
- * responder rule demands — in its OWN side's record rather than in the
172
- * opening's characterization. But the record it reached for was its own prior
173
- * conclusions, surfaced through memory and prior dialogue: "{userName}'s
174
- * previous acceptances ... reinforce this strong alignment", from acceptances
175
- * this same negotiator had made under a weaker bar. Circular verification —
176
- * I accepted before, therefore accepting is grounded.
177
- *
178
- * So the rule the verification duty was missing: an agent's own output is not
179
- * its client's evidence. Verification grounds in what a PERSON authored — never
180
- * in what an agent concluded about them, on either side of the table. The
181
- * fragment names exactly the client-authored sections this prompt actually
182
- * renders (intents, profile, and the client's own answers between sessions),
183
- * so the ground it points at is one the negotiator can see.
184
- *
185
- * Two boundaries it deliberately does not cross:
186
- * - **It does not ban memory.** Memory keeps the job it has (advisory notes on
187
- * how to argue, what has been asked, what each side said); what changes is
188
- * only what may count as verification. A fragment that told the negotiator to
189
- * ignore its memory would fight `renderNegotiatorMemorySection` rather than
190
- * complete it.
191
- * - **It does not forbid resolving a repeat signal quickly.** The continuation
192
- * policy in `negotiation.agent.ts` ("materially the same as one you
193
- * previously evaluated ... you may resolve quickly") governs how much EFFORT
194
- * a re-run deserves; this governs what counts as GROUNDS. The nearest
195
- * existing neighbor is the IND-569 attribution policy — "do not treat their
196
- * conclusions as decisions about this opportunity" — which scopes conclusions
197
- * across opportunities; this scopes them across the decision/evidence line.
198
- *
199
- * No `skeptic` sharpening: the prior that most matches are not worth making
200
- * does not change what an unverified assertion is worth. It is worth nothing
201
- * under either assessing stance, and a sharpening here would only restate the
202
- * rule louder.
203
- *
204
- * Names no action and no mechanism, like every other fragment in this module.
205
- */
206
- const EVIDENCE_PROVENANCE_RULE = `
207
- - YOUR OWN RECORD IS DECISIONS, NOT EVIDENCE: your earlier turns, the connections you proposed or accepted on {userName}'s behalf, and the conclusions you carry in memory are YOUR record — decisions you made for them, reached under whatever bar you applied at the time. Leaning on one ("they have been open to this before", "the fit was already established") re-asserts a judgment instead of checking it, and reads your own past eagerness back as {userName}'s interest. Ground the fit in what a person stated for themselves: {userName}'s own intents, profile, and the answers they gave you directly on your side; the counterparty's own intents and profile on theirs. Prior dialogue and memory keep their job — what has already been asked, what each side actually said, how to pitch this one — but they are the history of the argument, not grounds for it. A fit that was not verified does not become verified by having been asserted before.`;
208
- /**
209
- * Responder verification — assessing stances, RESPONDING seat only.
210
- *
211
- * Two structural gaps this closes, both visible in the failure it was written
212
- * for: a first-contact outreach accepted in one exchange, on reasoning that
213
- * restated the opening's own fit claim back as the reason for accepting.
214
- *
215
- * 1. The opening enters the prompt as if it were evidence. It is not: it is
216
- * advocacy authored by the counterparty's agent, and its most load-bearing
217
- * move is characterizing what THIS client wants. Nothing else in the prompt
218
- * tells the responding seat to treat that characterization as a claim.
219
- * 2. `VALUE_BAR_RULE` has no bite in this seat. "Most matches are not worth
220
- * making" reads as being about MAKING matches, and a responder frames its
221
- * decision as "would my client be open to connecting?" — nearly costless,
222
- * nearly certain to be yes. So the same opportunity-cost currency is
223
- * restated in the terms this seat actually spends it: accepting puts a
224
- * connection in front of the client for approval.
225
- *
226
- * Conditional by construction: the steer applies where the fit case RESTS on
227
- * the initiator's interpretation. A match the client's own criteria and the
228
- * counterparty's own evidence support independently may still be accepted on
229
- * first contact — which is why no "always"/"never accept" wording appears here
230
- * and a spec pins its absence.
231
- *
232
- * Names no action and no mechanism, like every other fragment in this module:
233
- * "one more exchange" and "consulting {userName}" describe the move, and the
234
- * seat's own rules decide which token carries it (and whether the grant for it
235
- * is even live this turn).
236
- */
237
- const RESPONDER_VERIFICATION_RULE = `
238
- - THE OPENING IS ADVOCACY, NOT EVIDENCE: what reached {userName} was written by the other side's agent to make this match sound worth taking, and its account of the fit — what {userName} is looking for, why the two sides line up — is that agent's CLAIM about {userName}, not a fact you have checked. Test it against {userName}'s OWN intent and against what the counterparty's own profile and intents actually show. Restating the opening's fit claim back as your reason is agreement, not verification.
239
- - WHAT ACCEPTING SPENDS: accepting is not the free or agreeable option — it puts a connection in front of {userName} for approval and spends the same finite attention the bar above governs. "Would {userName} be open to connecting?" is a bar almost anything clears, and it is not the bar. An accept on the first exchange has to be grounded in what {userName} themselves stated they were looking for, met by evidence about the counterparty that stands up without the opening's reading of it. Where the case for fit still rests on how the other agent characterized {userName}'s needs, the cheap move is one more exchange — put the specific gap to them, or counter with what would have to be true — and where the doubt is about {userName}'s own criteria rather than the counterparty's evidence, consulting {userName} settles it instead.`;
240
- /**
241
- * `skeptic` sharpening of the responder rule, appended to the same bullet (the
242
- * same additive pattern as `SKEPTIC_CONSULT_SHARPENING`): under the
243
- * not-worth-making prior, closing on the opening alone is the exception rather
244
- * than the default. The escape hatch is restated explicitly here because this
245
- * is where the pressure is highest and an over-read would turn a lean into a
246
- * ban on first-contact accepts.
247
- */
248
- const SKEPTIC_RESPONDER_SHARPENING = ` For you an accept on the first exchange is the exception, not the default: where the fit case still rests on the opening's own characterization, probe once before accepting — one exchange costs the counterparty nothing and {userName} very little, while an accept you cannot ground spends their attention on a match no one has checked. Where {userName}'s stated criteria and the counterparty's own evidence carry the fit without that characterization, accepting straight away is still the right call.`;
249
- /**
250
- * Extra action-rule lines contributed by the stance, appended after the seat's
251
- * own rules. Empty under `advocate` → byte-identical.
252
- *
253
- * `seat` scopes the responder verification rules to the seat that did NOT
254
- * open. Everything else here is seat-blind: the value bar, the consult
255
- * propensity and the evidence-provenance rule are duties of both seats, and
256
- * the seat parameter must not become a reason to fork them.
257
- *
258
- * Order matters twice over. The seat-blind rules come first, so the initiator's
259
- * rendering stays a strict PREFIX of the responder's — the invariant the stance
260
- * spec checks by subtraction. And provenance lands immediately before the
261
- * responder rules, so "ground the accept in what {userName} themselves stated"
262
- * is already qualified by whose statements count when the responder reads it.
263
- */
264
- export function stanceActionRules(stance, seat) {
265
- if (!stanceAppliesValueBar(stance))
266
- return "";
267
- const consultRule = stance === "skeptic"
268
- ? CONSULT_PROPENSITY_RULE + SKEPTIC_CONSULT_SHARPENING
269
- : CONSULT_PROPENSITY_RULE;
270
- const responderRule = seat === "counterparty" && stanceVerifiesResponderFit(stance)
271
- ? RESPONDER_VERIFICATION_RULE + (stance === "skeptic" ? SKEPTIC_RESPONDER_SHARPENING : "")
272
- : "";
273
- return VALUE_BAR_RULE + consultRule + EVIDENCE_PROVENANCE_RULE + responderRule;
274
- }
275
- /**
276
- * `skeptic` sharpening of the pre-contact consultation rule (the turn-0 third
277
- * verdict). Appended to the base rule in `negotiation.agent.ts`, which renders
278
- * it only on an opening initiator turn that actually holds the grant — so
279
- * unlike every other fragment here this one is not seat- and version-blind,
280
- * and does not need to be: it can never reach a seat without the vocabulary.
281
- *
282
- * The base rule sets when consulting is warranted. This sets which way to lean
283
- * when it is genuinely a toss-up, and the skeptic's prior is what makes the
284
- * lean asymmetric: under "most matches are not worth making" a pass is the
285
- * cheap default, which is exactly why an unverified pass deserves the same
286
- * suspicion as an unverified acceptance. Both decide for the client.
287
- *
288
- * Names no action and no mechanism, like the rest of this module.
289
- */
290
- const SKEPTIC_PRE_CONTACT_LEAN = ` When it is genuinely close, lean toward asking rather than passing. Your prior is that most matches are not worth making — which makes passing the cheap answer, and a pass you reached by GUESSING at {userName}'s own criteria decides for them just as much as a connection you made by guessing. Nothing has been spent yet: the pause costs the counterparty nothing and costs {userName} one question.`;
291
- /**
292
- * Stance contribution to the pre-contact consultation rule. Empty under
293
- * `advocate` and `evaluator` — the base seat-level rule already states when
294
- * the verdict applies, and only the skeptic's not-worth-making prior changes
295
- * which way a close call should fall.
296
- */
297
- export function stancePreContactConsultRule(stance) {
298
- return stance === "skeptic" ? SKEPTIC_PRE_CONTACT_LEAN : "";
299
- }
300
- /**
301
- * The discovery-query satisfaction rule.
302
- *
303
- * `advocate` keeps today's mandate wording verbatim ("PROPOSE or ACCEPT the
304
- * connection…"), which converts a filter into an instruction to connect.
305
- * `evaluator`/`skeptic` make query satisfaction necessary-but-not-sufficient: a
306
- * precondition for continuing to evaluate, never itself a reason to connect.
307
- *
308
- * Names are interpolated eagerly here: this fragment is spliced into the system
309
- * prompt *after* the caller's global `{userName}` substitution has already run,
310
- * so a placeholder would survive into the rendered prompt.
311
- */
312
- export function stanceQuerySatisfiedRule(stance, otherName, userName) {
313
- if (!stanceQueryMatchIsNecessaryNotSufficient(stance)) {
314
- return `- If ${otherName} DOES satisfy the query: PROPOSE or ACCEPT the connection and evaluate fit normally using intents and profile data.`;
315
- }
316
- return `- If ${otherName} DOES satisfy the query: satisfying the query is a PRECONDITION for continuing to evaluate, NOT a reason to connect. Keep evaluating fit on intents and profile data, and decline when the connection would not be worth ${userName}'s attention.`;
317
- }