blokctl 1.3.0 → 1.4.1
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/dist/commands/create/project.js +15 -4
- package/dist/commands/create/utils/Examples.d.ts +1 -1
- package/dist/commands/create/utils/Examples.js +1 -1
- package/dist/commands/runtime/shared.js +4 -0
- package/dist/scaffold-repo/examples/ts-workflows/mcp-greeter.ts +59 -0
- package/dist/scaffold-repo/examples/ts-workflows/runtime-csharp-hello.ts +36 -0
- package/dist/scaffold-repo/examples/ts-workflows/runtime-go-hello.ts +36 -0
- package/dist/scaffold-repo/examples/ts-workflows/runtime-java-hello.ts +36 -0
- package/dist/scaffold-repo/examples/ts-workflows/runtime-php-hello.ts +36 -0
- package/dist/scaffold-repo/examples/ts-workflows/runtime-python3-hello.ts +36 -0
- package/dist/scaffold-repo/examples/ts-workflows/runtime-ruby-hello.ts +36 -0
- package/dist/scaffold-repo/examples/ts-workflows/runtime-rust-hello.ts +36 -0
- package/dist/scaffold-repo/infra/development/3055.dat +602 -0
- package/dist/scaffold-repo/infra/development/3057.dat +203 -0
- package/dist/scaffold-repo/infra/development/3059.dat +19 -0
- package/dist/scaffold-repo/infra/development/3061.dat +1003 -0
- package/dist/scaffold-repo/infra/development/3062.dat +5465 -0
- package/dist/scaffold-repo/infra/development/3063.dat +1003 -0
- package/dist/scaffold-repo/infra/development/3065.dat +606 -0
- package/dist/scaffold-repo/infra/development/3067.dat +603 -0
- package/dist/scaffold-repo/infra/development/3069.dat +112 -0
- package/dist/scaffold-repo/infra/development/3071.dat +4584 -0
- package/dist/scaffold-repo/infra/development/3073.dat +9 -0
- package/dist/scaffold-repo/infra/development/3075.dat +14599 -0
- package/dist/scaffold-repo/infra/development/3077.dat +16047 -0
- package/dist/scaffold-repo/infra/development/3079.dat +5 -0
- package/dist/scaffold-repo/infra/development/3081.dat +5 -0
- package/dist/scaffold-repo/infra/development/docker-compose.yml +106 -0
- package/dist/scaffold-repo/infra/development/schema.sql +1616 -0
- package/dist/scaffold-repo/infra/development/toc.dat +0 -0
- package/dist/scaffold-repo/infra/metrics/alertmanager.yml +43 -0
- package/dist/scaffold-repo/infra/metrics/alloy-config.alloy +75 -0
- package/dist/scaffold-repo/infra/metrics/dashboard.json +1152 -0
- package/dist/scaffold-repo/infra/metrics/dashboards/blok-overview.json +314 -0
- package/dist/scaffold-repo/infra/metrics/dashboards/blok-system.json +175 -0
- package/dist/scaffold-repo/infra/metrics/dashboards/blok-tracing.json +235 -0
- package/dist/scaffold-repo/infra/metrics/dashboards/blok-triggers.json +258 -0
- package/dist/scaffold-repo/infra/metrics/datasources.yml +43 -0
- package/dist/scaffold-repo/infra/metrics/default.yaml +8 -0
- package/dist/scaffold-repo/infra/metrics/docker-compose.yml +193 -0
- package/dist/scaffold-repo/infra/metrics/loki-config.yaml +50 -0
- package/dist/scaffold-repo/infra/metrics/nginx.conf +25 -0
- package/dist/scaffold-repo/infra/metrics/prometheus.yml +51 -0
- package/dist/scaffold-repo/infra/metrics/rules/blok-alerts.yml +114 -0
- package/dist/scaffold-repo/infra/metrics/telegraf.conf +41 -0
- package/dist/scaffold-repo/infra/metrics/tempo.yaml +81 -0
- package/dist/scaffold-repo/infra/milvus/docker-compose.yml +73 -0
- package/dist/scaffold-repo/sdk/javascript/README.md +151 -0
- package/dist/scaffold-repo/sdk/javascript/bootstrap.min.css +11660 -0
- package/dist/scaffold-repo/sdk/javascript/image-ai.html +316 -0
- package/dist/scaffold-repo/sdk/javascript/nanosdk.js +180 -0
- package/dist/scaffold-repo/sdk/javascript/nanosdk.min.js +100 -0
- package/dist/scaffold-repo/sdk/javascript/pdf.html +63 -0
- package/dist/scaffold-repo/sdk/javascript/test.html +68 -0
- package/dist/scaffold-repo/sdks/CLAUDE.md +67 -0
- package/dist/scaffold-repo/sdks/csharp/.dockerignore +7 -0
- package/dist/scaffold-repo/sdks/csharp/Blok.Core.sln +24 -0
- package/dist/scaffold-repo/sdks/csharp/Dockerfile +42 -0
- package/dist/scaffold-repo/sdks/csharp/README.md +138 -0
- package/dist/scaffold-repo/sdks/csharp/proto/blok/runtime/v1/runtime.proto +302 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Blok.Core.csproj +39 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Config/ServerConfig.cs +90 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BlokError.cs +538 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BlokErrorCategory.cs +112 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BlokErrorSeverity.cs +40 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BuildContextSnapshot.cs +168 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/ErrorCategory.cs +13 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/NodeException.cs +44 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Logging/LogEntry.cs +34 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Logging/LogLevel.cs +12 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Logging/Logger.cs +92 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/IMiddleware.cs +14 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/LoggingMiddleware.cs +46 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/MiddlewareChain.cs +35 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/RecoveryMiddleware.cs +63 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Node/INodeHandler.cs +17 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Node/NodeRegistry.cs +128 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Node/TypedNode.cs +140 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/ApiCallNode.cs +129 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/BlokErrorDemoNode.cs +125 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/ChainTestNode.cs +79 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/HelloWorldNode.cs +45 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/TransformDataNode.cs +119 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/TypedGreetNode.cs +23 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Program.cs +26 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Server/BlokNodeRuntimeService.cs +536 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Server/RuntimeServer.cs +183 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Testing/MockContextBuilder.cs +117 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Testing/TestNodeRunner.cs +50 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/Context.cs +56 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/ExecutionMetrics.cs +21 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/ExecutionRequest.cs +15 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/ExecutionResult.cs +104 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/HealthStatus.cs +18 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/NodeConfig.cs +59 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/Request.cs +57 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/Response.cs +24 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/UserNodeRegistry.cs +17 -0
- package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Validation/SchemaValidator.cs +198 -0
- package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Blok.Core.Tests.csproj +25 -0
- package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Errors/BlokErrorTests.cs +458 -0
- package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Logging/LoggerTests.cs +129 -0
- package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Node/NodeRegistryTests.cs +145 -0
- package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Testing/MockContextTests.cs +153 -0
- package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/TypedNodeTests.cs +69 -0
- package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Types/ExecutionResultTests.cs +110 -0
- package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Validation/SchemaValidatorTests.cs +233 -0
- package/dist/scaffold-repo/sdks/go/Dockerfile +33 -0
- package/dist/scaffold-repo/sdks/go/README.md +255 -0
- package/dist/scaffold-repo/sdks/go/blok_error.go +803 -0
- package/dist/scaffold-repo/sdks/go/blok_error_test.go +433 -0
- package/dist/scaffold-repo/sdks/go/cmd/server/main.go +45 -0
- package/dist/scaffold-repo/sdks/go/cmd/server/register_user_nodes.go +12 -0
- package/dist/scaffold-repo/sdks/go/config.go +157 -0
- package/dist/scaffold-repo/sdks/go/config_test.go +129 -0
- package/dist/scaffold-repo/sdks/go/define_node.go +87 -0
- package/dist/scaffold-repo/sdks/go/define_node_test.go +75 -0
- package/dist/scaffold-repo/sdks/go/errors.go +104 -0
- package/dist/scaffold-repo/sdks/go/errors_test.go +95 -0
- package/dist/scaffold-repo/sdks/go/examples/nodes/apicall.go +117 -0
- package/dist/scaffold-repo/sdks/go/examples/nodes/blokerrordemo.go +80 -0
- package/dist/scaffold-repo/sdks/go/examples/nodes/chaintest.go +63 -0
- package/dist/scaffold-repo/sdks/go/examples/nodes/helloworld.go +41 -0
- package/dist/scaffold-repo/sdks/go/examples/nodes/transformdata.go +176 -0
- package/dist/scaffold-repo/sdks/go/examples/nodes/typedgreet.go +34 -0
- package/dist/scaffold-repo/sdks/go/genpb/blok/runtime/v1/runtime.pb.go +2070 -0
- package/dist/scaffold-repo/sdks/go/genpb/blok/runtime/v1/runtime_grpc.pb.go +273 -0
- package/dist/scaffold-repo/sdks/go/go.mod +25 -0
- package/dist/scaffold-repo/sdks/go/go.sum +66 -0
- package/dist/scaffold-repo/sdks/go/grpc_server.go +670 -0
- package/dist/scaffold-repo/sdks/go/grpc_server_test.go +474 -0
- package/dist/scaffold-repo/sdks/go/logging.go +144 -0
- package/dist/scaffold-repo/sdks/go/logging_test.go +139 -0
- package/dist/scaffold-repo/sdks/go/middleware.go +152 -0
- package/dist/scaffold-repo/sdks/go/middleware_test.go +222 -0
- package/dist/scaffold-repo/sdks/go/node.go +50 -0
- package/dist/scaffold-repo/sdks/go/proto/blok/runtime/v1/runtime.proto +302 -0
- package/dist/scaffold-repo/sdks/go/registry.go +156 -0
- package/dist/scaffold-repo/sdks/go/registry_test.go +195 -0
- package/dist/scaffold-repo/sdks/go/server.go +207 -0
- package/dist/scaffold-repo/sdks/go/server_test.go +186 -0
- package/dist/scaffold-repo/sdks/go/shutdown.go +32 -0
- package/dist/scaffold-repo/sdks/go/testutil.go +169 -0
- package/dist/scaffold-repo/sdks/go/testutil_test.go +124 -0
- package/dist/scaffold-repo/sdks/go/types.go +295 -0
- package/dist/scaffold-repo/sdks/go/types_test.go +251 -0
- package/dist/scaffold-repo/sdks/go/validation.go +210 -0
- package/dist/scaffold-repo/sdks/go/validation_test.go +262 -0
- package/dist/scaffold-repo/sdks/go/worker.go +577 -0
- package/dist/scaffold-repo/sdks/java/Dockerfile +33 -0
- package/dist/scaffold-repo/sdks/java/README.md +221 -0
- package/dist/scaffold-repo/sdks/java/pom.xml +163 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/Main.java +90 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/UserNodeRegistry.java +19 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/config/ServerConfig.java +244 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BlokError.java +576 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BlokErrorCategory.java +68 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BlokErrorSeverity.java +31 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BuildContextSnapshot.java +132 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/ErrorCategory.java +22 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/NodeException.java +176 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/logging/LogEntry.java +78 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/logging/LogLevel.java +48 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/logging/Logger.java +160 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/LoggingMiddleware.java +65 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/Middleware.java +29 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/MiddlewareChain.java +59 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/RecoveryMiddleware.java +53 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/NodeHandler.java +40 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/NodeReflector.java +18 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/NodeRegistry.java +205 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/TypedNode.java +143 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/ApiCallNode.java +145 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/BlokErrorDemoNode.java +109 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/ChainTestNode.java +65 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/HelloWorldNode.java +62 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/TransformDataNode.java +121 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/TypedGreetNode.java +41 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/server/BlokGrpcServer.java +103 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/server/BlokNodeRuntimeService.java +501 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/server/RuntimeServer.java +176 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/testing/MockContext.java +120 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/testing/TestRunner.java +59 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/Context.java +167 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/ExecutionMetrics.java +80 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/ExecutionRequest.java +61 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/ExecutionResult.java +188 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/HealthStatus.java +77 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/NodeConfig.java +139 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/Request.java +154 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/Response.java +77 -0
- package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/validation/SchemaValidator.java +178 -0
- package/dist/scaffold-repo/sdks/java/src/main/proto/blok/runtime/v1/runtime.proto +302 -0
- package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/errors/BlokErrorTest.java +416 -0
- package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/logging/LoggerTest.java +176 -0
- package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/node/NodeRegistryTest.java +227 -0
- package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/node/TypedNodeTest.java +76 -0
- package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/server/RuntimeServerTest.java +197 -0
- package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/types/ExecutionResultTest.java +194 -0
- package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/validation/SchemaValidatorTest.java +246 -0
- package/dist/scaffold-repo/sdks/php/.rr.yaml +29 -0
- package/dist/scaffold-repo/sdks/php/Dockerfile +61 -0
- package/dist/scaffold-repo/sdks/php/README.md +387 -0
- package/dist/scaffold-repo/sdks/php/bin/serve.php +95 -0
- package/dist/scaffold-repo/sdks/php/composer.json +41 -0
- package/dist/scaffold-repo/sdks/php/examples/ApiCallNode.php +103 -0
- package/dist/scaffold-repo/sdks/php/examples/BlokErrorDemoNode.php +90 -0
- package/dist/scaffold-repo/sdks/php/examples/ChainTestNode.php +56 -0
- package/dist/scaffold-repo/sdks/php/examples/HelloWorldNode.php +39 -0
- package/dist/scaffold-repo/sdks/php/examples/TransformDataNode.php +94 -0
- package/dist/scaffold-repo/sdks/php/examples/TypedGreetNode.php +57 -0
- package/dist/scaffold-repo/sdks/php/phpunit.xml +23 -0
- package/dist/scaffold-repo/sdks/php/proto/blok/runtime/v1/runtime.proto +302 -0
- package/dist/scaffold-repo/sdks/php/src/Config/ServerConfig.php +83 -0
- package/dist/scaffold-repo/sdks/php/src/Errors/BlokError.php +467 -0
- package/dist/scaffold-repo/sdks/php/src/Errors/BlokErrorBuilder.php +121 -0
- package/dist/scaffold-repo/sdks/php/src/Errors/BlokErrorCategory.php +83 -0
- package/dist/scaffold-repo/sdks/php/src/Errors/BlokErrorSeverity.php +30 -0
- package/dist/scaffold-repo/sdks/php/src/Errors/BuildContextSnapshot.php +141 -0
- package/dist/scaffold-repo/sdks/php/src/Errors/ErrorCategory.php +17 -0
- package/dist/scaffold-repo/sdks/php/src/Errors/NodeException.php +107 -0
- package/dist/scaffold-repo/sdks/php/src/Errors/Origin.php +35 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ErrorCategory.php +118 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ErrorSeverity.php +72 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteEvent.php +181 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteOptions.php +159 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteRequest.php +328 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteResponse.php +288 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/HealthRequest.php +59 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/HealthResponse/Status.php +54 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/HealthResponse.php +113 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ListNodesRequest.php +32 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ListNodesResponse.php +154 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/LogLine.php +156 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/Metrics.php +165 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeDescriptor.php +174 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeError.php +627 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeRef.php +134 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeRuntimeClient.php +101 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeStarted.php +68 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/PartialResult.php +59 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/Progress.php +85 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/RuntimeState.php +142 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/StepInfo.php +168 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/TriggerInfo.php +289 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/WorkflowInfo.php +176 -0
- package/dist/scaffold-repo/sdks/php/src/Genpb/GPBMetadata/Blok/Runtime/V1/Runtime.php +26 -0
- package/dist/scaffold-repo/sdks/php/src/Logging/LogEntry.php +47 -0
- package/dist/scaffold-repo/sdks/php/src/Logging/LogLevel.php +50 -0
- package/dist/scaffold-repo/sdks/php/src/Logging/Logger.php +133 -0
- package/dist/scaffold-repo/sdks/php/src/Node/NodeHandler.php +35 -0
- package/dist/scaffold-repo/sdks/php/src/Node/NodeReflector.php +21 -0
- package/dist/scaffold-repo/sdks/php/src/Node/NodeRegistry.php +172 -0
- package/dist/scaffold-repo/sdks/php/src/Node/TypedNode.php +159 -0
- package/dist/scaffold-repo/sdks/php/src/Server/BlokNodeRuntimeService.php +504 -0
- package/dist/scaffold-repo/sdks/php/src/Server/DecodeException.php +13 -0
- package/dist/scaffold-repo/sdks/php/src/Server/Middleware.php +18 -0
- package/dist/scaffold-repo/sdks/php/src/Server/MiddlewarePipeline.php +33 -0
- package/dist/scaffold-repo/sdks/php/src/Server/NodeRuntimeInterface.php +40 -0
- package/dist/scaffold-repo/sdks/php/src/Server/Server.php +157 -0
- package/dist/scaffold-repo/sdks/php/src/Testing/MockContext.php +161 -0
- package/dist/scaffold-repo/sdks/php/src/Testing/TestRunner.php +78 -0
- package/dist/scaffold-repo/sdks/php/src/Types/Context.php +80 -0
- package/dist/scaffold-repo/sdks/php/src/Types/ExecutionMetrics.php +48 -0
- package/dist/scaffold-repo/sdks/php/src/Types/ExecutionRequest.php +38 -0
- package/dist/scaffold-repo/sdks/php/src/Types/ExecutionResult.php +143 -0
- package/dist/scaffold-repo/sdks/php/src/Types/HealthStatus.php +42 -0
- package/dist/scaffold-repo/sdks/php/src/Types/NodeConfig.php +72 -0
- package/dist/scaffold-repo/sdks/php/src/Types/Request.php +82 -0
- package/dist/scaffold-repo/sdks/php/src/Types/Response.php +44 -0
- package/dist/scaffold-repo/sdks/php/src/Validation/SchemaValidator.php +197 -0
- package/dist/scaffold-repo/sdks/php/tests/Errors/BlokErrorTest.php +402 -0
- package/dist/scaffold-repo/sdks/php/tests/Logging/LoggerTest.php +165 -0
- package/dist/scaffold-repo/sdks/php/tests/Node/NodeRegistryTest.php +139 -0
- package/dist/scaffold-repo/sdks/php/tests/Node/TypedNodeTest.php +84 -0
- package/dist/scaffold-repo/sdks/php/tests/Server/BlokNodeRuntimeServiceTest.php +288 -0
- package/dist/scaffold-repo/sdks/php/tests/Testing/MockContextTest.php +184 -0
- package/dist/scaffold-repo/sdks/php/tests/Types/ExecutionResultTest.php +136 -0
- package/dist/scaffold-repo/sdks/php/tests/Validation/SchemaValidatorTest.php +191 -0
- package/dist/scaffold-repo/sdks/python3/Dockerfile +62 -0
- package/dist/scaffold-repo/sdks/python3/bin/serve.py +174 -0
- package/dist/scaffold-repo/sdks/python3/bin/worker.py +60 -0
- package/dist/scaffold-repo/sdks/python3/blok/__init__.py +61 -0
- package/dist/scaffold-repo/sdks/python3/blok/config/__init__.py +3 -0
- package/dist/scaffold-repo/sdks/python3/blok/config/server_config.py +116 -0
- package/dist/scaffold-repo/sdks/python3/blok/errors/__init__.py +50 -0
- package/dist/scaffold-repo/sdks/python3/blok/errors/blok_error.py +555 -0
- package/dist/scaffold-repo/sdks/python3/blok/errors/node_error.py +64 -0
- package/dist/scaffold-repo/sdks/python3/blok/logging/__init__.py +3 -0
- package/dist/scaffold-repo/sdks/python3/blok/logging/logger.py +82 -0
- package/dist/scaffold-repo/sdks/python3/blok/middleware/__init__.py +4 -0
- package/dist/scaffold-repo/sdks/python3/blok/middleware/logging_middleware.py +35 -0
- package/dist/scaffold-repo/sdks/python3/blok/middleware/recovery_middleware.py +36 -0
- package/dist/scaffold-repo/sdks/python3/blok/node/__init__.py +4 -0
- package/dist/scaffold-repo/sdks/python3/blok/node/define_node.py +239 -0
- package/dist/scaffold-repo/sdks/python3/blok/node/node_handler.py +35 -0
- package/dist/scaffold-repo/sdks/python3/blok/node/node_registry.py +136 -0
- package/dist/scaffold-repo/sdks/python3/blok/runtime/__init__.py +0 -0
- package/dist/scaffold-repo/sdks/python3/blok/runtime/v1/__init__.py +0 -0
- package/dist/scaffold-repo/sdks/python3/blok/runtime/v1/runtime_pb2.py +112 -0
- package/dist/scaffold-repo/sdks/python3/blok/runtime/v1/runtime_pb2_grpc.py +259 -0
- package/dist/scaffold-repo/sdks/python3/blok/server/__init__.py +3 -0
- package/dist/scaffold-repo/sdks/python3/blok/server/grpc_server.py +757 -0
- package/dist/scaffold-repo/sdks/python3/blok/server/runtime_server.py +165 -0
- package/dist/scaffold-repo/sdks/python3/blok/types/__init__.py +13 -0
- package/dist/scaffold-repo/sdks/python3/blok/types/context.py +162 -0
- package/dist/scaffold-repo/sdks/python3/blok/types/execution_request.py +74 -0
- package/dist/scaffold-repo/sdks/python3/blok/types/execution_result.py +103 -0
- package/dist/scaffold-repo/sdks/python3/blok/worker/__init__.py +10 -0
- package/dist/scaffold-repo/sdks/python3/blok/worker/job_message.py +34 -0
- package/dist/scaffold-repo/sdks/python3/blok/worker/worker.py +451 -0
- package/dist/scaffold-repo/sdks/python3/blok/worker/worker_config.py +129 -0
- package/dist/scaffold-repo/sdks/python3/examples/__init__.py +32 -0
- package/dist/scaffold-repo/sdks/python3/examples/api_call_node.py +85 -0
- package/dist/scaffold-repo/sdks/python3/examples/blok_error_demo_node.py +79 -0
- package/dist/scaffold-repo/sdks/python3/examples/chain_test_node.py +51 -0
- package/dist/scaffold-repo/sdks/python3/examples/hello_world_node.py +44 -0
- package/dist/scaffold-repo/sdks/python3/examples/transform_data_node.py +71 -0
- package/dist/scaffold-repo/sdks/python3/examples/typed_greet_node.py +25 -0
- package/dist/scaffold-repo/sdks/python3/proto/blok/runtime/v1/runtime.proto +302 -0
- package/dist/scaffold-repo/sdks/python3/pyproject.toml +47 -0
- package/dist/scaffold-repo/sdks/python3/requirements.txt +17 -0
- package/dist/scaffold-repo/sdks/python3/tests/__init__.py +0 -0
- package/dist/scaffold-repo/sdks/python3/tests/test_blok_error.py +341 -0
- package/dist/scaffold-repo/sdks/python3/tests/test_define_node.py +135 -0
- package/dist/scaffold-repo/sdks/python3/tests/test_discovery.py +99 -0
- package/dist/scaffold-repo/sdks/python3/tests/test_grpc_codec.py +260 -0
- package/dist/scaffold-repo/sdks/python3/tests/test_grpc_server.py +398 -0
- package/dist/scaffold-repo/sdks/ruby/Dockerfile +37 -0
- package/dist/scaffold-repo/sdks/ruby/Gemfile +5 -0
- package/dist/scaffold-repo/sdks/ruby/README.md +210 -0
- package/dist/scaffold-repo/sdks/ruby/Rakefile +11 -0
- package/dist/scaffold-repo/sdks/ruby/bin/serve.rb +105 -0
- package/dist/scaffold-repo/sdks/ruby/blok.gemspec +43 -0
- package/dist/scaffold-repo/sdks/ruby/config.ru +15 -0
- package/dist/scaffold-repo/sdks/ruby/examples/api_call_node.rb +99 -0
- package/dist/scaffold-repo/sdks/ruby/examples/blok_error_demo_node.rb +79 -0
- package/dist/scaffold-repo/sdks/ruby/examples/chain_test_node.rb +51 -0
- package/dist/scaffold-repo/sdks/ruby/examples/hello_world_node.rb +40 -0
- package/dist/scaffold-repo/sdks/ruby/examples/transform_data_node.rb +82 -0
- package/dist/scaffold-repo/sdks/ruby/examples/typed_greet_node.rb +25 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/config/server_config.rb +76 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/errors/blok_error.rb +476 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/errors/build_context_snapshot.rb +99 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/errors/error_category.rb +16 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/errors/node_error.rb +84 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/logging/log_entry.rb +46 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/logging/log_level.rb +49 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/logging/logger.rb +71 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/middleware/logging_middleware.rb +45 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/middleware/middleware.rb +36 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/middleware/recovery_middleware.rb +31 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/node/discovery.rb +59 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/node/node_handler.rb +43 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/node/node_registry.rb +107 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/node/typed_node.rb +180 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/runtime/v1/runtime_pb.rb +43 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/runtime/v1/runtime_services_pb.rb +55 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/server/grpc_server.rb +435 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/server/runtime_app.rb +86 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/testing/mock_context.rb +109 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/testing/test_runner.rb +40 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/types/context.rb +82 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/types/execution_metrics.rb +43 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/types/execution_request.rb +39 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/types/execution_result.rb +117 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/types/health_status.rb +42 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/types/node_config.rb +73 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/types/request.rb +71 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/types/response.rb +46 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/validation/schema_validator.rb +142 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok/version.rb +5 -0
- package/dist/scaffold-repo/sdks/ruby/lib/blok.rb +53 -0
- package/dist/scaffold-repo/sdks/ruby/proto/blok/runtime/v1/runtime.proto +302 -0
- package/dist/scaffold-repo/sdks/ruby/test/errors/blok_error_test.rb +339 -0
- package/dist/scaffold-repo/sdks/ruby/test/logging/logger_test.rb +155 -0
- package/dist/scaffold-repo/sdks/ruby/test/node/node_registry_test.rb +132 -0
- package/dist/scaffold-repo/sdks/ruby/test/node/typed_node_test.rb +67 -0
- package/dist/scaffold-repo/sdks/ruby/test/test_helper.rb +6 -0
- package/dist/scaffold-repo/sdks/ruby/test/testing/mock_context_test.rb +150 -0
- package/dist/scaffold-repo/sdks/ruby/test/types/execution_result_test.rb +129 -0
- package/dist/scaffold-repo/sdks/ruby/test/validation/schema_validator_test.rb +270 -0
- package/dist/scaffold-repo/sdks/rust/Cargo.lock +3044 -0
- package/dist/scaffold-repo/sdks/rust/Cargo.toml +82 -0
- package/dist/scaffold-repo/sdks/rust/Dockerfile +40 -0
- package/dist/scaffold-repo/sdks/rust/README.md +73 -0
- package/dist/scaffold-repo/sdks/rust/build.rs +32 -0
- package/dist/scaffold-repo/sdks/rust/proto/blok/runtime/v1/runtime.proto +302 -0
- package/dist/scaffold-repo/sdks/rust/src/blok_error.rs +1168 -0
- package/dist/scaffold-repo/sdks/rust/src/config.rs +158 -0
- package/dist/scaffold-repo/sdks/rust/src/errors.rs +142 -0
- package/dist/scaffold-repo/sdks/rust/src/grpc_server.rs +635 -0
- package/dist/scaffold-repo/sdks/rust/src/lib.rs +65 -0
- package/dist/scaffold-repo/sdks/rust/src/logging.rs +195 -0
- package/dist/scaffold-repo/sdks/rust/src/main.rs +79 -0
- package/dist/scaffold-repo/sdks/rust/src/middleware.rs +181 -0
- package/dist/scaffold-repo/sdks/rust/src/node.rs +172 -0
- package/dist/scaffold-repo/sdks/rust/src/nodes/api_call.rs +93 -0
- package/dist/scaffold-repo/sdks/rust/src/nodes/blok_error_demo.rs +151 -0
- package/dist/scaffold-repo/sdks/rust/src/nodes/chain_test.rs +57 -0
- package/dist/scaffold-repo/sdks/rust/src/nodes/hello_world.rs +83 -0
- package/dist/scaffold-repo/sdks/rust/src/nodes/mod.rs +18 -0
- package/dist/scaffold-repo/sdks/rust/src/nodes/transform_data.rs +142 -0
- package/dist/scaffold-repo/sdks/rust/src/nodes/typed_greet.rs +56 -0
- package/dist/scaffold-repo/sdks/rust/src/registry.rs +204 -0
- package/dist/scaffold-repo/sdks/rust/src/server.rs +63 -0
- package/dist/scaffold-repo/sdks/rust/src/testing.rs +175 -0
- package/dist/scaffold-repo/sdks/rust/src/types.rs +338 -0
- package/dist/scaffold-repo/sdks/rust/src/user_nodes/mod.rs +10 -0
- package/dist/scaffold-repo/sdks/rust/src/validation.rs +232 -0
- package/dist/scaffold-repo/sdks/rust/src/worker.rs +509 -0
- package/dist/scaffold-repo/sdks/rust/tests/grpc_integration.rs +306 -0
- package/dist/scaffold-repo/sdks/rust/tests/typed_node.rs +104 -0
- package/dist/scaffold-repo/triggers/cron/CHANGELOG.md +22 -0
- package/dist/scaffold-repo/triggers/cron/package.json +36 -0
- package/dist/scaffold-repo/triggers/cron/src/CronTrigger.ts +552 -0
- package/dist/scaffold-repo/triggers/cron/src/index.ts +77 -0
- package/dist/scaffold-repo/triggers/cron/tsconfig.json +32 -0
- package/dist/scaffold-repo/triggers/grpc/.env.example +8 -0
- package/dist/scaffold-repo/triggers/grpc/CHANGELOG.md +143 -0
- package/dist/scaffold-repo/triggers/grpc/README.md +25 -0
- package/dist/scaffold-repo/triggers/grpc/buf.gen.yaml +11 -0
- package/dist/scaffold-repo/triggers/grpc/buf.yaml +9 -0
- package/dist/scaffold-repo/triggers/grpc/localhost+2-key.pem +28 -0
- package/dist/scaffold-repo/triggers/grpc/localhost+2.pem +27 -0
- package/dist/scaffold-repo/triggers/grpc/package.json +61 -0
- package/dist/scaffold-repo/triggers/grpc/proto/workflow.proto +33 -0
- package/dist/scaffold-repo/triggers/grpc/src/GRpcTrigger.ts +297 -0
- package/dist/scaffold-repo/triggers/grpc/src/GrpcClient.ts +87 -0
- package/dist/scaffold-repo/triggers/grpc/src/GrpcServer.ts +68 -0
- package/dist/scaffold-repo/triggers/grpc/src/MessageDecode.ts +142 -0
- package/dist/scaffold-repo/triggers/grpc/src/NanoSDK.ts +146 -0
- package/dist/scaffold-repo/triggers/grpc/src/Nodes.ts +10 -0
- package/dist/scaffold-repo/triggers/grpc/src/Workflows.ts +5 -0
- package/dist/scaffold-repo/triggers/grpc/src/gen/workflow_pb.ts +142 -0
- package/dist/scaffold-repo/triggers/grpc/src/index.ts +22 -0
- package/dist/scaffold-repo/triggers/grpc/src/server.ts +8 -0
- package/dist/scaffold-repo/triggers/grpc/src/types/Message.ts +0 -0
- package/dist/scaffold-repo/triggers/grpc/src/types/RuntimeWorkflow.ts +7 -0
- package/dist/scaffold-repo/triggers/grpc/src/types/Workflows.ts +7 -0
- package/dist/scaffold-repo/triggers/grpc/tsconfig.json +34 -0
- package/dist/scaffold-repo/triggers/grpc/vitest.config.ts +29 -0
- package/dist/scaffold-repo/triggers/grpc/workflows/countries.json +27 -0
- package/dist/scaffold-repo/triggers/http/.blok/trace.db +0 -0
- package/dist/scaffold-repo/triggers/http/.blok/trace.db-shm +0 -0
- package/dist/scaffold-repo/triggers/http/.blok/trace.db-wal +0 -0
- package/dist/scaffold-repo/triggers/http/.dockerignore +23 -0
- package/dist/scaffold-repo/triggers/http/.env.example +8 -0
- package/dist/scaffold-repo/triggers/http/CHANGELOG.md +326 -0
- package/dist/scaffold-repo/triggers/http/Dockerfile +49 -0
- package/dist/scaffold-repo/triggers/http/Dockerfile.dev +34 -0
- package/dist/scaffold-repo/triggers/http/infra/docker-compose.yml +38 -0
- package/dist/scaffold-repo/triggers/http/notes/CLI_Commands/Authentication.md +74 -0
- package/dist/scaffold-repo/triggers/http/notes/CLI_Commands/Building.md +52 -0
- package/dist/scaffold-repo/triggers/http/notes/CLI_Commands/Create_Node.md +123 -0
- package/dist/scaffold-repo/triggers/http/notes/CLI_Commands/Create_Workflow.md +177 -0
- package/dist/scaffold-repo/triggers/http/notes/CLI_Commands/Deployment.md +69 -0
- package/dist/scaffold-repo/triggers/http/notes/Core_Concepts/Context.md +156 -0
- package/dist/scaffold-repo/triggers/http/notes/examples.md +104 -0
- package/dist/scaffold-repo/triggers/http/notes/index.md +51 -0
- package/dist/scaffold-repo/triggers/http/package.json +62 -0
- package/dist/scaffold-repo/triggers/http/public/favicon.ico +0 -0
- package/dist/scaffold-repo/triggers/http/public/metric/index.html +2101 -0
- package/dist/scaffold-repo/triggers/http/request.http +7 -0
- package/dist/scaffold-repo/triggers/http/src/AppRoutes.ts +64 -0
- package/dist/scaffold-repo/triggers/http/src/Nodes.ts +38 -0
- package/dist/scaffold-repo/triggers/http/src/Workflows.ts +18 -0
- package/dist/scaffold-repo/triggers/http/src/index.ts +86 -0
- package/dist/scaffold-repo/triggers/http/src/nodes/chain-init/index.ts +48 -0
- package/dist/scaffold-repo/triggers/http/src/nodes/chain-verify/index.ts +123 -0
- package/dist/scaffold-repo/triggers/http/src/nodes/eval/index.ts +69 -0
- package/dist/scaffold-repo/triggers/http/src/nodes/examples/README.md +14 -0
- package/dist/scaffold-repo/triggers/http/src/nodes/examples/chat-ui/index.html +228 -0
- package/dist/scaffold-repo/triggers/http/src/nodes/examples/chat-ui/index.ts +65 -0
- package/dist/scaffold-repo/triggers/http/src/nodes/examples/index.ts +14 -0
- package/dist/scaffold-repo/triggers/http/src/nodes/runtime-bridge/index.ts +84 -0
- package/dist/scaffold-repo/triggers/http/src/runner/HonoTraceRouterAdapter.ts +199 -0
- package/dist/scaffold-repo/triggers/http/src/runner/HttpTrigger.ts +2039 -0
- package/dist/scaffold-repo/triggers/http/src/runner/MessageDecode.ts +57 -0
- package/dist/scaffold-repo/triggers/http/src/runner/Util.ts +52 -0
- package/dist/scaffold-repo/triggers/http/src/runner/WorkflowRouter.ts +411 -0
- package/dist/scaffold-repo/triggers/http/src/runner/metrics/opentelemetry_metrics.ts +84 -0
- package/dist/scaffold-repo/triggers/http/src/runner/metrics/opentelemetry_traces.ts +30 -0
- package/dist/scaffold-repo/triggers/http/src/runner/nodeCatalog.ts +128 -0
- package/dist/scaffold-repo/triggers/http/src/runner/responseEmitter.ts +138 -0
- package/dist/scaffold-repo/triggers/http/src/runner/scanWorkflows.ts +201 -0
- package/dist/scaffold-repo/triggers/http/src/runner/types/ErrorResponse.ts +3 -0
- package/dist/scaffold-repo/triggers/http/src/runner/types/NodeTypes.ts +13 -0
- package/dist/scaffold-repo/triggers/http/src/runner/types/Nodes.ts +5 -0
- package/dist/scaffold-repo/triggers/http/src/runner/types/RuntimeWorkflow.ts +7 -0
- package/dist/scaffold-repo/triggers/http/src/runner/types/WorkflowRequest.ts +8 -0
- package/dist/scaffold-repo/triggers/http/src/runner/types/WorkflowResponse.ts +7 -0
- package/dist/scaffold-repo/triggers/http/src/runner/types/Workflows.ts +14 -0
- package/dist/scaffold-repo/triggers/http/src/workflows/countries-cats-helper.ts +30 -0
- package/dist/scaffold-repo/triggers/http/src/workflows/countries-handle-dsl.ts +25 -0
- package/dist/scaffold-repo/triggers/http/src/workflows/countries-helper.ts +18 -0
- package/dist/scaffold-repo/triggers/http/src/workflows/empty.ts +16 -0
- package/dist/scaffold-repo/triggers/http/src/workflows/eval/eval-retrieve.ts +23 -0
- package/dist/scaffold-repo/triggers/http/src/workflows/eval/eval-run.ts +39 -0
- package/dist/scaffold-repo/triggers/http/src/workflows/eval/foreign-auth.ts +24 -0
- package/dist/scaffold-repo/triggers/http/tsconfig.json +39 -0
- package/dist/scaffold-repo/triggers/http/vitest.config.ts +39 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/agent-message.json +87 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/agent-page.json +25 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/agent-stream.json +30 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/agent-tool-calculator.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/agent-tool-weather.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/chat-memory-message.json +54 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/chat-memory-page.json +25 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/chat-memory-stream.json +30 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/chat-message.json +25 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/chat-page.json +20 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/chat-stream.json +30 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/countries-py.json +27 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/countries-vs-facts.json +50 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/countries.json +27 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/cross-runtime-chain.json +89 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/dashboard-gen.json +34 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/db-manager.json +34 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/empty.json +13 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/fanout-enqueue.json +48 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/fanout-worker.json +41 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/feedback.json +34 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/films.json +27 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/image-capture.json +34 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/launches-by-year.json +27 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/loadtest.json +24 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/middleware/admin-only.json +31 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/middleware/auth-check.json +59 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/middleware/github-webhook-verify.json +34 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/middleware/jwt-auth.json +46 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/middleware/rate-limit.json +70 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/middleware/redis-rate-limit.json +71 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/mongodb.json +24 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/rentals-pdf.json +65 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-admin-delete-user.json +42 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-async-job-poller.json +45 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-csv-import.json +122 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-data-export.json +105 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-event-router.json +97 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-github-handler-issues.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-github-handler-pr.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-github-handler-push.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-github-webhook-router.json +88 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-hello-global-mw.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-hello-with-mw.json +23 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-jwt-protected.json +23 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-multi-tenant-router.json +90 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-nested-control-flow.json +207 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-order-fulfillment.json +211 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-parallel-foreach-with-wait.json +47 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-polling-with-backoff.json +55 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-protected.json +23 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-redis-protected.json +23 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-saga.json +122 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-tenant-acme.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-tenant-beta.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-tenant-gamma.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-travel-booking.json +200 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-user-signup-saga.json +186 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v05-webhook-fanout.json +49 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v06-reliability-showcase.json +80 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v07-sse-publish.json +24 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v07-sse-stream.json +26 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/v07-ws-echo.json +38 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/webhook-github-issues.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/webhook-github-pr.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/webhook-github-push.json +32 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/webhook-github.json +87 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/webhook-linear-comment.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/webhook-linear-issue.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/webhook-linear.json +74 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/webhook-stripe-customer-created.json +22 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/webhook-stripe-invoice-paid.json +32 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/webhook-stripe.json +24 -0
- package/dist/scaffold-repo/triggers/http/workflows/json/workflow-docs.json +34 -0
- package/dist/scaffold-repo/triggers/http/workflows/toml/countries.toml +21 -0
- package/dist/scaffold-repo/triggers/http/workflows/xml/countries.xml +23 -0
- package/dist/scaffold-repo/triggers/http/workflows/yaml/countries.yaml +19 -0
- package/dist/scaffold-repo/triggers/mcp/README.md +131 -0
- package/dist/scaffold-repo/triggers/mcp/package.json +39 -0
- package/dist/scaffold-repo/triggers/mcp/src/McpTrigger.ts +581 -0
- package/dist/scaffold-repo/triggers/mcp/src/index.ts +41 -0
- package/dist/scaffold-repo/triggers/mcp/tsconfig.json +32 -0
- package/dist/scaffold-repo/triggers/pubsub/CHANGELOG.md +22 -0
- package/dist/scaffold-repo/triggers/pubsub/package.json +66 -0
- package/dist/scaffold-repo/triggers/pubsub/src/PubSubTrigger.ts +424 -0
- package/dist/scaffold-repo/triggers/pubsub/src/adapters/AWSSNSAdapter.ts +352 -0
- package/dist/scaffold-repo/triggers/pubsub/src/adapters/AzureServiceBusAdapter.ts +303 -0
- package/dist/scaffold-repo/triggers/pubsub/src/adapters/GCPPubSubAdapter.ts +327 -0
- package/dist/scaffold-repo/triggers/pubsub/src/adapters/KafkaPubSubAdapter.ts +247 -0
- package/dist/scaffold-repo/triggers/pubsub/src/adapters/KafkaPubSubAdapter.ts.bak +251 -0
- package/dist/scaffold-repo/triggers/pubsub/src/adapters/NATSPubSubAdapter.ts +333 -0
- package/dist/scaffold-repo/triggers/pubsub/src/adapters/RedisStreamsPubSubAdapter.ts +256 -0
- package/dist/scaffold-repo/triggers/pubsub/src/adapters/factory.ts +88 -0
- package/dist/scaffold-repo/triggers/pubsub/src/index.ts +67 -0
- package/dist/scaffold-repo/triggers/pubsub/template/.env.example +8 -0
- package/dist/scaffold-repo/triggers/pubsub/template/package.json +45 -0
- package/dist/scaffold-repo/triggers/pubsub/template/src/Nodes.ts +20 -0
- package/dist/scaffold-repo/triggers/pubsub/template/src/Workflows.ts +8 -0
- package/dist/scaffold-repo/triggers/pubsub/template/src/index.ts +41 -0
- package/dist/scaffold-repo/triggers/pubsub/template/src/runner/PubSubServer.ts +39 -0
- package/dist/scaffold-repo/triggers/pubsub/template/src/runner/types/Workflows.ts +7 -0
- package/dist/scaffold-repo/triggers/pubsub/template/src/workflows/messages/on-message.ts +42 -0
- package/dist/scaffold-repo/triggers/pubsub/template/src/workflows/publish-order.ts +22 -0
- package/dist/scaffold-repo/triggers/pubsub/template/tsconfig.json +31 -0
- package/dist/scaffold-repo/triggers/pubsub/template/vitest.config.ts +39 -0
- package/dist/scaffold-repo/triggers/pubsub/tsconfig.json +32 -0
- package/dist/scaffold-repo/triggers/sse/.env.example +8 -0
- package/dist/scaffold-repo/triggers/sse/CHANGELOG.md +12 -0
- package/dist/scaffold-repo/triggers/sse/Dockerfile +47 -0
- package/dist/scaffold-repo/triggers/sse/Dockerfile.dev +33 -0
- package/dist/scaffold-repo/triggers/sse/package.json +37 -0
- package/dist/scaffold-repo/triggers/sse/src/SSETrigger.ts +489 -0
- package/dist/scaffold-repo/triggers/sse/src/bus.ts +208 -0
- package/dist/scaffold-repo/triggers/sse/src/index.ts +38 -0
- package/dist/scaffold-repo/triggers/sse/src/workflows/events/README.md +129 -0
- package/dist/scaffold-repo/triggers/sse/src/workflows/events/publish-demo.ts +40 -0
- package/dist/scaffold-repo/triggers/sse/src/workflows/events/stream-demo.ts +43 -0
- package/dist/scaffold-repo/triggers/sse/tsconfig.json +22 -0
- package/dist/scaffold-repo/triggers/sse/vitest.config.ts +39 -0
- package/dist/scaffold-repo/triggers/webhook/CHANGELOG.md +22 -0
- package/dist/scaffold-repo/triggers/webhook/package.json +36 -0
- package/dist/scaffold-repo/triggers/webhook/src/WebhookTrigger.ts +465 -0
- package/dist/scaffold-repo/triggers/webhook/src/index.ts +51 -0
- package/dist/scaffold-repo/triggers/webhook/src/verifiers.ts +394 -0
- package/dist/scaffold-repo/triggers/webhook/tsconfig.json +32 -0
- package/dist/scaffold-repo/triggers/websocket/.env.example +8 -0
- package/dist/scaffold-repo/triggers/websocket/CHANGELOG.md +22 -0
- package/dist/scaffold-repo/triggers/websocket/package.json +50 -0
- package/dist/scaffold-repo/triggers/websocket/src/Backplane.ts +167 -0
- package/dist/scaffold-repo/triggers/websocket/src/WebSocketTrigger.ts +910 -0
- package/dist/scaffold-repo/triggers/websocket/src/index.ts +50 -0
- package/dist/scaffold-repo/triggers/websocket/src/workflows/events/README.md +93 -0
- package/dist/scaffold-repo/triggers/websocket/src/workflows/events/echo-demo.ts +56 -0
- package/dist/scaffold-repo/triggers/websocket/tsconfig.json +22 -0
- package/dist/scaffold-repo/triggers/websocket/vitest.config.ts +39 -0
- package/dist/scaffold-repo/triggers/worker/CHANGELOG.md +22 -0
- package/dist/scaffold-repo/triggers/worker/package.json +68 -0
- package/dist/scaffold-repo/triggers/worker/src/WorkerTrigger.ts +943 -0
- package/dist/scaffold-repo/triggers/worker/src/adapters/BullMQAdapter.ts +296 -0
- package/dist/scaffold-repo/triggers/worker/src/adapters/InMemoryAdapter.ts +280 -0
- package/dist/scaffold-repo/triggers/worker/src/adapters/KafkaAdapter.ts +347 -0
- package/dist/scaffold-repo/triggers/worker/src/adapters/NATSAdapter.ts +505 -0
- package/dist/scaffold-repo/triggers/worker/src/adapters/PgBossAdapter.ts +319 -0
- package/dist/scaffold-repo/triggers/worker/src/adapters/RabbitMQAdapter.ts +318 -0
- package/dist/scaffold-repo/triggers/worker/src/adapters/RedisStreamsAdapter.ts +513 -0
- package/dist/scaffold-repo/triggers/worker/src/adapters/SQSAdapter.ts +314 -0
- package/dist/scaffold-repo/triggers/worker/src/adapters/factory.ts +111 -0
- package/dist/scaffold-repo/triggers/worker/src/index.ts +95 -0
- package/dist/scaffold-repo/triggers/worker/template/.env.example +18 -0
- package/dist/scaffold-repo/triggers/worker/template/package.json +46 -0
- package/dist/scaffold-repo/triggers/worker/template/src/Nodes.ts +20 -0
- package/dist/scaffold-repo/triggers/worker/template/src/Workflows.ts +8 -0
- package/dist/scaffold-repo/triggers/worker/template/src/index.ts +41 -0
- package/dist/scaffold-repo/triggers/worker/template/src/runner/WorkerServer.ts +34 -0
- package/dist/scaffold-repo/triggers/worker/template/src/runner/types/Workflows.ts +7 -0
- package/dist/scaffold-repo/triggers/worker/template/src/workflows/jobs/process-job.ts +40 -0
- package/dist/scaffold-repo/triggers/worker/template/tsconfig.json +31 -0
- package/dist/scaffold-repo/triggers/worker/template/vitest.config.ts +39 -0
- package/dist/scaffold-repo/triggers/worker/tsconfig.json +32 -0
- package/dist/scaffold-repo/workflows/json/agent-message.json +87 -0
- package/dist/scaffold-repo/workflows/json/agent-page.json +25 -0
- package/dist/scaffold-repo/workflows/json/agent-stream.json +30 -0
- package/dist/scaffold-repo/workflows/json/agent-tool-calculator.json +22 -0
- package/dist/scaffold-repo/workflows/json/agent-tool-weather.json +22 -0
- package/dist/scaffold-repo/workflows/json/chat-memory-message.json +54 -0
- package/dist/scaffold-repo/workflows/json/chat-memory-page.json +25 -0
- package/dist/scaffold-repo/workflows/json/chat-memory-stream.json +30 -0
- package/dist/scaffold-repo/workflows/json/chat-message.json +25 -0
- package/dist/scaffold-repo/workflows/json/chat-page.json +20 -0
- package/dist/scaffold-repo/workflows/json/chat-stream.json +30 -0
- package/dist/scaffold-repo/workflows/json/countries-vs-facts.json +50 -0
- package/dist/scaffold-repo/workflows/json/countries.json +27 -0
- package/dist/scaffold-repo/workflows/json/cron-heartbeat.json +15 -0
- package/dist/scaffold-repo/workflows/json/fanout-enqueue.json +48 -0
- package/dist/scaffold-repo/workflows/json/fanout-worker.json +41 -0
- package/dist/scaffold-repo/workflows/json/pubsub-on-order.json +24 -0
- package/dist/scaffold-repo/workflows/json/webhook-github-issues.json +22 -0
- package/dist/scaffold-repo/workflows/json/webhook-github-pr.json +22 -0
- package/dist/scaffold-repo/workflows/json/webhook-github-push.json +32 -0
- package/dist/scaffold-repo/workflows/json/webhook-github.json +87 -0
- package/dist/scaffold-repo/workflows/json/webhook-linear-comment.json +22 -0
- package/dist/scaffold-repo/workflows/json/webhook-linear-issue.json +22 -0
- package/dist/scaffold-repo/workflows/json/webhook-linear.json +74 -0
- package/dist/scaffold-repo/workflows/json/webhook-stripe-customer-created.json +22 -0
- package/dist/scaffold-repo/workflows/json/webhook-stripe-invoice-paid.json +32 -0
- package/dist/scaffold-repo/workflows/json/webhook-stripe.json +24 -0
- package/package.json +4 -4
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
2
|
+
|
|
3
|
+
<PropertyGroup>
|
|
4
|
+
<TargetFramework>net10.0</TargetFramework>
|
|
5
|
+
<Nullable>enable</Nullable>
|
|
6
|
+
<ImplicitUsings>enable</ImplicitUsings>
|
|
7
|
+
<RootNamespace>Blok.Core</RootNamespace>
|
|
8
|
+
<AssemblyName>Blok.Core</AssemblyName>
|
|
9
|
+
|
|
10
|
+
<!-- NuGet Package Metadata -->
|
|
11
|
+
<PackageId>Blok.Core</PackageId>
|
|
12
|
+
<Version>1.0.0</Version>
|
|
13
|
+
<Authors>Blok</Authors>
|
|
14
|
+
<Description>C# SDK for the Blok blok framework. Build workflow nodes as Docker containers with HTTP and/or gRPC transports.</Description>
|
|
15
|
+
<PackageTags>blok;blok;workflow;microservice;docker;grpc</PackageTags>
|
|
16
|
+
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
|
17
|
+
<RepositoryUrl>https://github.com/deskree/blok</RepositoryUrl>
|
|
18
|
+
<RepositoryType>git</RepositoryType>
|
|
19
|
+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
|
20
|
+
<IsPackable>true</IsPackable>
|
|
21
|
+
</PropertyGroup>
|
|
22
|
+
|
|
23
|
+
<!-- gRPC server stack. Generates server stubs from `runtime.proto` at build
|
|
24
|
+
time via `Grpc.Tools` (no external protoc required). -->
|
|
25
|
+
<ItemGroup>
|
|
26
|
+
<PackageReference Include="Grpc.AspNetCore" Version="2.66.0" />
|
|
27
|
+
<PackageReference Include="Google.Protobuf" Version="3.28.3" />
|
|
28
|
+
<PackageReference Include="Grpc.Tools" Version="2.67.0">
|
|
29
|
+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
30
|
+
<PrivateAssets>all</PrivateAssets>
|
|
31
|
+
</PackageReference>
|
|
32
|
+
<PackageReference Include="NJsonSchema" Version="11.6.1" />
|
|
33
|
+
</ItemGroup>
|
|
34
|
+
|
|
35
|
+
<ItemGroup>
|
|
36
|
+
<Protobuf Include="..\..\proto\blok\runtime\v1\runtime.proto" GrpcServices="Server" ProtoRoot="..\..\proto" />
|
|
37
|
+
</ItemGroup>
|
|
38
|
+
|
|
39
|
+
</Project>
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
using Blok.Core.Logging;
|
|
2
|
+
|
|
3
|
+
namespace Blok.Core.Config;
|
|
4
|
+
|
|
5
|
+
/// <summary>Selects which server(s) to start.</summary>
|
|
6
|
+
public enum Transport
|
|
7
|
+
{
|
|
8
|
+
/// <summary>HTTP only (default; preserves existing behavior).</summary>
|
|
9
|
+
Http,
|
|
10
|
+
/// <summary>gRPC only on <see cref="ServerConfig.GrpcPort" />.</summary>
|
|
11
|
+
Grpc,
|
|
12
|
+
/// <summary>HTTP and gRPC concurrently — used during migration.</summary>
|
|
13
|
+
Both,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/// <summary>
|
|
17
|
+
/// Server configuration loaded from environment variables.
|
|
18
|
+
/// </summary>
|
|
19
|
+
public class ServerConfig
|
|
20
|
+
{
|
|
21
|
+
/// <summary>HTTP port to listen on. Default: 9004 (matches the runner's
|
|
22
|
+
/// <c>DEFAULT_PORTS.csharp</c>).</summary>
|
|
23
|
+
public int Port { get; set; } = 9004;
|
|
24
|
+
|
|
25
|
+
/// <summary>Host address to bind to. Default: 0.0.0.0.</summary>
|
|
26
|
+
public string Host { get; set; } = "0.0.0.0";
|
|
27
|
+
|
|
28
|
+
/// <summary>Runtime version string. Default: 1.0.0.</summary>
|
|
29
|
+
public string Version { get; set; } = "1.0.0";
|
|
30
|
+
|
|
31
|
+
/// <summary>gRPC port to listen on. Default: 10004 (matches the runner's
|
|
32
|
+
/// <c>DEFAULT_GRPC_PORTS.csharp = HTTP+1000</c>).</summary>
|
|
33
|
+
public int GrpcPort { get; set; } = 10004;
|
|
34
|
+
|
|
35
|
+
/// <summary>Selects which server(s) to start. Default: <see cref="Transport.Http" />.</summary>
|
|
36
|
+
public Transport Transport { get; set; } = Transport.Http;
|
|
37
|
+
|
|
38
|
+
/// <summary>Minimum log level. Default: Info.</summary>
|
|
39
|
+
public Logging.LogLevel LogLevel { get; set; } = Logging.LogLevel.Info;
|
|
40
|
+
|
|
41
|
+
/// <summary>Whether to enable CORS. Default: false.</summary>
|
|
42
|
+
public bool EnableCors { get; set; } = false;
|
|
43
|
+
|
|
44
|
+
/// <summary>
|
|
45
|
+
/// Load configuration from environment variables with defaults.
|
|
46
|
+
/// - PORT (default: 9004)
|
|
47
|
+
/// - HOST (default: 0.0.0.0)
|
|
48
|
+
/// - VERSION (default: 1.0.0)
|
|
49
|
+
/// - GRPC_PORT (default: 10004)
|
|
50
|
+
/// - BLOK_TRANSPORT: "http" | "grpc" | "both" (default: "http")
|
|
51
|
+
/// - LOG_LEVEL (default: INFO)
|
|
52
|
+
/// - ENABLE_CORS (default: false)
|
|
53
|
+
/// </summary>
|
|
54
|
+
public static ServerConfig FromEnv()
|
|
55
|
+
{
|
|
56
|
+
return new ServerConfig
|
|
57
|
+
{
|
|
58
|
+
Port = int.TryParse(Environment.GetEnvironmentVariable("PORT"), out var port) ? port : 9004,
|
|
59
|
+
Host = Environment.GetEnvironmentVariable("HOST") ?? "0.0.0.0",
|
|
60
|
+
Version = Environment.GetEnvironmentVariable("VERSION") ?? "1.0.0",
|
|
61
|
+
GrpcPort = int.TryParse(Environment.GetEnvironmentVariable("GRPC_PORT"), out var grpcPort) ? grpcPort : 10004,
|
|
62
|
+
Transport = ParseTransport(Environment.GetEnvironmentVariable("BLOK_TRANSPORT")),
|
|
63
|
+
LogLevel = ParseLogLevel(Environment.GetEnvironmentVariable("LOG_LEVEL")),
|
|
64
|
+
EnableCors = bool.TryParse(Environment.GetEnvironmentVariable("ENABLE_CORS"), out var cors) && cors
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private static Transport ParseTransport(string? value) => value?.ToLowerInvariant() switch
|
|
69
|
+
{
|
|
70
|
+
"grpc" => Transport.Grpc,
|
|
71
|
+
"both" => Transport.Both,
|
|
72
|
+
_ => Transport.Http,
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/// <summary>
|
|
76
|
+
/// Return the bind address as "host:port".
|
|
77
|
+
/// </summary>
|
|
78
|
+
public string Address() => $"{Host}:{Port}";
|
|
79
|
+
|
|
80
|
+
private static Logging.LogLevel ParseLogLevel(string? level)
|
|
81
|
+
{
|
|
82
|
+
return level?.ToUpperInvariant() switch
|
|
83
|
+
{
|
|
84
|
+
"DEBUG" => Logging.LogLevel.Debug,
|
|
85
|
+
"WARN" => Logging.LogLevel.Warn,
|
|
86
|
+
"ERROR" => Logging.LogLevel.Error,
|
|
87
|
+
_ => Logging.LogLevel.Info
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
using System.Text.Json;
|
|
2
|
+
|
|
3
|
+
namespace Blok.Core.Errors;
|
|
4
|
+
|
|
5
|
+
/// <summary>
|
|
6
|
+
/// Structured <c>BlokError</c> per master plan §17 — the canonical error
|
|
7
|
+
/// contract every Blok node SDK populates the same way.
|
|
8
|
+
///
|
|
9
|
+
/// <para>Mirrors the TypeScript <c>BlokError</c>, Python <c>BlokError</c>, Go
|
|
10
|
+
/// <c>*BlokError</c>, Rust <c>BlokError</c>, and Java <c>BlokError</c>, so
|
|
11
|
+
/// node authors writing in any language see the same field shape.</para>
|
|
12
|
+
///
|
|
13
|
+
/// <para>Idiomatic usage (master plan §17.5 builder pattern):</para>
|
|
14
|
+
/// <code>
|
|
15
|
+
/// throw BlokError.Dependency()
|
|
16
|
+
/// .Code("POSTGRES_CONNECT_TIMEOUT")
|
|
17
|
+
/// .Message("Could not connect to Postgres within 5s")
|
|
18
|
+
/// .Description($"Tried host={host} port={port}; timeout={dur}ms")
|
|
19
|
+
/// .Remediation("Check DATABASE_URL env var and network reachability")
|
|
20
|
+
/// .Cause(ex)
|
|
21
|
+
/// .Retryable(true)
|
|
22
|
+
/// .RetryAfter(TimeSpan.FromSeconds(5))
|
|
23
|
+
/// .Details(new Dictionary<string, object?> { ["host"] = host, ["port"] = port })
|
|
24
|
+
/// .Build();
|
|
25
|
+
/// </code>
|
|
26
|
+
///
|
|
27
|
+
/// <para>Extends <see cref="Exception"/> so handlers can <c>throw</c> it
|
|
28
|
+
/// directly. The legacy <see cref="NodeException"/> (5 categories) stays
|
|
29
|
+
/// available for back-compat. New code should prefer <c>BlokError</c>.</para>
|
|
30
|
+
/// </summary>
|
|
31
|
+
public sealed class BlokError : Exception
|
|
32
|
+
{
|
|
33
|
+
/// <summary>SDK identifier reported on auto-enriched errors.</summary>
|
|
34
|
+
public const string DefaultSdkName = "blok-csharp";
|
|
35
|
+
|
|
36
|
+
/// <summary>Runtime kind reported on auto-enriched errors.</summary>
|
|
37
|
+
public const string DefaultRuntimeKind = "runtime.csharp";
|
|
38
|
+
|
|
39
|
+
/// <summary>Default cap on serialized <c>context_snapshot</c> size in bytes.</summary>
|
|
40
|
+
public const int ContextSnapshotMaxBytes = 4096;
|
|
41
|
+
|
|
42
|
+
public BlokErrorCategory Category { get; }
|
|
43
|
+
public BlokErrorSeverity Severity { get; internal set; }
|
|
44
|
+
public string Code { get; }
|
|
45
|
+
public string Description { get; }
|
|
46
|
+
public string Remediation { get; }
|
|
47
|
+
public string DocUrl { get; }
|
|
48
|
+
public int HttpStatus { get; internal set; }
|
|
49
|
+
public bool Retryable { get; internal set; }
|
|
50
|
+
public long RetryAfterMs { get; }
|
|
51
|
+
public object? Details { get; }
|
|
52
|
+
public object? ContextSnapshot { get; }
|
|
53
|
+
public IReadOnlyList<Dictionary<string, object?>> Causes { get; }
|
|
54
|
+
public string Stack { get; }
|
|
55
|
+
public DateTime At { get; }
|
|
56
|
+
|
|
57
|
+
// Origin — auto-enriched by the gRPC servicer when not set by the handler.
|
|
58
|
+
public string Node { get; internal set; }
|
|
59
|
+
public string Sdk { get; internal set; }
|
|
60
|
+
public string SdkVersion { get; internal set; }
|
|
61
|
+
public string RuntimeKind { get; internal set; }
|
|
62
|
+
|
|
63
|
+
private BlokError(Builder b)
|
|
64
|
+
: base(b.MessageValue ?? string.Empty, b.CauseValue)
|
|
65
|
+
{
|
|
66
|
+
Category = b.CategoryValue;
|
|
67
|
+
Severity = b.SeverityValue;
|
|
68
|
+
Code = b.CodeValue ?? string.Empty;
|
|
69
|
+
Description = b.DescriptionValue ?? string.Empty;
|
|
70
|
+
Remediation = b.RemediationValue ?? string.Empty;
|
|
71
|
+
DocUrl = b.DocUrlValue ?? string.Empty;
|
|
72
|
+
HttpStatus = b.HttpStatusValue;
|
|
73
|
+
Retryable = b.RetryableValue;
|
|
74
|
+
RetryAfterMs = b.RetryAfterMsValue;
|
|
75
|
+
Details = b.DetailsValue;
|
|
76
|
+
ContextSnapshot = b.ContextSnapshotValue;
|
|
77
|
+
Stack = b.StackValue ?? (b.CauseValue?.StackTrace ?? string.Empty);
|
|
78
|
+
At = b.AtValue ?? DateTime.UtcNow;
|
|
79
|
+
Node = b.NodeValue ?? string.Empty;
|
|
80
|
+
Sdk = b.SdkValue ?? string.Empty;
|
|
81
|
+
SdkVersion = b.SdkVersionValue ?? string.Empty;
|
|
82
|
+
RuntimeKind = b.RuntimeKindValue ?? string.Empty;
|
|
83
|
+
if (b.CausesValue is not null)
|
|
84
|
+
{
|
|
85
|
+
Causes = b.CausesValue;
|
|
86
|
+
}
|
|
87
|
+
else if (b.CauseValue is not null)
|
|
88
|
+
{
|
|
89
|
+
Causes = FlattenCauses(b.CauseValue);
|
|
90
|
+
}
|
|
91
|
+
else
|
|
92
|
+
{
|
|
93
|
+
Causes = Array.Empty<Dictionary<string, object?>>();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public override string ToString() => $"[{Category.AsWire()}] {Message}";
|
|
98
|
+
|
|
99
|
+
// =========================================================================
|
|
100
|
+
// Static factory shortcuts — one per category
|
|
101
|
+
// =========================================================================
|
|
102
|
+
|
|
103
|
+
/// <summary>Builder for a <c>VALIDATION</c> error (default 400, non-retryable).</summary>
|
|
104
|
+
public static Builder Validation() => new(BlokErrorCategory.Validation);
|
|
105
|
+
/// <summary>Builder for a <c>CONFIGURATION</c> error (default 500, non-retryable).</summary>
|
|
106
|
+
public static Builder Configuration() => new(BlokErrorCategory.Configuration);
|
|
107
|
+
/// <summary>Builder for a <c>DEPENDENCY</c> error (default 502, retryable).</summary>
|
|
108
|
+
public static Builder Dependency() => new(BlokErrorCategory.Dependency);
|
|
109
|
+
/// <summary>Builder for a <c>TIMEOUT</c> error (default 504, retryable).</summary>
|
|
110
|
+
public static Builder Timeout() => new(BlokErrorCategory.Timeout);
|
|
111
|
+
/// <summary>Builder for a <c>PERMISSION</c> error (default 403, non-retryable).</summary>
|
|
112
|
+
public static Builder Permission() => new(BlokErrorCategory.Permission);
|
|
113
|
+
/// <summary>Builder for a <c>RATE_LIMIT</c> error (default 429, retryable).</summary>
|
|
114
|
+
public static Builder RateLimit() => new(BlokErrorCategory.RateLimit);
|
|
115
|
+
/// <summary>Builder for a <c>NOT_FOUND</c> error (default 404, non-retryable).</summary>
|
|
116
|
+
public static Builder NotFound() => new(BlokErrorCategory.NotFound);
|
|
117
|
+
/// <summary>Builder for a <c>CONFLICT</c> error (default 409, non-retryable).</summary>
|
|
118
|
+
public static Builder Conflict() => new(BlokErrorCategory.Conflict);
|
|
119
|
+
/// <summary>Builder for a <c>CANCELLED</c> error (default 499, non-retryable).</summary>
|
|
120
|
+
public static Builder Cancelled() => new(BlokErrorCategory.Cancelled);
|
|
121
|
+
/// <summary>Builder for an <c>INTERNAL</c> error (default 500, non-retryable).</summary>
|
|
122
|
+
public static Builder Internal() => new(BlokErrorCategory.Internal);
|
|
123
|
+
/// <summary>Builder for a <c>PROTOCOL</c> error (default 502, non-retryable).</summary>
|
|
124
|
+
public static Builder Protocol() => new(BlokErrorCategory.Protocol);
|
|
125
|
+
/// <summary>Builder for a <c>DATA</c> error (default 422, non-retryable).</summary>
|
|
126
|
+
/// <remarks>The <c>new</c> modifier hides <see cref="Exception.Data"/> (the
|
|
127
|
+
/// dictionary inherited from <c>Exception</c>) at the type level. Callers
|
|
128
|
+
/// reaching for the dictionary must access it via the base type.</remarks>
|
|
129
|
+
public static new Builder Data() => new(BlokErrorCategory.Data);
|
|
130
|
+
|
|
131
|
+
/// <summary>Generic factory if the category isn't known at compile time.</summary>
|
|
132
|
+
public static Builder Of(BlokErrorCategory category) => new(category);
|
|
133
|
+
|
|
134
|
+
// =========================================================================
|
|
135
|
+
// Conversion — FromUnknown, ToMap, FromMap
|
|
136
|
+
// =========================================================================
|
|
137
|
+
|
|
138
|
+
/// <summary>
|
|
139
|
+
/// Wrap any value as a <c>BlokError</c>. Used by the runner's auto-wrap
|
|
140
|
+
/// layer so legacy <c>throw new InvalidOperationException(...)</c> still
|
|
141
|
+
/// produces a structured error.
|
|
142
|
+
///
|
|
143
|
+
/// <para>Categorization heuristic:</para>
|
|
144
|
+
/// <list type="bullet">
|
|
145
|
+
/// <item><c>BlokError</c> — passthrough; missing origin fields filled in.</item>
|
|
146
|
+
/// <item><c>NodeException</c> (legacy) — preserves message/details/cause; category=INTERNAL.</item>
|
|
147
|
+
/// <item><c>Exception</c> — wraps as INTERNAL with <c>code=UNCAUGHT_<TYPE></c>.</item>
|
|
148
|
+
/// <item><c>IDictionary</c> — extracts <c>"message"</c> key, full payload in details.</item>
|
|
149
|
+
/// <item><c>string</c> — becomes the message.</item>
|
|
150
|
+
/// <item><c>null</c> — placeholder <c>"node error"</c>.</item>
|
|
151
|
+
/// </list>
|
|
152
|
+
/// </summary>
|
|
153
|
+
public static BlokError FromUnknown(object? value, BlokErrorOrigin origin)
|
|
154
|
+
{
|
|
155
|
+
if (value is BlokError be)
|
|
156
|
+
{
|
|
157
|
+
be.ApplyOriginIfMissing(origin);
|
|
158
|
+
return be;
|
|
159
|
+
}
|
|
160
|
+
if (value is NodeException ne)
|
|
161
|
+
{
|
|
162
|
+
var details = new Dictionary<string, object?>
|
|
163
|
+
{
|
|
164
|
+
["message"] = ne.Message,
|
|
165
|
+
["code"] = ne.Code,
|
|
166
|
+
["category"] = ne.Category.ToString(),
|
|
167
|
+
["details"] = ne.Details,
|
|
168
|
+
};
|
|
169
|
+
return Internal()
|
|
170
|
+
.Code("UNCAUGHT_NODEEXCEPTION")
|
|
171
|
+
.Message(ne.Message)
|
|
172
|
+
.Cause(ne)
|
|
173
|
+
.Details(details)
|
|
174
|
+
.ApplyOrigin(origin)
|
|
175
|
+
.Build();
|
|
176
|
+
}
|
|
177
|
+
if (value is Exception ex)
|
|
178
|
+
{
|
|
179
|
+
var msg = string.IsNullOrEmpty(ex.Message) ? "Uncaught error" : ex.Message;
|
|
180
|
+
return Internal()
|
|
181
|
+
.Code(UncaughtCode(ex.GetType()))
|
|
182
|
+
.Message(msg)
|
|
183
|
+
.Cause(ex)
|
|
184
|
+
.ApplyOrigin(origin)
|
|
185
|
+
.Build();
|
|
186
|
+
}
|
|
187
|
+
if (value is null)
|
|
188
|
+
{
|
|
189
|
+
return Internal()
|
|
190
|
+
.Code("UNCAUGHT_ERROR")
|
|
191
|
+
.Message("node error")
|
|
192
|
+
.ApplyOrigin(origin)
|
|
193
|
+
.Build();
|
|
194
|
+
}
|
|
195
|
+
if (value is string s)
|
|
196
|
+
{
|
|
197
|
+
return Internal()
|
|
198
|
+
.Code("UNCAUGHT_ERROR")
|
|
199
|
+
.Message(s)
|
|
200
|
+
.Details(new Dictionary<string, object?> { ["message"] = s })
|
|
201
|
+
.ApplyOrigin(origin)
|
|
202
|
+
.Build();
|
|
203
|
+
}
|
|
204
|
+
if (value is System.Collections.IDictionary dict)
|
|
205
|
+
{
|
|
206
|
+
var typed = AsStringKeyMap(dict);
|
|
207
|
+
var message = typed.TryGetValue("message", out var m) && m is string ms && !string.IsNullOrEmpty(ms)
|
|
208
|
+
? ms
|
|
209
|
+
: "node error";
|
|
210
|
+
return Internal()
|
|
211
|
+
.Code("UNCAUGHT_ERROR")
|
|
212
|
+
.Message(message)
|
|
213
|
+
.Details(typed)
|
|
214
|
+
.ApplyOrigin(origin)
|
|
215
|
+
.Build();
|
|
216
|
+
}
|
|
217
|
+
var repr = value.ToString() ?? "node error";
|
|
218
|
+
return Internal()
|
|
219
|
+
.Code("UNCAUGHT_ERROR")
|
|
220
|
+
.Message(repr)
|
|
221
|
+
.Details(new Dictionary<string, object?> { ["message"] = repr })
|
|
222
|
+
.ApplyOrigin(origin)
|
|
223
|
+
.Build();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/// <summary>
|
|
227
|
+
/// Lossless serialization to a map matching the proto wire shape
|
|
228
|
+
/// (snake_case keys). Inverse of <see cref="FromMap"/>.
|
|
229
|
+
/// </summary>
|
|
230
|
+
public Dictionary<string, object?> ToMap() => new()
|
|
231
|
+
{
|
|
232
|
+
["code"] = Code,
|
|
233
|
+
["category"] = Category.AsWire(),
|
|
234
|
+
["severity"] = Severity.AsWire(),
|
|
235
|
+
["node"] = Node,
|
|
236
|
+
["sdk"] = Sdk,
|
|
237
|
+
["sdk_version"] = SdkVersion,
|
|
238
|
+
["runtime_kind"] = RuntimeKind,
|
|
239
|
+
["at"] = At.ToString("o"),
|
|
240
|
+
["message"] = Message,
|
|
241
|
+
["description"] = Description,
|
|
242
|
+
["remediation"] = Remediation,
|
|
243
|
+
["doc_url"] = DocUrl,
|
|
244
|
+
["causes"] = Causes.Select(c => new Dictionary<string, object?>(c)).ToList(),
|
|
245
|
+
["stack"] = Stack,
|
|
246
|
+
["context_snapshot"] = ContextSnapshot,
|
|
247
|
+
["http_status"] = HttpStatus,
|
|
248
|
+
["retryable"] = Retryable,
|
|
249
|
+
["retry_after_ms"] = RetryAfterMs,
|
|
250
|
+
["details"] = Details,
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
/// <summary>
|
|
254
|
+
/// Reconstruct a <c>BlokError</c> from a JSON-decoded map. Tolerates both
|
|
255
|
+
/// <c>snake_case</c> (C#/Java/Python/Go convention) and <c>camelCase</c>
|
|
256
|
+
/// (TS payload shape) keys for cross-language fixture compatibility.
|
|
257
|
+
/// </summary>
|
|
258
|
+
public static BlokError FromMap(IDictionary<string, object?> m)
|
|
259
|
+
{
|
|
260
|
+
var category = BlokErrorCategoryExtensions.Parse(PickFirst(m, "category") as string);
|
|
261
|
+
var severity = BlokErrorSeverityExtensions.Parse(PickFirst(m, "severity") as string);
|
|
262
|
+
var b = new Builder(category).Severity(severity);
|
|
263
|
+
if (PickFirst(m, "code") is string code) b.Code(code);
|
|
264
|
+
if (PickFirst(m, "message") is string message) b.Message(message);
|
|
265
|
+
if (PickFirst(m, "description") is string description) b.Description(description);
|
|
266
|
+
if (PickFirst(m, "remediation") is string remediation) b.Remediation(remediation);
|
|
267
|
+
if (PickFirst(m, "doc_url", "docUrl") is string docUrl) b.DocUrl(docUrl);
|
|
268
|
+
if (TryGetInt(m, out var http, "http_status", "httpStatus")) b.HttpStatus(http);
|
|
269
|
+
if (PickFirst(m, "retryable") is bool retry) b.Retryable(retry);
|
|
270
|
+
if (TryGetLong(m, out var retryAfter, "retry_after_ms", "retryAfterMs")) b.RetryAfterMs(retryAfter);
|
|
271
|
+
if (m.TryGetValue("details", out var details)) b.Details(details);
|
|
272
|
+
var snapshot = PickFirst(m, "context_snapshot", "contextSnapshot");
|
|
273
|
+
if (snapshot is not null) b.ContextSnapshot(snapshot);
|
|
274
|
+
if (PickFirst(m, "node") is string node) b.Node(node);
|
|
275
|
+
if (PickFirst(m, "sdk") is string sdk) b.Sdk(sdk);
|
|
276
|
+
if (PickFirst(m, "sdk_version", "sdkVersion") is string sdkVersion) b.SdkVersion(sdkVersion);
|
|
277
|
+
if (PickFirst(m, "runtime_kind", "runtimeKind") is string runtimeKind) b.RuntimeKind(runtimeKind);
|
|
278
|
+
if (PickFirst(m, "stack") is string stack) b.Stack(stack);
|
|
279
|
+
if (PickFirst(m, "at") is string at && DateTime.TryParse(at, null, System.Globalization.DateTimeStyles.RoundtripKind, out var parsedAt))
|
|
280
|
+
{
|
|
281
|
+
b.At(parsedAt);
|
|
282
|
+
}
|
|
283
|
+
if (m.TryGetValue("causes", out var rawCauses) && rawCauses is System.Collections.IEnumerable causesList)
|
|
284
|
+
{
|
|
285
|
+
var typed = new List<Dictionary<string, object?>>();
|
|
286
|
+
foreach (var c in causesList)
|
|
287
|
+
{
|
|
288
|
+
if (c is System.Collections.IDictionary cm)
|
|
289
|
+
{
|
|
290
|
+
typed.Add(AsStringKeyMap(cm));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
b.Causes(typed);
|
|
294
|
+
}
|
|
295
|
+
return b.Build();
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// =========================================================================
|
|
299
|
+
// Origin auto-enrichment
|
|
300
|
+
// =========================================================================
|
|
301
|
+
|
|
302
|
+
/// <summary>
|
|
303
|
+
/// Fill in any missing origin fields. Won't overwrite explicit values.
|
|
304
|
+
/// </summary>
|
|
305
|
+
public BlokError ApplyOriginIfMissing(BlokErrorOrigin origin)
|
|
306
|
+
{
|
|
307
|
+
if (string.IsNullOrEmpty(Node)) Node = origin.Node;
|
|
308
|
+
if (string.IsNullOrEmpty(Sdk)) Sdk = origin.Sdk;
|
|
309
|
+
if (string.IsNullOrEmpty(SdkVersion)) SdkVersion = origin.SdkVersion;
|
|
310
|
+
if (string.IsNullOrEmpty(RuntimeKind)) RuntimeKind = origin.RuntimeKind;
|
|
311
|
+
return this;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// =========================================================================
|
|
315
|
+
// Cause-chain flattening
|
|
316
|
+
// =========================================================================
|
|
317
|
+
|
|
318
|
+
/// <summary>
|
|
319
|
+
/// Walk an exception's <see cref="Exception.InnerException"/> chain and
|
|
320
|
+
/// produce a flat list of payloads. Cycle-safe; lifts a <see cref="BlokError"/>
|
|
321
|
+
/// link in directly so cross-wire serialization doesn't double-count
|
|
322
|
+
/// nested chains.
|
|
323
|
+
/// </summary>
|
|
324
|
+
public static List<Dictionary<string, object?>> FlattenCauses(Exception cause)
|
|
325
|
+
{
|
|
326
|
+
var causes = new List<Dictionary<string, object?>>();
|
|
327
|
+
var visited = new HashSet<Exception>();
|
|
328
|
+
var current = cause;
|
|
329
|
+
while (current is not null && visited.Add(current))
|
|
330
|
+
{
|
|
331
|
+
if (current is BlokError be)
|
|
332
|
+
{
|
|
333
|
+
var payload = be.ToMap();
|
|
334
|
+
payload["causes"] = new List<Dictionary<string, object?>>();
|
|
335
|
+
causes.Add(payload);
|
|
336
|
+
foreach (var nested in be.Causes)
|
|
337
|
+
{
|
|
338
|
+
causes.Add(new Dictionary<string, object?>(nested));
|
|
339
|
+
}
|
|
340
|
+
return causes;
|
|
341
|
+
}
|
|
342
|
+
causes.Add(ExceptionToPayload(current));
|
|
343
|
+
current = current.InnerException;
|
|
344
|
+
}
|
|
345
|
+
return causes;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
private static Dictionary<string, object?> ExceptionToPayload(Exception ex) => new()
|
|
349
|
+
{
|
|
350
|
+
["code"] = UncaughtCode(ex.GetType()),
|
|
351
|
+
["category"] = BlokErrorCategory.Internal.AsWire(),
|
|
352
|
+
["severity"] = BlokErrorSeverity.Error.AsWire(),
|
|
353
|
+
["node"] = "",
|
|
354
|
+
["sdk"] = "",
|
|
355
|
+
["sdk_version"] = "",
|
|
356
|
+
["runtime_kind"] = "",
|
|
357
|
+
["at"] = DateTime.UtcNow.ToString("o"),
|
|
358
|
+
["message"] = string.IsNullOrEmpty(ex.Message) ? "Uncaught error" : ex.Message,
|
|
359
|
+
["description"] = "",
|
|
360
|
+
["remediation"] = "",
|
|
361
|
+
["doc_url"] = "",
|
|
362
|
+
["causes"] = new List<Dictionary<string, object?>>(),
|
|
363
|
+
["stack"] = ex.StackTrace ?? string.Empty,
|
|
364
|
+
["context_snapshot"] = null,
|
|
365
|
+
["http_status"] = 500,
|
|
366
|
+
["retryable"] = false,
|
|
367
|
+
["retry_after_ms"] = 0L,
|
|
368
|
+
["details"] = null,
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
/// <summary>
|
|
372
|
+
/// Derive an <c>UNCAUGHT_<TYPE></c> code from a type. Mirrors the
|
|
373
|
+
/// Python <c>UNCAUGHT_CONNECTIONERROR</c>, Go <c>UNCAUGHT_<TYPE></c>,
|
|
374
|
+
/// and Java <c>UNCAUGHT_IOEXCEPTION</c> conventions: simple type name,
|
|
375
|
+
/// alphanumerics only, uppercased.
|
|
376
|
+
/// </summary>
|
|
377
|
+
public static string UncaughtCode(Type? type)
|
|
378
|
+
{
|
|
379
|
+
if (type is null) return "UNCAUGHT_ERROR";
|
|
380
|
+
var simple = type.Name;
|
|
381
|
+
var sb = new System.Text.StringBuilder(simple.Length);
|
|
382
|
+
foreach (var c in simple)
|
|
383
|
+
{
|
|
384
|
+
if (char.IsLetterOrDigit(c)) sb.Append(char.ToUpperInvariant(c));
|
|
385
|
+
}
|
|
386
|
+
return sb.Length == 0 ? "UNCAUGHT_ERROR" : "UNCAUGHT_" + sb;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// =========================================================================
|
|
390
|
+
// Internal map helpers
|
|
391
|
+
// =========================================================================
|
|
392
|
+
|
|
393
|
+
private static object? PickFirst(IDictionary<string, object?> m, params string[] keys)
|
|
394
|
+
{
|
|
395
|
+
foreach (var k in keys)
|
|
396
|
+
{
|
|
397
|
+
if (m.TryGetValue(k, out var v)) return v;
|
|
398
|
+
}
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
private static bool TryGetInt(IDictionary<string, object?> m, out int value, params string[] keys)
|
|
403
|
+
{
|
|
404
|
+
var raw = PickFirst(m, keys);
|
|
405
|
+
switch (raw)
|
|
406
|
+
{
|
|
407
|
+
case int i: value = i; return true;
|
|
408
|
+
case long l: value = (int)l; return true;
|
|
409
|
+
case double d: value = (int)d; return true;
|
|
410
|
+
case JsonElement el when el.ValueKind == JsonValueKind.Number:
|
|
411
|
+
value = el.GetInt32();
|
|
412
|
+
return true;
|
|
413
|
+
default:
|
|
414
|
+
value = 0;
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
private static bool TryGetLong(IDictionary<string, object?> m, out long value, params string[] keys)
|
|
420
|
+
{
|
|
421
|
+
var raw = PickFirst(m, keys);
|
|
422
|
+
switch (raw)
|
|
423
|
+
{
|
|
424
|
+
case int i: value = i; return true;
|
|
425
|
+
case long l: value = l; return true;
|
|
426
|
+
case double d: value = (long)d; return true;
|
|
427
|
+
case JsonElement el when el.ValueKind == JsonValueKind.Number:
|
|
428
|
+
value = el.GetInt64();
|
|
429
|
+
return true;
|
|
430
|
+
default:
|
|
431
|
+
value = 0;
|
|
432
|
+
return false;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
private static Dictionary<string, object?> AsStringKeyMap(System.Collections.IDictionary raw)
|
|
437
|
+
{
|
|
438
|
+
var typed = new Dictionary<string, object?>();
|
|
439
|
+
foreach (System.Collections.DictionaryEntry e in raw)
|
|
440
|
+
{
|
|
441
|
+
typed[e.Key.ToString() ?? ""] = e.Value;
|
|
442
|
+
}
|
|
443
|
+
return typed;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// =========================================================================
|
|
447
|
+
// Builder
|
|
448
|
+
// =========================================================================
|
|
449
|
+
|
|
450
|
+
/// <summary>
|
|
451
|
+
/// Fluent builder per master plan §17.5. Each setter returns
|
|
452
|
+
/// <c>this</c> so chained calls compose without intermediate variables.
|
|
453
|
+
/// Call <see cref="Build"/> to finalize.
|
|
454
|
+
/// </summary>
|
|
455
|
+
public sealed class Builder
|
|
456
|
+
{
|
|
457
|
+
internal readonly BlokErrorCategory CategoryValue;
|
|
458
|
+
internal BlokErrorSeverity SeverityValue = BlokErrorSeverity.Error;
|
|
459
|
+
internal string? CodeValue;
|
|
460
|
+
internal string? MessageValue;
|
|
461
|
+
internal string? DescriptionValue;
|
|
462
|
+
internal string? RemediationValue;
|
|
463
|
+
internal string? DocUrlValue;
|
|
464
|
+
internal int HttpStatusValue;
|
|
465
|
+
internal bool RetryableValue;
|
|
466
|
+
internal long RetryAfterMsValue;
|
|
467
|
+
internal object? DetailsValue;
|
|
468
|
+
internal object? ContextSnapshotValue;
|
|
469
|
+
internal Exception? CauseValue;
|
|
470
|
+
internal List<Dictionary<string, object?>>? CausesValue;
|
|
471
|
+
internal string? StackValue;
|
|
472
|
+
internal DateTime? AtValue;
|
|
473
|
+
internal string? NodeValue;
|
|
474
|
+
internal string? SdkValue;
|
|
475
|
+
internal string? SdkVersionValue;
|
|
476
|
+
internal string? RuntimeKindValue;
|
|
477
|
+
|
|
478
|
+
internal Builder(BlokErrorCategory category)
|
|
479
|
+
{
|
|
480
|
+
CategoryValue = category;
|
|
481
|
+
HttpStatusValue = category.DefaultHttpStatus();
|
|
482
|
+
RetryableValue = category.DefaultRetryable();
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
public Builder Code(string value) { CodeValue = value; return this; }
|
|
486
|
+
public Builder Message(string value) { MessageValue = value; return this; }
|
|
487
|
+
public Builder Description(string value) { DescriptionValue = value; return this; }
|
|
488
|
+
public Builder Remediation(string value) { RemediationValue = value; return this; }
|
|
489
|
+
public Builder DocUrl(string value) { DocUrlValue = value; return this; }
|
|
490
|
+
public Builder HttpStatus(int value) { HttpStatusValue = value; return this; }
|
|
491
|
+
public Builder Severity(BlokErrorSeverity value) { SeverityValue = value; return this; }
|
|
492
|
+
public Builder Retryable(bool value) { RetryableValue = value; return this; }
|
|
493
|
+
public Builder RetryAfter(TimeSpan duration) { RetryAfterMsValue = (long)duration.TotalMilliseconds; return this; }
|
|
494
|
+
public Builder RetryAfterMs(long value) { RetryAfterMsValue = value; return this; }
|
|
495
|
+
public Builder Details(object? value) { DetailsValue = value; return this; }
|
|
496
|
+
public Builder ContextSnapshot(object? value) { ContextSnapshotValue = value; return this; }
|
|
497
|
+
public Builder Cause(Exception? value) { CauseValue = value; return this; }
|
|
498
|
+
public Builder Causes(List<Dictionary<string, object?>> value) { CausesValue = value; return this; }
|
|
499
|
+
public Builder Stack(string value) { StackValue = value; return this; }
|
|
500
|
+
public Builder At(DateTime value) { AtValue = value; return this; }
|
|
501
|
+
public Builder Node(string value) { NodeValue = value; return this; }
|
|
502
|
+
public Builder Sdk(string value) { SdkValue = value; return this; }
|
|
503
|
+
public Builder SdkVersion(string value) { SdkVersionValue = value; return this; }
|
|
504
|
+
public Builder RuntimeKind(string value) { RuntimeKindValue = value; return this; }
|
|
505
|
+
|
|
506
|
+
/// <summary>
|
|
507
|
+
/// Apply origin fields, only filling unset ones. Use this in the
|
|
508
|
+
/// runtime-side wrapping path; explicit handler-set values win.
|
|
509
|
+
/// </summary>
|
|
510
|
+
public Builder ApplyOrigin(BlokErrorOrigin origin)
|
|
511
|
+
{
|
|
512
|
+
if (string.IsNullOrEmpty(NodeValue)) NodeValue = origin.Node;
|
|
513
|
+
if (string.IsNullOrEmpty(SdkValue)) SdkValue = origin.Sdk;
|
|
514
|
+
if (string.IsNullOrEmpty(SdkVersionValue)) SdkVersionValue = origin.SdkVersion;
|
|
515
|
+
if (string.IsNullOrEmpty(RuntimeKindValue)) RuntimeKindValue = origin.RuntimeKind;
|
|
516
|
+
return this;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
public BlokError Build() => new(this);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/// <summary>
|
|
524
|
+
/// Carrier of the auto-enrichment fields the gRPC servicer fills into a
|
|
525
|
+
/// handler-thrown <see cref="BlokError"/> when the handler didn't set those
|
|
526
|
+
/// fields explicitly.
|
|
527
|
+
/// </summary>
|
|
528
|
+
public record BlokErrorOrigin(string Node, string Sdk, string SdkVersion, string RuntimeKind)
|
|
529
|
+
{
|
|
530
|
+
/// <summary>
|
|
531
|
+
/// Build an <see cref="BlokErrorOrigin"/> populated with the SDK
|
|
532
|
+
/// constants (<see cref="BlokError.DefaultSdkName"/>,
|
|
533
|
+
/// <see cref="BlokError.DefaultRuntimeKind"/>) and the caller-provided
|
|
534
|
+
/// node name + SDK version.
|
|
535
|
+
/// </summary>
|
|
536
|
+
public static BlokErrorOrigin Defaults(string node, string sdkVersion)
|
|
537
|
+
=> new(node ?? string.Empty, BlokError.DefaultSdkName, sdkVersion ?? string.Empty, BlokError.DefaultRuntimeKind);
|
|
538
|
+
}
|