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,670 @@
|
|
|
1
|
+
// gRPC server implementing the canonical Blok NodeRuntime v1 service.
|
|
2
|
+
//
|
|
3
|
+
// Wire contract: proto/blok/runtime/v1/runtime.proto. Generated stubs live
|
|
4
|
+
// in github.com/nickincloud/blok-go/genpb/blok/runtime/v1.
|
|
5
|
+
//
|
|
6
|
+
// Architecture
|
|
7
|
+
// ------------
|
|
8
|
+
// - BlokNodeRuntime is the gRPC service implementation. It owns a pointer
|
|
9
|
+
// to the shared NodeRegistry so a single registry can serve both HTTP
|
|
10
|
+
// and gRPC.
|
|
11
|
+
// - ServeGrpc builds the gRPC server, binds the port, and blocks until
|
|
12
|
+
// shutdown (or the listener is closed).
|
|
13
|
+
// - Codec helpers (decodeExecuteRequest / encodeExecuteResponse / etc.)
|
|
14
|
+
// sit at the boundary between proto and the SDK's internal
|
|
15
|
+
// ExecutionRequest / ExecutionResult types so NodeRegistry.Execute runs
|
|
16
|
+
// unchanged regardless of which transport delivered the request.
|
|
17
|
+
//
|
|
18
|
+
// The proto sends inputs, previous_output, vars, and the request body as
|
|
19
|
+
// raw JSON-encoded bytes. The SDK JSON-decodes them lazily.
|
|
20
|
+
|
|
21
|
+
package blok
|
|
22
|
+
|
|
23
|
+
import (
|
|
24
|
+
"context"
|
|
25
|
+
"encoding/json"
|
|
26
|
+
"errors"
|
|
27
|
+
"fmt"
|
|
28
|
+
"log"
|
|
29
|
+
"net"
|
|
30
|
+
"strings"
|
|
31
|
+
"time"
|
|
32
|
+
|
|
33
|
+
"google.golang.org/grpc"
|
|
34
|
+
"google.golang.org/grpc/codes"
|
|
35
|
+
"google.golang.org/grpc/status"
|
|
36
|
+
"google.golang.org/protobuf/types/known/timestamppb"
|
|
37
|
+
|
|
38
|
+
pb "github.com/nickincloud/blok-go/genpb/blok/runtime/v1"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
// =============================================================================
|
|
42
|
+
// Service implementation
|
|
43
|
+
// =============================================================================
|
|
44
|
+
|
|
45
|
+
// BlokNodeRuntime is the gRPC implementation of the v1 NodeRuntime service.
|
|
46
|
+
//
|
|
47
|
+
// Single Responsibility: translate proto messages into the SDK's internal
|
|
48
|
+
// ExecutionRequest / ExecutionResult and dispatch to NodeRegistry. All
|
|
49
|
+
// node-level error handling lives in NodeRegistry.Execute.
|
|
50
|
+
type BlokNodeRuntime struct {
|
|
51
|
+
pb.UnimplementedNodeRuntimeServer
|
|
52
|
+
registry *NodeRegistry
|
|
53
|
+
sdkVersion string
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// NewBlokNodeRuntime returns a BlokNodeRuntime bound to the given registry.
|
|
57
|
+
func NewBlokNodeRuntime(registry *NodeRegistry, sdkVersion string) *BlokNodeRuntime {
|
|
58
|
+
if sdkVersion == "" {
|
|
59
|
+
sdkVersion = "1.0.0"
|
|
60
|
+
}
|
|
61
|
+
return &BlokNodeRuntime{registry: registry, sdkVersion: sdkVersion}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Execute decodes the proto envelope, dispatches to the registry, and
|
|
65
|
+
// encodes the result back to a proto response.
|
|
66
|
+
func (s *BlokNodeRuntime) Execute(ctx context.Context, req *pb.ExecuteRequest) (*pb.ExecuteResponse, error) {
|
|
67
|
+
execReq, err := decodeExecuteRequest(req)
|
|
68
|
+
if err != nil {
|
|
69
|
+
return nil, status.Error(codes.InvalidArgument, err.Error())
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
result := s.registry.Execute(execReq)
|
|
73
|
+
return encodeExecuteResponse(result, execReq.Node.Name, s.sdkVersion), nil
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ExecuteStream is the server-streaming variant of Execute.
|
|
77
|
+
//
|
|
78
|
+
// Emits, in order:
|
|
79
|
+
// 1. one NodeStarted event marking call acceptance
|
|
80
|
+
// 2. zero or more LogLine events emitted by the handler via
|
|
81
|
+
// `ctx.StreamLog(...)` while it runs (real-time, not buffered)
|
|
82
|
+
// 3. one terminal ExecuteResponse carrying the same payload as the unary
|
|
83
|
+
// Execute would return
|
|
84
|
+
//
|
|
85
|
+
// # Real-time streaming model
|
|
86
|
+
//
|
|
87
|
+
// The handler runs on its own goroutine so the request goroutine can
|
|
88
|
+
// `select` on the log channel and the result channel concurrently. Every
|
|
89
|
+
// time the handler calls `ctx.StreamLog`, an entry lands on the log
|
|
90
|
+
// channel; the request goroutine wakes, sends a LogLine proto, and goes
|
|
91
|
+
// back to selecting. When the handler returns, the result lands on the
|
|
92
|
+
// result channel; we drain any remaining log entries (preserving causal
|
|
93
|
+
// order with respect to the final response) and send the
|
|
94
|
+
// ExecuteResponse.
|
|
95
|
+
//
|
|
96
|
+
// # Drop policy under load
|
|
97
|
+
//
|
|
98
|
+
// The log channel is buffered (default 64). If a handler emits faster
|
|
99
|
+
// than the gRPC stream can drain (very rare in practice), additional
|
|
100
|
+
// `StreamLog` calls drop the entry rather than block — observability
|
|
101
|
+
// over correctness; a chatty handler does not stall execution.
|
|
102
|
+
func (s *BlokNodeRuntime) ExecuteStream(req *pb.ExecuteRequest, stream pb.NodeRuntime_ExecuteStreamServer) error {
|
|
103
|
+
execReq, err := decodeExecuteRequest(req)
|
|
104
|
+
if err != nil {
|
|
105
|
+
return status.Error(codes.InvalidArgument, err.Error())
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// NodeStarted goes out immediately so the runner can record start time
|
|
109
|
+
// before the (potentially long) execute call.
|
|
110
|
+
if sendErr := stream.Send(&pb.ExecuteEvent{
|
|
111
|
+
Event: &pb.ExecuteEvent_Started{
|
|
112
|
+
Started: &pb.NodeStarted{At: timestamppb.New(time.Now())},
|
|
113
|
+
},
|
|
114
|
+
}); sendErr != nil {
|
|
115
|
+
return sendErr
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Channel-backed logger sink. Buffered to absorb bursts without
|
|
119
|
+
// blocking the handler; non-blocking drop on overflow.
|
|
120
|
+
const logBufSize = 64
|
|
121
|
+
logCh := make(chan StreamLogEntry, logBufSize)
|
|
122
|
+
execReq.Context.setStreamLog(func(entry StreamLogEntry) {
|
|
123
|
+
select {
|
|
124
|
+
case logCh <- entry:
|
|
125
|
+
default:
|
|
126
|
+
// Buffer full — drop the entry.
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
// Run the handler on a worker goroutine so we can multiplex log
|
|
131
|
+
// frames and the final result on the request goroutine.
|
|
132
|
+
resultCh := make(chan *ExecutionResult, 1)
|
|
133
|
+
go func() {
|
|
134
|
+
resultCh <- s.registry.Execute(execReq)
|
|
135
|
+
}()
|
|
136
|
+
|
|
137
|
+
// Streaming loop: forward each log frame as it arrives; break
|
|
138
|
+
// when the handler returns.
|
|
139
|
+
var result *ExecutionResult
|
|
140
|
+
streaming := true
|
|
141
|
+
for streaming {
|
|
142
|
+
select {
|
|
143
|
+
case entry := <-logCh:
|
|
144
|
+
if sendErr := stream.Send(&pb.ExecuteEvent{
|
|
145
|
+
Event: &pb.ExecuteEvent_Log{Log: streamLogEntryToProto(entry)},
|
|
146
|
+
}); sendErr != nil {
|
|
147
|
+
return sendErr
|
|
148
|
+
}
|
|
149
|
+
case result = <-resultCh:
|
|
150
|
+
streaming = false
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Detach the sink so a delayed handler goroutine can't accidentally
|
|
155
|
+
// publish to the closing channel.
|
|
156
|
+
execReq.Context.setStreamLog(nil)
|
|
157
|
+
|
|
158
|
+
// Drain any logs the handler emitted between our last `select`
|
|
159
|
+
// wakeup and its final return so they arrive before the final
|
|
160
|
+
// frame.
|
|
161
|
+
draining:
|
|
162
|
+
for {
|
|
163
|
+
select {
|
|
164
|
+
case entry := <-logCh:
|
|
165
|
+
if sendErr := stream.Send(&pb.ExecuteEvent{
|
|
166
|
+
Event: &pb.ExecuteEvent_Log{Log: streamLogEntryToProto(entry)},
|
|
167
|
+
}); sendErr != nil {
|
|
168
|
+
return sendErr
|
|
169
|
+
}
|
|
170
|
+
default:
|
|
171
|
+
break draining
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return stream.Send(&pb.ExecuteEvent{
|
|
176
|
+
Event: &pb.ExecuteEvent_Final{
|
|
177
|
+
Final: encodeExecuteResponse(result, execReq.Node.Name, s.sdkVersion),
|
|
178
|
+
},
|
|
179
|
+
})
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// streamLogEntryToProto encodes a handler-emitted StreamLogEntry into the
|
|
183
|
+
// proto LogLine wire shape. The proto `timestamp` field captures
|
|
184
|
+
// wall-clock at encode time (the entry's emit moment is captured here
|
|
185
|
+
// in the request goroutine, microseconds after the handler returned
|
|
186
|
+
// from StreamLog).
|
|
187
|
+
func streamLogEntryToProto(entry StreamLogEntry) *pb.LogLine {
|
|
188
|
+
return &pb.LogLine{
|
|
189
|
+
Timestamp: timestamppb.New(time.Now()),
|
|
190
|
+
Level: entry.Level,
|
|
191
|
+
Message: entry.Message,
|
|
192
|
+
Attributes: entry.Attrs,
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Health reports SERVING with the SDK version and registered node names.
|
|
197
|
+
// Wire-compatible with grpc.health.v1.Health/Check.
|
|
198
|
+
func (s *BlokNodeRuntime) Health(ctx context.Context, req *pb.HealthRequest) (*pb.HealthResponse, error) {
|
|
199
|
+
return &pb.HealthResponse{
|
|
200
|
+
Status: pb.HealthResponse_SERVING,
|
|
201
|
+
SdkVersion: s.sdkVersion,
|
|
202
|
+
RegisteredNodes: s.registry.NodeNames(),
|
|
203
|
+
}, nil
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// ListNodes returns the registered node names as descriptors.
|
|
207
|
+
func (s *BlokNodeRuntime) ListNodes(ctx context.Context, req *pb.ListNodesRequest) (*pb.ListNodesResponse, error) {
|
|
208
|
+
names := s.registry.NodeNames()
|
|
209
|
+
descriptors := make([]*pb.NodeDescriptor, 0, len(names))
|
|
210
|
+
for _, name := range names {
|
|
211
|
+
// SPEC-B P4 — DefineNode handlers expose a description + JSON Schema via
|
|
212
|
+
// NodeReflector; legacy map-based handlers report empty.
|
|
213
|
+
var description string
|
|
214
|
+
var inputSchema, outputSchema []byte
|
|
215
|
+
if h, err := s.registry.Get(name); err == nil {
|
|
216
|
+
if r, ok := h.(NodeReflector); ok {
|
|
217
|
+
description = r.Description()
|
|
218
|
+
inputSchema = r.InputSchemaJSON()
|
|
219
|
+
outputSchema = r.OutputSchemaJSON()
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
descriptors = append(descriptors, &pb.NodeDescriptor{
|
|
223
|
+
Name: name,
|
|
224
|
+
Description: description,
|
|
225
|
+
InputSchemaJson: inputSchema,
|
|
226
|
+
OutputSchemaJson: outputSchema,
|
|
227
|
+
Tags: nil,
|
|
228
|
+
})
|
|
229
|
+
}
|
|
230
|
+
return &pb.ListNodesResponse{
|
|
231
|
+
Nodes: descriptors,
|
|
232
|
+
SdkName: "blok-go",
|
|
233
|
+
SdkVersion: s.sdkVersion,
|
|
234
|
+
ProtoVersion: "1.0.0",
|
|
235
|
+
}, nil
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// =============================================================================
|
|
239
|
+
// Server lifecycle
|
|
240
|
+
// =============================================================================
|
|
241
|
+
|
|
242
|
+
// GrpcServerOptions controls how ServeGrpc binds and configures the gRPC
|
|
243
|
+
// server. Zero values are replaced by sensible defaults.
|
|
244
|
+
type GrpcServerOptions struct {
|
|
245
|
+
// MaxMessageBytes limits the maximum send/receive size. Defaults to
|
|
246
|
+
// 16 MiB (matches the runner-side default + the PHP-buffer ceiling
|
|
247
|
+
// from BLOK_FRAMEWORK_FIXES.md #5).
|
|
248
|
+
MaxMessageBytes int
|
|
249
|
+
// SdkVersion is reported in Health and ListNodes responses.
|
|
250
|
+
SdkVersion string
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// ServeGrpc binds the gRPC server on host:port and blocks until the server
|
|
254
|
+
// stops (or returns a startup error). The returned grpc.Server lets callers
|
|
255
|
+
// stop the server gracefully when blocking is delegated to the caller.
|
|
256
|
+
//
|
|
257
|
+
// For non-blocking startup (so a process can listen on HTTP and gRPC at the
|
|
258
|
+
// same time), see StartGrpc which returns the started server immediately.
|
|
259
|
+
func ServeGrpc(registry *NodeRegistry, host string, port int, opts GrpcServerOptions) error {
|
|
260
|
+
server, lis, err := buildGrpcServer(registry, host, port, opts)
|
|
261
|
+
if err != nil {
|
|
262
|
+
return err
|
|
263
|
+
}
|
|
264
|
+
log.Printf("Blok gRPC server (NodeRuntime v1) listening on %s with %d nodes registered",
|
|
265
|
+
lis.Addr().String(), len(registry.NodeNames()))
|
|
266
|
+
return server.Serve(lis)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// StartGrpc binds and starts the gRPC server in a background goroutine.
|
|
270
|
+
// Returns the server immediately so the caller can stop it via Stop or
|
|
271
|
+
// GracefulStop. Errors during Serve are logged.
|
|
272
|
+
//
|
|
273
|
+
// Use this for dual-listen mode where the same process serves HTTP and gRPC.
|
|
274
|
+
func StartGrpc(registry *NodeRegistry, host string, port int, opts GrpcServerOptions) (*grpc.Server, net.Addr, error) {
|
|
275
|
+
server, lis, err := buildGrpcServer(registry, host, port, opts)
|
|
276
|
+
if err != nil {
|
|
277
|
+
return nil, nil, err
|
|
278
|
+
}
|
|
279
|
+
go func() {
|
|
280
|
+
log.Printf("Blok gRPC server (NodeRuntime v1) listening on %s with %d nodes registered",
|
|
281
|
+
lis.Addr().String(), len(registry.NodeNames()))
|
|
282
|
+
if serveErr := server.Serve(lis); serveErr != nil && !errors.Is(serveErr, grpc.ErrServerStopped) {
|
|
283
|
+
log.Printf("gRPC server error: %v", serveErr)
|
|
284
|
+
}
|
|
285
|
+
}()
|
|
286
|
+
return server, lis.Addr(), nil
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
func buildGrpcServer(registry *NodeRegistry, host string, port int, opts GrpcServerOptions) (*grpc.Server, net.Listener, error) {
|
|
290
|
+
maxMsg := opts.MaxMessageBytes
|
|
291
|
+
if maxMsg <= 0 {
|
|
292
|
+
maxMsg = 16 * 1024 * 1024
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
addr := fmt.Sprintf("%s:%d", host, port)
|
|
296
|
+
lis, err := net.Listen("tcp", addr)
|
|
297
|
+
if err != nil {
|
|
298
|
+
return nil, nil, fmt.Errorf("listen on %s: %w", addr, err)
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
server := grpc.NewServer(
|
|
302
|
+
grpc.MaxRecvMsgSize(maxMsg),
|
|
303
|
+
grpc.MaxSendMsgSize(maxMsg),
|
|
304
|
+
)
|
|
305
|
+
pb.RegisterNodeRuntimeServer(server, NewBlokNodeRuntime(registry, opts.SdkVersion))
|
|
306
|
+
return server, lis, nil
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// =============================================================================
|
|
310
|
+
// Codec — proto ↔ internal types
|
|
311
|
+
// =============================================================================
|
|
312
|
+
|
|
313
|
+
// decodeError signals an unrecoverable problem in incoming proto messages.
|
|
314
|
+
type decodeError struct{ msg string }
|
|
315
|
+
|
|
316
|
+
func (e *decodeError) Error() string { return e.msg }
|
|
317
|
+
|
|
318
|
+
// decodeExecuteRequest decodes a proto ExecuteRequest into the SDK's
|
|
319
|
+
// ExecutionRequest. The opaque JSON-shaped fields (inputs, previous_output,
|
|
320
|
+
// vars, request body) arrive as raw bytes and are JSON-decoded here.
|
|
321
|
+
func decodeExecuteRequest(req *pb.ExecuteRequest) (*ExecutionRequest, error) {
|
|
322
|
+
if req == nil || req.Node == nil || req.Node.Name == "" {
|
|
323
|
+
return nil, &decodeError{msg: "ExecuteRequest.node is required"}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
inputs, err := decodeJSONObject(req.Inputs, "inputs")
|
|
327
|
+
if err != nil {
|
|
328
|
+
return nil, err
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
previousOutput, err := decodeJSONValue(req.GetState().GetPreviousOutput(), "previous_output")
|
|
332
|
+
if err != nil {
|
|
333
|
+
return nil, err
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
vars, err := decodeJSONObject(req.GetState().GetVars(), "vars")
|
|
337
|
+
if err != nil {
|
|
338
|
+
return nil, err
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
trigger := req.GetTrigger()
|
|
342
|
+
body := decodeRequestBody(trigger.GetBody(), trigger.GetHeaders())
|
|
343
|
+
|
|
344
|
+
exec := &ExecutionRequest{
|
|
345
|
+
Node: NodeConfig{
|
|
346
|
+
Name: req.Node.Name,
|
|
347
|
+
Type: req.Node.Type,
|
|
348
|
+
Config: inputs,
|
|
349
|
+
},
|
|
350
|
+
Context: Context{
|
|
351
|
+
ID: req.GetWorkflow().GetRunId(),
|
|
352
|
+
WorkflowName: req.GetWorkflow().GetName(),
|
|
353
|
+
WorkflowPath: req.GetWorkflow().GetPath(),
|
|
354
|
+
Request: Request{
|
|
355
|
+
Body: body,
|
|
356
|
+
Headers: trigger.GetHeaders(),
|
|
357
|
+
Params: trigger.GetParams(),
|
|
358
|
+
Query: trigger.GetQuery(),
|
|
359
|
+
Method: trigger.GetMethod(),
|
|
360
|
+
URL: trigger.GetUrl(),
|
|
361
|
+
Cookies: trigger.GetCookies(),
|
|
362
|
+
BaseURL: trigger.GetBaseUrl(),
|
|
363
|
+
},
|
|
364
|
+
Response: Response{
|
|
365
|
+
Data: previousOutput,
|
|
366
|
+
ContentType: "application/json",
|
|
367
|
+
Success: true,
|
|
368
|
+
Error: nil,
|
|
369
|
+
},
|
|
370
|
+
Vars: vars,
|
|
371
|
+
Env: req.GetState().GetEnv(),
|
|
372
|
+
},
|
|
373
|
+
}
|
|
374
|
+
return exec, nil
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// encodeExecuteResponse encodes the SDK's ExecutionResult into a proto
|
|
378
|
+
// ExecuteResponse.
|
|
379
|
+
func encodeExecuteResponse(result *ExecutionResult, nodeName string, sdkVersion string) *pb.ExecuteResponse {
|
|
380
|
+
var metrics *pb.Metrics
|
|
381
|
+
if result.Metrics != nil {
|
|
382
|
+
var dur, cpu float64
|
|
383
|
+
var mem int64
|
|
384
|
+
if result.Metrics.DurationMs != nil {
|
|
385
|
+
dur = *result.Metrics.DurationMs
|
|
386
|
+
}
|
|
387
|
+
if result.Metrics.CpuMs != nil {
|
|
388
|
+
cpu = *result.Metrics.CpuMs
|
|
389
|
+
}
|
|
390
|
+
if result.Metrics.MemoryBytes != nil {
|
|
391
|
+
mem = int64(*result.Metrics.MemoryBytes)
|
|
392
|
+
}
|
|
393
|
+
metrics = &pb.Metrics{
|
|
394
|
+
DurationMs: dur,
|
|
395
|
+
CpuMs: cpu,
|
|
396
|
+
MemoryBytes: mem,
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
var dataBytes []byte
|
|
401
|
+
if result.Success && result.Data != nil {
|
|
402
|
+
dataBytes = encodeJSONBytes(result.Data)
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
var varsDeltaBytes []byte
|
|
406
|
+
if len(result.Vars) > 0 {
|
|
407
|
+
varsDeltaBytes = encodeJSONBytes(result.Vars)
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
var nodeError *pb.NodeError
|
|
411
|
+
if !result.Success {
|
|
412
|
+
nodeError = internalErrorToProto(result.Errors, nodeName, sdkVersion)
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Populate `response_bytes` so Studio's run-detail Inspector can
|
|
416
|
+
// display the gRPC wire size next to the request bytes the runner
|
|
417
|
+
// already measures. Approximate via the JSON-encoded payload size
|
|
418
|
+
// (data + vars_delta) — matches the runner's request_bytes
|
|
419
|
+
// approximation, so the two numbers are comparable.
|
|
420
|
+
if metrics == nil {
|
|
421
|
+
metrics = &pb.Metrics{}
|
|
422
|
+
}
|
|
423
|
+
metrics.ResponseBytes = int64(len(dataBytes) + len(varsDeltaBytes))
|
|
424
|
+
|
|
425
|
+
return &pb.ExecuteResponse{
|
|
426
|
+
Success: result.Success,
|
|
427
|
+
Data: dataBytes,
|
|
428
|
+
ContentType: "application/json",
|
|
429
|
+
Error: nodeError,
|
|
430
|
+
VarsDelta: varsDeltaBytes,
|
|
431
|
+
Logs: nil,
|
|
432
|
+
Metrics: metrics,
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// internalErrorToProto builds a structured NodeError from whatever
|
|
437
|
+
// ExecutionResult.Errors carries.
|
|
438
|
+
//
|
|
439
|
+
// Two paths:
|
|
440
|
+
// - Structured (preferred): errVal is a *BlokError. All 19 fields serialize
|
|
441
|
+
// losslessly via blokErrorToProto. Auto-fills node/sdk/sdk_version/
|
|
442
|
+
// runtime_kind if the BlokError didn't set them itself.
|
|
443
|
+
// - Loose: errVal is anything else (dict, string, nil, error). Wrapped via
|
|
444
|
+
// FromUnknown (always produces category=INTERNAL with the original
|
|
445
|
+
// payload preserved in details_json) and then serialized via the
|
|
446
|
+
// structured path.
|
|
447
|
+
//
|
|
448
|
+
// Both paths produce the same proto shape, so the runner's gRPC codec
|
|
449
|
+
// consumes them identically.
|
|
450
|
+
func internalErrorToProto(errVal interface{}, nodeName, sdkVersion string) *pb.NodeError {
|
|
451
|
+
if blokErr, ok := errVal.(*BlokError); ok {
|
|
452
|
+
blokErr.EnrichOrigin(DefaultOrigin(nodeName, sdkVersion))
|
|
453
|
+
return blokErrorToProto(blokErr)
|
|
454
|
+
}
|
|
455
|
+
return blokErrorToProto(FromUnknown(errVal, DefaultOrigin(nodeName, sdkVersion)))
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// blokErrorToProto serializes a fully-populated *BlokError into the proto
|
|
459
|
+
// wire format. The cause chain is serialized as a list of pb.NodeError
|
|
460
|
+
// messages; each element's own causes list is left empty (the chain is
|
|
461
|
+
// already flat at the BlokError layer, so nesting at the wire layer would
|
|
462
|
+
// double-count).
|
|
463
|
+
func blokErrorToProto(e *BlokError) *pb.NodeError {
|
|
464
|
+
at := timestamppb.New(e.At)
|
|
465
|
+
causes := make([]*pb.NodeError, 0, len(e.Causes))
|
|
466
|
+
for _, c := range e.Causes {
|
|
467
|
+
causes = append(causes, causeMapToProto(c))
|
|
468
|
+
}
|
|
469
|
+
return &pb.NodeError{
|
|
470
|
+
Code: e.Code,
|
|
471
|
+
Category: categoryToProto(e.Category),
|
|
472
|
+
Severity: severityToProto(e.Severity),
|
|
473
|
+
Node: e.Node,
|
|
474
|
+
Sdk: e.SDK,
|
|
475
|
+
SdkVersion: e.SDKVersion,
|
|
476
|
+
RuntimeKind: e.RuntimeKind,
|
|
477
|
+
At: at,
|
|
478
|
+
Message: e.Message,
|
|
479
|
+
Description: e.Description,
|
|
480
|
+
Remediation: e.Remediation,
|
|
481
|
+
DocUrl: e.DocURL,
|
|
482
|
+
Causes: causes,
|
|
483
|
+
Stack: e.Stack,
|
|
484
|
+
ContextSnapshotJson: encodeNullableJSONBytes(e.ContextSnapshot),
|
|
485
|
+
HttpStatus: int32(e.HTTPStatus),
|
|
486
|
+
Retryable: e.Retryable,
|
|
487
|
+
RetryAfterMs: e.RetryAfterMs,
|
|
488
|
+
DetailsJson: encodeNullableJSONBytes(e.Details),
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
func causeMapToProto(cause map[string]interface{}) *pb.NodeError {
|
|
493
|
+
atTs := timestamppb.Now()
|
|
494
|
+
if atStr, ok := cause["at"].(string); ok {
|
|
495
|
+
if parsed, err := time.Parse(time.RFC3339Nano, atStr); err == nil {
|
|
496
|
+
atTs = timestamppb.New(parsed)
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
httpStatus := 500
|
|
500
|
+
if hs, ok := cause["http_status"].(int); ok {
|
|
501
|
+
httpStatus = hs
|
|
502
|
+
} else if hs, ok := cause["http_status"].(float64); ok {
|
|
503
|
+
httpStatus = int(hs)
|
|
504
|
+
}
|
|
505
|
+
retryAfterMs := int64(0)
|
|
506
|
+
switch v := cause["retry_after_ms"].(type) {
|
|
507
|
+
case int:
|
|
508
|
+
retryAfterMs = int64(v)
|
|
509
|
+
case int64:
|
|
510
|
+
retryAfterMs = v
|
|
511
|
+
case float64:
|
|
512
|
+
retryAfterMs = int64(v)
|
|
513
|
+
}
|
|
514
|
+
retryable := false
|
|
515
|
+
if r, ok := cause["retryable"].(bool); ok {
|
|
516
|
+
retryable = r
|
|
517
|
+
}
|
|
518
|
+
return &pb.NodeError{
|
|
519
|
+
Code: stringField(cause, "code"),
|
|
520
|
+
Category: categoryToProto(ErrorCategory(stringField(cause, "category"))),
|
|
521
|
+
Severity: severityToProto(ErrorSeverity(stringField(cause, "severity"))),
|
|
522
|
+
Node: stringField(cause, "node"),
|
|
523
|
+
Sdk: stringField(cause, "sdk"),
|
|
524
|
+
SdkVersion: stringField(cause, "sdk_version"),
|
|
525
|
+
RuntimeKind: stringField(cause, "runtime_kind"),
|
|
526
|
+
At: atTs,
|
|
527
|
+
Message: stringField(cause, "message"),
|
|
528
|
+
Description: stringField(cause, "description"),
|
|
529
|
+
Remediation: stringField(cause, "remediation"),
|
|
530
|
+
DocUrl: stringField(cause, "doc_url"),
|
|
531
|
+
Causes: []*pb.NodeError{},
|
|
532
|
+
Stack: stringField(cause, "stack"),
|
|
533
|
+
ContextSnapshotJson: encodeNullableJSONBytes(cause["context_snapshot"]),
|
|
534
|
+
HttpStatus: int32(httpStatus),
|
|
535
|
+
Retryable: retryable,
|
|
536
|
+
RetryAfterMs: retryAfterMs,
|
|
537
|
+
DetailsJson: encodeNullableJSONBytes(cause["details"]),
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
func stringField(m map[string]interface{}, key string) string {
|
|
542
|
+
if v, ok := m[key].(string); ok {
|
|
543
|
+
return v
|
|
544
|
+
}
|
|
545
|
+
return ""
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
func encodeNullableJSONBytes(v interface{}) []byte {
|
|
549
|
+
if v == nil {
|
|
550
|
+
return nil
|
|
551
|
+
}
|
|
552
|
+
return encodeJSONBytes(v)
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// categoryToProto maps a (possibly legacy/unknown) ErrorCategory string to
|
|
556
|
+
// the proto integer enum. Unknown values default to INTERNAL — same
|
|
557
|
+
// fallback as Python.
|
|
558
|
+
func categoryToProto(c ErrorCategory) pb.ErrorCategory {
|
|
559
|
+
switch c {
|
|
560
|
+
case CategoryValidation:
|
|
561
|
+
return pb.ErrorCategory_VALIDATION
|
|
562
|
+
case CategoryConfiguration:
|
|
563
|
+
return pb.ErrorCategory_CONFIGURATION
|
|
564
|
+
case CategoryDependency:
|
|
565
|
+
return pb.ErrorCategory_DEPENDENCY
|
|
566
|
+
case CategoryTimeout:
|
|
567
|
+
return pb.ErrorCategory_TIMEOUT
|
|
568
|
+
case CategoryPermission:
|
|
569
|
+
return pb.ErrorCategory_PERMISSION
|
|
570
|
+
case CategoryRateLimit:
|
|
571
|
+
return pb.ErrorCategory_RATE_LIMIT
|
|
572
|
+
case CategoryNotFound:
|
|
573
|
+
return pb.ErrorCategory_NOT_FOUND
|
|
574
|
+
case CategoryConflict:
|
|
575
|
+
return pb.ErrorCategory_CONFLICT
|
|
576
|
+
case CategoryCancelled:
|
|
577
|
+
return pb.ErrorCategory_CANCELLED
|
|
578
|
+
case CategoryProtocol:
|
|
579
|
+
return pb.ErrorCategory_PROTOCOL
|
|
580
|
+
case CategoryData:
|
|
581
|
+
return pb.ErrorCategory_DATA
|
|
582
|
+
default:
|
|
583
|
+
return pb.ErrorCategory_INTERNAL
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
func severityToProto(s ErrorSeverity) pb.ErrorSeverity {
|
|
588
|
+
switch s {
|
|
589
|
+
case SeverityInfo:
|
|
590
|
+
return pb.ErrorSeverity_INFO
|
|
591
|
+
case SeverityWarn:
|
|
592
|
+
return pb.ErrorSeverity_WARN
|
|
593
|
+
case SeverityFatal:
|
|
594
|
+
return pb.ErrorSeverity_FATAL
|
|
595
|
+
default:
|
|
596
|
+
return pb.ErrorSeverity_ERROR
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
// decodeJSONObject decodes a JSON-bytes field as a map. Empty bytes → empty map.
|
|
602
|
+
// Non-object payloads are wrapped under a "_value" key.
|
|
603
|
+
func decodeJSONObject(blob []byte, field string) (map[string]interface{}, error) {
|
|
604
|
+
if len(blob) == 0 {
|
|
605
|
+
return map[string]interface{}{}, nil
|
|
606
|
+
}
|
|
607
|
+
var raw interface{}
|
|
608
|
+
if err := json.Unmarshal(blob, &raw); err != nil {
|
|
609
|
+
return nil, &decodeError{msg: fmt.Sprintf("invalid `%s` JSON: %v", field, err)}
|
|
610
|
+
}
|
|
611
|
+
if m, ok := raw.(map[string]interface{}); ok {
|
|
612
|
+
return m, nil
|
|
613
|
+
}
|
|
614
|
+
return map[string]interface{}{"_value": raw}, nil
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
// decodeJSONValue decodes a JSON-bytes field as an arbitrary value. Empty bytes → nil.
|
|
618
|
+
func decodeJSONValue(blob []byte, field string) (interface{}, error) {
|
|
619
|
+
if len(blob) == 0 {
|
|
620
|
+
return nil, nil
|
|
621
|
+
}
|
|
622
|
+
var raw interface{}
|
|
623
|
+
if err := json.Unmarshal(blob, &raw); err != nil {
|
|
624
|
+
return nil, &decodeError{msg: fmt.Sprintf("invalid `%s` JSON: %v", field, err)}
|
|
625
|
+
}
|
|
626
|
+
return raw, nil
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
// decodeRequestBody decodes the trigger body. JSON content-types parse as
|
|
630
|
+
// JSON; everything else arrives as a raw string for the node to interpret.
|
|
631
|
+
func decodeRequestBody(blob []byte, headers map[string]string) interface{} {
|
|
632
|
+
if len(blob) == 0 {
|
|
633
|
+
return nil
|
|
634
|
+
}
|
|
635
|
+
contentType := pickHeader(headers, "content-type")
|
|
636
|
+
if strings.Contains(strings.ToLower(contentType), "application/json") {
|
|
637
|
+
var v interface{}
|
|
638
|
+
if err := json.Unmarshal(blob, &v); err == nil {
|
|
639
|
+
return v
|
|
640
|
+
}
|
|
641
|
+
// fall through to raw-string handling
|
|
642
|
+
}
|
|
643
|
+
return string(blob)
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
func pickHeader(headers map[string]string, name string) string {
|
|
647
|
+
if headers == nil {
|
|
648
|
+
return ""
|
|
649
|
+
}
|
|
650
|
+
if v, ok := headers[name]; ok {
|
|
651
|
+
return v
|
|
652
|
+
}
|
|
653
|
+
// Try case-insensitive lookup.
|
|
654
|
+
for k, v := range headers {
|
|
655
|
+
if strings.EqualFold(k, name) {
|
|
656
|
+
return v
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
return ""
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
// encodeJSONBytes encodes a Go value as UTF-8 JSON bytes. Errors fall back
|
|
663
|
+
// to nil (the proto receiver treats empty as null).
|
|
664
|
+
func encodeJSONBytes(value interface{}) []byte {
|
|
665
|
+
bytes, err := json.Marshal(value)
|
|
666
|
+
if err != nil {
|
|
667
|
+
return nil
|
|
668
|
+
}
|
|
669
|
+
return bytes
|
|
670
|
+
}
|