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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. package/CHANGELOG.md +1841 -0
  2. package/IMPLEMENTATION.md +140 -181
  3. package/README.md +16 -20
  4. package/STABILITY.md +16 -11
  5. package/dist/{intents/intent.module.d.ts → capabilities/intents.d.ts} +182 -192
  6. package/dist/capabilities/intents.js +88 -0
  7. package/dist/capabilities/negotiations.d.ts +17 -0
  8. package/dist/capabilities/negotiations.js +16 -0
  9. package/dist/{networks/network.module.d.ts → capabilities/networks.d.ts} +33 -169
  10. package/dist/{networks/network.module.js → capabilities/networks.js} +6 -17
  11. package/dist/index.d.ts +57 -134
  12. package/dist/index.js +41 -105
  13. package/dist/internal/agents/agent.repository.port.d.ts +59 -0
  14. package/dist/internal/agents/agent.repository.port.js +7 -0
  15. package/dist/internal/agents/agent.types.d.ts +35 -0
  16. package/dist/{agents → internal/agents}/agent.types.js +1 -6
  17. package/dist/{intents → internal/intents}/graph/intent.graph.d.ts +142 -151
  18. package/dist/{intents → internal/intents}/graph/intent.graph.execute.d.ts +5 -1
  19. package/dist/{intents → internal/intents}/graph/intent.graph.execute.js +165 -46
  20. package/dist/internal/intents/graph/intent.graph.infer.d.ts +78 -0
  21. package/dist/internal/intents/graph/intent.graph.infer.js +122 -0
  22. package/dist/internal/intents/graph/intent.graph.js +108 -0
  23. package/dist/{intents → internal/intents}/graph/intent.graph.reconcile.d.ts +18 -9
  24. package/dist/internal/intents/graph/intent.graph.reconcile.js +173 -0
  25. package/dist/internal/intents/graph/intent.graph.shared.d.ts +55 -0
  26. package/dist/{intents → internal/intents}/graph/intent.graph.shared.js +25 -70
  27. package/dist/{intents → internal/intents}/graph/intent.graph.state.d.ts +96 -32
  28. package/dist/{intents → internal/intents}/graph/intent.graph.state.js +42 -31
  29. package/dist/internal/intents/intent.admission.d.ts +16 -0
  30. package/dist/internal/intents/intent.admission.js +30 -0
  31. package/dist/{intents → internal/intents}/intent.inferrer.d.ts +1 -40
  32. package/dist/{intents → internal/intents}/intent.inferrer.js +13 -49
  33. package/dist/internal/intents/intent.preparer.d.ts +52 -0
  34. package/dist/internal/intents/intent.preparer.js +87 -0
  35. package/dist/{intents → internal/intents}/intent.verifier.d.ts +3 -36
  36. package/dist/{intents → internal/intents}/intent.verifier.js +0 -17
  37. package/dist/{networks → internal/networks}/indexer.graph.d.ts +15 -200
  38. package/dist/{networks → internal/networks}/indexer.graph.js +19 -128
  39. package/dist/{networks → internal/networks}/indexer.state.d.ts +8 -63
  40. package/dist/internal/networks/indexer.state.js +70 -0
  41. package/dist/{networks → internal/networks}/membership.graph.d.ts +6 -6
  42. package/dist/{networks → internal/networks}/membership.graph.js +3 -3
  43. package/dist/{networks → internal/networks}/membership.state.d.ts +2 -2
  44. package/dist/{networks → internal/networks}/membership.state.js +2 -2
  45. package/dist/{networks → internal/networks}/network.graph.d.ts +9 -22
  46. package/dist/{networks → internal/networks}/network.graph.js +13 -27
  47. package/dist/{networks → internal/networks}/network.recommender.d.ts +2 -2
  48. package/dist/{networks → internal/networks}/network.recommender.js +2 -2
  49. package/dist/{networks → internal/networks}/network.state.d.ts +4 -7
  50. package/dist/{networks → internal/networks}/network.state.js +4 -4
  51. package/dist/internal/opportunities/negotiation-context.loader.d.ts +26 -0
  52. package/dist/internal/opportunities/negotiation-context.loader.js +36 -0
  53. package/dist/{opportunities → internal/opportunities}/opportunity.actor.d.ts +1 -1
  54. package/dist/{opportunities → internal/opportunities}/opportunity.actor.js +7 -1
  55. package/dist/internal/opportunities/opportunity.counterparties.d.ts +17 -0
  56. package/dist/internal/opportunities/opportunity.counterparties.js +19 -0
  57. package/dist/internal/opportunities/opportunity.events.d.ts +38 -0
  58. package/dist/internal/opportunities/opportunity.events.js +94 -0
  59. package/dist/{opportunities → internal/opportunities}/opportunity.feed-selection.d.ts +3 -9
  60. package/dist/internal/opportunities/opportunity.feed-selection.js +40 -0
  61. package/dist/internal/opportunities/opportunity.graph.modes.d.ts +39 -0
  62. package/dist/internal/opportunities/opportunity.graph.modes.js +138 -0
  63. package/dist/{opportunities → internal/opportunities}/opportunity.labels.d.ts +2 -3
  64. package/dist/internal/opportunities/opportunity.labels.js +9 -0
  65. package/dist/{opportunities → internal/opportunities}/opportunity.presentation.d.ts +17 -86
  66. package/dist/{opportunities → internal/opportunities}/opportunity.presentation.js +54 -447
  67. package/dist/{opportunities → internal/opportunities}/opportunity.update-admission.d.ts +2 -2
  68. package/dist/internal/opportunities/opportunity.utils.d.ts +105 -0
  69. package/dist/internal/opportunities/opportunity.utils.js +165 -0
  70. package/dist/{opportunities → internal/opportunities}/radar/radar.graph.d.ts +17 -17
  71. package/dist/{opportunities → internal/opportunities}/radar/radar.graph.js +41 -161
  72. package/dist/{opportunities → internal/opportunities}/radar/radar.state.d.ts +4 -11
  73. package/dist/{shared → internal/shared}/agent/model-signal.d.ts +1 -1
  74. package/dist/{shared → internal/shared}/agent/model-signal.js +1 -1
  75. package/dist/{shared → internal/shared}/agent/model.config.d.ts +28 -86
  76. package/dist/{shared → internal/shared}/agent/model.config.js +58 -69
  77. package/dist/internal/shared/agent/model.resolver.d.ts +33 -0
  78. package/dist/{shared → internal/shared}/agent/model.resolver.js +18 -33
  79. package/dist/internal/shared/agent/scope.d.ts +20 -0
  80. package/dist/internal/shared/agent/scope.js +24 -0
  81. package/dist/internal/shared/assignment/network-assignment.policy.d.ts +23 -0
  82. package/dist/internal/shared/assignment/network-assignment.policy.js +28 -0
  83. package/dist/{shared → internal/shared}/observability/log.d.ts +3 -6
  84. package/dist/{shared → internal/shared}/observability/log.js +9 -18
  85. package/dist/{shared → internal/shared}/observability/protocol.logger.d.ts +1 -1
  86. package/dist/{shared → internal/shared}/observability/protocol.logger.js +1 -1
  87. package/dist/internal/shared/observability/request-context.d.ts +29 -0
  88. package/dist/internal/shared/observability/request-context.js +17 -0
  89. package/dist/{shared → internal/shared}/utils/social-label.d.ts +2 -2
  90. package/dist/{shared → internal/shared}/utils/social-label.js +1 -1
  91. package/dist/platform/database/capabilities.d.ts +59 -0
  92. package/dist/{shared/interfaces/database.entities.d.ts → platform/database/entities.d.ts} +81 -121
  93. package/dist/{shared/interfaces/database.identity-queries.d.ts → platform/database/identity-queries.d.ts} +55 -20
  94. package/dist/platform/database/member-queries.d.ts +55 -0
  95. package/dist/platform/database/member-queries.js +4 -0
  96. package/dist/platform/database/negotiation.d.ts +38 -0
  97. package/dist/{shared/interfaces/database.network-queries.d.ts → platform/database/network-queries.d.ts} +66 -67
  98. package/dist/platform/database/network-queries.js +4 -0
  99. package/dist/{shared/interfaces/database.opportunity-queries.d.ts → platform/database/opportunity-queries.d.ts} +25 -109
  100. package/dist/{shared/interfaces/database.port.d.ts → platform/database/port.d.ts} +52 -117
  101. package/dist/{shared/interfaces/database.port.js → platform/database/port.js} +3 -5
  102. package/dist/platform/database.d.ts +23 -0
  103. package/dist/{shared/interfaces/database.interface.js → platform/database.js} +1 -1
  104. package/dist/{shared/interfaces/cache.interface.d.ts → platform/discovery/cache.d.ts} +2 -4
  105. package/dist/{shared/interfaces/cache.interface.js → platform/discovery/cache.js} +1 -1
  106. package/dist/platform/discovery/embedder.d.ts +31 -0
  107. package/dist/platform/runtime/errors.d.ts +6 -0
  108. package/dist/platform/runtime/errors.js +9 -0
  109. package/dist/platform/runtime/follow-up.d.ts +36 -0
  110. package/dist/platform/runtime/follow-up.js +4 -0
  111. package/dist/platform/runtime/observability.d.ts +34 -0
  112. package/dist/protocol/core.d.ts +11 -0
  113. package/dist/protocol/discovery.rules.d.ts +21 -0
  114. package/dist/protocol/discovery.rules.js +29 -0
  115. package/dist/protocol/negotiation.constants.d.ts +3 -0
  116. package/dist/protocol/negotiation.constants.js +3 -0
  117. package/dist/protocol/negotiation.rules.d.ts +73 -0
  118. package/dist/protocol/negotiation.rules.js +68 -0
  119. package/dist/protocol/protocol.prompt.d.ts +13 -0
  120. package/dist/protocol/protocol.prompt.js +190 -0
  121. package/dist/{shared → protocol}/schemas/discovery-question.schema.d.ts +13 -13
  122. package/dist/{shared → protocol}/schemas/discovery-question.schema.js +2 -2
  123. package/dist/{shared → protocol}/schemas/identity.schema.d.ts +4 -4
  124. package/dist/{shared → protocol}/schemas/identity.schema.js +4 -4
  125. package/dist/{shared → protocol}/schemas/network-assignment.schema.d.ts +11 -20
  126. package/dist/{shared → protocol}/schemas/network-assignment.schema.js +2 -9
  127. package/dist/protocol/schemas/underspecification.schema.d.ts +9 -0
  128. package/dist/protocol/schemas/underspecification.schema.js +12 -0
  129. package/package.json +7 -15
  130. package/dist/agents/agent.dispatcher.port.d.ts +0 -25
  131. package/dist/agents/agent.module.d.ts +0 -19
  132. package/dist/agents/agent.module.js +0 -11
  133. package/dist/agents/agent.repository.port.d.ts +0 -118
  134. package/dist/agents/agent.repository.port.js +0 -10
  135. package/dist/agents/agent.tools.d.ts +0 -16
  136. package/dist/agents/agent.tools.js +0 -351
  137. package/dist/agents/agent.tools.port.d.ts +0 -22
  138. package/dist/agents/agent.tools.port.js +0 -18
  139. package/dist/agents/agent.types.d.ts +0 -76
  140. package/dist/chat/chat-streaming.types.d.ts +0 -618
  141. package/dist/chat/chat-streaming.types.js +0 -297
  142. package/dist/chat/chat.agent.d.ts +0 -292
  143. package/dist/chat/chat.agent.js +0 -1010
  144. package/dist/chat/chat.graph.d.ts +0 -424
  145. package/dist/chat/chat.graph.js +0 -257
  146. package/dist/chat/chat.interrupt.classifier.d.ts +0 -25
  147. package/dist/chat/chat.interrupt.classifier.js +0 -64
  148. package/dist/chat/chat.persona.d.ts +0 -39
  149. package/dist/chat/chat.prompt.d.ts +0 -4
  150. package/dist/chat/chat.prompt.js +0 -12
  151. package/dist/chat/chat.prompt.modules.d.ts +0 -30
  152. package/dist/chat/chat.prompt.modules.js +0 -40
  153. package/dist/chat/chat.question-dedup.d.ts +0 -14
  154. package/dist/chat/chat.question-dedup.js +0 -17
  155. package/dist/chat/chat.state.d.ts +0 -135
  156. package/dist/chat/chat.state.js +0 -120
  157. package/dist/chat/chat.streamer.d.ts +0 -64
  158. package/dist/chat/chat.streamer.js +0 -217
  159. package/dist/chat/chat.suggester.d.ts +0 -23
  160. package/dist/chat/chat.suggester.js +0 -95
  161. package/dist/chat/chat.summarizer.d.ts +0 -20
  162. package/dist/chat/chat.summarizer.js +0 -97
  163. package/dist/chat/chat.title.generator.d.ts +0 -19
  164. package/dist/chat/chat.title.generator.js +0 -66
  165. package/dist/chat/chat.tools.d.ts +0 -5
  166. package/dist/chat/chat.tools.js +0 -62
  167. package/dist/chat/chat.utils.d.ts +0 -41
  168. package/dist/chat/chat.utils.js +0 -88
  169. package/dist/chat/negotiator.persona.d.ts +0 -74
  170. package/dist/chat/negotiator.persona.js +0 -154
  171. package/dist/chat/negotiator.prompt.d.ts +0 -45
  172. package/dist/chat/negotiator.prompt.js +0 -160
  173. package/dist/chat/negotiator.tools.d.ts +0 -42
  174. package/dist/chat/negotiator.tools.js +0 -134
  175. package/dist/chat/onboarding.persona.d.ts +0 -28
  176. package/dist/chat/onboarding.persona.js +0 -86
  177. package/dist/chat/onboarding.prompt.d.ts +0 -6
  178. package/dist/chat/onboarding.prompt.js +0 -63
  179. package/dist/chat/signal.persona.d.ts +0 -47
  180. package/dist/chat/signal.persona.js +0 -319
  181. package/dist/chat/signal.prompt.d.ts +0 -39
  182. package/dist/chat/signal.prompt.js +0 -136
  183. package/dist/contacts/contact.module.d.ts +0 -8
  184. package/dist/contacts/contact.module.js +0 -6
  185. package/dist/contacts/contact.repository.port.d.ts +0 -21
  186. package/dist/contacts/contact.repository.port.js +0 -12
  187. package/dist/contacts/contact.tools.d.ts +0 -17
  188. package/dist/contacts/contact.tools.js +0 -108
  189. package/dist/contacts/contact.tools.port.d.ts +0 -20
  190. package/dist/contacts/contact.tools.port.js +0 -16
  191. package/dist/contacts/contact.types.d.ts +0 -24
  192. package/dist/contacts/contact.types.js +0 -8
  193. package/dist/contexts/context.generator.d.ts +0 -95
  194. package/dist/contexts/context.generator.js +0 -127
  195. package/dist/contexts/context.module.d.ts +0 -13
  196. package/dist/contexts/context.module.js +0 -12
  197. package/dist/contexts/context.tools.port.d.ts +0 -9
  198. package/dist/discovery/hyde.documents.d.ts +0 -9
  199. package/dist/discovery/hyde.documents.js +0 -49
  200. package/dist/discovery/hyde.env.d.ts +0 -8
  201. package/dist/discovery/hyde.env.js +0 -9
  202. package/dist/discovery/hyde.frame.d.ts +0 -150
  203. package/dist/discovery/hyde.frame.js +0 -107
  204. package/dist/discovery/hyde.generator.d.ts +0 -38
  205. package/dist/discovery/hyde.generator.js +0 -103
  206. package/dist/discovery/hyde.graph.d.ts +0 -209
  207. package/dist/discovery/hyde.graph.js +0 -482
  208. package/dist/discovery/hyde.state.d.ts +0 -70
  209. package/dist/discovery/hyde.state.js +0 -85
  210. package/dist/discovery/hyde.strategies.d.ts +0 -17
  211. package/dist/discovery/hyde.strategies.js +0 -34
  212. package/dist/discovery/hyde.validator.d.ts +0 -78
  213. package/dist/discovery/hyde.validator.js +0 -48
  214. package/dist/discovery/index.d.ts +0 -26
  215. package/dist/discovery/index.js +0 -19
  216. package/dist/discovery/lens.inferrer.d.ts +0 -214
  217. package/dist/discovery/lens.inferrer.js +0 -152
  218. package/dist/enrichment/enrichment.generator.d.ts +0 -68
  219. package/dist/enrichment/enrichment.generator.js +0 -95
  220. package/dist/enrichment/enrichment.graph.d.ts +0 -544
  221. package/dist/enrichment/enrichment.graph.js +0 -695
  222. package/dist/enrichment/enrichment.state.d.ts +0 -141
  223. package/dist/enrichment/enrichment.state.js +0 -115
  224. package/dist/enrichment/enrichment.tools.context-read.d.ts +0 -10
  225. package/dist/enrichment/enrichment.tools.context-read.js +0 -353
  226. package/dist/enrichment/enrichment.tools.context-write.d.ts +0 -9
  227. package/dist/enrichment/enrichment.tools.context-write.js +0 -417
  228. package/dist/enrichment/enrichment.tools.d.ts +0 -13
  229. package/dist/enrichment/enrichment.tools.helpers.d.ts +0 -139
  230. package/dist/enrichment/enrichment.tools.helpers.js +0 -234
  231. package/dist/enrichment/enrichment.tools.js +0 -153
  232. package/dist/intents/graph/intent.graph.infer.d.ts +0 -44
  233. package/dist/intents/graph/intent.graph.infer.js +0 -97
  234. package/dist/intents/graph/intent.graph.js +0 -134
  235. package/dist/intents/graph/intent.graph.reconcile.js +0 -274
  236. package/dist/intents/graph/intent.graph.shared.d.ts +0 -68
  237. package/dist/intents/intake/intake.orchestrator.d.ts +0 -203
  238. package/dist/intents/intake/intake.orchestrator.js +0 -255
  239. package/dist/intents/intake/intake.pack.generator.d.ts +0 -57
  240. package/dist/intents/intake/intake.pack.generator.js +0 -90
  241. package/dist/intents/intent.clarifier.d.ts +0 -51
  242. package/dist/intents/intent.clarifier.js +0 -201
  243. package/dist/intents/intent.indexer.d.ts +0 -82
  244. package/dist/intents/intent.indexer.js +0 -170
  245. package/dist/intents/intent.module.js +0 -103
  246. package/dist/intents/intent.proposal.d.ts +0 -37
  247. package/dist/intents/intent.proposal.js +0 -14
  248. package/dist/intents/intent.reconciler.d.ts +0 -105
  249. package/dist/intents/intent.reconciler.js +0 -186
  250. package/dist/intents/intent.tools.d.ts +0 -27
  251. package/dist/intents/intent.tools.js +0 -808
  252. package/dist/maintenance/maintenance.graph.d.ts +0 -239
  253. package/dist/maintenance/maintenance.graph.js +0 -199
  254. package/dist/maintenance/maintenance.state.d.ts +0 -35
  255. package/dist/maintenance/maintenance.state.js +0 -55
  256. package/dist/mcp/elicitation.builder.d.ts +0 -53
  257. package/dist/mcp/elicitation.builder.js +0 -74
  258. package/dist/mcp/elicitation.dispatcher.d.ts +0 -36
  259. package/dist/mcp/elicitation.dispatcher.js +0 -86
  260. package/dist/mcp/mcp.authorization-policy.d.ts +0 -252
  261. package/dist/mcp/mcp.authorization-policy.js +0 -535
  262. package/dist/mcp/mcp.server.d.ts +0 -90
  263. package/dist/mcp/mcp.server.js +0 -631
  264. package/dist/negotiations/insight.generator.d.ts +0 -31
  265. package/dist/negotiations/insight.generator.js +0 -105
  266. package/dist/negotiations/negotiation.agent.d.ts +0 -130
  267. package/dist/negotiations/negotiation.agent.js +0 -396
  268. package/dist/negotiations/negotiation.answer-consumption.d.ts +0 -223
  269. package/dist/negotiations/negotiation.answer-consumption.js +0 -275
  270. package/dist/negotiations/negotiation.attribution.d.ts +0 -91
  271. package/dist/negotiations/negotiation.attribution.js +0 -109
  272. package/dist/negotiations/negotiation.candidates.d.ts +0 -83
  273. package/dist/negotiations/negotiation.candidates.js +0 -162
  274. package/dist/negotiations/negotiation.client-dm.d.ts +0 -50
  275. package/dist/negotiations/negotiation.client-dm.js +0 -66
  276. package/dist/negotiations/negotiation.consultation-policy.d.ts +0 -95
  277. package/dist/negotiations/negotiation.consultation-policy.js +0 -159
  278. package/dist/negotiations/negotiation.deadlock.contracts.d.ts +0 -10
  279. package/dist/negotiations/negotiation.deadlock.d.ts +0 -87
  280. package/dist/negotiations/negotiation.deadlock.js +0 -150
  281. package/dist/negotiations/negotiation.detail-reader.d.ts +0 -94
  282. package/dist/negotiations/negotiation.detail-reader.js +0 -91
  283. package/dist/negotiations/negotiation.expected-speaker.d.ts +0 -33
  284. package/dist/negotiations/negotiation.expected-speaker.js +0 -59
  285. package/dist/negotiations/negotiation.graph.d.ts +0 -694
  286. package/dist/negotiations/negotiation.graph.finalize.d.ts +0 -5
  287. package/dist/negotiations/negotiation.graph.finalize.js +0 -403
  288. package/dist/negotiations/negotiation.graph.init.d.ts +0 -54
  289. package/dist/negotiations/negotiation.graph.init.js +0 -256
  290. package/dist/negotiations/negotiation.graph.js +0 -94
  291. package/dist/negotiations/negotiation.graph.screen.d.ts +0 -23
  292. package/dist/negotiations/negotiation.graph.screen.js +0 -108
  293. package/dist/negotiations/negotiation.graph.shared.d.ts +0 -111
  294. package/dist/negotiations/negotiation.graph.shared.js +0 -168
  295. package/dist/negotiations/negotiation.graph.turn.d.ts +0 -134
  296. package/dist/negotiations/negotiation.graph.turn.js +0 -662
  297. package/dist/negotiations/negotiation.hermes-contract.d.ts +0 -31
  298. package/dist/negotiations/negotiation.hermes-contract.js +0 -72
  299. package/dist/negotiations/negotiation.intent-snapshot-provenance.d.ts +0 -21
  300. package/dist/negotiations/negotiation.intent-snapshot-provenance.js +0 -28
  301. package/dist/negotiations/negotiation.lifecycle-narration.d.ts +0 -18
  302. package/dist/negotiations/negotiation.lifecycle-narration.js +0 -87
  303. package/dist/negotiations/negotiation.memory.d.ts +0 -65
  304. package/dist/negotiations/negotiation.memory.js +0 -83
  305. package/dist/negotiations/negotiation.module.d.ts +0 -36
  306. package/dist/negotiations/negotiation.module.js +0 -23
  307. package/dist/negotiations/negotiation.protocol.d.ts +0 -1018
  308. package/dist/negotiations/negotiation.protocol.js +0 -224
  309. package/dist/negotiations/negotiation.question-safety.d.ts +0 -52
  310. package/dist/negotiations/negotiation.question-safety.js +0 -119
  311. package/dist/negotiations/negotiation.reflect.d.ts +0 -194
  312. package/dist/negotiations/negotiation.reflect.js +0 -145
  313. package/dist/negotiations/negotiation.scope.d.ts +0 -41
  314. package/dist/negotiations/negotiation.scope.js +0 -39
  315. package/dist/negotiations/negotiation.screen.contracts.d.ts +0 -88
  316. package/dist/negotiations/negotiation.screen.contracts.js +0 -58
  317. package/dist/negotiations/negotiation.screen.d.ts +0 -78
  318. package/dist/negotiations/negotiation.screen.js +0 -112
  319. package/dist/negotiations/negotiation.stall-gap.d.ts +0 -83
  320. package/dist/negotiations/negotiation.stall-gap.js +0 -152
  321. package/dist/negotiations/negotiation.stance.contracts.d.ts +0 -123
  322. package/dist/negotiations/negotiation.stance.contracts.js +0 -317
  323. package/dist/negotiations/negotiation.state.d.ts +0 -597
  324. package/dist/negotiations/negotiation.state.js +0 -286
  325. package/dist/negotiations/negotiation.summarizer.d.ts +0 -25
  326. package/dist/negotiations/negotiation.summarizer.js +0 -101
  327. package/dist/negotiations/negotiation.task-lock-policy.d.ts +0 -10
  328. package/dist/negotiations/negotiation.task-lock-policy.js +0 -22
  329. package/dist/negotiations/negotiation.tools.d.ts +0 -18
  330. package/dist/negotiations/negotiation.tools.js +0 -842
  331. package/dist/negotiations/negotiation.tools.port.d.ts +0 -17
  332. package/dist/negotiations/negotiation.turn-cap.d.ts +0 -9
  333. package/dist/negotiations/negotiation.turn-cap.js +0 -12
  334. package/dist/networks/indexer.state.js +0 -112
  335. package/dist/networks/network.tools.d.ts +0 -36
  336. package/dist/networks/network.tools.js +0 -594
  337. package/dist/opportunities/delivery-card.cache.d.ts +0 -25
  338. package/dist/opportunities/delivery-card.cache.js +0 -43
  339. package/dist/opportunities/discovery.env.d.ts +0 -20
  340. package/dist/opportunities/discovery.env.js +0 -109
  341. package/dist/opportunities/discriminator/discriminator.adjustments.d.ts +0 -90
  342. package/dist/opportunities/discriminator/discriminator.adjustments.js +0 -141
  343. package/dist/opportunities/discriminator/discriminator.assigner.d.ts +0 -78
  344. package/dist/opportunities/discriminator/discriminator.assigner.js +0 -153
  345. package/dist/opportunities/discriminator/discriminator.env.d.ts +0 -103
  346. package/dist/opportunities/discriminator/discriminator.env.js +0 -103
  347. package/dist/opportunities/discriminator/discriminator.miner.d.ts +0 -114
  348. package/dist/opportunities/discriminator/discriminator.miner.js +0 -228
  349. package/dist/opportunities/discriminator/discriminator.push.d.ts +0 -13
  350. package/dist/opportunities/discriminator/discriminator.push.js +0 -19
  351. package/dist/opportunities/discriminator/discriminator.question.d.ts +0 -58
  352. package/dist/opportunities/discriminator/discriminator.question.js +0 -155
  353. package/dist/opportunities/discriminator/discriminator.scorer.d.ts +0 -32
  354. package/dist/opportunities/discriminator/discriminator.scorer.js +0 -105
  355. package/dist/opportunities/discriminator/discriminator.shadow.d.ts +0 -32
  356. package/dist/opportunities/discriminator/discriminator.shadow.js +0 -90
  357. package/dist/opportunities/discriminator/discriminator.types.d.ts +0 -93
  358. package/dist/opportunities/discriminator/discriminator.types.js +0 -18
  359. package/dist/opportunities/negotiation-context.loader.d.ts +0 -59
  360. package/dist/opportunities/negotiation-context.loader.js +0 -90
  361. package/dist/opportunities/negotiation-evidence/negotiation-evidence.env.d.ts +0 -43
  362. package/dist/opportunities/negotiation-evidence/negotiation-evidence.env.js +0 -44
  363. package/dist/opportunities/negotiation-evidence/negotiation-evidence.extractor.d.ts +0 -24
  364. package/dist/opportunities/negotiation-evidence/negotiation-evidence.extractor.js +0 -188
  365. package/dist/opportunities/negotiation-evidence/negotiation-evidence.miner.d.ts +0 -26
  366. package/dist/opportunities/negotiation-evidence/negotiation-evidence.miner.js +0 -112
  367. package/dist/opportunities/negotiation-evidence/negotiation-evidence.shadow.d.ts +0 -19
  368. package/dist/opportunities/negotiation-evidence/negotiation-evidence.shadow.js +0 -61
  369. package/dist/opportunities/negotiation-evidence/negotiation-evidence.types.d.ts +0 -191
  370. package/dist/opportunities/negotiation-evidence/negotiation-evidence.types.js +0 -18
  371. package/dist/opportunities/negotiation-evidence/negotiation-evidence.verifier.d.ts +0 -34
  372. package/dist/opportunities/negotiation-evidence/negotiation-evidence.verifier.js +0 -91
  373. package/dist/opportunities/negotiation-summary.builder.d.ts +0 -37
  374. package/dist/opportunities/negotiation-summary.builder.js +0 -66
  375. package/dist/opportunities/opportunity.discovery-negotiation-summary.d.ts +0 -14
  376. package/dist/opportunities/opportunity.discovery-negotiation-summary.js +0 -46
  377. package/dist/opportunities/opportunity.enricher.d.ts +0 -71
  378. package/dist/opportunities/opportunity.enricher.js +0 -280
  379. package/dist/opportunities/opportunity.evaluator.d.ts +0 -289
  380. package/dist/opportunities/opportunity.evaluator.js +0 -516
  381. package/dist/opportunities/opportunity.evidence.d.ts +0 -22
  382. package/dist/opportunities/opportunity.evidence.js +0 -87
  383. package/dist/opportunities/opportunity.existing-negotiation.d.ts +0 -79
  384. package/dist/opportunities/opportunity.existing-negotiation.js +0 -118
  385. package/dist/opportunities/opportunity.feed-selection.js +0 -96
  386. package/dist/opportunities/opportunity.graph.d.ts +0 -1611
  387. package/dist/opportunities/opportunity.graph.discovery-strategies.d.ts +0 -109
  388. package/dist/opportunities/opportunity.graph.discovery-strategies.js +0 -451
  389. package/dist/opportunities/opportunity.graph.discovery.d.ts +0 -69
  390. package/dist/opportunities/opportunity.graph.discovery.js +0 -397
  391. package/dist/opportunities/opportunity.graph.evaluation.d.ts +0 -82
  392. package/dist/opportunities/opportunity.graph.evaluation.js +0 -608
  393. package/dist/opportunities/opportunity.graph.js +0 -193
  394. package/dist/opportunities/opportunity.graph.modes.d.ts +0 -538
  395. package/dist/opportunities/opportunity.graph.modes.js +0 -538
  396. package/dist/opportunities/opportunity.graph.negotiate.d.ts +0 -109
  397. package/dist/opportunities/opportunity.graph.negotiate.js +0 -392
  398. package/dist/opportunities/opportunity.graph.persist-node.d.ts +0 -93
  399. package/dist/opportunities/opportunity.graph.persist-node.js +0 -765
  400. package/dist/opportunities/opportunity.graph.prep.d.ts +0 -150
  401. package/dist/opportunities/opportunity.graph.prep.js +0 -381
  402. package/dist/opportunities/opportunity.graph.shared.d.ts +0 -173
  403. package/dist/opportunities/opportunity.graph.shared.js +0 -199
  404. package/dist/opportunities/opportunity.introducer-feature.d.ts +0 -2
  405. package/dist/opportunities/opportunity.introducer-feature.js +0 -4
  406. package/dist/opportunities/opportunity.introducer.d.ts +0 -77
  407. package/dist/opportunities/opportunity.introducer.js +0 -99
  408. package/dist/opportunities/opportunity.labels.js +0 -10
  409. package/dist/opportunities/opportunity.lifecycle.d.ts +0 -63
  410. package/dist/opportunities/opportunity.lifecycle.js +0 -181
  411. package/dist/opportunities/opportunity.module.d.ts +0 -54
  412. package/dist/opportunities/opportunity.module.js +0 -39
  413. package/dist/opportunities/opportunity.newborn-stamping.d.ts +0 -41
  414. package/dist/opportunities/opportunity.newborn-stamping.js +0 -81
  415. package/dist/opportunities/opportunity.owner-approval.d.ts +0 -118
  416. package/dist/opportunities/opportunity.owner-approval.js +0 -34
  417. package/dist/opportunities/opportunity.owner-provenance.d.ts +0 -6
  418. package/dist/opportunities/opportunity.owner-provenance.js +0 -28
  419. package/dist/opportunities/opportunity.persist.d.ts +0 -58
  420. package/dist/opportunities/opportunity.persist.js +0 -145
  421. package/dist/opportunities/opportunity.persistence-admission.d.ts +0 -39
  422. package/dist/opportunities/opportunity.persistence-admission.js +0 -59
  423. package/dist/opportunities/opportunity.state.d.ts +0 -451
  424. package/dist/opportunities/opportunity.state.js +0 -256
  425. package/dist/opportunities/opportunity.tools.cards.d.ts +0 -138
  426. package/dist/opportunities/opportunity.tools.cards.js +0 -212
  427. package/dist/opportunities/opportunity.tools.d.ts +0 -12
  428. package/dist/opportunities/opportunity.tools.js +0 -236
  429. package/dist/opportunities/opportunity.tools.list.d.ts +0 -10
  430. package/dist/opportunities/opportunity.tools.list.js +0 -489
  431. package/dist/opportunities/opportunity.tools.port.d.ts +0 -16
  432. package/dist/opportunities/opportunity.utils.d.ts +0 -217
  433. package/dist/opportunities/opportunity.utils.js +0 -395
  434. package/dist/opportunities/outcome/outcome.env.d.ts +0 -60
  435. package/dist/opportunities/outcome/outcome.env.js +0 -63
  436. package/dist/opportunities/outcome/outcome.hypotheses.d.ts +0 -29
  437. package/dist/opportunities/outcome/outcome.hypotheses.js +0 -117
  438. package/dist/opportunities/outcome/outcome.shadow.d.ts +0 -56
  439. package/dist/opportunities/outcome/outcome.shadow.js +0 -87
  440. package/dist/opportunities/outcome/outcome.types.d.ts +0 -110
  441. package/dist/opportunities/outcome/outcome.types.js +0 -26
  442. package/dist/opportunities/radar/radar.health.d.ts +0 -31
  443. package/dist/opportunities/radar/radar.health.js +0 -75
  444. package/dist/premises/premise.analyzer.d.ts +0 -35
  445. package/dist/premises/premise.analyzer.js +0 -115
  446. package/dist/premises/premise.decomposer.d.ts +0 -69
  447. package/dist/premises/premise.decomposer.js +0 -213
  448. package/dist/premises/premise.graph.d.ts +0 -345
  449. package/dist/premises/premise.graph.js +0 -278
  450. package/dist/premises/premise.indexer.d.ts +0 -35
  451. package/dist/premises/premise.indexer.js +0 -86
  452. package/dist/premises/premise.state.d.ts +0 -67
  453. package/dist/premises/premise.state.js +0 -94
  454. package/dist/premises/premise.tools.d.ts +0 -3
  455. package/dist/premises/premise.tools.js +0 -248
  456. package/dist/questions/question.env.d.ts +0 -27
  457. package/dist/questions/question.env.js +0 -27
  458. package/dist/questions/question.input.d.ts +0 -107
  459. package/dist/questions/question.module.d.ts +0 -30
  460. package/dist/questions/question.module.js +0 -28
  461. package/dist/questions/question.schema.d.ts +0 -1529
  462. package/dist/questions/question.schema.js +0 -420
  463. package/dist/shared/agent/activity-projection.d.ts +0 -271
  464. package/dist/shared/agent/activity-projection.js +0 -254
  465. package/dist/shared/agent/canonical-guidance.d.ts +0 -30
  466. package/dist/shared/agent/canonical-guidance.js +0 -246
  467. package/dist/shared/agent/model.resolver.d.ts +0 -48
  468. package/dist/shared/agent/tool.factory.d.ts +0 -17
  469. package/dist/shared/agent/tool.factory.js +0 -221
  470. package/dist/shared/agent/tool.helpers.d.ts +0 -482
  471. package/dist/shared/agent/tool.helpers.js +0 -232
  472. package/dist/shared/agent/tool.registry.d.ts +0 -25
  473. package/dist/shared/agent/tool.registry.js +0 -76
  474. package/dist/shared/agent/tool.runtime.d.ts +0 -28
  475. package/dist/shared/agent/tool.runtime.js +0 -194
  476. package/dist/shared/agent/tool.scope.d.ts +0 -44
  477. package/dist/shared/agent/tool.scope.js +0 -50
  478. package/dist/shared/agent/utility.tools.d.ts +0 -15
  479. package/dist/shared/agent/utility.tools.js +0 -322
  480. package/dist/shared/assignment/network-assignment.policy.d.ts +0 -61
  481. package/dist/shared/assignment/network-assignment.policy.js +0 -105
  482. package/dist/shared/interfaces/agent-dispatcher.interface.d.ts +0 -100
  483. package/dist/shared/interfaces/agent-dispatcher.interface.js +0 -12
  484. package/dist/shared/interfaces/auth.interface.d.ts +0 -37
  485. package/dist/shared/interfaces/auth.interface.js +0 -1
  486. package/dist/shared/interfaces/chat-message-writer.interface.d.ts +0 -18
  487. package/dist/shared/interfaces/chat-message-writer.interface.js +0 -1
  488. package/dist/shared/interfaces/chat-session.interface.d.ts +0 -23
  489. package/dist/shared/interfaces/chat-session.interface.js +0 -18
  490. package/dist/shared/interfaces/chat-summary.interface.d.ts +0 -16
  491. package/dist/shared/interfaces/chat-summary.interface.js +0 -1
  492. package/dist/shared/interfaces/database.capabilities.d.ts +0 -100
  493. package/dist/shared/interfaces/database.interface.d.ts +0 -16
  494. package/dist/shared/interfaces/database.member-queries.d.ts +0 -219
  495. package/dist/shared/interfaces/database.member-queries.js +0 -4
  496. package/dist/shared/interfaces/database.negotiation.d.ts +0 -329
  497. package/dist/shared/interfaces/database.negotiation.js +0 -26
  498. package/dist/shared/interfaces/database.network-queries.js +0 -4
  499. package/dist/shared/interfaces/database.opportunity-queries.js +0 -4
  500. package/dist/shared/interfaces/delivery-ledger.interface.d.ts +0 -40
  501. package/dist/shared/interfaces/delivery-ledger.interface.js +0 -5
  502. package/dist/shared/interfaces/embedder.interface.d.ts +0 -92
  503. package/dist/shared/interfaces/embedder.interface.js +0 -4
  504. package/dist/shared/interfaces/enrichment-run.interface.d.ts +0 -62
  505. package/dist/shared/interfaces/enrichment-run.interface.js +0 -1
  506. package/dist/shared/interfaces/enrichment.interface.js +0 -1
  507. package/dist/shared/interfaces/negotiation-events.interface.d.ts +0 -77
  508. package/dist/shared/interfaces/negotiation-events.interface.js +0 -6
  509. package/dist/shared/interfaces/negotiation-summary.interface.d.ts +0 -25
  510. package/dist/shared/interfaces/negotiation-summary.interface.js +0 -1
  511. package/dist/shared/interfaces/negotiator-memory.interface.d.ts +0 -58
  512. package/dist/shared/interfaces/negotiator-memory.interface.js +0 -11
  513. package/dist/shared/interfaces/queue.interface.d.ts +0 -23
  514. package/dist/shared/interfaces/queue.interface.js +0 -4
  515. package/dist/shared/interfaces/scraper.interface.js +0 -1
  516. package/dist/shared/interfaces/tool-request-context.interface.d.ts +0 -11
  517. package/dist/shared/interfaces/tool-request-context.interface.js +0 -1
  518. package/dist/shared/observability/request-context.d.ts +0 -27
  519. package/dist/shared/observability/request-context.js +0 -6
  520. package/dist/shared/schemas/mcp-auth.schema.d.ts +0 -87
  521. package/dist/shared/schemas/mcp-auth.schema.js +0 -56
  522. package/dist/shared/schemas/negotiation-digest.schema.d.ts +0 -58
  523. package/dist/shared/schemas/negotiation-digest.schema.js +0 -38
  524. package/dist/shared/schemas/negotiation-state.schema.d.ts +0 -343
  525. package/dist/shared/schemas/negotiation-state.schema.js +0 -81
  526. package/dist/shared/schemas/question-block.fixture.d.ts +0 -12
  527. package/dist/shared/schemas/question-block.fixture.js +0 -39
  528. package/dist/shared/schemas/question-block.schema.d.ts +0 -111
  529. package/dist/shared/schemas/question-block.schema.js +0 -124
  530. package/dist/shared/schemas/structured-question.schema.d.ts +0 -66
  531. package/dist/shared/schemas/structured-question.schema.js +0 -31
  532. package/dist/shared/schemas/underspecification.schema.d.ts +0 -13
  533. package/dist/shared/schemas/underspecification.schema.js +0 -16
  534. /package/dist/{opportunities → internal/opportunities}/opportunity.update-admission.js +0 -0
  535. /package/dist/{opportunities → internal/opportunities}/radar/radar.state.js +0 -0
  536. /package/dist/{shared → internal/shared}/network/metadata.renderer.d.ts +0 -0
  537. /package/dist/{shared → internal/shared}/network/metadata.renderer.js +0 -0
  538. /package/dist/{shared → internal/shared}/observability/debug-meta.sanitizer.d.ts +0 -0
  539. /package/dist/{shared → internal/shared}/observability/debug-meta.sanitizer.js +0 -0
  540. /package/dist/{shared → internal/shared}/observability/performance.d.ts +0 -0
  541. /package/dist/{shared → internal/shared}/observability/performance.js +0 -0
  542. /package/dist/{shared → internal/shared}/observability/trace.d.ts +0 -0
  543. /package/dist/{shared → internal/shared}/observability/trace.js +0 -0
  544. /package/dist/{shared → internal/shared}/utils/claim-safety.d.ts +0 -0
  545. /package/dist/{shared → internal/shared}/utils/claim-safety.js +0 -0
  546. /package/dist/{shared → internal/shared}/utils/telegram-handle.d.ts +0 -0
  547. /package/dist/{shared → internal/shared}/utils/telegram-handle.js +0 -0
  548. /package/dist/{shared/interfaces/database.capabilities.js → platform/database/capabilities.js} +0 -0
  549. /package/dist/{shared/interfaces/database.entities.js → platform/database/entities.js} +0 -0
  550. /package/dist/{shared/interfaces/database.identity-queries.js → platform/database/identity-queries.js} +0 -0
  551. /package/dist/{agents/agent.dispatcher.port.js → platform/database/negotiation.js} +0 -0
  552. /package/dist/{chat/chat.persona.js → platform/database/opportunity-queries.js} +0 -0
  553. /package/dist/{contexts/context.tools.port.js → platform/discovery/embedder.js} +0 -0
  554. /package/dist/{shared/interfaces/scraper.interface.d.ts → platform/discovery/scraper.d.ts} +0 -0
  555. /package/dist/{negotiations/negotiation.deadlock.contracts.js → platform/discovery/scraper.js} +0 -0
  556. /package/dist/{shared/interfaces/enrichment.interface.d.ts → platform/enrichment/ports.d.ts} +0 -0
  557. /package/dist/{negotiations/negotiation.tools.port.js → platform/enrichment/ports.js} +0 -0
  558. /package/dist/{opportunities/opportunity.tools.port.js → platform/runtime/observability.js} +0 -0
  559. /package/dist/{questions/question.input.js → protocol/core.js} +0 -0
  560. /package/dist/{shared → protocol}/schemas/chat-context.schema.d.ts +0 -0
  561. /package/dist/{shared → protocol}/schemas/chat-context.schema.js +0 -0
