blokctl 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/create/project.d.ts +3 -0
- package/dist/commands/create/project.js +166 -21
- package/dist/commands/create/utils/Examples.d.ts +2 -2
- package/dist/commands/create/utils/Examples.js +9 -3
- package/dist/commands/dev/index.js +13 -1
- package/dist/commands/runtime/add.js +92 -29
- package/dist/commands/runtime/index.js +1 -0
- 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/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/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/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/dist/services/runtime-detector.d.ts +2 -0
- package/dist/services/runtime-detector.js +35 -11
- package/dist/services/runtime-setup.d.ts +1 -0
- package/dist/services/runtime-setup.js +17 -7
- package/package.json +4 -4
|
@@ -2,6 +2,9 @@ import type { OptionValues } from "commander";
|
|
|
2
2
|
export declare function createProject(opts: OptionValues, version: string, currentPath?: boolean, localRepoPath?: string): Promise<void>;
|
|
3
3
|
export declare function generateSharedNodesFile(_triggers: string[], _repoSource: string): string;
|
|
4
4
|
export declare function generateSharedWorkflowsFile(triggers: string[], runtimeKinds?: string[], examples?: boolean): string;
|
|
5
|
+
export declare function generateTriggerEntryFile(triggerKind: string, selectedTriggers?: string[]): string;
|
|
6
|
+
export declare function generateCronExampleWorkflowFile(): string;
|
|
7
|
+
export declare function generateCronServerFile(): string;
|
|
5
8
|
export declare function updateQueueProvider(triggerDestDir: string, provider: string, explicit: boolean): void;
|
|
6
9
|
export declare function getProviderDependencies(triggers: string[], pubsubProvider: string, queueProvider: string, explicitQueueProvider?: boolean): Record<string, string>;
|
|
7
10
|
export declare function getProviderEnvVars(triggers: string[], pubsubProvider: string, queueProvider: string, explicitQueueProvider?: boolean): string;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import child_process from "node:child_process";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
4
5
|
import util from "node:util";
|
|
5
6
|
import * as p from "@clack/prompts";
|
|
6
7
|
import figlet from "figlet";
|
|
@@ -14,7 +15,7 @@ import { rewriteObservabilityEnvBlock } from "../../services/observability-mutat
|
|
|
14
15
|
import { manager as pm } from "../../services/package-manager.js";
|
|
15
16
|
import { detectRuntimes } from "../../services/runtime-detector.js";
|
|
16
17
|
import { createTriggerConfig, generateRuntimeEnvVars, generateSupervisordConfig, generateTriggerEnvVars, generateTriggerSupervisordConfig, setupRuntime, writeProjectConfig, } from "../../services/runtime-setup.js";
|
|
17
|
-
import { computeDefaultConstraint } from "../../services/semver-utils.js";
|
|
18
|
+
import { computeDefaultConstraint, formatVersionMismatch, satisfiesConstraint } from "../../services/semver-utils.js";
|
|
18
19
|
import { resolveObservabilitySelection } from "../observability/apply.js";
|
|
19
20
|
import { OBSERVABILITY_MODULE_IDS, allObservabilityModules, getObservabilityModule, } from "../observability/descriptor.js";
|
|
20
21
|
import { agents_md, claude_md, examples_url, node_file, package_dependencies, package_dev_dependencies, } from "./utils/Examples.js";
|
|
@@ -22,7 +23,8 @@ const exec = util.promisify(child_process.exec);
|
|
|
22
23
|
const HOME_DIR = `${os.homedir()}/.blok`;
|
|
23
24
|
const GITHUB_REPO_LOCAL = `${HOME_DIR}/blok`;
|
|
24
25
|
const GITHUB_REPO_REMOTE = "https://github.com/well-prado/blok.git";
|
|
25
|
-
const GITHUB_REPO_RELEASE_TAG = "v1.
|
|
26
|
+
const GITHUB_REPO_RELEASE_TAG = "v1.4.0";
|
|
27
|
+
const BUNDLED_SCAFFOLD_REPO = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../scaffold-repo");
|
|
26
28
|
const RUNTIME_HELLO_EXAMPLES = {
|
|
27
29
|
go: "runtime-go-hello.ts",
|
|
28
30
|
rust: "runtime-rust-hello.ts",
|
|
@@ -55,7 +57,7 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
55
57
|
let examples = opts.examples ?? false;
|
|
56
58
|
let selectedRuntimeKinds = opts.runtimes ? parseCommaSeparated(opts.runtimes) : ["node"];
|
|
57
59
|
let selectedManager = opts.packageManager || "npm";
|
|
58
|
-
let pubsubProvider = opts.pubsubProvider || "
|
|
60
|
+
let pubsubProvider = opts.pubsubProvider || "nats";
|
|
59
61
|
let queueProvider = opts.queueProvider || "kafka";
|
|
60
62
|
let explicitQueueProvider = Boolean(opts.queueProvider);
|
|
61
63
|
let selectedObsTier = opts.obsStack ? parseObsTier(opts.obsStack) : "none";
|
|
@@ -154,6 +156,7 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
154
156
|
? p.select({
|
|
155
157
|
message: "Select Pub/Sub provider",
|
|
156
158
|
options: [
|
|
159
|
+
{ label: "NATS (local, zero cloud setup)", value: "nats" },
|
|
157
160
|
{ label: "Google Cloud Pub/Sub", value: "gcp" },
|
|
158
161
|
{ label: "AWS SNS/SQS", value: "aws" },
|
|
159
162
|
{ label: "Azure Service Bus", value: "azure" },
|
|
@@ -212,7 +215,7 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
212
215
|
});
|
|
213
216
|
projectName = blokctlProject.projectName;
|
|
214
217
|
selectedTriggers = blokctlProject.triggers;
|
|
215
|
-
pubsubProvider = blokctlProject.pubsubProvider || "
|
|
218
|
+
pubsubProvider = blokctlProject.pubsubProvider || "nats";
|
|
216
219
|
explicitQueueProvider = blokctlProject.queueProvider != null;
|
|
217
220
|
queueProvider = blokctlProject.queueProvider || "kafka";
|
|
218
221
|
selectedRuntimeKinds = blokctlProject.runtimes;
|
|
@@ -278,14 +281,19 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
278
281
|
const dirPath = !currentPath ? path.join(process.cwd(), projectName) : process.cwd();
|
|
279
282
|
if (!skipPrompts)
|
|
280
283
|
s.message("Gathering project files");
|
|
281
|
-
|
|
284
|
+
let repoSource;
|
|
282
285
|
if (localRepoPath) {
|
|
286
|
+
repoSource = path.resolve(localRepoPath);
|
|
283
287
|
if (!fsExtra.existsSync(repoSource)) {
|
|
284
288
|
throw new Error(`Local repo path not found: ${repoSource}`);
|
|
285
289
|
}
|
|
286
290
|
console.log(color.dim(` Using local repo: ${repoSource}`));
|
|
287
291
|
}
|
|
292
|
+
else if (fsExtra.existsSync(BUNDLED_SCAFFOLD_REPO)) {
|
|
293
|
+
repoSource = BUNDLED_SCAFFOLD_REPO;
|
|
294
|
+
}
|
|
288
295
|
else {
|
|
296
|
+
repoSource = GITHUB_REPO_LOCAL;
|
|
289
297
|
const githubLocalExists = fsExtra.existsSync(GITHUB_REPO_LOCAL);
|
|
290
298
|
if (githubLocalExists) {
|
|
291
299
|
fsExtra.removeSync(GITHUB_REPO_LOCAL);
|
|
@@ -418,7 +426,10 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
418
426
|
fsExtra.copySync(`${triggerSrcDir}/AppRoutes.ts`, `${triggerDestDir}/AppRoutes.ts`);
|
|
419
427
|
}
|
|
420
428
|
if (fsExtra.existsSync(`${triggerSrcDir}/workflows`)) {
|
|
421
|
-
|
|
429
|
+
const devFixtures = /\/(countries-helper|countries-cats-helper|empty)\.ts$|\/workflows\/eval(\/|$)/;
|
|
430
|
+
fsExtra.copySync(`${triggerSrcDir}/workflows`, `${dirPath}/src/workflows/${triggerKind}`, {
|
|
431
|
+
filter: (src) => !devFixtures.test(src),
|
|
432
|
+
});
|
|
422
433
|
}
|
|
423
434
|
}
|
|
424
435
|
}
|
|
@@ -453,6 +464,14 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
453
464
|
fsExtra.ensureDirSync(wsServerDir);
|
|
454
465
|
fsExtra.writeFileSync(`${wsServerDir}/WSServer.ts`, generateWSServerFile());
|
|
455
466
|
}
|
|
467
|
+
if (selectedTriggers.includes("cron")) {
|
|
468
|
+
const cronServerDir = `${dirPath}/src/triggers/cron/runner`;
|
|
469
|
+
fsExtra.ensureDirSync(cronServerDir);
|
|
470
|
+
fsExtra.writeFileSync(`${cronServerDir}/CronServer.ts`, generateCronServerFile());
|
|
471
|
+
const cronWorkflowDir = `${dirPath}/src/workflows/cron`;
|
|
472
|
+
fsExtra.ensureDirSync(cronWorkflowDir);
|
|
473
|
+
fsExtra.writeFileSync(`${cronWorkflowDir}/heartbeat.ts`, generateCronExampleWorkflowFile());
|
|
474
|
+
}
|
|
456
475
|
for (const triggerKind of selectedTriggers) {
|
|
457
476
|
const triggerNodesDir = `${repoSource}/triggers/${triggerKind}/src/nodes`;
|
|
458
477
|
if (fsExtra.existsSync(triggerNodesDir)) {
|
|
@@ -500,13 +519,7 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
500
519
|
fsExtra.ensureDirSync(`${dirPath}/infra/milvus`);
|
|
501
520
|
fsExtra.copySync(`${repoSource}/infra/development`, `${dirPath}/infra/postgresql`);
|
|
502
521
|
fsExtra.copySync(`${repoSource}/infra/milvus`, `${dirPath}/infra/milvus`);
|
|
503
|
-
|
|
504
|
-
const examplesNodesContent = needsHelpers
|
|
505
|
-
? node_file
|
|
506
|
-
.replace(`import type { NodeBase } from "@blokjs/shared";`, `import type { NodeBase } from "@blokjs/shared";\nimport { HELPER_NODES } from "@blokjs/helpers";`)
|
|
507
|
-
.replace(`} = {\n\t"@blokjs/api-call": ApiCall,`, `} = {\n\t...HELPER_NODES,\n\t"@blokjs/api-call": ApiCall,`)
|
|
508
|
-
: node_file;
|
|
509
|
-
fsExtra.writeFileSync(`${dirPath}/src/Nodes.ts`, examplesNodesContent);
|
|
522
|
+
fsExtra.writeFileSync(`${dirPath}/src/Nodes.ts`, node_file);
|
|
510
523
|
fsExtra.copySync(`${repoSource}/sdk`, `${dirPath}/public/sdk`);
|
|
511
524
|
const tsExamplesSrc = `${repoSource}/examples/ts-workflows`;
|
|
512
525
|
const tsExamplesDest = `${dirPath}/src/workflows/examples`;
|
|
@@ -551,7 +564,7 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
551
564
|
"@blokjs/trigger-worker": "triggers/worker",
|
|
552
565
|
"@blokjs/core": "core/core",
|
|
553
566
|
};
|
|
554
|
-
const BLOKJS_DEP_RANGE = "^1.
|
|
567
|
+
const BLOKJS_DEP_RANGE = "^1.4.0";
|
|
555
568
|
for (const depGroup of ["dependencies", "devDependencies", "peerDependencies"]) {
|
|
556
569
|
const deps = packageJsonContent[depGroup];
|
|
557
570
|
if (!deps)
|
|
@@ -636,6 +649,16 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
636
649
|
? `file:${path.resolve(repoSource, "triggers/worker")}`
|
|
637
650
|
: BLOKJS_DEP_RANGE;
|
|
638
651
|
}
|
|
652
|
+
if (selectedTriggers.includes("cron")) {
|
|
653
|
+
triggerPackageDeps["@blokjs/trigger-cron"] = localRepoPath
|
|
654
|
+
? `file:${path.resolve(repoSource, "triggers/cron")}`
|
|
655
|
+
: BLOKJS_DEP_RANGE;
|
|
656
|
+
}
|
|
657
|
+
if (selectedTriggers.includes("grpc")) {
|
|
658
|
+
triggerPackageDeps["@blokjs/trigger-grpc"] = localRepoPath
|
|
659
|
+
? `file:${path.resolve(repoSource, "triggers/grpc")}`
|
|
660
|
+
: BLOKJS_DEP_RANGE;
|
|
661
|
+
}
|
|
639
662
|
if (selectedTriggers.includes("sse")) {
|
|
640
663
|
const sseDeps = {
|
|
641
664
|
"@blokjs/api-call": localRepoPath
|
|
@@ -705,6 +728,14 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
705
728
|
const rt = detectedRuntimes.find((r) => r.kind === kind);
|
|
706
729
|
if (!rt)
|
|
707
730
|
continue;
|
|
731
|
+
if (rt.minVersion) {
|
|
732
|
+
const constraint = computeDefaultConstraint(rt.minVersion);
|
|
733
|
+
if (!rt.version || !satisfiesConstraint(rt.version, constraint)) {
|
|
734
|
+
console.log(`\n${formatVersionMismatch(rt.label, rt.version, constraint, rt.installHint)}`);
|
|
735
|
+
console.log(color.yellow(` Skipping ${rt.label} setup. After upgrading, add it with \`blokctl runtime add ${rt.kind}\`.\n`));
|
|
736
|
+
continue;
|
|
737
|
+
}
|
|
738
|
+
}
|
|
708
739
|
try {
|
|
709
740
|
const config = await setupRuntime(rt, repoSource, dirPath, s);
|
|
710
741
|
runtimeConfigs.push(config);
|
|
@@ -856,6 +887,7 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
856
887
|
s.stop(error.message);
|
|
857
888
|
if (skipPrompts)
|
|
858
889
|
console.log(error.message);
|
|
890
|
+
process.exitCode = 1;
|
|
859
891
|
}
|
|
860
892
|
}
|
|
861
893
|
export function generateSharedNodesFile(_triggers, _repoSource) {
|
|
@@ -902,23 +934,31 @@ export function generateSharedWorkflowsFile(triggers, runtimeKinds = [], example
|
|
|
902
934
|
}
|
|
903
935
|
else if (trigger === "sse") {
|
|
904
936
|
imports.push('import SSEStreamDemo from "./workflows/sse/events/stream-demo";');
|
|
905
|
-
workflowEntries.push('\t"sse-stream-demo": SSEStreamDemo,');
|
|
937
|
+
workflowEntries.push('\t"sse-stream-demo": await SSEStreamDemo,');
|
|
906
938
|
if (triggers.includes("http")) {
|
|
907
939
|
imports.push('import SSEPublishDemo from "./workflows/sse/events/publish-demo";');
|
|
908
|
-
workflowEntries.push('\t"sse-publish-demo": SSEPublishDemo,');
|
|
940
|
+
workflowEntries.push('\t"sse-publish-demo": await SSEPublishDemo,');
|
|
909
941
|
}
|
|
910
942
|
}
|
|
911
943
|
else if (trigger === "websocket") {
|
|
912
944
|
imports.push('import WSEchoDemo from "./workflows/websocket/events/echo-demo";');
|
|
913
|
-
workflowEntries.push('\t"ws-echo-demo": WSEchoDemo,');
|
|
945
|
+
workflowEntries.push('\t"ws-echo-demo": await WSEchoDemo,');
|
|
914
946
|
}
|
|
915
947
|
else if (trigger === "pubsub") {
|
|
916
948
|
imports.push('import OnPubSubMessage from "./workflows/pubsub/messages/on-message";');
|
|
917
|
-
workflowEntries.push('\t"on-pubsub-message": OnPubSubMessage,');
|
|
949
|
+
workflowEntries.push('\t"on-pubsub-message": await OnPubSubMessage,');
|
|
950
|
+
if (triggers.includes("http")) {
|
|
951
|
+
imports.push('import PublishOrder from "./workflows/pubsub/publish-order";');
|
|
952
|
+
workflowEntries.push('\t"publish-order": await PublishOrder,');
|
|
953
|
+
}
|
|
918
954
|
}
|
|
919
955
|
else if (trigger === "queue" || trigger === "worker") {
|
|
920
956
|
imports.push(`import ProcessJob from "./workflows/${trigger}/jobs/process-job";`);
|
|
921
|
-
workflowEntries.push('\t"process-job": ProcessJob,');
|
|
957
|
+
workflowEntries.push('\t"process-job": await ProcessJob,');
|
|
958
|
+
}
|
|
959
|
+
else if (trigger === "cron") {
|
|
960
|
+
imports.push('import CronHeartbeat from "./workflows/cron/heartbeat";');
|
|
961
|
+
workflowEntries.push('\t"cron-heartbeat": await CronHeartbeat,');
|
|
922
962
|
}
|
|
923
963
|
}
|
|
924
964
|
if (examples) {
|
|
@@ -948,7 +988,7 @@ ${entriesSection}
|
|
|
948
988
|
export default workflows;
|
|
949
989
|
`;
|
|
950
990
|
}
|
|
951
|
-
function generateTriggerEntryFile(triggerKind, selectedTriggers = [triggerKind]) {
|
|
991
|
+
export function generateTriggerEntryFile(triggerKind, selectedTriggers = [triggerKind]) {
|
|
952
992
|
if (triggerKind === "http") {
|
|
953
993
|
const sseAlsoSelected = selectedTriggers.includes("sse");
|
|
954
994
|
const wsAlsoSelected = selectedTriggers.includes("websocket");
|
|
@@ -1288,6 +1328,63 @@ export default class App {
|
|
|
1288
1328
|
if (process.env.DISABLE_TRIGGER_RUN !== "true") {
|
|
1289
1329
|
new App().run();
|
|
1290
1330
|
}
|
|
1331
|
+
`;
|
|
1332
|
+
}
|
|
1333
|
+
if (triggerKind === "cron") {
|
|
1334
|
+
return `import { DefaultLogger } from "@blokjs/runner";
|
|
1335
|
+
import { type Span, metrics, trace } from "@opentelemetry/api";
|
|
1336
|
+
import CronServer from "./runner/CronServer";
|
|
1337
|
+
|
|
1338
|
+
export default class App {
|
|
1339
|
+
private cronServer: CronServer = <CronServer>{};
|
|
1340
|
+
protected trigger_initializer = 0;
|
|
1341
|
+
protected initializer = 0;
|
|
1342
|
+
protected tracer = trace.getTracer(
|
|
1343
|
+
process.env.PROJECT_NAME || "trigger-cron-server",
|
|
1344
|
+
process.env.PROJECT_VERSION || "0.0.1",
|
|
1345
|
+
);
|
|
1346
|
+
private logger = new DefaultLogger();
|
|
1347
|
+
protected app_cold_start = metrics.getMeter("default").createGauge("initialization", {
|
|
1348
|
+
description: "Application cold start",
|
|
1349
|
+
});
|
|
1350
|
+
|
|
1351
|
+
constructor() {
|
|
1352
|
+
this.initializer = performance.now();
|
|
1353
|
+
this.cronServer = new CronServer();
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
async run() {
|
|
1357
|
+
this.tracer.startActiveSpan("initialization", async (span: Span) => {
|
|
1358
|
+
await this.cronServer.listen();
|
|
1359
|
+
this.initializer = performance.now() - this.initializer;
|
|
1360
|
+
|
|
1361
|
+
this.logger.log(\`Cron trigger initialized in \${(this.initializer).toFixed(2)}ms\`);
|
|
1362
|
+
this.app_cold_start.record(this.initializer, {
|
|
1363
|
+
pid: process.pid,
|
|
1364
|
+
env: process.env.NODE_ENV,
|
|
1365
|
+
app: process.env.APP_NAME,
|
|
1366
|
+
});
|
|
1367
|
+
span.end();
|
|
1368
|
+
});
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
if (process.env.DISABLE_TRIGGER_RUN !== "true") {
|
|
1373
|
+
new App().run();
|
|
1374
|
+
}
|
|
1375
|
+
`;
|
|
1376
|
+
}
|
|
1377
|
+
if (triggerKind === "grpc") {
|
|
1378
|
+
return `import { GrpcServer } from "@blokjs/trigger-grpc";
|
|
1379
|
+
import nodes from "../../Nodes";
|
|
1380
|
+
import workflows from "../../Workflows";
|
|
1381
|
+
|
|
1382
|
+
const host = process.env.GRPC_HOST || "0.0.0.0";
|
|
1383
|
+
const port = Number(process.env.GRPC_PORT || process.env.PORT || 4003);
|
|
1384
|
+
|
|
1385
|
+
if (process.env.DISABLE_TRIGGER_RUN !== "true") {
|
|
1386
|
+
new GrpcServer({ host, port, nodes, workflows }).start();
|
|
1387
|
+
}
|
|
1291
1388
|
`;
|
|
1292
1389
|
}
|
|
1293
1390
|
return `// Entry point for ${triggerKind} trigger
|
|
@@ -1295,6 +1392,45 @@ if (process.env.DISABLE_TRIGGER_RUN !== "true") {
|
|
|
1295
1392
|
console.log("${triggerKind} trigger not yet implemented");
|
|
1296
1393
|
`;
|
|
1297
1394
|
}
|
|
1395
|
+
export function generateCronExampleWorkflowFile() {
|
|
1396
|
+
return `import { node, step, workflow } from "@blokjs/core";
|
|
1397
|
+
|
|
1398
|
+
/**
|
|
1399
|
+
* Cron heartbeat — fires on a schedule, NOT on an HTTP request. \`blokctl dev\`
|
|
1400
|
+
* boots it via src/triggers/cron/index.ts and it fires every minute. The
|
|
1401
|
+
* schedule accepts an optional leading seconds field (e.g. \`* * * * * *\` for
|
|
1402
|
+
* every second). Add more cron workflows by exporting them and registering
|
|
1403
|
+
* them in src/Workflows.ts.
|
|
1404
|
+
*/
|
|
1405
|
+
export default workflow(
|
|
1406
|
+
"Cron Heartbeat",
|
|
1407
|
+
{ version: "1.0.0", trigger: { cron: { schedule: "* * * * *", timezone: "UTC" } } },
|
|
1408
|
+
() => {
|
|
1409
|
+
step("heartbeat", node("@blokjs/expr"), { expression: "({ ok: true, at: Date.now() })" }, { ephemeral: true });
|
|
1410
|
+
},
|
|
1411
|
+
);
|
|
1412
|
+
`;
|
|
1413
|
+
}
|
|
1414
|
+
export function generateCronServerFile() {
|
|
1415
|
+
return `import { CronTrigger } from "@blokjs/trigger-cron";
|
|
1416
|
+
import nodes from "../../../Nodes";
|
|
1417
|
+
import workflows from "../../../Workflows";
|
|
1418
|
+
|
|
1419
|
+
/**
|
|
1420
|
+
* CronServer — the cron trigger for this project.
|
|
1421
|
+
*
|
|
1422
|
+
* CronTrigger.listen() populates the NodeMap, registers workflows with the
|
|
1423
|
+
* WorkflowRegistry, then schedules a CronJob for every workflow whose trigger
|
|
1424
|
+
* is \`{ cron: { schedule, timezone? } }\`. There is no port to bind — the
|
|
1425
|
+
* scheduled job timers keep the process alive. Non-cron workflows sharing this
|
|
1426
|
+
* Workflows.ts are ignored by the scheduler (they run under their own trigger).
|
|
1427
|
+
*/
|
|
1428
|
+
export default class CronServer extends CronTrigger {
|
|
1429
|
+
protected nodes: Record<string, import("@blokjs/runner").BlokService<unknown>> = nodes;
|
|
1430
|
+
protected workflows: Record<string, import("@blokjs/helper").WorkflowV2Builder> = workflows;
|
|
1431
|
+
}
|
|
1432
|
+
`;
|
|
1433
|
+
}
|
|
1298
1434
|
function generateSSEServerFile() {
|
|
1299
1435
|
return `import { serve } from "@hono/node-server";
|
|
1300
1436
|
import { DefaultLogger, NodeMap, WorkflowRegistry } from "@blokjs/runner";
|
|
@@ -1581,8 +1717,12 @@ function updatePubSubProvider(triggerDestDir, provider) {
|
|
|
1581
1717
|
},
|
|
1582
1718
|
};
|
|
1583
1719
|
const config = adapterConfigs[provider];
|
|
1584
|
-
if (!config)
|
|
1720
|
+
if (!config) {
|
|
1721
|
+
content = content.replace(/import \{ GCPPubSubAdapter, PubSubTrigger \} from ["']@blokjs\/trigger-pubsub["'];/, 'import { PubSubTrigger } from "@blokjs/trigger-pubsub";');
|
|
1722
|
+
content = content.replace(/\n\tprotected adapter = new GCPPubSubAdapter\(\{[\s\S]*?\}\);\n/, "");
|
|
1723
|
+
fsExtra.writeFileSync(serverPath, content);
|
|
1585
1724
|
return;
|
|
1725
|
+
}
|
|
1586
1726
|
content = content.replace(/import \{ (\w+), (\w+) \} from ["']@blokjs\/trigger-pubsub["'];/, `import { ${config.importName}, PubSubTrigger } from "@blokjs/trigger-pubsub";`);
|
|
1587
1727
|
content = content.replace(/(export default class \w+ extends PubSubTrigger \{[\s\S]*?)\n\tprotected adapter = new \w+\(\{[\s\S]*?\}\);/, `$1\n\tprotected adapter = ${config.init};`);
|
|
1588
1728
|
fsExtra.writeFileSync(serverPath, content);
|
|
@@ -1640,6 +1780,7 @@ export function updateQueueProvider(triggerDestDir, provider, explicit) {
|
|
|
1640
1780
|
export function getProviderDependencies(triggers, pubsubProvider, queueProvider, explicitQueueProvider = false) {
|
|
1641
1781
|
const deps = {};
|
|
1642
1782
|
const pubsubProviderDeps = {
|
|
1783
|
+
nats: { nats: "^2.28.0" },
|
|
1643
1784
|
gcp: { "@google-cloud/pubsub": "^5.0.0" },
|
|
1644
1785
|
aws: { "@aws-sdk/client-sns": "^3.980.0", "@aws-sdk/client-sqs": "^3.980.0" },
|
|
1645
1786
|
azure: { "@azure/service-bus": "^7.9.5" },
|
|
@@ -1664,6 +1805,10 @@ export function getProviderDependencies(triggers, pubsubProvider, queueProvider,
|
|
|
1664
1805
|
export function getProviderEnvVars(triggers, pubsubProvider, queueProvider, explicitQueueProvider = false) {
|
|
1665
1806
|
const lines = [];
|
|
1666
1807
|
const pubsubEnvVars = {
|
|
1808
|
+
nats: `
|
|
1809
|
+
# NATS (local pub/sub broker — zero cloud setup)
|
|
1810
|
+
NATS_SERVERS=localhost:4222
|
|
1811
|
+
BLOK_PUBSUB_ADAPTER=nats`,
|
|
1667
1812
|
gcp: `
|
|
1668
1813
|
# Google Cloud Pub/Sub
|
|
1669
1814
|
GCP_PROJECT_ID=my-project
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare const node_file = "import { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport ApiCall from \"@blokjs/api-call\";\nimport IfElse from \"@blokjs/if-else\";\nimport { discoverNodes } from \"@blokjs/runner\";\nimport type { NodeBase } from \"@blokjs/shared\";\nimport ExampleNodes from \"./nodes/examples/index\";\n\n// Published nodes (npm) + the example bundle are registered explicitly below.\n// Your OWN nodes under 'nodes/<name>/index.ts' are AUTO-DISCOVERED and registered\n// by their defineNode({ name }) \u2014 you never edit this file to add a node.\nconst here = dirname(fileURLToPath(import.meta.url));\nconst local = await discoverNodes(join(here, \"nodes\"));\n\nconst explicit: NodeBase[] = [
|
|
1
|
+
declare const node_file = "import { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport ApiCall from \"@blokjs/api-call\";\nimport { HELPER_NODES } from \"@blokjs/helpers\";\nimport IfElse from \"@blokjs/if-else\";\nimport { discoverNodes } from \"@blokjs/runner\";\nimport type { NodeBase } from \"@blokjs/shared\";\nimport ExampleNodes from \"./nodes/examples/index\";\n\n// Published nodes (npm) + the example bundle are registered explicitly below.\n// Your OWN nodes under 'nodes/<name>/index.ts' are AUTO-DISCOVERED and registered\n// by their defineNode({ name }) \u2014 you never edit this file to add a node.\nconst here = dirname(fileURLToPath(import.meta.url));\nconst local = await discoverNodes(join(here, \"nodes\"));\n\nconst explicit: NodeBase[] = [\n\tApiCall,\n\tIfElse,\n\t...(Object.values(HELPER_NODES) as unknown as NodeBase[]),\n\t...(Object.values(ExampleNodes) as NodeBase[]),\n];\n\n// Map keys are cosmetic \u2014 the runner registers each node under its own node.name\n// (the canonical 'use:' ref). Duplicate refs throw at startup.\nconst nodes: { [key: string]: NodeBase } = {};\nfor (const node of [...explicit, ...local]) {\n\tnodes[(node as { name: string }).name] = node;\n}\n\nexport default nodes;\n";
|
|
2
2
|
declare const package_dependencies: {
|
|
3
3
|
ai: string;
|
|
4
4
|
"@ai-sdk/openai": string;
|
|
@@ -13,7 +13,7 @@ declare const package_dev_dependencies: {
|
|
|
13
13
|
"@types/pg": string;
|
|
14
14
|
};
|
|
15
15
|
declare const python3_file = "from pydantic import BaseModel\n\nfrom blok import node\nfrom blok.types.context import Context\n\n\nclass Input(BaseModel):\n \"\"\"Validated inputs for the {{NODE_NAME}} node.\"\"\"\n\n name: str = \"world\"\n\n\nclass Output(BaseModel):\n message: str\n\n\n@node(\"{{NODE_NAME}}\", \"Describe what {{NODE_NAME}} does\")\ndef run(ctx: Context, input: Input) -> Output:\n # `input` is already validated against Input; the return is validated\n # against Output and serialized for you.\n return Output(message=f\"Hello, {input.name}!\")\n";
|
|
16
|
-
declare const examples_url = "\nExamples:\n1- Open \"workflow-docs.json\" in your browser at http://localhost:4000/workflow-docs\n2- Open \"db-manager.json\" in your browser at http://localhost:4000/db-manager\n3- Open \"dashboard-gen.json\" in your browser at http://localhost:4000/dashboard-gen\n4- Open \"countries.json\" in your browser at http://localhost:4000/countries\n5- Open \"chat.json\" in your browser at http://localhost:4000/chat (set OPENROUTER_API_KEY first)\n6- Open \"chat-memory.json\" in your browser at http://localhost:4000/chat-memory (needs OPENROUTER_API_KEY + Redis at REDIS_URL)\n7- Webhook router: POST /webhooks/{stripe,github,linear} with signed bodies \u2014 set the matching *_WEBHOOK_SECRET env vars (needs --triggers webhook)\n8- LLM agent w/ tool calls: open http://localhost:4000/agent \u2014 model picks between get_weather and calculate tools (needs OPENROUTER_API_KEY + Redis)\n9- Worker fan-out: POST /fanout/jobs with body '{items:[...], tenantId?:\"...\"}' to enqueue N worker jobs (needs --triggers worker; BLOK_WORKER_ADAPTER=in-memory works single-process)\n10- Trigger references (NOT http): workflows/json/{cron-heartbeat,pubsub-on-order
|
|
16
|
+
declare const examples_url = "\nExamples:\n1- Open \"workflow-docs.json\" in your browser at http://localhost:4000/workflow-docs\n2- Open \"db-manager.json\" in your browser at http://localhost:4000/db-manager\n3- Open \"dashboard-gen.json\" in your browser at http://localhost:4000/dashboard-gen\n4- Open \"countries.json\" in your browser at http://localhost:4000/countries\n5- Open \"chat.json\" in your browser at http://localhost:4000/chat (set OPENROUTER_API_KEY first)\n6- Open \"chat-memory.json\" in your browser at http://localhost:4000/chat-memory (needs OPENROUTER_API_KEY + Redis at REDIS_URL)\n7- Webhook router: POST /webhooks/{stripe,github,linear} with signed bodies \u2014 set the matching *_WEBHOOK_SECRET env vars (needs --triggers webhook)\n8- LLM agent w/ tool calls: open http://localhost:4000/agent \u2014 model picks between get_weather and calculate tools (needs OPENROUTER_API_KEY + Redis)\n9- Worker fan-out: POST /fanout/jobs with body '{items:[...], tenantId?:\"...\"}' to enqueue N worker jobs (needs --triggers worker; BLOK_WORKER_ADAPTER=in-memory works single-process)\n10- Trigger references (NOT http): workflows/json/{cron-heartbeat,pubsub-on-order}.json demonstrate the cron and pubsub triggers; src/workflows/websocket/events/echo-demo.ts demonstrates websocket \u2014 read AGENTS.md \"Choosing a trigger\" to pick the right one by intent instead of defaulting to HTTP.\n\nFor more documentation, visit src/nodes/examples/README.md.\n";
|
|
17
17
|
declare const workflow_template = "import { http, node, step, workflow } from \"@blokjs/core\";\n\n/**\n * {{WORKFLOW_NAME}}\n *\n * Add steps with step(\"id\", node, inputs). Read a step's output downstream via\n * the handle it returns (const user = step(...); ... user.name). Control flow:\n * branch / forEach / switchOn / tryCatch \u2014 all from @blokjs/core.\n */\nexport default workflow(\n\t\"{{WORKFLOW_NAME}}\",\n\t{ version: \"1.0.0\", trigger: http.get(\"{{WORKFLOW_PATH}}\") },\n\t(req) => {\n\t\t// Echo the request body back. @blokjs/respond writes the HTTP response,\n\t\t// so mark it ephemeral (no state slot needed).\n\t\tstep(\"echo\", node(\"@blokjs/respond\"), { body: req.body }, { ephemeral: true });\n\t},\n);\n";
|
|
18
18
|
declare const supervisord_nodejs = "\n[supervisord]\nnodaemon=true\n\n[program:nodejs_app]\ncommand=npm start\ndirectory=/app\nautostart=true\nautorestart=true\nstderr_logfile=/var/log/nodejs.err.log\nstdout_logfile=/var/log/nodejs.out.log\n";
|
|
19
19
|
declare const supervisord_python = "\n[program:python_app]\ncommand=python3 /app/.blok/runtimes/python3/server.py\ndirectory=/app\nautostart=true\nautorestart=true\nstderr_logfile=/var/log/python.err.log\nstdout_logfile=/var/log/python.out.log\n";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const node_file = `import { dirname, join } from "node:path";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
3
|
import ApiCall from "@blokjs/api-call";
|
|
4
|
+
import { HELPER_NODES } from "@blokjs/helpers";
|
|
4
5
|
import IfElse from "@blokjs/if-else";
|
|
5
6
|
import { discoverNodes } from "@blokjs/runner";
|
|
6
7
|
import type { NodeBase } from "@blokjs/shared";
|
|
@@ -12,7 +13,12 @@ import ExampleNodes from "./nodes/examples/index";
|
|
|
12
13
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
13
14
|
const local = await discoverNodes(join(here, "nodes"));
|
|
14
15
|
|
|
15
|
-
const explicit: NodeBase[] = [
|
|
16
|
+
const explicit: NodeBase[] = [
|
|
17
|
+
ApiCall,
|
|
18
|
+
IfElse,
|
|
19
|
+
...(Object.values(HELPER_NODES) as unknown as NodeBase[]),
|
|
20
|
+
...(Object.values(ExampleNodes) as NodeBase[]),
|
|
21
|
+
];
|
|
16
22
|
|
|
17
23
|
// Map keys are cosmetic — the runner registers each node under its own node.name
|
|
18
24
|
// (the canonical 'use:' ref). Duplicate refs throw at startup.
|
|
@@ -69,9 +75,9 @@ Examples:
|
|
|
69
75
|
7- Webhook router: POST /webhooks/{stripe,github,linear} with signed bodies — set the matching *_WEBHOOK_SECRET env vars (needs --triggers webhook)
|
|
70
76
|
8- LLM agent w/ tool calls: open http://localhost:4000/agent — model picks between get_weather and calculate tools (needs OPENROUTER_API_KEY + Redis)
|
|
71
77
|
9- Worker fan-out: POST /fanout/jobs with body '{items:[...], tenantId?:"..."}' to enqueue N worker jobs (needs --triggers worker; BLOK_WORKER_ADAPTER=in-memory works single-process)
|
|
72
|
-
10- Trigger references (NOT http): workflows/json/{cron-heartbeat,pubsub-on-order
|
|
78
|
+
10- Trigger references (NOT http): workflows/json/{cron-heartbeat,pubsub-on-order}.json demonstrate the cron and pubsub triggers; src/workflows/websocket/events/echo-demo.ts demonstrates websocket — read AGENTS.md "Choosing a trigger" to pick the right one by intent instead of defaulting to HTTP.
|
|
73
79
|
|
|
74
|
-
For more documentation, visit src/nodes/examples/README.md.
|
|
80
|
+
For more documentation, visit src/nodes/examples/README.md.
|
|
75
81
|
`;
|
|
76
82
|
const workflow_template = `import { http, node, step, workflow } from "@blokjs/core";
|
|
77
83
|
|
|
@@ -4,7 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
import util from "node:util";
|
|
5
5
|
import fsExtra from "fs-extra";
|
|
6
6
|
import { waitForGrpcPort } from "../../services/health-probe.js";
|
|
7
|
-
import { detectRr } from "../../services/runtime-detector.js";
|
|
7
|
+
import { detectJava, detectRr } from "../../services/runtime-detector.js";
|
|
8
8
|
import { generateCSharpNodeRegistry, generateGoNodeRegistry, generateJavaNodeRegistry, generateRustNodeRegistry, readProjectConfig, validateProjectRuntimes, } from "../../services/runtime-setup.js";
|
|
9
9
|
import { regenRuntimeStubs } from "../nodes/syncNodes.js";
|
|
10
10
|
const exec = util.promisify(child_process.exec);
|
|
@@ -106,6 +106,12 @@ export async function devProject(opts) {
|
|
|
106
106
|
bootCmd = `${rrBin}${bootCmd.slice(2)}`;
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
|
+
if (rt.kind === "java" && bootCmd.startsWith("java ")) {
|
|
110
|
+
const javaBin = detectJava();
|
|
111
|
+
if (javaBin && javaBin !== "java") {
|
|
112
|
+
bootCmd = `${javaBin}${bootCmd.slice(4)}`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
109
115
|
const cmdParts = bootCmd.split(" ");
|
|
110
116
|
const cmd = cmdParts[0];
|
|
111
117
|
const args = cmdParts.slice(1);
|
|
@@ -198,6 +204,12 @@ export async function devProject(opts) {
|
|
|
198
204
|
if (brokerConsumerKinds.has(trigger.kind)) {
|
|
199
205
|
console.log(` ${trigger.label}: consumes from broker (no HTTP endpoint)`);
|
|
200
206
|
}
|
|
207
|
+
else if (trigger.kind === "cron") {
|
|
208
|
+
console.log(` ${trigger.label}: scheduled (no HTTP endpoint)`);
|
|
209
|
+
}
|
|
210
|
+
else if (trigger.kind === "grpc") {
|
|
211
|
+
console.log(` ${trigger.label}: gRPC 127.0.0.1:${trigger.port}`);
|
|
212
|
+
}
|
|
201
213
|
else {
|
|
202
214
|
console.log(` ${trigger.label}: http://localhost:${trigger.port}/health-check`);
|
|
203
215
|
}
|
|
@@ -5,7 +5,7 @@ import color from "picocolors";
|
|
|
5
5
|
import { isNonInteractive } from "../../services/non-interactive.js";
|
|
6
6
|
import { detectRuntimes, getRuntimeDefinition } from "../../services/runtime-detector.js";
|
|
7
7
|
import { ensureRuntimeGitignore, rewriteRuntimeEnvBlock, rewriteSupervisordRuntimes, runtimeEnvKey, withRuntime, } from "../../services/runtime-mutations.js";
|
|
8
|
-
import { setupRuntime } from "../../services/runtime-setup.js";
|
|
8
|
+
import { buildRuntimeConfig, setupRuntime, } from "../../services/runtime-setup.js";
|
|
9
9
|
import { RuntimeCommandError, assertGrpcPortFree, assertSidecarKind, readConfigSafe, reportRuntimeError, resolveProjectRoot, resolveSdkSource, } from "./shared.js";
|
|
10
10
|
export async function runtimeAdd(kindArg, options) {
|
|
11
11
|
try {
|
|
@@ -54,6 +54,31 @@ export async function runtimeAdd(kindArg, options) {
|
|
|
54
54
|
const sdkDir = path.join(root, ".blok", "runtimes", kind);
|
|
55
55
|
const alreadyInstalled = Boolean(config.runtimes?.[kind]) || fs.existsSync(sdkDir);
|
|
56
56
|
p.intro(color.inverse(` Add ${def.label} runtime `));
|
|
57
|
+
if (options.enable === true) {
|
|
58
|
+
if (config.runtimes?.[kind]) {
|
|
59
|
+
p.outro(color.dim(`${def.label} is already wired into .blok/config.json.`));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (!fs.existsSync(sdkDir)) {
|
|
63
|
+
throw new RuntimeCommandError(`${def.label} isn't scaffolded at ${path.relative(root, sdkDir)}. Run \`blokctl runtime add ${kind}\` (without --enable) to install it first.`);
|
|
64
|
+
}
|
|
65
|
+
const rt = (detected ?? (await detectRuntimes())).find((d) => d.kind === kind);
|
|
66
|
+
if (!rt)
|
|
67
|
+
throw new RuntimeCommandError(`Unknown runtime "${kind}".`);
|
|
68
|
+
const grpcPort = grpcPortOverride ?? rt.defaultGrpcPort;
|
|
69
|
+
const clash = Object.values(config.runtimes ?? {}).find((rc) => rc.kind !== kind && rc.grpcPort === grpcPort);
|
|
70
|
+
if (clash) {
|
|
71
|
+
throw new RuntimeCommandError(`gRPC port ${grpcPort} is already used by the ${clash.label} runtime. Pass --grpc-port <n> to pick another.`);
|
|
72
|
+
}
|
|
73
|
+
const rc = buildRuntimeConfig(rt, root);
|
|
74
|
+
if (grpcPortOverride !== undefined) {
|
|
75
|
+
rc.grpcPort = grpcPortOverride;
|
|
76
|
+
if (rc.grpcStartCmd)
|
|
77
|
+
rc.grpcStartCmd = rc.grpcStartCmd.split(String(rt.defaultGrpcPort)).join(String(grpcPortOverride));
|
|
78
|
+
}
|
|
79
|
+
finalizeRuntime(root, config, rc, kind, def.label);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
57
82
|
if (alreadyInstalled && options.force !== true) {
|
|
58
83
|
if (nonInteractive) {
|
|
59
84
|
p.outro(color.dim(`${def.label} is already installed. Re-run with --force to reinstall.`));
|
|
@@ -107,37 +132,75 @@ export async function runtimeAdd(kindArg, options) {
|
|
|
107
132
|
rc.grpcStartCmd = rc.grpcStartCmd.split(String(rt.defaultGrpcPort)).join(String(grpcPortOverride));
|
|
108
133
|
}
|
|
109
134
|
s.stop(`${def.label} runtime ready`);
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
fs.mkdirSync(path.join(root, ".blok"), { recursive: true });
|
|
113
|
-
fs.writeFileSync(path.join(root, ".blok", "config.json"), `${JSON.stringify(nextConfig, null, 2)}\n`);
|
|
114
|
-
const envPath = path.join(root, ".env.local");
|
|
115
|
-
const envContent = fs.existsSync(envPath) ? fs.readFileSync(envPath, "utf8") : "";
|
|
116
|
-
fs.writeFileSync(envPath, rewriteRuntimeEnvBlock(envContent, remaining));
|
|
117
|
-
const supervisordPath = path.join(root, "supervisord.conf");
|
|
118
|
-
if (fs.existsSync(supervisordPath)) {
|
|
119
|
-
fs.writeFileSync(supervisordPath, rewriteSupervisordRuntimes(fs.readFileSync(supervisordPath, "utf8"), remaining));
|
|
120
|
-
}
|
|
121
|
-
const gitignorePath = path.join(root, ".gitignore");
|
|
122
|
-
if (fs.existsSync(gitignorePath)) {
|
|
123
|
-
const before = fs.readFileSync(gitignorePath, "utf8");
|
|
124
|
-
const after = ensureRuntimeGitignore(before);
|
|
125
|
-
if (after !== before)
|
|
126
|
-
fs.writeFileSync(gitignorePath, after);
|
|
135
|
+
if (stampHelloExample(root, source, kind)) {
|
|
136
|
+
p.log.success(`Shipped the ${def.label} hello example — ${color.cyan(`POST /runtimes/${kind}/hello`)} (registered in src/Workflows.ts)`);
|
|
127
137
|
}
|
|
128
|
-
|
|
129
|
-
`${color.green("✓")} .blok/config.json ${color.dim(`runtimes.${kind}`)}`,
|
|
130
|
-
`${color.green("✓")} .env.local ${color.dim(`RUNTIME_${runtimeEnvKey(kind)}_GRPC_PORT=${rc.grpcPort}`)}`,
|
|
131
|
-
fs.existsSync(supervisordPath)
|
|
132
|
-
? `${color.green("✓")} supervisord.conf ${color.dim(`[program:${kind}_runtime]`)}`
|
|
133
|
-
: "",
|
|
134
|
-
`${color.green("✓")} runtimes/${kind}/nodes/ ${color.dim("(your runtime nodes go here)")}`,
|
|
135
|
-
]
|
|
136
|
-
.filter(Boolean)
|
|
137
|
-
.join("\n"), `${def.label} added`);
|
|
138
|
-
p.outro(`Run ${color.cyan("blokctl dev")} to start it, then add ${color.cyan(`type: "runtime.${kind}"`)} steps to your workflows.`);
|
|
138
|
+
finalizeRuntime(root, config, rc, kind, def.label);
|
|
139
139
|
}
|
|
140
140
|
catch (err) {
|
|
141
141
|
reportRuntimeError(err);
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
|
+
function stampHelloExample(root, source, kind) {
|
|
145
|
+
const file = `runtime-${kind}-hello.ts`;
|
|
146
|
+
const srcFile = path.join(source, "examples", "ts-workflows", file);
|
|
147
|
+
const examplesDir = path.join(root, "src", "workflows", "examples");
|
|
148
|
+
const workflowsTs = path.join(root, "src", "Workflows.ts");
|
|
149
|
+
if (!fs.existsSync(srcFile) || !fs.existsSync(examplesDir) || !fs.existsSync(workflowsTs))
|
|
150
|
+
return false;
|
|
151
|
+
const importName = `Runtime${kind.charAt(0).toUpperCase()}${kind.slice(1)}Hello`;
|
|
152
|
+
const importLine = `import ${importName} from "./workflows/examples/runtime-${kind}-hello";`;
|
|
153
|
+
const entryLine = `\t"runtime-${kind}-hello": ${importName},`;
|
|
154
|
+
const content = fs.readFileSync(workflowsTs, "utf8");
|
|
155
|
+
if (content.includes(`./workflows/examples/runtime-${kind}-hello`)) {
|
|
156
|
+
fs.copyFileSync(srcFile, path.join(examplesDir, file));
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
const lines = content.split("\n");
|
|
160
|
+
const openIdx = lines.findIndex((l) => /^const workflows\b.*=\s*\{\s*$/.test(l));
|
|
161
|
+
let lastImport = -1;
|
|
162
|
+
for (let i = 0; i < (openIdx === -1 ? lines.length : openIdx); i++) {
|
|
163
|
+
if (/^import /.test(lines[i]))
|
|
164
|
+
lastImport = i;
|
|
165
|
+
}
|
|
166
|
+
if (openIdx === -1 || lastImport === -1) {
|
|
167
|
+
p.log.warn(`src/Workflows.ts doesn't look generated — register the ${kind} hello example yourself:\n ${importLine}\n ${entryLine.trim()}`);
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
lines.splice(openIdx + 1, 0, entryLine);
|
|
171
|
+
lines.splice(lastImport + 1, 0, importLine);
|
|
172
|
+
fs.copyFileSync(srcFile, path.join(examplesDir, file));
|
|
173
|
+
fs.writeFileSync(workflowsTs, lines.join("\n"));
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
function finalizeRuntime(root, config, rc, kind, label) {
|
|
177
|
+
const nextConfig = withRuntime(config, rc);
|
|
178
|
+
const remaining = Object.values(nextConfig.runtimes ?? {});
|
|
179
|
+
fs.mkdirSync(path.join(root, ".blok"), { recursive: true });
|
|
180
|
+
fs.writeFileSync(path.join(root, ".blok", "config.json"), `${JSON.stringify(nextConfig, null, 2)}\n`);
|
|
181
|
+
const envPath = path.join(root, ".env.local");
|
|
182
|
+
const envContent = fs.existsSync(envPath) ? fs.readFileSync(envPath, "utf8") : "";
|
|
183
|
+
fs.writeFileSync(envPath, rewriteRuntimeEnvBlock(envContent, remaining));
|
|
184
|
+
const supervisordPath = path.join(root, "supervisord.conf");
|
|
185
|
+
if (fs.existsSync(supervisordPath)) {
|
|
186
|
+
fs.writeFileSync(supervisordPath, rewriteSupervisordRuntimes(fs.readFileSync(supervisordPath, "utf8"), remaining));
|
|
187
|
+
}
|
|
188
|
+
const gitignorePath = path.join(root, ".gitignore");
|
|
189
|
+
if (fs.existsSync(gitignorePath)) {
|
|
190
|
+
const before = fs.readFileSync(gitignorePath, "utf8");
|
|
191
|
+
const after = ensureRuntimeGitignore(before);
|
|
192
|
+
if (after !== before)
|
|
193
|
+
fs.writeFileSync(gitignorePath, after);
|
|
194
|
+
}
|
|
195
|
+
p.note([
|
|
196
|
+
`${color.green("✓")} .blok/config.json ${color.dim(`runtimes.${kind}`)}`,
|
|
197
|
+
`${color.green("✓")} .env.local ${color.dim(`RUNTIME_${runtimeEnvKey(kind)}_GRPC_PORT=${rc.grpcPort}`)}`,
|
|
198
|
+
fs.existsSync(supervisordPath)
|
|
199
|
+
? `${color.green("✓")} supervisord.conf ${color.dim(`[program:${kind}_runtime]`)}`
|
|
200
|
+
: "",
|
|
201
|
+
`${color.green("✓")} runtimes/${kind}/nodes/ ${color.dim("(your runtime nodes go here)")}`,
|
|
202
|
+
]
|
|
203
|
+
.filter(Boolean)
|
|
204
|
+
.join("\n"), `${label} added`);
|
|
205
|
+
p.outro(`Run ${color.cyan("blokctl dev")} to start it, then add ${color.cyan(`type: "runtime.${kind}"`)} steps to your workflows.`);
|
|
206
|
+
}
|
|
@@ -15,6 +15,7 @@ runtime
|
|
|
15
15
|
.option("--local <path>", "Use a local blok repo for SDK source instead of fetching by version")
|
|
16
16
|
.option("--grpc-port <port>", "Override the gRPC port for this runtime")
|
|
17
17
|
.option("--force", "Reinstall if the runtime is already present")
|
|
18
|
+
.option("--enable", "Wire an already-scaffolded runtime (SDK dir on disk) into config.json without reinstalling")
|
|
18
19
|
.option("--skip-toolchain-check", "Add even if the language toolchain isn't detected")
|
|
19
20
|
.option("-y, --yes", "Skip prompts (non-interactive)")
|
|
20
21
|
.action(async (runtimeArg, options) => {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
4
5
|
import * as p from "@clack/prompts";
|
|
5
6
|
import color from "picocolors";
|
|
6
7
|
import simpleGit from "simple-git";
|
|
@@ -62,6 +63,9 @@ export async function resolveSdkSource(projectRoot, localOverride, onProgress) {
|
|
|
62
63
|
}
|
|
63
64
|
return resolved;
|
|
64
65
|
}
|
|
66
|
+
const bundled = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../scaffold-repo");
|
|
67
|
+
if (fs.existsSync(path.join(bundled, "sdks")))
|
|
68
|
+
return bundled;
|
|
65
69
|
const tag = readFrameworkTag(projectRoot);
|
|
66
70
|
if (!tag) {
|
|
67
71
|
throw new RuntimeCommandError("Couldn't determine the project's Blok version from package.json. Pass --local <path-to-blok-repo> to point at a matching SDK source.");
|