@vurb/core 3.2.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/README.md +677 -0
- package/dist/cli/args.d.ts +26 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +117 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands/create.d.ts +11 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +121 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +3 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js +268 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +9 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +58 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/lock.d.ts +5 -0
- package/dist/cli/commands/lock.d.ts.map +1 -0
- package/dist/cli/commands/lock.js +94 -0
- package/dist/cli/commands/lock.js.map +1 -0
- package/dist/cli/commands/remote.d.ts +3 -0
- package/dist/cli/commands/remote.d.ts.map +1 -0
- package/dist/cli/commands/remote.js +37 -0
- package/dist/cli/commands/remote.js.map +1 -0
- package/dist/cli/constants.d.ts +18 -0
- package/dist/cli/constants.d.ts.map +1 -0
- package/dist/cli/constants.js +95 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/progress.d.ts +34 -0
- package/dist/cli/progress.d.ts.map +1 -0
- package/dist/cli/progress.js +102 -0
- package/dist/cli/progress.js.map +1 -0
- package/dist/cli/rc.d.ts +11 -0
- package/dist/cli/rc.d.ts.map +1 -0
- package/dist/cli/rc.js +75 -0
- package/dist/cli/rc.js.map +1 -0
- package/dist/cli/registry.d.ts +25 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +86 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/scaffold.d.ts +10 -0
- package/dist/cli/scaffold.d.ts.map +1 -0
- package/dist/cli/scaffold.js +105 -0
- package/dist/cli/scaffold.js.map +1 -0
- package/dist/cli/templates/config.d.ts +14 -0
- package/dist/cli/templates/config.d.ts.map +1 -0
- package/dist/cli/templates/config.js +133 -0
- package/dist/cli/templates/config.js.map +1 -0
- package/dist/cli/templates/constants.d.ts +9 -0
- package/dist/cli/templates/constants.d.ts.map +1 -0
- package/dist/cli/templates/constants.js +9 -0
- package/dist/cli/templates/constants.js.map +1 -0
- package/dist/cli/templates/core.d.ts +14 -0
- package/dist/cli/templates/core.d.ts.map +1 -0
- package/dist/cli/templates/core.js +186 -0
- package/dist/cli/templates/core.js.map +1 -0
- package/dist/cli/templates/cursor.d.ts +8 -0
- package/dist/cli/templates/cursor.d.ts.map +1 -0
- package/dist/cli/templates/cursor.js +13 -0
- package/dist/cli/templates/cursor.js.map +1 -0
- package/dist/cli/templates/index.d.ts +17 -0
- package/dist/cli/templates/index.d.ts.map +1 -0
- package/dist/cli/templates/index.js +27 -0
- package/dist/cli/templates/index.js.map +1 -0
- package/dist/cli/templates/middleware.d.ts +7 -0
- package/dist/cli/templates/middleware.d.ts.map +1 -0
- package/dist/cli/templates/middleware.js +34 -0
- package/dist/cli/templates/middleware.js.map +1 -0
- package/dist/cli/templates/presenter.d.ts +7 -0
- package/dist/cli/templates/presenter.d.ts.map +1 -0
- package/dist/cli/templates/presenter.js +46 -0
- package/dist/cli/templates/presenter.js.map +1 -0
- package/dist/cli/templates/prompt.d.ts +7 -0
- package/dist/cli/templates/prompt.d.ts.map +1 -0
- package/dist/cli/templates/prompt.js +42 -0
- package/dist/cli/templates/prompt.js.map +1 -0
- package/dist/cli/templates/readme.d.ts +8 -0
- package/dist/cli/templates/readme.d.ts.map +1 -0
- package/dist/cli/templates/readme.js +173 -0
- package/dist/cli/templates/readme.js.map +1 -0
- package/dist/cli/templates/testing.d.ts +11 -0
- package/dist/cli/templates/testing.d.ts.map +1 -0
- package/dist/cli/templates/testing.js +101 -0
- package/dist/cli/templates/testing.js.map +1 -0
- package/dist/cli/templates/tools.d.ts +13 -0
- package/dist/cli/templates/tools.d.ts.map +1 -0
- package/dist/cli/templates/tools.js +63 -0
- package/dist/cli/templates/tools.js.map +1 -0
- package/dist/cli/templates/vectors/database.d.ts +9 -0
- package/dist/cli/templates/vectors/database.d.ts.map +1 -0
- package/dist/cli/templates/vectors/database.js +82 -0
- package/dist/cli/templates/vectors/database.js.map +1 -0
- package/dist/cli/templates/vectors/index.d.ts +9 -0
- package/dist/cli/templates/vectors/index.d.ts.map +1 -0
- package/dist/cli/templates/vectors/index.js +9 -0
- package/dist/cli/templates/vectors/index.js.map +1 -0
- package/dist/cli/templates/vectors/oauth.d.ts +10 -0
- package/dist/cli/templates/vectors/oauth.d.ts.map +1 -0
- package/dist/cli/templates/vectors/oauth.js +76 -0
- package/dist/cli/templates/vectors/oauth.js.map +1 -0
- package/dist/cli/templates/vectors/openapi.d.ts +10 -0
- package/dist/cli/templates/vectors/openapi.d.ts.map +1 -0
- package/dist/cli/templates/vectors/openapi.js +106 -0
- package/dist/cli/templates/vectors/openapi.js.map +1 -0
- package/dist/cli/templates/vectors/workflow.d.ts +7 -0
- package/dist/cli/templates/vectors/workflow.d.ts.map +1 -0
- package/dist/cli/templates/vectors/workflow.js +49 -0
- package/dist/cli/templates/vectors/workflow.js.map +1 -0
- package/dist/cli/types.d.ts +36 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +10 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/utils.d.ts +27 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +73 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/cli/vurb.d.ts +15 -0
- package/dist/cli/vurb.d.ts.map +1 -0
- package/dist/cli/vurb.js +87 -0
- package/dist/cli/vurb.js.map +1 -0
- package/dist/client/InferRouter.d.ts +92 -0
- package/dist/client/InferRouter.d.ts.map +1 -0
- package/dist/client/InferRouter.js +31 -0
- package/dist/client/InferRouter.js.map +1 -0
- package/dist/client/VurbClient.d.ts +282 -0
- package/dist/client/VurbClient.d.ts.map +1 -0
- package/dist/client/VurbClient.js +287 -0
- package/dist/client/VurbClient.js.map +1 -0
- package/dist/client/createTypedRegistry.d.ts +25 -0
- package/dist/client/createTypedRegistry.d.ts.map +1 -0
- package/dist/client/createTypedRegistry.js +74 -0
- package/dist/client/createTypedRegistry.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/converters/ConverterBase.d.ts +68 -0
- package/dist/converters/ConverterBase.d.ts.map +1 -0
- package/dist/converters/ConverterBase.js +62 -0
- package/dist/converters/ConverterBase.js.map +1 -0
- package/dist/converters/GroupConverter.d.ts +33 -0
- package/dist/converters/GroupConverter.d.ts.map +1 -0
- package/dist/converters/GroupConverter.js +26 -0
- package/dist/converters/GroupConverter.js.map +1 -0
- package/dist/converters/PromptConverter.d.ts +33 -0
- package/dist/converters/PromptConverter.d.ts.map +1 -0
- package/dist/converters/PromptConverter.js +26 -0
- package/dist/converters/PromptConverter.js.map +1 -0
- package/dist/converters/ResourceConverter.d.ts +35 -0
- package/dist/converters/ResourceConverter.d.ts.map +1 -0
- package/dist/converters/ResourceConverter.js +28 -0
- package/dist/converters/ResourceConverter.js.map +1 -0
- package/dist/converters/ToolAnnotationsConverter.d.ts +33 -0
- package/dist/converters/ToolAnnotationsConverter.d.ts.map +1 -0
- package/dist/converters/ToolAnnotationsConverter.js +26 -0
- package/dist/converters/ToolAnnotationsConverter.js.map +1 -0
- package/dist/converters/ToolConverter.d.ts +35 -0
- package/dist/converters/ToolConverter.d.ts.map +1 -0
- package/dist/converters/ToolConverter.js +28 -0
- package/dist/converters/ToolConverter.js.map +1 -0
- package/dist/converters/index.d.ts +7 -0
- package/dist/converters/index.d.ts.map +1 -0
- package/dist/converters/index.js +7 -0
- package/dist/converters/index.js.map +1 -0
- package/dist/core/StandardSchema.d.ts +178 -0
- package/dist/core/StandardSchema.d.ts.map +1 -0
- package/dist/core/StandardSchema.js +174 -0
- package/dist/core/StandardSchema.js.map +1 -0
- package/dist/core/builder/ActionGroupBuilder.d.ts +208 -0
- package/dist/core/builder/ActionGroupBuilder.d.ts.map +1 -0
- package/dist/core/builder/ActionGroupBuilder.js +193 -0
- package/dist/core/builder/ActionGroupBuilder.js.map +1 -0
- package/dist/core/builder/ErrorBuilder.d.ts +59 -0
- package/dist/core/builder/ErrorBuilder.d.ts.map +1 -0
- package/dist/core/builder/ErrorBuilder.js +99 -0
- package/dist/core/builder/ErrorBuilder.js.map +1 -0
- package/dist/core/builder/FluentRouter.d.ts +96 -0
- package/dist/core/builder/FluentRouter.d.ts.map +1 -0
- package/dist/core/builder/FluentRouter.js +116 -0
- package/dist/core/builder/FluentRouter.js.map +1 -0
- package/dist/core/builder/FluentSchemaHelpers.d.ts +237 -0
- package/dist/core/builder/FluentSchemaHelpers.d.ts.map +1 -0
- package/dist/core/builder/FluentSchemaHelpers.js +227 -0
- package/dist/core/builder/FluentSchemaHelpers.js.map +1 -0
- package/dist/core/builder/FluentToolBuilder.d.ts +419 -0
- package/dist/core/builder/FluentToolBuilder.d.ts.map +1 -0
- package/dist/core/builder/FluentToolBuilder.js +643 -0
- package/dist/core/builder/FluentToolBuilder.js.map +1 -0
- package/dist/core/builder/GroupedToolBuilder.d.ts +832 -0
- package/dist/core/builder/GroupedToolBuilder.d.ts.map +1 -0
- package/dist/core/builder/GroupedToolBuilder.js +1306 -0
- package/dist/core/builder/GroupedToolBuilder.js.map +1 -0
- package/dist/core/builder/ParamDescriptors.d.ts +142 -0
- package/dist/core/builder/ParamDescriptors.d.ts.map +1 -0
- package/dist/core/builder/ParamDescriptors.js +164 -0
- package/dist/core/builder/ParamDescriptors.js.map +1 -0
- package/dist/core/builder/ToolDefinitionCompiler.d.ts +37 -0
- package/dist/core/builder/ToolDefinitionCompiler.d.ts.map +1 -0
- package/dist/core/builder/ToolDefinitionCompiler.js +72 -0
- package/dist/core/builder/ToolDefinitionCompiler.js.map +1 -0
- package/dist/core/builder/defineTool.d.ts +180 -0
- package/dist/core/builder/defineTool.d.ts.map +1 -0
- package/dist/core/builder/defineTool.js +164 -0
- package/dist/core/builder/defineTool.js.map +1 -0
- package/dist/core/builder/index.d.ts +13 -0
- package/dist/core/builder/index.d.ts.map +1 -0
- package/dist/core/builder/index.js +13 -0
- package/dist/core/builder/index.js.map +1 -0
- package/dist/core/createGroup.d.ts +140 -0
- package/dist/core/createGroup.d.ts.map +1 -0
- package/dist/core/createGroup.js +144 -0
- package/dist/core/createGroup.js.map +1 -0
- package/dist/core/execution/ConcurrencyGuard.d.ts +103 -0
- package/dist/core/execution/ConcurrencyGuard.d.ts.map +1 -0
- package/dist/core/execution/ConcurrencyGuard.js +147 -0
- package/dist/core/execution/ConcurrencyGuard.js.map +1 -0
- package/dist/core/execution/EgressGuard.d.ts +72 -0
- package/dist/core/execution/EgressGuard.d.ts.map +1 -0
- package/dist/core/execution/EgressGuard.js +163 -0
- package/dist/core/execution/EgressGuard.js.map +1 -0
- package/dist/core/execution/ExecutionPipeline.d.ts +67 -0
- package/dist/core/execution/ExecutionPipeline.d.ts.map +1 -0
- package/dist/core/execution/ExecutionPipeline.js +176 -0
- package/dist/core/execution/ExecutionPipeline.js.map +1 -0
- package/dist/core/execution/MiddlewareCompiler.d.ts +35 -0
- package/dist/core/execution/MiddlewareCompiler.d.ts.map +1 -0
- package/dist/core/execution/MiddlewareCompiler.js +111 -0
- package/dist/core/execution/MiddlewareCompiler.js.map +1 -0
- package/dist/core/execution/MutationSerializer.d.ts +78 -0
- package/dist/core/execution/MutationSerializer.d.ts.map +1 -0
- package/dist/core/execution/MutationSerializer.js +106 -0
- package/dist/core/execution/MutationSerializer.js.map +1 -0
- package/dist/core/execution/PipelineHooks.d.ts +46 -0
- package/dist/core/execution/PipelineHooks.d.ts.map +1 -0
- package/dist/core/execution/PipelineHooks.js +66 -0
- package/dist/core/execution/PipelineHooks.js.map +1 -0
- package/dist/core/execution/ProgressHelper.d.ts +67 -0
- package/dist/core/execution/ProgressHelper.d.ts.map +1 -0
- package/dist/core/execution/ProgressHelper.js +59 -0
- package/dist/core/execution/ProgressHelper.js.map +1 -0
- package/dist/core/execution/ValidationErrorFormatter.d.ts +34 -0
- package/dist/core/execution/ValidationErrorFormatter.d.ts.map +1 -0
- package/dist/core/execution/ValidationErrorFormatter.js +193 -0
- package/dist/core/execution/ValidationErrorFormatter.js.map +1 -0
- package/dist/core/execution/index.d.ts +9 -0
- package/dist/core/execution/index.d.ts.map +1 -0
- package/dist/core/execution/index.js +9 -0
- package/dist/core/execution/index.js.map +1 -0
- package/dist/core/index.d.ts +34 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +29 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/initVurb.d.ts +295 -0
- package/dist/core/initVurb.d.ts.map +1 -0
- package/dist/core/initVurb.js +171 -0
- package/dist/core/initVurb.js.map +1 -0
- package/dist/core/middleware/ContextDerivation.d.ts +124 -0
- package/dist/core/middleware/ContextDerivation.d.ts.map +1 -0
- package/dist/core/middleware/ContextDerivation.js +117 -0
- package/dist/core/middleware/ContextDerivation.js.map +1 -0
- package/dist/core/middleware/index.d.ts +4 -0
- package/dist/core/middleware/index.d.ts.map +1 -0
- package/dist/core/middleware/index.js +3 -0
- package/dist/core/middleware/index.js.map +1 -0
- package/dist/core/registry/ToolFilterEngine.d.ts +27 -0
- package/dist/core/registry/ToolFilterEngine.d.ts.map +1 -0
- package/dist/core/registry/ToolFilterEngine.js +45 -0
- package/dist/core/registry/ToolFilterEngine.js.map +1 -0
- package/dist/core/registry/ToolRegistry.d.ts +259 -0
- package/dist/core/registry/ToolRegistry.d.ts.map +1 -0
- package/dist/core/registry/ToolRegistry.js +343 -0
- package/dist/core/registry/ToolRegistry.js.map +1 -0
- package/dist/core/registry/index.d.ts +4 -0
- package/dist/core/registry/index.d.ts.map +1 -0
- package/dist/core/registry/index.js +3 -0
- package/dist/core/registry/index.js.map +1 -0
- package/dist/core/response.d.ts +289 -0
- package/dist/core/response.d.ts.map +1 -0
- package/dist/core/response.js +286 -0
- package/dist/core/response.js.map +1 -0
- package/dist/core/result.d.ts +93 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +66 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/schema/AnnotationAggregator.d.ts +11 -0
- package/dist/core/schema/AnnotationAggregator.d.ts.map +1 -0
- package/dist/core/schema/AnnotationAggregator.js +40 -0
- package/dist/core/schema/AnnotationAggregator.js.map +1 -0
- package/dist/core/schema/DescriptionGenerator.d.ts +12 -0
- package/dist/core/schema/DescriptionGenerator.d.ts.map +1 -0
- package/dist/core/schema/DescriptionGenerator.js +81 -0
- package/dist/core/schema/DescriptionGenerator.js.map +1 -0
- package/dist/core/schema/SchemaGenerator.d.ts +15 -0
- package/dist/core/schema/SchemaGenerator.d.ts.map +1 -0
- package/dist/core/schema/SchemaGenerator.js +192 -0
- package/dist/core/schema/SchemaGenerator.js.map +1 -0
- package/dist/core/schema/SchemaUtils.d.ts +26 -0
- package/dist/core/schema/SchemaUtils.d.ts.map +1 -0
- package/dist/core/schema/SchemaUtils.js +85 -0
- package/dist/core/schema/SchemaUtils.js.map +1 -0
- package/dist/core/schema/ToonDescriptionGenerator.d.ts +3 -0
- package/dist/core/schema/ToonDescriptionGenerator.d.ts.map +1 -0
- package/dist/core/schema/ToonDescriptionGenerator.js +65 -0
- package/dist/core/schema/ToonDescriptionGenerator.js.map +1 -0
- package/dist/core/schema/index.d.ts +7 -0
- package/dist/core/schema/index.d.ts.map +1 -0
- package/dist/core/schema/index.js +7 -0
- package/dist/core/schema/index.js.map +1 -0
- package/dist/core/serialization/JsonSerializer.d.ts +71 -0
- package/dist/core/serialization/JsonSerializer.d.ts.map +1 -0
- package/dist/core/serialization/JsonSerializer.js +192 -0
- package/dist/core/serialization/JsonSerializer.js.map +1 -0
- package/dist/core/serialization/index.d.ts +7 -0
- package/dist/core/serialization/index.d.ts.map +1 -0
- package/dist/core/serialization/index.js +7 -0
- package/dist/core/serialization/index.js.map +1 -0
- package/dist/core/types.d.ts +303 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +17 -0
- package/dist/core/types.js.map +1 -0
- package/dist/domain/Annotations.d.ts +42 -0
- package/dist/domain/Annotations.d.ts.map +1 -0
- package/dist/domain/Annotations.js +16 -0
- package/dist/domain/Annotations.js.map +1 -0
- package/dist/domain/BaseModel.d.ts +50 -0
- package/dist/domain/BaseModel.d.ts.map +1 -0
- package/dist/domain/BaseModel.js +41 -0
- package/dist/domain/BaseModel.js.map +1 -0
- package/dist/domain/Group.d.ts +99 -0
- package/dist/domain/Group.d.ts.map +1 -0
- package/dist/domain/Group.js +172 -0
- package/dist/domain/Group.js.map +1 -0
- package/dist/domain/GroupItem.d.ts +46 -0
- package/dist/domain/GroupItem.d.ts.map +1 -0
- package/dist/domain/GroupItem.js +58 -0
- package/dist/domain/GroupItem.js.map +1 -0
- package/dist/domain/Icon.d.ts +41 -0
- package/dist/domain/Icon.d.ts.map +1 -0
- package/dist/domain/Icon.js +15 -0
- package/dist/domain/Icon.js.map +1 -0
- package/dist/domain/Prompt.d.ts +49 -0
- package/dist/domain/Prompt.d.ts.map +1 -0
- package/dist/domain/Prompt.js +59 -0
- package/dist/domain/Prompt.js.map +1 -0
- package/dist/domain/PromptArgument.d.ts +23 -0
- package/dist/domain/PromptArgument.d.ts.map +1 -0
- package/dist/domain/PromptArgument.js +27 -0
- package/dist/domain/PromptArgument.js.map +1 -0
- package/dist/domain/Resource.d.ts +37 -0
- package/dist/domain/Resource.d.ts.map +1 -0
- package/dist/domain/Resource.js +39 -0
- package/dist/domain/Resource.js.map +1 -0
- package/dist/domain/Role.d.ts +23 -0
- package/dist/domain/Role.d.ts.map +1 -0
- package/dist/domain/Role.js +24 -0
- package/dist/domain/Role.js.map +1 -0
- package/dist/domain/Tool.d.ts +39 -0
- package/dist/domain/Tool.d.ts.map +1 -0
- package/dist/domain/Tool.js +41 -0
- package/dist/domain/Tool.js.map +1 -0
- package/dist/domain/ToolAnnotations.d.ts +48 -0
- package/dist/domain/ToolAnnotations.d.ts.map +1 -0
- package/dist/domain/ToolAnnotations.js +15 -0
- package/dist/domain/ToolAnnotations.js.map +1 -0
- package/dist/domain/index.d.ts +16 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +13 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/utils.d.ts +6 -0
- package/dist/domain/utils.d.ts.map +1 -0
- package/dist/domain/utils.js +12 -0
- package/dist/domain/utils.js.map +1 -0
- package/dist/edge-stub.d.ts +73 -0
- package/dist/edge-stub.d.ts.map +1 -0
- package/dist/edge-stub.js +83 -0
- package/dist/edge-stub.js.map +1 -0
- package/dist/exposition/ExpositionCompiler.d.ts +66 -0
- package/dist/exposition/ExpositionCompiler.d.ts.map +1 -0
- package/dist/exposition/ExpositionCompiler.js +279 -0
- package/dist/exposition/ExpositionCompiler.js.map +1 -0
- package/dist/exposition/index.d.ts +4 -0
- package/dist/exposition/index.d.ts.map +1 -0
- package/dist/exposition/index.js +2 -0
- package/dist/exposition/index.js.map +1 -0
- package/dist/exposition/types.d.ts +58 -0
- package/dist/exposition/types.d.ts.map +1 -0
- package/dist/exposition/types.js +11 -0
- package/dist/exposition/types.js.map +1 -0
- package/dist/fsm/StateMachineGate.d.ts +294 -0
- package/dist/fsm/StateMachineGate.d.ts.map +1 -0
- package/dist/fsm/StateMachineGate.js +400 -0
- package/dist/fsm/StateMachineGate.js.map +1 -0
- package/dist/index.d.ts +148 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +112 -0
- package/dist/index.js.map +1 -0
- package/dist/introspection/BehaviorDigest.d.ts +112 -0
- package/dist/introspection/BehaviorDigest.d.ts.map +1 -0
- package/dist/introspection/BehaviorDigest.js +149 -0
- package/dist/introspection/BehaviorDigest.js.map +1 -0
- package/dist/introspection/CapabilityLockfile.d.ts +261 -0
- package/dist/introspection/CapabilityLockfile.d.ts.map +1 -0
- package/dist/introspection/CapabilityLockfile.js +395 -0
- package/dist/introspection/CapabilityLockfile.js.map +1 -0
- package/dist/introspection/ContractAwareSelfHealing.d.ts +90 -0
- package/dist/introspection/ContractAwareSelfHealing.d.ts.map +1 -0
- package/dist/introspection/ContractAwareSelfHealing.js +132 -0
- package/dist/introspection/ContractAwareSelfHealing.js.map +1 -0
- package/dist/introspection/ContractDiff.d.ts +91 -0
- package/dist/introspection/ContractDiff.d.ts.map +1 -0
- package/dist/introspection/ContractDiff.js +466 -0
- package/dist/introspection/ContractDiff.js.map +1 -0
- package/dist/introspection/CryptoAttestation.d.ts +143 -0
- package/dist/introspection/CryptoAttestation.d.ts.map +1 -0
- package/dist/introspection/CryptoAttestation.js +192 -0
- package/dist/introspection/CryptoAttestation.js.map +1 -0
- package/dist/introspection/EntitlementScanner.d.ts +177 -0
- package/dist/introspection/EntitlementScanner.d.ts.map +1 -0
- package/dist/introspection/EntitlementScanner.js +459 -0
- package/dist/introspection/EntitlementScanner.js.map +1 -0
- package/dist/introspection/GovernanceObserver.d.ts +88 -0
- package/dist/introspection/GovernanceObserver.d.ts.map +1 -0
- package/dist/introspection/GovernanceObserver.js +136 -0
- package/dist/introspection/GovernanceObserver.js.map +1 -0
- package/dist/introspection/IntrospectionResource.d.ts +20 -0
- package/dist/introspection/IntrospectionResource.d.ts.map +1 -0
- package/dist/introspection/IntrospectionResource.js +112 -0
- package/dist/introspection/IntrospectionResource.js.map +1 -0
- package/dist/introspection/ManifestCompiler.d.ts +33 -0
- package/dist/introspection/ManifestCompiler.d.ts.map +1 -0
- package/dist/introspection/ManifestCompiler.js +88 -0
- package/dist/introspection/ManifestCompiler.js.map +1 -0
- package/dist/introspection/SemanticProbe.d.ts +207 -0
- package/dist/introspection/SemanticProbe.d.ts.map +1 -0
- package/dist/introspection/SemanticProbe.js +274 -0
- package/dist/introspection/SemanticProbe.js.map +1 -0
- package/dist/introspection/TokenEconomics.d.ts +210 -0
- package/dist/introspection/TokenEconomics.d.ts.map +1 -0
- package/dist/introspection/TokenEconomics.js +292 -0
- package/dist/introspection/TokenEconomics.js.map +1 -0
- package/dist/introspection/ToolContract.d.ts +161 -0
- package/dist/introspection/ToolContract.d.ts.map +1 -0
- package/dist/introspection/ToolContract.js +218 -0
- package/dist/introspection/ToolContract.js.map +1 -0
- package/dist/introspection/canonicalize.d.ts +35 -0
- package/dist/introspection/canonicalize.d.ts.map +1 -0
- package/dist/introspection/canonicalize.js +72 -0
- package/dist/introspection/canonicalize.js.map +1 -0
- package/dist/introspection/index.d.ts +26 -0
- package/dist/introspection/index.d.ts.map +1 -0
- package/dist/introspection/index.js +24 -0
- package/dist/introspection/index.js.map +1 -0
- package/dist/introspection/types.d.ts +120 -0
- package/dist/introspection/types.d.ts.map +1 -0
- package/dist/introspection/types.js +13 -0
- package/dist/introspection/types.js.map +1 -0
- package/dist/observability/DebugObserver.d.ts +185 -0
- package/dist/observability/DebugObserver.d.ts.map +1 -0
- package/dist/observability/DebugObserver.js +102 -0
- package/dist/observability/DebugObserver.js.map +1 -0
- package/dist/observability/TelemetryBus.d.ts +88 -0
- package/dist/observability/TelemetryBus.d.ts.map +1 -0
- package/dist/observability/TelemetryBus.js +463 -0
- package/dist/observability/TelemetryBus.js.map +1 -0
- package/dist/observability/TelemetryEvent.d.ts +177 -0
- package/dist/observability/TelemetryEvent.d.ts.map +1 -0
- package/dist/observability/TelemetryEvent.js +2 -0
- package/dist/observability/TelemetryEvent.js.map +1 -0
- package/dist/observability/Tracing.d.ts +155 -0
- package/dist/observability/Tracing.d.ts.map +1 -0
- package/dist/observability/Tracing.js +67 -0
- package/dist/observability/Tracing.js.map +1 -0
- package/dist/observability/index.d.ts +13 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/presenter/PostProcessor.d.ts +52 -0
- package/dist/presenter/PostProcessor.d.ts.map +1 -0
- package/dist/presenter/PostProcessor.js +148 -0
- package/dist/presenter/PostProcessor.js.map +1 -0
- package/dist/presenter/Presenter.d.ts +575 -0
- package/dist/presenter/Presenter.d.ts.map +1 -0
- package/dist/presenter/Presenter.js +768 -0
- package/dist/presenter/Presenter.js.map +1 -0
- package/dist/presenter/PresenterValidationError.d.ts +42 -0
- package/dist/presenter/PresenterValidationError.d.ts.map +1 -0
- package/dist/presenter/PresenterValidationError.js +55 -0
- package/dist/presenter/PresenterValidationError.js.map +1 -0
- package/dist/presenter/RedactEngine.d.ts +110 -0
- package/dist/presenter/RedactEngine.d.ts.map +1 -0
- package/dist/presenter/RedactEngine.js +128 -0
- package/dist/presenter/RedactEngine.js.map +1 -0
- package/dist/presenter/ResponseBuilder.d.ts +262 -0
- package/dist/presenter/ResponseBuilder.d.ts.map +1 -0
- package/dist/presenter/ResponseBuilder.js +374 -0
- package/dist/presenter/ResponseBuilder.js.map +1 -0
- package/dist/presenter/SelectUtils.d.ts +78 -0
- package/dist/presenter/SelectUtils.d.ts.map +1 -0
- package/dist/presenter/SelectUtils.js +141 -0
- package/dist/presenter/SelectUtils.js.map +1 -0
- package/dist/presenter/ZodDescriptionExtractor.d.ts +54 -0
- package/dist/presenter/ZodDescriptionExtractor.d.ts.map +1 -0
- package/dist/presenter/ZodDescriptionExtractor.js +131 -0
- package/dist/presenter/ZodDescriptionExtractor.js.map +1 -0
- package/dist/presenter/definePresenter.d.ts +193 -0
- package/dist/presenter/definePresenter.d.ts.map +1 -0
- package/dist/presenter/definePresenter.js +99 -0
- package/dist/presenter/definePresenter.js.map +1 -0
- package/dist/presenter/index.d.ts +21 -0
- package/dist/presenter/index.d.ts.map +1 -0
- package/dist/presenter/index.js +28 -0
- package/dist/presenter/index.js.map +1 -0
- package/dist/presenter/suggest.d.ts +39 -0
- package/dist/presenter/suggest.d.ts.map +1 -0
- package/dist/presenter/suggest.js +41 -0
- package/dist/presenter/suggest.js.map +1 -0
- package/dist/presenter/typeHelpers.d.ts +147 -0
- package/dist/presenter/typeHelpers.d.ts.map +1 -0
- package/dist/presenter/typeHelpers.js +152 -0
- package/dist/presenter/typeHelpers.js.map +1 -0
- package/dist/presenter/ui.d.ts +205 -0
- package/dist/presenter/ui.d.ts.map +1 -0
- package/dist/presenter/ui.js +222 -0
- package/dist/presenter/ui.js.map +1 -0
- package/dist/prompt/CursorCodec.d.ts +43 -0
- package/dist/prompt/CursorCodec.d.ts.map +1 -0
- package/dist/prompt/CursorCodec.js +171 -0
- package/dist/prompt/CursorCodec.js.map +1 -0
- package/dist/prompt/FluentPromptBuilder.d.ts +155 -0
- package/dist/prompt/FluentPromptBuilder.d.ts.map +1 -0
- package/dist/prompt/FluentPromptBuilder.js +195 -0
- package/dist/prompt/FluentPromptBuilder.js.map +1 -0
- package/dist/prompt/HydrationSandbox.d.ts +55 -0
- package/dist/prompt/HydrationSandbox.d.ts.map +1 -0
- package/dist/prompt/HydrationSandbox.js +122 -0
- package/dist/prompt/HydrationSandbox.js.map +1 -0
- package/dist/prompt/PromptExecutionPipeline.d.ts +61 -0
- package/dist/prompt/PromptExecutionPipeline.d.ts.map +1 -0
- package/dist/prompt/PromptExecutionPipeline.js +177 -0
- package/dist/prompt/PromptExecutionPipeline.js.map +1 -0
- package/dist/prompt/PromptMessage.d.ts +133 -0
- package/dist/prompt/PromptMessage.d.ts.map +1 -0
- package/dist/prompt/PromptMessage.js +182 -0
- package/dist/prompt/PromptMessage.js.map +1 -0
- package/dist/prompt/PromptRegistry.d.ts +236 -0
- package/dist/prompt/PromptRegistry.d.ts.map +1 -0
- package/dist/prompt/PromptRegistry.js +399 -0
- package/dist/prompt/PromptRegistry.js.map +1 -0
- package/dist/prompt/definePrompt.d.ts +111 -0
- package/dist/prompt/definePrompt.d.ts.map +1 -0
- package/dist/prompt/definePrompt.js +130 -0
- package/dist/prompt/definePrompt.js.map +1 -0
- package/dist/prompt/index.d.ts +12 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +13 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/types.d.ts +425 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/prompt/types.js +19 -0
- package/dist/prompt/types.js.map +1 -0
- package/dist/sandbox/SandboxEngine.d.ts +225 -0
- package/dist/sandbox/SandboxEngine.d.ts.map +1 -0
- package/dist/sandbox/SandboxEngine.js +437 -0
- package/dist/sandbox/SandboxEngine.js.map +1 -0
- package/dist/sandbox/SandboxGuard.d.ts +47 -0
- package/dist/sandbox/SandboxGuard.d.ts.map +1 -0
- package/dist/sandbox/SandboxGuard.js +127 -0
- package/dist/sandbox/SandboxGuard.js.map +1 -0
- package/dist/sandbox/index.d.ts +23 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +26 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/server/DevServer.d.ts +120 -0
- package/dist/server/DevServer.d.ts.map +1 -0
- package/dist/server/DevServer.js +252 -0
- package/dist/server/DevServer.js.map +1 -0
- package/dist/server/ServerAttachment.d.ts +354 -0
- package/dist/server/ServerAttachment.d.ts.map +1 -0
- package/dist/server/ServerAttachment.js +709 -0
- package/dist/server/ServerAttachment.js.map +1 -0
- package/dist/server/ServerResolver.d.ts +24 -0
- package/dist/server/ServerResolver.d.ts.map +1 -0
- package/dist/server/ServerResolver.js +50 -0
- package/dist/server/ServerResolver.js.map +1 -0
- package/dist/server/autoDiscover.d.ts +75 -0
- package/dist/server/autoDiscover.d.ts.map +1 -0
- package/dist/server/autoDiscover.js +164 -0
- package/dist/server/autoDiscover.js.map +1 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +11 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/startServer.d.ts +81 -0
- package/dist/server/startServer.d.ts.map +1 -0
- package/dist/server/startServer.js +143 -0
- package/dist/server/startServer.js.map +1 -0
- package/dist/state-sync/CausalEngine.d.ts +28 -0
- package/dist/state-sync/CausalEngine.d.ts.map +1 -0
- package/dist/state-sync/CausalEngine.js +17 -0
- package/dist/state-sync/CausalEngine.js.map +1 -0
- package/dist/state-sync/DescriptionDecorator.d.ts +31 -0
- package/dist/state-sync/DescriptionDecorator.d.ts.map +1 -0
- package/dist/state-sync/DescriptionDecorator.js +38 -0
- package/dist/state-sync/DescriptionDecorator.js.map +1 -0
- package/dist/state-sync/GlobMatcher.d.ts +29 -0
- package/dist/state-sync/GlobMatcher.d.ts.map +1 -0
- package/dist/state-sync/GlobMatcher.js +79 -0
- package/dist/state-sync/GlobMatcher.js.map +1 -0
- package/dist/state-sync/PolicyEngine.d.ts +75 -0
- package/dist/state-sync/PolicyEngine.d.ts.map +1 -0
- package/dist/state-sync/PolicyEngine.js +107 -0
- package/dist/state-sync/PolicyEngine.js.map +1 -0
- package/dist/state-sync/PolicyValidator.d.ts +67 -0
- package/dist/state-sync/PolicyValidator.d.ts.map +1 -0
- package/dist/state-sync/PolicyValidator.js +122 -0
- package/dist/state-sync/PolicyValidator.js.map +1 -0
- package/dist/state-sync/ResponseDecorator.d.ts +33 -0
- package/dist/state-sync/ResponseDecorator.d.ts.map +1 -0
- package/dist/state-sync/ResponseDecorator.js +20 -0
- package/dist/state-sync/ResponseDecorator.js.map +1 -0
- package/dist/state-sync/StateSyncBuilder.d.ts +77 -0
- package/dist/state-sync/StateSyncBuilder.d.ts.map +1 -0
- package/dist/state-sync/StateSyncBuilder.js +129 -0
- package/dist/state-sync/StateSyncBuilder.js.map +1 -0
- package/dist/state-sync/StateSyncLayer.d.ts +107 -0
- package/dist/state-sync/StateSyncLayer.d.ts.map +1 -0
- package/dist/state-sync/StateSyncLayer.js +158 -0
- package/dist/state-sync/StateSyncLayer.js.map +1 -0
- package/dist/state-sync/index.d.ts +27 -0
- package/dist/state-sync/index.d.ts.map +1 -0
- package/dist/state-sync/index.js +27 -0
- package/dist/state-sync/index.js.map +1 -0
- package/dist/state-sync/types.d.ts +174 -0
- package/dist/state-sync/types.d.ts.map +1 -0
- package/dist/state-sync/types.js +17 -0
- package/dist/state-sync/types.js.map +1 -0
- package/dist/testing/MvaMetaSymbol.d.ts +45 -0
- package/dist/testing/MvaMetaSymbol.d.ts.map +1 -0
- package/dist/testing/MvaMetaSymbol.js +34 -0
- package/dist/testing/MvaMetaSymbol.js.map +1 -0
- package/package.json +153 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExecutionPipeline — Orchestrates MCP Tool Execution Steps
|
|
3
|
+
*
|
|
4
|
+
* Breaks the monolithic execute() flow into discrete, testable steps
|
|
5
|
+
* using the Result monad for railway-oriented error handling.
|
|
6
|
+
*
|
|
7
|
+
* Each step either succeeds (passes data to the next step) or fails
|
|
8
|
+
* (short-circuits with an error response).
|
|
9
|
+
*
|
|
10
|
+
* Pipeline: ensureBuilt → parseDiscriminator → resolveAction → validateArgs → runChain
|
|
11
|
+
*/
|
|
12
|
+
import { type ZodObject, type ZodRawShape } from 'zod';
|
|
13
|
+
import { type ToolResponse } from '../response.js';
|
|
14
|
+
import { type Result } from '../result.js';
|
|
15
|
+
import { type InternalAction } from '../types.js';
|
|
16
|
+
import { type CompiledChain } from './MiddlewareCompiler.js';
|
|
17
|
+
import { type ProgressSink } from './ProgressHelper.js';
|
|
18
|
+
import { type PostProcessTelemetry } from '../../presenter/PostProcessor.js';
|
|
19
|
+
/** Pre-built runtime context needed for execution */
|
|
20
|
+
export interface ExecutionContext<TContext> {
|
|
21
|
+
readonly actionMap: Map<string, InternalAction<TContext>>;
|
|
22
|
+
readonly compiledChain: CompiledChain<TContext>;
|
|
23
|
+
readonly validationSchemaCache: Map<string, ZodObject<ZodRawShape> | null>;
|
|
24
|
+
readonly actionKeysString: string;
|
|
25
|
+
readonly discriminator: string;
|
|
26
|
+
readonly toolName: string;
|
|
27
|
+
}
|
|
28
|
+
/** Resolved action with its discriminator value */
|
|
29
|
+
interface ResolvedAction<TContext> {
|
|
30
|
+
readonly action: InternalAction<TContext>;
|
|
31
|
+
readonly discriminatorValue: string;
|
|
32
|
+
}
|
|
33
|
+
/** Step 1: Parse discriminator value from raw args */
|
|
34
|
+
export declare function parseDiscriminator<TContext>(execCtx: ExecutionContext<TContext>, args: Record<string, unknown>): Result<string>;
|
|
35
|
+
/** Step 2: Resolve the action by discriminator value — O(1) lookup */
|
|
36
|
+
export declare function resolveAction<TContext>(execCtx: ExecutionContext<TContext>, discriminatorValue: string): Result<ResolvedAction<TContext>>;
|
|
37
|
+
/** Step 3: Validate and strip args using pre-cached Zod schema */
|
|
38
|
+
export declare function validateArgs<TContext>(execCtx: ExecutionContext<TContext>, resolved: ResolvedAction<TContext>, args: Record<string, unknown>): Result<{
|
|
39
|
+
validated: Record<string, unknown>;
|
|
40
|
+
selectFields: string[] | undefined;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Step 4: Run pre-compiled middleware chain → handler.
|
|
44
|
+
*
|
|
45
|
+
* @param rethrow - When `true`, handler exceptions propagate to the caller
|
|
46
|
+
* instead of being caught and converted to error responses. Used by the
|
|
47
|
+
* traced execution path so that `_executeTraced` can classify system errors
|
|
48
|
+
* (`SpanStatusCode.ERROR` + `recordException`). Default: `false`.
|
|
49
|
+
* @param signal - Optional AbortSignal for cooperative cancellation.
|
|
50
|
+
* Checked before handler execution. If already aborted, returns an
|
|
51
|
+
* immediate error response without invoking the handler chain.
|
|
52
|
+
* @param selectFields - Optional `_select` field names extracted from the
|
|
53
|
+
* AI's input. Forwarded to `postProcessResult()` → `Presenter.make()`
|
|
54
|
+
* for Late Guillotine filtering.
|
|
55
|
+
*/
|
|
56
|
+
export declare function runChain<TContext>(execCtx: ExecutionContext<TContext>, resolved: ResolvedAction<TContext>, ctx: TContext, args: Record<string, unknown>, progressSink?: ProgressSink, rethrow?: boolean, signal?: AbortSignal, selectFields?: string[], telemetry?: PostProcessTelemetry): Promise<ToolResponse>;
|
|
57
|
+
/**
|
|
58
|
+
* An envelope that wraps an async generator from a handler.
|
|
59
|
+
* The middleware compiler detects generator handlers and wraps
|
|
60
|
+
* their return value in this envelope so the pipeline can drain them.
|
|
61
|
+
*/
|
|
62
|
+
export interface GeneratorResultEnvelope {
|
|
63
|
+
readonly __brand: 'GeneratorResultEnvelope';
|
|
64
|
+
readonly generator: AsyncGenerator<unknown, ToolResponse, undefined>;
|
|
65
|
+
}
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=ExecutionPipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionPipeline.d.ts","sourceRoot":"","sources":["../../../src/core/execution/ExecutionPipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AACvD,OAAO,EAAE,KAAK,YAAY,EAA+B,MAAM,gBAAgB,CAAC;AAEhF,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAIhG,qDAAqD;AACrD,MAAM,WAAW,gBAAgB,CAAC,QAAQ;IACtC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3E,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC7B;AAED,mDAAmD;AACnD,UAAU,cAAc,CAAC,QAAQ;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACvC;AAID,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,QAAQ,EACvC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,CAAC,CAyBhB;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,QAAQ,EAClC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EACnC,kBAAkB,EAAE,MAAM,GAC3B,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAalC;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,QAAQ,EACjC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EACnC,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,EAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,CAAC,CA2CpF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EACnC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EACnC,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,EAClC,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,CAAC,EAAE,YAAY,EAC3B,OAAO,UAAQ,EACf,MAAM,CAAC,EAAE,WAAW,EACpB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,SAAS,CAAC,EAAE,oBAAoB,GACjC,OAAO,CAAC,YAAY,CAAC,CA8BvB;AAQD;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;CACxE"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExecutionPipeline — Orchestrates MCP Tool Execution Steps
|
|
3
|
+
*
|
|
4
|
+
* Breaks the monolithic execute() flow into discrete, testable steps
|
|
5
|
+
* using the Result monad for railway-oriented error handling.
|
|
6
|
+
*
|
|
7
|
+
* Each step either succeeds (passes data to the next step) or fails
|
|
8
|
+
* (short-circuits with an error response).
|
|
9
|
+
*
|
|
10
|
+
* Pipeline: ensureBuilt → parseDiscriminator → resolveAction → validateArgs → runChain
|
|
11
|
+
*/
|
|
12
|
+
import {} from 'zod';
|
|
13
|
+
import { error, escapeXml, toolError } from '../response.js';
|
|
14
|
+
import { formatValidationError } from './ValidationErrorFormatter.js';
|
|
15
|
+
import { succeed, fail } from '../result.js';
|
|
16
|
+
import {} from '../types.js';
|
|
17
|
+
import {} from './MiddlewareCompiler.js';
|
|
18
|
+
import { isProgressEvent } from './ProgressHelper.js';
|
|
19
|
+
import { postProcessResult } from '../../presenter/PostProcessor.js';
|
|
20
|
+
// ── Pipeline Steps (pure functions) ──────────────────────
|
|
21
|
+
/** Step 1: Parse discriminator value from raw args */
|
|
22
|
+
export function parseDiscriminator(execCtx, args) {
|
|
23
|
+
const raw = args[execCtx.discriminator];
|
|
24
|
+
// Bug #116 fix: distinguish missing from wrong-type discriminator.
|
|
25
|
+
if (raw !== undefined && typeof raw !== 'string') {
|
|
26
|
+
const text = [
|
|
27
|
+
`<tool_error code="INVALID_DISCRIMINATOR">`,
|
|
28
|
+
`<message>Discriminator field "${escapeXml(execCtx.discriminator)}" must be a string, got ${typeof raw}.</message>`,
|
|
29
|
+
`<available_actions>${escapeXml(execCtx.actionKeysString)}</available_actions>`,
|
|
30
|
+
`<recovery>Set "${escapeXml(execCtx.discriminator)}" to one of the available actions as a string.</recovery>`,
|
|
31
|
+
`</tool_error>`,
|
|
32
|
+
].join('\n');
|
|
33
|
+
return fail({ content: [{ type: 'text', text }], isError: true });
|
|
34
|
+
}
|
|
35
|
+
const value = typeof raw === 'string' ? raw : undefined;
|
|
36
|
+
if (!value) {
|
|
37
|
+
const text = [
|
|
38
|
+
`<tool_error code="MISSING_DISCRIMINATOR">`,
|
|
39
|
+
`<message>The required field "${escapeXml(execCtx.discriminator)}" is missing.</message>`,
|
|
40
|
+
`<available_actions>${escapeXml(execCtx.actionKeysString)}</available_actions>`,
|
|
41
|
+
`<recovery>Add the "${escapeXml(execCtx.discriminator)}" field as a string and call the tool again.</recovery>`,
|
|
42
|
+
`</tool_error>`,
|
|
43
|
+
].join('\n');
|
|
44
|
+
return fail({ content: [{ type: 'text', text }], isError: true });
|
|
45
|
+
}
|
|
46
|
+
return succeed(value);
|
|
47
|
+
}
|
|
48
|
+
/** Step 2: Resolve the action by discriminator value — O(1) lookup */
|
|
49
|
+
export function resolveAction(execCtx, discriminatorValue) {
|
|
50
|
+
const action = execCtx.actionMap.get(discriminatorValue);
|
|
51
|
+
if (!action) {
|
|
52
|
+
const text = [
|
|
53
|
+
`<tool_error code="UNKNOWN_ACTION">`,
|
|
54
|
+
`<message>The ${escapeXml(execCtx.discriminator)} "${escapeXml(discriminatorValue)}" does not exist.</message>`,
|
|
55
|
+
`<available_actions>${escapeXml(execCtx.actionKeysString)}</available_actions>`,
|
|
56
|
+
`<recovery>Choose a valid action from available_actions and call the tool again.</recovery>`,
|
|
57
|
+
`</tool_error>`,
|
|
58
|
+
].join('\n');
|
|
59
|
+
return fail({ content: [{ type: 'text', text }], isError: true });
|
|
60
|
+
}
|
|
61
|
+
return succeed({ action, discriminatorValue });
|
|
62
|
+
}
|
|
63
|
+
/** Step 3: Validate and strip args using pre-cached Zod schema */
|
|
64
|
+
export function validateArgs(execCtx, resolved, args) {
|
|
65
|
+
const validationSchema = execCtx.validationSchemaCache.get(resolved.action.key);
|
|
66
|
+
// Extract _select before validation — it's a framework-level field
|
|
67
|
+
// that must NOT reach the .strict() Zod schema.
|
|
68
|
+
const rawSelect = args['_select'];
|
|
69
|
+
const selectFields = (Array.isArray(rawSelect) && rawSelect.every(v => typeof v === 'string'))
|
|
70
|
+
? rawSelect
|
|
71
|
+
: undefined;
|
|
72
|
+
if (!validationSchema) {
|
|
73
|
+
// No schema — strip _select (framework field) but preserve discriminator
|
|
74
|
+
// (handlers rely on it). Re-inject with resolved value like the with-schema path.
|
|
75
|
+
const { _select: _sel, ...cleaned } = args;
|
|
76
|
+
return succeed({ validated: cleaned, selectFields });
|
|
77
|
+
}
|
|
78
|
+
// Remove discriminator AND _select before validation
|
|
79
|
+
const { [execCtx.discriminator]: _, _select: _unused, ...argsToValidate } = args;
|
|
80
|
+
const result = validationSchema.safeParse(argsToValidate);
|
|
81
|
+
if (!result.success) {
|
|
82
|
+
const text = formatValidationError(result.error.issues, `${execCtx.toolName}/${resolved.discriminatorValue}`, argsToValidate);
|
|
83
|
+
// formatValidationError already produces complete XML — bypass error() to avoid double-wrapping
|
|
84
|
+
return fail({ content: [{ type: 'text', text }], isError: true });
|
|
85
|
+
}
|
|
86
|
+
// Mutate directly — zero-copy re-injection of discriminator
|
|
87
|
+
const validated = result.data;
|
|
88
|
+
// Guard against prototype-pollution via poisoned discriminator names
|
|
89
|
+
const disc = execCtx.discriminator;
|
|
90
|
+
if (disc === '__proto__' || disc === 'constructor' || disc === 'prototype') {
|
|
91
|
+
return fail({
|
|
92
|
+
content: [{ type: 'text', text: `Invalid discriminator name: "${disc}".` }],
|
|
93
|
+
isError: true,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
validated[disc] = resolved.discriminatorValue;
|
|
97
|
+
return succeed({ validated, selectFields });
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Step 4: Run pre-compiled middleware chain → handler.
|
|
101
|
+
*
|
|
102
|
+
* @param rethrow - When `true`, handler exceptions propagate to the caller
|
|
103
|
+
* instead of being caught and converted to error responses. Used by the
|
|
104
|
+
* traced execution path so that `_executeTraced` can classify system errors
|
|
105
|
+
* (`SpanStatusCode.ERROR` + `recordException`). Default: `false`.
|
|
106
|
+
* @param signal - Optional AbortSignal for cooperative cancellation.
|
|
107
|
+
* Checked before handler execution. If already aborted, returns an
|
|
108
|
+
* immediate error response without invoking the handler chain.
|
|
109
|
+
* @param selectFields - Optional `_select` field names extracted from the
|
|
110
|
+
* AI's input. Forwarded to `postProcessResult()` → `Presenter.make()`
|
|
111
|
+
* for Late Guillotine filtering.
|
|
112
|
+
*/
|
|
113
|
+
export async function runChain(execCtx, resolved, ctx, args, progressSink, rethrow = false, signal, selectFields, telemetry) {
|
|
114
|
+
const chain = execCtx.compiledChain.get(resolved.action.key);
|
|
115
|
+
if (!chain) {
|
|
116
|
+
return error(`No compiled chain for action "${resolved.action.key}".`);
|
|
117
|
+
}
|
|
118
|
+
// Cancellation gate: abort before starting the handler chain
|
|
119
|
+
if (signal?.aborted) {
|
|
120
|
+
return error(`[${execCtx.toolName}/${resolved.discriminatorValue}] Request cancelled.`);
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
const result = await chain(ctx, args);
|
|
124
|
+
// If the middleware chain returned a generator result envelope, drain it
|
|
125
|
+
if (isGeneratorResultEnvelope(result)) {
|
|
126
|
+
const drained = await drainGenerator(result.generator, progressSink, signal);
|
|
127
|
+
return postProcessResult(drained, resolved.action.returns, ctx, selectFields, telemetry);
|
|
128
|
+
}
|
|
129
|
+
return postProcessResult(result, resolved.action.returns, ctx, selectFields, telemetry);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
if (rethrow)
|
|
133
|
+
throw err;
|
|
134
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
135
|
+
return toolError('INTERNAL_ERROR', {
|
|
136
|
+
message: `[${execCtx.toolName}/${resolved.discriminatorValue}] ${message}`,
|
|
137
|
+
suggestion: 'This may be a transient error. Retry the same call with identical parameters.',
|
|
138
|
+
severity: 'error',
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** @internal */
|
|
143
|
+
function isGeneratorResultEnvelope(value) {
|
|
144
|
+
return (typeof value === 'object' &&
|
|
145
|
+
value !== null &&
|
|
146
|
+
'__brand' in value &&
|
|
147
|
+
value.__brand === 'GeneratorResultEnvelope');
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Drain an async generator, forwarding ProgressEvents to the sink
|
|
151
|
+
* and returning the final ToolResponse.
|
|
152
|
+
*
|
|
153
|
+
* Checks the AbortSignal before each iteration. If cancelled, the
|
|
154
|
+
* generator is returned (cleanup runs) and an error response is returned.
|
|
155
|
+
* This prevents zombie generators from continuing to execute after
|
|
156
|
+
* the user cancels the request.
|
|
157
|
+
*
|
|
158
|
+
* @internal
|
|
159
|
+
*/
|
|
160
|
+
async function drainGenerator(gen, progressSink, signal) {
|
|
161
|
+
let result = await gen.next();
|
|
162
|
+
while (!result.done) {
|
|
163
|
+
// Cancellation check: abort generator if signal fired
|
|
164
|
+
if (signal?.aborted) {
|
|
165
|
+
// Return the generator to trigger finally {} cleanup
|
|
166
|
+
await gen.return(error('Request cancelled.'));
|
|
167
|
+
return error('Request cancelled.');
|
|
168
|
+
}
|
|
169
|
+
if (progressSink && isProgressEvent(result.value)) {
|
|
170
|
+
progressSink(result.value);
|
|
171
|
+
}
|
|
172
|
+
result = await gen.next();
|
|
173
|
+
}
|
|
174
|
+
return result.value;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=ExecutionPipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionPipeline.js","sourceRoot":"","sources":["../../../src/core/execution/ExecutionPipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type InternalAction, type MiddlewareFn } from '../types.js';
|
|
2
|
+
export type CompiledChain<TContext> = Map<string, (ctx: TContext, args: Record<string, unknown>) => Promise<unknown>>;
|
|
3
|
+
/** Generic handler function signature used in middleware chains. */
|
|
4
|
+
type ChainFn<TContext> = (ctx: TContext, args: Record<string, unknown>) => Promise<unknown>;
|
|
5
|
+
/**
|
|
6
|
+
* Wrap a handler with a middleware stack (right-to-left composition).
|
|
7
|
+
*
|
|
8
|
+
* This is the single canonical implementation of the middleware
|
|
9
|
+
* wrapping pattern. No other file should duplicate this loop.
|
|
10
|
+
*
|
|
11
|
+
* Includes a runtime guard: if a middleware returns `undefined`,
|
|
12
|
+
* a one-time warning is emitted. This catches the common junior
|
|
13
|
+
* mistake of forgetting `return next()`, which silently prevents
|
|
14
|
+
* the handler from executing.
|
|
15
|
+
*
|
|
16
|
+
* @param handler - The innermost function to wrap
|
|
17
|
+
* @param middlewares - Middleware stack (outermost first, applied right-to-left)
|
|
18
|
+
* @returns The compiled chain function
|
|
19
|
+
*/
|
|
20
|
+
export declare function wrapChain<TContext>(handler: ChainFn<TContext>, middlewares: readonly MiddlewareFn<TContext>[]): ChainFn<TContext>;
|
|
21
|
+
/**
|
|
22
|
+
* Pre-compile middleware chains for all actions in a builder.
|
|
23
|
+
*
|
|
24
|
+
* For each action:
|
|
25
|
+
* 1. Wraps generator handlers in a GeneratorResultEnvelope
|
|
26
|
+
* 2. Applies per-action middlewares (innermost)
|
|
27
|
+
* 3. Applies global middlewares (outermost)
|
|
28
|
+
*
|
|
29
|
+
* @param actions - Registered actions with their handlers and local middleware
|
|
30
|
+
* @param middlewares - Global middleware stack
|
|
31
|
+
* @returns Map from action key to compiled chain
|
|
32
|
+
*/
|
|
33
|
+
export declare function compileMiddlewareChains<TContext>(actions: readonly InternalAction<TContext>[], middlewares: readonly MiddlewareFn<TContext>[]): CompiledChain<TContext>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=MiddlewareCompiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MiddlewareCompiler.d.ts","sourceRoot":"","sources":["../../../src/core/execution/MiddlewareCompiler.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAIrE,MAAM,MAAM,aAAa,CAAC,QAAQ,IAAI,GAAG,CACrC,MAAM,EACN,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CACrE,CAAC;AAEF,oEAAoE;AACpE,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AA4B5F;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAC9B,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,WAAW,EAAE,SAAS,YAAY,CAAC,QAAQ,CAAC,EAAE,GAC/C,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAC5C,OAAO,EAAE,SAAS,cAAc,CAAC,QAAQ,CAAC,EAAE,EAC5C,WAAW,EAAE,SAAS,YAAY,CAAC,QAAQ,CAAC,EAAE,GAC/C,aAAa,CAAC,QAAQ,CAAC,CA4BzB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MiddlewareCompiler — Middleware Chain Pre-Compilation Strategy
|
|
3
|
+
*
|
|
4
|
+
* Wraps middlewares right-to-left around each action handler,
|
|
5
|
+
* producing a ready-to-execute chain per action key.
|
|
6
|
+
*
|
|
7
|
+
* Supports both regular async handlers and async generator handlers.
|
|
8
|
+
* Generator handlers are wrapped in a {@link GeneratorResultEnvelope}
|
|
9
|
+
* so the pipeline can drain progress events from them.
|
|
10
|
+
*
|
|
11
|
+
* Pure-function module: no state, no side effects.
|
|
12
|
+
*/
|
|
13
|
+
import {} from '../response.js';
|
|
14
|
+
import {} from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Check if a function is an async generator function.
|
|
17
|
+
* Uses Symbol.toStringTag which survives minification (unlike constructor.name).
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
function isAsyncGeneratorFunction(fn) {
|
|
21
|
+
if (typeof fn !== 'function')
|
|
22
|
+
return false;
|
|
23
|
+
// Symbol.toStringTag is set by the engine on async generator functions
|
|
24
|
+
if (fn[Symbol.toStringTag] === 'AsyncGeneratorFunction')
|
|
25
|
+
return true;
|
|
26
|
+
if (fn.constructor?.name === 'AsyncGeneratorFunction')
|
|
27
|
+
return true;
|
|
28
|
+
// Duck-type fallback for transpiled code: check the prototype
|
|
29
|
+
if (typeof fn.prototype === 'object' && fn.prototype !== null
|
|
30
|
+
&& Symbol.asyncIterator in fn.prototype) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Set of middleware functions that have already triggered the
|
|
37
|
+
* "forgot return next()" warning. Keyed by function identity
|
|
38
|
+
* to ensure each middleware warns at most once across all chains.
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
const _warnedMiddlewares = new WeakSet();
|
|
42
|
+
/**
|
|
43
|
+
* Wrap a handler with a middleware stack (right-to-left composition).
|
|
44
|
+
*
|
|
45
|
+
* This is the single canonical implementation of the middleware
|
|
46
|
+
* wrapping pattern. No other file should duplicate this loop.
|
|
47
|
+
*
|
|
48
|
+
* Includes a runtime guard: if a middleware returns `undefined`,
|
|
49
|
+
* a one-time warning is emitted. This catches the common junior
|
|
50
|
+
* mistake of forgetting `return next()`, which silently prevents
|
|
51
|
+
* the handler from executing.
|
|
52
|
+
*
|
|
53
|
+
* @param handler - The innermost function to wrap
|
|
54
|
+
* @param middlewares - Middleware stack (outermost first, applied right-to-left)
|
|
55
|
+
* @returns The compiled chain function
|
|
56
|
+
*/
|
|
57
|
+
export function wrapChain(handler, middlewares) {
|
|
58
|
+
let chain = handler;
|
|
59
|
+
for (let i = middlewares.length - 1; i >= 0; i--) {
|
|
60
|
+
const mw = middlewares[i];
|
|
61
|
+
if (!mw)
|
|
62
|
+
continue;
|
|
63
|
+
const nextFn = chain;
|
|
64
|
+
chain = async (ctx, args) => {
|
|
65
|
+
const result = await mw(ctx, args, () => nextFn(ctx, args));
|
|
66
|
+
if (result === undefined && !_warnedMiddlewares.has(mw)) {
|
|
67
|
+
_warnedMiddlewares.add(mw);
|
|
68
|
+
console.warn(`[vurb] Middleware "${mw.name || '(anonymous)'}" returned undefined. ` +
|
|
69
|
+
`Did you forget "return next()"? Without it, the handler never executes ` +
|
|
70
|
+
`and the tool silently returns an empty response.`);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return chain;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Pre-compile middleware chains for all actions in a builder.
|
|
79
|
+
*
|
|
80
|
+
* For each action:
|
|
81
|
+
* 1. Wraps generator handlers in a GeneratorResultEnvelope
|
|
82
|
+
* 2. Applies per-action middlewares (innermost)
|
|
83
|
+
* 3. Applies global middlewares (outermost)
|
|
84
|
+
*
|
|
85
|
+
* @param actions - Registered actions with their handlers and local middleware
|
|
86
|
+
* @param middlewares - Global middleware stack
|
|
87
|
+
* @returns Map from action key to compiled chain
|
|
88
|
+
*/
|
|
89
|
+
export function compileMiddlewareChains(actions, middlewares) {
|
|
90
|
+
const compiled = new Map();
|
|
91
|
+
for (const action of actions) {
|
|
92
|
+
// Step 1: Resolve the base handler (regular or generator-wrapped)
|
|
93
|
+
let handler;
|
|
94
|
+
if (isAsyncGeneratorFunction(action.handler)) {
|
|
95
|
+
handler = (ctx, args) => {
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
97
|
+
const gen = action.handler(ctx, args);
|
|
98
|
+
return Promise.resolve({ __brand: 'GeneratorResultEnvelope', generator: gen });
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
handler = action.handler;
|
|
103
|
+
}
|
|
104
|
+
// Step 2: Wrap with per-action middleware (innermost), then global (outermost)
|
|
105
|
+
const actionMws = action.middlewares ?? [];
|
|
106
|
+
const chain = wrapChain(wrapChain(handler, actionMws), middlewares);
|
|
107
|
+
compiled.set(action.key, chain);
|
|
108
|
+
}
|
|
109
|
+
return compiled;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=MiddlewareCompiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MiddlewareCompiler.js","sourceRoot":"","sources":["../../../src/core/execution/MiddlewareCompiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MutationSerializer — Per-Action Intent Mutex for Destructive Operations
|
|
3
|
+
*
|
|
4
|
+
* When an LLM hallucinates and fires two `delete_user` calls for the same ID
|
|
5
|
+
* in the same millisecond, this serializer ensures they execute sequentially —
|
|
6
|
+
* not concurrently. Transactional isolation at the framework level.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* ┌────────────────────────────────────────────────────┐
|
|
10
|
+
* │ delete_user(id: "42") ──► serialize("delete") │
|
|
11
|
+
* │ delete_user(id: "42") ──► queue behind first │
|
|
12
|
+
* │ list_users() ──► pass-through (readOnly)│
|
|
13
|
+
* │ create_user(...) ──► pass-through (not destr)│
|
|
14
|
+
* └────────────────────────────────────────────────────┘
|
|
15
|
+
*
|
|
16
|
+
* Mechanism:
|
|
17
|
+
* Uses promise-chaining per action key. Each destructive call
|
|
18
|
+
* awaits the previous call's completion before starting.
|
|
19
|
+
* This is the idiomatic async mutex pattern in JavaScript:
|
|
20
|
+
* no external locks, no shared memory, no OS primitives.
|
|
21
|
+
*
|
|
22
|
+
* Properties:
|
|
23
|
+
* - Zero overhead for non-destructive actions (never called)
|
|
24
|
+
* - O(1) setup per serialized call (promise chain append)
|
|
25
|
+
* - Automatic GC: completed chains are pruned from the map
|
|
26
|
+
* - Cooperative with AbortSignal: cancelled while waiting
|
|
27
|
+
* - Per action-key isolation: `billing.delete` ≠ `users.delete`
|
|
28
|
+
*
|
|
29
|
+
* @module
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* An async mutex that serializes destructive operations by action key.
|
|
34
|
+
*
|
|
35
|
+
* Created once per builder during `buildToolDefinition()` — only when
|
|
36
|
+
* at least one action is marked `destructive: true`. Otherwise the
|
|
37
|
+
* field stays `undefined` (zero overhead).
|
|
38
|
+
*
|
|
39
|
+
* Used by `_executePipeline()` to wrap `runChain()` for destructive actions.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```
|
|
43
|
+
* // Concurrent calls to `billing.delete`:
|
|
44
|
+
* // Call A → executes immediately
|
|
45
|
+
* // Call B → waits for A to complete → then executes
|
|
46
|
+
* // Call C → waits for B to complete → then executes
|
|
47
|
+
* //
|
|
48
|
+
* // Concurrent calls to `billing.list` (readOnly):
|
|
49
|
+
* // All execute in parallel (serializer not invoked)
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare class MutationSerializer {
|
|
53
|
+
/**
|
|
54
|
+
* Active promise chains keyed by action key.
|
|
55
|
+
* Each entry represents the "tail" of the serialization queue.
|
|
56
|
+
* When the tail resolves, the next waiter starts.
|
|
57
|
+
*/
|
|
58
|
+
private readonly _chains;
|
|
59
|
+
/**
|
|
60
|
+
* Serialize execution of `fn` for the given action key.
|
|
61
|
+
*
|
|
62
|
+
* Concurrent calls with the **same key** are queued and executed
|
|
63
|
+
* strictly in FIFO order. Different keys are fully independent.
|
|
64
|
+
*
|
|
65
|
+
* @param key - Action key (e.g., `"delete"` or `"billing.refund"`)
|
|
66
|
+
* @param fn - The async function to serialize (typically `runChain()`)
|
|
67
|
+
* @param signal - Optional AbortSignal for cooperative cancellation while waiting
|
|
68
|
+
* @returns The result of `fn()`
|
|
69
|
+
* @throws Error if the AbortSignal fires while waiting in queue
|
|
70
|
+
*/
|
|
71
|
+
serialize<T>(key: string, fn: () => Promise<T>, signal?: AbortSignal): Promise<T>;
|
|
72
|
+
/**
|
|
73
|
+
* Number of action keys with active serialization chains.
|
|
74
|
+
* Used for testing and debugging — should be 0 when idle.
|
|
75
|
+
*/
|
|
76
|
+
get activeChains(): number;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=MutationSerializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MutationSerializer.d.ts","sourceRoot":"","sources":["../../../src/core/execution/MutationSerializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,kBAAkB;IAC3B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAI5D;;;;;;;;;;;OAWG;IACG,SAAS,CAAC,CAAC,EACb,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,CAAC,CAAC;IA+Bb;;;OAGG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;CACJ"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MutationSerializer — Per-Action Intent Mutex for Destructive Operations
|
|
3
|
+
*
|
|
4
|
+
* When an LLM hallucinates and fires two `delete_user` calls for the same ID
|
|
5
|
+
* in the same millisecond, this serializer ensures they execute sequentially —
|
|
6
|
+
* not concurrently. Transactional isolation at the framework level.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* ┌────────────────────────────────────────────────────┐
|
|
10
|
+
* │ delete_user(id: "42") ──► serialize("delete") │
|
|
11
|
+
* │ delete_user(id: "42") ──► queue behind first │
|
|
12
|
+
* │ list_users() ──► pass-through (readOnly)│
|
|
13
|
+
* │ create_user(...) ──► pass-through (not destr)│
|
|
14
|
+
* └────────────────────────────────────────────────────┘
|
|
15
|
+
*
|
|
16
|
+
* Mechanism:
|
|
17
|
+
* Uses promise-chaining per action key. Each destructive call
|
|
18
|
+
* awaits the previous call's completion before starting.
|
|
19
|
+
* This is the idiomatic async mutex pattern in JavaScript:
|
|
20
|
+
* no external locks, no shared memory, no OS primitives.
|
|
21
|
+
*
|
|
22
|
+
* Properties:
|
|
23
|
+
* - Zero overhead for non-destructive actions (never called)
|
|
24
|
+
* - O(1) setup per serialized call (promise chain append)
|
|
25
|
+
* - Automatic GC: completed chains are pruned from the map
|
|
26
|
+
* - Cooperative with AbortSignal: cancelled while waiting
|
|
27
|
+
* - Per action-key isolation: `billing.delete` ≠ `users.delete`
|
|
28
|
+
*
|
|
29
|
+
* @module
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
// ── Serializer Implementation ────────────────────────────
|
|
33
|
+
/**
|
|
34
|
+
* An async mutex that serializes destructive operations by action key.
|
|
35
|
+
*
|
|
36
|
+
* Created once per builder during `buildToolDefinition()` — only when
|
|
37
|
+
* at least one action is marked `destructive: true`. Otherwise the
|
|
38
|
+
* field stays `undefined` (zero overhead).
|
|
39
|
+
*
|
|
40
|
+
* Used by `_executePipeline()` to wrap `runChain()` for destructive actions.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```
|
|
44
|
+
* // Concurrent calls to `billing.delete`:
|
|
45
|
+
* // Call A → executes immediately
|
|
46
|
+
* // Call B → waits for A to complete → then executes
|
|
47
|
+
* // Call C → waits for B to complete → then executes
|
|
48
|
+
* //
|
|
49
|
+
* // Concurrent calls to `billing.list` (readOnly):
|
|
50
|
+
* // All execute in parallel (serializer not invoked)
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export class MutationSerializer {
|
|
54
|
+
/**
|
|
55
|
+
* Active promise chains keyed by action key.
|
|
56
|
+
* Each entry represents the "tail" of the serialization queue.
|
|
57
|
+
* When the tail resolves, the next waiter starts.
|
|
58
|
+
*/
|
|
59
|
+
_chains = new Map();
|
|
60
|
+
// ── Public API ───────────────────────────────────────
|
|
61
|
+
/**
|
|
62
|
+
* Serialize execution of `fn` for the given action key.
|
|
63
|
+
*
|
|
64
|
+
* Concurrent calls with the **same key** are queued and executed
|
|
65
|
+
* strictly in FIFO order. Different keys are fully independent.
|
|
66
|
+
*
|
|
67
|
+
* @param key - Action key (e.g., `"delete"` or `"billing.refund"`)
|
|
68
|
+
* @param fn - The async function to serialize (typically `runChain()`)
|
|
69
|
+
* @param signal - Optional AbortSignal for cooperative cancellation while waiting
|
|
70
|
+
* @returns The result of `fn()`
|
|
71
|
+
* @throws Error if the AbortSignal fires while waiting in queue
|
|
72
|
+
*/
|
|
73
|
+
async serialize(key, fn, signal) {
|
|
74
|
+
// Append to the chain for this key
|
|
75
|
+
const prev = this._chains.get(key) ?? Promise.resolve();
|
|
76
|
+
let releaseLock;
|
|
77
|
+
const lock = new Promise(resolve => { releaseLock = resolve; });
|
|
78
|
+
this._chains.set(key, lock);
|
|
79
|
+
try {
|
|
80
|
+
// Wait for previous operation on this key to complete
|
|
81
|
+
await prev;
|
|
82
|
+
// Check if cancelled while waiting in the serialization queue
|
|
83
|
+
if (signal?.aborted) {
|
|
84
|
+
throw new Error('Request cancelled while waiting for mutation lock.');
|
|
85
|
+
}
|
|
86
|
+
return await fn();
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
releaseLock();
|
|
90
|
+
// GC: if this was the last link in the chain, prune the entry
|
|
91
|
+
// so the map doesn't grow unboundedly with resolved promises.
|
|
92
|
+
if (this._chains.get(key) === lock) {
|
|
93
|
+
this._chains.delete(key);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// ── Diagnostics ──────────────────────────────────────
|
|
98
|
+
/**
|
|
99
|
+
* Number of action keys with active serialization chains.
|
|
100
|
+
* Used for testing and debugging — should be 0 when idle.
|
|
101
|
+
*/
|
|
102
|
+
get activeChains() {
|
|
103
|
+
return this._chains.size;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=MutationSerializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MutationSerializer.js","sourceRoot":"","sources":["../../../src/core/execution/MutationSerializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,4DAA4D;AAE5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,kBAAkB;IAC3B;;;;OAIG;IACc,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE5D,wDAAwD;IAExD;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,SAAS,CACX,GAAW,EACX,EAAoB,EACpB,MAAoB;QAEpB,mCAAmC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAExD,IAAI,WAAwB,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE5B,IAAI,CAAC;YACD,sDAAsD;YACtD,MAAM,IAAI,CAAC;YAEX,8DAA8D;YAC9D,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAC1E,CAAC;YAED,OAAO,MAAM,EAAE,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACP,WAAW,EAAE,CAAC;YAEd,8DAA8D;YAC9D,8DAA8D;YAC9D,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;IACL,CAAC;IAED,wDAAwD;IAExD;;;OAGG;IACH,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;CACJ"}
|