@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,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SandboxEngine — Zero-Trust V8 Isolate for Computation Delegation
|
|
3
|
+
*
|
|
4
|
+
* Allows LLMs to send JavaScript functions as strings to be executed
|
|
5
|
+
* in a sealed V8 isolate. The data stays on the client's machine,
|
|
6
|
+
* only the result travels back to the LLM.
|
|
7
|
+
*
|
|
8
|
+
* Architecture (V8 Engineering Rules):
|
|
9
|
+
* 1. ONE Isolate per SandboxEngine (boot ~5-10ms), reused across requests
|
|
10
|
+
* 2. NEW Context per execute() call (~0.1ms), pristine and empty
|
|
11
|
+
* 3. ExternalCopy + Script + Context are ALWAYS released in `finally`
|
|
12
|
+
* 4. Execution is ALWAYS async (script.run, never runSync)
|
|
13
|
+
* 5. Context is empty — no process, require, fs, globalThis injected
|
|
14
|
+
* 6. AbortSignal kills isolate.dispose() instantly (Connection Watchdog)
|
|
15
|
+
*
|
|
16
|
+
* The `isolated-vm` package is a peerDependency (optional).
|
|
17
|
+
* If not installed, the engine throws a clear error at construction time.
|
|
18
|
+
*
|
|
19
|
+
* ┌─────────────────────────────────────────────────────────┐
|
|
20
|
+
* │ SandboxEngine (owns 1 Isolate) │
|
|
21
|
+
* │ │
|
|
22
|
+
* │ execute(code, data, { signal? }) │
|
|
23
|
+
* │ ┌──────────┐ │
|
|
24
|
+
* │ │ Abort? │ pre-flight signal check │
|
|
25
|
+
* │ ├──────────┤ │
|
|
26
|
+
* │ │ Guard │ fail-fast syntax check │
|
|
27
|
+
* │ ├──────────┤ │
|
|
28
|
+
* │ │ Context │ new per request (empty!) │
|
|
29
|
+
* │ ├──────────┤ │
|
|
30
|
+
* │ │ Copy In │ ExternalCopy (deep, no refs) │
|
|
31
|
+
* │ ├──────────┤ │
|
|
32
|
+
* │ │ Compile │ isolate.compileScript │
|
|
33
|
+
* │ ├──────────┤ │
|
|
34
|
+
* │ │ Run │ script.run (ASYNC, with timeout + abort) │
|
|
35
|
+
* │ ├──────────┤ │
|
|
36
|
+
* │ │ Copy Out │ JSON.parse result │
|
|
37
|
+
* │ └──────────┘ │
|
|
38
|
+
* │ │
|
|
39
|
+
* │ finally: signal.removeEventListener() │
|
|
40
|
+
* │ inputCopy.release() │
|
|
41
|
+
* │ script.release() │
|
|
42
|
+
* │ context.release() │
|
|
43
|
+
* └─────────────────────────────────────────────────────────┘
|
|
44
|
+
*
|
|
45
|
+
* @module
|
|
46
|
+
*/
|
|
47
|
+
import { type TelemetrySink } from '../observability/TelemetryEvent.js';
|
|
48
|
+
/**
|
|
49
|
+
* Configuration for a SandboxEngine instance.
|
|
50
|
+
*
|
|
51
|
+
* All fields are optional — sensible defaults are applied.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* const engine = new SandboxEngine({
|
|
56
|
+
* timeout: 3000, // Kill after 3s
|
|
57
|
+
* memoryLimit: 64, // 64MB per isolate
|
|
58
|
+
* maxOutputBytes: 512_000, // 500KB max result
|
|
59
|
+
* });
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export interface SandboxConfig {
|
|
63
|
+
/**
|
|
64
|
+
* Maximum execution time in milliseconds.
|
|
65
|
+
* If the script exceeds this, the V8 isolate kills it.
|
|
66
|
+
* @default 5000
|
|
67
|
+
*/
|
|
68
|
+
timeout?: number;
|
|
69
|
+
/**
|
|
70
|
+
* Maximum memory for the V8 isolate in megabytes.
|
|
71
|
+
* If exceeded, the isolate dies and is recreated on next call.
|
|
72
|
+
* @default 128
|
|
73
|
+
*/
|
|
74
|
+
memoryLimit?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Maximum size of the serialized output in bytes.
|
|
77
|
+
* Prevents a malicious script from returning gigabytes of data.
|
|
78
|
+
* @default 1_048_576 (1MB)
|
|
79
|
+
*/
|
|
80
|
+
maxOutputBytes?: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Error codes for sandbox execution failures.
|
|
84
|
+
*
|
|
85
|
+
* - `TIMEOUT`: Script exceeded the time limit
|
|
86
|
+
* - `MEMORY`: Isolate ran out of memory (auto-recovered)
|
|
87
|
+
* - `SYNTAX`: JavaScript syntax error in the provided code
|
|
88
|
+
* - `RUNTIME`: Script threw an error during execution
|
|
89
|
+
* - `OUTPUT_TOO_LARGE`: Result exceeds `maxOutputBytes`
|
|
90
|
+
* - `INVALID_CODE`: Failed the SandboxGuard fail-fast check
|
|
91
|
+
* - `INVALID_DATA`: Input data contains non-serializable values
|
|
92
|
+
* - `UNAVAILABLE`: `isolated-vm` is not installed
|
|
93
|
+
* - `ABORTED`: Execution was cancelled via AbortSignal (client disconnect)
|
|
94
|
+
*/
|
|
95
|
+
export type SandboxErrorCode = 'TIMEOUT' | 'MEMORY' | 'SYNTAX' | 'RUNTIME' | 'OUTPUT_TOO_LARGE' | 'INVALID_CODE' | 'INVALID_DATA' | 'UNAVAILABLE' | 'ABORTED';
|
|
96
|
+
/**
|
|
97
|
+
* Result of a sandbox execution.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* const result = await engine.execute('(data) => data.length', [1, 2, 3]);
|
|
102
|
+
* if (result.ok) {
|
|
103
|
+
* console.log(result.value); // 3
|
|
104
|
+
* console.log(result.executionMs); // 0.42
|
|
105
|
+
* } else {
|
|
106
|
+
* console.log(result.code); // 'TIMEOUT'
|
|
107
|
+
* console.log(result.error); // 'Script execution timed out (5000ms)'
|
|
108
|
+
* }
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export type SandboxResult<T = unknown> = {
|
|
112
|
+
readonly ok: true;
|
|
113
|
+
readonly value: T;
|
|
114
|
+
readonly executionMs: number;
|
|
115
|
+
} | {
|
|
116
|
+
readonly ok: false;
|
|
117
|
+
readonly error: string;
|
|
118
|
+
readonly code: SandboxErrorCode;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Reset the cached isolated-vm module reference.
|
|
122
|
+
* Exported exclusively for testing — allows mock/unmock cycles
|
|
123
|
+
* without process restart (Bug #137).
|
|
124
|
+
* @internal
|
|
125
|
+
*/
|
|
126
|
+
export declare function resetIvmCache(): void;
|
|
127
|
+
/**
|
|
128
|
+
* Zero-trust V8 sandbox for executing LLM-provided JavaScript.
|
|
129
|
+
*
|
|
130
|
+
* Creates a single V8 `Isolate` at construction time and reuses it
|
|
131
|
+
* across all `execute()` calls. Each call gets a fresh, empty `Context`
|
|
132
|
+
* with no dangerous globals (no `process`, `require`, `fs`, etc.).
|
|
133
|
+
*
|
|
134
|
+
* If the isolate dies (e.g., OOM), it is automatically recreated
|
|
135
|
+
* on the next `execute()` call.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* const sandbox = new SandboxEngine({ timeout: 3000, memoryLimit: 64 });
|
|
140
|
+
*
|
|
141
|
+
* const result = await sandbox.execute(
|
|
142
|
+
* '(data) => data.filter(d => d.risk > 90)',
|
|
143
|
+
* [{ name: 'A', risk: 95 }, { name: 'B', risk: 30 }],
|
|
144
|
+
* );
|
|
145
|
+
*
|
|
146
|
+
* if (result.ok) {
|
|
147
|
+
* console.log(result.value); // [{ name: 'A', risk: 95 }]
|
|
148
|
+
* }
|
|
149
|
+
*
|
|
150
|
+
* // IMPORTANT: dispose when no longer needed
|
|
151
|
+
* sandbox.dispose();
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export declare class SandboxEngine {
|
|
155
|
+
private readonly _timeout;
|
|
156
|
+
private readonly _memoryLimit;
|
|
157
|
+
private readonly _maxOutputBytes;
|
|
158
|
+
private _isolate;
|
|
159
|
+
private _disposed;
|
|
160
|
+
private _telemetry?;
|
|
161
|
+
/** Number of in-flight execute() calls sharing the isolate. */
|
|
162
|
+
private _activeExecutions;
|
|
163
|
+
constructor(config?: SandboxConfig);
|
|
164
|
+
/**
|
|
165
|
+
* Set the telemetry sink for `sandbox.exec` event emission.
|
|
166
|
+
* When set, every `execute()` call emits a telemetry event
|
|
167
|
+
* visible in the Inspector TUI.
|
|
168
|
+
*/
|
|
169
|
+
telemetry(sink: TelemetrySink): this;
|
|
170
|
+
/**
|
|
171
|
+
* Execute a JavaScript function string against the provided data.
|
|
172
|
+
*
|
|
173
|
+
* The function is compiled and run in a sealed V8 isolate with:
|
|
174
|
+
* - No `process`, `require`, `fs`, or network access
|
|
175
|
+
* - Strict timeout enforcement (async, non-blocking)
|
|
176
|
+
* - Memory limit enforcement
|
|
177
|
+
* - Automatic C++ pointer cleanup (ExternalCopy, Script, Context)
|
|
178
|
+
* - Cooperative cancellation via AbortSignal (Connection Watchdog)
|
|
179
|
+
*
|
|
180
|
+
* @param code - A JavaScript function expression as a string.
|
|
181
|
+
* Must be an arrow function or function expression.
|
|
182
|
+
* Example: `(data) => data.filter(d => d.value > 10)`
|
|
183
|
+
*
|
|
184
|
+
* @param data - The data to pass into the function.
|
|
185
|
+
* Deeply copied into the isolate (no references leak).
|
|
186
|
+
*
|
|
187
|
+
* @param options - Optional execution options.
|
|
188
|
+
* @param options.signal - AbortSignal for cooperative cancellation.
|
|
189
|
+
* When the signal fires (e.g., MCP client disconnects), the engine
|
|
190
|
+
* calls `isolate.dispose()` to kill the V8 C++ threads instantly.
|
|
191
|
+
* The isolate is auto-recovered on the next `.execute()` call.
|
|
192
|
+
*
|
|
193
|
+
* @returns A `SandboxResult` with the computed value or an error.
|
|
194
|
+
*/
|
|
195
|
+
execute<T = unknown>(code: string, data: unknown, options?: {
|
|
196
|
+
signal?: AbortSignal;
|
|
197
|
+
}): Promise<SandboxResult<T>>;
|
|
198
|
+
/**
|
|
199
|
+
* Release all resources held by this engine.
|
|
200
|
+
*
|
|
201
|
+
* After calling `dispose()`, any subsequent `execute()` calls
|
|
202
|
+
* will return `{ ok: false, code: 'UNAVAILABLE' }`.
|
|
203
|
+
*/
|
|
204
|
+
dispose(): void;
|
|
205
|
+
/**
|
|
206
|
+
* Check if the engine has been disposed.
|
|
207
|
+
*/
|
|
208
|
+
get isDisposed(): boolean;
|
|
209
|
+
/**
|
|
210
|
+
* Emit a `sandbox.exec` telemetry event if a sink is configured.
|
|
211
|
+
* @internal
|
|
212
|
+
*/
|
|
213
|
+
private _emitTelemetry;
|
|
214
|
+
/**
|
|
215
|
+
* Ensure the isolate is alive. If it died (OOM), create a new one.
|
|
216
|
+
* @internal
|
|
217
|
+
*/
|
|
218
|
+
private _ensureIsolate;
|
|
219
|
+
/**
|
|
220
|
+
* Classify an error from V8 execution into a typed SandboxResult.
|
|
221
|
+
* @internal
|
|
222
|
+
*/
|
|
223
|
+
private _classifyError;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=SandboxEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxEngine.d.ts","sourceRoot":"","sources":["../../src/sandbox/SandboxEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAGH,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAI/F;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,aAAa;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,gBAAgB,GACtB,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,kBAAkB,GAClB,cAAc,GACd,cAAc,GACd,aAAa,GACb,SAAS,CAAC;AAEhB;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAC/B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAkCtF;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,+DAA+D;IAC/D,OAAO,CAAC,iBAAiB,CAAK;gBAElB,MAAM,CAAC,EAAE,aAAa;IAgBlC;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAKpC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACnC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAqK5B;;;;;OAKG;IACH,OAAO,IAAI,IAAI;IAUf;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;OAGG;IACH,OAAO,CAAC,cAAc;IActB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAatB;;;OAGG;IACH,OAAO,CAAC,cAAc;CA6CzB"}
|
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SandboxEngine — Zero-Trust V8 Isolate for Computation Delegation
|
|
3
|
+
*
|
|
4
|
+
* Allows LLMs to send JavaScript functions as strings to be executed
|
|
5
|
+
* in a sealed V8 isolate. The data stays on the client's machine,
|
|
6
|
+
* only the result travels back to the LLM.
|
|
7
|
+
*
|
|
8
|
+
* Architecture (V8 Engineering Rules):
|
|
9
|
+
* 1. ONE Isolate per SandboxEngine (boot ~5-10ms), reused across requests
|
|
10
|
+
* 2. NEW Context per execute() call (~0.1ms), pristine and empty
|
|
11
|
+
* 3. ExternalCopy + Script + Context are ALWAYS released in `finally`
|
|
12
|
+
* 4. Execution is ALWAYS async (script.run, never runSync)
|
|
13
|
+
* 5. Context is empty — no process, require, fs, globalThis injected
|
|
14
|
+
* 6. AbortSignal kills isolate.dispose() instantly (Connection Watchdog)
|
|
15
|
+
*
|
|
16
|
+
* The `isolated-vm` package is a peerDependency (optional).
|
|
17
|
+
* If not installed, the engine throws a clear error at construction time.
|
|
18
|
+
*
|
|
19
|
+
* ┌─────────────────────────────────────────────────────────┐
|
|
20
|
+
* │ SandboxEngine (owns 1 Isolate) │
|
|
21
|
+
* │ │
|
|
22
|
+
* │ execute(code, data, { signal? }) │
|
|
23
|
+
* │ ┌──────────┐ │
|
|
24
|
+
* │ │ Abort? │ pre-flight signal check │
|
|
25
|
+
* │ ├──────────┤ │
|
|
26
|
+
* │ │ Guard │ fail-fast syntax check │
|
|
27
|
+
* │ ├──────────┤ │
|
|
28
|
+
* │ │ Context │ new per request (empty!) │
|
|
29
|
+
* │ ├──────────┤ │
|
|
30
|
+
* │ │ Copy In │ ExternalCopy (deep, no refs) │
|
|
31
|
+
* │ ├──────────┤ │
|
|
32
|
+
* │ │ Compile │ isolate.compileScript │
|
|
33
|
+
* │ ├──────────┤ │
|
|
34
|
+
* │ │ Run │ script.run (ASYNC, with timeout + abort) │
|
|
35
|
+
* │ ├──────────┤ │
|
|
36
|
+
* │ │ Copy Out │ JSON.parse result │
|
|
37
|
+
* │ └──────────┘ │
|
|
38
|
+
* │ │
|
|
39
|
+
* │ finally: signal.removeEventListener() │
|
|
40
|
+
* │ inputCopy.release() │
|
|
41
|
+
* │ script.release() │
|
|
42
|
+
* │ context.release() │
|
|
43
|
+
* └─────────────────────────────────────────────────────────┘
|
|
44
|
+
*
|
|
45
|
+
* @module
|
|
46
|
+
*/
|
|
47
|
+
import { validateSandboxCode } from './SandboxGuard.js';
|
|
48
|
+
import {} from '../observability/TelemetryEvent.js';
|
|
49
|
+
// ── Constants ────────────────────────────────────────────
|
|
50
|
+
const DEFAULT_TIMEOUT_MS = 5_000;
|
|
51
|
+
const DEFAULT_MEMORY_LIMIT_MB = 128;
|
|
52
|
+
const DEFAULT_MAX_OUTPUT_BYTES = 1_048_576; // 1MB
|
|
53
|
+
const MAX_CODE_LENGTH = 65_536; // 64KB — generous for any legitimate sandbox function
|
|
54
|
+
const TEXT_ENCODER = new TextEncoder(); // Bug #138: reuse stateless encoder
|
|
55
|
+
// ── Lazy Require ─────────────────────────────────────────
|
|
56
|
+
/**
|
|
57
|
+
* Lazy-load isolated-vm to avoid hard dependency.
|
|
58
|
+
* Returns `null` if the package is not installed.
|
|
59
|
+
* @internal
|
|
60
|
+
*/
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
62
|
+
let _ivm = undefined;
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
+
function getIvm() {
|
|
65
|
+
if (_ivm !== undefined)
|
|
66
|
+
return _ivm;
|
|
67
|
+
try {
|
|
68
|
+
// Dynamic import would be cleaner but isolated-vm uses
|
|
69
|
+
// native bindings that require synchronous resolution.
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
71
|
+
_ivm = require('isolated-vm');
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
_ivm = null;
|
|
75
|
+
}
|
|
76
|
+
return _ivm;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Reset the cached isolated-vm module reference.
|
|
80
|
+
* Exported exclusively for testing — allows mock/unmock cycles
|
|
81
|
+
* without process restart (Bug #137).
|
|
82
|
+
* @internal
|
|
83
|
+
*/
|
|
84
|
+
export function resetIvmCache() {
|
|
85
|
+
_ivm = undefined;
|
|
86
|
+
}
|
|
87
|
+
// ── Engine Implementation ────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* Zero-trust V8 sandbox for executing LLM-provided JavaScript.
|
|
90
|
+
*
|
|
91
|
+
* Creates a single V8 `Isolate` at construction time and reuses it
|
|
92
|
+
* across all `execute()` calls. Each call gets a fresh, empty `Context`
|
|
93
|
+
* with no dangerous globals (no `process`, `require`, `fs`, etc.).
|
|
94
|
+
*
|
|
95
|
+
* If the isolate dies (e.g., OOM), it is automatically recreated
|
|
96
|
+
* on the next `execute()` call.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const sandbox = new SandboxEngine({ timeout: 3000, memoryLimit: 64 });
|
|
101
|
+
*
|
|
102
|
+
* const result = await sandbox.execute(
|
|
103
|
+
* '(data) => data.filter(d => d.risk > 90)',
|
|
104
|
+
* [{ name: 'A', risk: 95 }, { name: 'B', risk: 30 }],
|
|
105
|
+
* );
|
|
106
|
+
*
|
|
107
|
+
* if (result.ok) {
|
|
108
|
+
* console.log(result.value); // [{ name: 'A', risk: 95 }]
|
|
109
|
+
* }
|
|
110
|
+
*
|
|
111
|
+
* // IMPORTANT: dispose when no longer needed
|
|
112
|
+
* sandbox.dispose();
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export class SandboxEngine {
|
|
116
|
+
_timeout;
|
|
117
|
+
_memoryLimit;
|
|
118
|
+
_maxOutputBytes;
|
|
119
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
120
|
+
_isolate; // ivm.Isolate
|
|
121
|
+
_disposed = false;
|
|
122
|
+
_telemetry;
|
|
123
|
+
/** Number of in-flight execute() calls sharing the isolate. */
|
|
124
|
+
_activeExecutions = 0;
|
|
125
|
+
constructor(config) {
|
|
126
|
+
this._timeout = config?.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
127
|
+
this._memoryLimit = config?.memoryLimit ?? DEFAULT_MEMORY_LIMIT_MB;
|
|
128
|
+
this._maxOutputBytes = config?.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;
|
|
129
|
+
const ivm = getIvm();
|
|
130
|
+
if (!ivm) {
|
|
131
|
+
throw new Error('SandboxEngine requires the "isolated-vm" package. ' +
|
|
132
|
+
'Install it with: npm install isolated-vm');
|
|
133
|
+
}
|
|
134
|
+
this._isolate = new ivm.Isolate({ memoryLimit: this._memoryLimit });
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Set the telemetry sink for `sandbox.exec` event emission.
|
|
138
|
+
* When set, every `execute()` call emits a telemetry event
|
|
139
|
+
* visible in the Inspector TUI.
|
|
140
|
+
*/
|
|
141
|
+
telemetry(sink) {
|
|
142
|
+
this._telemetry = sink;
|
|
143
|
+
return this;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Execute a JavaScript function string against the provided data.
|
|
147
|
+
*
|
|
148
|
+
* The function is compiled and run in a sealed V8 isolate with:
|
|
149
|
+
* - No `process`, `require`, `fs`, or network access
|
|
150
|
+
* - Strict timeout enforcement (async, non-blocking)
|
|
151
|
+
* - Memory limit enforcement
|
|
152
|
+
* - Automatic C++ pointer cleanup (ExternalCopy, Script, Context)
|
|
153
|
+
* - Cooperative cancellation via AbortSignal (Connection Watchdog)
|
|
154
|
+
*
|
|
155
|
+
* @param code - A JavaScript function expression as a string.
|
|
156
|
+
* Must be an arrow function or function expression.
|
|
157
|
+
* Example: `(data) => data.filter(d => d.value > 10)`
|
|
158
|
+
*
|
|
159
|
+
* @param data - The data to pass into the function.
|
|
160
|
+
* Deeply copied into the isolate (no references leak).
|
|
161
|
+
*
|
|
162
|
+
* @param options - Optional execution options.
|
|
163
|
+
* @param options.signal - AbortSignal for cooperative cancellation.
|
|
164
|
+
* When the signal fires (e.g., MCP client disconnects), the engine
|
|
165
|
+
* calls `isolate.dispose()` to kill the V8 C++ threads instantly.
|
|
166
|
+
* The isolate is auto-recovered on the next `.execute()` call.
|
|
167
|
+
*
|
|
168
|
+
* @returns A `SandboxResult` with the computed value or an error.
|
|
169
|
+
*/
|
|
170
|
+
async execute(code, data, options) {
|
|
171
|
+
if (this._disposed) {
|
|
172
|
+
return { ok: false, error: 'SandboxEngine has been disposed.', code: 'UNAVAILABLE' };
|
|
173
|
+
}
|
|
174
|
+
const signal = options?.signal;
|
|
175
|
+
// ── Step 0: Pre-flight abort check ───────────────
|
|
176
|
+
// If the signal is already aborted (client disconnected before
|
|
177
|
+
// we even started), skip all V8 allocation entirely.
|
|
178
|
+
if (signal?.aborted) {
|
|
179
|
+
return {
|
|
180
|
+
ok: false,
|
|
181
|
+
error: 'Execution aborted: client disconnected before sandbox started.',
|
|
182
|
+
code: 'ABORTED',
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
// ── Step 0b: Code length guard ──────────────────
|
|
186
|
+
// Prevent host-side OOM before V8 is even involved.
|
|
187
|
+
// The V8 memoryLimit only bounds the isolate heap, not the host.
|
|
188
|
+
if (code.length > MAX_CODE_LENGTH) {
|
|
189
|
+
return {
|
|
190
|
+
ok: false,
|
|
191
|
+
error: `Code length (${code.length} chars) exceeds maximum (${MAX_CODE_LENGTH} chars). ` +
|
|
192
|
+
'Sandbox functions should be small, pure transformations.',
|
|
193
|
+
code: 'INVALID_CODE',
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
// ── Step 1: Fail-fast guard ─────────────────────
|
|
197
|
+
const guard = validateSandboxCode(code);
|
|
198
|
+
if (!guard.ok) {
|
|
199
|
+
return { ok: false, error: guard.violation, code: 'INVALID_CODE' };
|
|
200
|
+
}
|
|
201
|
+
// ── Step 2: Ensure isolate is alive ─────────────
|
|
202
|
+
this._ensureIsolate();
|
|
203
|
+
const ivm = getIvm();
|
|
204
|
+
const isolate = this._isolate;
|
|
205
|
+
this._activeExecutions++;
|
|
206
|
+
// ── Step 3: Wire abort kill-switch ──────────────
|
|
207
|
+
// When the signal fires and this is the ONLY execution in
|
|
208
|
+
// progress, we call isolate.dispose() to kill V8 instantly.
|
|
209
|
+
//
|
|
210
|
+
// Bug #142: When other executions share the same isolate
|
|
211
|
+
// (activeExecutions > 1), we cannot dispose the isolate
|
|
212
|
+
// without killing all concurrent work (Bug #63 fix). Instead
|
|
213
|
+
// we set the `aborted` flag AND release the per-request
|
|
214
|
+
// context (if already created) to interrupt the running
|
|
215
|
+
// script without collateral damage. If context is not yet
|
|
216
|
+
// created, the script will terminate at its timeout boundary.
|
|
217
|
+
let aborted = false;
|
|
218
|
+
const onAbort = signal ? () => {
|
|
219
|
+
aborted = true;
|
|
220
|
+
if (this._activeExecutions <= 1) {
|
|
221
|
+
try {
|
|
222
|
+
isolate.dispose();
|
|
223
|
+
}
|
|
224
|
+
catch { /* may already be dead */ }
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// Release this request's context to interrupt execution
|
|
228
|
+
// without killing the shared isolate (Bug #142).
|
|
229
|
+
try {
|
|
230
|
+
context?.release();
|
|
231
|
+
}
|
|
232
|
+
catch { /* may already be released */ }
|
|
233
|
+
}
|
|
234
|
+
} : undefined;
|
|
235
|
+
if (signal && onAbort) {
|
|
236
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
237
|
+
}
|
|
238
|
+
// ── Step 4: Execute in sealed context ───────────
|
|
239
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
240
|
+
let inputCopy; // ivm.ExternalCopy
|
|
241
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
242
|
+
let context; // ivm.Context
|
|
243
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
244
|
+
let script; // ivm.Script
|
|
245
|
+
const startMs = performance.now();
|
|
246
|
+
try {
|
|
247
|
+
// Create pristine context (NO globals injected — this IS the security)
|
|
248
|
+
context = await isolate.createContext();
|
|
249
|
+
// Deep-copy data into isolated heap (no references!)
|
|
250
|
+
// Bug #135: catch serialization errors from ExternalCopy separately
|
|
251
|
+
try {
|
|
252
|
+
inputCopy = new ivm.ExternalCopy(data);
|
|
253
|
+
}
|
|
254
|
+
catch (copyErr) {
|
|
255
|
+
const copyMsg = copyErr instanceof Error ? copyErr.message : String(copyErr);
|
|
256
|
+
const result = {
|
|
257
|
+
ok: false,
|
|
258
|
+
error: `Data serialization error: ${copyMsg}. The input data contains non-serializable values (functions, Symbols, WeakRefs, etc.).`,
|
|
259
|
+
code: 'INVALID_DATA',
|
|
260
|
+
};
|
|
261
|
+
this._emitTelemetry(result);
|
|
262
|
+
return result;
|
|
263
|
+
}
|
|
264
|
+
await context.global.set('__input__', inputCopy.copyInto());
|
|
265
|
+
// Compile with wrapper: call the function and serialize result
|
|
266
|
+
const wrappedCode = `const __fn__ = ${code};\nJSON.stringify(__fn__(__input__));`;
|
|
267
|
+
script = await isolate.compileScript(wrappedCode);
|
|
268
|
+
// ASYNC execution — never blocks the Node.js event loop
|
|
269
|
+
const rawResult = await script.run(context, { timeout: this._timeout });
|
|
270
|
+
const executionMs = performance.now() - startMs;
|
|
271
|
+
// ── Step 5: Output size guard ───────────────
|
|
272
|
+
if (typeof rawResult === 'string') {
|
|
273
|
+
const outputByteLength = TEXT_ENCODER.encode(rawResult).byteLength;
|
|
274
|
+
if (outputByteLength > this._maxOutputBytes) {
|
|
275
|
+
const oversized = {
|
|
276
|
+
ok: false,
|
|
277
|
+
error: `Output size (${outputByteLength} bytes) exceeds limit (${this._maxOutputBytes} bytes). ` +
|
|
278
|
+
'Use more selective filters to reduce the result set.',
|
|
279
|
+
code: 'OUTPUT_TOO_LARGE',
|
|
280
|
+
};
|
|
281
|
+
this._emitTelemetry(oversized);
|
|
282
|
+
return oversized;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// ── Step 6: Parse result ────────────────────
|
|
286
|
+
const parsed = typeof rawResult === 'string' ? JSON.parse(rawResult) : rawResult;
|
|
287
|
+
const result = { ok: true, value: parsed, executionMs };
|
|
288
|
+
this._emitTelemetry(result);
|
|
289
|
+
return result;
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
// If the abort listener disposed the isolate, classify as ABORTED
|
|
293
|
+
// (not MEMORY — the user disconnected, not an OOM condition)
|
|
294
|
+
if (aborted) {
|
|
295
|
+
const result = {
|
|
296
|
+
ok: false,
|
|
297
|
+
error: 'Execution aborted: client disconnected during sandbox execution.',
|
|
298
|
+
code: 'ABORTED',
|
|
299
|
+
};
|
|
300
|
+
this._emitTelemetry(result);
|
|
301
|
+
return result;
|
|
302
|
+
}
|
|
303
|
+
const result = this._classifyError(err);
|
|
304
|
+
this._emitTelemetry(result);
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
307
|
+
finally {
|
|
308
|
+
// ── MANDATORY ABORT LISTENER CLEANUP ─────────
|
|
309
|
+
// Remove the listener to prevent memory leaks when
|
|
310
|
+
// execution completes before the signal fires.
|
|
311
|
+
if (signal && onAbort) {
|
|
312
|
+
signal.removeEventListener('abort', onAbort);
|
|
313
|
+
}
|
|
314
|
+
// ── MANDATORY C++ POINTER RELEASE ────────────
|
|
315
|
+
// Order matters: release inner resources first.
|
|
316
|
+
// After abort-triggered dispose, these will throw
|
|
317
|
+
// but the catch blocks handle dead-isolate gracefully.
|
|
318
|
+
try {
|
|
319
|
+
inputCopy?.release();
|
|
320
|
+
}
|
|
321
|
+
catch { /* already released or isolate dead */ }
|
|
322
|
+
try {
|
|
323
|
+
script?.release();
|
|
324
|
+
}
|
|
325
|
+
catch { /* already released or isolate dead */ }
|
|
326
|
+
try {
|
|
327
|
+
context?.release();
|
|
328
|
+
}
|
|
329
|
+
catch { /* already released or isolate dead */ }
|
|
330
|
+
this._activeExecutions--;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Release all resources held by this engine.
|
|
335
|
+
*
|
|
336
|
+
* After calling `dispose()`, any subsequent `execute()` calls
|
|
337
|
+
* will return `{ ok: false, code: 'UNAVAILABLE' }`.
|
|
338
|
+
*/
|
|
339
|
+
dispose() {
|
|
340
|
+
if (this._disposed)
|
|
341
|
+
return;
|
|
342
|
+
this._disposed = true;
|
|
343
|
+
try {
|
|
344
|
+
this._isolate?.dispose();
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
// Isolate may already be dead (OOM)
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Check if the engine has been disposed.
|
|
352
|
+
*/
|
|
353
|
+
get isDisposed() {
|
|
354
|
+
return this._disposed;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Emit a `sandbox.exec` telemetry event if a sink is configured.
|
|
358
|
+
* @internal
|
|
359
|
+
*/
|
|
360
|
+
_emitTelemetry(result) {
|
|
361
|
+
if (!this._telemetry)
|
|
362
|
+
return;
|
|
363
|
+
const event = {
|
|
364
|
+
type: 'sandbox.exec',
|
|
365
|
+
ok: result.ok,
|
|
366
|
+
executionMs: result.ok ? result.executionMs : 0,
|
|
367
|
+
...(!result.ok ? { errorCode: result.code } : {}),
|
|
368
|
+
timestamp: Date.now(),
|
|
369
|
+
};
|
|
370
|
+
this._telemetry(event);
|
|
371
|
+
}
|
|
372
|
+
// ── Private ──────────────────────────────────────────
|
|
373
|
+
/**
|
|
374
|
+
* Ensure the isolate is alive. If it died (OOM), create a new one.
|
|
375
|
+
* @internal
|
|
376
|
+
*/
|
|
377
|
+
_ensureIsolate() {
|
|
378
|
+
const ivm = getIvm();
|
|
379
|
+
// Check if isolate is still usable
|
|
380
|
+
try {
|
|
381
|
+
if (this._isolate?.isDisposed) {
|
|
382
|
+
this._isolate = new ivm.Isolate({ memoryLimit: this._memoryLimit });
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
// isDisposed threw → isolate is dead, recreate
|
|
387
|
+
this._isolate = new ivm.Isolate({ memoryLimit: this._memoryLimit });
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Classify an error from V8 execution into a typed SandboxResult.
|
|
392
|
+
* @internal
|
|
393
|
+
*/
|
|
394
|
+
_classifyError(err) {
|
|
395
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
396
|
+
// Timeout: isolated-vm throws a specific error
|
|
397
|
+
if (message.includes('Script execution timed out')) {
|
|
398
|
+
return {
|
|
399
|
+
ok: false,
|
|
400
|
+
error: `Script execution timed out (${this._timeout}ms). ` +
|
|
401
|
+
'Simplify the computation or increase the timeout limit.',
|
|
402
|
+
code: 'TIMEOUT',
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
// Memory: V8 kills the isolate
|
|
406
|
+
if (message.includes('Isolate was disposed') ||
|
|
407
|
+
message.includes('out of memory') ||
|
|
408
|
+
message.includes('allocation failed')) {
|
|
409
|
+
// Mark isolate for recreation on next call
|
|
410
|
+
try {
|
|
411
|
+
this._isolate?.dispose();
|
|
412
|
+
}
|
|
413
|
+
catch { /* ignore */ }
|
|
414
|
+
return {
|
|
415
|
+
ok: false,
|
|
416
|
+
error: `Isolate ran out of memory (${this._memoryLimit}MB limit). ` +
|
|
417
|
+
'Reduce the data size or simplify the computation.',
|
|
418
|
+
code: 'MEMORY',
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
// Syntax: V8 compilation error
|
|
422
|
+
if (message.includes('SyntaxError')) {
|
|
423
|
+
return {
|
|
424
|
+
ok: false,
|
|
425
|
+
error: `JavaScript syntax error: ${message}`,
|
|
426
|
+
code: 'SYNTAX',
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
// Runtime: any other V8 error (ReferenceError, TypeError, etc.)
|
|
430
|
+
return {
|
|
431
|
+
ok: false,
|
|
432
|
+
error: `Runtime error: ${message}`,
|
|
433
|
+
code: 'RUNTIME',
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
//# sourceMappingURL=SandboxEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxEngine.js","sourceRoot":"","sources":["../../src/sandbox/SandboxEngine.ts"],"names":[],"mappings":"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"}
|