@indexnetwork/protocol 22.0.0-rc.499.1 → 64.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1841 -0
- package/IMPLEMENTATION.md +140 -181
- package/README.md +16 -20
- package/STABILITY.md +16 -11
- package/dist/{intents/intent.module.d.ts → capabilities/intents.d.ts} +182 -192
- package/dist/capabilities/intents.js +88 -0
- package/dist/capabilities/negotiations.d.ts +17 -0
- package/dist/capabilities/negotiations.js +16 -0
- package/dist/{networks/network.module.d.ts → capabilities/networks.d.ts} +33 -169
- package/dist/{networks/network.module.js → capabilities/networks.js} +6 -17
- package/dist/index.d.ts +57 -134
- package/dist/index.js +41 -105
- package/dist/internal/agents/agent.repository.port.d.ts +59 -0
- package/dist/internal/agents/agent.repository.port.js +7 -0
- package/dist/internal/agents/agent.types.d.ts +35 -0
- package/dist/{agents → internal/agents}/agent.types.js +1 -6
- package/dist/{intents → internal/intents}/graph/intent.graph.d.ts +142 -151
- package/dist/{intents → internal/intents}/graph/intent.graph.execute.d.ts +5 -1
- package/dist/{intents → internal/intents}/graph/intent.graph.execute.js +165 -46
- package/dist/internal/intents/graph/intent.graph.infer.d.ts +78 -0
- package/dist/internal/intents/graph/intent.graph.infer.js +122 -0
- package/dist/internal/intents/graph/intent.graph.js +108 -0
- package/dist/{intents → internal/intents}/graph/intent.graph.reconcile.d.ts +18 -9
- package/dist/internal/intents/graph/intent.graph.reconcile.js +173 -0
- package/dist/internal/intents/graph/intent.graph.shared.d.ts +55 -0
- package/dist/{intents → internal/intents}/graph/intent.graph.shared.js +25 -70
- package/dist/{intents → internal/intents}/graph/intent.graph.state.d.ts +96 -32
- package/dist/{intents → internal/intents}/graph/intent.graph.state.js +42 -31
- package/dist/internal/intents/intent.admission.d.ts +16 -0
- package/dist/internal/intents/intent.admission.js +30 -0
- package/dist/{intents → internal/intents}/intent.inferrer.d.ts +1 -40
- package/dist/{intents → internal/intents}/intent.inferrer.js +13 -49
- package/dist/internal/intents/intent.preparer.d.ts +52 -0
- package/dist/internal/intents/intent.preparer.js +87 -0
- package/dist/{intents → internal/intents}/intent.verifier.d.ts +3 -36
- package/dist/{intents → internal/intents}/intent.verifier.js +0 -17
- package/dist/{networks → internal/networks}/indexer.graph.d.ts +15 -200
- package/dist/{networks → internal/networks}/indexer.graph.js +19 -128
- package/dist/{networks → internal/networks}/indexer.state.d.ts +8 -63
- package/dist/internal/networks/indexer.state.js +70 -0
- package/dist/{networks → internal/networks}/membership.graph.d.ts +6 -6
- package/dist/{networks → internal/networks}/membership.graph.js +3 -3
- package/dist/{networks → internal/networks}/membership.state.d.ts +2 -2
- package/dist/{networks → internal/networks}/membership.state.js +2 -2
- package/dist/{networks → internal/networks}/network.graph.d.ts +9 -22
- package/dist/{networks → internal/networks}/network.graph.js +13 -27
- package/dist/{networks → internal/networks}/network.recommender.d.ts +2 -2
- package/dist/{networks → internal/networks}/network.recommender.js +2 -2
- package/dist/{networks → internal/networks}/network.state.d.ts +4 -7
- package/dist/{networks → internal/networks}/network.state.js +4 -4
- package/dist/internal/opportunities/negotiation-context.loader.d.ts +26 -0
- package/dist/internal/opportunities/negotiation-context.loader.js +36 -0
- package/dist/{opportunities → internal/opportunities}/opportunity.actor.d.ts +1 -1
- package/dist/{opportunities → internal/opportunities}/opportunity.actor.js +7 -1
- package/dist/internal/opportunities/opportunity.counterparties.d.ts +17 -0
- package/dist/internal/opportunities/opportunity.counterparties.js +19 -0
- package/dist/internal/opportunities/opportunity.events.d.ts +38 -0
- package/dist/internal/opportunities/opportunity.events.js +94 -0
- package/dist/{opportunities → internal/opportunities}/opportunity.feed-selection.d.ts +3 -9
- package/dist/internal/opportunities/opportunity.feed-selection.js +40 -0
- package/dist/internal/opportunities/opportunity.graph.modes.d.ts +39 -0
- package/dist/internal/opportunities/opportunity.graph.modes.js +138 -0
- package/dist/{opportunities → internal/opportunities}/opportunity.labels.d.ts +2 -3
- package/dist/internal/opportunities/opportunity.labels.js +9 -0
- package/dist/{opportunities → internal/opportunities}/opportunity.presentation.d.ts +17 -86
- package/dist/{opportunities → internal/opportunities}/opportunity.presentation.js +54 -447
- package/dist/{opportunities → internal/opportunities}/opportunity.update-admission.d.ts +2 -2
- package/dist/internal/opportunities/opportunity.utils.d.ts +105 -0
- package/dist/internal/opportunities/opportunity.utils.js +165 -0
- package/dist/{opportunities → internal/opportunities}/radar/radar.graph.d.ts +17 -17
- package/dist/{opportunities → internal/opportunities}/radar/radar.graph.js +41 -161
- package/dist/{opportunities → internal/opportunities}/radar/radar.state.d.ts +4 -11
- package/dist/{shared → internal/shared}/agent/model-signal.d.ts +1 -1
- package/dist/{shared → internal/shared}/agent/model-signal.js +1 -1
- package/dist/{shared → internal/shared}/agent/model.config.d.ts +28 -86
- package/dist/{shared → internal/shared}/agent/model.config.js +58 -69
- package/dist/internal/shared/agent/model.resolver.d.ts +33 -0
- package/dist/{shared → internal/shared}/agent/model.resolver.js +18 -33
- package/dist/internal/shared/agent/scope.d.ts +20 -0
- package/dist/internal/shared/agent/scope.js +24 -0
- package/dist/internal/shared/assignment/network-assignment.policy.d.ts +23 -0
- package/dist/internal/shared/assignment/network-assignment.policy.js +28 -0
- package/dist/{shared → internal/shared}/observability/log.d.ts +3 -6
- package/dist/{shared → internal/shared}/observability/log.js +9 -18
- package/dist/{shared → internal/shared}/observability/protocol.logger.d.ts +1 -1
- package/dist/{shared → internal/shared}/observability/protocol.logger.js +1 -1
- package/dist/internal/shared/observability/request-context.d.ts +29 -0
- package/dist/internal/shared/observability/request-context.js +17 -0
- package/dist/{shared → internal/shared}/utils/social-label.d.ts +2 -2
- package/dist/{shared → internal/shared}/utils/social-label.js +1 -1
- package/dist/platform/database/capabilities.d.ts +59 -0
- package/dist/{shared/interfaces/database.entities.d.ts → platform/database/entities.d.ts} +81 -121
- package/dist/{shared/interfaces/database.identity-queries.d.ts → platform/database/identity-queries.d.ts} +55 -20
- package/dist/platform/database/member-queries.d.ts +55 -0
- package/dist/platform/database/member-queries.js +4 -0
- package/dist/platform/database/negotiation.d.ts +38 -0
- package/dist/{shared/interfaces/database.network-queries.d.ts → platform/database/network-queries.d.ts} +66 -67
- package/dist/platform/database/network-queries.js +4 -0
- package/dist/{shared/interfaces/database.opportunity-queries.d.ts → platform/database/opportunity-queries.d.ts} +25 -109
- package/dist/{shared/interfaces/database.port.d.ts → platform/database/port.d.ts} +52 -117
- package/dist/{shared/interfaces/database.port.js → platform/database/port.js} +3 -5
- package/dist/platform/database.d.ts +23 -0
- package/dist/{shared/interfaces/database.interface.js → platform/database.js} +1 -1
- package/dist/{shared/interfaces/cache.interface.d.ts → platform/discovery/cache.d.ts} +2 -4
- package/dist/{shared/interfaces/cache.interface.js → platform/discovery/cache.js} +1 -1
- package/dist/platform/discovery/embedder.d.ts +31 -0
- package/dist/platform/runtime/errors.d.ts +6 -0
- package/dist/platform/runtime/errors.js +9 -0
- package/dist/platform/runtime/follow-up.d.ts +36 -0
- package/dist/platform/runtime/follow-up.js +4 -0
- package/dist/platform/runtime/observability.d.ts +34 -0
- package/dist/protocol/core.d.ts +11 -0
- package/dist/protocol/discovery.rules.d.ts +21 -0
- package/dist/protocol/discovery.rules.js +29 -0
- package/dist/protocol/negotiation.constants.d.ts +3 -0
- package/dist/protocol/negotiation.constants.js +3 -0
- package/dist/protocol/negotiation.rules.d.ts +73 -0
- package/dist/protocol/negotiation.rules.js +68 -0
- package/dist/protocol/protocol.prompt.d.ts +13 -0
- package/dist/protocol/protocol.prompt.js +190 -0
- package/dist/{shared → protocol}/schemas/discovery-question.schema.d.ts +13 -13
- package/dist/{shared → protocol}/schemas/discovery-question.schema.js +2 -2
- package/dist/{shared → protocol}/schemas/identity.schema.d.ts +4 -4
- package/dist/{shared → protocol}/schemas/identity.schema.js +4 -4
- package/dist/{shared → protocol}/schemas/network-assignment.schema.d.ts +11 -20
- package/dist/{shared → protocol}/schemas/network-assignment.schema.js +2 -9
- package/dist/protocol/schemas/underspecification.schema.d.ts +9 -0
- package/dist/protocol/schemas/underspecification.schema.js +12 -0
- package/package.json +7 -15
- package/dist/agents/agent.dispatcher.port.d.ts +0 -25
- package/dist/agents/agent.module.d.ts +0 -19
- package/dist/agents/agent.module.js +0 -11
- package/dist/agents/agent.repository.port.d.ts +0 -118
- package/dist/agents/agent.repository.port.js +0 -10
- package/dist/agents/agent.tools.d.ts +0 -16
- package/dist/agents/agent.tools.js +0 -351
- package/dist/agents/agent.tools.port.d.ts +0 -22
- package/dist/agents/agent.tools.port.js +0 -18
- package/dist/agents/agent.types.d.ts +0 -76
- package/dist/chat/chat-streaming.types.d.ts +0 -618
- package/dist/chat/chat-streaming.types.js +0 -297
- package/dist/chat/chat.agent.d.ts +0 -292
- package/dist/chat/chat.agent.js +0 -1010
- package/dist/chat/chat.graph.d.ts +0 -424
- package/dist/chat/chat.graph.js +0 -257
- package/dist/chat/chat.interrupt.classifier.d.ts +0 -25
- package/dist/chat/chat.interrupt.classifier.js +0 -64
- package/dist/chat/chat.persona.d.ts +0 -39
- package/dist/chat/chat.prompt.d.ts +0 -4
- package/dist/chat/chat.prompt.js +0 -12
- package/dist/chat/chat.prompt.modules.d.ts +0 -30
- package/dist/chat/chat.prompt.modules.js +0 -40
- package/dist/chat/chat.question-dedup.d.ts +0 -14
- package/dist/chat/chat.question-dedup.js +0 -17
- package/dist/chat/chat.state.d.ts +0 -135
- package/dist/chat/chat.state.js +0 -120
- package/dist/chat/chat.streamer.d.ts +0 -64
- package/dist/chat/chat.streamer.js +0 -217
- package/dist/chat/chat.suggester.d.ts +0 -23
- package/dist/chat/chat.suggester.js +0 -95
- package/dist/chat/chat.summarizer.d.ts +0 -20
- package/dist/chat/chat.summarizer.js +0 -97
- package/dist/chat/chat.title.generator.d.ts +0 -19
- package/dist/chat/chat.title.generator.js +0 -66
- package/dist/chat/chat.tools.d.ts +0 -5
- package/dist/chat/chat.tools.js +0 -62
- package/dist/chat/chat.utils.d.ts +0 -41
- package/dist/chat/chat.utils.js +0 -88
- package/dist/chat/negotiator.persona.d.ts +0 -74
- package/dist/chat/negotiator.persona.js +0 -154
- package/dist/chat/negotiator.prompt.d.ts +0 -45
- package/dist/chat/negotiator.prompt.js +0 -160
- package/dist/chat/negotiator.tools.d.ts +0 -42
- package/dist/chat/negotiator.tools.js +0 -134
- package/dist/chat/onboarding.persona.d.ts +0 -28
- package/dist/chat/onboarding.persona.js +0 -86
- package/dist/chat/onboarding.prompt.d.ts +0 -6
- package/dist/chat/onboarding.prompt.js +0 -63
- package/dist/chat/signal.persona.d.ts +0 -47
- package/dist/chat/signal.persona.js +0 -319
- package/dist/chat/signal.prompt.d.ts +0 -39
- package/dist/chat/signal.prompt.js +0 -136
- package/dist/contacts/contact.module.d.ts +0 -8
- package/dist/contacts/contact.module.js +0 -6
- package/dist/contacts/contact.repository.port.d.ts +0 -21
- package/dist/contacts/contact.repository.port.js +0 -12
- package/dist/contacts/contact.tools.d.ts +0 -17
- package/dist/contacts/contact.tools.js +0 -108
- package/dist/contacts/contact.tools.port.d.ts +0 -20
- package/dist/contacts/contact.tools.port.js +0 -16
- package/dist/contacts/contact.types.d.ts +0 -24
- package/dist/contacts/contact.types.js +0 -8
- package/dist/contexts/context.generator.d.ts +0 -95
- package/dist/contexts/context.generator.js +0 -127
- package/dist/contexts/context.module.d.ts +0 -13
- package/dist/contexts/context.module.js +0 -12
- package/dist/contexts/context.tools.port.d.ts +0 -9
- package/dist/discovery/hyde.documents.d.ts +0 -9
- package/dist/discovery/hyde.documents.js +0 -49
- package/dist/discovery/hyde.env.d.ts +0 -8
- package/dist/discovery/hyde.env.js +0 -9
- package/dist/discovery/hyde.frame.d.ts +0 -150
- package/dist/discovery/hyde.frame.js +0 -107
- package/dist/discovery/hyde.generator.d.ts +0 -38
- package/dist/discovery/hyde.generator.js +0 -103
- package/dist/discovery/hyde.graph.d.ts +0 -209
- package/dist/discovery/hyde.graph.js +0 -482
- package/dist/discovery/hyde.state.d.ts +0 -70
- package/dist/discovery/hyde.state.js +0 -85
- package/dist/discovery/hyde.strategies.d.ts +0 -17
- package/dist/discovery/hyde.strategies.js +0 -34
- package/dist/discovery/hyde.validator.d.ts +0 -78
- package/dist/discovery/hyde.validator.js +0 -48
- package/dist/discovery/index.d.ts +0 -26
- package/dist/discovery/index.js +0 -19
- package/dist/discovery/lens.inferrer.d.ts +0 -214
- package/dist/discovery/lens.inferrer.js +0 -152
- package/dist/enrichment/enrichment.generator.d.ts +0 -68
- package/dist/enrichment/enrichment.generator.js +0 -95
- package/dist/enrichment/enrichment.graph.d.ts +0 -544
- package/dist/enrichment/enrichment.graph.js +0 -695
- package/dist/enrichment/enrichment.state.d.ts +0 -141
- package/dist/enrichment/enrichment.state.js +0 -115
- package/dist/enrichment/enrichment.tools.context-read.d.ts +0 -10
- package/dist/enrichment/enrichment.tools.context-read.js +0 -353
- package/dist/enrichment/enrichment.tools.context-write.d.ts +0 -9
- package/dist/enrichment/enrichment.tools.context-write.js +0 -417
- package/dist/enrichment/enrichment.tools.d.ts +0 -13
- package/dist/enrichment/enrichment.tools.helpers.d.ts +0 -139
- package/dist/enrichment/enrichment.tools.helpers.js +0 -234
- package/dist/enrichment/enrichment.tools.js +0 -153
- package/dist/intents/graph/intent.graph.infer.d.ts +0 -44
- package/dist/intents/graph/intent.graph.infer.js +0 -97
- package/dist/intents/graph/intent.graph.js +0 -134
- package/dist/intents/graph/intent.graph.reconcile.js +0 -274
- package/dist/intents/graph/intent.graph.shared.d.ts +0 -68
- package/dist/intents/intake/intake.orchestrator.d.ts +0 -203
- package/dist/intents/intake/intake.orchestrator.js +0 -255
- package/dist/intents/intake/intake.pack.generator.d.ts +0 -57
- package/dist/intents/intake/intake.pack.generator.js +0 -90
- package/dist/intents/intent.clarifier.d.ts +0 -51
- package/dist/intents/intent.clarifier.js +0 -201
- package/dist/intents/intent.indexer.d.ts +0 -82
- package/dist/intents/intent.indexer.js +0 -170
- package/dist/intents/intent.module.js +0 -103
- package/dist/intents/intent.proposal.d.ts +0 -37
- package/dist/intents/intent.proposal.js +0 -14
- package/dist/intents/intent.reconciler.d.ts +0 -105
- package/dist/intents/intent.reconciler.js +0 -186
- package/dist/intents/intent.tools.d.ts +0 -27
- package/dist/intents/intent.tools.js +0 -808
- package/dist/maintenance/maintenance.graph.d.ts +0 -239
- package/dist/maintenance/maintenance.graph.js +0 -199
- package/dist/maintenance/maintenance.state.d.ts +0 -35
- package/dist/maintenance/maintenance.state.js +0 -55
- package/dist/mcp/elicitation.builder.d.ts +0 -53
- package/dist/mcp/elicitation.builder.js +0 -74
- package/dist/mcp/elicitation.dispatcher.d.ts +0 -36
- package/dist/mcp/elicitation.dispatcher.js +0 -86
- package/dist/mcp/mcp.authorization-policy.d.ts +0 -252
- package/dist/mcp/mcp.authorization-policy.js +0 -535
- package/dist/mcp/mcp.server.d.ts +0 -90
- package/dist/mcp/mcp.server.js +0 -631
- package/dist/negotiations/insight.generator.d.ts +0 -31
- package/dist/negotiations/insight.generator.js +0 -105
- package/dist/negotiations/negotiation.agent.d.ts +0 -130
- package/dist/negotiations/negotiation.agent.js +0 -396
- package/dist/negotiations/negotiation.answer-consumption.d.ts +0 -223
- package/dist/negotiations/negotiation.answer-consumption.js +0 -275
- package/dist/negotiations/negotiation.attribution.d.ts +0 -91
- package/dist/negotiations/negotiation.attribution.js +0 -109
- package/dist/negotiations/negotiation.candidates.d.ts +0 -83
- package/dist/negotiations/negotiation.candidates.js +0 -162
- package/dist/negotiations/negotiation.client-dm.d.ts +0 -50
- package/dist/negotiations/negotiation.client-dm.js +0 -66
- package/dist/negotiations/negotiation.consultation-policy.d.ts +0 -95
- package/dist/negotiations/negotiation.consultation-policy.js +0 -159
- package/dist/negotiations/negotiation.deadlock.contracts.d.ts +0 -10
- package/dist/negotiations/negotiation.deadlock.d.ts +0 -87
- package/dist/negotiations/negotiation.deadlock.js +0 -150
- package/dist/negotiations/negotiation.detail-reader.d.ts +0 -94
- package/dist/negotiations/negotiation.detail-reader.js +0 -91
- package/dist/negotiations/negotiation.expected-speaker.d.ts +0 -33
- package/dist/negotiations/negotiation.expected-speaker.js +0 -59
- package/dist/negotiations/negotiation.graph.d.ts +0 -694
- package/dist/negotiations/negotiation.graph.finalize.d.ts +0 -5
- package/dist/negotiations/negotiation.graph.finalize.js +0 -403
- package/dist/negotiations/negotiation.graph.init.d.ts +0 -54
- package/dist/negotiations/negotiation.graph.init.js +0 -256
- package/dist/negotiations/negotiation.graph.js +0 -94
- package/dist/negotiations/negotiation.graph.screen.d.ts +0 -23
- package/dist/negotiations/negotiation.graph.screen.js +0 -108
- package/dist/negotiations/negotiation.graph.shared.d.ts +0 -111
- package/dist/negotiations/negotiation.graph.shared.js +0 -168
- package/dist/negotiations/negotiation.graph.turn.d.ts +0 -134
- package/dist/negotiations/negotiation.graph.turn.js +0 -662
- package/dist/negotiations/negotiation.hermes-contract.d.ts +0 -31
- package/dist/negotiations/negotiation.hermes-contract.js +0 -72
- package/dist/negotiations/negotiation.intent-snapshot-provenance.d.ts +0 -21
- package/dist/negotiations/negotiation.intent-snapshot-provenance.js +0 -28
- package/dist/negotiations/negotiation.lifecycle-narration.d.ts +0 -18
- package/dist/negotiations/negotiation.lifecycle-narration.js +0 -87
- package/dist/negotiations/negotiation.memory.d.ts +0 -65
- package/dist/negotiations/negotiation.memory.js +0 -83
- package/dist/negotiations/negotiation.module.d.ts +0 -36
- package/dist/negotiations/negotiation.module.js +0 -23
- package/dist/negotiations/negotiation.protocol.d.ts +0 -1018
- package/dist/negotiations/negotiation.protocol.js +0 -224
- package/dist/negotiations/negotiation.question-safety.d.ts +0 -52
- package/dist/negotiations/negotiation.question-safety.js +0 -119
- package/dist/negotiations/negotiation.reflect.d.ts +0 -194
- package/dist/negotiations/negotiation.reflect.js +0 -145
- package/dist/negotiations/negotiation.scope.d.ts +0 -41
- package/dist/negotiations/negotiation.scope.js +0 -39
- package/dist/negotiations/negotiation.screen.contracts.d.ts +0 -88
- package/dist/negotiations/negotiation.screen.contracts.js +0 -58
- package/dist/negotiations/negotiation.screen.d.ts +0 -78
- package/dist/negotiations/negotiation.screen.js +0 -112
- package/dist/negotiations/negotiation.stall-gap.d.ts +0 -83
- package/dist/negotiations/negotiation.stall-gap.js +0 -152
- package/dist/negotiations/negotiation.stance.contracts.d.ts +0 -123
- package/dist/negotiations/negotiation.stance.contracts.js +0 -317
- package/dist/negotiations/negotiation.state.d.ts +0 -597
- package/dist/negotiations/negotiation.state.js +0 -286
- package/dist/negotiations/negotiation.summarizer.d.ts +0 -25
- package/dist/negotiations/negotiation.summarizer.js +0 -101
- package/dist/negotiations/negotiation.task-lock-policy.d.ts +0 -10
- package/dist/negotiations/negotiation.task-lock-policy.js +0 -22
- package/dist/negotiations/negotiation.tools.d.ts +0 -18
- package/dist/negotiations/negotiation.tools.js +0 -842
- package/dist/negotiations/negotiation.tools.port.d.ts +0 -17
- package/dist/negotiations/negotiation.turn-cap.d.ts +0 -9
- package/dist/negotiations/negotiation.turn-cap.js +0 -12
- package/dist/networks/indexer.state.js +0 -112
- package/dist/networks/network.tools.d.ts +0 -36
- package/dist/networks/network.tools.js +0 -594
- package/dist/opportunities/delivery-card.cache.d.ts +0 -25
- package/dist/opportunities/delivery-card.cache.js +0 -43
- package/dist/opportunities/discovery.env.d.ts +0 -20
- package/dist/opportunities/discovery.env.js +0 -109
- package/dist/opportunities/discriminator/discriminator.adjustments.d.ts +0 -90
- package/dist/opportunities/discriminator/discriminator.adjustments.js +0 -141
- package/dist/opportunities/discriminator/discriminator.assigner.d.ts +0 -78
- package/dist/opportunities/discriminator/discriminator.assigner.js +0 -153
- package/dist/opportunities/discriminator/discriminator.env.d.ts +0 -103
- package/dist/opportunities/discriminator/discriminator.env.js +0 -103
- package/dist/opportunities/discriminator/discriminator.miner.d.ts +0 -114
- package/dist/opportunities/discriminator/discriminator.miner.js +0 -228
- package/dist/opportunities/discriminator/discriminator.push.d.ts +0 -13
- package/dist/opportunities/discriminator/discriminator.push.js +0 -19
- package/dist/opportunities/discriminator/discriminator.question.d.ts +0 -58
- package/dist/opportunities/discriminator/discriminator.question.js +0 -155
- package/dist/opportunities/discriminator/discriminator.scorer.d.ts +0 -32
- package/dist/opportunities/discriminator/discriminator.scorer.js +0 -105
- package/dist/opportunities/discriminator/discriminator.shadow.d.ts +0 -32
- package/dist/opportunities/discriminator/discriminator.shadow.js +0 -90
- package/dist/opportunities/discriminator/discriminator.types.d.ts +0 -93
- package/dist/opportunities/discriminator/discriminator.types.js +0 -18
- package/dist/opportunities/negotiation-context.loader.d.ts +0 -59
- package/dist/opportunities/negotiation-context.loader.js +0 -90
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.env.d.ts +0 -43
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.env.js +0 -44
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.extractor.d.ts +0 -24
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.extractor.js +0 -188
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.miner.d.ts +0 -26
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.miner.js +0 -112
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.shadow.d.ts +0 -19
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.shadow.js +0 -61
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.types.d.ts +0 -191
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.types.js +0 -18
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.verifier.d.ts +0 -34
- package/dist/opportunities/negotiation-evidence/negotiation-evidence.verifier.js +0 -91
- package/dist/opportunities/negotiation-summary.builder.d.ts +0 -37
- package/dist/opportunities/negotiation-summary.builder.js +0 -66
- package/dist/opportunities/opportunity.discovery-negotiation-summary.d.ts +0 -14
- package/dist/opportunities/opportunity.discovery-negotiation-summary.js +0 -46
- package/dist/opportunities/opportunity.enricher.d.ts +0 -71
- package/dist/opportunities/opportunity.enricher.js +0 -280
- package/dist/opportunities/opportunity.evaluator.d.ts +0 -289
- package/dist/opportunities/opportunity.evaluator.js +0 -516
- package/dist/opportunities/opportunity.evidence.d.ts +0 -22
- package/dist/opportunities/opportunity.evidence.js +0 -87
- package/dist/opportunities/opportunity.existing-negotiation.d.ts +0 -79
- package/dist/opportunities/opportunity.existing-negotiation.js +0 -118
- package/dist/opportunities/opportunity.feed-selection.js +0 -96
- package/dist/opportunities/opportunity.graph.d.ts +0 -1611
- package/dist/opportunities/opportunity.graph.discovery-strategies.d.ts +0 -109
- package/dist/opportunities/opportunity.graph.discovery-strategies.js +0 -451
- package/dist/opportunities/opportunity.graph.discovery.d.ts +0 -69
- package/dist/opportunities/opportunity.graph.discovery.js +0 -397
- package/dist/opportunities/opportunity.graph.evaluation.d.ts +0 -82
- package/dist/opportunities/opportunity.graph.evaluation.js +0 -608
- package/dist/opportunities/opportunity.graph.js +0 -193
- package/dist/opportunities/opportunity.graph.modes.d.ts +0 -538
- package/dist/opportunities/opportunity.graph.modes.js +0 -538
- package/dist/opportunities/opportunity.graph.negotiate.d.ts +0 -109
- package/dist/opportunities/opportunity.graph.negotiate.js +0 -392
- package/dist/opportunities/opportunity.graph.persist-node.d.ts +0 -93
- package/dist/opportunities/opportunity.graph.persist-node.js +0 -765
- package/dist/opportunities/opportunity.graph.prep.d.ts +0 -150
- package/dist/opportunities/opportunity.graph.prep.js +0 -381
- package/dist/opportunities/opportunity.graph.shared.d.ts +0 -173
- package/dist/opportunities/opportunity.graph.shared.js +0 -199
- package/dist/opportunities/opportunity.introducer-feature.d.ts +0 -2
- package/dist/opportunities/opportunity.introducer-feature.js +0 -4
- package/dist/opportunities/opportunity.introducer.d.ts +0 -77
- package/dist/opportunities/opportunity.introducer.js +0 -99
- package/dist/opportunities/opportunity.labels.js +0 -10
- package/dist/opportunities/opportunity.lifecycle.d.ts +0 -63
- package/dist/opportunities/opportunity.lifecycle.js +0 -181
- package/dist/opportunities/opportunity.module.d.ts +0 -54
- package/dist/opportunities/opportunity.module.js +0 -39
- package/dist/opportunities/opportunity.newborn-stamping.d.ts +0 -41
- package/dist/opportunities/opportunity.newborn-stamping.js +0 -81
- package/dist/opportunities/opportunity.owner-approval.d.ts +0 -118
- package/dist/opportunities/opportunity.owner-approval.js +0 -34
- package/dist/opportunities/opportunity.owner-provenance.d.ts +0 -6
- package/dist/opportunities/opportunity.owner-provenance.js +0 -28
- package/dist/opportunities/opportunity.persist.d.ts +0 -58
- package/dist/opportunities/opportunity.persist.js +0 -145
- package/dist/opportunities/opportunity.persistence-admission.d.ts +0 -39
- package/dist/opportunities/opportunity.persistence-admission.js +0 -59
- package/dist/opportunities/opportunity.state.d.ts +0 -451
- package/dist/opportunities/opportunity.state.js +0 -256
- package/dist/opportunities/opportunity.tools.cards.d.ts +0 -138
- package/dist/opportunities/opportunity.tools.cards.js +0 -212
- package/dist/opportunities/opportunity.tools.d.ts +0 -12
- package/dist/opportunities/opportunity.tools.js +0 -236
- package/dist/opportunities/opportunity.tools.list.d.ts +0 -10
- package/dist/opportunities/opportunity.tools.list.js +0 -489
- package/dist/opportunities/opportunity.tools.port.d.ts +0 -16
- package/dist/opportunities/opportunity.utils.d.ts +0 -217
- package/dist/opportunities/opportunity.utils.js +0 -395
- package/dist/opportunities/outcome/outcome.env.d.ts +0 -60
- package/dist/opportunities/outcome/outcome.env.js +0 -63
- package/dist/opportunities/outcome/outcome.hypotheses.d.ts +0 -29
- package/dist/opportunities/outcome/outcome.hypotheses.js +0 -117
- package/dist/opportunities/outcome/outcome.shadow.d.ts +0 -56
- package/dist/opportunities/outcome/outcome.shadow.js +0 -87
- package/dist/opportunities/outcome/outcome.types.d.ts +0 -110
- package/dist/opportunities/outcome/outcome.types.js +0 -26
- package/dist/opportunities/radar/radar.health.d.ts +0 -31
- package/dist/opportunities/radar/radar.health.js +0 -75
- package/dist/premises/premise.analyzer.d.ts +0 -35
- package/dist/premises/premise.analyzer.js +0 -115
- package/dist/premises/premise.decomposer.d.ts +0 -69
- package/dist/premises/premise.decomposer.js +0 -213
- package/dist/premises/premise.graph.d.ts +0 -345
- package/dist/premises/premise.graph.js +0 -278
- package/dist/premises/premise.indexer.d.ts +0 -35
- package/dist/premises/premise.indexer.js +0 -86
- package/dist/premises/premise.state.d.ts +0 -67
- package/dist/premises/premise.state.js +0 -94
- package/dist/premises/premise.tools.d.ts +0 -3
- package/dist/premises/premise.tools.js +0 -248
- package/dist/questions/question.env.d.ts +0 -27
- package/dist/questions/question.env.js +0 -27
- package/dist/questions/question.input.d.ts +0 -107
- package/dist/questions/question.module.d.ts +0 -30
- package/dist/questions/question.module.js +0 -28
- package/dist/questions/question.schema.d.ts +0 -1529
- package/dist/questions/question.schema.js +0 -420
- package/dist/shared/agent/activity-projection.d.ts +0 -271
- package/dist/shared/agent/activity-projection.js +0 -254
- package/dist/shared/agent/canonical-guidance.d.ts +0 -30
- package/dist/shared/agent/canonical-guidance.js +0 -246
- package/dist/shared/agent/model.resolver.d.ts +0 -48
- package/dist/shared/agent/tool.factory.d.ts +0 -17
- package/dist/shared/agent/tool.factory.js +0 -221
- package/dist/shared/agent/tool.helpers.d.ts +0 -482
- package/dist/shared/agent/tool.helpers.js +0 -232
- package/dist/shared/agent/tool.registry.d.ts +0 -25
- package/dist/shared/agent/tool.registry.js +0 -76
- package/dist/shared/agent/tool.runtime.d.ts +0 -28
- package/dist/shared/agent/tool.runtime.js +0 -194
- package/dist/shared/agent/tool.scope.d.ts +0 -44
- package/dist/shared/agent/tool.scope.js +0 -50
- package/dist/shared/agent/utility.tools.d.ts +0 -15
- package/dist/shared/agent/utility.tools.js +0 -322
- package/dist/shared/assignment/network-assignment.policy.d.ts +0 -61
- package/dist/shared/assignment/network-assignment.policy.js +0 -105
- package/dist/shared/interfaces/agent-dispatcher.interface.d.ts +0 -100
- package/dist/shared/interfaces/agent-dispatcher.interface.js +0 -12
- package/dist/shared/interfaces/auth.interface.d.ts +0 -37
- package/dist/shared/interfaces/auth.interface.js +0 -1
- package/dist/shared/interfaces/chat-message-writer.interface.d.ts +0 -18
- package/dist/shared/interfaces/chat-message-writer.interface.js +0 -1
- package/dist/shared/interfaces/chat-session.interface.d.ts +0 -23
- package/dist/shared/interfaces/chat-session.interface.js +0 -18
- package/dist/shared/interfaces/chat-summary.interface.d.ts +0 -16
- package/dist/shared/interfaces/chat-summary.interface.js +0 -1
- package/dist/shared/interfaces/database.capabilities.d.ts +0 -100
- package/dist/shared/interfaces/database.interface.d.ts +0 -16
- package/dist/shared/interfaces/database.member-queries.d.ts +0 -219
- package/dist/shared/interfaces/database.member-queries.js +0 -4
- package/dist/shared/interfaces/database.negotiation.d.ts +0 -329
- package/dist/shared/interfaces/database.negotiation.js +0 -26
- package/dist/shared/interfaces/database.network-queries.js +0 -4
- package/dist/shared/interfaces/database.opportunity-queries.js +0 -4
- package/dist/shared/interfaces/delivery-ledger.interface.d.ts +0 -40
- package/dist/shared/interfaces/delivery-ledger.interface.js +0 -5
- package/dist/shared/interfaces/embedder.interface.d.ts +0 -92
- package/dist/shared/interfaces/embedder.interface.js +0 -4
- package/dist/shared/interfaces/enrichment-run.interface.d.ts +0 -62
- package/dist/shared/interfaces/enrichment-run.interface.js +0 -1
- package/dist/shared/interfaces/enrichment.interface.js +0 -1
- package/dist/shared/interfaces/negotiation-events.interface.d.ts +0 -77
- package/dist/shared/interfaces/negotiation-events.interface.js +0 -6
- package/dist/shared/interfaces/negotiation-summary.interface.d.ts +0 -25
- package/dist/shared/interfaces/negotiation-summary.interface.js +0 -1
- package/dist/shared/interfaces/negotiator-memory.interface.d.ts +0 -58
- package/dist/shared/interfaces/negotiator-memory.interface.js +0 -11
- package/dist/shared/interfaces/queue.interface.d.ts +0 -23
- package/dist/shared/interfaces/queue.interface.js +0 -4
- package/dist/shared/interfaces/scraper.interface.js +0 -1
- package/dist/shared/interfaces/tool-request-context.interface.d.ts +0 -11
- package/dist/shared/interfaces/tool-request-context.interface.js +0 -1
- package/dist/shared/observability/request-context.d.ts +0 -27
- package/dist/shared/observability/request-context.js +0 -6
- package/dist/shared/schemas/mcp-auth.schema.d.ts +0 -87
- package/dist/shared/schemas/mcp-auth.schema.js +0 -56
- package/dist/shared/schemas/negotiation-digest.schema.d.ts +0 -58
- package/dist/shared/schemas/negotiation-digest.schema.js +0 -38
- package/dist/shared/schemas/negotiation-state.schema.d.ts +0 -343
- package/dist/shared/schemas/negotiation-state.schema.js +0 -81
- package/dist/shared/schemas/question-block.fixture.d.ts +0 -12
- package/dist/shared/schemas/question-block.fixture.js +0 -39
- package/dist/shared/schemas/question-block.schema.d.ts +0 -111
- package/dist/shared/schemas/question-block.schema.js +0 -124
- package/dist/shared/schemas/structured-question.schema.d.ts +0 -66
- package/dist/shared/schemas/structured-question.schema.js +0 -31
- package/dist/shared/schemas/underspecification.schema.d.ts +0 -13
- package/dist/shared/schemas/underspecification.schema.js +0 -16
- /package/dist/{opportunities → internal/opportunities}/opportunity.update-admission.js +0 -0
- /package/dist/{opportunities → internal/opportunities}/radar/radar.state.js +0 -0
- /package/dist/{shared → internal/shared}/network/metadata.renderer.d.ts +0 -0
- /package/dist/{shared → internal/shared}/network/metadata.renderer.js +0 -0
- /package/dist/{shared → internal/shared}/observability/debug-meta.sanitizer.d.ts +0 -0
- /package/dist/{shared → internal/shared}/observability/debug-meta.sanitizer.js +0 -0
- /package/dist/{shared → internal/shared}/observability/performance.d.ts +0 -0
- /package/dist/{shared → internal/shared}/observability/performance.js +0 -0
- /package/dist/{shared → internal/shared}/observability/trace.d.ts +0 -0
- /package/dist/{shared → internal/shared}/observability/trace.js +0 -0
- /package/dist/{shared → internal/shared}/utils/claim-safety.d.ts +0 -0
- /package/dist/{shared → internal/shared}/utils/claim-safety.js +0 -0
- /package/dist/{shared → internal/shared}/utils/telegram-handle.d.ts +0 -0
- /package/dist/{shared → internal/shared}/utils/telegram-handle.js +0 -0
- /package/dist/{shared/interfaces/database.capabilities.js → platform/database/capabilities.js} +0 -0
- /package/dist/{shared/interfaces/database.entities.js → platform/database/entities.js} +0 -0
- /package/dist/{shared/interfaces/database.identity-queries.js → platform/database/identity-queries.js} +0 -0
- /package/dist/{agents/agent.dispatcher.port.js → platform/database/negotiation.js} +0 -0
- /package/dist/{chat/chat.persona.js → platform/database/opportunity-queries.js} +0 -0
- /package/dist/{contexts/context.tools.port.js → platform/discovery/embedder.js} +0 -0
- /package/dist/{shared/interfaces/scraper.interface.d.ts → platform/discovery/scraper.d.ts} +0 -0
- /package/dist/{negotiations/negotiation.deadlock.contracts.js → platform/discovery/scraper.js} +0 -0
- /package/dist/{shared/interfaces/enrichment.interface.d.ts → platform/enrichment/ports.d.ts} +0 -0
- /package/dist/{negotiations/negotiation.tools.port.js → platform/enrichment/ports.js} +0 -0
- /package/dist/{opportunities/opportunity.tools.port.js → platform/runtime/observability.js} +0 -0
- /package/dist/{questions/question.input.js → protocol/core.js} +0 -0
- /package/dist/{shared → protocol}/schemas/chat-context.schema.d.ts +0 -0
- /package/dist/{shared → protocol}/schemas/chat-context.schema.js +0 -0
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Intent graph, stage 4 and the read fast path.
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { buildManualAssignmentMetadata } from "../../shared/assignment/network-assignment.policy.js";
|
|
5
5
|
import { timed } from "../../shared/observability/performance.js";
|
|
6
|
-
import { enforceIntentActionBoundary, generateIntentEmbedding, logger, toSpeechActType } from "./intent.graph.shared.js";
|
|
6
|
+
import { enforceIntentActionBoundary, generateIntentEmbedding, normalizeIntentDescription, isExplicitUpdateRequest, logger, toSpeechActType } from "./intent.graph.shared.js";
|
|
7
7
|
/**
|
|
8
8
|
* Node 4: Executor
|
|
9
9
|
* Executes reconciler actions against the database.
|
|
10
10
|
*/
|
|
11
11
|
export async function executorNode(state, deps) {
|
|
12
12
|
return timed("IntentGraph.executor", async () => {
|
|
13
|
-
const actions = enforceIntentActionBoundary(state
|
|
13
|
+
const actions = enforceIntentActionBoundary(isExplicitUpdateRequest(state), state.targetIntentIds, state.actions ?? []);
|
|
14
14
|
if (actions.length === 0) {
|
|
15
15
|
return { executionResults: [] };
|
|
16
16
|
}
|
|
17
17
|
logger.verbose('Executing actions', { count: actions.length });
|
|
18
18
|
const results = [];
|
|
19
|
+
let transitionResult;
|
|
19
20
|
const scopeEnvelope = state.scopeType && state.scopeId
|
|
20
21
|
? { scopeType: state.scopeType, scopeId: state.scopeId }
|
|
21
22
|
: {};
|
|
23
|
+
const networkScopeId = state.scopeType === 'network' ? state.scopeId : undefined;
|
|
22
24
|
const verifiedIntentByPayload = new Map();
|
|
23
25
|
for (const verifiedIntent of state.verifiedIntents) {
|
|
24
26
|
verifiedIntentByPayload.set(verifiedIntent.description, verifiedIntent);
|
|
@@ -29,37 +31,43 @@ export async function executorNode(state, deps) {
|
|
|
29
31
|
try {
|
|
30
32
|
if (actionType === 'create') {
|
|
31
33
|
const createAction = action;
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
// Generate embedding for the intent payload
|
|
36
|
-
const flatEmbedding = await generateIntentEmbedding(deps, sanitizedPayload);
|
|
34
|
+
const payload = createAction.payload;
|
|
35
|
+
const metadata = createAction.metadata;
|
|
36
|
+
const flatEmbedding = await generateIntentEmbedding(deps, payload);
|
|
37
37
|
const created = await deps.database.createIntent({
|
|
38
38
|
userId: state.userId,
|
|
39
|
-
payload
|
|
40
|
-
confidence:
|
|
39
|
+
payload,
|
|
40
|
+
confidence: 1.0,
|
|
41
41
|
inferenceType: 'explicit',
|
|
42
42
|
sourceType: 'discovery_form',
|
|
43
43
|
embedding: flatEmbedding,
|
|
44
|
-
semanticEntropy:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
44
|
+
semanticEntropy: metadata?.semanticEntropy ?? null,
|
|
45
|
+
referentialAnchor: metadata?.referentialAnchor ?? null,
|
|
46
|
+
felicityAuthority: metadata?.felicityAuthority ?? null,
|
|
47
|
+
felicitySincerity: metadata?.felicitySincerity ?? null,
|
|
48
|
+
felicityClarity: metadata?.felicityClarity ?? null,
|
|
49
|
+
intentMode: metadata?.intentMode ?? null,
|
|
50
|
+
speechActType: metadata?.speechActType ?? null,
|
|
51
|
+
});
|
|
52
|
+
const linkedNetworkIds = await linkIntentToNetworks(deps, state, created.id);
|
|
53
|
+
results.push({
|
|
54
|
+
actionType: 'create',
|
|
55
|
+
success: true,
|
|
56
|
+
intentId: created.id,
|
|
57
|
+
payload,
|
|
58
|
+
linkedNetworkIds,
|
|
55
59
|
});
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
logger.verbose('Created intent', { intentId: created.id, linkedNetworkIds });
|
|
61
|
+
if (!metadata && deps.intentFollowUp) {
|
|
62
|
+
void Promise.resolve().then(() => deps.intentFollowUp.scoreIntent({
|
|
63
|
+
intentId: created.id, userId: state.userId, payload,
|
|
64
|
+
})).catch((error) => logger.error('Intent rescoring failed; saved intent retained', { intentId: created.id, error }));
|
|
65
|
+
}
|
|
66
|
+
deps.intentFollowUp?.onIntentSaved({
|
|
59
67
|
intentId: created.id,
|
|
60
68
|
userId: state.userId,
|
|
61
69
|
...scopeEnvelope,
|
|
62
|
-
}).catch((err) => logger.error('Failed to
|
|
70
|
+
}).catch((err) => logger.error('Failed to run intent follow-up', { intentId: created.id, error: err }));
|
|
63
71
|
}
|
|
64
72
|
else if (actionType === 'update') {
|
|
65
73
|
const updateAction = action;
|
|
@@ -94,11 +102,11 @@ export async function executorNode(state, deps) {
|
|
|
94
102
|
});
|
|
95
103
|
logger.verbose('Updated intent', { intentId: updateAction.id });
|
|
96
104
|
if (updated) {
|
|
97
|
-
deps.
|
|
105
|
+
deps.intentFollowUp?.onIntentSaved({
|
|
98
106
|
intentId: updateAction.id,
|
|
99
107
|
userId: state.userId,
|
|
100
108
|
...scopeEnvelope,
|
|
101
|
-
}).catch((err) => logger.error('Failed to
|
|
109
|
+
}).catch((err) => logger.error('Failed to run intent follow-up', { intentId: updateAction.id, error: err }));
|
|
102
110
|
}
|
|
103
111
|
}
|
|
104
112
|
else if (actionType === 'expire') {
|
|
@@ -112,9 +120,89 @@ export async function executorNode(state, deps) {
|
|
|
112
120
|
});
|
|
113
121
|
logger.verbose('Archived intent', { intentId: expireAction.id });
|
|
114
122
|
if (result.success) {
|
|
115
|
-
|
|
123
|
+
try {
|
|
124
|
+
await deps.database.deleteIntentNetworkAssociations(expireAction.id);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
logger.error('Failed to delete intent-network associations', { intentId: expireAction.id, error: err });
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const expiredCount = await deps.database.expireOpportunitiesByIntentActor(expireAction.id);
|
|
131
|
+
if (expiredCount > 0) {
|
|
132
|
+
logger.verbose('Expired opportunities referencing intent', { intentId: expireAction.id, expiredCount });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
logger.error('Failed to expire opportunities', { intentId: expireAction.id, error: err });
|
|
137
|
+
}
|
|
138
|
+
deps.intentFollowUp?.onIntentArchived({ intentId: expireAction.id }).catch((err) => logger.error('Failed to run intent archive follow-up', { intentId: expireAction.id, error: err }));
|
|
116
139
|
}
|
|
117
140
|
}
|
|
141
|
+
else if (actionType === 'transition') {
|
|
142
|
+
const transitionAction = action;
|
|
143
|
+
const dbResult = await deps.database.transitionIntentLifecycle({
|
|
144
|
+
intentId: transitionAction.id,
|
|
145
|
+
userId: state.userId,
|
|
146
|
+
status: transitionAction.status,
|
|
147
|
+
networkScopeId,
|
|
148
|
+
});
|
|
149
|
+
let outcome;
|
|
150
|
+
if (dbResult.kind !== 'success' || dbResult.status === 'PAUSED') {
|
|
151
|
+
outcome = dbResult;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
try {
|
|
155
|
+
await deps.intentFollowUp?.onIntentResumed({
|
|
156
|
+
intentId: dbResult.id,
|
|
157
|
+
userId: state.userId,
|
|
158
|
+
lifecycleVersionMs: dbResult.lifecycleVersionMs,
|
|
159
|
+
});
|
|
160
|
+
outcome = dbResult;
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
logger.warn('Failed to enqueue resumed intent discovery', {
|
|
164
|
+
intentId: dbResult.id,
|
|
165
|
+
lifecycleVersionMs: dbResult.lifecycleVersionMs,
|
|
166
|
+
changed: dbResult.changed,
|
|
167
|
+
error: err,
|
|
168
|
+
});
|
|
169
|
+
if (!dbResult.changed) {
|
|
170
|
+
outcome = { kind: 'enqueue_failed', id: dbResult.id, status: dbResult.status, lifecycleVersionMs: dbResult.lifecycleVersionMs };
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
let authoritative = null;
|
|
174
|
+
try {
|
|
175
|
+
authoritative = await deps.database.compensateFailedResume({
|
|
176
|
+
intentId: transitionAction.id,
|
|
177
|
+
userId: state.userId,
|
|
178
|
+
lifecycleVersionMs: dbResult.lifecycleVersionMs,
|
|
179
|
+
networkScopeId,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
catch (compensationError) {
|
|
183
|
+
logger.error('Failed to compensate resumed intent after enqueue failure', {
|
|
184
|
+
intentId: transitionAction.id,
|
|
185
|
+
lifecycleVersionMs: dbResult.lifecycleVersionMs,
|
|
186
|
+
compensationError,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
outcome = {
|
|
190
|
+
kind: 'enqueue_failed',
|
|
191
|
+
id: dbResult.id,
|
|
192
|
+
status: (authoritative?.status ?? dbResult.status),
|
|
193
|
+
lifecycleVersionMs: authoritative?.lifecycleVersionMs ?? dbResult.lifecycleVersionMs,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
transitionResult = outcome;
|
|
199
|
+
results.push({
|
|
200
|
+
actionType: 'transition',
|
|
201
|
+
success: outcome.kind === 'success',
|
|
202
|
+
intentId: 'id' in outcome ? outcome.id : transitionAction.id,
|
|
203
|
+
error: outcome.kind !== 'success' ? outcome.kind : undefined,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
118
206
|
}
|
|
119
207
|
catch (error) {
|
|
120
208
|
logger.error('Failed to execute action', { actionType: action.type, error });
|
|
@@ -126,9 +214,40 @@ export async function executorNode(state, deps) {
|
|
|
126
214
|
});
|
|
127
215
|
}
|
|
128
216
|
}
|
|
129
|
-
return { executionResults: results };
|
|
217
|
+
return { executionResults: results, transitionResult };
|
|
130
218
|
});
|
|
131
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* Link a freshly created intent to exactly the networks the caller named.
|
|
222
|
+
*
|
|
223
|
+
* Nothing is scored or inferred: each id must still be an accepted membership,
|
|
224
|
+
* which {@link IntentGraphDatabase.assignIntentToNetworkIfMember} checks while
|
|
225
|
+
* holding the membership row. A network the caller no longer belongs to is
|
|
226
|
+
* skipped and logged rather than failing the create.
|
|
227
|
+
*
|
|
228
|
+
* @returns The subset of ids that ended up linked.
|
|
229
|
+
*/
|
|
230
|
+
async function linkIntentToNetworks(deps, state, intentId) {
|
|
231
|
+
const requested = state.networkIds ?? [];
|
|
232
|
+
if (requested.length === 0)
|
|
233
|
+
return [];
|
|
234
|
+
const metadata = buildManualAssignmentMetadata({
|
|
235
|
+
resourceType: 'intent',
|
|
236
|
+
source: 'intent-create',
|
|
237
|
+
createdAt: new Date().toISOString(),
|
|
238
|
+
});
|
|
239
|
+
const linked = [];
|
|
240
|
+
for (const networkId of requested) {
|
|
241
|
+
const outcome = await deps.database.assignIntentToNetworkIfMember(state.userId, intentId, networkId, metadata.finalScore, metadata.metadata);
|
|
242
|
+
if (outcome.kind === 'assigned' || outcome.kind === 'already_assigned') {
|
|
243
|
+
linked.push(networkId);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
logger.warn('Intent network link rejected', { intentId, networkId, outcome: outcome.kind });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return linked;
|
|
250
|
+
}
|
|
132
251
|
/**
|
|
133
252
|
* Node: Query
|
|
134
253
|
* Fast-path read node — fetches intents from DB based on scope.
|
|
@@ -145,14 +264,14 @@ export async function queryNode(state, deps) {
|
|
|
145
264
|
});
|
|
146
265
|
try {
|
|
147
266
|
// Scope-aware default: caller's intents across all reachable networks.
|
|
148
|
-
// Triggered when the
|
|
267
|
+
// Triggered when the host passed networkScope and did not pick a
|
|
149
268
|
// specific networkId or queryUserId — i.e. "my intents" in a chat
|
|
150
|
-
// where the agent's reach is more than one
|
|
269
|
+
// where the agent's reach is more than one network.
|
|
151
270
|
if (!state.queryUserId &&
|
|
152
271
|
!state.networkId &&
|
|
153
|
-
state.
|
|
154
|
-
state.
|
|
155
|
-
const intents = await deps.database.
|
|
272
|
+
state.networkScope &&
|
|
273
|
+
state.networkScope.length > 0) {
|
|
274
|
+
const intents = await deps.database.getActiveIntentsAcrossNetworks(state.userId, state.networkScope);
|
|
156
275
|
if (intents.length === 0) {
|
|
157
276
|
return {
|
|
158
277
|
readResult: {
|
|
@@ -175,37 +294,37 @@ export async function queryNode(state, deps) {
|
|
|
175
294
|
};
|
|
176
295
|
}
|
|
177
296
|
// When allUserIntents is true, ignore network scope and return all
|
|
178
|
-
const
|
|
179
|
-
if (
|
|
297
|
+
const effectiveNetworkId = state.allUserIntents ? undefined : state.networkId;
|
|
298
|
+
if (effectiveNetworkId) {
|
|
180
299
|
// Verify membership
|
|
181
|
-
const isMember = await deps.database.isNetworkMember(
|
|
300
|
+
const isMember = await deps.database.isNetworkMember(effectiveNetworkId, state.userId);
|
|
182
301
|
if (!isMember) {
|
|
183
302
|
return {
|
|
184
303
|
readResult: {
|
|
185
304
|
count: 0,
|
|
186
305
|
intents: [],
|
|
187
|
-
message: "
|
|
306
|
+
message: "Network not found or you are not a member.",
|
|
188
307
|
},
|
|
189
308
|
};
|
|
190
309
|
}
|
|
191
310
|
// Network-scoped read
|
|
192
311
|
if (!state.queryUserId) {
|
|
193
|
-
// All intents in the
|
|
194
|
-
const intents = await deps.database.getNetworkIntentsForMember(
|
|
312
|
+
// All intents in the network (any member can see)
|
|
313
|
+
const intents = await deps.database.getNetworkIntentsForMember(effectiveNetworkId, state.userId, { limit: 50, offset: 0 });
|
|
195
314
|
if (intents.length === 0) {
|
|
196
315
|
return {
|
|
197
316
|
readResult: {
|
|
198
317
|
count: 0,
|
|
199
318
|
intents: [],
|
|
200
319
|
message: "No intents in this network yet.",
|
|
201
|
-
networkId:
|
|
320
|
+
networkId: effectiveNetworkId,
|
|
202
321
|
},
|
|
203
322
|
};
|
|
204
323
|
}
|
|
205
324
|
return {
|
|
206
325
|
readResult: {
|
|
207
326
|
count: intents.length,
|
|
208
|
-
networkId:
|
|
327
|
+
networkId: effectiveNetworkId,
|
|
209
328
|
intents: intents.map((i) => ({
|
|
210
329
|
id: i.id,
|
|
211
330
|
description: i.payload,
|
|
@@ -217,9 +336,9 @@ export async function queryNode(state, deps) {
|
|
|
217
336
|
},
|
|
218
337
|
};
|
|
219
338
|
}
|
|
220
|
-
// Specific user's intents in the
|
|
339
|
+
// Specific user's intents in the network
|
|
221
340
|
const effectiveUserId = state.queryUserId;
|
|
222
|
-
const intents = await deps.database.
|
|
341
|
+
const intents = await deps.database.getIntentsInNetworkForMember(effectiveUserId, effectiveNetworkId);
|
|
223
342
|
if (intents.length === 0) {
|
|
224
343
|
return {
|
|
225
344
|
readResult: {
|
|
@@ -228,7 +347,7 @@ export async function queryNode(state, deps) {
|
|
|
228
347
|
message: effectiveUserId === state.userId
|
|
229
348
|
? "You don't have any intents in this network yet."
|
|
230
349
|
: "No intents for that user in this network.",
|
|
231
|
-
networkId:
|
|
350
|
+
networkId: effectiveNetworkId,
|
|
232
351
|
},
|
|
233
352
|
};
|
|
234
353
|
}
|
|
@@ -237,7 +356,7 @@ export async function queryNode(state, deps) {
|
|
|
237
356
|
return {
|
|
238
357
|
readResult: {
|
|
239
358
|
count: intents.length,
|
|
240
|
-
networkId:
|
|
359
|
+
networkId: effectiveNetworkId,
|
|
241
360
|
intents: intents.map((i) => ({
|
|
242
361
|
id: i.id,
|
|
243
362
|
description: i.payload,
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intent graph preparation and explicit update inference.
|
|
3
|
+
*/
|
|
4
|
+
import type { DebugMetaAgent } from "../../../protocol/core.js";
|
|
5
|
+
import { type IntentGraphDeps, type IntentState } from "./intent.graph.shared.js";
|
|
6
|
+
/**
|
|
7
|
+
* Validate that the input shape selects exactly one route. Returns an error
|
|
8
|
+
* message when it doesn't; undefined when the shape is valid.
|
|
9
|
+
*
|
|
10
|
+
* Never infer destruction from a missing field: `targetIntentIds` alone
|
|
11
|
+
* (no content, no archive, no status) is an input error, not a silent no-op.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateInputShape(state: IntentState): string | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Node 0: Prep
|
|
16
|
+
* Validates the input route and loads active IDs for existing-intent operations.
|
|
17
|
+
* Creation does not inspect or reconcile existing intents.
|
|
18
|
+
*/
|
|
19
|
+
export declare function prepNode(state: IntentState, deps: IntentGraphDeps): Promise<{
|
|
20
|
+
trace: {
|
|
21
|
+
node: string;
|
|
22
|
+
detail: string;
|
|
23
|
+
}[];
|
|
24
|
+
error?: string | undefined;
|
|
25
|
+
activeIntentIds: string[];
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Node 1: Inference
|
|
29
|
+
* Extracts intents from raw content. Only reached on the content path
|
|
30
|
+
* (see {@link afterPrepRoute}), so `inputContent` is always defined here.
|
|
31
|
+
* Passes conversation context for anaphoric resolution.
|
|
32
|
+
*/
|
|
33
|
+
export declare function inferenceNode(state: IntentState, deps: IntentGraphDeps): Promise<{
|
|
34
|
+
inferredIntents: {
|
|
35
|
+
reasoning: string;
|
|
36
|
+
type: "goal" | "tombstone";
|
|
37
|
+
confidence: "low" | "medium" | "high";
|
|
38
|
+
description: string;
|
|
39
|
+
}[];
|
|
40
|
+
agentTimings: DebugMetaAgent[];
|
|
41
|
+
trace: {
|
|
42
|
+
node: string;
|
|
43
|
+
detail: string;
|
|
44
|
+
}[];
|
|
45
|
+
}>;
|
|
46
|
+
/** Prepare an unprepared create, or reuse host authorization for the final edited text. */
|
|
47
|
+
export declare function preparationNode(state: IntentState, deps: IntentGraphDeps): Promise<{
|
|
48
|
+
preparationResult: {
|
|
49
|
+
status: "needs_revision";
|
|
50
|
+
payload: string;
|
|
51
|
+
feedback: string;
|
|
52
|
+
recovery: import("../intent.preparer.js").RecoveryField[];
|
|
53
|
+
};
|
|
54
|
+
actions: never[];
|
|
55
|
+
validationFailures: {
|
|
56
|
+
category: "vague_or_invalid";
|
|
57
|
+
message: string;
|
|
58
|
+
}[];
|
|
59
|
+
preparation?: undefined;
|
|
60
|
+
trace?: undefined;
|
|
61
|
+
} | {
|
|
62
|
+
preparation: import("../intent.preparer.js").PreparedIntent;
|
|
63
|
+
preparationResult: {
|
|
64
|
+
status: "ready";
|
|
65
|
+
payload: string;
|
|
66
|
+
metadata: import("../intent.admission.js").IntentSemanticMetadata;
|
|
67
|
+
} | undefined;
|
|
68
|
+
actions: {
|
|
69
|
+
type: "create";
|
|
70
|
+
payload: string;
|
|
71
|
+
metadata: import("../intent.admission.js").IntentSemanticMetadata | null;
|
|
72
|
+
}[];
|
|
73
|
+
trace: {
|
|
74
|
+
node: string;
|
|
75
|
+
detail: string;
|
|
76
|
+
}[];
|
|
77
|
+
validationFailures?: undefined;
|
|
78
|
+
}>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intent graph preparation and explicit update inference.
|
|
3
|
+
*/
|
|
4
|
+
import { timed } from "../../shared/observability/performance.js";
|
|
5
|
+
import { requestContext } from "../../shared/observability/request-context.js";
|
|
6
|
+
import { logger } from "./intent.graph.shared.js";
|
|
7
|
+
/**
|
|
8
|
+
* Validate that the input shape selects exactly one route. Returns an error
|
|
9
|
+
* message when it doesn't; undefined when the shape is valid.
|
|
10
|
+
*
|
|
11
|
+
* Never infer destruction from a missing field: `targetIntentIds` alone
|
|
12
|
+
* (no content, no archive, no status) is an input error, not a silent no-op.
|
|
13
|
+
*/
|
|
14
|
+
export function validateInputShape(state) {
|
|
15
|
+
const hasContent = state.inputContent !== undefined;
|
|
16
|
+
const hasTargets = !!state.targetIntentIds?.length;
|
|
17
|
+
const hasArchive = state.archive === true;
|
|
18
|
+
const hasStatus = state.status !== undefined;
|
|
19
|
+
const routeCount = [hasContent, hasArchive, hasStatus].filter(Boolean).length;
|
|
20
|
+
if (routeCount > 1) {
|
|
21
|
+
return 'Intent graph input selected more than one route: content, archive, and status are mutually exclusive.';
|
|
22
|
+
}
|
|
23
|
+
if (hasTargets && !hasContent && !hasArchive && !hasStatus) {
|
|
24
|
+
return 'targetIntentIds requires inputContent (update), archive, or status.';
|
|
25
|
+
}
|
|
26
|
+
if (hasArchive && !hasTargets) {
|
|
27
|
+
return 'archive requires targetIntentIds.';
|
|
28
|
+
}
|
|
29
|
+
if (hasStatus && !hasTargets) {
|
|
30
|
+
return 'status requires targetIntentIds.';
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Node 0: Prep
|
|
36
|
+
* Validates the input route and loads active IDs for existing-intent operations.
|
|
37
|
+
* Creation does not inspect or reconcile existing intents.
|
|
38
|
+
*/
|
|
39
|
+
export async function prepNode(state, deps) {
|
|
40
|
+
return timed("IntentGraph.prep", async () => {
|
|
41
|
+
logger.verbose("Starting preparation phase", {
|
|
42
|
+
hasContent: !!state.inputContent,
|
|
43
|
+
targetIntentIds: state.targetIntentIds,
|
|
44
|
+
archive: state.archive,
|
|
45
|
+
status: state.status,
|
|
46
|
+
networkId: state.networkId,
|
|
47
|
+
});
|
|
48
|
+
const validationError = validateInputShape(state);
|
|
49
|
+
// Creation never loads existing intents: explicit creation cannot merge them.
|
|
50
|
+
const activeIntents = state.inputContent !== undefined && !state.targetIntentIds?.length
|
|
51
|
+
? []
|
|
52
|
+
: await deps.database.getActiveIntents(state.userId);
|
|
53
|
+
logger.verbose("Fetched active intents", {
|
|
54
|
+
count: activeIntents.length,
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
activeIntentIds: activeIntents.map((intent) => intent.id),
|
|
58
|
+
...(validationError ? { error: validationError } : {}),
|
|
59
|
+
trace: [{
|
|
60
|
+
node: "prep",
|
|
61
|
+
detail: `Fetched ${activeIntents.length} active intent(s)`,
|
|
62
|
+
}],
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Node 1: Inference
|
|
68
|
+
* Extracts intents from raw content. Only reached on the content path
|
|
69
|
+
* (see {@link afterPrepRoute}), so `inputContent` is always defined here.
|
|
70
|
+
* Passes conversation context for anaphoric resolution.
|
|
71
|
+
*/
|
|
72
|
+
export async function inferenceNode(state, deps) {
|
|
73
|
+
return timed("IntentGraph.inference", async () => {
|
|
74
|
+
logger.verbose("Starting inference", {
|
|
75
|
+
contentPreview: state.inputContent?.substring(0, 50),
|
|
76
|
+
hasConversationContext: !!state.conversationContext,
|
|
77
|
+
conversationMessagesCount: state.conversationContext?.length || 0
|
|
78
|
+
});
|
|
79
|
+
const agentTimingsAccum = [];
|
|
80
|
+
const _traceEmitterInferrer = requestContext.getStore()?.traceEmitter;
|
|
81
|
+
const inferrerStart = Date.now();
|
|
82
|
+
_traceEmitterInferrer?.({ type: "agent_start", name: "intent-inferrer" });
|
|
83
|
+
const result = await deps.inferrer.invoke(state.inputContent ?? null, state.userProfile, {
|
|
84
|
+
conversationContext: state.conversationContext
|
|
85
|
+
});
|
|
86
|
+
agentTimingsAccum.push({ name: 'intent.inferrer', durationMs: Date.now() - inferrerStart });
|
|
87
|
+
_traceEmitterInferrer?.({ type: "agent_end", name: "intent-inferrer", durationMs: Date.now() - inferrerStart, summary: result.intents.length > 0 ? `Extracted ${result.intents.length} intent(s)` : "intent-inferrer completed" });
|
|
88
|
+
logger.verbose("Inference complete", {
|
|
89
|
+
inferredCount: result.intents.length,
|
|
90
|
+
});
|
|
91
|
+
const descriptions = result.intents.map(i => i.description).slice(0, 3);
|
|
92
|
+
const truncated = result.intents.length > 3 ? `... +${result.intents.length - 3} more` : "";
|
|
93
|
+
return {
|
|
94
|
+
inferredIntents: result.intents,
|
|
95
|
+
agentTimings: agentTimingsAccum,
|
|
96
|
+
trace: [{
|
|
97
|
+
node: "inference",
|
|
98
|
+
detail: result.intents.length === 0
|
|
99
|
+
? "No intents extracted"
|
|
100
|
+
: `Extracted ${result.intents.length}: ${descriptions.map(d => `"${d.slice(0, 50)}${d.length > 50 ? '...' : ''}"`).join(", ")}${truncated}`,
|
|
101
|
+
}],
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** Prepare an unprepared create, or reuse host authorization for the final edited text. */
|
|
106
|
+
export async function preparationNode(state, deps) {
|
|
107
|
+
const result = state.preparation ? undefined : await deps.preparer.invoke({ payload: state.inputContent }, state.userProfile);
|
|
108
|
+
if (result?.status === "needs_revision") {
|
|
109
|
+
return {
|
|
110
|
+
preparationResult: result,
|
|
111
|
+
actions: [],
|
|
112
|
+
validationFailures: [{ category: "vague_or_invalid", message: result.feedback }],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const preparation = state.preparation ?? { metadata: result.metadata };
|
|
116
|
+
return {
|
|
117
|
+
preparation,
|
|
118
|
+
preparationResult: result,
|
|
119
|
+
actions: [{ type: "create", payload: state.inputContent, metadata: preparation.metadata }],
|
|
120
|
+
trace: [{ node: "preparation", detail: state.preparation ? "Reused approved preparation" : "Description passed admission" }],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intent graph: prepare/create, or explicitly read, update, archive, and transition.
|
|
3
|
+
*
|
|
4
|
+
* Every node is a top-level function in a sibling module, taking the graph
|
|
5
|
+
* state and an explicit {@link IntentGraphDeps}. This file composes the
|
|
6
|
+
* dependency bag and wires the edges — nothing else.
|
|
7
|
+
*/
|
|
8
|
+
import { StateGraph, START, END } from "@langchain/langgraph";
|
|
9
|
+
import { ExplicitIntentInferrer } from "../intent.inferrer.js";
|
|
10
|
+
import { SemanticVerifier } from "../intent.verifier.js";
|
|
11
|
+
import { IntentPreparer } from "../intent.preparer.js";
|
|
12
|
+
import { IntentGraphState } from "./intent.graph.state.js";
|
|
13
|
+
import { logger } from "./intent.graph.shared.js";
|
|
14
|
+
import { inferenceNode, preparationNode, prepNode } from "./intent.graph.infer.js";
|
|
15
|
+
import { reconciliationNode, verificationNode } from "./intent.graph.reconcile.js";
|
|
16
|
+
import { executorNode, queryNode } from "./intent.graph.execute.js";
|
|
17
|
+
export { buildExplicitUpdateActions, enforceIntentActionBoundary, isExplicitUpdateRequest } from "./intent.graph.shared.js";
|
|
18
|
+
export class IntentGraphFactory {
|
|
19
|
+
constructor(database, embedder, intentFollowUp, agents) {
|
|
20
|
+
this.deps = {
|
|
21
|
+
database,
|
|
22
|
+
embedder,
|
|
23
|
+
intentFollowUp,
|
|
24
|
+
inferrer: agents?.inferrer ?? new ExplicitIntentInferrer(),
|
|
25
|
+
verifier: agents?.verifier ?? new SemanticVerifier(),
|
|
26
|
+
preparer: new IntentPreparer(agents?.verifier),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
createGraph() {
|
|
30
|
+
const deps = this.deps;
|
|
31
|
+
return new StateGraph(IntentGraphState)
|
|
32
|
+
.addNode("prep", (state) => prepNode(state, deps))
|
|
33
|
+
.addNode("prepareCreation", (state) => preparationNode(state, deps))
|
|
34
|
+
.addNode("query", (state) => queryNode(state, deps))
|
|
35
|
+
.addNode("inference", (state) => inferenceNode(state, deps))
|
|
36
|
+
.addNode("verification", (state) => verificationNode(state, deps))
|
|
37
|
+
.addNode("reconciler", (state) => reconciliationNode(state))
|
|
38
|
+
.addNode("executor", (state) => executorNode(state, deps))
|
|
39
|
+
// The graph routes on the shape of its input (see intent.graph.state.ts):
|
|
40
|
+
// - READ: no content/target → prep → query → END (no LLM calls)
|
|
41
|
+
// - CREATE: inputContent only → prep → preparation → executor → END
|
|
42
|
+
// - UPDATE: inputContent + targetIntentIds → prep → inference → verification → reconciler → executor
|
|
43
|
+
// - ARCHIVE: targetIntentIds + archive → prep → reconciler → executor → END (no LLM)
|
|
44
|
+
// - TRANSITION: targetIntentIds + status → prep → reconciler → executor → END (no LLM)
|
|
45
|
+
.addEdge(START, "prep")
|
|
46
|
+
// Create prepares once; update infers; read/archive/status need no models.
|
|
47
|
+
.addConditionalEdges("prep", afterPrepRoute, {
|
|
48
|
+
query: "query",
|
|
49
|
+
inference: "inference",
|
|
50
|
+
prepareCreation: "prepareCreation",
|
|
51
|
+
reconciler: "reconciler",
|
|
52
|
+
__end__: END,
|
|
53
|
+
})
|
|
54
|
+
// Query (read mode) always ends
|
|
55
|
+
.addEdge("query", END)
|
|
56
|
+
.addEdge("prepareCreation", "executor")
|
|
57
|
+
// After inference: decide if we need verification (skip if no intents)
|
|
58
|
+
.addConditionalEdges("inference", shouldRunVerification, {
|
|
59
|
+
verification: "verification",
|
|
60
|
+
reconciler: "reconciler",
|
|
61
|
+
})
|
|
62
|
+
// Verification always continues to reconciliation
|
|
63
|
+
.addEdge("verification", "reconciler")
|
|
64
|
+
// Reconciliation always goes to executor
|
|
65
|
+
.addEdge("reconciler", "executor")
|
|
66
|
+
// Executor is always the end
|
|
67
|
+
.addEdge("executor", END)
|
|
68
|
+
.compile();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* After prep: an invalid input shape or a failed precondition ends the
|
|
73
|
+
* graph; a fully-empty input is a read; archive/status skip straight to
|
|
74
|
+
* the reconciler (no LLM); otherwise the content path infers.
|
|
75
|
+
*/
|
|
76
|
+
export function afterPrepRoute(state) {
|
|
77
|
+
if (state.error) {
|
|
78
|
+
logger.warn('Prep failed with error, short-circuiting to END', { error: state.error });
|
|
79
|
+
return '__end__';
|
|
80
|
+
}
|
|
81
|
+
const hasContent = state.inputContent !== undefined;
|
|
82
|
+
const hasArchive = state.archive === true;
|
|
83
|
+
const hasStatus = state.status !== undefined;
|
|
84
|
+
if (!hasContent && !hasArchive && !hasStatus) {
|
|
85
|
+
logger.verbose('No content/target - routing to query (read fast path)');
|
|
86
|
+
return 'query';
|
|
87
|
+
}
|
|
88
|
+
if (hasArchive || hasStatus) {
|
|
89
|
+
logger.verbose('Deterministic route (archive/status) - skipping inference');
|
|
90
|
+
return 'reconciler';
|
|
91
|
+
}
|
|
92
|
+
if (!state.targetIntentIds?.length)
|
|
93
|
+
return 'prepareCreation';
|
|
94
|
+
logger.verbose('Explicit update - running inference');
|
|
95
|
+
return 'inference';
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Determines if verification should run. Skipped when inference produced
|
|
99
|
+
* no candidates: the (empty) reconciler pass still runs so the graph
|
|
100
|
+
* reports "nothing to do" consistently.
|
|
101
|
+
*/
|
|
102
|
+
export function shouldRunVerification(state) {
|
|
103
|
+
if (state.inferredIntents.length === 0) {
|
|
104
|
+
logger.verbose('No intents to verify - skipping verification, routing to reconciliation');
|
|
105
|
+
return 'reconciler';
|
|
106
|
+
}
|
|
107
|
+
return 'verification';
|
|
108
|
+
}
|