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,29 @@
|
|
|
1
|
+
package com.blok.blok.middleware;
|
|
2
|
+
|
|
3
|
+
import com.blok.blok.node.NodeHandler;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Functional interface for middleware that wraps node handler execution.
|
|
7
|
+
* Middleware can add cross-cutting behavior such as logging, recovery, or validation.
|
|
8
|
+
* <p>
|
|
9
|
+
* Example:
|
|
10
|
+
* <pre>{@code
|
|
11
|
+
* Middleware timing = next -> (ctx, config) -> {
|
|
12
|
+
* long start = System.nanoTime();
|
|
13
|
+
* Object result = next.execute(ctx, config);
|
|
14
|
+
* System.out.println("Took " + (System.nanoTime() - start) / 1_000_000 + "ms");
|
|
15
|
+
* return result;
|
|
16
|
+
* };
|
|
17
|
+
* }</pre>
|
|
18
|
+
*/
|
|
19
|
+
@FunctionalInterface
|
|
20
|
+
public interface Middleware {
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Wraps the given handler with additional behavior.
|
|
24
|
+
*
|
|
25
|
+
* @param next the next handler in the chain
|
|
26
|
+
* @return a wrapped handler
|
|
27
|
+
*/
|
|
28
|
+
NodeHandler wrap(NodeHandler next);
|
|
29
|
+
}
|
package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/MiddlewareChain.java
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
package com.blok.blok.middleware;
|
|
2
|
+
|
|
3
|
+
import com.blok.blok.node.NodeHandler;
|
|
4
|
+
|
|
5
|
+
import java.util.ArrayList;
|
|
6
|
+
import java.util.Arrays;
|
|
7
|
+
import java.util.List;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Composes multiple middleware into a single middleware.
|
|
11
|
+
* Middleware is applied in order: first middleware is outermost.
|
|
12
|
+
*/
|
|
13
|
+
public class MiddlewareChain implements Middleware {
|
|
14
|
+
|
|
15
|
+
private final List<Middleware> middlewares;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Creates a chain from the given middlewares.
|
|
19
|
+
*
|
|
20
|
+
* @param middlewares the middlewares to chain
|
|
21
|
+
*/
|
|
22
|
+
public MiddlewareChain(Middleware... middlewares) {
|
|
23
|
+
this.middlewares = new ArrayList<>();
|
|
24
|
+
if (middlewares != null) {
|
|
25
|
+
this.middlewares.addAll(Arrays.asList(middlewares));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Creates a chain from a list of middlewares.
|
|
31
|
+
*
|
|
32
|
+
* @param middlewares the middlewares to chain
|
|
33
|
+
*/
|
|
34
|
+
public MiddlewareChain(List<Middleware> middlewares) {
|
|
35
|
+
this.middlewares = middlewares != null ? new ArrayList<>(middlewares) : new ArrayList<>();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Adds a middleware to the end of the chain.
|
|
40
|
+
*
|
|
41
|
+
* @param middleware the middleware to add
|
|
42
|
+
* @return this chain for fluent use
|
|
43
|
+
*/
|
|
44
|
+
public MiddlewareChain add(Middleware middleware) {
|
|
45
|
+
if (middleware != null) {
|
|
46
|
+
middlewares.add(middleware);
|
|
47
|
+
}
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@Override
|
|
52
|
+
public NodeHandler wrap(NodeHandler handler) {
|
|
53
|
+
NodeHandler current = handler;
|
|
54
|
+
for (int i = middlewares.size() - 1; i >= 0; i--) {
|
|
55
|
+
current = middlewares.get(i).wrap(current);
|
|
56
|
+
}
|
|
57
|
+
return current;
|
|
58
|
+
}
|
|
59
|
+
}
|
package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/RecoveryMiddleware.java
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
package com.blok.blok.middleware;
|
|
2
|
+
|
|
3
|
+
import com.blok.blok.errors.BlokError;
|
|
4
|
+
import com.blok.blok.errors.ErrorCategory;
|
|
5
|
+
import com.blok.blok.errors.NodeException;
|
|
6
|
+
import com.blok.blok.node.NodeHandler;
|
|
7
|
+
|
|
8
|
+
import java.io.PrintWriter;
|
|
9
|
+
import java.io.StringWriter;
|
|
10
|
+
import java.util.HashMap;
|
|
11
|
+
import java.util.Map;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Middleware that catches all exceptions during node execution
|
|
15
|
+
* and converts them to structured NodeExceptions.
|
|
16
|
+
* <p>
|
|
17
|
+
* Structured exceptions ({@link BlokError}, {@link NodeException}) are
|
|
18
|
+
* re-thrown as-is so the registry / gRPC servicer can serialize them
|
|
19
|
+
* losslessly. All other exceptions are wrapped in an EXECUTION
|
|
20
|
+
* NodeException with the stack trace captured in the details.
|
|
21
|
+
*/
|
|
22
|
+
public class RecoveryMiddleware implements Middleware {
|
|
23
|
+
|
|
24
|
+
@Override
|
|
25
|
+
public NodeHandler wrap(NodeHandler next) {
|
|
26
|
+
return (ctx, config) -> {
|
|
27
|
+
try {
|
|
28
|
+
return next.execute(ctx, config);
|
|
29
|
+
} catch (BlokError e) {
|
|
30
|
+
// Master plan §17 BlokError passes through verbatim — the
|
|
31
|
+
// registry catches it directly and stashes the typed instance
|
|
32
|
+
// on `ExecutionResult.errors` for the gRPC servicer.
|
|
33
|
+
throw e;
|
|
34
|
+
} catch (NodeException e) {
|
|
35
|
+
// Legacy structured exceptions pass through as-is too.
|
|
36
|
+
throw e;
|
|
37
|
+
} catch (Exception e) {
|
|
38
|
+
// Capture stack trace
|
|
39
|
+
StringWriter sw = new StringWriter();
|
|
40
|
+
e.printStackTrace(new PrintWriter(sw));
|
|
41
|
+
|
|
42
|
+
Map<String, Object> details = new HashMap<>();
|
|
43
|
+
details.put("stack", sw.toString());
|
|
44
|
+
|
|
45
|
+
String message = e.getMessage() != null
|
|
46
|
+
? "recovered: " + e.getMessage()
|
|
47
|
+
: "recovered: " + e.getClass().getSimpleName();
|
|
48
|
+
|
|
49
|
+
throw new NodeException(message, 500, ErrorCategory.EXECUTION, details, e);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
package com.blok.blok.node;
|
|
2
|
+
|
|
3
|
+
import com.blok.blok.types.Context;
|
|
4
|
+
|
|
5
|
+
import java.util.Map;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Interface that all Blok workflow nodes must implement.
|
|
9
|
+
* <p>
|
|
10
|
+
* Nodes receive the workflow context and node-specific configuration,
|
|
11
|
+
* execute their logic, and return data or throw an exception.
|
|
12
|
+
* <p>
|
|
13
|
+
* Example:
|
|
14
|
+
* <pre>{@code
|
|
15
|
+
* public class MyNode implements NodeHandler {
|
|
16
|
+
* @Override
|
|
17
|
+
* public Object execute(Context ctx, Map<String, Object> config) throws Exception {
|
|
18
|
+
* String name = "World";
|
|
19
|
+
* Map<String, Object> body = ctx.getRequest().bodyMap();
|
|
20
|
+
* if (body != null && body.get("name") instanceof String s) {
|
|
21
|
+
* name = s;
|
|
22
|
+
* }
|
|
23
|
+
* return Map.of("message", "Hello, " + name + "!");
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
* }</pre>
|
|
27
|
+
*/
|
|
28
|
+
@FunctionalInterface
|
|
29
|
+
public interface NodeHandler {
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Executes the node logic.
|
|
33
|
+
*
|
|
34
|
+
* @param ctx the workflow execution context
|
|
35
|
+
* @param config the node-specific configuration map
|
|
36
|
+
* @return the execution result data (any serializable object)
|
|
37
|
+
* @throws Exception if the execution fails
|
|
38
|
+
*/
|
|
39
|
+
Object execute(Context ctx, Map<String, Object> config) throws Exception;
|
|
40
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
package com.blok.blok.node;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Implemented by typed nodes ({@link TypedNode}) to expose a description + JSON
|
|
5
|
+
* Schema for the node catalog (GET /__blok/nodes) via gRPC ListNodes
|
|
6
|
+
* (SPEC-B P4). Legacy {@link NodeHandler} nodes do not implement it.
|
|
7
|
+
*/
|
|
8
|
+
public interface NodeReflector {
|
|
9
|
+
|
|
10
|
+
/** Human-readable description, surfaced in the node catalog. */
|
|
11
|
+
String description();
|
|
12
|
+
|
|
13
|
+
/** JSON Schema for the input, or {@code null}. */
|
|
14
|
+
String inputSchemaJson();
|
|
15
|
+
|
|
16
|
+
/** JSON Schema for the output, or {@code null}. */
|
|
17
|
+
String outputSchemaJson();
|
|
18
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
package com.blok.blok.node;
|
|
2
|
+
|
|
3
|
+
import com.blok.blok.errors.BlokError;
|
|
4
|
+
import com.blok.blok.errors.NodeException;
|
|
5
|
+
import com.blok.blok.middleware.Middleware;
|
|
6
|
+
import com.blok.blok.types.*;
|
|
7
|
+
|
|
8
|
+
import java.util.*;
|
|
9
|
+
import java.util.concurrent.ConcurrentHashMap;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Manages registered node handlers and executes them.
|
|
13
|
+
* Thread-safe: uses ConcurrentHashMap for node storage.
|
|
14
|
+
*/
|
|
15
|
+
public class NodeRegistry {
|
|
16
|
+
|
|
17
|
+
private final ConcurrentHashMap<String, NodeHandler> nodes = new ConcurrentHashMap<>();
|
|
18
|
+
private final List<Middleware> middlewares = Collections.synchronizedList(new ArrayList<>());
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Registers a node handler with the given name.
|
|
22
|
+
*
|
|
23
|
+
* @param name the node name
|
|
24
|
+
* @param handler the node handler implementation
|
|
25
|
+
* @throws IllegalArgumentException if name or handler is null
|
|
26
|
+
*/
|
|
27
|
+
public void register(String name, NodeHandler handler) {
|
|
28
|
+
if (name == null || name.isBlank()) {
|
|
29
|
+
throw new IllegalArgumentException("node name must not be null or blank");
|
|
30
|
+
}
|
|
31
|
+
if (handler == null) {
|
|
32
|
+
throw new IllegalArgumentException("handler must not be null");
|
|
33
|
+
}
|
|
34
|
+
nodes.put(name, handler);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Adds middleware to be applied to all node executions.
|
|
39
|
+
*
|
|
40
|
+
* @param middleware the middleware to add
|
|
41
|
+
*/
|
|
42
|
+
public void use(Middleware middleware) {
|
|
43
|
+
if (middleware == null) {
|
|
44
|
+
throw new IllegalArgumentException("middleware must not be null");
|
|
45
|
+
}
|
|
46
|
+
middlewares.add(middleware);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Retrieves a node handler by name.
|
|
51
|
+
*
|
|
52
|
+
* @param name the node name
|
|
53
|
+
* @return the handler, or null if not found
|
|
54
|
+
*/
|
|
55
|
+
public NodeHandler get(String name) {
|
|
56
|
+
if (name == null) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return nodes.get(name);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Returns the names of all registered nodes.
|
|
64
|
+
*
|
|
65
|
+
* @return a list of node names
|
|
66
|
+
*/
|
|
67
|
+
public List<String> nodeNames() {
|
|
68
|
+
return new ArrayList<>(nodes.keySet());
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Executes a node by processing an ExecutionRequest.
|
|
73
|
+
* Applies all registered middleware and captures timing/memory metrics.
|
|
74
|
+
*
|
|
75
|
+
* @param request the execution request
|
|
76
|
+
* @return the execution result (never null)
|
|
77
|
+
*/
|
|
78
|
+
public ExecutionResult execute(ExecutionRequest request) {
|
|
79
|
+
if (request == null) {
|
|
80
|
+
return ExecutionResult.error("execution request must not be null");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
long startNanos = System.nanoTime();
|
|
84
|
+
Runtime runtime = Runtime.getRuntime();
|
|
85
|
+
long memBefore = runtime.totalMemory() - runtime.freeMemory();
|
|
86
|
+
|
|
87
|
+
// Look up handler
|
|
88
|
+
NodeConfig nodeConfig = request.getNode();
|
|
89
|
+
if (nodeConfig == null || nodeConfig.getName() == null) {
|
|
90
|
+
return ExecutionResult.error("node configuration is missing");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
String nodeName = nodeConfig.getName();
|
|
94
|
+
NodeHandler handler = get(nodeName);
|
|
95
|
+
if (handler == null) {
|
|
96
|
+
return ExecutionResult.error("node '" + nodeName + "' not found");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Apply middleware chain (outermost first)
|
|
100
|
+
NodeHandler wrapped = handler;
|
|
101
|
+
List<Middleware> mws;
|
|
102
|
+
synchronized (middlewares) {
|
|
103
|
+
mws = new ArrayList<>(middlewares);
|
|
104
|
+
}
|
|
105
|
+
for (int i = mws.size() - 1; i >= 0; i--) {
|
|
106
|
+
wrapped = mws.get(i).wrap(wrapped);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Execute
|
|
110
|
+
Context ctx = request.getContext();
|
|
111
|
+
if (ctx == null) {
|
|
112
|
+
ctx = new Context();
|
|
113
|
+
}
|
|
114
|
+
Map<String, Object> config = (nodeConfig.getConfig() != null)
|
|
115
|
+
? nodeConfig.getConfig()
|
|
116
|
+
: new HashMap<>();
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
Object data = wrapped.execute(ctx, config);
|
|
120
|
+
|
|
121
|
+
// Calculate metrics
|
|
122
|
+
long durationNanos = System.nanoTime() - startNanos;
|
|
123
|
+
double durationMs = durationNanos / 1_000_000.0;
|
|
124
|
+
long memAfter = runtime.totalMemory() - runtime.freeMemory();
|
|
125
|
+
long memUsed = Math.max(0, memAfter - memBefore);
|
|
126
|
+
|
|
127
|
+
ExecutionMetrics metrics = new ExecutionMetrics(durationMs, null, memUsed);
|
|
128
|
+
ExecutionResult result = ExecutionResult.success(data).withMetrics(metrics);
|
|
129
|
+
|
|
130
|
+
// Include context vars so the runner can propagate them downstream
|
|
131
|
+
if (ctx.getVars() != null && !ctx.getVars().isEmpty()) {
|
|
132
|
+
result.setVars(ctx.getVars());
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return result;
|
|
136
|
+
|
|
137
|
+
} catch (BlokError e) {
|
|
138
|
+
// Structured BlokError path (master plan §17): pass the instance
|
|
139
|
+
// through verbatim so the gRPC servicer can serialize every field
|
|
140
|
+
// (category, severity, remediation, retryable hints, cause chain,
|
|
141
|
+
// context snapshot, etc.) into the proto NodeError.
|
|
142
|
+
long durationNanos = System.nanoTime() - startNanos;
|
|
143
|
+
double durationMs = durationNanos / 1_000_000.0;
|
|
144
|
+
long memAfter = runtime.totalMemory() - runtime.freeMemory();
|
|
145
|
+
long memUsed = Math.max(0, memAfter - memBefore);
|
|
146
|
+
|
|
147
|
+
ExecutionMetrics metrics = new ExecutionMetrics(durationMs, null, memUsed);
|
|
148
|
+
|
|
149
|
+
ExecutionResult result = new ExecutionResult();
|
|
150
|
+
result.setSuccess(false);
|
|
151
|
+
result.setErrors(e);
|
|
152
|
+
result.setMetrics(metrics);
|
|
153
|
+
return result;
|
|
154
|
+
|
|
155
|
+
} catch (NodeException e) {
|
|
156
|
+
long durationNanos = System.nanoTime() - startNanos;
|
|
157
|
+
double durationMs = durationNanos / 1_000_000.0;
|
|
158
|
+
long memAfter = runtime.totalMemory() - runtime.freeMemory();
|
|
159
|
+
long memUsed = Math.max(0, memAfter - memBefore);
|
|
160
|
+
|
|
161
|
+
ExecutionMetrics metrics = new ExecutionMetrics(durationMs, null, memUsed);
|
|
162
|
+
|
|
163
|
+
Map<String, Object> errorMap = new HashMap<>();
|
|
164
|
+
errorMap.put("message", e.getMessage());
|
|
165
|
+
errorMap.put("code", e.getCode());
|
|
166
|
+
errorMap.put("category", e.getCategory().name());
|
|
167
|
+
if (e.getDetails() != null && !e.getDetails().isEmpty()) {
|
|
168
|
+
errorMap.put("details", e.getDetails());
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
ExecutionResult result = new ExecutionResult();
|
|
172
|
+
result.setSuccess(false);
|
|
173
|
+
result.setErrors(errorMap);
|
|
174
|
+
result.setMetrics(metrics);
|
|
175
|
+
return result;
|
|
176
|
+
|
|
177
|
+
} catch (Exception e) {
|
|
178
|
+
long durationNanos = System.nanoTime() - startNanos;
|
|
179
|
+
double durationMs = durationNanos / 1_000_000.0;
|
|
180
|
+
long memAfter = runtime.totalMemory() - runtime.freeMemory();
|
|
181
|
+
long memUsed = Math.max(0, memAfter - memBefore);
|
|
182
|
+
|
|
183
|
+
ExecutionMetrics metrics = new ExecutionMetrics(durationMs, null, memUsed);
|
|
184
|
+
|
|
185
|
+
Map<String, String> errorMap = new HashMap<>();
|
|
186
|
+
errorMap.put("message", e.getMessage() != null ? e.getMessage() : "unknown error");
|
|
187
|
+
|
|
188
|
+
ExecutionResult result = new ExecutionResult();
|
|
189
|
+
result.setSuccess(false);
|
|
190
|
+
result.setErrors(errorMap);
|
|
191
|
+
result.setMetrics(metrics);
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Returns the health status of the registry.
|
|
198
|
+
*
|
|
199
|
+
* @param version the runtime version string
|
|
200
|
+
* @return health status
|
|
201
|
+
*/
|
|
202
|
+
public HealthStatus health(String version) {
|
|
203
|
+
return new HealthStatus("healthy", version, nodeNames());
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
package com.blok.blok.node;
|
|
2
|
+
|
|
3
|
+
import com.blok.blok.errors.BlokError;
|
|
4
|
+
import com.blok.blok.types.Context;
|
|
5
|
+
import com.google.gson.Gson;
|
|
6
|
+
import com.google.gson.JsonArray;
|
|
7
|
+
import com.google.gson.JsonObject;
|
|
8
|
+
|
|
9
|
+
import java.lang.reflect.Field;
|
|
10
|
+
import java.lang.reflect.Modifier;
|
|
11
|
+
import java.util.List;
|
|
12
|
+
import java.util.Map;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Typed node base (SPEC-B P4) — the Java equivalent of the TypeScript
|
|
16
|
+
* {@code defineNode} / Python {@code @node} / Rust {@code TypedNode} / Go
|
|
17
|
+
* {@code DefineNode}. Declare typed {@code I}/{@code O} types (e.g. records) and
|
|
18
|
+
* implement {@link #run}; the SDK converts the raw config into the typed input
|
|
19
|
+
* BEFORE running (a type mismatch → structured {@link BlokError}, HTTP 400),
|
|
20
|
+
* and reflects both JSON Schemas for the catalog — instead of a raw
|
|
21
|
+
* {@code Map<String, Object>}.
|
|
22
|
+
*
|
|
23
|
+
* <p>Register like any handler:
|
|
24
|
+
* {@code registry.register("@acme/search", new SearchNode());}
|
|
25
|
+
*
|
|
26
|
+
* <pre>{@code
|
|
27
|
+
* public record SearchInput(String query, int limit) {}
|
|
28
|
+
* public record SearchOutput(List<String> results, int count) {}
|
|
29
|
+
*
|
|
30
|
+
* public final class SearchNode extends TypedNode<SearchInput, SearchOutput> {
|
|
31
|
+
* public String name() { return "@acme/search"; }
|
|
32
|
+
* public String description() { return "Full-text search"; }
|
|
33
|
+
* protected Class<SearchInput> inputClass() { return SearchInput.class; }
|
|
34
|
+
* protected Class<?> outputClass() { return SearchOutput.class; }
|
|
35
|
+
* protected SearchOutput run(Context ctx, SearchInput input) {
|
|
36
|
+
* var rows = Collections.nCopies(input.limit(), input.query());
|
|
37
|
+
* return new SearchOutput(rows, rows.size());
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* }</pre>
|
|
41
|
+
*
|
|
42
|
+
* @param <I> the typed input
|
|
43
|
+
* @param <O> the typed output
|
|
44
|
+
*/
|
|
45
|
+
public abstract class TypedNode<I, O> implements NodeHandler, NodeReflector {
|
|
46
|
+
|
|
47
|
+
private static final Gson GSON = new Gson();
|
|
48
|
+
|
|
49
|
+
/** The node's registered name (e.g. {@code "@acme/search"}). */
|
|
50
|
+
public abstract String name();
|
|
51
|
+
|
|
52
|
+
/** {@inheritDoc} Human-readable description; override to set. */
|
|
53
|
+
@Override
|
|
54
|
+
public String description() {
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** The class of the typed input (e.g. {@code SearchInput.class}). */
|
|
59
|
+
protected abstract Class<I> inputClass();
|
|
60
|
+
|
|
61
|
+
/** The class of the typed output, for schema reflection; {@code null} to skip. */
|
|
62
|
+
protected Class<?> outputClass() {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Run the node with a VALIDATED, typed input. */
|
|
67
|
+
protected abstract O run(Context ctx, I input) throws Exception;
|
|
68
|
+
|
|
69
|
+
@Override
|
|
70
|
+
public Object execute(Context ctx, Map<String, Object> config) throws Exception {
|
|
71
|
+
I input;
|
|
72
|
+
try {
|
|
73
|
+
input = GSON.fromJson(GSON.toJsonTree(config), inputClass());
|
|
74
|
+
} catch (RuntimeException e) {
|
|
75
|
+
throw BlokError.validation()
|
|
76
|
+
.code("NODE_INPUT_VALIDATION")
|
|
77
|
+
.message("Input validation failed for node '" + name() + "': " + e.getMessage())
|
|
78
|
+
.httpStatus(400)
|
|
79
|
+
.node(name())
|
|
80
|
+
.build();
|
|
81
|
+
}
|
|
82
|
+
return run(ctx, input);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@Override
|
|
86
|
+
public String inputSchemaJson() {
|
|
87
|
+
return reflectSchema(inputClass());
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@Override
|
|
91
|
+
public String outputSchemaJson() {
|
|
92
|
+
Class<?> out = outputClass();
|
|
93
|
+
return out == null ? null : reflectSchema(out);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Build a minimal JSON Schema from the type's declared instance fields. */
|
|
97
|
+
private static String reflectSchema(Class<?> type) {
|
|
98
|
+
try {
|
|
99
|
+
JsonObject schema = new JsonObject();
|
|
100
|
+
schema.addProperty("type", "object");
|
|
101
|
+
JsonObject properties = new JsonObject();
|
|
102
|
+
JsonArray required = new JsonArray();
|
|
103
|
+
for (Field field : type.getDeclaredFields()) {
|
|
104
|
+
if (Modifier.isStatic(field.getModifiers())) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
JsonObject property = new JsonObject();
|
|
108
|
+
property.addProperty("type", jsonType(field.getType()));
|
|
109
|
+
properties.add(field.getName(), property);
|
|
110
|
+
if (field.getType().isPrimitive()) {
|
|
111
|
+
required.add(field.getName());
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
schema.add("properties", properties);
|
|
115
|
+
if (required.size() > 0) {
|
|
116
|
+
schema.add("required", required);
|
|
117
|
+
}
|
|
118
|
+
return GSON.toJson(schema);
|
|
119
|
+
} catch (RuntimeException e) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private static String jsonType(Class<?> type) {
|
|
125
|
+
if (type == int.class || type == Integer.class || type == long.class || type == Long.class
|
|
126
|
+
|| type == short.class || type == Short.class) {
|
|
127
|
+
return "integer";
|
|
128
|
+
}
|
|
129
|
+
if (type == double.class || type == Double.class || type == float.class || type == Float.class) {
|
|
130
|
+
return "number";
|
|
131
|
+
}
|
|
132
|
+
if (type == boolean.class || type == Boolean.class) {
|
|
133
|
+
return "boolean";
|
|
134
|
+
}
|
|
135
|
+
if (type == String.class) {
|
|
136
|
+
return "string";
|
|
137
|
+
}
|
|
138
|
+
if (type.isArray() || List.class.isAssignableFrom(type)) {
|
|
139
|
+
return "array";
|
|
140
|
+
}
|
|
141
|
+
return "object";
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
package com.blok.blok.nodes;
|
|
2
|
+
|
|
3
|
+
import com.blok.blok.errors.NodeException;
|
|
4
|
+
import com.blok.blok.node.NodeHandler;
|
|
5
|
+
import com.blok.blok.types.Context;
|
|
6
|
+
import com.google.gson.Gson;
|
|
7
|
+
import com.google.gson.JsonSyntaxException;
|
|
8
|
+
|
|
9
|
+
import java.net.URI;
|
|
10
|
+
import java.net.http.HttpClient;
|
|
11
|
+
import java.net.http.HttpRequest;
|
|
12
|
+
import java.net.http.HttpResponse;
|
|
13
|
+
import java.time.Duration;
|
|
14
|
+
import java.util.HashMap;
|
|
15
|
+
import java.util.Map;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Node that makes HTTP requests to external APIs.
|
|
19
|
+
* <p>
|
|
20
|
+
* Config:
|
|
21
|
+
* <ul>
|
|
22
|
+
* <li>url (string, required) - The URL to call</li>
|
|
23
|
+
* <li>method (string, optional) - HTTP method (default: "GET")</li>
|
|
24
|
+
* <li>timeout (number, optional) - Timeout in seconds (default: 10)</li>
|
|
25
|
+
* <li>headers (map, optional) - Additional request headers</li>
|
|
26
|
+
* </ul>
|
|
27
|
+
* Input (request body):
|
|
28
|
+
* <ul>
|
|
29
|
+
* <li>body (any, optional) - Request body for POST/PUT/PATCH</li>
|
|
30
|
+
* </ul>
|
|
31
|
+
* Output:
|
|
32
|
+
* <ul>
|
|
33
|
+
* <li>status (number) - HTTP status code</li>
|
|
34
|
+
* <li>data (any) - Parsed response body</li>
|
|
35
|
+
* <li>headers (map) - Response headers</li>
|
|
36
|
+
* </ul>
|
|
37
|
+
*/
|
|
38
|
+
public class ApiCallNode implements NodeHandler {
|
|
39
|
+
|
|
40
|
+
private static final Gson GSON = new Gson();
|
|
41
|
+
|
|
42
|
+
@Override
|
|
43
|
+
public Object execute(Context ctx, Map<String, Object> config) throws Exception {
|
|
44
|
+
if (config == null) {
|
|
45
|
+
throw NodeException.configuration("config is required for api-call node");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Get URL from config (required)
|
|
49
|
+
Object urlVal = config.get("url");
|
|
50
|
+
if (!(urlVal instanceof String url) || url.isEmpty()) {
|
|
51
|
+
throw NodeException.configuration("'url' is required in node config");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Get method from config, default to GET
|
|
55
|
+
String method = "GET";
|
|
56
|
+
Object methodVal = config.get("method");
|
|
57
|
+
if (methodVal instanceof String m && !m.isEmpty()) {
|
|
58
|
+
method = m.toUpperCase();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Get timeout from config, default to 10 seconds
|
|
62
|
+
int timeout = 10;
|
|
63
|
+
Object timeoutVal = config.get("timeout");
|
|
64
|
+
if (timeoutVal instanceof Number n && n.intValue() > 0) {
|
|
65
|
+
timeout = n.intValue();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Build the HTTP request
|
|
69
|
+
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
|
|
70
|
+
.uri(URI.create(url))
|
|
71
|
+
.timeout(Duration.ofSeconds(timeout));
|
|
72
|
+
|
|
73
|
+
// Set custom headers from config
|
|
74
|
+
Object headersVal = config.get("headers");
|
|
75
|
+
if (headersVal instanceof Map<?, ?> headersMap) {
|
|
76
|
+
for (Map.Entry<?, ?> entry : headersMap.entrySet()) {
|
|
77
|
+
if (entry.getKey() instanceof String key && entry.getValue() instanceof String value) {
|
|
78
|
+
requestBuilder.header(key, value);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Prepare request body
|
|
84
|
+
String requestBody = null;
|
|
85
|
+
Map<String, Object> body = ctx.getRequest().bodyMap();
|
|
86
|
+
if (body != null && body.containsKey("body") && body.get("body") != null) {
|
|
87
|
+
requestBody = GSON.toJson(body.get("body"));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Set method and body
|
|
91
|
+
switch (method) {
|
|
92
|
+
case "POST" -> {
|
|
93
|
+
requestBuilder.header("Content-Type", "application/json");
|
|
94
|
+
requestBuilder.POST(HttpRequest.BodyPublishers.ofString(
|
|
95
|
+
requestBody != null ? requestBody : ""));
|
|
96
|
+
}
|
|
97
|
+
case "PUT" -> {
|
|
98
|
+
requestBuilder.header("Content-Type", "application/json");
|
|
99
|
+
requestBuilder.PUT(HttpRequest.BodyPublishers.ofString(
|
|
100
|
+
requestBody != null ? requestBody : ""));
|
|
101
|
+
}
|
|
102
|
+
case "DELETE" -> requestBuilder.DELETE();
|
|
103
|
+
default -> requestBuilder.GET();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Execute the request
|
|
107
|
+
try {
|
|
108
|
+
HttpClient client = HttpClient.newBuilder()
|
|
109
|
+
.connectTimeout(Duration.ofSeconds(timeout))
|
|
110
|
+
.build();
|
|
111
|
+
|
|
112
|
+
HttpResponse<String> response = client.send(
|
|
113
|
+
requestBuilder.build(),
|
|
114
|
+
HttpResponse.BodyHandlers.ofString());
|
|
115
|
+
|
|
116
|
+
// Try to parse response as JSON, fall back to string
|
|
117
|
+
Object responseData;
|
|
118
|
+
try {
|
|
119
|
+
responseData = GSON.fromJson(response.body(), Object.class);
|
|
120
|
+
} catch (JsonSyntaxException e) {
|
|
121
|
+
responseData = response.body();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Collect response headers
|
|
125
|
+
Map<String, String> responseHeaders = new HashMap<>();
|
|
126
|
+
response.headers().map().forEach((key, values) -> {
|
|
127
|
+
if (!values.isEmpty()) {
|
|
128
|
+
responseHeaders.put(key, values.get(0));
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
Map<String, Object> result = new HashMap<>();
|
|
133
|
+
result.put("status", response.statusCode());
|
|
134
|
+
result.put("data", responseData);
|
|
135
|
+
result.put("headers", responseHeaders);
|
|
136
|
+
return result;
|
|
137
|
+
|
|
138
|
+
} catch (Exception e) {
|
|
139
|
+
if (e instanceof NodeException) {
|
|
140
|
+
throw e;
|
|
141
|
+
}
|
|
142
|
+
throw NodeException.network("request to " + url + " failed: " + e.getMessage(), e);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|