@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.
- 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,255 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deterministic signal-intake stage logic.
|
|
3
|
-
*
|
|
4
|
-
* The fast intake path is a fixed funnel, so stages are driven here rather than
|
|
5
|
-
* by an agent loop: round 1 comes from the precomputed pack, round 2 is one
|
|
6
|
-
* structured call, round 3 is a deterministic client-side picker, and synthesis
|
|
7
|
-
* is one structured call. This module owns no I/O.
|
|
8
|
-
*/
|
|
9
|
-
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
|
|
10
|
-
import { z } from "zod";
|
|
11
|
-
import { createStructuredModel } from "../../shared/agent/model.config.js";
|
|
12
|
-
import { normalizeIntakePack } from "./intake.pack.generator.js";
|
|
13
|
-
const optionSchema = z.object({
|
|
14
|
-
label: z.string().min(1),
|
|
15
|
-
description: z.string(),
|
|
16
|
-
});
|
|
17
|
-
const answerFirstQuestionSchema = z.object({
|
|
18
|
-
missingAxis: z
|
|
19
|
-
.enum(["purpose", "desired_attributes", "exchange", "constraint"])
|
|
20
|
-
.describe("The unanswered decision axis selected only from the answered intake rounds."),
|
|
21
|
-
title: z.string(),
|
|
22
|
-
prompt: z.string().min(1),
|
|
23
|
-
answerGroundedOptions: z
|
|
24
|
-
.array(optionSchema)
|
|
25
|
-
.min(2)
|
|
26
|
-
.max(3)
|
|
27
|
-
.describe("Two or three distinct choices derived only from the answered intake rounds."),
|
|
28
|
-
multiSelect: z.boolean(),
|
|
29
|
-
});
|
|
30
|
-
const followUpPlanSchema = z.object({
|
|
31
|
-
questions: z.array(answerFirstQuestionSchema),
|
|
32
|
-
plannedFollowUpCount: z.number().int().min(0),
|
|
33
|
-
});
|
|
34
|
-
const profileBridgePlanSchema = z.object({
|
|
35
|
-
bridges: z.array(z.object({
|
|
36
|
-
questionIndex: z.number().int().min(0),
|
|
37
|
-
profileBridgeOption: optionSchema
|
|
38
|
-
.nullable()
|
|
39
|
-
.describe("One natural profile intersection, or null when the bridge would be forced."),
|
|
40
|
-
})),
|
|
41
|
-
});
|
|
42
|
-
const synthesisSchema = z.object({
|
|
43
|
-
description: z.string().min(1),
|
|
44
|
-
lookingFor: z.string().min(1),
|
|
45
|
-
youBring: z.string().min(1),
|
|
46
|
-
});
|
|
47
|
-
/** Static round-1 question used only when pack generation fails outright. */
|
|
48
|
-
export const FALLBACK_WHO_QUESTION = {
|
|
49
|
-
title: "Question 1",
|
|
50
|
-
prompt: "Who do you want to meet right now?",
|
|
51
|
-
options: [
|
|
52
|
-
{ label: "A collaborator", description: "Someone to build or work on something with" },
|
|
53
|
-
{ label: "A customer or user", description: "Someone who has the problem you solve" },
|
|
54
|
-
{ label: "An expert", description: "Someone who has done this before" },
|
|
55
|
-
{ label: "A peer", description: "Someone at a similar stage to compare notes with" },
|
|
56
|
-
],
|
|
57
|
-
multiSelect: false,
|
|
58
|
-
};
|
|
59
|
-
/** Static round-2 question used when live generation fails. */
|
|
60
|
-
export const FALLBACK_BRING_QUESTION = {
|
|
61
|
-
title: "Question 2",
|
|
62
|
-
prompt: "What would you bring, and what gap should they fill?",
|
|
63
|
-
options: [
|
|
64
|
-
{ label: "Hands-on expertise", description: "You can do the work with them" },
|
|
65
|
-
{ label: "Introductions and reach", description: "You can open doors for them" },
|
|
66
|
-
{ label: "Funding or resources", description: "You can back what they are doing" },
|
|
67
|
-
{ label: "A mutual exchange", description: "You each cover the other's gap" },
|
|
68
|
-
],
|
|
69
|
-
multiSelect: false,
|
|
70
|
-
};
|
|
71
|
-
const PLAN_SYSTEM_PROMPT = `You plan and write answer-first follow-up intake questions for a networking product.
|
|
72
|
-
|
|
73
|
-
You receive ONLY the answered intake rounds. Use them to choose the next missing
|
|
74
|
-
axis, write a standalone prompt that names the newly stated person or domain, and
|
|
75
|
-
create 2-3 meaningfully distinct answerGroundedOptions. Choose the most useful
|
|
76
|
-
unanswered axis from: purpose, desired_attributes, exchange, or constraint. Never
|
|
77
|
-
re-ask an axis the rounds already answer. Do not infer a professional background,
|
|
78
|
-
industry, capability, or commercial goal that the rounds do not state.
|
|
79
|
-
|
|
80
|
-
Every answerGroundedOption must be visibly anchored to the stated person or domain
|
|
81
|
-
in its label or description and represent a concrete, distinct path. Generic labels
|
|
82
|
-
such as "Learn", "Share", "Collaborate", or "Networking" are invalid when they do
|
|
83
|
-
not say what the user would learn, share, collaborate on, or network about.
|
|
84
|
-
- Scuba divers: "Learn diving techniques", "Find dive buddies", "Share dive stories".
|
|
85
|
-
- Climate founders: "Compare climate sectors", "Find climate peers", "Discuss adaptation".
|
|
86
|
-
|
|
87
|
-
Each option needs a short label and a one-line description. Set multiSelect true
|
|
88
|
-
only when several options can genuinely apply together. Never expose raw JSON,
|
|
89
|
-
IDs, or internal vocabulary. plannedFollowUpCount is the TOTAL number of follow-up
|
|
90
|
-
questions the interview should contain, including any returned now; when the input
|
|
91
|
-
already fixes it, echo that value unchanged.`;
|
|
92
|
-
const PROFILE_BRIDGE_SYSTEM_PROMPT = `You may append one optional profile bridge to each already-written signal-intake question.
|
|
93
|
-
|
|
94
|
-
The question, missing axis, and answer-grounded options are immutable. For each
|
|
95
|
-
questionIndex, compare them with the profile brief and return either one genuinely
|
|
96
|
-
useful profileBridgeOption or null. A bridge is useful only when it creates a
|
|
97
|
-
natural additional path that is not already represented. Never rewrite, replace,
|
|
98
|
-
remove, or reclassify a core option. Never return more than one bridge per question.
|
|
99
|
-
When the profile theme is unrelated or the intersection would feel forced, return
|
|
100
|
-
null. Running club + investor may support one sponsorship bridge; scuba divers +
|
|
101
|
-
pianist should return null.`;
|
|
102
|
-
const SYNTHESIS_SYSTEM_PROMPT = `You write one clear signal for a networking product.
|
|
103
|
-
|
|
104
|
-
Combine the brief and the person's answers into a specific description of who they
|
|
105
|
-
want to meet, what they bring or need, and any stated constraint. Write it in the
|
|
106
|
-
person's own voice, first person, 1-3 sentences, concrete and free of hype. Also
|
|
107
|
-
return short "lookingFor" and "youBring" summaries for the confirmation card.
|
|
108
|
-
When revision feedback is present, it is the person correcting a draft they
|
|
109
|
-
already read: apply it to the whole signal rather than treating it as a place or
|
|
110
|
-
community constraint. Never invent facts beyond the brief and the answers.`;
|
|
111
|
-
/**
|
|
112
|
-
* Render an answer as a human-readable label.
|
|
113
|
-
*
|
|
114
|
-
* @param answer - Selected options plus optional free text
|
|
115
|
-
* @returns Comma-joined non-empty parts
|
|
116
|
-
*/
|
|
117
|
-
export function answerLabel(answer) {
|
|
118
|
-
return [...answer.selectedOptions, answer.freeText?.trim() ?? ""].filter(Boolean).join(", ");
|
|
119
|
-
}
|
|
120
|
-
function normalizeFollowUpQuestion(question, profileBridge, brief) {
|
|
121
|
-
const seen = new Set();
|
|
122
|
-
const normalizeOption = (option) => {
|
|
123
|
-
const label = option.label.trim();
|
|
124
|
-
const key = label.toLocaleLowerCase();
|
|
125
|
-
if (!label || seen.has(key))
|
|
126
|
-
return null;
|
|
127
|
-
seen.add(key);
|
|
128
|
-
return { label, description: option.description.trim() };
|
|
129
|
-
};
|
|
130
|
-
const answerGroundedOptions = question.answerGroundedOptions
|
|
131
|
-
.map(normalizeOption)
|
|
132
|
-
.filter((option) => option !== null)
|
|
133
|
-
.slice(0, 3);
|
|
134
|
-
if (answerGroundedOptions.length < 2) {
|
|
135
|
-
throw new Error("Follow-up question needs at least two answer-grounded options.");
|
|
136
|
-
}
|
|
137
|
-
const profileBridgeOption = profileBridge ? normalizeOption(profileBridge) : null;
|
|
138
|
-
return normalizeIntakePack({
|
|
139
|
-
brief,
|
|
140
|
-
question: {
|
|
141
|
-
title: question.title,
|
|
142
|
-
prompt: question.prompt,
|
|
143
|
-
options: [
|
|
144
|
-
...answerGroundedOptions,
|
|
145
|
-
...(profileBridgeOption ? [profileBridgeOption] : []),
|
|
146
|
-
],
|
|
147
|
-
multiSelect: question.multiSelect,
|
|
148
|
-
},
|
|
149
|
-
}).question;
|
|
150
|
-
}
|
|
151
|
-
/** Runs the two live stages of the fast intake funnel: follow-up planning and synthesis. */
|
|
152
|
-
export class SignalIntakeOrchestrator {
|
|
153
|
-
/**
|
|
154
|
-
* @param models - Optional injected structured models. Tests pass stubs.
|
|
155
|
-
*/
|
|
156
|
-
constructor(models) {
|
|
157
|
-
this.plannerModel = models?.planner
|
|
158
|
-
?? createStructuredModel("signalIntakePack", followUpPlanSchema);
|
|
159
|
-
this.profileBridgeModel = models?.profileBridge
|
|
160
|
-
?? createStructuredModel("signalIntakePack", profileBridgePlanSchema, { name: "signal_intake_profile_bridges" });
|
|
161
|
-
this.synthesisModel = models?.synthesis
|
|
162
|
-
?? createStructuredModel("signalIntakePack", synthesisSchema);
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Plan and write follow-up questions from the brief and answered rounds.
|
|
166
|
-
*
|
|
167
|
-
* @param input - Brief, answered rounds, per-call cap, and any locked plan
|
|
168
|
-
* @returns Up to `maxFollowUps` renderable questions plus the total plan;
|
|
169
|
-
* the static fallback question with count 1 when generation fails
|
|
170
|
-
*/
|
|
171
|
-
async generateFollowUps(input) {
|
|
172
|
-
const roundsText = input.rounds
|
|
173
|
-
.map((round, index) => `Round ${index + 1} — Q: ${round.prompt}\nA: ${answerLabel(round.answer)}`)
|
|
174
|
-
.join("\n\n");
|
|
175
|
-
const lockedLine = input.plannedFollowUpCount !== undefined
|
|
176
|
-
? `\n\nThe interview plan is fixed at ${input.plannedFollowUpCount} follow-up question(s) in total; ${input.rounds.length - 1} already asked. Echo that count unchanged.`
|
|
177
|
-
: "";
|
|
178
|
-
try {
|
|
179
|
-
const raw = await this.plannerModel.invoke([
|
|
180
|
-
new SystemMessage(PLAN_SYSTEM_PROMPT),
|
|
181
|
-
new HumanMessage(`ANSWERED ROUNDS:\n${roundsText}\n\nWrite up to ${input.maxFollowUps} follow-up question(s).${lockedLine}`),
|
|
182
|
-
]);
|
|
183
|
-
const coreQuestions = raw.questions.slice(0, input.maxFollowUps);
|
|
184
|
-
const bridgeByQuestion = new Map();
|
|
185
|
-
if (coreQuestions.length > 0 && input.brief.trim()) {
|
|
186
|
-
try {
|
|
187
|
-
const bridgePlan = await this.profileBridgeModel.invoke([
|
|
188
|
-
new SystemMessage(PROFILE_BRIDGE_SYSTEM_PROMPT),
|
|
189
|
-
new HumanMessage(`ANSWERED ROUNDS:\n${roundsText}\n\nPROFILE BRIEF:\n${input.brief}\n\nIMMUTABLE CORE QUESTIONS:\n${JSON.stringify(coreQuestions, null, 2)}\n\nReturn one bridge decision for each questionIndex.`),
|
|
190
|
-
]);
|
|
191
|
-
for (const bridge of bridgePlan.bridges) {
|
|
192
|
-
if (bridge.questionIndex < coreQuestions.length
|
|
193
|
-
&& !bridgeByQuestion.has(bridge.questionIndex)) {
|
|
194
|
-
bridgeByQuestion.set(bridge.questionIndex, bridge.profileBridgeOption);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
catch {
|
|
199
|
-
// Profile personalization is optional. A bridge-model failure must not
|
|
200
|
-
// discard valid answer-grounded questions from the primary model.
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
const questions = coreQuestions.map((question, index) => normalizeFollowUpQuestion(question, bridgeByQuestion.get(index) ?? null, input.brief));
|
|
204
|
-
// Backstop: while budget remains, a successful empty plan must not
|
|
205
|
-
// silently shrink the interview; serve the static fallback instead.
|
|
206
|
-
if (questions.length === 0 && input.maxFollowUps > 0) {
|
|
207
|
-
return {
|
|
208
|
-
questions: [FALLBACK_BRING_QUESTION],
|
|
209
|
-
plannedFollowUpCount: input.plannedFollowUpCount ?? 1,
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
return {
|
|
213
|
-
questions,
|
|
214
|
-
plannedFollowUpCount: input.plannedFollowUpCount
|
|
215
|
-
?? Math.max(raw.plannedFollowUpCount, questions.length),
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
catch {
|
|
219
|
-
if (input.maxFollowUps <= 0)
|
|
220
|
-
return { questions: [], plannedFollowUpCount: 0 };
|
|
221
|
-
return {
|
|
222
|
-
questions: [FALLBACK_BRING_QUESTION],
|
|
223
|
-
plannedFollowUpCount: input.plannedFollowUpCount ?? 1,
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Write the signal from every answered round, any where-constraint, and any
|
|
229
|
-
* revision feedback.
|
|
230
|
-
*
|
|
231
|
-
* @param input - Brief, ordered rounds, optional where constraint, optional feedback
|
|
232
|
-
* @returns Description plus card summary fields
|
|
233
|
-
* @throws Propagates model failure so the caller can mark the run failed
|
|
234
|
-
*/
|
|
235
|
-
async synthesize(input) {
|
|
236
|
-
const roundsText = input.rounds
|
|
237
|
-
.map((round) => `Q: ${round.prompt}\nA: ${answerLabel(round.answer)}`)
|
|
238
|
-
.join("\n\n");
|
|
239
|
-
const whereLine = input.whereText?.trim()
|
|
240
|
-
? `\n\nWhere constraint: ${input.whereText.trim()}`
|
|
241
|
-
: "";
|
|
242
|
-
const feedbackLine = input.feedback?.trim()
|
|
243
|
-
? `\n\nRevision feedback on the previous draft: ${input.feedback.trim()}`
|
|
244
|
-
: "";
|
|
245
|
-
const result = await this.synthesisModel.invoke([
|
|
246
|
-
new SystemMessage(SYNTHESIS_SYSTEM_PROMPT),
|
|
247
|
-
new HumanMessage(`Brief:\n${input.brief}\n\n${roundsText}${whereLine}${feedbackLine}\n\nWrite the signal.`),
|
|
248
|
-
]);
|
|
249
|
-
return {
|
|
250
|
-
description: result.description.trim(),
|
|
251
|
-
lookingFor: result.lookingFor.trim(),
|
|
252
|
-
youBring: result.youBring.trim(),
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Signal intake pack generator.
|
|
3
|
-
*
|
|
4
|
-
* Produces the offline half of the fast intake path: a prose brief written for
|
|
5
|
-
* the intake task and a ready round-1 question. Both are stored per user and
|
|
6
|
-
* refreshed in the background, so `/i/new` can render round 1 with no model call.
|
|
7
|
-
*/
|
|
8
|
-
import type { BaseLanguageModelInput } from "@langchain/core/language_models/base";
|
|
9
|
-
import type { Runnable } from "@langchain/core/runnables";
|
|
10
|
-
/** One selectable option on the round-1 question. */
|
|
11
|
-
export interface IntakePackQuestionOption {
|
|
12
|
-
label: string;
|
|
13
|
-
description: string;
|
|
14
|
-
}
|
|
15
|
-
/** Round-1 question, shaped exactly like the frontend `QuestionPayload`. */
|
|
16
|
-
export interface IntakePackQuestion {
|
|
17
|
-
title: string;
|
|
18
|
-
prompt: string;
|
|
19
|
-
options: IntakePackQuestionOption[];
|
|
20
|
-
multiSelect: boolean;
|
|
21
|
-
}
|
|
22
|
-
/** Everything the generator needs about a user. */
|
|
23
|
-
export interface IntakePackInput {
|
|
24
|
-
premises: Array<{
|
|
25
|
-
text: string;
|
|
26
|
-
}>;
|
|
27
|
-
networkTitles: string[];
|
|
28
|
-
globalContext: string | null;
|
|
29
|
-
}
|
|
30
|
-
/** Stored artifact: the brief plus the ready round-1 question. */
|
|
31
|
-
export interface IntakePack {
|
|
32
|
-
brief: string;
|
|
33
|
-
question: IntakePackQuestion;
|
|
34
|
-
}
|
|
35
|
-
/** Generates and normalizes the per-user intake pack. */
|
|
36
|
-
export declare class SignalIntakePackGenerator {
|
|
37
|
-
private readonly model;
|
|
38
|
-
/**
|
|
39
|
-
* @param model - Optional injected structured model. Tests pass a stub.
|
|
40
|
-
*/
|
|
41
|
-
constructor(model?: Runnable<BaseLanguageModelInput, IntakePack>);
|
|
42
|
-
/**
|
|
43
|
-
* Generate the intake pack for one user.
|
|
44
|
-
*
|
|
45
|
-
* @param input - Active premises, membership titles, and the global context paragraph
|
|
46
|
-
* @returns Normalized brief and round-1 question
|
|
47
|
-
*/
|
|
48
|
-
generate(input: IntakePackInput): Promise<IntakePack>;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Clamp a generated pack into the shape the frontend can render.
|
|
52
|
-
*
|
|
53
|
-
* @param pack - Raw model output
|
|
54
|
-
* @returns Normalized pack
|
|
55
|
-
* @throws When the question has fewer than 2 usable options
|
|
56
|
-
*/
|
|
57
|
-
export declare function normalizeIntakePack(pack: IntakePack): IntakePack;
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Signal intake pack generator.
|
|
3
|
-
*
|
|
4
|
-
* Produces the offline half of the fast intake path: a prose brief written for
|
|
5
|
-
* the intake task and a ready round-1 question. Both are stored per user and
|
|
6
|
-
* refreshed in the background, so `/i/new` can render round 1 with no model call.
|
|
7
|
-
*/
|
|
8
|
-
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
|
|
9
|
-
import { z } from "zod";
|
|
10
|
-
import { createStructuredModel } from "../../shared/agent/model.config.js";
|
|
11
|
-
const packSchema = z.object({
|
|
12
|
-
brief: z.string().min(1),
|
|
13
|
-
question: z.object({
|
|
14
|
-
title: z.string(),
|
|
15
|
-
prompt: z.string().min(1),
|
|
16
|
-
options: z.array(z.object({ label: z.string().min(1), description: z.string() })),
|
|
17
|
-
multiSelect: z.boolean(),
|
|
18
|
-
}),
|
|
19
|
-
});
|
|
20
|
-
const SYSTEM_PROMPT = `You prepare a person's signal-intake pack for a networking product.
|
|
21
|
-
|
|
22
|
-
Produce two things:
|
|
23
|
-
|
|
24
|
-
1. "brief": 4-8 sentences of prose, third person, written specifically to help a
|
|
25
|
-
small model run an intake interview with this person. Cover who they are, what
|
|
26
|
-
they plausibly need from a connection, what they can offer in return, and which
|
|
27
|
-
communities they belong to. Be concrete. Never invent facts beyond the input.
|
|
28
|
-
|
|
29
|
-
2. "question": the opening intake question asking who they want to meet right now.
|
|
30
|
-
Give 3-4 concrete, distinct recipient profiles grounded in the person's actual
|
|
31
|
-
background (for example a design partner, a technical co-founder, an early
|
|
32
|
-
customer, a specific expertise gap) — never generic choices like "anyone".
|
|
33
|
-
Each option needs a short label and a one-line description. Set multiSelect false.
|
|
34
|
-
|
|
35
|
-
Never expose raw JSON, IDs, or internal vocabulary in either field.`;
|
|
36
|
-
/** Generates and normalizes the per-user intake pack. */
|
|
37
|
-
export class SignalIntakePackGenerator {
|
|
38
|
-
/**
|
|
39
|
-
* @param model - Optional injected structured model. Tests pass a stub.
|
|
40
|
-
*/
|
|
41
|
-
constructor(model) {
|
|
42
|
-
this.model = model ?? createStructuredModel("signalIntakePack", packSchema);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Generate the intake pack for one user.
|
|
46
|
-
*
|
|
47
|
-
* @param input - Active premises, membership titles, and the global context paragraph
|
|
48
|
-
* @returns Normalized brief and round-1 question
|
|
49
|
-
*/
|
|
50
|
-
async generate(input) {
|
|
51
|
-
const premiseBlock = input.premises.map((p) => `- ${p.text}`).join("\n");
|
|
52
|
-
const networkBlock = input.networkTitles.length > 0
|
|
53
|
-
? input.networkTitles.join(", ")
|
|
54
|
-
: "none";
|
|
55
|
-
const contextBlock = input.globalContext?.trim() ? input.globalContext.trim() : "none";
|
|
56
|
-
const raw = await this.model.invoke([
|
|
57
|
-
new SystemMessage(SYSTEM_PROMPT),
|
|
58
|
-
new HumanMessage(`Communities: ${networkBlock}\n\nGlobal context:\n${contextBlock}\n\nPremises:\n${premiseBlock}\n\nWrite the intake pack.`),
|
|
59
|
-
]);
|
|
60
|
-
return normalizeIntakePack(raw);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Clamp a generated pack into the shape the frontend can render.
|
|
65
|
-
*
|
|
66
|
-
* @param pack - Raw model output
|
|
67
|
-
* @returns Normalized pack
|
|
68
|
-
* @throws When the question has fewer than 2 usable options
|
|
69
|
-
*/
|
|
70
|
-
export function normalizeIntakePack(pack) {
|
|
71
|
-
const options = pack.question.options
|
|
72
|
-
.filter((option) => option.label.trim().length > 0)
|
|
73
|
-
.slice(0, 4)
|
|
74
|
-
.map((option) => ({
|
|
75
|
-
label: option.label.trim().slice(0, 120),
|
|
76
|
-
description: option.description.trim().slice(0, 280),
|
|
77
|
-
}));
|
|
78
|
-
if (options.length < 2) {
|
|
79
|
-
throw new Error("Intake pack question needs at least 2 options.");
|
|
80
|
-
}
|
|
81
|
-
return {
|
|
82
|
-
brief: pack.brief.trim(),
|
|
83
|
-
question: {
|
|
84
|
-
title: pack.question.title.trim() || "Question 1",
|
|
85
|
-
prompt: pack.question.prompt.trim().slice(0, 400),
|
|
86
|
-
options,
|
|
87
|
-
multiSelect: pack.question.multiSelect,
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
declare const clarificationSchema: z.ZodDiscriminatedUnion<"needsClarification", [z.ZodObject<{
|
|
3
|
-
needsClarification: z.ZodLiteral<false>;
|
|
4
|
-
reason: z.ZodString;
|
|
5
|
-
suggestedDescription: z.ZodNullable<z.ZodString>;
|
|
6
|
-
clarificationMessage: z.ZodNullable<z.ZodString>;
|
|
7
|
-
underspecificationType: z.ZodNull;
|
|
8
|
-
}, "strip", z.ZodTypeAny, {
|
|
9
|
-
reason: string;
|
|
10
|
-
underspecificationType: null;
|
|
11
|
-
needsClarification: false;
|
|
12
|
-
suggestedDescription: string | null;
|
|
13
|
-
clarificationMessage: string | null;
|
|
14
|
-
}, {
|
|
15
|
-
reason: string;
|
|
16
|
-
underspecificationType: null;
|
|
17
|
-
needsClarification: false;
|
|
18
|
-
suggestedDescription: string | null;
|
|
19
|
-
clarificationMessage: string | null;
|
|
20
|
-
}>, z.ZodObject<{
|
|
21
|
-
needsClarification: z.ZodLiteral<true>;
|
|
22
|
-
reason: z.ZodString;
|
|
23
|
-
suggestedDescription: z.ZodString;
|
|
24
|
-
clarificationMessage: z.ZodString;
|
|
25
|
-
underspecificationType: z.ZodEnum<["missing_constituent", "missing_constraint", "open_alternative_set"]>;
|
|
26
|
-
}, "strip", z.ZodTypeAny, {
|
|
27
|
-
reason: string;
|
|
28
|
-
underspecificationType: "missing_constituent" | "missing_constraint" | "open_alternative_set";
|
|
29
|
-
needsClarification: true;
|
|
30
|
-
suggestedDescription: string;
|
|
31
|
-
clarificationMessage: string;
|
|
32
|
-
}, {
|
|
33
|
-
reason: string;
|
|
34
|
-
underspecificationType: "missing_constituent" | "missing_constraint" | "open_alternative_set";
|
|
35
|
-
needsClarification: true;
|
|
36
|
-
suggestedDescription: string;
|
|
37
|
-
clarificationMessage: string;
|
|
38
|
-
}>]>;
|
|
39
|
-
export type IntentClarifierOutput = z.infer<typeof clarificationSchema>;
|
|
40
|
-
export declare class IntentClarifier {
|
|
41
|
-
private readonly model;
|
|
42
|
-
private readonly suggestionModel;
|
|
43
|
-
private readonly clarificationDraftModel;
|
|
44
|
-
constructor();
|
|
45
|
-
/** Build the shared user prompt with intent, profile, and active-intent context. */
|
|
46
|
-
private buildPrompt;
|
|
47
|
-
invoke(description: string, profileContext: string, activeIntentsContext: string): Promise<IntentClarifierOutput>;
|
|
48
|
-
private generateSuggestion;
|
|
49
|
-
private generateClarificationDraft;
|
|
50
|
-
}
|
|
51
|
-
export {};
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
|
|
11
|
-
import { z } from "zod";
|
|
12
|
-
import { createStructuredModel } from "../shared/agent/model.config.js";
|
|
13
|
-
import { invokeWithAbortSignal } from "../shared/agent/model-signal.js";
|
|
14
|
-
import { protocolLogger } from "../shared/observability/protocol.logger.js";
|
|
15
|
-
import { Timed } from "../shared/observability/performance.js";
|
|
16
|
-
import { UnderspecificationTypeSchema } from "../shared/schemas/underspecification.schema.js";
|
|
17
|
-
const logger = protocolLogger("IntentClarifier");
|
|
18
|
-
const clarificationSchema = z.discriminatedUnion("needsClarification", [
|
|
19
|
-
z.object({
|
|
20
|
-
needsClarification: z.literal(false),
|
|
21
|
-
reason: z.string(),
|
|
22
|
-
suggestedDescription: z.string().nullable(),
|
|
23
|
-
clarificationMessage: z.string().nullable(),
|
|
24
|
-
underspecificationType: z.null(),
|
|
25
|
-
}),
|
|
26
|
-
z.object({
|
|
27
|
-
needsClarification: z.literal(true),
|
|
28
|
-
reason: z.string(),
|
|
29
|
-
suggestedDescription: z.string().trim().min(1),
|
|
30
|
-
clarificationMessage: z.string().trim().min(1),
|
|
31
|
-
underspecificationType: UnderspecificationTypeSchema,
|
|
32
|
-
}),
|
|
33
|
-
]);
|
|
34
|
-
const suggestionSchema = z.object({
|
|
35
|
-
suggestedDescription: z.string(),
|
|
36
|
-
});
|
|
37
|
-
const clarificationDraftSchema = z.object({
|
|
38
|
-
suggestedDescription: z.string(),
|
|
39
|
-
clarificationMessage: z.string(),
|
|
40
|
-
});
|
|
41
|
-
const systemPrompt = `
|
|
42
|
-
You evaluate whether one focused clarification would materially improve an intent before discovery.
|
|
43
|
-
|
|
44
|
-
Set needsClarification=true only when the intent has a consequential unresolved Question Under Discussion (QUD): the answer would materially change which people or opportunities should surface. Do not ask for merely nice-to-have detail, procedural confirmation, or information already inferable from the user profile or active intents.
|
|
45
|
-
|
|
46
|
-
Classify the single highest-impact QUD repair in underspecificationType:
|
|
47
|
-
- missing_constituent: an absent core participant, entity, or outcome (who/what). Example: "I need help with something" does not identify what help or outcome is sought.
|
|
48
|
-
- missing_constraint: the core target exists, but an explicitly unresolved or discovery-blocking ranking boundary is missing (where/when/how/how much). Example: a concrete hiring target whose location, timing, or engagement boundary is explicitly undecided.
|
|
49
|
-
- open_alternative_set: an unresolved choice among materially different interpretations or scopes. Example: seeking either a technical co-founder or a sales channel partner, which would surface different people.
|
|
50
|
-
|
|
51
|
-
An intent does NOT need every possible constraint. A concrete target with enough boundaries to run a useful search is specific even if it omits optional preferences such as compensation, budget, exact seniority, or secondary skills. For example, "a senior ML engineer in Berlin for a full-time role building production LLM evaluation systems this quarter" requires no clarification; do not invent a missing budget or other unstated requirement.
|
|
52
|
-
|
|
53
|
-
Set needsClarification=false when the intent already fixes its core target and enough material ranking boundaries for actionable discovery, or when remaining omissions are optional. When false, underspecificationType MUST be null. When true, it MUST be exactly one category above.
|
|
54
|
-
|
|
55
|
-
Rules when needsClarification=true:
|
|
56
|
-
- Ask about the selected QUD category rather than proposing an arbitrary refinement.
|
|
57
|
-
- User Profile is the primary source for a grounded suggestedDescription; Active Intents are secondary.
|
|
58
|
-
- You MUST provide a concrete suggestedDescription and short clarificationMessage.
|
|
59
|
-
- Do not include JSON in clarificationMessage.
|
|
60
|
-
`;
|
|
61
|
-
const suggestionPrompt = `
|
|
62
|
-
You generate one concrete, specific intent rewrite.
|
|
63
|
-
|
|
64
|
-
Rules:
|
|
65
|
-
- Output only a concise intent sentence in suggestedDescription.
|
|
66
|
-
- Use profile as primary source of personalization.
|
|
67
|
-
- Use active intents as secondary context for consistency.
|
|
68
|
-
- Keep user intent meaning, but make it actionable and specific.
|
|
69
|
-
- Never return an empty suggestion.
|
|
70
|
-
`;
|
|
71
|
-
const clarificationDraftPrompt = `
|
|
72
|
-
You draft one concise clarification response for an underspecified intent.
|
|
73
|
-
|
|
74
|
-
Return both:
|
|
75
|
-
1) suggestedDescription: one concrete rewrite representing a plausible interpretation.
|
|
76
|
-
2) clarificationMessage: one direct question that resolves the supplied QUD category.
|
|
77
|
-
|
|
78
|
-
Question rules by category:
|
|
79
|
-
- missing_constituent: ask which participant, entity, or outcome the user means.
|
|
80
|
-
- missing_constraint: ask for the unresolved ranking boundary (where/when/how/how much).
|
|
81
|
-
- open_alternative_set: name the materially different alternatives and ask the user to choose; never collapse them into a generic yes/no confirmation.
|
|
82
|
-
|
|
83
|
-
The question may mention suggestedDescription when useful, but do not force every category into "Did you mean...?". Keep it short. No bullet lists. No JSON.
|
|
84
|
-
`;
|
|
85
|
-
export class IntentClarifier {
|
|
86
|
-
constructor() {
|
|
87
|
-
this.model = createStructuredModel("intentClarifier", clarificationSchema, {
|
|
88
|
-
name: "intent_clarifier",
|
|
89
|
-
});
|
|
90
|
-
this.suggestionModel = createStructuredModel("intentClarifier", suggestionSchema, {
|
|
91
|
-
name: "intent_clarifier_suggestion",
|
|
92
|
-
});
|
|
93
|
-
this.clarificationDraftModel = createStructuredModel("intentClarifier", clarificationDraftSchema, { name: "intent_clarifier_message" });
|
|
94
|
-
}
|
|
95
|
-
/** Build the shared user prompt with intent, profile, and active-intent context. */
|
|
96
|
-
buildPrompt(description, profileContext, activeIntentsContext) {
|
|
97
|
-
return `
|
|
98
|
-
# User Input Intent
|
|
99
|
-
${description}
|
|
100
|
-
|
|
101
|
-
# User Profile
|
|
102
|
-
${profileContext || "none"}
|
|
103
|
-
|
|
104
|
-
# Active Intents
|
|
105
|
-
${activeIntentsContext || "none"}
|
|
106
|
-
`;
|
|
107
|
-
}
|
|
108
|
-
async invoke(description, profileContext, activeIntentsContext) {
|
|
109
|
-
try {
|
|
110
|
-
const prompt = this.buildPrompt(description, profileContext, activeIntentsContext);
|
|
111
|
-
const result = await invokeWithAbortSignal(this.model, [
|
|
112
|
-
new SystemMessage(systemPrompt),
|
|
113
|
-
new HumanMessage(prompt),
|
|
114
|
-
]);
|
|
115
|
-
const parsed = clarificationSchema.parse(result);
|
|
116
|
-
if (parsed.needsClarification) {
|
|
117
|
-
// Always prefer a dedicated rewrite pass for vague inputs so we avoid generic follow-up text.
|
|
118
|
-
const draft = await this.generateClarificationDraft(description, profileContext, activeIntentsContext, parsed.underspecificationType);
|
|
119
|
-
if (draft) {
|
|
120
|
-
return {
|
|
121
|
-
...parsed,
|
|
122
|
-
suggestedDescription: draft.suggestedDescription,
|
|
123
|
-
clarificationMessage: draft.clarificationMessage,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return parsed;
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
logger.warn("invoke: clarification failed", { error });
|
|
131
|
-
return {
|
|
132
|
-
needsClarification: false,
|
|
133
|
-
reason: "fallback_on_model_error",
|
|
134
|
-
suggestedDescription: null,
|
|
135
|
-
clarificationMessage: null,
|
|
136
|
-
underspecificationType: null,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
async generateSuggestion(description, profileContext, activeIntentsContext) {
|
|
141
|
-
try {
|
|
142
|
-
const prompt = this.buildPrompt(description, profileContext, activeIntentsContext);
|
|
143
|
-
const output = await invokeWithAbortSignal(this.suggestionModel, [
|
|
144
|
-
new SystemMessage(suggestionPrompt),
|
|
145
|
-
new HumanMessage(prompt),
|
|
146
|
-
]);
|
|
147
|
-
const parsed = suggestionSchema.parse(output);
|
|
148
|
-
const suggestion = parsed.suggestedDescription.trim();
|
|
149
|
-
return suggestion.length > 0 ? suggestion : null;
|
|
150
|
-
}
|
|
151
|
-
catch (error) {
|
|
152
|
-
logger.warn("generateSuggestion: failed", { error });
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
async generateClarificationDraft(description, profileContext, activeIntentsContext, underspecificationType) {
|
|
157
|
-
try {
|
|
158
|
-
const prompt = [
|
|
159
|
-
this.buildPrompt(description, profileContext, activeIntentsContext),
|
|
160
|
-
"# QUD Repair Category",
|
|
161
|
-
underspecificationType,
|
|
162
|
-
].join("\n");
|
|
163
|
-
const output = await invokeWithAbortSignal(this.clarificationDraftModel, [
|
|
164
|
-
new SystemMessage(clarificationDraftPrompt),
|
|
165
|
-
new HumanMessage(prompt),
|
|
166
|
-
]);
|
|
167
|
-
const parsed = clarificationDraftSchema.parse(output);
|
|
168
|
-
const suggestedDescription = parsed.suggestedDescription.trim();
|
|
169
|
-
const clarificationMessage = parsed.clarificationMessage.trim();
|
|
170
|
-
if (!suggestedDescription || !clarificationMessage)
|
|
171
|
-
return null;
|
|
172
|
-
return { suggestedDescription, clarificationMessage };
|
|
173
|
-
}
|
|
174
|
-
catch (error) {
|
|
175
|
-
logger.warn("generateClarificationDraft: failed", { error });
|
|
176
|
-
const suggestion = await this.generateSuggestion(description, profileContext, activeIntentsContext);
|
|
177
|
-
if (!suggestion)
|
|
178
|
-
return null;
|
|
179
|
-
const clarificationMessage = (() => {
|
|
180
|
-
switch (underspecificationType) {
|
|
181
|
-
case "missing_constituent":
|
|
182
|
-
return "Who or what should this intent focus on?";
|
|
183
|
-
case "missing_constraint":
|
|
184
|
-
return "Which location, timing, format, or range should constrain this intent?";
|
|
185
|
-
case "open_alternative_set":
|
|
186
|
-
return `Your intent names different alternatives — "${description}". Which one should take priority?`;
|
|
187
|
-
}
|
|
188
|
-
})();
|
|
189
|
-
return {
|
|
190
|
-
suggestedDescription: suggestion,
|
|
191
|
-
clarificationMessage,
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
__decorate([
|
|
197
|
-
Timed(),
|
|
198
|
-
__metadata("design:type", Function),
|
|
199
|
-
__metadata("design:paramtypes", [String, String, String]),
|
|
200
|
-
__metadata("design:returntype", Promise)
|
|
201
|
-
], IntentClarifier.prototype, "invoke", null);
|