@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
package/dist/mcp/mcp.server.js
DELETED
|
@@ -1,631 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Server Factory — creates an McpServer instance with all protocol tools
|
|
3
|
-
* registered from the existing tool registry. Each tool invocation resolves
|
|
4
|
-
* auth from the HTTP request, builds a ResolvedToolContext, and delegates
|
|
5
|
-
* to the raw tool handler.
|
|
6
|
-
*/
|
|
7
|
-
import { z } from 'zod';
|
|
8
|
-
import { McpServer, fromJsonSchema } from '@modelcontextprotocol/server';
|
|
9
|
-
import { McpResolvedIdentitySchema } from '../shared/schemas/mcp-auth.schema.js';
|
|
10
|
-
import { CANONICAL_GUIDANCE_SUMMARY } from '../shared/agent/canonical-guidance.js';
|
|
11
|
-
import { resolveChatContext } from '../shared/agent/tool.helpers.js';
|
|
12
|
-
import { deriveAllowedNetworkIds, scopeFromNetworkId } from '../shared/agent/tool.scope.js';
|
|
13
|
-
import { createToolRegistry } from '../shared/agent/tool.registry.js';
|
|
14
|
-
import { bindOwnerApprovalProvenance } from '../opportunities/opportunity.owner-provenance.js';
|
|
15
|
-
import { ToolRuntimeError, invokeToolRuntime, toolRuntimeErrorToResult } from '../shared/agent/tool.runtime.js';
|
|
16
|
-
import { protocolLogger } from '../shared/observability/protocol.logger.js';
|
|
17
|
-
import { buildMcpAuthorizationDenialEvent, McpCapabilityPolicy, ONBOARDING_ALLOWED, resolveMcpActivityCaller, resolveMcpCapabilitySubject } from './mcp.authorization-policy.js';
|
|
18
|
-
const logger = protocolLogger('McpServer');
|
|
19
|
-
const mcpToolMetadataCache = new Map();
|
|
20
|
-
/**
|
|
21
|
-
* Builds a cache key from registry-shaping dependency booleans.
|
|
22
|
-
* When a feature flag changes the tool set, the cache key changes so
|
|
23
|
-
* the cached metadata set is automatically invalidated.
|
|
24
|
-
*/
|
|
25
|
-
export function getMcpToolMetadataCacheKey(deps) {
|
|
26
|
-
// Contact tools are omitted from the MCP surface entirely (IND-596), so no
|
|
27
|
-
// contacts-related input can change the MCP tool set.
|
|
28
|
-
return [
|
|
29
|
-
`chat:${deps.chatSession ? '1' : '0'}`,
|
|
30
|
-
`agent:${deps.agentDatabase ? '1' : '0'}`,
|
|
31
|
-
`negotiation:${deps.agentDispatcher ? '1' : '0'}`,
|
|
32
|
-
`questioner:${deps.questionerEnqueue ? '1' : '0'}`,
|
|
33
|
-
].join('|');
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Clears the metadata cache. Used in tests to ensure fresh state between cases.
|
|
37
|
-
*/
|
|
38
|
-
export function clearMcpToolMetadataCacheForTests() {
|
|
39
|
-
mcpToolMetadataCache.clear();
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Returns cached (or builds and caches) static MCP tool registration metadata.
|
|
43
|
-
* The first call per cache key runs the full registry creation + schema
|
|
44
|
-
* conversion; subsequent calls return the cached metadata array for the same
|
|
45
|
-
* registry-shaping dependency profile.
|
|
46
|
-
*
|
|
47
|
-
* Does NOT store tool handlers — those remain request-scoped because they
|
|
48
|
-
* capture per-request userDb/systemDb.
|
|
49
|
-
*/
|
|
50
|
-
export function getCachedMcpToolMetadata(deps) {
|
|
51
|
-
const cacheKey = getMcpToolMetadataCacheKey(deps);
|
|
52
|
-
const cached = mcpToolMetadataCache.get(cacheKey);
|
|
53
|
-
if (cached)
|
|
54
|
-
return cached;
|
|
55
|
-
const registry = createToolRegistry(deps, { surface: 'mcp' });
|
|
56
|
-
const metadata = Array.from(registry.values()).map((toolDef) => {
|
|
57
|
-
const jsonSchema = zodToJsonSchema(toolDef.schema);
|
|
58
|
-
return {
|
|
59
|
-
name: toolDef.name,
|
|
60
|
-
description: toolDef.description,
|
|
61
|
-
schema: toolDef.schema,
|
|
62
|
-
jsonSchema,
|
|
63
|
-
inputSchema: fromJsonSchema(jsonSchema),
|
|
64
|
-
};
|
|
65
|
-
});
|
|
66
|
-
mcpToolMetadataCache.set(cacheKey, metadata);
|
|
67
|
-
logger.verbose('MCP tool metadata cached', { toolCount: metadata.length, cacheKey });
|
|
68
|
-
return metadata;
|
|
69
|
-
}
|
|
70
|
-
function isExpectedMcpAuthError(message) {
|
|
71
|
-
return message.includes('Authentication required') ||
|
|
72
|
-
message.includes('Invalid API key') ||
|
|
73
|
-
message.includes('Invalid or expired access token') ||
|
|
74
|
-
message.includes('JWT payload missing user ID');
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Runtime/auth failures are converted into structured MCP `isError` tool
|
|
78
|
-
* results for the caller. Reporting them as application exceptions produces
|
|
79
|
-
* Sentry noise for expected client failures and policy-enforced timeouts.
|
|
80
|
-
*/
|
|
81
|
-
export function shouldReportMcpToolError(err) {
|
|
82
|
-
if (err instanceof ToolRuntimeError)
|
|
83
|
-
return false;
|
|
84
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
85
|
-
return !isExpectedMcpAuthError(message);
|
|
86
|
-
}
|
|
87
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
88
|
-
// ZOD 3 → JSON SCHEMA CONVERSION
|
|
89
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
90
|
-
/**
|
|
91
|
-
* Minimal Zod-to-JSON-Schema conversion for MCP tool registration.
|
|
92
|
-
* Converts Zod 3.x schemas to plain JSON Schema objects that can be
|
|
93
|
-
* wrapped with `fromJsonSchema()` for MCP SDK compatibility.
|
|
94
|
-
*/
|
|
95
|
-
function zodToJsonSchema(schema) {
|
|
96
|
-
if (schema instanceof z.ZodObject) {
|
|
97
|
-
const shape = schema.shape;
|
|
98
|
-
const properties = {};
|
|
99
|
-
const required = [];
|
|
100
|
-
for (const [key, value] of Object.entries(shape)) {
|
|
101
|
-
const zodValue = value;
|
|
102
|
-
properties[key] = zodToJsonSchema(zodValue);
|
|
103
|
-
if (!(zodValue instanceof z.ZodOptional) && !(zodValue instanceof z.ZodDefault)) {
|
|
104
|
-
required.push(key);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return { type: 'object', properties, ...(required.length ? { required } : {}) };
|
|
108
|
-
}
|
|
109
|
-
if (schema instanceof z.ZodString) {
|
|
110
|
-
const result = { type: 'string' };
|
|
111
|
-
// Detect .url(), .email(), .uuid() etc. via Zod's internal checks array
|
|
112
|
-
const checks = schema._def?.checks;
|
|
113
|
-
if (checks) {
|
|
114
|
-
for (const check of checks) {
|
|
115
|
-
if (check.kind === 'url')
|
|
116
|
-
result.format = 'uri';
|
|
117
|
-
else if (check.kind === 'email')
|
|
118
|
-
result.format = 'email';
|
|
119
|
-
else if (check.kind === 'uuid')
|
|
120
|
-
result.format = 'uuid';
|
|
121
|
-
else if (check.kind === 'datetime')
|
|
122
|
-
result.format = 'date-time';
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return result;
|
|
126
|
-
}
|
|
127
|
-
if (schema instanceof z.ZodNumber) {
|
|
128
|
-
const checks = schema._def?.checks;
|
|
129
|
-
const result = { type: 'number' };
|
|
130
|
-
if (checks) {
|
|
131
|
-
for (const check of checks) {
|
|
132
|
-
if (check.kind === 'int')
|
|
133
|
-
result.type = 'integer';
|
|
134
|
-
else if (check.kind === 'min')
|
|
135
|
-
result.minimum = check.value;
|
|
136
|
-
else if (check.kind === 'max')
|
|
137
|
-
result.maximum = check.value;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return result;
|
|
141
|
-
}
|
|
142
|
-
if (schema instanceof z.ZodBoolean)
|
|
143
|
-
return { type: 'boolean' };
|
|
144
|
-
if (schema instanceof z.ZodArray) {
|
|
145
|
-
return { type: 'array', items: zodToJsonSchema(schema.element) };
|
|
146
|
-
}
|
|
147
|
-
if (schema instanceof z.ZodOptional) {
|
|
148
|
-
return zodToJsonSchema(schema.unwrap());
|
|
149
|
-
}
|
|
150
|
-
if (schema instanceof z.ZodDefault) {
|
|
151
|
-
return zodToJsonSchema(schema.removeDefault());
|
|
152
|
-
}
|
|
153
|
-
if (schema instanceof z.ZodEnum) {
|
|
154
|
-
return { type: 'string', enum: schema.options };
|
|
155
|
-
}
|
|
156
|
-
if (schema instanceof z.ZodNullable) {
|
|
157
|
-
const inner = zodToJsonSchema(schema.unwrap());
|
|
158
|
-
return { ...inner, nullable: true };
|
|
159
|
-
}
|
|
160
|
-
if (schema instanceof z.ZodRecord) {
|
|
161
|
-
return { type: 'object', additionalProperties: true };
|
|
162
|
-
}
|
|
163
|
-
return { type: 'object' };
|
|
164
|
-
}
|
|
165
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
166
|
-
// RESULT POST-PROCESSING
|
|
167
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
168
|
-
/**
|
|
169
|
-
* Strips internal `_`-prefixed keys from `data` and promotes `isError`
|
|
170
|
-
* from the inner `success: false` signal to the MCP envelope level.
|
|
171
|
-
* Fail-open: if JSON parsing throws, returns the original text with isError: false.
|
|
172
|
-
*/
|
|
173
|
-
export function sanitizeMcpResult(text) {
|
|
174
|
-
try {
|
|
175
|
-
const parsed = JSON.parse(text);
|
|
176
|
-
if (parsed &&
|
|
177
|
-
typeof parsed === 'object' &&
|
|
178
|
-
parsed.data &&
|
|
179
|
-
typeof parsed.data === 'object' &&
|
|
180
|
-
!Array.isArray(parsed.data)) {
|
|
181
|
-
for (const key of Object.keys(parsed.data)) {
|
|
182
|
-
if (key.startsWith('_') || key === 'debugSteps') {
|
|
183
|
-
delete parsed.data[key];
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
const isError = parsed?.success === false;
|
|
188
|
-
return { text: JSON.stringify(parsed), isError };
|
|
189
|
-
}
|
|
190
|
-
catch {
|
|
191
|
-
return { text, isError: false };
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Promotes a network-scoped agent's bound network into the resolved tool
|
|
196
|
-
* context as the implicit chat scope. Every tool derives its focused network
|
|
197
|
-
* from the `scopeType`/`scopeId` envelope; without this step scoped API-key
|
|
198
|
-
* calls would still resolve an unscoped/global view.
|
|
199
|
-
*
|
|
200
|
-
* No-op when there is no scope, or when an explicit scope is already set
|
|
201
|
-
* (a user-driven network-scoped chat must keep precedence over the agent
|
|
202
|
-
* binding — which would be a strict subset anyway, since the API key cannot
|
|
203
|
-
* reach beyond its bound network).
|
|
204
|
-
*/
|
|
205
|
-
export const applyNetworkScopeToContext = (context, networkScopeId) => {
|
|
206
|
-
if (!networkScopeId)
|
|
207
|
-
return;
|
|
208
|
-
if (context.scopeType && context.scopeId)
|
|
209
|
-
return;
|
|
210
|
-
const scope = scopeFromNetworkId(networkScopeId);
|
|
211
|
-
context.scopeType = scope.scopeType;
|
|
212
|
-
context.scopeId = scope.scopeId;
|
|
213
|
-
const bound = context.userNetworks.find((m) => m.networkId === networkScopeId);
|
|
214
|
-
if (!bound)
|
|
215
|
-
return;
|
|
216
|
-
context.indexName = bound.networkTitle;
|
|
217
|
-
context.scopedIndex = {
|
|
218
|
-
id: bound.networkId,
|
|
219
|
-
title: bound.networkTitle,
|
|
220
|
-
prompt: bound.indexPrompt ?? null,
|
|
221
|
-
};
|
|
222
|
-
const isOwner = bound.permissions?.includes('owner') ?? false;
|
|
223
|
-
context.scopedMembershipRole = isOwner ? 'owner' : 'member';
|
|
224
|
-
context.isOwner = isOwner;
|
|
225
|
-
};
|
|
226
|
-
export { ONBOARDING_ALLOWED } from './mcp.authorization-policy.js';
|
|
227
|
-
/**
|
|
228
|
-
* Builds the onboarding gate message for REST Tool API callers. Condensed
|
|
229
|
-
* from the chat onboarding flow into a 6-step tool-error guide. MCP does
|
|
230
|
-
* not use this gate.
|
|
231
|
-
*/
|
|
232
|
-
export function buildMcpOnboardingMessage(ctx) {
|
|
233
|
-
const nameStep = ctx.hasName
|
|
234
|
-
? `1. Greet the user and confirm their name ("You're ${ctx.userName}, right?").`
|
|
235
|
-
: `1. Ask the user for their name and a short self-description.`;
|
|
236
|
-
const communityStep = ctx.networkId
|
|
237
|
-
? `4. (Skipped — user is already in "${ctx.indexName ?? 'their community'}".)`
|
|
238
|
-
: `4. Call read_networks() and let the user pick communities to join via create_network_membership(networkId=...).`;
|
|
239
|
-
const allowedList = Array.from(ONBOARDING_ALLOWED).join(', ');
|
|
240
|
-
return (`This user has not completed onboarding. You must guide them through setup before they can use other tools. ` +
|
|
241
|
-
`Only the following tools are available until onboarding is complete: ` +
|
|
242
|
-
`${allowedList}.\n\n` +
|
|
243
|
-
`Onboarding flow:\n` +
|
|
244
|
-
`${nameStep}\n` +
|
|
245
|
-
`2. Call preview_user_context(...). If it returns profileRunId, poll get_enrichment_run(profileRunId=...) until status is succeeded, then use its result as the draft.\n` +
|
|
246
|
-
`3. Present the profile draft and ask "Does that look right?" On approval/correction, call confirm_user_context(...).\n` +
|
|
247
|
-
`${communityStep}\n` +
|
|
248
|
-
`5. Ask what the user is looking for and call create_intent(description="...", autoApprove=true) so the first signal is persisted.\n` +
|
|
249
|
-
`6. Call complete_onboarding() to finish setup. Discovery is optional after onboarding, never mandatory.`);
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Creates an MCP server with all protocol tools registered.
|
|
253
|
-
* Tools resolve auth per-request via the HTTP request available in ServerContext.
|
|
254
|
-
*
|
|
255
|
-
* @param deps - Shared tool dependencies (graphs, database, embedder, etc.)
|
|
256
|
-
* @param authResolver - Resolves authenticated identity from the HTTP request
|
|
257
|
-
* @param scopedDepsFactory - Factory for creating per-request scoped databases
|
|
258
|
-
* @returns A configured McpServer ready to be connected to a transport
|
|
259
|
-
*/
|
|
260
|
-
function createMcpTraceEmitter(toolName, ctx) {
|
|
261
|
-
const token = ctx.mcpReq._meta?.progressToken;
|
|
262
|
-
if (typeof token !== 'string' && typeof token !== 'number')
|
|
263
|
-
return undefined;
|
|
264
|
-
let progress = 0;
|
|
265
|
-
return (event) => {
|
|
266
|
-
progress += 1;
|
|
267
|
-
const message = (() => {
|
|
268
|
-
if (event.type === 'graph_start')
|
|
269
|
-
return `${toolName}: ${event.name} started`;
|
|
270
|
-
if (event.type === 'graph_end')
|
|
271
|
-
return `${toolName}: ${event.name} finished${event.durationMs != null ? ` in ${event.durationMs}ms` : ''}`;
|
|
272
|
-
if (event.type === 'agent_start')
|
|
273
|
-
return `${toolName}: ${event.name} agent started`;
|
|
274
|
-
if (event.type === 'agent_end')
|
|
275
|
-
return `${toolName}: ${event.name} agent finished${event.durationMs != null ? ` in ${event.durationMs}ms` : ''}`;
|
|
276
|
-
return `${toolName}: progress`;
|
|
277
|
-
})();
|
|
278
|
-
const notification = {
|
|
279
|
-
method: 'notifications/progress',
|
|
280
|
-
params: { progressToken: token, progress, message },
|
|
281
|
-
};
|
|
282
|
-
void ctx.mcpReq.notify(notification).catch((err) => {
|
|
283
|
-
logger.debug('Failed to send MCP progress notification', {
|
|
284
|
-
toolName,
|
|
285
|
-
error: err instanceof Error ? err.message : String(err),
|
|
286
|
-
});
|
|
287
|
-
});
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
export const MCP_INSTRUCTIONS = `
|
|
291
|
-
${CANONICAL_GUIDANCE_SUMMARY}
|
|
292
|
-
|
|
293
|
-
# Voice & Output Rules
|
|
294
|
-
Calm, analytical, concise. Say "signal" not "intent", "community" not "index". Never use "search" — use "discover" or "find". Banned: leverage, optimize, unlock, scale, disrupt, AI-powered, act fast.
|
|
295
|
-
|
|
296
|
-
NEVER dump raw JSON or expose IDs (except actionable ones like conversationId). Synthesize in natural language; surface top 1–3 points unless asked for full list. Fabricate nothing.
|
|
297
|
-
|
|
298
|
-
# Authentication & Opportunity Lifecycle
|
|
299
|
-
API key in \`x-api-key\` header. Opportunities: draft → pending → accepted/rejected. Agent acceptance ≠ owner approval. Only call update_opportunity with accepted after explicit user confirmation.
|
|
300
|
-
|
|
301
|
-
# Tool Guidance
|
|
302
|
-
Read each tool's description for usage rules (when, prerequisites, follow-ups). Tools contain workflow patterns.
|
|
303
|
-
|
|
304
|
-
`.trim();
|
|
305
|
-
/**
|
|
306
|
-
* Extracts a Bearer token from an HTTP Authorization header.
|
|
307
|
-
*/
|
|
308
|
-
export function extractBearerToken(req) {
|
|
309
|
-
const authHeader = req.headers.get('Authorization');
|
|
310
|
-
if (!authHeader)
|
|
311
|
-
return undefined;
|
|
312
|
-
const [scheme, token] = authHeader.trim().split(/\s+/, 2);
|
|
313
|
-
if (scheme?.toLowerCase() === 'bearer' && token)
|
|
314
|
-
return token;
|
|
315
|
-
return undefined;
|
|
316
|
-
}
|
|
317
|
-
export function createMcpServer(deps, authResolver, scopedDepsFactory, policyOptions = {}, authorizationObserver) {
|
|
318
|
-
const server = new McpServer({ name: 'index-network', version: '1.0.0' }, { instructions: MCP_INSTRUCTIONS });
|
|
319
|
-
const toolMetadata = getCachedMcpToolMetadata(deps);
|
|
320
|
-
const capabilityPolicy = new McpCapabilityPolicy(policyOptions);
|
|
321
|
-
// Fail-closed authorization observability: emit a safe, secret-free denial
|
|
322
|
-
// event at the host boundary. Never let an observer failure change the
|
|
323
|
-
// decision or surface a credential — the denial stands regardless.
|
|
324
|
-
const observeDenial = (input) => {
|
|
325
|
-
if (!authorizationObserver)
|
|
326
|
-
return;
|
|
327
|
-
try {
|
|
328
|
-
authorizationObserver.onCapabilityDenied(buildMcpAuthorizationDenialEvent(input));
|
|
329
|
-
}
|
|
330
|
-
catch (err) {
|
|
331
|
-
logger.debug('MCP authorization observer threw — ignoring', {
|
|
332
|
-
toolName: input.toolName,
|
|
333
|
-
error: err instanceof Error ? err.message : String(err),
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
};
|
|
337
|
-
// Both snapshots are scoped to this MCP server/connection. Permission
|
|
338
|
-
// changes therefore apply only after the caller reconnects or refreshes
|
|
339
|
-
// its session. They are never shared with the static tool metadata cache,
|
|
340
|
-
// so a different server/principal cannot inherit decisions.
|
|
341
|
-
let authenticatedRequest;
|
|
342
|
-
let resolvedRequest;
|
|
343
|
-
const extractAuthInput = (httpReq) => ({
|
|
344
|
-
bearerToken: extractBearerToken(httpReq),
|
|
345
|
-
apiKey: httpReq.headers.get('x-api-key') ?? undefined,
|
|
346
|
-
telegramHandle: httpReq.headers.get('x-index-telegram-handle') ?? undefined,
|
|
347
|
-
telegramUsername: httpReq.headers.get('x-index-telegram-username') ?? undefined,
|
|
348
|
-
});
|
|
349
|
-
const getAuthenticatedRequest = (httpReq) => {
|
|
350
|
-
if (authenticatedRequest)
|
|
351
|
-
return authenticatedRequest;
|
|
352
|
-
authenticatedRequest = (async () => {
|
|
353
|
-
const identity = McpResolvedIdentitySchema.parse(await authResolver.resolveIdentity(extractAuthInput(httpReq)));
|
|
354
|
-
const agentRecord = identity.agentId
|
|
355
|
-
? await deps.agentDatabase?.getAgentWithRelations(identity.agentId) ?? null
|
|
356
|
-
: null;
|
|
357
|
-
const agent = agentRecord
|
|
358
|
-
? {
|
|
359
|
-
id: agentRecord.id,
|
|
360
|
-
ownerId: agentRecord.ownerId,
|
|
361
|
-
type: agentRecord.type,
|
|
362
|
-
status: agentRecord.status,
|
|
363
|
-
permissions: agentRecord.permissions.map((permission) => ({
|
|
364
|
-
agentId: permission.agentId,
|
|
365
|
-
userId: permission.userId,
|
|
366
|
-
scope: permission.scope,
|
|
367
|
-
scopeId: permission.scopeId,
|
|
368
|
-
actions: [...permission.actions],
|
|
369
|
-
})),
|
|
370
|
-
}
|
|
371
|
-
: null;
|
|
372
|
-
return {
|
|
373
|
-
identity,
|
|
374
|
-
agent,
|
|
375
|
-
// This snapshot is sufficient to reject forged/hidden calls before
|
|
376
|
-
// resolving chat context.
|
|
377
|
-
preliminarySubject: resolveMcpCapabilitySubject({
|
|
378
|
-
identity,
|
|
379
|
-
agent,
|
|
380
|
-
}),
|
|
381
|
-
};
|
|
382
|
-
})();
|
|
383
|
-
return authenticatedRequest;
|
|
384
|
-
};
|
|
385
|
-
const getResolvedRequest = (httpReq) => {
|
|
386
|
-
if (resolvedRequest)
|
|
387
|
-
return resolvedRequest;
|
|
388
|
-
resolvedRequest = (async () => {
|
|
389
|
-
const authenticated = await getAuthenticatedRequest(httpReq);
|
|
390
|
-
const context = await resolveChatContext({
|
|
391
|
-
database: deps.database,
|
|
392
|
-
userId: authenticated.identity.userId,
|
|
393
|
-
});
|
|
394
|
-
context.isMcp = true;
|
|
395
|
-
if (authenticated.identity.agentId) {
|
|
396
|
-
context.agentId = authenticated.identity.agentId;
|
|
397
|
-
}
|
|
398
|
-
// Trusted provenance seam (IND-593): only the server-resolved session
|
|
399
|
-
// identity — never a caller-supplied field — marks a direct MCP owner
|
|
400
|
-
// interaction for the opportunity owner-approval boundary. The
|
|
401
|
-
// capability-local extension deliberately keeps this field out of the
|
|
402
|
-
// shared helper's negotiations/question cycle.
|
|
403
|
-
bindOwnerApprovalProvenance(context, {
|
|
404
|
-
surface: 'mcp',
|
|
405
|
-
sessionAuthenticated: authenticated.identity.isSessionAuth === true,
|
|
406
|
-
});
|
|
407
|
-
applyNetworkScopeToContext(context, authenticated.identity.networkScopeId);
|
|
408
|
-
const subject = resolveMcpCapabilitySubject({
|
|
409
|
-
identity: authenticated.identity,
|
|
410
|
-
agent: authenticated.agent,
|
|
411
|
-
});
|
|
412
|
-
// Bind the typed resolved caller context so tools with
|
|
413
|
-
// permission-projected output (read_activity_summary) can apply the
|
|
414
|
-
// centralized projection without re-deriving principal state.
|
|
415
|
-
context.mcpCaller = resolveMcpActivityCaller(subject);
|
|
416
|
-
return {
|
|
417
|
-
...authenticated,
|
|
418
|
-
context,
|
|
419
|
-
subject,
|
|
420
|
-
};
|
|
421
|
-
})();
|
|
422
|
-
return resolvedRequest;
|
|
423
|
-
};
|
|
424
|
-
const capabilityDeniedResult = (_decision) => {
|
|
425
|
-
const message = 'This capability is not available to the authenticated principal. Reconnect or refresh the session after an administrator changes permissions.';
|
|
426
|
-
return {
|
|
427
|
-
content: [{
|
|
428
|
-
type: 'text',
|
|
429
|
-
text: JSON.stringify({
|
|
430
|
-
error: 'Capability not authorized',
|
|
431
|
-
code: 'MCP_CAPABILITY_DENIED',
|
|
432
|
-
message,
|
|
433
|
-
}),
|
|
434
|
-
}],
|
|
435
|
-
isError: true,
|
|
436
|
-
};
|
|
437
|
-
};
|
|
438
|
-
for (const toolDef of toolMetadata) {
|
|
439
|
-
const toolName = toolDef.name;
|
|
440
|
-
server.registerTool(toolName, {
|
|
441
|
-
description: toolDef.description,
|
|
442
|
-
inputSchema: toolDef.inputSchema,
|
|
443
|
-
}, async (args, ctx) => {
|
|
444
|
-
let reportDeps = deps;
|
|
445
|
-
let reportUserId;
|
|
446
|
-
let reportContext;
|
|
447
|
-
try {
|
|
448
|
-
// Extract the original HTTP request from the MCP server context
|
|
449
|
-
const httpReq = ctx.http?.req;
|
|
450
|
-
if (!httpReq) {
|
|
451
|
-
return {
|
|
452
|
-
content: [{ type: 'text', text: JSON.stringify({ error: 'No HTTP request available in MCP context' }) }],
|
|
453
|
-
isError: true,
|
|
454
|
-
};
|
|
455
|
-
}
|
|
456
|
-
// Resolve the request-local auth/agent snapshot, then repeat the exact
|
|
457
|
-
// tools/list policy decision before chat context, scoped DB, registry,
|
|
458
|
-
// or handler work. This is the forged-call fail-closed boundary.
|
|
459
|
-
const authenticated = await getAuthenticatedRequest(httpReq);
|
|
460
|
-
const preliminaryDecision = capabilityPolicy.authorize(authenticated.preliminarySubject, toolName);
|
|
461
|
-
if (!preliminaryDecision.allowed) {
|
|
462
|
-
observeDenial({
|
|
463
|
-
phase: 'tools/call',
|
|
464
|
-
toolName,
|
|
465
|
-
subject: authenticated.preliminarySubject,
|
|
466
|
-
decision: preliminaryDecision,
|
|
467
|
-
});
|
|
468
|
-
return capabilityDeniedResult(preliminaryDecision);
|
|
469
|
-
}
|
|
470
|
-
const resolved = await getResolvedRequest(httpReq);
|
|
471
|
-
const decision = capabilityPolicy.authorize(resolved.subject, toolName);
|
|
472
|
-
if (!decision.allowed) {
|
|
473
|
-
observeDenial({
|
|
474
|
-
phase: 'tools/call',
|
|
475
|
-
toolName,
|
|
476
|
-
subject: resolved.subject,
|
|
477
|
-
decision,
|
|
478
|
-
});
|
|
479
|
-
return capabilityDeniedResult(decision);
|
|
480
|
-
}
|
|
481
|
-
const { identity, context } = resolved;
|
|
482
|
-
const { userId, agentId } = identity;
|
|
483
|
-
reportUserId = userId;
|
|
484
|
-
// Per-principal MCP throttle. Runs BEFORE any DB work so a throttled
|
|
485
|
-
// call short-circuits cheaply. The /mcp transport bypasses the
|
|
486
|
-
// controller-level RateLimit guard, so this is the only volume cap on
|
|
487
|
-
// tool calls — it stops an over-eager agent from cascading itself into
|
|
488
|
-
// provider rate limits.
|
|
489
|
-
if (deps.mcpRateLimiter) {
|
|
490
|
-
// Throttling is best-effort: never let a limiter failure (or a host
|
|
491
|
-
// implementation that throws instead of failing open) break tool
|
|
492
|
-
// dispatch. Treat any error as "allowed".
|
|
493
|
-
let decision = null;
|
|
494
|
-
try {
|
|
495
|
-
decision = await deps.mcpRateLimiter({
|
|
496
|
-
userId,
|
|
497
|
-
...(agentId ? { agentId } : {}),
|
|
498
|
-
toolName,
|
|
499
|
-
});
|
|
500
|
-
}
|
|
501
|
-
catch (rlErr) {
|
|
502
|
-
logger.warn('MCP rate limiter threw — failing open', {
|
|
503
|
-
toolName,
|
|
504
|
-
error: rlErr instanceof Error ? rlErr.message : String(rlErr),
|
|
505
|
-
});
|
|
506
|
-
}
|
|
507
|
-
if (decision && !decision.allowed) {
|
|
508
|
-
const retryAfterSec = decision.retryAfterSec ?? 60;
|
|
509
|
-
return {
|
|
510
|
-
content: [{
|
|
511
|
-
type: 'text',
|
|
512
|
-
text: JSON.stringify({
|
|
513
|
-
error: 'Rate limit exceeded',
|
|
514
|
-
message: `Too many ${toolName} calls in a short period. Wait ${retryAfterSec}s before retrying.`,
|
|
515
|
-
retryAfterSec,
|
|
516
|
-
}),
|
|
517
|
-
}],
|
|
518
|
-
isError: true,
|
|
519
|
-
};
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
reportContext = context;
|
|
523
|
-
// Build per-request scoped databases via injected factory.
|
|
524
|
-
// Network-scoped agents are clamped to their bound network plus the user's
|
|
525
|
-
// personal network — they cannot reach other networks even when the user is
|
|
526
|
-
// a member of them. The personal-index reachability is preserved so the
|
|
527
|
-
// agent can still manage its owner's profile and contacts.
|
|
528
|
-
const allowedNetworkIds = deriveAllowedNetworkIds({
|
|
529
|
-
memberships: context.userNetworks,
|
|
530
|
-
...(context.scopeType && context.scopeId
|
|
531
|
-
? { scopeType: context.scopeType, scopeId: context.scopeId }
|
|
532
|
-
: {}),
|
|
533
|
-
});
|
|
534
|
-
const scopedDbs = scopedDepsFactory.create(userId, allowedNetworkIds);
|
|
535
|
-
// Override deps with per-request scoped databases
|
|
536
|
-
const requestDeps = { ...deps, ...scopedDbs };
|
|
537
|
-
reportDeps = requestDeps;
|
|
538
|
-
// Re-create registry with per-request deps for scoped database access.
|
|
539
|
-
// Do not use cached registration metadata handlers here: tool handlers
|
|
540
|
-
// close over userDb/systemDb when the registry is created. The MCP
|
|
541
|
-
// surface profile keeps the tools/call lookup identical to tools/list.
|
|
542
|
-
const requestRegistry = createToolRegistry(requestDeps, { surface: 'mcp' });
|
|
543
|
-
const requestTool = requestRegistry.get(toolName);
|
|
544
|
-
if (!requestTool) {
|
|
545
|
-
return {
|
|
546
|
-
content: [{ type: 'text', text: JSON.stringify({ error: `Tool "${toolName}" not found` }) }],
|
|
547
|
-
isError: true,
|
|
548
|
-
};
|
|
549
|
-
}
|
|
550
|
-
// Validate input against the original Zod schema
|
|
551
|
-
const parseResult = toolDef.schema.safeParse(args);
|
|
552
|
-
if (!parseResult.success) {
|
|
553
|
-
const issues = parseResult.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');
|
|
554
|
-
return {
|
|
555
|
-
content: [{ type: 'text', text: JSON.stringify({ success: false, error: `Invalid input: ${issues}` }) }],
|
|
556
|
-
isError: true,
|
|
557
|
-
};
|
|
558
|
-
}
|
|
559
|
-
const validatedArgs = parseResult.data;
|
|
560
|
-
// Execute the tool handler through the shared runtime so MCP calls have
|
|
561
|
-
// consistent timeout, cancellation, progress, and requestContext plumbing.
|
|
562
|
-
const result = await invokeToolRuntime({
|
|
563
|
-
toolName,
|
|
564
|
-
tool: requestTool,
|
|
565
|
-
context,
|
|
566
|
-
query: validatedArgs,
|
|
567
|
-
signal: ctx.mcpReq.signal,
|
|
568
|
-
traceEmitter: createMcpTraceEmitter(toolName, ctx),
|
|
569
|
-
});
|
|
570
|
-
const { text: sanitizedText, isError: toolIsError } = sanitizeMcpResult(result);
|
|
571
|
-
return {
|
|
572
|
-
content: [{ type: 'text', text: sanitizedText }],
|
|
573
|
-
...(toolIsError ? { isError: true } : {}),
|
|
574
|
-
};
|
|
575
|
-
}
|
|
576
|
-
catch (err) {
|
|
577
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
578
|
-
logger.error('MCP tool failed', { toolName, error: message });
|
|
579
|
-
if (shouldReportMcpToolError(err)) {
|
|
580
|
-
reportDeps.reportToolError?.(err, {
|
|
581
|
-
subsystem: 'mcp',
|
|
582
|
-
operation: 'mcp.tool',
|
|
583
|
-
toolName,
|
|
584
|
-
userId: reportUserId,
|
|
585
|
-
tags: {
|
|
586
|
-
transport: 'mcp',
|
|
587
|
-
toolName,
|
|
588
|
-
},
|
|
589
|
-
context: {
|
|
590
|
-
agentId: reportContext?.agentId,
|
|
591
|
-
scopeType: reportContext?.scopeType,
|
|
592
|
-
scopeId: reportContext?.scopeId,
|
|
593
|
-
},
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
|
-
const runtimeResult = toolRuntimeErrorToResult(err);
|
|
597
|
-
return {
|
|
598
|
-
content: [{ type: 'text', text: runtimeResult ?? JSON.stringify({ error: message }) }],
|
|
599
|
-
isError: true,
|
|
600
|
-
};
|
|
601
|
-
}
|
|
602
|
-
});
|
|
603
|
-
}
|
|
604
|
-
// McpServer's default tools/list handler exposes every registered tool.
|
|
605
|
-
// Replace it with a principal-aware inventory built from the same static
|
|
606
|
-
// metadata and the same policy used above for tools/call.
|
|
607
|
-
server.server.setRequestHandler('tools/list', async (_request, ctx) => {
|
|
608
|
-
const httpReq = ctx.http?.req;
|
|
609
|
-
if (!httpReq) {
|
|
610
|
-
throw new Error('No HTTP request available in MCP context');
|
|
611
|
-
}
|
|
612
|
-
const resolved = await getResolvedRequest(httpReq);
|
|
613
|
-
const visibleNames = new Set(capabilityPolicy.visibleToolNames(resolved.subject, toolMetadata.map((tool) => tool.name)));
|
|
614
|
-
return {
|
|
615
|
-
tools: toolMetadata
|
|
616
|
-
.filter((tool) => visibleNames.has(tool.name))
|
|
617
|
-
.map((tool) => ({
|
|
618
|
-
name: tool.name,
|
|
619
|
-
description: tool.description,
|
|
620
|
-
// `jsonSchema` is the zod-derived JSON Schema for the tool's object
|
|
621
|
-
// input, so it always has `type: 'object'`. The SDK describes the same
|
|
622
|
-
// value with two different types — `JsonSchemaType` (json-schema-typed,
|
|
623
|
-
// used by `fromJsonSchema`) and the wire-level `Tool['inputSchema']` —
|
|
624
|
-
// which are structurally incompatible, so bridge them at this boundary.
|
|
625
|
-
inputSchema: tool.jsonSchema,
|
|
626
|
-
})),
|
|
627
|
-
};
|
|
628
|
-
});
|
|
629
|
-
logger.verbose('MCP server created', { toolCount: toolMetadata.length });
|
|
630
|
-
return server;
|
|
631
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Negotiation Insights Generator
|
|
3
|
-
*
|
|
4
|
-
* Produces an aggregated, second-person narrative summarizing a user's
|
|
5
|
-
* negotiation history — topics they're sought for, role patterns,
|
|
6
|
-
* opportunity trends, and interesting signals from recent activity.
|
|
7
|
-
*/
|
|
8
|
-
/** Compressed digest of a user's negotiation history for the LLM. */
|
|
9
|
-
export interface NegotiationDigest {
|
|
10
|
-
totalCount: number;
|
|
11
|
-
opportunityCount: number;
|
|
12
|
-
noOpportunityCount: number;
|
|
13
|
-
inProgressCount: number;
|
|
14
|
-
roleDistribution: Record<string, number>;
|
|
15
|
-
counterparties: string[];
|
|
16
|
-
reasoningExcerpts: string[];
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Generates an aggregated insight summary from a user's negotiation history.
|
|
20
|
-
* @remarks Lightweight single-call agent; no DB access, no side effects.
|
|
21
|
-
*/
|
|
22
|
-
export declare class NegotiationInsightsGenerator {
|
|
23
|
-
private model;
|
|
24
|
-
constructor();
|
|
25
|
-
/**
|
|
26
|
-
* Produces a narrative summary from a negotiation digest.
|
|
27
|
-
* @param digest - Pre-computed statistics and excerpts from the user's negotiations
|
|
28
|
-
* @returns A 2-4 sentence insight paragraph, or null on failure
|
|
29
|
-
*/
|
|
30
|
-
invoke(digest: NegotiationDigest): Promise<string | null>;
|
|
31
|
-
}
|