@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.
- package/CHANGELOG.md +1841 -0
- package/IMPLEMENTATION.md +140 -181
- package/README.md +16 -20
- package/STABILITY.md +16 -11
- package/dist/{intents/intent.module.d.ts → capabilities/intents.d.ts} +182 -192
- package/dist/capabilities/intents.js +88 -0
- package/dist/capabilities/negotiations.d.ts +17 -0
- package/dist/capabilities/negotiations.js +16 -0
- package/dist/{networks/network.module.d.ts → capabilities/networks.d.ts} +33 -169
- package/dist/{networks/network.module.js → capabilities/networks.js} +6 -17
- package/dist/index.d.ts +57 -134
- package/dist/index.js +41 -105
- package/dist/internal/agents/agent.repository.port.d.ts +59 -0
- package/dist/internal/agents/agent.repository.port.js +7 -0
- package/dist/internal/agents/agent.types.d.ts +35 -0
- package/dist/{agents → internal/agents}/agent.types.js +1 -6
- package/dist/{intents → internal/intents}/graph/intent.graph.d.ts +142 -151
- package/dist/{intents → internal/intents}/graph/intent.graph.execute.d.ts +5 -1
- package/dist/{intents → internal/intents}/graph/intent.graph.execute.js +165 -46
- package/dist/internal/intents/graph/intent.graph.infer.d.ts +78 -0
- package/dist/internal/intents/graph/intent.graph.infer.js +122 -0
- package/dist/internal/intents/graph/intent.graph.js +108 -0
- package/dist/{intents → internal/intents}/graph/intent.graph.reconcile.d.ts +18 -9
- package/dist/internal/intents/graph/intent.graph.reconcile.js +173 -0
- package/dist/internal/intents/graph/intent.graph.shared.d.ts +55 -0
- package/dist/{intents → internal/intents}/graph/intent.graph.shared.js +25 -70
- package/dist/{intents → internal/intents}/graph/intent.graph.state.d.ts +96 -32
- package/dist/{intents → internal/intents}/graph/intent.graph.state.js +42 -31
- package/dist/internal/intents/intent.admission.d.ts +16 -0
- package/dist/internal/intents/intent.admission.js +30 -0
- package/dist/{intents → internal/intents}/intent.inferrer.d.ts +1 -40
- package/dist/{intents → internal/intents}/intent.inferrer.js +13 -49
- package/dist/internal/intents/intent.preparer.d.ts +52 -0
- package/dist/internal/intents/intent.preparer.js +87 -0
- package/dist/{intents → internal/intents}/intent.verifier.d.ts +3 -36
- package/dist/{intents → internal/intents}/intent.verifier.js +0 -17
- package/dist/{networks → internal/networks}/indexer.graph.d.ts +15 -200
- package/dist/{networks → internal/networks}/indexer.graph.js +19 -128
- package/dist/{networks → internal/networks}/indexer.state.d.ts +8 -63
- package/dist/internal/networks/indexer.state.js +70 -0
- package/dist/{networks → internal/networks}/membership.graph.d.ts +6 -6
- package/dist/{networks → internal/networks}/membership.graph.js +3 -3
- package/dist/{networks → internal/networks}/membership.state.d.ts +2 -2
- package/dist/{networks → internal/networks}/membership.state.js +2 -2
- package/dist/{networks → internal/networks}/network.graph.d.ts +9 -22
- package/dist/{networks → internal/networks}/network.graph.js +13 -27
- package/dist/{networks → internal/networks}/network.recommender.d.ts +2 -2
- package/dist/{networks → internal/networks}/network.recommender.js +2 -2
- package/dist/{networks → internal/networks}/network.state.d.ts +4 -7
- package/dist/{networks → internal/networks}/network.state.js +4 -4
- package/dist/internal/opportunities/negotiation-context.loader.d.ts +26 -0
- package/dist/internal/opportunities/negotiation-context.loader.js +36 -0
- package/dist/{opportunities → internal/opportunities}/opportunity.actor.d.ts +1 -1
- package/dist/{opportunities → internal/opportunities}/opportunity.actor.js +7 -1
- package/dist/internal/opportunities/opportunity.counterparties.d.ts +17 -0
- package/dist/internal/opportunities/opportunity.counterparties.js +19 -0
- package/dist/internal/opportunities/opportunity.events.d.ts +38 -0
- package/dist/internal/opportunities/opportunity.events.js +94 -0
- package/dist/{opportunities → internal/opportunities}/opportunity.feed-selection.d.ts +3 -9
- package/dist/internal/opportunities/opportunity.feed-selection.js +40 -0
- package/dist/internal/opportunities/opportunity.graph.modes.d.ts +39 -0
- package/dist/internal/opportunities/opportunity.graph.modes.js +138 -0
- package/dist/{opportunities → internal/opportunities}/opportunity.labels.d.ts +2 -3
- package/dist/internal/opportunities/opportunity.labels.js +9 -0
- package/dist/{opportunities → internal/opportunities}/opportunity.presentation.d.ts +17 -86
- package/dist/{opportunities → internal/opportunities}/opportunity.presentation.js +54 -447
- package/dist/{opportunities → internal/opportunities}/opportunity.update-admission.d.ts +2 -2
- package/dist/internal/opportunities/opportunity.utils.d.ts +105 -0
- package/dist/internal/opportunities/opportunity.utils.js +165 -0
- package/dist/{opportunities → internal/opportunities}/radar/radar.graph.d.ts +17 -17
- package/dist/{opportunities → internal/opportunities}/radar/radar.graph.js +41 -161
- package/dist/{opportunities → internal/opportunities}/radar/radar.state.d.ts +4 -11
- package/dist/{shared → internal/shared}/agent/model-signal.d.ts +1 -1
- package/dist/{shared → internal/shared}/agent/model-signal.js +1 -1
- package/dist/{shared → internal/shared}/agent/model.config.d.ts +28 -86
- package/dist/{shared → internal/shared}/agent/model.config.js +58 -69
- package/dist/internal/shared/agent/model.resolver.d.ts +33 -0
- package/dist/{shared → internal/shared}/agent/model.resolver.js +18 -33
- package/dist/internal/shared/agent/scope.d.ts +20 -0
- package/dist/internal/shared/agent/scope.js +24 -0
- package/dist/internal/shared/assignment/network-assignment.policy.d.ts +23 -0
- package/dist/internal/shared/assignment/network-assignment.policy.js +28 -0
- package/dist/{shared → internal/shared}/observability/log.d.ts +3 -6
- package/dist/{shared → internal/shared}/observability/log.js +9 -18
- package/dist/{shared → internal/shared}/observability/protocol.logger.d.ts +1 -1
- package/dist/{shared → internal/shared}/observability/protocol.logger.js +1 -1
- package/dist/internal/shared/observability/request-context.d.ts +29 -0
- package/dist/internal/shared/observability/request-context.js +17 -0
- package/dist/{shared → internal/shared}/utils/social-label.d.ts +2 -2
- package/dist/{shared → internal/shared}/utils/social-label.js +1 -1
- package/dist/platform/database/capabilities.d.ts +59 -0
- package/dist/{shared/interfaces/database.entities.d.ts → platform/database/entities.d.ts} +81 -121
- package/dist/{shared/interfaces/database.identity-queries.d.ts → platform/database/identity-queries.d.ts} +55 -20
- package/dist/platform/database/member-queries.d.ts +55 -0
- package/dist/platform/database/member-queries.js +4 -0
- package/dist/platform/database/negotiation.d.ts +38 -0
- package/dist/{shared/interfaces/database.network-queries.d.ts → platform/database/network-queries.d.ts} +66 -67
- package/dist/platform/database/network-queries.js +4 -0
- package/dist/{shared/interfaces/database.opportunity-queries.d.ts → platform/database/opportunity-queries.d.ts} +25 -109
- package/dist/{shared/interfaces/database.port.d.ts → platform/database/port.d.ts} +52 -117
- package/dist/{shared/interfaces/database.port.js → platform/database/port.js} +3 -5
- package/dist/platform/database.d.ts +23 -0
- package/dist/{shared/interfaces/database.interface.js → platform/database.js} +1 -1
- package/dist/{shared/interfaces/cache.interface.d.ts → platform/discovery/cache.d.ts} +2 -4
- package/dist/{shared/interfaces/cache.interface.js → platform/discovery/cache.js} +1 -1
- package/dist/platform/discovery/embedder.d.ts +31 -0
- package/dist/platform/runtime/errors.d.ts +6 -0
- package/dist/platform/runtime/errors.js +9 -0
- package/dist/platform/runtime/follow-up.d.ts +36 -0
- package/dist/platform/runtime/follow-up.js +4 -0
- package/dist/platform/runtime/observability.d.ts +34 -0
- package/dist/protocol/core.d.ts +11 -0
- package/dist/protocol/discovery.rules.d.ts +21 -0
- package/dist/protocol/discovery.rules.js +29 -0
- package/dist/protocol/negotiation.constants.d.ts +3 -0
- package/dist/protocol/negotiation.constants.js +3 -0
- package/dist/protocol/negotiation.rules.d.ts +73 -0
- package/dist/protocol/negotiation.rules.js +68 -0
- package/dist/protocol/protocol.prompt.d.ts +13 -0
- package/dist/protocol/protocol.prompt.js +190 -0
- package/dist/{shared → protocol}/schemas/discovery-question.schema.d.ts +13 -13
- package/dist/{shared → protocol}/schemas/discovery-question.schema.js +2 -2
- package/dist/{shared → protocol}/schemas/identity.schema.d.ts +4 -4
- package/dist/{shared → protocol}/schemas/identity.schema.js +4 -4
- package/dist/{shared → protocol}/schemas/network-assignment.schema.d.ts +11 -20
- package/dist/{shared → protocol}/schemas/network-assignment.schema.js +2 -9
- package/dist/protocol/schemas/underspecification.schema.d.ts +9 -0
- package/dist/protocol/schemas/underspecification.schema.js +12 -0
- package/package.json +7 -15
- package/dist/agents/agent.dispatcher.port.d.ts +0 -25
- package/dist/agents/agent.module.d.ts +0 -19
- package/dist/agents/agent.module.js +0 -11
- package/dist/agents/agent.repository.port.d.ts +0 -118
- package/dist/agents/agent.repository.port.js +0 -10
- package/dist/agents/agent.tools.d.ts +0 -16
- package/dist/agents/agent.tools.js +0 -351
- package/dist/agents/agent.tools.port.d.ts +0 -22
- package/dist/agents/agent.tools.port.js +0 -18
- package/dist/agents/agent.types.d.ts +0 -76
- package/dist/chat/chat-streaming.types.d.ts +0 -618
- package/dist/chat/chat-streaming.types.js +0 -297
- package/dist/chat/chat.agent.d.ts +0 -292
- package/dist/chat/chat.agent.js +0 -1010
- package/dist/chat/chat.graph.d.ts +0 -424
- package/dist/chat/chat.graph.js +0 -257
- package/dist/chat/chat.interrupt.classifier.d.ts +0 -25
- package/dist/chat/chat.interrupt.classifier.js +0 -64
- package/dist/chat/chat.persona.d.ts +0 -39
- package/dist/chat/chat.prompt.d.ts +0 -4
- package/dist/chat/chat.prompt.js +0 -12
- package/dist/chat/chat.prompt.modules.d.ts +0 -30
- package/dist/chat/chat.prompt.modules.js +0 -40
- package/dist/chat/chat.question-dedup.d.ts +0 -14
- package/dist/chat/chat.question-dedup.js +0 -17
- package/dist/chat/chat.state.d.ts +0 -135
- package/dist/chat/chat.state.js +0 -120
- package/dist/chat/chat.streamer.d.ts +0 -64
- package/dist/chat/chat.streamer.js +0 -217
- package/dist/chat/chat.suggester.d.ts +0 -23
- package/dist/chat/chat.suggester.js +0 -95
- package/dist/chat/chat.summarizer.d.ts +0 -20
- package/dist/chat/chat.summarizer.js +0 -97
- package/dist/chat/chat.title.generator.d.ts +0 -19
- package/dist/chat/chat.title.generator.js +0 -66
- package/dist/chat/chat.tools.d.ts +0 -5
- package/dist/chat/chat.tools.js +0 -62
- package/dist/chat/chat.utils.d.ts +0 -41
- package/dist/chat/chat.utils.js +0 -88
- package/dist/chat/negotiator.persona.d.ts +0 -74
- package/dist/chat/negotiator.persona.js +0 -154
- package/dist/chat/negotiator.prompt.d.ts +0 -45
- package/dist/chat/negotiator.prompt.js +0 -160
- package/dist/chat/negotiator.tools.d.ts +0 -42
- package/dist/chat/negotiator.tools.js +0 -134
- package/dist/chat/onboarding.persona.d.ts +0 -28
- package/dist/chat/onboarding.persona.js +0 -86
- package/dist/chat/onboarding.prompt.d.ts +0 -6
- package/dist/chat/onboarding.prompt.js +0 -63
- package/dist/chat/signal.persona.d.ts +0 -47
- package/dist/chat/signal.persona.js +0 -319
- package/dist/chat/signal.prompt.d.ts +0 -39
- package/dist/chat/signal.prompt.js +0 -136
- package/dist/contacts/contact.module.d.ts +0 -8
- package/dist/contacts/contact.module.js +0 -6
- package/dist/contacts/contact.repository.port.d.ts +0 -21
- package/dist/contacts/contact.repository.port.js +0 -12
- package/dist/contacts/contact.tools.d.ts +0 -17
- package/dist/contacts/contact.tools.js +0 -108
- package/dist/contacts/contact.tools.port.d.ts +0 -20
- package/dist/contacts/contact.tools.port.js +0 -16
- package/dist/contacts/contact.types.d.ts +0 -24
- package/dist/contacts/contact.types.js +0 -8
- package/dist/contexts/context.generator.d.ts +0 -95
- package/dist/contexts/context.generator.js +0 -127
- package/dist/contexts/context.module.d.ts +0 -13
- package/dist/contexts/context.module.js +0 -12
- package/dist/contexts/context.tools.port.d.ts +0 -9
- package/dist/discovery/hyde.documents.d.ts +0 -9
- package/dist/discovery/hyde.documents.js +0 -49
- package/dist/discovery/hyde.env.d.ts +0 -8
- package/dist/discovery/hyde.env.js +0 -9
- package/dist/discovery/hyde.frame.d.ts +0 -150
- package/dist/discovery/hyde.frame.js +0 -107
- package/dist/discovery/hyde.generator.d.ts +0 -38
- package/dist/discovery/hyde.generator.js +0 -103
- package/dist/discovery/hyde.graph.d.ts +0 -209
- package/dist/discovery/hyde.graph.js +0 -482
- package/dist/discovery/hyde.state.d.ts +0 -70
- package/dist/discovery/hyde.state.js +0 -85
- package/dist/discovery/hyde.strategies.d.ts +0 -17
- package/dist/discovery/hyde.strategies.js +0 -34
- package/dist/discovery/hyde.validator.d.ts +0 -78
- package/dist/discovery/hyde.validator.js +0 -48
- package/dist/discovery/index.d.ts +0 -26
- package/dist/discovery/index.js +0 -19
- package/dist/discovery/lens.inferrer.d.ts +0 -214
- package/dist/discovery/lens.inferrer.js +0 -152
- package/dist/enrichment/enrichment.generator.d.ts +0 -68
- package/dist/enrichment/enrichment.generator.js +0 -95
- package/dist/enrichment/enrichment.graph.d.ts +0 -544
- package/dist/enrichment/enrichment.graph.js +0 -695
- package/dist/enrichment/enrichment.state.d.ts +0 -141
- package/dist/enrichment/enrichment.state.js +0 -115
- package/dist/enrichment/enrichment.tools.context-read.d.ts +0 -10
- package/dist/enrichment/enrichment.tools.context-read.js +0 -353
- package/dist/enrichment/enrichment.tools.context-write.d.ts +0 -9
- package/dist/enrichment/enrichment.tools.context-write.js +0 -417
- package/dist/enrichment/enrichment.tools.d.ts +0 -13
- package/dist/enrichment/enrichment.tools.helpers.d.ts +0 -139
- package/dist/enrichment/enrichment.tools.helpers.js +0 -234
- package/dist/enrichment/enrichment.tools.js +0 -153
- package/dist/intents/graph/intent.graph.infer.d.ts +0 -44
- package/dist/intents/graph/intent.graph.infer.js +0 -97
- package/dist/intents/graph/intent.graph.js +0 -134
- package/dist/intents/graph/intent.graph.reconcile.js +0 -274
- package/dist/intents/graph/intent.graph.shared.d.ts +0 -68
- package/dist/intents/intake/intake.orchestrator.d.ts +0 -203
- package/dist/intents/intake/intake.orchestrator.js +0 -255
- package/dist/intents/intake/intake.pack.generator.d.ts +0 -57
- package/dist/intents/intake/intake.pack.generator.js +0 -90
- package/dist/intents/intent.clarifier.d.ts +0 -51
- package/dist/intents/intent.clarifier.js +0 -201
- package/dist/intents/intent.indexer.d.ts +0 -82
- package/dist/intents/intent.indexer.js +0 -170
- package/dist/intents/intent.module.js +0 -103
- package/dist/intents/intent.proposal.d.ts +0 -37
- package/dist/intents/intent.proposal.js +0 -14
- package/dist/intents/intent.reconciler.d.ts +0 -105
- package/dist/intents/intent.reconciler.js +0 -186
- package/dist/intents/intent.tools.d.ts +0 -27
- package/dist/intents/intent.tools.js +0 -808
- package/dist/maintenance/maintenance.graph.d.ts +0 -239
- package/dist/maintenance/maintenance.graph.js +0 -199
- package/dist/maintenance/maintenance.state.d.ts +0 -35
- package/dist/maintenance/maintenance.state.js +0 -55
- package/dist/mcp/elicitation.builder.d.ts +0 -53
- package/dist/mcp/elicitation.builder.js +0 -74
- package/dist/mcp/elicitation.dispatcher.d.ts +0 -36
- package/dist/mcp/elicitation.dispatcher.js +0 -86
- package/dist/mcp/mcp.authorization-policy.d.ts +0 -252
- package/dist/mcp/mcp.authorization-policy.js +0 -535
- package/dist/mcp/mcp.server.d.ts +0 -90
- package/dist/mcp/mcp.server.js +0 -631
- package/dist/negotiations/insight.generator.d.ts +0 -31
- package/dist/negotiations/insight.generator.js +0 -105
- package/dist/negotiations/negotiation.agent.d.ts +0 -130
- package/dist/negotiations/negotiation.agent.js +0 -396
- package/dist/negotiations/negotiation.answer-consumption.d.ts +0 -223
- package/dist/negotiations/negotiation.answer-consumption.js +0 -275
- package/dist/negotiations/negotiation.attribution.d.ts +0 -91
- package/dist/negotiations/negotiation.attribution.js +0 -109
- package/dist/negotiations/negotiation.candidates.d.ts +0 -83
- package/dist/negotiations/negotiation.candidates.js +0 -162
- package/dist/negotiations/negotiation.client-dm.d.ts +0 -50
- package/dist/negotiations/negotiation.client-dm.js +0 -66
- package/dist/negotiations/negotiation.consultation-policy.d.ts +0 -95
- package/dist/negotiations/negotiation.consultation-policy.js +0 -159
- package/dist/negotiations/negotiation.deadlock.contracts.d.ts +0 -10
- package/dist/negotiations/negotiation.deadlock.d.ts +0 -87
- package/dist/negotiations/negotiation.deadlock.js +0 -150
- package/dist/negotiations/negotiation.detail-reader.d.ts +0 -94
- package/dist/negotiations/negotiation.detail-reader.js +0 -91
- package/dist/negotiations/negotiation.expected-speaker.d.ts +0 -33
- package/dist/negotiations/negotiation.expected-speaker.js +0 -59
- package/dist/negotiations/negotiation.graph.d.ts +0 -694
- package/dist/negotiations/negotiation.graph.finalize.d.ts +0 -5
- package/dist/negotiations/negotiation.graph.finalize.js +0 -403
- package/dist/negotiations/negotiation.graph.init.d.ts +0 -54
- package/dist/negotiations/negotiation.graph.init.js +0 -256
- package/dist/negotiations/negotiation.graph.js +0 -94
- package/dist/negotiations/negotiation.graph.screen.d.ts +0 -23
- package/dist/negotiations/negotiation.graph.screen.js +0 -108
- package/dist/negotiations/negotiation.graph.shared.d.ts +0 -111
- package/dist/negotiations/negotiation.graph.shared.js +0 -168
- package/dist/negotiations/negotiation.graph.turn.d.ts +0 -134
- package/dist/negotiations/negotiation.graph.turn.js +0 -662
- package/dist/negotiations/negotiation.hermes-contract.d.ts +0 -31
- package/dist/negotiations/negotiation.hermes-contract.js +0 -72
- package/dist/negotiations/negotiation.intent-snapshot-provenance.d.ts +0 -21
- package/dist/negotiations/negotiation.intent-snapshot-provenance.js +0 -28
- package/dist/negotiations/negotiation.lifecycle-narration.d.ts +0 -18
- package/dist/negotiations/negotiation.lifecycle-narration.js +0 -87
- package/dist/negotiations/negotiation.memory.d.ts +0 -65
- package/dist/negotiations/negotiation.memory.js +0 -83
- package/dist/negotiations/negotiation.module.d.ts +0 -36
- package/dist/negotiations/negotiation.module.js +0 -23
- package/dist/negotiations/negotiation.protocol.d.ts +0 -1018
- package/dist/negotiations/negotiation.protocol.js +0 -224
- package/dist/negotiations/negotiation.question-safety.d.ts +0 -52
- package/dist/negotiations/negotiation.question-safety.js +0 -119
- package/dist/negotiations/negotiation.reflect.d.ts +0 -194
- package/dist/negotiations/negotiation.reflect.js +0 -145
- package/dist/negotiations/negotiation.scope.d.ts +0 -41
- package/dist/negotiations/negotiation.scope.js +0 -39
- package/dist/negotiations/negotiation.screen.contracts.d.ts +0 -88
- package/dist/negotiations/negotiation.screen.contracts.js +0 -58
- package/dist/negotiations/negotiation.screen.d.ts +0 -78
- package/dist/negotiations/negotiation.screen.js +0 -112
- package/dist/negotiations/negotiation.stall-gap.d.ts +0 -83
- package/dist/negotiations/negotiation.stall-gap.js +0 -152
- package/dist/negotiations/negotiation.stance.contracts.d.ts +0 -123
- package/dist/negotiations/negotiation.stance.contracts.js +0 -317
- package/dist/negotiations/negotiation.state.d.ts +0 -597
- package/dist/negotiations/negotiation.state.js +0 -286
- package/dist/negotiations/negotiation.summarizer.d.ts +0 -25
- package/dist/negotiations/negotiation.summarizer.js +0 -101
- package/dist/negotiations/negotiation.task-lock-policy.d.ts +0 -10
- package/dist/negotiations/negotiation.task-lock-policy.js +0 -22
- package/dist/negotiations/negotiation.tools.d.ts +0 -18
- package/dist/negotiations/negotiation.tools.js +0 -842
- package/dist/negotiations/negotiation.tools.port.d.ts +0 -17
- package/dist/negotiations/negotiation.turn-cap.d.ts +0 -9
- package/dist/negotiations/negotiation.turn-cap.js +0 -12
- package/dist/networks/indexer.state.js +0 -112
- package/dist/networks/network.tools.d.ts +0 -36
- package/dist/networks/network.tools.js +0 -594
- package/dist/opportunities/delivery-card.cache.d.ts +0 -25
- package/dist/opportunities/delivery-card.cache.js +0 -43
- package/dist/opportunities/discovery.env.d.ts +0 -20
- package/dist/opportunities/discovery.env.js +0 -109
- package/dist/opportunities/discriminator/discriminator.adjustments.d.ts +0 -90
- package/dist/opportunities/discriminator/discriminator.adjustments.js +0 -141
- package/dist/opportunities/discriminator/discriminator.assigner.d.ts +0 -78
- package/dist/opportunities/discriminator/discriminator.assigner.js +0 -153
- package/dist/opportunities/discriminator/discriminator.env.d.ts +0 -103
- package/dist/opportunities/discriminator/discriminator.env.js +0 -103
- package/dist/opportunities/discriminator/discriminator.miner.d.ts +0 -114
- package/dist/opportunities/discriminator/discriminator.miner.js +0 -228
- package/dist/opportunities/discriminator/discriminator.push.d.ts +0 -13
- package/dist/opportunities/discriminator/discriminator.push.js +0 -19
- package/dist/opportunities/discriminator/discriminator.question.d.ts +0 -58
- package/dist/opportunities/discriminator/discriminator.question.js +0 -155
- package/dist/opportunities/discriminator/discriminator.scorer.d.ts +0 -32
- package/dist/opportunities/discriminator/discriminator.scorer.js +0 -105
- package/dist/opportunities/discriminator/discriminator.shadow.d.ts +0 -32
- package/dist/opportunities/discriminator/discriminator.shadow.js +0 -90
- package/dist/opportunities/discriminator/discriminator.types.d.ts +0 -93
- package/dist/opportunities/discriminator/discriminator.types.js +0 -18
- package/dist/opportunities/negotiation-context.loader.d.ts +0 -59
- package/dist/opportunities/negotiation-context.loader.js +0 -90
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.env.d.ts +0 -43
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.env.js +0 -44
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.extractor.d.ts +0 -24
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.extractor.js +0 -188
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.miner.d.ts +0 -26
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.miner.js +0 -112
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.shadow.d.ts +0 -19
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.shadow.js +0 -61
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.types.d.ts +0 -191
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.types.js +0 -18
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.verifier.d.ts +0 -34
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.verifier.js +0 -91
- package/dist/opportunities/negotiation-summary.builder.d.ts +0 -37
- package/dist/opportunities/negotiation-summary.builder.js +0 -66
- package/dist/opportunities/opportunity.discovery-negotiation-summary.d.ts +0 -14
- package/dist/opportunities/opportunity.discovery-negotiation-summary.js +0 -46
- package/dist/opportunities/opportunity.enricher.d.ts +0 -71
- package/dist/opportunities/opportunity.enricher.js +0 -280
- package/dist/opportunities/opportunity.evaluator.d.ts +0 -289
- package/dist/opportunities/opportunity.evaluator.js +0 -516
- package/dist/opportunities/opportunity.evidence.d.ts +0 -22
- package/dist/opportunities/opportunity.evidence.js +0 -87
- package/dist/opportunities/opportunity.existing-negotiation.d.ts +0 -79
- package/dist/opportunities/opportunity.existing-negotiation.js +0 -118
- package/dist/opportunities/opportunity.feed-selection.js +0 -96
- package/dist/opportunities/opportunity.graph.d.ts +0 -1611
- package/dist/opportunities/opportunity.graph.discovery-strategies.d.ts +0 -109
- package/dist/opportunities/opportunity.graph.discovery-strategies.js +0 -451
- package/dist/opportunities/opportunity.graph.discovery.d.ts +0 -69
- package/dist/opportunities/opportunity.graph.discovery.js +0 -397
- package/dist/opportunities/opportunity.graph.evaluation.d.ts +0 -82
- package/dist/opportunities/opportunity.graph.evaluation.js +0 -608
- package/dist/opportunities/opportunity.graph.js +0 -193
- package/dist/opportunities/opportunity.graph.modes.d.ts +0 -538
- package/dist/opportunities/opportunity.graph.modes.js +0 -538
- package/dist/opportunities/opportunity.graph.negotiate.d.ts +0 -109
- package/dist/opportunities/opportunity.graph.negotiate.js +0 -392
- package/dist/opportunities/opportunity.graph.persist-node.d.ts +0 -93
- package/dist/opportunities/opportunity.graph.persist-node.js +0 -765
- package/dist/opportunities/opportunity.graph.prep.d.ts +0 -150
- package/dist/opportunities/opportunity.graph.prep.js +0 -381
- package/dist/opportunities/opportunity.graph.shared.d.ts +0 -173
- package/dist/opportunities/opportunity.graph.shared.js +0 -199
- package/dist/opportunities/opportunity.introducer-feature.d.ts +0 -2
- package/dist/opportunities/opportunity.introducer-feature.js +0 -4
- package/dist/opportunities/opportunity.introducer.d.ts +0 -77
- package/dist/opportunities/opportunity.introducer.js +0 -99
- package/dist/opportunities/opportunity.labels.js +0 -10
- package/dist/opportunities/opportunity.lifecycle.d.ts +0 -63
- package/dist/opportunities/opportunity.lifecycle.js +0 -181
- package/dist/opportunities/opportunity.module.d.ts +0 -54
- package/dist/opportunities/opportunity.module.js +0 -39
- package/dist/opportunities/opportunity.newborn-stamping.d.ts +0 -41
- package/dist/opportunities/opportunity.newborn-stamping.js +0 -81
- package/dist/opportunities/opportunity.owner-approval.d.ts +0 -118
- package/dist/opportunities/opportunity.owner-approval.js +0 -34
- package/dist/opportunities/opportunity.owner-provenance.d.ts +0 -6
- package/dist/opportunities/opportunity.owner-provenance.js +0 -28
- package/dist/opportunities/opportunity.persist.d.ts +0 -58
- package/dist/opportunities/opportunity.persist.js +0 -145
- package/dist/opportunities/opportunity.persistence-admission.d.ts +0 -39
- package/dist/opportunities/opportunity.persistence-admission.js +0 -59
- package/dist/opportunities/opportunity.state.d.ts +0 -451
- package/dist/opportunities/opportunity.state.js +0 -256
- package/dist/opportunities/opportunity.tools.cards.d.ts +0 -138
- package/dist/opportunities/opportunity.tools.cards.js +0 -212
- package/dist/opportunities/opportunity.tools.d.ts +0 -12
- package/dist/opportunities/opportunity.tools.js +0 -236
- package/dist/opportunities/opportunity.tools.list.d.ts +0 -10
- package/dist/opportunities/opportunity.tools.list.js +0 -489
- package/dist/opportunities/opportunity.tools.port.d.ts +0 -16
- package/dist/opportunities/opportunity.utils.d.ts +0 -217
- package/dist/opportunities/opportunity.utils.js +0 -395
- package/dist/opportunities/outcome/outcome.env.d.ts +0 -60
- package/dist/opportunities/outcome/outcome.env.js +0 -63
- package/dist/opportunities/outcome/outcome.hypotheses.d.ts +0 -29
- package/dist/opportunities/outcome/outcome.hypotheses.js +0 -117
- package/dist/opportunities/outcome/outcome.shadow.d.ts +0 -56
- package/dist/opportunities/outcome/outcome.shadow.js +0 -87
- package/dist/opportunities/outcome/outcome.types.d.ts +0 -110
- package/dist/opportunities/outcome/outcome.types.js +0 -26
- package/dist/opportunities/radar/radar.health.d.ts +0 -31
- package/dist/opportunities/radar/radar.health.js +0 -75
- package/dist/premises/premise.analyzer.d.ts +0 -35
- package/dist/premises/premise.analyzer.js +0 -115
- package/dist/premises/premise.decomposer.d.ts +0 -69
- package/dist/premises/premise.decomposer.js +0 -213
- package/dist/premises/premise.graph.d.ts +0 -345
- package/dist/premises/premise.graph.js +0 -278
- package/dist/premises/premise.indexer.d.ts +0 -35
- package/dist/premises/premise.indexer.js +0 -86
- package/dist/premises/premise.state.d.ts +0 -67
- package/dist/premises/premise.state.js +0 -94
- package/dist/premises/premise.tools.d.ts +0 -3
- package/dist/premises/premise.tools.js +0 -248
- package/dist/questions/question.env.d.ts +0 -27
- package/dist/questions/question.env.js +0 -27
- package/dist/questions/question.input.d.ts +0 -107
- package/dist/questions/question.module.d.ts +0 -30
- package/dist/questions/question.module.js +0 -28
- package/dist/questions/question.schema.d.ts +0 -1529
- package/dist/questions/question.schema.js +0 -420
- package/dist/shared/agent/activity-projection.d.ts +0 -271
- package/dist/shared/agent/activity-projection.js +0 -254
- package/dist/shared/agent/canonical-guidance.d.ts +0 -30
- package/dist/shared/agent/canonical-guidance.js +0 -246
- package/dist/shared/agent/model.resolver.d.ts +0 -48
- package/dist/shared/agent/tool.factory.d.ts +0 -17
- package/dist/shared/agent/tool.factory.js +0 -221
- package/dist/shared/agent/tool.helpers.d.ts +0 -482
- package/dist/shared/agent/tool.helpers.js +0 -232
- package/dist/shared/agent/tool.registry.d.ts +0 -25
- package/dist/shared/agent/tool.registry.js +0 -76
- package/dist/shared/agent/tool.runtime.d.ts +0 -28
- package/dist/shared/agent/tool.runtime.js +0 -194
- package/dist/shared/agent/tool.scope.d.ts +0 -44
- package/dist/shared/agent/tool.scope.js +0 -50
- package/dist/shared/agent/utility.tools.d.ts +0 -15
- package/dist/shared/agent/utility.tools.js +0 -322
- package/dist/shared/assignment/network-assignment.policy.d.ts +0 -61
- package/dist/shared/assignment/network-assignment.policy.js +0 -105
- package/dist/shared/interfaces/agent-dispatcher.interface.d.ts +0 -100
- package/dist/shared/interfaces/agent-dispatcher.interface.js +0 -12
- package/dist/shared/interfaces/auth.interface.d.ts +0 -37
- package/dist/shared/interfaces/auth.interface.js +0 -1
- package/dist/shared/interfaces/chat-message-writer.interface.d.ts +0 -18
- package/dist/shared/interfaces/chat-message-writer.interface.js +0 -1
- package/dist/shared/interfaces/chat-session.interface.d.ts +0 -23
- package/dist/shared/interfaces/chat-session.interface.js +0 -18
- package/dist/shared/interfaces/chat-summary.interface.d.ts +0 -16
- package/dist/shared/interfaces/chat-summary.interface.js +0 -1
- package/dist/shared/interfaces/database.capabilities.d.ts +0 -100
- package/dist/shared/interfaces/database.interface.d.ts +0 -16
- package/dist/shared/interfaces/database.member-queries.d.ts +0 -219
- package/dist/shared/interfaces/database.member-queries.js +0 -4
- package/dist/shared/interfaces/database.negotiation.d.ts +0 -329
- package/dist/shared/interfaces/database.negotiation.js +0 -26
- package/dist/shared/interfaces/database.network-queries.js +0 -4
- package/dist/shared/interfaces/database.opportunity-queries.js +0 -4
- package/dist/shared/interfaces/delivery-ledger.interface.d.ts +0 -40
- package/dist/shared/interfaces/delivery-ledger.interface.js +0 -5
- package/dist/shared/interfaces/embedder.interface.d.ts +0 -92
- package/dist/shared/interfaces/embedder.interface.js +0 -4
- package/dist/shared/interfaces/enrichment-run.interface.d.ts +0 -62
- package/dist/shared/interfaces/enrichment-run.interface.js +0 -1
- package/dist/shared/interfaces/enrichment.interface.js +0 -1
- package/dist/shared/interfaces/negotiation-events.interface.d.ts +0 -77
- package/dist/shared/interfaces/negotiation-events.interface.js +0 -6
- package/dist/shared/interfaces/negotiation-summary.interface.d.ts +0 -25
- package/dist/shared/interfaces/negotiation-summary.interface.js +0 -1
- package/dist/shared/interfaces/negotiator-memory.interface.d.ts +0 -58
- package/dist/shared/interfaces/negotiator-memory.interface.js +0 -11
- package/dist/shared/interfaces/queue.interface.d.ts +0 -23
- package/dist/shared/interfaces/queue.interface.js +0 -4
- package/dist/shared/interfaces/scraper.interface.js +0 -1
- package/dist/shared/interfaces/tool-request-context.interface.d.ts +0 -11
- package/dist/shared/interfaces/tool-request-context.interface.js +0 -1
- package/dist/shared/observability/request-context.d.ts +0 -27
- package/dist/shared/observability/request-context.js +0 -6
- package/dist/shared/schemas/mcp-auth.schema.d.ts +0 -87
- package/dist/shared/schemas/mcp-auth.schema.js +0 -56
- package/dist/shared/schemas/negotiation-digest.schema.d.ts +0 -58
- package/dist/shared/schemas/negotiation-digest.schema.js +0 -38
- package/dist/shared/schemas/negotiation-state.schema.d.ts +0 -343
- package/dist/shared/schemas/negotiation-state.schema.js +0 -81
- package/dist/shared/schemas/question-block.fixture.d.ts +0 -12
- package/dist/shared/schemas/question-block.fixture.js +0 -39
- package/dist/shared/schemas/question-block.schema.d.ts +0 -111
- package/dist/shared/schemas/question-block.schema.js +0 -124
- package/dist/shared/schemas/structured-question.schema.d.ts +0 -66
- package/dist/shared/schemas/structured-question.schema.js +0 -31
- package/dist/shared/schemas/underspecification.schema.d.ts +0 -13
- package/dist/shared/schemas/underspecification.schema.js +0 -16
- /package/dist/{opportunities → internal/opportunities}/opportunity.update-admission.js +0 -0
- /package/dist/{opportunities → internal/opportunities}/radar/radar.state.js +0 -0
- /package/dist/{shared → internal/shared}/network/metadata.renderer.d.ts +0 -0
- /package/dist/{shared → internal/shared}/network/metadata.renderer.js +0 -0
- /package/dist/{shared → internal/shared}/observability/debug-meta.sanitizer.d.ts +0 -0
- /package/dist/{shared → internal/shared}/observability/debug-meta.sanitizer.js +0 -0
- /package/dist/{shared → internal/shared}/observability/performance.d.ts +0 -0
- /package/dist/{shared → internal/shared}/observability/performance.js +0 -0
- /package/dist/{shared → internal/shared}/observability/trace.d.ts +0 -0
- /package/dist/{shared → internal/shared}/observability/trace.js +0 -0
- /package/dist/{shared → internal/shared}/utils/claim-safety.d.ts +0 -0
- /package/dist/{shared → internal/shared}/utils/claim-safety.js +0 -0
- /package/dist/{shared → internal/shared}/utils/telegram-handle.d.ts +0 -0
- /package/dist/{shared → internal/shared}/utils/telegram-handle.js +0 -0
- /package/dist/{shared/interfaces/database.capabilities.js → platform/database/capabilities.js} +0 -0
- /package/dist/{shared/interfaces/database.entities.js → platform/database/entities.js} +0 -0
- /package/dist/{shared/interfaces/database.identity-queries.js → platform/database/identity-queries.js} +0 -0
- /package/dist/{agents/agent.dispatcher.port.js → platform/database/negotiation.js} +0 -0
- /package/dist/{chat/chat.persona.js → platform/database/opportunity-queries.js} +0 -0
- /package/dist/{contexts/context.tools.port.js → platform/discovery/embedder.js} +0 -0
- /package/dist/{shared/interfaces/scraper.interface.d.ts → platform/discovery/scraper.d.ts} +0 -0
- /package/dist/{negotiations/negotiation.deadlock.contracts.js → platform/discovery/scraper.js} +0 -0
- /package/dist/{shared/interfaces/enrichment.interface.d.ts → platform/enrichment/ports.d.ts} +0 -0
- /package/dist/{negotiations/negotiation.tools.port.js → platform/enrichment/ports.js} +0 -0
- /package/dist/{opportunities/opportunity.tools.port.js → platform/runtime/observability.js} +0 -0
- /package/dist/{questions/question.input.js → protocol/core.js} +0 -0
- /package/dist/{shared → protocol}/schemas/chat-context.schema.d.ts +0 -0
- /package/dist/{shared → protocol}/schemas/chat-context.schema.js +0 -0
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Helpers shared by the enrichment tools.
|
|
3
|
-
*
|
|
4
|
-
* These were nested functions inside `createEnrichmentTools`, closing over the
|
|
5
|
-
* destructured host capabilities. They are top-level now, each taking the tool
|
|
6
|
-
* deps explicitly, so the three tool modules can share them.
|
|
7
|
-
*/
|
|
8
|
-
import { z } from "zod";
|
|
9
|
-
import { requestContext } from "../shared/observability/request-context.js";
|
|
10
|
-
import { protocolLogger } from "../shared/observability/protocol.logger.js";
|
|
11
|
-
import { socialsToEnrichmentRequest } from "../shared/utils/social-label.js";
|
|
12
|
-
import { normalizeTelegramHandle } from "../shared/utils/telegram-handle.js";
|
|
13
|
-
import { focusedNetworkId } from "../shared/agent/tool.scope.js";
|
|
14
|
-
export const logger = protocolLogger("ChatTools:Enrichment");
|
|
15
|
-
export function isMeaningfulEnrichment(enrichment) {
|
|
16
|
-
return !!enrichment &&
|
|
17
|
-
enrichment.confidentMatch &&
|
|
18
|
-
(enrichment.identity.bio.trim().length > 0 ||
|
|
19
|
-
enrichment.narrative.context.trim().length > 0 ||
|
|
20
|
-
enrichment.attributes.skills.length > 0 ||
|
|
21
|
-
enrichment.attributes.interests.length > 0);
|
|
22
|
-
}
|
|
23
|
-
export const approvedProfileDraftSchema = z.object({
|
|
24
|
-
identity: z.object({ name: z.string(), bio: z.string(), location: z.string() }),
|
|
25
|
-
narrative: z.object({ context: z.string() }),
|
|
26
|
-
attributes: z.object({ interests: z.array(z.string()), skills: z.array(z.string()) }),
|
|
27
|
-
});
|
|
28
|
-
export function trimToUndefined(value) {
|
|
29
|
-
const trimmed = value?.trim();
|
|
30
|
-
return trimmed && trimmed.length > 0 ? trimmed : undefined;
|
|
31
|
-
}
|
|
32
|
-
export function isPlaceholderName(value) {
|
|
33
|
-
const normalized = value.trim().toLowerCase();
|
|
34
|
-
return normalized === 'unknown' || normalized === 'user';
|
|
35
|
-
}
|
|
36
|
-
export async function enrichFromUserRecord(deps, user) {
|
|
37
|
-
const enrichmentSocials = socialsToEnrichmentRequest(user.socials);
|
|
38
|
-
return deps.enricher.enrichUserProfile({
|
|
39
|
-
name: trimToUndefined(user.name),
|
|
40
|
-
email: trimToUndefined(user.email),
|
|
41
|
-
linkedin: enrichmentSocials.linkedin || undefined,
|
|
42
|
-
twitter: enrichmentSocials.twitter || undefined,
|
|
43
|
-
github: enrichmentSocials.github || undefined,
|
|
44
|
-
telegram: enrichmentSocials.telegram || undefined,
|
|
45
|
-
websites: enrichmentSocials.websites?.length ? enrichmentSocials.websites : undefined,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
export function selectProfileSeed(onboarding, networkId) {
|
|
49
|
-
const seeds = onboarding?.profileSeeds ?? [];
|
|
50
|
-
if (seeds.length === 0)
|
|
51
|
-
return undefined;
|
|
52
|
-
const scoped = networkId ? seeds.filter((seed) => seed.networkId === networkId) : seeds;
|
|
53
|
-
return scoped[scoped.length - 1];
|
|
54
|
-
}
|
|
55
|
-
export function normalizeSocialUpdate(label, value) {
|
|
56
|
-
const normalizedLabel = label.trim().toLowerCase();
|
|
57
|
-
if (!normalizedLabel)
|
|
58
|
-
return null;
|
|
59
|
-
const trimmedValue = value.trim();
|
|
60
|
-
if (!trimmedValue)
|
|
61
|
-
return null;
|
|
62
|
-
if (normalizedLabel === 'telegram') {
|
|
63
|
-
const handle = normalizeTelegramHandle(trimmedValue);
|
|
64
|
-
return handle ? { label: normalizedLabel, value: handle } : null;
|
|
65
|
-
}
|
|
66
|
-
return { label: normalizedLabel, value: trimmedValue };
|
|
67
|
-
}
|
|
68
|
-
export async function mergeUserSocials(deps, incoming) {
|
|
69
|
-
const normalizedIncoming = incoming
|
|
70
|
-
.map((social) => normalizeSocialUpdate(social.label, social.value))
|
|
71
|
-
.filter((social) => social !== null);
|
|
72
|
-
if (normalizedIncoming.length === 0)
|
|
73
|
-
return;
|
|
74
|
-
const existingSocials = await deps.userDb.getUserSocials();
|
|
75
|
-
const incomingLabels = new Set(normalizedIncoming.map((social) => social.label));
|
|
76
|
-
const kept = existingSocials
|
|
77
|
-
.filter((social) => !incomingLabels.has(social.label) || social.label === 'custom')
|
|
78
|
-
.map((social) => ({ label: social.label, value: social.value }));
|
|
79
|
-
const merged = incomingLabels.has('custom')
|
|
80
|
-
? [...kept.filter((social) => social.label !== 'custom'), ...normalizedIncoming]
|
|
81
|
-
: [...kept, ...normalizedIncoming];
|
|
82
|
-
await deps.userDb.setUserSocials(merged);
|
|
83
|
-
}
|
|
84
|
-
export function socialsRecordToRows(socials) {
|
|
85
|
-
if (!socials)
|
|
86
|
-
return [];
|
|
87
|
-
return Object.entries(socials).map(([label, value]) => ({ label, value }));
|
|
88
|
-
}
|
|
89
|
-
export async function enqueueEnrichmentRun(deps, context, operation, input) {
|
|
90
|
-
if (!context.isMcp || !deps.enrichmentRuns || !deps.enrichmentRunQueue)
|
|
91
|
-
return null;
|
|
92
|
-
const run = await deps.enrichmentRuns.create({
|
|
93
|
-
userId: context.userId,
|
|
94
|
-
agentId: context.agentId ?? null,
|
|
95
|
-
operation,
|
|
96
|
-
input,
|
|
97
|
-
context: {
|
|
98
|
-
userId: context.userId,
|
|
99
|
-
userName: context.userName,
|
|
100
|
-
userEmail: context.userEmail,
|
|
101
|
-
...(focusedNetworkId(context) ? { scopeType: 'network', scopeId: focusedNetworkId(context) } : {}),
|
|
102
|
-
...(context.indexName ? { indexName: context.indexName } : {}),
|
|
103
|
-
...(context.sessionId ? { sessionId: context.sessionId } : {}),
|
|
104
|
-
...(context.agentId ? { agentId: context.agentId } : {}),
|
|
105
|
-
},
|
|
106
|
-
});
|
|
107
|
-
try {
|
|
108
|
-
await deps.enrichmentRunQueue.enqueue(run.id);
|
|
109
|
-
}
|
|
110
|
-
catch (err) {
|
|
111
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
112
|
-
await deps.enrichmentRuns.markFailed(run.id, message);
|
|
113
|
-
if (err instanceof Error)
|
|
114
|
-
throw err;
|
|
115
|
-
const wrapped = new Error(`Failed to enqueue profile run: ${message}`);
|
|
116
|
-
wrapped.cause = err;
|
|
117
|
-
throw wrapped;
|
|
118
|
-
}
|
|
119
|
-
return run.id;
|
|
120
|
-
}
|
|
121
|
-
export async function persistApprovedProfileContext(deps, profile, user, networkId) {
|
|
122
|
-
await deps.userDb.updateUser({
|
|
123
|
-
name: profile.identity.name,
|
|
124
|
-
intro: profile.identity.bio,
|
|
125
|
-
location: profile.identity.location,
|
|
126
|
-
});
|
|
127
|
-
const onboarding = user?.onboarding ?? undefined;
|
|
128
|
-
const seed = selectProfileSeed(onboarding, networkId);
|
|
129
|
-
if (!seed?.socials?.length)
|
|
130
|
-
return;
|
|
131
|
-
await mergeUserSocials(deps, seed.socials);
|
|
132
|
-
}
|
|
133
|
-
export async function markApprovedProfileConfirmed(deps, context) {
|
|
134
|
-
const latestUser = await deps.userDb.getUser();
|
|
135
|
-
const currentOnboarding = latestUser?.onboarding ?? context.user.onboarding ?? {};
|
|
136
|
-
await deps.userDb.updateUser({
|
|
137
|
-
onboarding: {
|
|
138
|
-
...currentOnboarding,
|
|
139
|
-
profileConfirmedAt: currentOnboarding.profileConfirmedAt ?? new Date().toISOString(),
|
|
140
|
-
currentStep: currentOnboarding.completedAt
|
|
141
|
-
? currentOnboarding.currentStep ?? 'complete'
|
|
142
|
-
: 'first_signal',
|
|
143
|
-
},
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
export function buildProfileInput(parts) {
|
|
147
|
-
const lines = [];
|
|
148
|
-
if (parts.name)
|
|
149
|
-
lines.push(`Name: ${parts.name}`);
|
|
150
|
-
if (parts.location)
|
|
151
|
-
lines.push(`Location: ${parts.location}`);
|
|
152
|
-
if (parts.bioOrDescription)
|
|
153
|
-
lines.push(parts.bioOrDescription);
|
|
154
|
-
if (parts.socials?.length) {
|
|
155
|
-
lines.push(`User-provided public links:\n${parts.socials.map((s) => `${s.label}: ${s.value}`).join('\n')}`);
|
|
156
|
-
}
|
|
157
|
-
return lines.filter((line) => line.trim().length > 0).join('\n\n');
|
|
158
|
-
}
|
|
159
|
-
export function toProfileSummary(profile) {
|
|
160
|
-
return {
|
|
161
|
-
name: profile.identity.name,
|
|
162
|
-
bio: profile.identity.bio,
|
|
163
|
-
location: profile.identity.location,
|
|
164
|
-
skills: profile.attributes.skills,
|
|
165
|
-
interests: profile.attributes.interests,
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
export function buildApprovedDraftProfileInput(draft) {
|
|
169
|
-
return [
|
|
170
|
-
draft.identity.name ? `My name is ${draft.identity.name}.` : '',
|
|
171
|
-
draft.identity.location ? `I am based in ${draft.identity.location}.` : '',
|
|
172
|
-
draft.identity.bio || '',
|
|
173
|
-
draft.narrative.context || '',
|
|
174
|
-
draft.attributes.skills.length ? `My skills include ${draft.attributes.skills.join(', ')}.` : '',
|
|
175
|
-
draft.attributes.interests.length ? `My interests include ${draft.attributes.interests.join(', ')}.` : '',
|
|
176
|
-
].filter((part) => part.trim().length > 0).join('\n');
|
|
177
|
-
}
|
|
178
|
-
export async function decomposeApprovedDraftProfile(deps, profile) {
|
|
179
|
-
const input = buildApprovedDraftProfileInput(profile);
|
|
180
|
-
if (!input.trim())
|
|
181
|
-
return;
|
|
182
|
-
const traceEmitter = requestContext.getStore()?.traceEmitter;
|
|
183
|
-
const graphStart = Date.now();
|
|
184
|
-
traceEmitter?.({ type: "graph_start", name: "enrichment" });
|
|
185
|
-
try {
|
|
186
|
-
const graphInput = {
|
|
187
|
-
userId: profile.userId,
|
|
188
|
-
operationMode: 'write',
|
|
189
|
-
input,
|
|
190
|
-
forceUpdate: true,
|
|
191
|
-
};
|
|
192
|
-
// Always invoked as a background fire-and-forget task (see confirm_user_context
|
|
193
|
-
// call sites), so decomposition must outlive the originating request — invoke
|
|
194
|
-
// the graph directly and never bind the request abort signal, which would
|
|
195
|
-
// cancel it as soon as the web request completes.
|
|
196
|
-
const result = await deps.graphs.profile.invoke(graphInput);
|
|
197
|
-
if (result.error) {
|
|
198
|
-
const err = new Error(result.error);
|
|
199
|
-
logger.error('Approved draft premise decomposition failed', {
|
|
200
|
-
userId: profile.userId,
|
|
201
|
-
error: result.error,
|
|
202
|
-
});
|
|
203
|
-
deps.reportToolError?.(err, {
|
|
204
|
-
subsystem: 'enrichment',
|
|
205
|
-
operation: 'profile.confirm_draft_decompose',
|
|
206
|
-
toolName: 'confirm_user_context',
|
|
207
|
-
userId: profile.userId,
|
|
208
|
-
tags: { toolName: 'confirm_user_context', execution: 'background' },
|
|
209
|
-
});
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
// The write graph's decompose → aggregate → generate → save_profile
|
|
213
|
-
// pipeline persists the aggregate profile. The approved draft was already
|
|
214
|
-
// saved before decomposition started, so the DB is consistent regardless
|
|
215
|
-
// of graph outcome. Do not re-save here — the graph's save_profile is
|
|
216
|
-
// authoritative, and a concurrent user-driven profile update could race.
|
|
217
|
-
}
|
|
218
|
-
catch (err) {
|
|
219
|
-
logger.error('Approved draft premise decomposition failed', {
|
|
220
|
-
userId: profile.userId,
|
|
221
|
-
error: err instanceof Error ? err.message : String(err),
|
|
222
|
-
});
|
|
223
|
-
deps.reportToolError?.(err, {
|
|
224
|
-
subsystem: 'enrichment',
|
|
225
|
-
operation: 'profile.confirm_draft_decompose',
|
|
226
|
-
toolName: 'confirm_user_context',
|
|
227
|
-
userId: profile.userId,
|
|
228
|
-
tags: { toolName: 'confirm_user_context', execution: 'background' },
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
finally {
|
|
232
|
-
traceEmitter?.({ type: "graph_end", name: "enrichment", durationMs: Date.now() - graphStart });
|
|
233
|
-
}
|
|
234
|
-
}
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The enrichment tool registry.
|
|
3
|
-
*
|
|
4
|
-
* The user-context read and write tools live in sibling modules and the shared
|
|
5
|
-
* helpers in `enrichment.tools.helpers.ts`; this file owns the enrichment-run
|
|
6
|
-
* and onboarding tools and assembles the registry.
|
|
7
|
-
*/
|
|
8
|
-
import { z } from "zod";
|
|
9
|
-
import { success, error } from "../shared/agent/tool.helpers.js";
|
|
10
|
-
import { logger } from "./enrichment.tools.helpers.js";
|
|
11
|
-
import { createUserContextReadTools } from "./enrichment.tools.context-read.js";
|
|
12
|
-
import { createUserContextWriteTools } from "./enrichment.tools.context-write.js";
|
|
13
|
-
export function createEnrichmentTools(defineTool, deps, options = {}) {
|
|
14
|
-
const { userDb, systemDb, graphs, enricher, grantDefaultSystemPermissions, reportToolError, getUserContextText } = deps;
|
|
15
|
-
const isMcpSurface = options.surface === "mcp";
|
|
16
|
-
const { readUserContexts, previewUserContext, confirmUserContext } = createUserContextReadTools(defineTool, deps);
|
|
17
|
-
const { createUserContext, updateUserContext } = createUserContextWriteTools(defineTool, deps);
|
|
18
|
-
const getEnrichmentRun = defineTool({
|
|
19
|
-
name: "get_enrichment_run",
|
|
20
|
-
description: "Checks the status of an async profile preview/update run started by preview_user_context or update_user_context in MCP contexts. " +
|
|
21
|
-
"Poll this tool with the profileRunId until status is succeeded, failed, or cancelled. When succeeded, present the result to the user.",
|
|
22
|
-
querySchema: z.object({
|
|
23
|
-
profileRunId: z.string().describe("Profile run ID returned by preview_user_context or update_user_context."),
|
|
24
|
-
}),
|
|
25
|
-
handler: async ({ context, query }) => {
|
|
26
|
-
if (!deps.enrichmentRuns) {
|
|
27
|
-
return error("Profile run polling is not available in this environment.");
|
|
28
|
-
}
|
|
29
|
-
const run = await deps.enrichmentRuns.get(query.profileRunId, context.userId);
|
|
30
|
-
if (!run)
|
|
31
|
-
return error("Profile run not found.");
|
|
32
|
-
return success({
|
|
33
|
-
profileRunId: run.id,
|
|
34
|
-
operation: run.operation,
|
|
35
|
-
status: run.status,
|
|
36
|
-
progress: run.progress ?? null,
|
|
37
|
-
result: run.result ?? null,
|
|
38
|
-
error: run.error ?? null,
|
|
39
|
-
createdAt: run.createdAt.toISOString?.() ?? null,
|
|
40
|
-
startedAt: run.startedAt?.toISOString?.() ?? null,
|
|
41
|
-
completedAt: run.completedAt?.toISOString?.() ?? null,
|
|
42
|
-
});
|
|
43
|
-
},
|
|
44
|
-
});
|
|
45
|
-
const cancelEnrichmentRun = defineTool({
|
|
46
|
-
name: "cancel_enrichment_run",
|
|
47
|
-
description: "Requests cancellation for an async profile run. If the queued job has not started, it is removed and marked cancelled. " +
|
|
48
|
-
"If already running, the worker observes the cancellation request and aborts where supported.",
|
|
49
|
-
querySchema: z.object({
|
|
50
|
-
profileRunId: z.string().describe("Profile run ID returned by preview_user_context or update_user_context."),
|
|
51
|
-
}),
|
|
52
|
-
handler: async ({ context, query }) => {
|
|
53
|
-
if (!deps.enrichmentRuns || !deps.enrichmentRunQueue) {
|
|
54
|
-
return error("Profile run cancellation is not available in this environment.");
|
|
55
|
-
}
|
|
56
|
-
const existing = await deps.enrichmentRuns.get(query.profileRunId, context.userId);
|
|
57
|
-
if (!existing)
|
|
58
|
-
return error("Profile run not found.");
|
|
59
|
-
if (!["queued", "running"].includes(existing.status)) {
|
|
60
|
-
return success({
|
|
61
|
-
profileRunId: existing.id,
|
|
62
|
-
status: existing.status,
|
|
63
|
-
message: `Profile run is already ${existing.status}.`,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
const run = await deps.enrichmentRuns.requestCancel(query.profileRunId, context.userId);
|
|
67
|
-
if (!run)
|
|
68
|
-
return error("Profile run not found or cannot be cancelled.");
|
|
69
|
-
const removed = await deps.enrichmentRunQueue.cancel(run.id);
|
|
70
|
-
if (removed) {
|
|
71
|
-
await deps.enrichmentRuns.markCancelled(run.id, "cancelled before worker start");
|
|
72
|
-
}
|
|
73
|
-
const updated = await deps.enrichmentRuns.get(run.id, context.userId);
|
|
74
|
-
return success({
|
|
75
|
-
profileRunId: run.id,
|
|
76
|
-
status: updated?.status ?? run.status,
|
|
77
|
-
cancelled: true,
|
|
78
|
-
message: removed
|
|
79
|
-
? "Profile run cancelled before it started."
|
|
80
|
-
: "Cancellation requested while the profile run is running or queued.",
|
|
81
|
-
});
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
const completeOnboarding = isMcpSurface ? null : defineTool({
|
|
85
|
-
name: "complete_onboarding",
|
|
86
|
-
description: "Marks the user's onboarding as complete after validating the durable approved-profile marker and a persisted active first signal created at or after that approval. " +
|
|
87
|
-
"Web onboarding should pass the exact intentId returned by /intents/confirm; legacy clients may omit it and use any eligible active intent. " +
|
|
88
|
-
"This records firstSignalIntentId/currentStep and is idempotent.",
|
|
89
|
-
querySchema: z.object({
|
|
90
|
-
intentId: z.string().min(1).optional().describe("Exact first-signal ID returned by the confirmation endpoint."),
|
|
91
|
-
}).strict(),
|
|
92
|
-
handler: async ({ context, query }) => {
|
|
93
|
-
const currentUser = await userDb.getUser();
|
|
94
|
-
const currentOnboarding = currentUser?.onboarding ?? context.user.onboarding ?? {};
|
|
95
|
-
if (currentOnboarding.completedAt) {
|
|
96
|
-
logger.verbose("Onboarding already completed, skipping", { userId: context.userId });
|
|
97
|
-
return success({
|
|
98
|
-
message: "Onboarding already completed.",
|
|
99
|
-
completedAt: currentOnboarding.completedAt,
|
|
100
|
-
...(currentOnboarding.firstSignalIntentId
|
|
101
|
-
? { intentId: currentOnboarding.firstSignalIntentId }
|
|
102
|
-
: {}),
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
if (!currentOnboarding.profileConfirmedAt) {
|
|
106
|
-
return error("Onboarding cannot be completed until the user has a confirmed profile. Show the profile draft, get explicit approval, then save it before finishing onboarding.");
|
|
107
|
-
}
|
|
108
|
-
const profileConfirmedAtMs = Date.parse(currentOnboarding.profileConfirmedAt);
|
|
109
|
-
if (!Number.isFinite(profileConfirmedAtMs)) {
|
|
110
|
-
return error("Onboarding cannot be completed because the durable profile confirmation timestamp is invalid. Confirm the approved profile again before finishing onboarding.");
|
|
111
|
-
}
|
|
112
|
-
const activeIntents = await userDb.getActiveIntents();
|
|
113
|
-
const isEligibleFirstSignal = (intent) => {
|
|
114
|
-
const createdAtMs = intent.createdAt.getTime();
|
|
115
|
-
return Number.isFinite(createdAtMs) && createdAtMs >= profileConfirmedAtMs;
|
|
116
|
-
};
|
|
117
|
-
const firstSignal = query.intentId
|
|
118
|
-
? activeIntents.find((intent) => intent.id === query.intentId)
|
|
119
|
-
: activeIntents.find(isEligibleFirstSignal);
|
|
120
|
-
if (!firstSignal) {
|
|
121
|
-
return error(query.intentId
|
|
122
|
-
? "Onboarding cannot be completed because the confirmed first signal is not active for this user."
|
|
123
|
-
: "Onboarding cannot be completed until the user has at least one active intent created after profile confirmation. Ask what they are open to right now and create the first signal before finishing onboarding.");
|
|
124
|
-
}
|
|
125
|
-
if (!isEligibleFirstSignal(firstSignal)) {
|
|
126
|
-
return error("Onboarding cannot be completed because the selected first signal was created before profile confirmation. Create and confirm a new signal before finishing onboarding.");
|
|
127
|
-
}
|
|
128
|
-
const completedAt = new Date().toISOString();
|
|
129
|
-
await userDb.updateUser({
|
|
130
|
-
onboarding: {
|
|
131
|
-
...currentOnboarding,
|
|
132
|
-
firstSignalIntentId: firstSignal.id,
|
|
133
|
-
currentStep: 'complete',
|
|
134
|
-
completedAt,
|
|
135
|
-
},
|
|
136
|
-
});
|
|
137
|
-
if (grantDefaultSystemPermissions) {
|
|
138
|
-
try {
|
|
139
|
-
await grantDefaultSystemPermissions(context.userId);
|
|
140
|
-
}
|
|
141
|
-
catch (err) {
|
|
142
|
-
logger.warn('Default system agent permission grant failed (non-fatal)', {
|
|
143
|
-
userId: context.userId,
|
|
144
|
-
error: err instanceof Error ? err.message : String(err),
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
logger.info("Onboarding completed", { userId: context.userId, intentId: firstSignal.id });
|
|
149
|
-
return success({ message: "Onboarding complete.", intentId: firstSignal.id, completedAt });
|
|
150
|
-
},
|
|
151
|
-
});
|
|
152
|
-
return [readUserContexts, previewUserContext, confirmUserContext, createUserContext, updateUserContext, getEnrichmentRun, cancelEnrichmentRun, completeOnboarding];
|
|
153
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Intent graph, stages 0-1: load the user's signals, then infer new ones.
|
|
3
|
-
*/
|
|
4
|
-
import type { DebugMetaAgent } from "../../agents/agent.module.js";
|
|
5
|
-
import { type IntentGraphDeps, type IntentState } from "./intent.graph.shared.js";
|
|
6
|
-
/**
|
|
7
|
-
* Node 0: Prep
|
|
8
|
-
* Always fetches ALL of the user's active intents from the DB via getActiveIntents(userId).
|
|
9
|
-
* This ensures reconciliation can detect duplicates and modifications globally,
|
|
10
|
-
* regardless of network scope.
|
|
11
|
-
*/
|
|
12
|
-
export declare function prepNode(state: IntentState, deps: IntentGraphDeps): Promise<{
|
|
13
|
-
error: string;
|
|
14
|
-
activeIntents?: undefined;
|
|
15
|
-
activeIntentIds?: undefined;
|
|
16
|
-
trace?: undefined;
|
|
17
|
-
} | {
|
|
18
|
-
activeIntents: string;
|
|
19
|
-
activeIntentIds: string[];
|
|
20
|
-
trace: {
|
|
21
|
-
node: string;
|
|
22
|
-
detail: string;
|
|
23
|
-
}[];
|
|
24
|
-
error?: undefined;
|
|
25
|
-
}>;
|
|
26
|
-
/**
|
|
27
|
-
* Node 1: Inference
|
|
28
|
-
* Extracts intents from raw content.
|
|
29
|
-
* Phase 4: Uses operation mode to control behavior and determine if node should execute.
|
|
30
|
-
* Phase 5: Passes conversation context for anaphoric resolution.
|
|
31
|
-
*/
|
|
32
|
-
export declare function inferenceNode(state: IntentState, deps: IntentGraphDeps): Promise<{
|
|
33
|
-
inferredIntents: {
|
|
34
|
-
reasoning: string;
|
|
35
|
-
type: "goal" | "tombstone";
|
|
36
|
-
confidence: "low" | "medium" | "high";
|
|
37
|
-
description: string;
|
|
38
|
-
}[];
|
|
39
|
-
agentTimings: DebugMetaAgent[];
|
|
40
|
-
trace: {
|
|
41
|
-
node: string;
|
|
42
|
-
detail: string;
|
|
43
|
-
}[];
|
|
44
|
-
}>;
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Intent graph, stages 0-1: load the user's signals, then infer new ones.
|
|
3
|
-
*/
|
|
4
|
-
import { timed } from "../../shared/observability/performance.js";
|
|
5
|
-
import { requestContext } from "../../shared/observability/request-context.js";
|
|
6
|
-
import { logger } from "./intent.graph.shared.js";
|
|
7
|
-
/**
|
|
8
|
-
* Node 0: Prep
|
|
9
|
-
* Always fetches ALL of the user's active intents from the DB via getActiveIntents(userId).
|
|
10
|
-
* This ensures reconciliation can detect duplicates and modifications globally,
|
|
11
|
-
* regardless of network scope.
|
|
12
|
-
*/
|
|
13
|
-
export async function prepNode(state, deps) {
|
|
14
|
-
return timed("IntentGraph.prep", async () => {
|
|
15
|
-
logger.verbose("Starting preparation phase", {
|
|
16
|
-
operationMode: state.operationMode,
|
|
17
|
-
hasContent: !!state.inputContent,
|
|
18
|
-
targetIntentIds: state.targetIntentIds,
|
|
19
|
-
networkId: state.networkId,
|
|
20
|
-
});
|
|
21
|
-
// Gate: write operations require an existing profile
|
|
22
|
-
if (state.operationMode !== 'read') {
|
|
23
|
-
const profile = await deps.database.getProfile(state.userId);
|
|
24
|
-
if (!profile) {
|
|
25
|
-
const msg = "You need to create a profile before creating intents. Please set up your profile first.";
|
|
26
|
-
logger.error("Prep failed: no profile for user", { userId: state.userId });
|
|
27
|
-
return { error: msg };
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
const activeIntents = await deps.database.getActiveIntents(state.userId);
|
|
31
|
-
const formattedActiveIntents = activeIntents
|
|
32
|
-
.map(i => `ID: ${i.id}, Description: ${i.payload}, Summary: ${i.summary || 'N/A'}`)
|
|
33
|
-
.join('\n') || "No active intents.";
|
|
34
|
-
logger.verbose("Fetched active intents", {
|
|
35
|
-
count: activeIntents.length,
|
|
36
|
-
operationMode: state.operationMode
|
|
37
|
-
});
|
|
38
|
-
return {
|
|
39
|
-
activeIntents: formattedActiveIntents,
|
|
40
|
-
activeIntentIds: activeIntents.map((intent) => intent.id),
|
|
41
|
-
trace: [{
|
|
42
|
-
node: "prep",
|
|
43
|
-
detail: `Fetched ${activeIntents.length} active intent(s)`,
|
|
44
|
-
}],
|
|
45
|
-
};
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Node 1: Inference
|
|
50
|
-
* Extracts intents from raw content.
|
|
51
|
-
* Phase 4: Uses operation mode to control behavior and determine if node should execute.
|
|
52
|
-
* Phase 5: Passes conversation context for anaphoric resolution.
|
|
53
|
-
*/
|
|
54
|
-
export async function inferenceNode(state, deps) {
|
|
55
|
-
return timed("IntentGraph.inference", async () => {
|
|
56
|
-
logger.verbose("Starting inference", {
|
|
57
|
-
operationMode: state.operationMode,
|
|
58
|
-
hasContent: !!state.inputContent,
|
|
59
|
-
contentPreview: state.inputContent?.substring(0, 50),
|
|
60
|
-
hasConversationContext: !!state.conversationContext,
|
|
61
|
-
conversationMessagesCount: state.conversationContext?.length || 0
|
|
62
|
-
});
|
|
63
|
-
const agentTimingsAccum = [];
|
|
64
|
-
// Phase 4: Control profile fallback based on operation mode
|
|
65
|
-
// Only allow for create operations without explicit content
|
|
66
|
-
const allowProfileFallback = state.operationMode === 'create' && !state.inputContent;
|
|
67
|
-
// Cast operationMode: 'read' and 'propose' map to 'create' for the deps.inferrer
|
|
68
|
-
// (inference node is never called in read mode; propose behaves like create for inference)
|
|
69
|
-
const inferrerMode = (state.operationMode === 'read' || state.operationMode === 'propose') ? 'create' : state.operationMode;
|
|
70
|
-
const _traceEmitterInferrer = requestContext.getStore()?.traceEmitter;
|
|
71
|
-
const inferrerStart = Date.now();
|
|
72
|
-
_traceEmitterInferrer?.({ type: "agent_start", name: "intent-inferrer" });
|
|
73
|
-
const result = await deps.inferrer.invoke(state.inputContent || null, state.userProfile, {
|
|
74
|
-
allowProfileFallback,
|
|
75
|
-
operationMode: inferrerMode,
|
|
76
|
-
conversationContext: state.conversationContext // Phase 5: Pass conversation history
|
|
77
|
-
});
|
|
78
|
-
agentTimingsAccum.push({ name: 'intent.inferrer', durationMs: Date.now() - inferrerStart });
|
|
79
|
-
_traceEmitterInferrer?.({ type: "agent_end", name: "intent-inferrer", durationMs: Date.now() - inferrerStart, summary: result.intents.length > 0 ? `Extracted ${result.intents.length} intent(s)` : "intent-inferrer completed" });
|
|
80
|
-
logger.verbose("Inference complete", {
|
|
81
|
-
inferredCount: result.intents.length,
|
|
82
|
-
operationMode: state.operationMode
|
|
83
|
-
});
|
|
84
|
-
const descriptions = result.intents.map(i => i.description).slice(0, 3);
|
|
85
|
-
const truncated = result.intents.length > 3 ? `... +${result.intents.length - 3} more` : "";
|
|
86
|
-
return {
|
|
87
|
-
inferredIntents: result.intents,
|
|
88
|
-
agentTimings: agentTimingsAccum,
|
|
89
|
-
trace: [{
|
|
90
|
-
node: "inference",
|
|
91
|
-
detail: result.intents.length === 0
|
|
92
|
-
? "No intents extracted"
|
|
93
|
-
: `Extracted ${result.intents.length}: ${descriptions.map(d => `"${d.slice(0, 50)}${d.length > 50 ? '...' : ''}"`).join(", ")}${truncated}`,
|
|
94
|
-
}],
|
|
95
|
-
};
|
|
96
|
-
});
|
|
97
|
-
}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Intent graph: prep → (query | inference → verification → reconciler → executor).
|
|
3
|
-
*
|
|
4
|
-
* Every node is a top-level function in a sibling module, taking the graph
|
|
5
|
-
* state and an explicit {@link IntentGraphDeps}. This file composes the
|
|
6
|
-
* dependency bag and wires the edges — nothing else.
|
|
7
|
-
*/
|
|
8
|
-
import { StateGraph, START, END } from "@langchain/langgraph";
|
|
9
|
-
import { ExplicitIntentInferrer } from "../intent.inferrer.js";
|
|
10
|
-
import { SemanticVerifier } from "../intent.verifier.js";
|
|
11
|
-
import { IntentReconciler } from "../intent.reconciler.js";
|
|
12
|
-
import { IntentGraphState } from "./intent.graph.state.js";
|
|
13
|
-
import { logger } from "./intent.graph.shared.js";
|
|
14
|
-
import { inferenceNode, prepNode } from "./intent.graph.infer.js";
|
|
15
|
-
import { reconciliationNode, verificationNode } from "./intent.graph.reconcile.js";
|
|
16
|
-
import { executorNode, queryNode } from "./intent.graph.execute.js";
|
|
17
|
-
export { buildExplicitUpdateActions, enforceIntentActionBoundary } from "./intent.graph.shared.js";
|
|
18
|
-
export class IntentGraphFactory {
|
|
19
|
-
constructor(database, embedder, intentQueue, agents) {
|
|
20
|
-
this.deps = {
|
|
21
|
-
database,
|
|
22
|
-
embedder,
|
|
23
|
-
intentQueue,
|
|
24
|
-
inferrer: agents?.inferrer ?? new ExplicitIntentInferrer(),
|
|
25
|
-
verifier: agents?.verifier ?? new SemanticVerifier(),
|
|
26
|
-
reconciler: agents?.reconciler ?? new IntentReconciler(),
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
createGraph() {
|
|
30
|
-
const deps = this.deps;
|
|
31
|
-
return new StateGraph(IntentGraphState)
|
|
32
|
-
.addNode("prep", (state) => prepNode(state, deps))
|
|
33
|
-
.addNode("query", (state) => queryNode(state, deps))
|
|
34
|
-
.addNode("inference", (state) => inferenceNode(state, deps))
|
|
35
|
-
.addNode("verification", (state) => verificationNode(state, deps))
|
|
36
|
-
.addNode("reconciler", (state) => reconciliationNode(state, deps))
|
|
37
|
-
.addNode("executor", (state) => executorNode(state, deps))
|
|
38
|
-
// Flow paths:
|
|
39
|
-
// - READ: prep → query → END (fast path, no LLM calls)
|
|
40
|
-
// - CREATE: prep → inference → verification → reconciler → executor → END
|
|
41
|
-
// - UPDATE: prep → inference → reconciliation → executor → END (skips verification if no new intents)
|
|
42
|
-
// - DELETE: prep → reconciliation → executor → END (skips inference and verification)
|
|
43
|
-
// - PROPOSE: prep → inference → verification → END (no reconciliation/execution, no DB writes)
|
|
44
|
-
.addEdge(START, "prep")
|
|
45
|
-
// After prep: read mode → query; else inference or reconciler
|
|
46
|
-
.addConditionalEdges("prep", afterPrepRoute, {
|
|
47
|
-
query: "query",
|
|
48
|
-
inference: "inference",
|
|
49
|
-
reconciler: "reconciler",
|
|
50
|
-
__end__: END,
|
|
51
|
-
})
|
|
52
|
-
// Query (read mode) always ends
|
|
53
|
-
.addEdge("query", END)
|
|
54
|
-
// After inference: decide if we need verification (skip if no intents)
|
|
55
|
-
.addConditionalEdges("inference", shouldRunVerification, {
|
|
56
|
-
verification: "verification",
|
|
57
|
-
reconciler: "reconciler",
|
|
58
|
-
__end__: END,
|
|
59
|
-
})
|
|
60
|
-
// After verification: propose mode exits early; others continue to reconciliation
|
|
61
|
-
.addConditionalEdges("verification", routeAfterVerification, {
|
|
62
|
-
reconciler: "reconciler",
|
|
63
|
-
__end__: END,
|
|
64
|
-
})
|
|
65
|
-
// Reconciliation always goes to executor
|
|
66
|
-
.addEdge("reconciler", "executor")
|
|
67
|
-
// Executor is always the end
|
|
68
|
-
.addEdge("executor", END)
|
|
69
|
-
.compile();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* After prep: read mode → query; otherwise decide inference vs reconciler by operation mode.
|
|
74
|
-
*/
|
|
75
|
-
export function afterPrepRoute(state) {
|
|
76
|
-
if (state.error) {
|
|
77
|
-
logger.warn('Prep failed with error, short-circuiting to END', { error: state.error });
|
|
78
|
-
return '__end__';
|
|
79
|
-
}
|
|
80
|
-
if (state.operationMode === 'read') {
|
|
81
|
-
logger.verbose('Read mode - routing to query (fast path)');
|
|
82
|
-
return 'query';
|
|
83
|
-
}
|
|
84
|
-
return shouldRunInference(state);
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Determines if inference should run based on operation mode.
|
|
88
|
-
* Delete operations skip inference entirely and go straight to reconciliation.
|
|
89
|
-
*/
|
|
90
|
-
export function shouldRunInference(state) {
|
|
91
|
-
if (state.operationMode === 'delete') {
|
|
92
|
-
logger.verbose('Delete mode - skipping inference, routing to reconciliation');
|
|
93
|
-
return 'reconciler';
|
|
94
|
-
}
|
|
95
|
-
logger.verbose('Running inference', {
|
|
96
|
-
operationMode: state.operationMode
|
|
97
|
-
});
|
|
98
|
-
return 'inference';
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Determines if verification should run based on operation mode and inferred intents.
|
|
102
|
-
* Skips verification for:
|
|
103
|
-
* - Operations with no inferred intents
|
|
104
|
-
* - Can be extended to skip for update operations with no new intents
|
|
105
|
-
*/
|
|
106
|
-
export function shouldRunVerification(state) {
|
|
107
|
-
if (state.inferredIntents.length === 0) {
|
|
108
|
-
if (state.operationMode === 'propose') {
|
|
109
|
-
logger.verbose('Propose mode with no inferred intents - exiting early');
|
|
110
|
-
return '__end__';
|
|
111
|
-
}
|
|
112
|
-
logger.verbose('No intents to verify - skipping verification, routing to reconciliation');
|
|
113
|
-
return 'reconciler';
|
|
114
|
-
}
|
|
115
|
-
if (state.operationMode === 'update') {
|
|
116
|
-
logger.verbose('Update mode with new intents - running verification');
|
|
117
|
-
return 'verification';
|
|
118
|
-
}
|
|
119
|
-
if (state.operationMode === 'create') {
|
|
120
|
-
logger.verbose('Create mode - running verification');
|
|
121
|
-
return 'verification';
|
|
122
|
-
}
|
|
123
|
-
// Default to verification for safety
|
|
124
|
-
logger.verbose('Default routing to verification');
|
|
125
|
-
return 'verification';
|
|
126
|
-
}
|
|
127
|
-
/** After verification: propose mode exits early; others continue to reconciliation. */
|
|
128
|
-
export function routeAfterVerification(state) {
|
|
129
|
-
if (state.operationMode === 'propose') {
|
|
130
|
-
logger.verbose('Propose mode - stopping after verification, skipping reconciliation');
|
|
131
|
-
return '__end__';
|
|
132
|
-
}
|
|
133
|
-
return 'reconciler';
|
|
134
|
-
}
|