@@ -1,695 +0,0 @@
1
- import { StateGraph, START, END } from "@langchain/langgraph";
2
- import { EnrichmentGraphState } from "./enrichment.state.js";
3
- import { socialsToEnrichmentRequest } from "../shared/utils/social-label.js";
4
- import { protocolLogger } from "../shared/observability/protocol.logger.js";
5
- import { timed } from "../shared/observability/performance.js";
6
- import { requestContext } from "../shared/observability/request-context.js";
7
- import { PremiseDecomposer } from "../premises/premise.decomposer.js";
8
- import { invokeWithAbortSignal } from "../shared/agent/model-signal.js";
9
- const logger = protocolLogger("EnrichmentGraphFactory");
10
- /** Minimum length for input to be considered meaningful (e.g. not just "Yes") */
11
- const MIN_MEANINGFUL_INPUT_LENGTH = 20;
12
- /** Phrases that are confirmations only and must not be used as profile content */
13
- const CONFIRMATION_PHRASES = new Set([
14
- "yes", "yeah", "yep", "sure", "ok", "okay", "go ahead", "do it", "please",
15
- "correct", "right", "exactly", "absolutely", "of course", "sounds good",
16
- "create one", "create it", "set one up", "set it up", "create my profile",
17
- "create profile", "set up profile", "create a profile"
18
- ]);
19
- /**
20
- * Returns true only if the input contains real profile information.
21
- * Confirmation-only replies (e.g. "Yes" to "Would you like to create a profile?")
22
- * must not be treated as input so we ask for user info / use scraper instead of inventing a profile.
23
- */
24
- function isMeaningfulProfileInput(input) {
25
- if (!input || typeof input !== "string")
26
- return false;
27
- const trimmed = input.trim();
28
- if (trimmed.length < MIN_MEANINGFUL_INPUT_LENGTH)
29
- return false;
30
- const lower = trimmed.toLowerCase();
31
- if (CONFIRMATION_PHRASES.has(lower))
32
- return false;
33
- if (CONFIRMATION_PHRASES.has(lower.replace(/[.!?]+$/, "")))
34
- return false;
35
- return true;
36
- }
37
- export class EnrichmentGraphFactory {
38
- constructor(database, scraper, enricher, premiseGraph) {
39
- this.deps = { database, scraper, enricher, premiseGraph, premiseDecomposer: new PremiseDecomposer() };
40
- }
41
- createGraph() {
42
- const deps = this.deps;
43
- // ─────────────────────────────────────────────────────────
44
- // GRAPH ASSEMBLY
45
- // Conditional flow based on operation mode and detected needs
46
- // ─────────────────────────────────────────────────────────
47
- const workflow = new StateGraph(EnrichmentGraphState)
48
- // Add all nodes
49
- .addNode("check_state", (state) => checkStateNode(state, deps))
50
- .addNode("scrape", (state) => scrapeNode(state, deps))
51
- .addNode("decompose_premises", (state) => decomposePremisesNode(state, deps))
52
- .addNode("auto_generate", (state) => autoGenerateNode(state, deps))
53
- // Start with state check
54
- .addEdge(START, "check_state")
55
- // Conditional routing from check_state
56
- .addConditionalEdges("check_state", (state) => checkStateCondition(state, deps), {
57
- auto_generate: "auto_generate", // Generate mode -> Chat API enrichment
58
- decompose_premises: "decompose_premises", // Write mode + input + premise graph -> decompose
59
- scrape: "scrape", // Need premises, no input -> scrape first
60
- [END]: END // Query mode, no premise graph, or everything exists
61
- })
62
- // Decompose premises creates premises as a side effect, then ends.
63
- // user_context regeneration is handled downstream by premise lifecycle events.
64
- .addEdge("decompose_premises", END)
65
- // Auto-generate routes to premise decomposition (when premise graph
66
- // available + enrichment produced input), otherwise ends.
67
- .addConditionalEdges("auto_generate", (state) => {
68
- if (state.input && deps.premiseGraph) {
69
- logger.verbose("Enrichment produced input — routing to premise decomposition");
70
- return "decompose_premises";
71
- }
72
- logger.verbose("Enrichment ended without usable input (ghost soft-deleted, error, or no premise graph) — done");
73
- return END;
74
- }, {
75
- decompose_premises: "decompose_premises",
76
- [END]: END,
77
- })
78
- // Scrape -> decompose_premises (when premise graph available), else ends.
79
- .addConditionalEdges("scrape", (_state) => {
80
- if (deps.premiseGraph)
81
- return "decompose_premises";
82
- return END;
83
- }, {
84
- decompose_premises: "decompose_premises",
85
- [END]: END,
86
- });
87
- logger.verbose("Graph built successfully");
88
- return workflow.compile();
89
- }
90
- }
91
- // ─────────────────────────────────────────────────────────
92
- // NODE: Check State
93
- // Loads existing profile from DB and detects what needs generation:
94
- // - Profile missing
95
- // - User information insufficient for scraping
96
- // ─────────────────────────────────────────────────────────
97
- export async function checkStateNode(state, deps) {
98
- return timed("ProfileGraph.checkState", async () => {
99
- if (!state.userId) {
100
- logger.error("Missing userId");
101
- return {
102
- error: "userId is required"
103
- };
104
- }
105
- logger.verbose("Checking profile state...", {
106
- userId: state.userId,
107
- operationMode: state.operationMode,
108
- forceUpdate: state.forceUpdate
109
- });
110
- try {
111
- const profile = await deps.database.getProfile(state.userId);
112
- // "Has a profile" now means the user has been enriched into ACTIVE premises
113
- // (the user_profiles replacement). `getProfile` returns a users-sourced row
114
- // for every existing user, so its presence no longer signals enrichment --
115
- // the premise graph is the source of truth for whether generation has run.
116
- const hasBeenEnriched = (await deps.database.getPremisesForUser(state.userId, 'ACTIVE')).length > 0;
117
- // Query mode: Just return the profile (fast path)
118
- if (state.operationMode === 'query') {
119
- logger.verbose("🚀 Query mode - returning existing profile (fast path)", {
120
- hasProfile: hasBeenEnriched
121
- });
122
- const profileWithId = hasBeenEnriched ? await deps.database.getProfileByUserId(state.userId) : null;
123
- return {
124
- profile: hasBeenEnriched ? (profile || undefined) : undefined,
125
- readResult: hasBeenEnriched
126
- ? {
127
- hasProfile: true,
128
- // Thin identity only. The structured skills/interests attributes are
129
- // retired (user_profiles removal, WS6); the rich identity text now
130
- // comes from the global user_context, injected by read_user_contexts.
131
- profile: {
132
- id: profileWithId?.id,
133
- name: profile?.identity?.name,
134
- bio: profile?.identity?.bio,
135
- location: profile?.identity?.location,
136
- },
137
- }
138
- : {
139
- hasProfile: false,
140
- message: "You don't have a profile yet. Would you like to create one? You can share your LinkedIn, GitHub, or X/Twitter profile, or just tell me about yourself.",
141
- },
142
- };
143
- }
144
- // Write mode: Detect what needs generation
145
- // Treat confirmation-only input (e.g. "Yes") as no input so we ask for info / use scraper
146
- const hasMeaningfulInput = !!state.input && isMeaningfulProfileInput(state.input);
147
- const needsProfileGeneration = !hasBeenEnriched || (state.forceUpdate && hasMeaningfulInput);
148
- // Check if we need to scrape (profile generation needed but no meaningful input provided)
149
- const willNeedScraping = needsProfileGeneration && !hasMeaningfulInput;
150
- // If we need to scrape, check if we have sufficient user information
151
- let needsUserInfo = false;
152
- const missingUserInfo = [];
153
- if (willNeedScraping) {
154
- logger.verbose("Will need scraping - checking user information...");
155
- const user = await deps.database.getUser(state.userId);
156
- if (!user) {
157
- logger.error("User not found", { userId: state.userId });
158
- return {
159
- error: `User not found: ${state.userId}`
160
- };
161
- }
162
- // Check what information we have from the user table (schema: users)
163
- // Required fields: email, name (always present)
164
- // Optional fields: intro, avatar, location, socials
165
- const socials = await deps.database.getUserSocials(state.userId);
166
- const hasSocials = socials.length > 0;
167
- // Check if name is a full name (not just email username)
168
- // For scraping to work well, we need first + last name
169
- const hasMeaningfulName = user.name &&
170
- user.name.trim() !== '' &&
171
- !user.name.includes('@') &&
172
- user.name.split(/\s+/).filter(Boolean).length >= 2;
173
- const hasLocation = !!(user.location && user.location.trim() !== '');
174
- // Minimum requirement for accurate scraping:
175
- // - At least ONE social link (preferred - most reliable for finding the right person)
176
- // - OR a full name (first + last) - less reliable but workable
177
- // Location helps disambiguate but is not required
178
- const hasMinimumInfo = hasSocials || hasMeaningfulName;
179
- if (!hasMinimumInfo) {
180
- needsUserInfo = true;
181
- // Build precise list of what's missing and would help
182
- if (!hasSocials) {
183
- missingUserInfo.push('social_urls');
184
- }
185
- if (!hasMeaningfulName) {
186
- missingUserInfo.push('full_name');
187
- }
188
- if (!hasLocation) {
189
- missingUserInfo.push('location'); // Nice to have
190
- }
191
- logger.verbose("⚠️ Insufficient user information for scraping", {
192
- hasSocials,
193
- hasMeaningfulName,
194
- hasLocation,
195
- currentName: user.name,
196
- missingUserInfo
197
- });
198
- }
199
- else {
200
- logger.verbose("✅ Sufficient user information for scraping", {
201
- hasSocials,
202
- hasMeaningfulName,
203
- hasLocation,
204
- willProceedWith: hasSocials ? 'social links' : 'full name'
205
- });
206
- }
207
- }
208
- logger.verbose("📊 State detection complete", {
209
- hasProfile: hasBeenEnriched,
210
- needsProfileGeneration,
211
- needsUserInfo,
212
- missingUserInfo,
213
- forceUpdate: state.forceUpdate,
214
- hasInput: !!state.input,
215
- hasMeaningfulInput,
216
- });
217
- return {
218
- // Only treat the (users-sourced) profile as existing state when the user has
219
- // actually been enriched; un-enriched users keep `undefined` so the generate
220
- // path runs from scratch rather than merging into an empty users row.
221
- profile: hasBeenEnriched ? (profile || undefined) : undefined,
222
- needsProfileGeneration,
223
- needsUserInfo,
224
- missingUserInfo
225
- };
226
- }
227
- catch (error) {
228
- logger.error("Failed to load profile", {
229
- error: error instanceof Error ? error.message : String(error)
230
- });
231
- return {
232
- profile: undefined,
233
- error: `Failed to load profile from database: ${error instanceof Error ? error.message : String(error)}`
234
- };
235
- }
236
- });
237
- }
238
- // ─────────────────────────────────────────────────────────
239
- // NODE: Scrape
240
- // Scrapes data from web if input is not provided
241
- // ─────────────────────────────────────────────────────────
242
- export async function scrapeNode(state, deps) {
243
- return timed("ProfileGraph.scrape", async () => {
244
- if (state.input && isMeaningfulProfileInput(state.input)) {
245
- logger.verbose("Meaningful input already provided - skipping scrape");
246
- return {};
247
- }
248
- logger.verbose("Starting web scrape...", {
249
- userId: state.userId
250
- });
251
- try {
252
- // Fetch user details to construct objective for web scraping
253
- const user = await deps.database.getUser(state.userId);
254
- if (!user) {
255
- logger.error("User not found", { userId: state.userId });
256
- return {
257
- error: `User not found: ${state.userId}`
258
- };
259
- }
260
- // Build scraping objective from available user information
261
- // Priority: social links (most reliable) > name + location > email
262
- const socialParts = [];
263
- const socials = await deps.database.getUserSocials(state.userId);
264
- for (const s of socials) {
265
- switch (s.label) {
266
- case 'twitter':
267
- socialParts.push(`X/Twitter: ${s.value}`);
268
- break;
269
- case 'linkedin':
270
- socialParts.push(`LinkedIn: ${s.value}`);
271
- break;
272
- case 'github':
273
- socialParts.push(`GitHub: ${s.value}`);
274
- break;
275
- case 'telegram':
276
- socialParts.push(`Telegram: ${s.value}`);
277
- break;
278
- default:
279
- socialParts.push(`Website: ${s.value}`);
280
- break;
281
- }
282
- }
283
- // Construct objective based on what we have
284
- let objective = `Find information about ${user.name || 'this person'}`;
285
- if (user.location) {
286
- objective += ` located in ${user.location}`;
287
- }
288
- objective += '.\n\n';
289
- if (socialParts.length > 0) {
290
- objective += `Their social profiles:\n${socialParts.join('\n')}\n\n`;
291
- objective += 'Use these links to find accurate information about their professional background, skills, and interests.';
292
- }
293
- else if (user.email) {
294
- objective += `Their email: ${user.email}\n\n`;
295
- objective += 'Search for professional information, skills, and background about this person.';
296
- }
297
- else {
298
- objective += 'Search for professional information and background about this person.';
299
- }
300
- logger.verbose("Constructed scraping objective", {
301
- hasSocials: socialParts.length > 0,
302
- hasLocation: !!user.location,
303
- objectivePreview: objective.substring(0, 100)
304
- });
305
- const scrapedData = await deps.scraper.scrape(objective);
306
- logger.verbose("✅ Scrape complete", {
307
- dataLength: scrapedData?.length || 0
308
- });
309
- return {
310
- objective,
311
- input: scrapedData,
312
- activeSocialIds: socials.map(s => s.id),
313
- operationsPerformed: { scraped: true }
314
- };
315
- }
316
- catch (error) {
317
- logger.error("Scrape failed", {
318
- error: error instanceof Error ? error.message : String(error)
319
- });
320
- return {
321
- error: `Web scrape failed: ${error instanceof Error ? error.message : String(error)}`
322
- };
323
- }
324
- });
325
- }
326
- // ─────────────────────────────────────────────────────────
327
- // NODE: Auto-Generate (Parallel Chat API enrichment)
328
- // Calls enrichUserProfile to get structured data, then builds a
329
- // text blob as input for the decompose → aggregate → generate
330
- // pipeline. This ensures enriched users get premises with
331
- // embeddings, making them discoverable via premise-to-premise
332
- // matching.
333
- // On failure, falls back to basic user info for LLM generation.
334
- // Used in 'generate' mode only.
335
- // ─────────────────────────────────────────────────────────
336
- export async function autoGenerateNode(state, deps) {
337
- return timed("ProfileGraph.autoGenerate", async () => {
338
- logger.verbose("Starting auto-generate via Chat API enrichment", {
339
- userId: state.userId,
340
- });
341
- try {
342
- const user = await deps.database.getUser(state.userId);
343
- if (!user) {
344
- logger.error("User not found for auto-generate", { userId: state.userId });
345
- return { error: `User not found: ${state.userId}` };
346
- }
347
- const socials = await deps.database.getUserSocials(state.userId);
348
- const enrichmentSocials = socialsToEnrichmentRequest(socials);
349
- const request = {
350
- name: user.name || undefined,
351
- email: user.email || undefined,
352
- linkedin: enrichmentSocials.linkedin || undefined,
353
- twitter: enrichmentSocials.twitter || undefined,
354
- github: enrichmentSocials.github || undefined,
355
- telegram: enrichmentSocials.telegram || undefined,
356
- websites: enrichmentSocials.websites?.length ? enrichmentSocials.websites : undefined,
357
- };
358
- const buildBasicInfo = () => {
359
- const parts = [
360
- user.name ? `Name: ${user.name}` : '',
361
- user.location ? `Location: ${user.location}` : '',
362
- user.intro ? `Bio: ${user.intro}` : '',
363
- ].filter(Boolean).join('\n');
364
- return parts || "No information available";
365
- };
366
- if (!deps.enricher) {
367
- logger.warn("No enricher configured — falling back to basic info", { userId: state.userId });
368
- return {
369
- input: buildBasicInfo(),
370
- needsUserInfo: false,
371
- needsProfileGeneration: true,
372
- operationsPerformed: { scraped: true },
373
- };
374
- }
375
- try {
376
- const enrichment = await deps.enricher.enrichUserProfile(request);
377
- if (enrichment && !enrichment.isHuman) {
378
- logger.info("Enrichment detected non-human entity, aborting", { userId: state.userId });
379
- return { error: "Non-human entity detected" };
380
- }
381
- const hasMeaningfulEnrichment = !!enrichment &&
382
- enrichment.confidentMatch &&
383
- (enrichment.identity.bio.trim().length > 0 ||
384
- enrichment.narrative.context.trim().length > 0 ||
385
- enrichment.attributes.skills.length > 0 ||
386
- enrichment.attributes.interests.length > 0);
387
- if (hasMeaningfulEnrichment) {
388
- logger.verbose("Chat API enrichment succeeded", {
389
- userId: state.userId,
390
- skillsCount: enrichment.attributes.skills.length,
391
- interestsCount: enrichment.attributes.interests.length,
392
- });
393
- // Update user record with enriched data
394
- const updatePayload = {};
395
- if (enrichment.identity.bio?.trim())
396
- updatePayload.intro = enrichment.identity.bio.trim();
397
- if (enrichment.identity.location?.trim())
398
- updatePayload.location = enrichment.identity.location.trim();
399
- const enrichedSocials = [];
400
- if (enrichment.socials.twitter)
401
- enrichedSocials.push({ label: 'twitter', value: enrichment.socials.twitter });
402
- if (enrichment.socials.linkedin)
403
- enrichedSocials.push({ label: 'linkedin', value: enrichment.socials.linkedin });
404
- if (enrichment.socials.github)
405
- enrichedSocials.push({ label: 'github', value: enrichment.socials.github });
406
- if (enrichment.socials.telegram)
407
- enrichedSocials.push({ label: 'telegram', value: enrichment.socials.telegram });
408
- if (enrichment.socials.websites?.length) {
409
- for (const w of enrichment.socials.websites)
410
- enrichedSocials.push({ label: 'custom', value: w });
411
- }
412
- if (enrichedSocials.length > 0) {
413
- const existingSocials = await deps.database.getUserSocials(state.userId);
414
- const enrichedLabels = new Set(enrichedSocials.map(s => s.label));
415
- const kept = existingSocials
416
- .filter(s => !enrichedLabels.has(s.label) || s.label === 'custom')
417
- .map(s => ({ label: s.label, value: s.value }));
418
- const merged = enrichedLabels.has('custom')
419
- ? [...kept.filter(s => s.label !== 'custom'), ...enrichedSocials]
420
- : [...kept, ...enrichedSocials];
421
- await deps.database.setUserSocials(state.userId, merged);
422
- }
423
- if (Object.keys(updatePayload).length > 0) {
424
- await deps.database.updateUser(state.userId, updatePayload);
425
- }
426
- // Build a text blob from the enrichment result so it flows
427
- // through premise decomposition (when available) rather than
428
- // bypassing premises via prePopulatedProfile.
429
- const enrichmentParts = [
430
- enrichment.identity.name ? `My name is ${enrichment.identity.name}.` : '',
431
- enrichment.identity.location ? `I am based in ${enrichment.identity.location}.` : '',
432
- enrichment.identity.bio || '',
433
- enrichment.narrative.context || '',
434
- enrichment.attributes.skills.length ? `My skills include ${enrichment.attributes.skills.join(', ')}.` : '',
435
- enrichment.attributes.interests.length ? `My interests include ${enrichment.attributes.interests.join(', ')}.` : '',
436
- ].filter(Boolean).join('\n');
437
- return {
438
- input: enrichmentParts,
439
- needsUserInfo: false,
440
- needsProfileGeneration: true,
441
- forceUpdate: true,
442
- activeSocialIds: socials.map(s => s.id),
443
- operationsPerformed: { scraped: true },
444
- };
445
- }
446
- logger.warn("Chat API returned low-signal enrichment, falling back to basic info", { userId: state.userId });
447
- }
448
- catch (enrichErr) {
449
- logger.warn("Chat API enrichment failed, falling back to basic info", {
450
- userId: state.userId,
451
- error: enrichErr instanceof Error ? enrichErr.message : String(enrichErr),
452
- });
453
- }
454
- return {
455
- input: buildBasicInfo(),
456
- needsUserInfo: false,
457
- needsProfileGeneration: true,
458
- operationsPerformed: { scraped: true },
459
- };
460
- }
461
- catch (err) {
462
- logger.error("Auto-generate failed", {
463
- error: err instanceof Error ? err.message : String(err),
464
- });
465
- return { error: `Auto-generate failed: ${err instanceof Error ? err.message : String(err)}` };
466
- }
467
- });
468
- }
469
- // ─────────────────────────────────────────────────────────
470
- // NODE: Decompose Premises
471
- // Decomposes free-text input (chat or scraped) into individual premises
472
- // and creates each via the premise graph. Premise creation is the terminal
473
- // effect: premise lifecycle events drive user_context regeneration downstream
474
- // (the legacy aggregate→generate→save profile tail was removed in WS8/IND-365,
475
- // along with the user_profiles table it wrote to).
476
- // ─────────────────────────────────────────────────────────
477
- export async function decomposePremisesNode(state, deps) {
478
- return timed("ProfileGraph.decomposePremises", async () => {
479
- if (!state.input) {
480
- logger.error("No input for premise decomposition");
481
- return { error: "Input required for premise decomposition" };
482
- }
483
- if (!deps.premiseGraph) {
484
- // No premise graph injected — nothing to decompose into. End the run.
485
- logger.warn("No premise graph injected — skipping premise decomposition");
486
- return {};
487
- }
488
- logger.verbose("Decomposing input into premises...", {
489
- userId: state.userId,
490
- inputLength: state.input.length,
491
- });
492
- const agentTimingsAccum = [];
493
- try {
494
- const _traceEmitter = requestContext.getStore()?.traceEmitter;
495
- // Offer the user's ACTIVE premises to the decomposer so removal/denial
496
- // instructions ("remove all mentions of X", "I have nothing to do with Y")
497
- // can be resolved to concrete retractions instead of being silently dropped.
498
- // Only when the adapter supports retraction — otherwise skip the lookup.
499
- let activePremises = [];
500
- if (typeof deps.database.updatePremise === 'function') {
501
- try {
502
- activePremises = await deps.database.getPremisesForUser(state.userId, 'ACTIVE');
503
- }
504
- catch (err) {
505
- logger.warn("Failed to load active premises for retraction matching — proceeding without", {
506
- error: err instanceof Error ? err.message : String(err),
507
- });
508
- }
509
- }
510
- const decomposeStart = Date.now();
511
- _traceEmitter?.({ type: "agent_start", name: "premise-decomposer" });
512
- // Offer the stored bio (users.intro) as well: it is a separate identity
513
- // field that premises never touch, so removal instructions must also be
514
- // able to rewrite it — otherwise disavowed facts survive in the bio and
515
- // resurface in every prompt that includes the profile identity.
516
- const currentBio = state.profile?.identity?.bio ?? '';
517
- const result = await deps.premiseDecomposer.invoke(state.input, activePremises.map((p) => ({ id: p.id, text: p.assertion.text })), currentBio);
518
- const decomposeMs = Date.now() - decomposeStart;
519
- const retractionIds = result.retractedPremiseIds ?? [];
520
- agentTimingsAccum.push({ name: "premise.decomposer", durationMs: decomposeMs });
521
- _traceEmitter?.({
522
- type: "agent_end",
523
- name: "premise-decomposer",
524
- durationMs: decomposeMs,
525
- summary: `Decomposed into ${result.premises.length} premise(s), ${retractionIds.length} retraction(s)`,
526
- });
527
- // Apply retractions FIRST so a premise that is simultaneously disavowed and
528
- // re-asserted in corrected form does not dedupe the new create against the
529
- // stale active row.
530
- let retracted = 0;
531
- for (const premiseId of retractionIds) {
532
- if (!deps.database.updatePremise)
533
- break;
534
- try {
535
- await deps.database.updatePremise(premiseId, {
536
- status: 'RETRACTED',
537
- retractedAt: new Date(),
538
- });
539
- retracted++;
540
- }
541
- catch (err) {
542
- logger.warn("Premise retraction failed", {
543
- premiseId,
544
- error: err instanceof Error ? err.message : String(err),
545
- });
546
- }
547
- }
548
- if (retracted > 0) {
549
- logger.verbose('Retracted premises disavowed by input', {
550
- retracted,
551
- requested: retractionIds.length,
552
- userId: state.userId,
553
- });
554
- }
555
- // Apply the bio revision (before the no-new-premises early return: a pure
556
- // removal instruction extracts zero premises but still rewrites the bio).
557
- let bioRevised = false;
558
- const revisedBio = result.revisedBio?.trim();
559
- if (revisedBio && revisedBio !== currentBio.trim()) {
560
- try {
561
- await deps.database.saveProfile(state.userId, {
562
- userId: state.userId,
563
- // Empty name/location are skipped by the identity persister — only
564
- // the bio is written.
565
- identity: { name: '', bio: revisedBio, location: '' },
566
- context: '',
567
- });
568
- bioRevised = true;
569
- logger.verbose("Revised stored bio per removal/correction instruction", { userId: state.userId });
570
- }
571
- catch (err) {
572
- logger.warn("Bio revision failed", {
573
- error: err instanceof Error ? err.message : String(err),
574
- });
575
- }
576
- }
577
- if (result.premises.length === 0) {
578
- logger.verbose("No premises extracted — nothing to create");
579
- return {
580
- agentTimings: agentTimingsAccum,
581
- ...(retracted > 0 || bioRevised ? { operationsPerformed: { decomposedPremises: true } } : {}),
582
- };
583
- }
584
- logger.verbose('Creating premises via premise graph', {
585
- count: result.premises.length,
586
- userId: state.userId,
587
- });
588
- let created = 0;
589
- let skippedDuplicates = 0;
590
- for (const p of result.premises) {
591
- try {
592
- // Contextual premises carry an LLM-inferred validity window and are
593
- // volatile (auto-retract on expiry); assertive premises do not expire.
594
- const isContextual = p.tier === 'contextual';
595
- const validUntil = isContextual && p.validityDays
596
- ? new Date(Date.now() + p.validityDays * 24 * 60 * 60 * 1000).toISOString()
597
- : undefined;
598
- const premiseResult = await invokeWithAbortSignal(deps.premiseGraph, {
599
- userId: state.userId,
600
- assertionText: p.text,
601
- tier: p.tier,
602
- operationMode: 'create',
603
- volatile: isContextual,
604
- ...(validUntil ? { validUntil } : {}),
605
- ...(state.activeSocialIds?.length
606
- ? { provenanceSource: 'integration', provenanceSourceId: state.activeSocialIds[0] }
607
- : {}),
608
- });
609
- if (premiseResult.premise) {
610
- created++;
611
- }
612
- else if (premiseResult.duplicateOf) {
613
- skippedDuplicates++;
614
- }
615
- else if (premiseResult.error) {
616
- logger.warn("Premise creation failed", {
617
- text: p.text.substring(0, 60),
618
- error: premiseResult.error,
619
- });
620
- }
621
- }
622
- catch (err) {
623
- logger.warn("Premise creation threw", {
624
- text: p.text.substring(0, 60),
625
- error: err instanceof Error ? err.message : String(err),
626
- });
627
- }
628
- }
629
- logger.verbose('Created premises', {
630
- created,
631
- requested: result.premises.length,
632
- skippedDuplicates,
633
- userId: state.userId,
634
- });
635
- return {
636
- agentTimings: agentTimingsAccum,
637
- operationsPerformed: { decomposedPremises: true },
638
- };
639
- }
640
- catch (err) {
641
- logger.error("Premise decomposition failed", {
642
- error: err instanceof Error ? err.message : String(err),
643
- });
644
- return {
645
- agentTimings: agentTimingsAccum,
646
- };
647
- }
648
- });
649
- }
650
- /**
651
- * Route from check_state to next step based on operation mode and detected needs.
652
- */
653
- export function checkStateCondition(state, deps) {
654
- // Query mode: Return immediately (fast path)
655
- if (state.operationMode === 'query') {
656
- logger.verbose("Query mode - ending (fast path)");
657
- return END;
658
- }
659
- // Generate mode: use enrichUserProfile Chat API to auto-generate
660
- if (state.operationMode === 'generate') {
661
- logger.verbose("Generate mode - routing to auto_generate");
662
- return "auto_generate";
663
- }
664
- // Check if user information is insufficient for scraping
665
- // Return early so chat graph can request the missing information
666
- if (state.needsUserInfo) {
667
- logger.verbose("⚠️ Insufficient user info - requesting from user", {
668
- missingInfo: state.missingUserInfo
669
- });
670
- return END;
671
- }
672
- // Write mode: Check what needs generation
673
- if (state.needsProfileGeneration) {
674
- // Only use provided input if it's meaningful (not just "Yes" / confirmation)
675
- if (state.input && isMeaningfulProfileInput(state.input)) {
676
- // Route through premise decomposition when a premise graph is available.
677
- // The decompose node extracts atomic premises and creates them; premise
678
- // events drive user_context regeneration. Without a premise graph there
679
- // is nothing to do, so end the run.
680
- if (deps.premiseGraph) {
681
- logger.verbose("Profile generation needed — decomposing input into premises");
682
- return "decompose_premises";
683
- }
684
- logger.verbose("Profile generation needed but no premise graph injected — ending");
685
- return END;
686
- }
687
- else {
688
- logger.verbose("Profile generation needed - scraping first (no meaningful input)");
689
- return "scrape";
690
- }
691
- }
692
- // Everything exists and is up to date
693
- logger.verbose("All components exist - ending");
694
- return END;
695
- }