blokctl 1.3.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (689) hide show
  1. package/dist/commands/create/project.js +15 -4
  2. package/dist/commands/create/utils/Examples.d.ts +1 -1
  3. package/dist/commands/create/utils/Examples.js +1 -1
  4. package/dist/commands/runtime/shared.js +4 -0
  5. package/dist/scaffold-repo/examples/ts-workflows/mcp-greeter.ts +59 -0
  6. package/dist/scaffold-repo/examples/ts-workflows/runtime-csharp-hello.ts +36 -0
  7. package/dist/scaffold-repo/examples/ts-workflows/runtime-go-hello.ts +36 -0
  8. package/dist/scaffold-repo/examples/ts-workflows/runtime-java-hello.ts +36 -0
  9. package/dist/scaffold-repo/examples/ts-workflows/runtime-php-hello.ts +36 -0
  10. package/dist/scaffold-repo/examples/ts-workflows/runtime-python3-hello.ts +36 -0
  11. package/dist/scaffold-repo/examples/ts-workflows/runtime-ruby-hello.ts +36 -0
  12. package/dist/scaffold-repo/examples/ts-workflows/runtime-rust-hello.ts +36 -0
  13. package/dist/scaffold-repo/infra/development/3055.dat +602 -0
  14. package/dist/scaffold-repo/infra/development/3057.dat +203 -0
  15. package/dist/scaffold-repo/infra/development/3059.dat +19 -0
  16. package/dist/scaffold-repo/infra/development/3061.dat +1003 -0
  17. package/dist/scaffold-repo/infra/development/3062.dat +5465 -0
  18. package/dist/scaffold-repo/infra/development/3063.dat +1003 -0
  19. package/dist/scaffold-repo/infra/development/3065.dat +606 -0
  20. package/dist/scaffold-repo/infra/development/3067.dat +603 -0
  21. package/dist/scaffold-repo/infra/development/3069.dat +112 -0
  22. package/dist/scaffold-repo/infra/development/3071.dat +4584 -0
  23. package/dist/scaffold-repo/infra/development/3073.dat +9 -0
  24. package/dist/scaffold-repo/infra/development/3075.dat +14599 -0
  25. package/dist/scaffold-repo/infra/development/3077.dat +16047 -0
  26. package/dist/scaffold-repo/infra/development/3079.dat +5 -0
  27. package/dist/scaffold-repo/infra/development/3081.dat +5 -0
  28. package/dist/scaffold-repo/infra/development/docker-compose.yml +106 -0
  29. package/dist/scaffold-repo/infra/development/schema.sql +1616 -0
  30. package/dist/scaffold-repo/infra/development/toc.dat +0 -0
  31. package/dist/scaffold-repo/infra/metrics/alertmanager.yml +43 -0
  32. package/dist/scaffold-repo/infra/metrics/alloy-config.alloy +75 -0
  33. package/dist/scaffold-repo/infra/metrics/dashboard.json +1152 -0
  34. package/dist/scaffold-repo/infra/metrics/dashboards/blok-overview.json +314 -0
  35. package/dist/scaffold-repo/infra/metrics/dashboards/blok-system.json +175 -0
  36. package/dist/scaffold-repo/infra/metrics/dashboards/blok-tracing.json +235 -0
  37. package/dist/scaffold-repo/infra/metrics/dashboards/blok-triggers.json +258 -0
  38. package/dist/scaffold-repo/infra/metrics/datasources.yml +43 -0
  39. package/dist/scaffold-repo/infra/metrics/default.yaml +8 -0
  40. package/dist/scaffold-repo/infra/metrics/docker-compose.yml +193 -0
  41. package/dist/scaffold-repo/infra/metrics/loki-config.yaml +50 -0
  42. package/dist/scaffold-repo/infra/metrics/nginx.conf +25 -0
  43. package/dist/scaffold-repo/infra/metrics/prometheus.yml +51 -0
  44. package/dist/scaffold-repo/infra/metrics/rules/blok-alerts.yml +114 -0
  45. package/dist/scaffold-repo/infra/metrics/telegraf.conf +41 -0
  46. package/dist/scaffold-repo/infra/metrics/tempo.yaml +81 -0
  47. package/dist/scaffold-repo/infra/milvus/docker-compose.yml +73 -0
  48. package/dist/scaffold-repo/sdk/javascript/README.md +151 -0
  49. package/dist/scaffold-repo/sdk/javascript/bootstrap.min.css +11660 -0
  50. package/dist/scaffold-repo/sdk/javascript/image-ai.html +316 -0
  51. package/dist/scaffold-repo/sdk/javascript/nanosdk.js +180 -0
  52. package/dist/scaffold-repo/sdk/javascript/nanosdk.min.js +100 -0
  53. package/dist/scaffold-repo/sdk/javascript/pdf.html +63 -0
  54. package/dist/scaffold-repo/sdk/javascript/test.html +68 -0
  55. package/dist/scaffold-repo/sdks/CLAUDE.md +67 -0
  56. package/dist/scaffold-repo/sdks/csharp/.dockerignore +7 -0
  57. package/dist/scaffold-repo/sdks/csharp/Blok.Core.sln +24 -0
  58. package/dist/scaffold-repo/sdks/csharp/Dockerfile +42 -0
  59. package/dist/scaffold-repo/sdks/csharp/README.md +138 -0
  60. package/dist/scaffold-repo/sdks/csharp/proto/blok/runtime/v1/runtime.proto +302 -0
  61. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Blok.Core.csproj +39 -0
  62. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Config/ServerConfig.cs +90 -0
  63. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BlokError.cs +538 -0
  64. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BlokErrorCategory.cs +112 -0
  65. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BlokErrorSeverity.cs +40 -0
  66. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BuildContextSnapshot.cs +168 -0
  67. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/ErrorCategory.cs +13 -0
  68. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/NodeException.cs +44 -0
  69. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Logging/LogEntry.cs +34 -0
  70. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Logging/LogLevel.cs +12 -0
  71. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Logging/Logger.cs +92 -0
  72. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/IMiddleware.cs +14 -0
  73. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/LoggingMiddleware.cs +46 -0
  74. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/MiddlewareChain.cs +35 -0
  75. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/RecoveryMiddleware.cs +63 -0
  76. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Node/INodeHandler.cs +17 -0
  77. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Node/NodeRegistry.cs +128 -0
  78. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Node/TypedNode.cs +140 -0
  79. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/ApiCallNode.cs +129 -0
  80. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/BlokErrorDemoNode.cs +125 -0
  81. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/ChainTestNode.cs +79 -0
  82. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/HelloWorldNode.cs +45 -0
  83. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/TransformDataNode.cs +119 -0
  84. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/TypedGreetNode.cs +23 -0
  85. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Program.cs +26 -0
  86. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Server/BlokNodeRuntimeService.cs +536 -0
  87. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Server/RuntimeServer.cs +183 -0
  88. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Testing/MockContextBuilder.cs +117 -0
  89. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Testing/TestNodeRunner.cs +50 -0
  90. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/Context.cs +56 -0
  91. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/ExecutionMetrics.cs +21 -0
  92. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/ExecutionRequest.cs +15 -0
  93. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/ExecutionResult.cs +104 -0
  94. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/HealthStatus.cs +18 -0
  95. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/NodeConfig.cs +59 -0
  96. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/Request.cs +57 -0
  97. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/Response.cs +24 -0
  98. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/UserNodeRegistry.cs +17 -0
  99. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Validation/SchemaValidator.cs +198 -0
  100. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Blok.Core.Tests.csproj +25 -0
  101. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Errors/BlokErrorTests.cs +458 -0
  102. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Logging/LoggerTests.cs +129 -0
  103. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Node/NodeRegistryTests.cs +145 -0
  104. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Testing/MockContextTests.cs +153 -0
  105. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/TypedNodeTests.cs +69 -0
  106. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Types/ExecutionResultTests.cs +110 -0
  107. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Validation/SchemaValidatorTests.cs +233 -0
  108. package/dist/scaffold-repo/sdks/go/Dockerfile +33 -0
  109. package/dist/scaffold-repo/sdks/go/README.md +255 -0
  110. package/dist/scaffold-repo/sdks/go/blok_error.go +803 -0
  111. package/dist/scaffold-repo/sdks/go/blok_error_test.go +433 -0
  112. package/dist/scaffold-repo/sdks/go/cmd/server/main.go +45 -0
  113. package/dist/scaffold-repo/sdks/go/cmd/server/register_user_nodes.go +12 -0
  114. package/dist/scaffold-repo/sdks/go/config.go +157 -0
  115. package/dist/scaffold-repo/sdks/go/config_test.go +129 -0
  116. package/dist/scaffold-repo/sdks/go/define_node.go +87 -0
  117. package/dist/scaffold-repo/sdks/go/define_node_test.go +75 -0
  118. package/dist/scaffold-repo/sdks/go/errors.go +104 -0
  119. package/dist/scaffold-repo/sdks/go/errors_test.go +95 -0
  120. package/dist/scaffold-repo/sdks/go/examples/nodes/apicall.go +117 -0
  121. package/dist/scaffold-repo/sdks/go/examples/nodes/blokerrordemo.go +80 -0
  122. package/dist/scaffold-repo/sdks/go/examples/nodes/chaintest.go +63 -0
  123. package/dist/scaffold-repo/sdks/go/examples/nodes/helloworld.go +41 -0
  124. package/dist/scaffold-repo/sdks/go/examples/nodes/transformdata.go +176 -0
  125. package/dist/scaffold-repo/sdks/go/examples/nodes/typedgreet.go +34 -0
  126. package/dist/scaffold-repo/sdks/go/genpb/blok/runtime/v1/runtime.pb.go +2070 -0
  127. package/dist/scaffold-repo/sdks/go/genpb/blok/runtime/v1/runtime_grpc.pb.go +273 -0
  128. package/dist/scaffold-repo/sdks/go/go.mod +25 -0
  129. package/dist/scaffold-repo/sdks/go/go.sum +66 -0
  130. package/dist/scaffold-repo/sdks/go/grpc_server.go +670 -0
  131. package/dist/scaffold-repo/sdks/go/grpc_server_test.go +474 -0
  132. package/dist/scaffold-repo/sdks/go/logging.go +144 -0
  133. package/dist/scaffold-repo/sdks/go/logging_test.go +139 -0
  134. package/dist/scaffold-repo/sdks/go/middleware.go +152 -0
  135. package/dist/scaffold-repo/sdks/go/middleware_test.go +222 -0
  136. package/dist/scaffold-repo/sdks/go/node.go +50 -0
  137. package/dist/scaffold-repo/sdks/go/proto/blok/runtime/v1/runtime.proto +302 -0
  138. package/dist/scaffold-repo/sdks/go/registry.go +156 -0
  139. package/dist/scaffold-repo/sdks/go/registry_test.go +195 -0
  140. package/dist/scaffold-repo/sdks/go/server.go +207 -0
  141. package/dist/scaffold-repo/sdks/go/server_test.go +186 -0
  142. package/dist/scaffold-repo/sdks/go/shutdown.go +32 -0
  143. package/dist/scaffold-repo/sdks/go/testutil.go +169 -0
  144. package/dist/scaffold-repo/sdks/go/testutil_test.go +124 -0
  145. package/dist/scaffold-repo/sdks/go/types.go +295 -0
  146. package/dist/scaffold-repo/sdks/go/types_test.go +251 -0
  147. package/dist/scaffold-repo/sdks/go/validation.go +210 -0
  148. package/dist/scaffold-repo/sdks/go/validation_test.go +262 -0
  149. package/dist/scaffold-repo/sdks/go/worker.go +577 -0
  150. package/dist/scaffold-repo/sdks/java/Dockerfile +33 -0
  151. package/dist/scaffold-repo/sdks/java/README.md +221 -0
  152. package/dist/scaffold-repo/sdks/java/pom.xml +163 -0
  153. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/Main.java +90 -0
  154. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/UserNodeRegistry.java +19 -0
  155. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/config/ServerConfig.java +244 -0
  156. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BlokError.java +576 -0
  157. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BlokErrorCategory.java +68 -0
  158. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BlokErrorSeverity.java +31 -0
  159. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BuildContextSnapshot.java +132 -0
  160. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/ErrorCategory.java +22 -0
  161. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/NodeException.java +176 -0
  162. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/logging/LogEntry.java +78 -0
  163. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/logging/LogLevel.java +48 -0
  164. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/logging/Logger.java +160 -0
  165. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/LoggingMiddleware.java +65 -0
  166. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/Middleware.java +29 -0
  167. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/MiddlewareChain.java +59 -0
  168. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/RecoveryMiddleware.java +53 -0
  169. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/NodeHandler.java +40 -0
  170. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/NodeReflector.java +18 -0
  171. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/NodeRegistry.java +205 -0
  172. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/TypedNode.java +143 -0
  173. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/ApiCallNode.java +145 -0
  174. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/BlokErrorDemoNode.java +109 -0
  175. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/ChainTestNode.java +65 -0
  176. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/HelloWorldNode.java +62 -0
  177. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/TransformDataNode.java +121 -0
  178. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/TypedGreetNode.java +41 -0
  179. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/server/BlokGrpcServer.java +103 -0
  180. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/server/BlokNodeRuntimeService.java +501 -0
  181. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/server/RuntimeServer.java +176 -0
  182. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/testing/MockContext.java +120 -0
  183. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/testing/TestRunner.java +59 -0
  184. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/Context.java +167 -0
  185. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/ExecutionMetrics.java +80 -0
  186. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/ExecutionRequest.java +61 -0
  187. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/ExecutionResult.java +188 -0
  188. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/HealthStatus.java +77 -0
  189. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/NodeConfig.java +139 -0
  190. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/Request.java +154 -0
  191. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/Response.java +77 -0
  192. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/validation/SchemaValidator.java +178 -0
  193. package/dist/scaffold-repo/sdks/java/src/main/proto/blok/runtime/v1/runtime.proto +302 -0
  194. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/errors/BlokErrorTest.java +416 -0
  195. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/logging/LoggerTest.java +176 -0
  196. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/node/NodeRegistryTest.java +227 -0
  197. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/node/TypedNodeTest.java +76 -0
  198. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/server/RuntimeServerTest.java +197 -0
  199. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/types/ExecutionResultTest.java +194 -0
  200. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/validation/SchemaValidatorTest.java +246 -0
  201. package/dist/scaffold-repo/sdks/php/.rr.yaml +29 -0
  202. package/dist/scaffold-repo/sdks/php/Dockerfile +61 -0
  203. package/dist/scaffold-repo/sdks/php/README.md +387 -0
  204. package/dist/scaffold-repo/sdks/php/bin/serve.php +95 -0
  205. package/dist/scaffold-repo/sdks/php/composer.json +41 -0
  206. package/dist/scaffold-repo/sdks/php/examples/ApiCallNode.php +103 -0
  207. package/dist/scaffold-repo/sdks/php/examples/BlokErrorDemoNode.php +90 -0
  208. package/dist/scaffold-repo/sdks/php/examples/ChainTestNode.php +56 -0
  209. package/dist/scaffold-repo/sdks/php/examples/HelloWorldNode.php +39 -0
  210. package/dist/scaffold-repo/sdks/php/examples/TransformDataNode.php +94 -0
  211. package/dist/scaffold-repo/sdks/php/examples/TypedGreetNode.php +57 -0
  212. package/dist/scaffold-repo/sdks/php/phpunit.xml +23 -0
  213. package/dist/scaffold-repo/sdks/php/proto/blok/runtime/v1/runtime.proto +302 -0
  214. package/dist/scaffold-repo/sdks/php/src/Config/ServerConfig.php +83 -0
  215. package/dist/scaffold-repo/sdks/php/src/Errors/BlokError.php +467 -0
  216. package/dist/scaffold-repo/sdks/php/src/Errors/BlokErrorBuilder.php +121 -0
  217. package/dist/scaffold-repo/sdks/php/src/Errors/BlokErrorCategory.php +83 -0
  218. package/dist/scaffold-repo/sdks/php/src/Errors/BlokErrorSeverity.php +30 -0
  219. package/dist/scaffold-repo/sdks/php/src/Errors/BuildContextSnapshot.php +141 -0
  220. package/dist/scaffold-repo/sdks/php/src/Errors/ErrorCategory.php +17 -0
  221. package/dist/scaffold-repo/sdks/php/src/Errors/NodeException.php +107 -0
  222. package/dist/scaffold-repo/sdks/php/src/Errors/Origin.php +35 -0
  223. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ErrorCategory.php +118 -0
  224. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ErrorSeverity.php +72 -0
  225. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteEvent.php +181 -0
  226. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteOptions.php +159 -0
  227. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteRequest.php +328 -0
  228. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteResponse.php +288 -0
  229. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/HealthRequest.php +59 -0
  230. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/HealthResponse/Status.php +54 -0
  231. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/HealthResponse.php +113 -0
  232. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ListNodesRequest.php +32 -0
  233. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ListNodesResponse.php +154 -0
  234. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/LogLine.php +156 -0
  235. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/Metrics.php +165 -0
  236. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeDescriptor.php +174 -0
  237. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeError.php +627 -0
  238. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeRef.php +134 -0
  239. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeRuntimeClient.php +101 -0
  240. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeStarted.php +68 -0
  241. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/PartialResult.php +59 -0
  242. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/Progress.php +85 -0
  243. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/RuntimeState.php +142 -0
  244. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/StepInfo.php +168 -0
  245. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/TriggerInfo.php +289 -0
  246. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/WorkflowInfo.php +176 -0
  247. package/dist/scaffold-repo/sdks/php/src/Genpb/GPBMetadata/Blok/Runtime/V1/Runtime.php +26 -0
  248. package/dist/scaffold-repo/sdks/php/src/Logging/LogEntry.php +47 -0
  249. package/dist/scaffold-repo/sdks/php/src/Logging/LogLevel.php +50 -0
  250. package/dist/scaffold-repo/sdks/php/src/Logging/Logger.php +133 -0
  251. package/dist/scaffold-repo/sdks/php/src/Node/NodeHandler.php +35 -0
  252. package/dist/scaffold-repo/sdks/php/src/Node/NodeReflector.php +21 -0
  253. package/dist/scaffold-repo/sdks/php/src/Node/NodeRegistry.php +172 -0
  254. package/dist/scaffold-repo/sdks/php/src/Node/TypedNode.php +159 -0
  255. package/dist/scaffold-repo/sdks/php/src/Server/BlokNodeRuntimeService.php +504 -0
  256. package/dist/scaffold-repo/sdks/php/src/Server/DecodeException.php +13 -0
  257. package/dist/scaffold-repo/sdks/php/src/Server/Middleware.php +18 -0
  258. package/dist/scaffold-repo/sdks/php/src/Server/MiddlewarePipeline.php +33 -0
  259. package/dist/scaffold-repo/sdks/php/src/Server/NodeRuntimeInterface.php +40 -0
  260. package/dist/scaffold-repo/sdks/php/src/Server/Server.php +157 -0
  261. package/dist/scaffold-repo/sdks/php/src/Testing/MockContext.php +161 -0
  262. package/dist/scaffold-repo/sdks/php/src/Testing/TestRunner.php +78 -0
  263. package/dist/scaffold-repo/sdks/php/src/Types/Context.php +80 -0
  264. package/dist/scaffold-repo/sdks/php/src/Types/ExecutionMetrics.php +48 -0
  265. package/dist/scaffold-repo/sdks/php/src/Types/ExecutionRequest.php +38 -0
  266. package/dist/scaffold-repo/sdks/php/src/Types/ExecutionResult.php +143 -0
  267. package/dist/scaffold-repo/sdks/php/src/Types/HealthStatus.php +42 -0
  268. package/dist/scaffold-repo/sdks/php/src/Types/NodeConfig.php +72 -0
  269. package/dist/scaffold-repo/sdks/php/src/Types/Request.php +82 -0
  270. package/dist/scaffold-repo/sdks/php/src/Types/Response.php +44 -0
  271. package/dist/scaffold-repo/sdks/php/src/Validation/SchemaValidator.php +197 -0
  272. package/dist/scaffold-repo/sdks/php/tests/Errors/BlokErrorTest.php +402 -0
  273. package/dist/scaffold-repo/sdks/php/tests/Logging/LoggerTest.php +165 -0
  274. package/dist/scaffold-repo/sdks/php/tests/Node/NodeRegistryTest.php +139 -0
  275. package/dist/scaffold-repo/sdks/php/tests/Node/TypedNodeTest.php +84 -0
  276. package/dist/scaffold-repo/sdks/php/tests/Server/BlokNodeRuntimeServiceTest.php +288 -0
  277. package/dist/scaffold-repo/sdks/php/tests/Testing/MockContextTest.php +184 -0
  278. package/dist/scaffold-repo/sdks/php/tests/Types/ExecutionResultTest.php +136 -0
  279. package/dist/scaffold-repo/sdks/php/tests/Validation/SchemaValidatorTest.php +191 -0
  280. package/dist/scaffold-repo/sdks/python3/Dockerfile +62 -0
  281. package/dist/scaffold-repo/sdks/python3/bin/serve.py +174 -0
  282. package/dist/scaffold-repo/sdks/python3/bin/worker.py +60 -0
  283. package/dist/scaffold-repo/sdks/python3/blok/__init__.py +61 -0
  284. package/dist/scaffold-repo/sdks/python3/blok/config/__init__.py +3 -0
  285. package/dist/scaffold-repo/sdks/python3/blok/config/server_config.py +116 -0
  286. package/dist/scaffold-repo/sdks/python3/blok/errors/__init__.py +50 -0
  287. package/dist/scaffold-repo/sdks/python3/blok/errors/blok_error.py +555 -0
  288. package/dist/scaffold-repo/sdks/python3/blok/errors/node_error.py +64 -0
  289. package/dist/scaffold-repo/sdks/python3/blok/logging/__init__.py +3 -0
  290. package/dist/scaffold-repo/sdks/python3/blok/logging/logger.py +82 -0
  291. package/dist/scaffold-repo/sdks/python3/blok/middleware/__init__.py +4 -0
  292. package/dist/scaffold-repo/sdks/python3/blok/middleware/logging_middleware.py +35 -0
  293. package/dist/scaffold-repo/sdks/python3/blok/middleware/recovery_middleware.py +36 -0
  294. package/dist/scaffold-repo/sdks/python3/blok/node/__init__.py +4 -0
  295. package/dist/scaffold-repo/sdks/python3/blok/node/define_node.py +239 -0
  296. package/dist/scaffold-repo/sdks/python3/blok/node/node_handler.py +35 -0
  297. package/dist/scaffold-repo/sdks/python3/blok/node/node_registry.py +136 -0
  298. package/dist/scaffold-repo/sdks/python3/blok/runtime/__init__.py +0 -0
  299. package/dist/scaffold-repo/sdks/python3/blok/runtime/v1/__init__.py +0 -0
  300. package/dist/scaffold-repo/sdks/python3/blok/runtime/v1/runtime_pb2.py +112 -0
  301. package/dist/scaffold-repo/sdks/python3/blok/runtime/v1/runtime_pb2_grpc.py +259 -0
  302. package/dist/scaffold-repo/sdks/python3/blok/server/__init__.py +3 -0
  303. package/dist/scaffold-repo/sdks/python3/blok/server/grpc_server.py +757 -0
  304. package/dist/scaffold-repo/sdks/python3/blok/server/runtime_server.py +165 -0
  305. package/dist/scaffold-repo/sdks/python3/blok/types/__init__.py +13 -0
  306. package/dist/scaffold-repo/sdks/python3/blok/types/context.py +162 -0
  307. package/dist/scaffold-repo/sdks/python3/blok/types/execution_request.py +74 -0
  308. package/dist/scaffold-repo/sdks/python3/blok/types/execution_result.py +103 -0
  309. package/dist/scaffold-repo/sdks/python3/blok/worker/__init__.py +10 -0
  310. package/dist/scaffold-repo/sdks/python3/blok/worker/job_message.py +34 -0
  311. package/dist/scaffold-repo/sdks/python3/blok/worker/worker.py +451 -0
  312. package/dist/scaffold-repo/sdks/python3/blok/worker/worker_config.py +129 -0
  313. package/dist/scaffold-repo/sdks/python3/examples/__init__.py +32 -0
  314. package/dist/scaffold-repo/sdks/python3/examples/api_call_node.py +85 -0
  315. package/dist/scaffold-repo/sdks/python3/examples/blok_error_demo_node.py +79 -0
  316. package/dist/scaffold-repo/sdks/python3/examples/chain_test_node.py +51 -0
  317. package/dist/scaffold-repo/sdks/python3/examples/hello_world_node.py +44 -0
  318. package/dist/scaffold-repo/sdks/python3/examples/transform_data_node.py +71 -0
  319. package/dist/scaffold-repo/sdks/python3/examples/typed_greet_node.py +25 -0
  320. package/dist/scaffold-repo/sdks/python3/proto/blok/runtime/v1/runtime.proto +302 -0
  321. package/dist/scaffold-repo/sdks/python3/pyproject.toml +47 -0
  322. package/dist/scaffold-repo/sdks/python3/requirements.txt +17 -0
  323. package/dist/scaffold-repo/sdks/python3/tests/__init__.py +0 -0
  324. package/dist/scaffold-repo/sdks/python3/tests/test_blok_error.py +341 -0
  325. package/dist/scaffold-repo/sdks/python3/tests/test_define_node.py +135 -0
  326. package/dist/scaffold-repo/sdks/python3/tests/test_discovery.py +99 -0
  327. package/dist/scaffold-repo/sdks/python3/tests/test_grpc_codec.py +260 -0
  328. package/dist/scaffold-repo/sdks/python3/tests/test_grpc_server.py +398 -0
  329. package/dist/scaffold-repo/sdks/ruby/Dockerfile +37 -0
  330. package/dist/scaffold-repo/sdks/ruby/Gemfile +5 -0
  331. package/dist/scaffold-repo/sdks/ruby/README.md +210 -0
  332. package/dist/scaffold-repo/sdks/ruby/Rakefile +11 -0
  333. package/dist/scaffold-repo/sdks/ruby/bin/serve.rb +105 -0
  334. package/dist/scaffold-repo/sdks/ruby/blok.gemspec +43 -0
  335. package/dist/scaffold-repo/sdks/ruby/config.ru +15 -0
  336. package/dist/scaffold-repo/sdks/ruby/examples/api_call_node.rb +99 -0
  337. package/dist/scaffold-repo/sdks/ruby/examples/blok_error_demo_node.rb +79 -0
  338. package/dist/scaffold-repo/sdks/ruby/examples/chain_test_node.rb +51 -0
  339. package/dist/scaffold-repo/sdks/ruby/examples/hello_world_node.rb +40 -0
  340. package/dist/scaffold-repo/sdks/ruby/examples/transform_data_node.rb +82 -0
  341. package/dist/scaffold-repo/sdks/ruby/examples/typed_greet_node.rb +25 -0
  342. package/dist/scaffold-repo/sdks/ruby/lib/blok/config/server_config.rb +76 -0
  343. package/dist/scaffold-repo/sdks/ruby/lib/blok/errors/blok_error.rb +476 -0
  344. package/dist/scaffold-repo/sdks/ruby/lib/blok/errors/build_context_snapshot.rb +99 -0
  345. package/dist/scaffold-repo/sdks/ruby/lib/blok/errors/error_category.rb +16 -0
  346. package/dist/scaffold-repo/sdks/ruby/lib/blok/errors/node_error.rb +84 -0
  347. package/dist/scaffold-repo/sdks/ruby/lib/blok/logging/log_entry.rb +46 -0
  348. package/dist/scaffold-repo/sdks/ruby/lib/blok/logging/log_level.rb +49 -0
  349. package/dist/scaffold-repo/sdks/ruby/lib/blok/logging/logger.rb +71 -0
  350. package/dist/scaffold-repo/sdks/ruby/lib/blok/middleware/logging_middleware.rb +45 -0
  351. package/dist/scaffold-repo/sdks/ruby/lib/blok/middleware/middleware.rb +36 -0
  352. package/dist/scaffold-repo/sdks/ruby/lib/blok/middleware/recovery_middleware.rb +31 -0
  353. package/dist/scaffold-repo/sdks/ruby/lib/blok/node/discovery.rb +59 -0
  354. package/dist/scaffold-repo/sdks/ruby/lib/blok/node/node_handler.rb +43 -0
  355. package/dist/scaffold-repo/sdks/ruby/lib/blok/node/node_registry.rb +107 -0
  356. package/dist/scaffold-repo/sdks/ruby/lib/blok/node/typed_node.rb +180 -0
  357. package/dist/scaffold-repo/sdks/ruby/lib/blok/runtime/v1/runtime_pb.rb +43 -0
  358. package/dist/scaffold-repo/sdks/ruby/lib/blok/runtime/v1/runtime_services_pb.rb +55 -0
  359. package/dist/scaffold-repo/sdks/ruby/lib/blok/server/grpc_server.rb +435 -0
  360. package/dist/scaffold-repo/sdks/ruby/lib/blok/server/runtime_app.rb +86 -0
  361. package/dist/scaffold-repo/sdks/ruby/lib/blok/testing/mock_context.rb +109 -0
  362. package/dist/scaffold-repo/sdks/ruby/lib/blok/testing/test_runner.rb +40 -0
  363. package/dist/scaffold-repo/sdks/ruby/lib/blok/types/context.rb +82 -0
  364. package/dist/scaffold-repo/sdks/ruby/lib/blok/types/execution_metrics.rb +43 -0
  365. package/dist/scaffold-repo/sdks/ruby/lib/blok/types/execution_request.rb +39 -0
  366. package/dist/scaffold-repo/sdks/ruby/lib/blok/types/execution_result.rb +117 -0
  367. package/dist/scaffold-repo/sdks/ruby/lib/blok/types/health_status.rb +42 -0
  368. package/dist/scaffold-repo/sdks/ruby/lib/blok/types/node_config.rb +73 -0
  369. package/dist/scaffold-repo/sdks/ruby/lib/blok/types/request.rb +71 -0
  370. package/dist/scaffold-repo/sdks/ruby/lib/blok/types/response.rb +46 -0
  371. package/dist/scaffold-repo/sdks/ruby/lib/blok/validation/schema_validator.rb +142 -0
  372. package/dist/scaffold-repo/sdks/ruby/lib/blok/version.rb +5 -0
  373. package/dist/scaffold-repo/sdks/ruby/lib/blok.rb +53 -0
  374. package/dist/scaffold-repo/sdks/ruby/proto/blok/runtime/v1/runtime.proto +302 -0
  375. package/dist/scaffold-repo/sdks/ruby/test/errors/blok_error_test.rb +339 -0
  376. package/dist/scaffold-repo/sdks/ruby/test/logging/logger_test.rb +155 -0
  377. package/dist/scaffold-repo/sdks/ruby/test/node/node_registry_test.rb +132 -0
  378. package/dist/scaffold-repo/sdks/ruby/test/node/typed_node_test.rb +67 -0
  379. package/dist/scaffold-repo/sdks/ruby/test/test_helper.rb +6 -0
  380. package/dist/scaffold-repo/sdks/ruby/test/testing/mock_context_test.rb +150 -0
  381. package/dist/scaffold-repo/sdks/ruby/test/types/execution_result_test.rb +129 -0
  382. package/dist/scaffold-repo/sdks/ruby/test/validation/schema_validator_test.rb +270 -0
  383. package/dist/scaffold-repo/sdks/rust/Cargo.lock +3044 -0
  384. package/dist/scaffold-repo/sdks/rust/Cargo.toml +82 -0
  385. package/dist/scaffold-repo/sdks/rust/Dockerfile +40 -0
  386. package/dist/scaffold-repo/sdks/rust/README.md +73 -0
  387. package/dist/scaffold-repo/sdks/rust/build.rs +32 -0
  388. package/dist/scaffold-repo/sdks/rust/proto/blok/runtime/v1/runtime.proto +302 -0
  389. package/dist/scaffold-repo/sdks/rust/src/blok_error.rs +1168 -0
  390. package/dist/scaffold-repo/sdks/rust/src/config.rs +158 -0
  391. package/dist/scaffold-repo/sdks/rust/src/errors.rs +142 -0
  392. package/dist/scaffold-repo/sdks/rust/src/grpc_server.rs +635 -0
  393. package/dist/scaffold-repo/sdks/rust/src/lib.rs +65 -0
  394. package/dist/scaffold-repo/sdks/rust/src/logging.rs +195 -0
  395. package/dist/scaffold-repo/sdks/rust/src/main.rs +79 -0
  396. package/dist/scaffold-repo/sdks/rust/src/middleware.rs +181 -0
  397. package/dist/scaffold-repo/sdks/rust/src/node.rs +172 -0
  398. package/dist/scaffold-repo/sdks/rust/src/nodes/api_call.rs +93 -0
  399. package/dist/scaffold-repo/sdks/rust/src/nodes/blok_error_demo.rs +151 -0
  400. package/dist/scaffold-repo/sdks/rust/src/nodes/chain_test.rs +57 -0
  401. package/dist/scaffold-repo/sdks/rust/src/nodes/hello_world.rs +83 -0
  402. package/dist/scaffold-repo/sdks/rust/src/nodes/mod.rs +18 -0
  403. package/dist/scaffold-repo/sdks/rust/src/nodes/transform_data.rs +142 -0
  404. package/dist/scaffold-repo/sdks/rust/src/nodes/typed_greet.rs +56 -0
  405. package/dist/scaffold-repo/sdks/rust/src/registry.rs +204 -0
  406. package/dist/scaffold-repo/sdks/rust/src/server.rs +63 -0
  407. package/dist/scaffold-repo/sdks/rust/src/testing.rs +175 -0
  408. package/dist/scaffold-repo/sdks/rust/src/types.rs +338 -0
  409. package/dist/scaffold-repo/sdks/rust/src/user_nodes/mod.rs +10 -0
  410. package/dist/scaffold-repo/sdks/rust/src/validation.rs +232 -0
  411. package/dist/scaffold-repo/sdks/rust/src/worker.rs +509 -0
  412. package/dist/scaffold-repo/sdks/rust/tests/grpc_integration.rs +306 -0
  413. package/dist/scaffold-repo/sdks/rust/tests/typed_node.rs +104 -0
  414. package/dist/scaffold-repo/triggers/cron/CHANGELOG.md +22 -0
  415. package/dist/scaffold-repo/triggers/cron/package.json +36 -0
  416. package/dist/scaffold-repo/triggers/cron/src/CronTrigger.ts +552 -0
  417. package/dist/scaffold-repo/triggers/cron/src/index.ts +77 -0
  418. package/dist/scaffold-repo/triggers/cron/tsconfig.json +32 -0
  419. package/dist/scaffold-repo/triggers/grpc/.env.example +8 -0
  420. package/dist/scaffold-repo/triggers/grpc/CHANGELOG.md +143 -0
  421. package/dist/scaffold-repo/triggers/grpc/README.md +25 -0
  422. package/dist/scaffold-repo/triggers/grpc/buf.gen.yaml +11 -0
  423. package/dist/scaffold-repo/triggers/grpc/buf.yaml +9 -0
  424. package/dist/scaffold-repo/triggers/grpc/localhost+2-key.pem +28 -0
  425. package/dist/scaffold-repo/triggers/grpc/localhost+2.pem +27 -0
  426. package/dist/scaffold-repo/triggers/grpc/package.json +61 -0
  427. package/dist/scaffold-repo/triggers/grpc/proto/workflow.proto +33 -0
  428. package/dist/scaffold-repo/triggers/grpc/src/GRpcTrigger.ts +297 -0
  429. package/dist/scaffold-repo/triggers/grpc/src/GrpcClient.ts +87 -0
  430. package/dist/scaffold-repo/triggers/grpc/src/GrpcServer.ts +68 -0
  431. package/dist/scaffold-repo/triggers/grpc/src/MessageDecode.ts +142 -0
  432. package/dist/scaffold-repo/triggers/grpc/src/NanoSDK.ts +146 -0
  433. package/dist/scaffold-repo/triggers/grpc/src/Nodes.ts +10 -0
  434. package/dist/scaffold-repo/triggers/grpc/src/Workflows.ts +5 -0
  435. package/dist/scaffold-repo/triggers/grpc/src/gen/workflow_pb.ts +142 -0
  436. package/dist/scaffold-repo/triggers/grpc/src/index.ts +22 -0
  437. package/dist/scaffold-repo/triggers/grpc/src/server.ts +8 -0
  438. package/dist/scaffold-repo/triggers/grpc/src/types/Message.ts +0 -0
  439. package/dist/scaffold-repo/triggers/grpc/src/types/RuntimeWorkflow.ts +7 -0
  440. package/dist/scaffold-repo/triggers/grpc/src/types/Workflows.ts +7 -0
  441. package/dist/scaffold-repo/triggers/grpc/tsconfig.json +34 -0
  442. package/dist/scaffold-repo/triggers/grpc/vitest.config.ts +29 -0
  443. package/dist/scaffold-repo/triggers/grpc/workflows/countries.json +27 -0
  444. package/dist/scaffold-repo/triggers/http/.blok/trace.db +0 -0
  445. package/dist/scaffold-repo/triggers/http/.blok/trace.db-shm +0 -0
  446. package/dist/scaffold-repo/triggers/http/.blok/trace.db-wal +0 -0
  447. package/dist/scaffold-repo/triggers/http/.dockerignore +23 -0
  448. package/dist/scaffold-repo/triggers/http/.env.example +8 -0
  449. package/dist/scaffold-repo/triggers/http/CHANGELOG.md +326 -0
  450. package/dist/scaffold-repo/triggers/http/Dockerfile +49 -0
  451. package/dist/scaffold-repo/triggers/http/Dockerfile.dev +34 -0
  452. package/dist/scaffold-repo/triggers/http/infra/docker-compose.yml +38 -0
  453. package/dist/scaffold-repo/triggers/http/notes/CLI_Commands/Authentication.md +74 -0
  454. package/dist/scaffold-repo/triggers/http/notes/CLI_Commands/Building.md +52 -0
  455. package/dist/scaffold-repo/triggers/http/notes/CLI_Commands/Create_Node.md +123 -0
  456. package/dist/scaffold-repo/triggers/http/notes/CLI_Commands/Create_Workflow.md +177 -0
  457. package/dist/scaffold-repo/triggers/http/notes/CLI_Commands/Deployment.md +69 -0
  458. package/dist/scaffold-repo/triggers/http/notes/Core_Concepts/Context.md +156 -0
  459. package/dist/scaffold-repo/triggers/http/notes/examples.md +104 -0
  460. package/dist/scaffold-repo/triggers/http/notes/index.md +51 -0
  461. package/dist/scaffold-repo/triggers/http/package.json +62 -0
  462. package/dist/scaffold-repo/triggers/http/public/favicon.ico +0 -0
  463. package/dist/scaffold-repo/triggers/http/public/metric/index.html +2101 -0
  464. package/dist/scaffold-repo/triggers/http/request.http +7 -0
  465. package/dist/scaffold-repo/triggers/http/src/AppRoutes.ts +64 -0
  466. package/dist/scaffold-repo/triggers/http/src/Nodes.ts +38 -0
  467. package/dist/scaffold-repo/triggers/http/src/Workflows.ts +18 -0
  468. package/dist/scaffold-repo/triggers/http/src/index.ts +86 -0
  469. package/dist/scaffold-repo/triggers/http/src/nodes/chain-init/index.ts +48 -0
  470. package/dist/scaffold-repo/triggers/http/src/nodes/chain-verify/index.ts +123 -0
  471. package/dist/scaffold-repo/triggers/http/src/nodes/eval/index.ts +69 -0
  472. package/dist/scaffold-repo/triggers/http/src/nodes/examples/README.md +14 -0
  473. package/dist/scaffold-repo/triggers/http/src/nodes/examples/chat-ui/index.html +228 -0
  474. package/dist/scaffold-repo/triggers/http/src/nodes/examples/chat-ui/index.ts +65 -0
  475. package/dist/scaffold-repo/triggers/http/src/nodes/examples/index.ts +14 -0
  476. package/dist/scaffold-repo/triggers/http/src/nodes/runtime-bridge/index.ts +84 -0
  477. package/dist/scaffold-repo/triggers/http/src/runner/HonoTraceRouterAdapter.ts +199 -0
  478. package/dist/scaffold-repo/triggers/http/src/runner/HttpTrigger.ts +2039 -0
  479. package/dist/scaffold-repo/triggers/http/src/runner/MessageDecode.ts +57 -0
  480. package/dist/scaffold-repo/triggers/http/src/runner/Util.ts +52 -0
  481. package/dist/scaffold-repo/triggers/http/src/runner/WorkflowRouter.ts +411 -0
  482. package/dist/scaffold-repo/triggers/http/src/runner/metrics/opentelemetry_metrics.ts +84 -0
  483. package/dist/scaffold-repo/triggers/http/src/runner/metrics/opentelemetry_traces.ts +30 -0
  484. package/dist/scaffold-repo/triggers/http/src/runner/nodeCatalog.ts +128 -0
  485. package/dist/scaffold-repo/triggers/http/src/runner/responseEmitter.ts +138 -0
  486. package/dist/scaffold-repo/triggers/http/src/runner/scanWorkflows.ts +201 -0
  487. package/dist/scaffold-repo/triggers/http/src/runner/types/ErrorResponse.ts +3 -0
  488. package/dist/scaffold-repo/triggers/http/src/runner/types/NodeTypes.ts +13 -0
  489. package/dist/scaffold-repo/triggers/http/src/runner/types/Nodes.ts +5 -0
  490. package/dist/scaffold-repo/triggers/http/src/runner/types/RuntimeWorkflow.ts +7 -0
  491. package/dist/scaffold-repo/triggers/http/src/runner/types/WorkflowRequest.ts +8 -0
  492. package/dist/scaffold-repo/triggers/http/src/runner/types/WorkflowResponse.ts +7 -0
  493. package/dist/scaffold-repo/triggers/http/src/runner/types/Workflows.ts +14 -0
  494. package/dist/scaffold-repo/triggers/http/src/workflows/countries-cats-helper.ts +30 -0
  495. package/dist/scaffold-repo/triggers/http/src/workflows/countries-handle-dsl.ts +25 -0
  496. package/dist/scaffold-repo/triggers/http/src/workflows/countries-helper.ts +18 -0
  497. package/dist/scaffold-repo/triggers/http/src/workflows/empty.ts +16 -0
  498. package/dist/scaffold-repo/triggers/http/src/workflows/eval/eval-retrieve.ts +23 -0
  499. package/dist/scaffold-repo/triggers/http/src/workflows/eval/eval-run.ts +39 -0
  500. package/dist/scaffold-repo/triggers/http/src/workflows/eval/foreign-auth.ts +24 -0
  501. package/dist/scaffold-repo/triggers/http/tsconfig.json +39 -0
  502. package/dist/scaffold-repo/triggers/http/vitest.config.ts +39 -0
  503. package/dist/scaffold-repo/triggers/http/workflows/json/agent-message.json +87 -0
  504. package/dist/scaffold-repo/triggers/http/workflows/json/agent-page.json +25 -0
  505. package/dist/scaffold-repo/triggers/http/workflows/json/agent-stream.json +30 -0
  506. package/dist/scaffold-repo/triggers/http/workflows/json/agent-tool-calculator.json +22 -0
  507. package/dist/scaffold-repo/triggers/http/workflows/json/agent-tool-weather.json +22 -0
  508. package/dist/scaffold-repo/triggers/http/workflows/json/chat-memory-message.json +54 -0
  509. package/dist/scaffold-repo/triggers/http/workflows/json/chat-memory-page.json +25 -0
  510. package/dist/scaffold-repo/triggers/http/workflows/json/chat-memory-stream.json +30 -0
  511. package/dist/scaffold-repo/triggers/http/workflows/json/chat-message.json +25 -0
  512. package/dist/scaffold-repo/triggers/http/workflows/json/chat-page.json +20 -0
  513. package/dist/scaffold-repo/triggers/http/workflows/json/chat-stream.json +30 -0
  514. package/dist/scaffold-repo/triggers/http/workflows/json/countries-py.json +27 -0
  515. package/dist/scaffold-repo/triggers/http/workflows/json/countries-vs-facts.json +50 -0
  516. package/dist/scaffold-repo/triggers/http/workflows/json/countries.json +27 -0
  517. package/dist/scaffold-repo/triggers/http/workflows/json/cross-runtime-chain.json +89 -0
  518. package/dist/scaffold-repo/triggers/http/workflows/json/dashboard-gen.json +34 -0
  519. package/dist/scaffold-repo/triggers/http/workflows/json/db-manager.json +34 -0
  520. package/dist/scaffold-repo/triggers/http/workflows/json/empty.json +13 -0
  521. package/dist/scaffold-repo/triggers/http/workflows/json/fanout-enqueue.json +48 -0
  522. package/dist/scaffold-repo/triggers/http/workflows/json/fanout-worker.json +41 -0
  523. package/dist/scaffold-repo/triggers/http/workflows/json/feedback.json +34 -0
  524. package/dist/scaffold-repo/triggers/http/workflows/json/films.json +27 -0
  525. package/dist/scaffold-repo/triggers/http/workflows/json/image-capture.json +34 -0
  526. package/dist/scaffold-repo/triggers/http/workflows/json/launches-by-year.json +27 -0
  527. package/dist/scaffold-repo/triggers/http/workflows/json/loadtest.json +24 -0
  528. package/dist/scaffold-repo/triggers/http/workflows/json/middleware/admin-only.json +31 -0
  529. package/dist/scaffold-repo/triggers/http/workflows/json/middleware/auth-check.json +59 -0
  530. package/dist/scaffold-repo/triggers/http/workflows/json/middleware/github-webhook-verify.json +34 -0
  531. package/dist/scaffold-repo/triggers/http/workflows/json/middleware/jwt-auth.json +46 -0
  532. package/dist/scaffold-repo/triggers/http/workflows/json/middleware/rate-limit.json +70 -0
  533. package/dist/scaffold-repo/triggers/http/workflows/json/middleware/redis-rate-limit.json +71 -0
  534. package/dist/scaffold-repo/triggers/http/workflows/json/mongodb.json +24 -0
  535. package/dist/scaffold-repo/triggers/http/workflows/json/rentals-pdf.json +65 -0
  536. package/dist/scaffold-repo/triggers/http/workflows/json/v05-admin-delete-user.json +42 -0
  537. package/dist/scaffold-repo/triggers/http/workflows/json/v05-async-job-poller.json +45 -0
  538. package/dist/scaffold-repo/triggers/http/workflows/json/v05-csv-import.json +122 -0
  539. package/dist/scaffold-repo/triggers/http/workflows/json/v05-data-export.json +105 -0
  540. package/dist/scaffold-repo/triggers/http/workflows/json/v05-event-router.json +97 -0
  541. package/dist/scaffold-repo/triggers/http/workflows/json/v05-github-handler-issues.json +22 -0
  542. package/dist/scaffold-repo/triggers/http/workflows/json/v05-github-handler-pr.json +22 -0
  543. package/dist/scaffold-repo/triggers/http/workflows/json/v05-github-handler-push.json +22 -0
  544. package/dist/scaffold-repo/triggers/http/workflows/json/v05-github-webhook-router.json +88 -0
  545. package/dist/scaffold-repo/triggers/http/workflows/json/v05-hello-global-mw.json +22 -0
  546. package/dist/scaffold-repo/triggers/http/workflows/json/v05-hello-with-mw.json +23 -0
  547. package/dist/scaffold-repo/triggers/http/workflows/json/v05-jwt-protected.json +23 -0
  548. package/dist/scaffold-repo/triggers/http/workflows/json/v05-multi-tenant-router.json +90 -0
  549. package/dist/scaffold-repo/triggers/http/workflows/json/v05-nested-control-flow.json +207 -0
  550. package/dist/scaffold-repo/triggers/http/workflows/json/v05-order-fulfillment.json +211 -0
  551. package/dist/scaffold-repo/triggers/http/workflows/json/v05-parallel-foreach-with-wait.json +47 -0
  552. package/dist/scaffold-repo/triggers/http/workflows/json/v05-polling-with-backoff.json +55 -0
  553. package/dist/scaffold-repo/triggers/http/workflows/json/v05-protected.json +23 -0
  554. package/dist/scaffold-repo/triggers/http/workflows/json/v05-redis-protected.json +23 -0
  555. package/dist/scaffold-repo/triggers/http/workflows/json/v05-saga.json +122 -0
  556. package/dist/scaffold-repo/triggers/http/workflows/json/v05-tenant-acme.json +22 -0
  557. package/dist/scaffold-repo/triggers/http/workflows/json/v05-tenant-beta.json +22 -0
  558. package/dist/scaffold-repo/triggers/http/workflows/json/v05-tenant-gamma.json +22 -0
  559. package/dist/scaffold-repo/triggers/http/workflows/json/v05-travel-booking.json +200 -0
  560. package/dist/scaffold-repo/triggers/http/workflows/json/v05-user-signup-saga.json +186 -0
  561. package/dist/scaffold-repo/triggers/http/workflows/json/v05-webhook-fanout.json +49 -0
  562. package/dist/scaffold-repo/triggers/http/workflows/json/v06-reliability-showcase.json +80 -0
  563. package/dist/scaffold-repo/triggers/http/workflows/json/v07-sse-publish.json +24 -0
  564. package/dist/scaffold-repo/triggers/http/workflows/json/v07-sse-stream.json +26 -0
  565. package/dist/scaffold-repo/triggers/http/workflows/json/v07-ws-echo.json +38 -0
  566. package/dist/scaffold-repo/triggers/http/workflows/json/webhook-github-issues.json +22 -0
  567. package/dist/scaffold-repo/triggers/http/workflows/json/webhook-github-pr.json +22 -0
  568. package/dist/scaffold-repo/triggers/http/workflows/json/webhook-github-push.json +32 -0
  569. package/dist/scaffold-repo/triggers/http/workflows/json/webhook-github.json +87 -0
  570. package/dist/scaffold-repo/triggers/http/workflows/json/webhook-linear-comment.json +22 -0
  571. package/dist/scaffold-repo/triggers/http/workflows/json/webhook-linear-issue.json +22 -0
  572. package/dist/scaffold-repo/triggers/http/workflows/json/webhook-linear.json +74 -0
  573. package/dist/scaffold-repo/triggers/http/workflows/json/webhook-stripe-customer-created.json +22 -0
  574. package/dist/scaffold-repo/triggers/http/workflows/json/webhook-stripe-invoice-paid.json +32 -0
  575. package/dist/scaffold-repo/triggers/http/workflows/json/webhook-stripe.json +24 -0
  576. package/dist/scaffold-repo/triggers/http/workflows/json/workflow-docs.json +34 -0
  577. package/dist/scaffold-repo/triggers/http/workflows/toml/countries.toml +21 -0
  578. package/dist/scaffold-repo/triggers/http/workflows/xml/countries.xml +23 -0
  579. package/dist/scaffold-repo/triggers/http/workflows/yaml/countries.yaml +19 -0
  580. package/dist/scaffold-repo/triggers/mcp/README.md +131 -0
  581. package/dist/scaffold-repo/triggers/mcp/package.json +39 -0
  582. package/dist/scaffold-repo/triggers/mcp/src/McpTrigger.ts +581 -0
  583. package/dist/scaffold-repo/triggers/mcp/src/index.ts +41 -0
  584. package/dist/scaffold-repo/triggers/mcp/tsconfig.json +32 -0
  585. package/dist/scaffold-repo/triggers/pubsub/CHANGELOG.md +22 -0
  586. package/dist/scaffold-repo/triggers/pubsub/package.json +66 -0
  587. package/dist/scaffold-repo/triggers/pubsub/src/PubSubTrigger.ts +424 -0
  588. package/dist/scaffold-repo/triggers/pubsub/src/adapters/AWSSNSAdapter.ts +352 -0
  589. package/dist/scaffold-repo/triggers/pubsub/src/adapters/AzureServiceBusAdapter.ts +303 -0
  590. package/dist/scaffold-repo/triggers/pubsub/src/adapters/GCPPubSubAdapter.ts +327 -0
  591. package/dist/scaffold-repo/triggers/pubsub/src/adapters/KafkaPubSubAdapter.ts +247 -0
  592. package/dist/scaffold-repo/triggers/pubsub/src/adapters/KafkaPubSubAdapter.ts.bak +251 -0
  593. package/dist/scaffold-repo/triggers/pubsub/src/adapters/NATSPubSubAdapter.ts +333 -0
  594. package/dist/scaffold-repo/triggers/pubsub/src/adapters/RedisStreamsPubSubAdapter.ts +256 -0
  595. package/dist/scaffold-repo/triggers/pubsub/src/adapters/factory.ts +88 -0
  596. package/dist/scaffold-repo/triggers/pubsub/src/index.ts +67 -0
  597. package/dist/scaffold-repo/triggers/pubsub/template/.env.example +8 -0
  598. package/dist/scaffold-repo/triggers/pubsub/template/package.json +45 -0
  599. package/dist/scaffold-repo/triggers/pubsub/template/src/Nodes.ts +20 -0
  600. package/dist/scaffold-repo/triggers/pubsub/template/src/Workflows.ts +8 -0
  601. package/dist/scaffold-repo/triggers/pubsub/template/src/index.ts +41 -0
  602. package/dist/scaffold-repo/triggers/pubsub/template/src/runner/PubSubServer.ts +39 -0
  603. package/dist/scaffold-repo/triggers/pubsub/template/src/runner/types/Workflows.ts +7 -0
  604. package/dist/scaffold-repo/triggers/pubsub/template/src/workflows/messages/on-message.ts +42 -0
  605. package/dist/scaffold-repo/triggers/pubsub/template/src/workflows/publish-order.ts +22 -0
  606. package/dist/scaffold-repo/triggers/pubsub/template/tsconfig.json +31 -0
  607. package/dist/scaffold-repo/triggers/pubsub/template/vitest.config.ts +39 -0
  608. package/dist/scaffold-repo/triggers/pubsub/tsconfig.json +32 -0
  609. package/dist/scaffold-repo/triggers/sse/.env.example +8 -0
  610. package/dist/scaffold-repo/triggers/sse/CHANGELOG.md +12 -0
  611. package/dist/scaffold-repo/triggers/sse/Dockerfile +47 -0
  612. package/dist/scaffold-repo/triggers/sse/Dockerfile.dev +33 -0
  613. package/dist/scaffold-repo/triggers/sse/package.json +37 -0
  614. package/dist/scaffold-repo/triggers/sse/src/SSETrigger.ts +489 -0
  615. package/dist/scaffold-repo/triggers/sse/src/bus.ts +208 -0
  616. package/dist/scaffold-repo/triggers/sse/src/index.ts +38 -0
  617. package/dist/scaffold-repo/triggers/sse/src/workflows/events/README.md +129 -0
  618. package/dist/scaffold-repo/triggers/sse/src/workflows/events/publish-demo.ts +40 -0
  619. package/dist/scaffold-repo/triggers/sse/src/workflows/events/stream-demo.ts +43 -0
  620. package/dist/scaffold-repo/triggers/sse/tsconfig.json +22 -0
  621. package/dist/scaffold-repo/triggers/sse/vitest.config.ts +39 -0
  622. package/dist/scaffold-repo/triggers/webhook/CHANGELOG.md +22 -0
  623. package/dist/scaffold-repo/triggers/webhook/package.json +36 -0
  624. package/dist/scaffold-repo/triggers/webhook/src/WebhookTrigger.ts +465 -0
  625. package/dist/scaffold-repo/triggers/webhook/src/index.ts +51 -0
  626. package/dist/scaffold-repo/triggers/webhook/src/verifiers.ts +394 -0
  627. package/dist/scaffold-repo/triggers/webhook/tsconfig.json +32 -0
  628. package/dist/scaffold-repo/triggers/websocket/.env.example +8 -0
  629. package/dist/scaffold-repo/triggers/websocket/CHANGELOG.md +22 -0
  630. package/dist/scaffold-repo/triggers/websocket/package.json +50 -0
  631. package/dist/scaffold-repo/triggers/websocket/src/Backplane.ts +167 -0
  632. package/dist/scaffold-repo/triggers/websocket/src/WebSocketTrigger.ts +910 -0
  633. package/dist/scaffold-repo/triggers/websocket/src/index.ts +50 -0
  634. package/dist/scaffold-repo/triggers/websocket/src/workflows/events/README.md +93 -0
  635. package/dist/scaffold-repo/triggers/websocket/src/workflows/events/echo-demo.ts +56 -0
  636. package/dist/scaffold-repo/triggers/websocket/tsconfig.json +22 -0
  637. package/dist/scaffold-repo/triggers/websocket/vitest.config.ts +39 -0
  638. package/dist/scaffold-repo/triggers/worker/CHANGELOG.md +22 -0
  639. package/dist/scaffold-repo/triggers/worker/package.json +68 -0
  640. package/dist/scaffold-repo/triggers/worker/src/WorkerTrigger.ts +943 -0
  641. package/dist/scaffold-repo/triggers/worker/src/adapters/BullMQAdapter.ts +296 -0
  642. package/dist/scaffold-repo/triggers/worker/src/adapters/InMemoryAdapter.ts +280 -0
  643. package/dist/scaffold-repo/triggers/worker/src/adapters/KafkaAdapter.ts +347 -0
  644. package/dist/scaffold-repo/triggers/worker/src/adapters/NATSAdapter.ts +505 -0
  645. package/dist/scaffold-repo/triggers/worker/src/adapters/PgBossAdapter.ts +319 -0
  646. package/dist/scaffold-repo/triggers/worker/src/adapters/RabbitMQAdapter.ts +318 -0
  647. package/dist/scaffold-repo/triggers/worker/src/adapters/RedisStreamsAdapter.ts +513 -0
  648. package/dist/scaffold-repo/triggers/worker/src/adapters/SQSAdapter.ts +314 -0
  649. package/dist/scaffold-repo/triggers/worker/src/adapters/factory.ts +111 -0
  650. package/dist/scaffold-repo/triggers/worker/src/index.ts +95 -0
  651. package/dist/scaffold-repo/triggers/worker/template/.env.example +18 -0
  652. package/dist/scaffold-repo/triggers/worker/template/package.json +46 -0
  653. package/dist/scaffold-repo/triggers/worker/template/src/Nodes.ts +20 -0
  654. package/dist/scaffold-repo/triggers/worker/template/src/Workflows.ts +8 -0
  655. package/dist/scaffold-repo/triggers/worker/template/src/index.ts +41 -0
  656. package/dist/scaffold-repo/triggers/worker/template/src/runner/WorkerServer.ts +34 -0
  657. package/dist/scaffold-repo/triggers/worker/template/src/runner/types/Workflows.ts +7 -0
  658. package/dist/scaffold-repo/triggers/worker/template/src/workflows/jobs/process-job.ts +40 -0
  659. package/dist/scaffold-repo/triggers/worker/template/tsconfig.json +31 -0
  660. package/dist/scaffold-repo/triggers/worker/template/vitest.config.ts +39 -0
  661. package/dist/scaffold-repo/triggers/worker/tsconfig.json +32 -0
  662. package/dist/scaffold-repo/workflows/json/agent-message.json +87 -0
  663. package/dist/scaffold-repo/workflows/json/agent-page.json +25 -0
  664. package/dist/scaffold-repo/workflows/json/agent-stream.json +30 -0
  665. package/dist/scaffold-repo/workflows/json/agent-tool-calculator.json +22 -0
  666. package/dist/scaffold-repo/workflows/json/agent-tool-weather.json +22 -0
  667. package/dist/scaffold-repo/workflows/json/chat-memory-message.json +54 -0
  668. package/dist/scaffold-repo/workflows/json/chat-memory-page.json +25 -0
  669. package/dist/scaffold-repo/workflows/json/chat-memory-stream.json +30 -0
  670. package/dist/scaffold-repo/workflows/json/chat-message.json +25 -0
  671. package/dist/scaffold-repo/workflows/json/chat-page.json +20 -0
  672. package/dist/scaffold-repo/workflows/json/chat-stream.json +30 -0
  673. package/dist/scaffold-repo/workflows/json/countries-vs-facts.json +50 -0
  674. package/dist/scaffold-repo/workflows/json/countries.json +27 -0
  675. package/dist/scaffold-repo/workflows/json/cron-heartbeat.json +15 -0
  676. package/dist/scaffold-repo/workflows/json/fanout-enqueue.json +48 -0
  677. package/dist/scaffold-repo/workflows/json/fanout-worker.json +41 -0
  678. package/dist/scaffold-repo/workflows/json/pubsub-on-order.json +24 -0
  679. package/dist/scaffold-repo/workflows/json/webhook-github-issues.json +22 -0
  680. package/dist/scaffold-repo/workflows/json/webhook-github-pr.json +22 -0
  681. package/dist/scaffold-repo/workflows/json/webhook-github-push.json +32 -0
  682. package/dist/scaffold-repo/workflows/json/webhook-github.json +87 -0
  683. package/dist/scaffold-repo/workflows/json/webhook-linear-comment.json +22 -0
  684. package/dist/scaffold-repo/workflows/json/webhook-linear-issue.json +22 -0
  685. package/dist/scaffold-repo/workflows/json/webhook-linear.json +74 -0
  686. package/dist/scaffold-repo/workflows/json/webhook-stripe-customer-created.json +22 -0
  687. package/dist/scaffold-repo/workflows/json/webhook-stripe-invoice-paid.json +32 -0
  688. package/dist/scaffold-repo/workflows/json/webhook-stripe.json +24 -0
  689. package/package.json +4 -4
@@ -0,0 +1,82 @@
1
+ from __future__ import annotations
2
+ import json
3
+ import threading
4
+ from datetime import datetime, timezone
5
+ from enum import IntEnum
6
+ from typing import Any, Dict, List, Optional
7
+
8
+
9
+ class LogLevel(IntEnum):
10
+ DEBUG = 0
11
+ INFO = 1
12
+ WARN = 2
13
+ ERROR = 3
14
+
15
+
16
+ _LEVEL_NAMES = {
17
+ LogLevel.DEBUG: "DEBUG",
18
+ LogLevel.INFO: "INFO",
19
+ LogLevel.WARN: "WARN",
20
+ LogLevel.ERROR: "ERROR",
21
+ }
22
+
23
+
24
+ def _parse_log_level(level: str) -> LogLevel:
25
+ """Parse a log level string to LogLevel enum."""
26
+ mapping = {"DEBUG": LogLevel.DEBUG, "INFO": LogLevel.INFO, "WARN": LogLevel.WARN, "ERROR": LogLevel.ERROR}
27
+ return mapping.get(level.upper(), LogLevel.INFO)
28
+
29
+
30
+ class Logger:
31
+ """Structured logger with a capture buffer.
32
+
33
+ Log entries are captured and can be returned in ExecutionResult.logs.
34
+ """
35
+
36
+ def __init__(self, min_level: LogLevel = LogLevel.INFO):
37
+ self._entries: List[str] = []
38
+ self._min_level = min_level
39
+ self._lock = threading.Lock()
40
+
41
+ @classmethod
42
+ def from_level_str(cls, level: str) -> Logger:
43
+ return cls(min_level=_parse_log_level(level))
44
+
45
+ def _log(self, level: LogLevel, message: str, fields: Optional[Dict[str, Any]] = None) -> None:
46
+ if level < self._min_level:
47
+ return
48
+
49
+ ts = datetime.now(timezone.utc).isoformat()
50
+ level_name = _LEVEL_NAMES[level]
51
+
52
+ if fields:
53
+ fields_str = " " + json.dumps(fields, default=str)
54
+ else:
55
+ fields_str = ""
56
+
57
+ entry = f"[{level_name}] {ts} {message}{fields_str}"
58
+
59
+ with self._lock:
60
+ self._entries.append(entry)
61
+
62
+ def debug(self, message: str, fields: Optional[Dict[str, Any]] = None) -> None:
63
+ self._log(LogLevel.DEBUG, message, fields)
64
+
65
+ def info(self, message: str, fields: Optional[Dict[str, Any]] = None) -> None:
66
+ self._log(LogLevel.INFO, message, fields)
67
+
68
+ def warn(self, message: str, fields: Optional[Dict[str, Any]] = None) -> None:
69
+ self._log(LogLevel.WARN, message, fields)
70
+
71
+ def error(self, message: str, fields: Optional[Dict[str, Any]] = None) -> None:
72
+ self._log(LogLevel.ERROR, message, fields)
73
+
74
+ def lines(self) -> List[str]:
75
+ """Return all log entries as formatted strings."""
76
+ with self._lock:
77
+ return list(self._entries)
78
+
79
+ def clear(self) -> None:
80
+ """Reset the log buffer."""
81
+ with self._lock:
82
+ self._entries.clear()
@@ -0,0 +1,4 @@
1
+ from blok.middleware.logging_middleware import logging_middleware
2
+ from blok.middleware.recovery_middleware import recovery_middleware
3
+
4
+ __all__ = ["logging_middleware", "recovery_middleware"]
@@ -0,0 +1,35 @@
1
+ from __future__ import annotations
2
+ import time
3
+ import logging
4
+ from typing import Any, Callable, Dict
5
+
6
+ logger = logging.getLogger("blok")
7
+
8
+
9
+ def logging_middleware(next_fn: Callable) -> Callable:
10
+ """Middleware that logs the execution of each node with timing."""
11
+
12
+ def wrapper(ctx, config: Dict[str, Any]) -> Any:
13
+ start = time.monotonic()
14
+ logger.info("node execution started [workflow=%s]", ctx.workflow_name)
15
+
16
+ try:
17
+ result = next_fn(ctx, config)
18
+ duration_ms = (time.monotonic() - start) * 1000.0
19
+ logger.info(
20
+ "node execution completed [workflow=%s] [duration_ms=%.2f]",
21
+ ctx.workflow_name,
22
+ duration_ms,
23
+ )
24
+ return result
25
+ except Exception as e:
26
+ duration_ms = (time.monotonic() - start) * 1000.0
27
+ logger.error(
28
+ "node execution failed [workflow=%s] [duration_ms=%.2f] [error=%s]",
29
+ ctx.workflow_name,
30
+ duration_ms,
31
+ str(e),
32
+ )
33
+ raise
34
+
35
+ return wrapper
@@ -0,0 +1,36 @@
1
+ from __future__ import annotations
2
+ import traceback
3
+ from typing import Any, Callable, Dict
4
+
5
+ from blok.errors.blok_error import BlokError
6
+ from blok.errors.node_error import NodeError, ErrorCategory
7
+
8
+
9
+ def recovery_middleware(next_fn: Callable) -> Callable:
10
+ """Middleware that catches unhandled exceptions and converts them to NodeErrors.
11
+
12
+ ``BlokError`` instances pass through untouched — they're already
13
+ structured per master plan §17 and would lose every field except
14
+ ``message`` if wrapped as a legacy ``NodeError``. Same with the legacy
15
+ ``NodeError``: pre-wrapped errors keep their shape.
16
+ """
17
+
18
+ def wrapper(ctx, config: Dict[str, Any]) -> Any:
19
+ try:
20
+ return next_fn(ctx, config)
21
+ except BlokError:
22
+ # Structured BlokError: pass through verbatim so the registry
23
+ # + gRPC servicer can serialize every field losslessly.
24
+ raise
25
+ except NodeError:
26
+ raise
27
+ except Exception as e:
28
+ raise NodeError(
29
+ message=f"unhandled exception: {e}",
30
+ code=500,
31
+ category=ErrorCategory.EXECUTION,
32
+ details={"traceback": traceback.format_exc()},
33
+ cause=e,
34
+ ) from e
35
+
36
+ return wrapper
@@ -0,0 +1,4 @@
1
+ from blok.node.node_handler import NodeHandler
2
+ from blok.node.node_registry import NodeRegistry
3
+
4
+ __all__ = ["NodeHandler", "NodeRegistry"]
@@ -0,0 +1,239 @@
1
+ """Typed, declarative node authoring for the Python SDK (SPEC-B P2).
2
+
3
+ The `@node` decorator is the Python equivalent of the TypeScript `defineNode`:
4
+ declare typed Pydantic `Input`/`Output` models, get automatic validation +
5
+ JSON-Schema reflection, and auto-registration — instead of a raw
6
+ `Dict[str, Any]` handler with manual `.get()` parsing.
7
+
8
+ Example::
9
+
10
+ from pydantic import BaseModel, Field
11
+ from blok import node, Context
12
+
13
+ class Input(BaseModel):
14
+ query: str = Field(min_length=1)
15
+ limit: int = Field(10, ge=1, le=100)
16
+
17
+ class Output(BaseModel):
18
+ results: list[str]
19
+ count: int
20
+
21
+ @node(name="@acme/search", description="Full-text search")
22
+ def search(ctx: Context, input: Input) -> Output:
23
+ rows = do_search(input.query, input.limit) # input is a validated Input
24
+ return Output(results=rows, count=len(rows))
25
+
26
+ The SDK validates `config -> Input` BEFORE `search` runs (a Pydantic
27
+ `ValidationError` becomes a structured `BlokError` with HTTP 400 + field paths),
28
+ validates the return against `Output`, and serializes it to a JSON dict. Omit
29
+ the model annotations and `@node` behaves like a legacy raw-dict handler, so
30
+ migration is incremental and the existing `NodeHandler` ABC keeps working.
31
+ """
32
+
33
+ from __future__ import annotations
34
+
35
+ import importlib.util
36
+ import inspect
37
+ import logging
38
+ import os
39
+ from typing import Any, Callable, Dict, List, Optional, Tuple, Type, get_type_hints
40
+
41
+ from pydantic import BaseModel, ValidationError
42
+
43
+ from ..errors.blok_error import BlokError
44
+ from ..types.context import Context
45
+ from .node_handler import NodeHandler
46
+
47
+ # Module-global collection of `@node`-decorated handlers. Importing the module
48
+ # that declares them runs the decorator (side effect) and appends here;
49
+ # `register_decorated(registry)` then flushes them into a registry, so authors
50
+ # never edit a central `register_all`.
51
+ _DECORATED_NODES: List[NodeHandler] = []
52
+
53
+
54
+ def _format_validation_error(node_name: str, err: ValidationError) -> str:
55
+ parts: List[str] = []
56
+ for e in err.errors():
57
+ loc = ".".join(str(x) for x in e.get("loc", ())) or "(root)"
58
+ parts.append(f"{loc} ({e.get('msg', 'invalid')})")
59
+ return f"Validation failed for node '{node_name}': " + "; ".join(parts)
60
+
61
+
62
+ class FunctionNode(NodeHandler):
63
+ """A `NodeHandler` produced by `@node`. Validates I/O against Pydantic models."""
64
+
65
+ def __init__(
66
+ self,
67
+ *,
68
+ name: str,
69
+ description: str,
70
+ func: Callable[[Context, Any], Any],
71
+ input_model: Optional[Type[BaseModel]],
72
+ output_model: Optional[Type[BaseModel]],
73
+ ) -> None:
74
+ self.name = name
75
+ self.description = description
76
+ self._func = func
77
+ self.input_model = input_model
78
+ self.output_model = output_model
79
+
80
+ def execute(self, ctx: Context, config: Dict[str, Any]) -> Any:
81
+ # 1. Validate input → typed model (or pass the raw dict through untyped).
82
+ validated_input: Any = config
83
+ if self.input_model is not None:
84
+ try:
85
+ validated_input = self.input_model.model_validate(config)
86
+ except ValidationError as err:
87
+ raise BlokError.validation(
88
+ code="NODE_INPUT_VALIDATION",
89
+ message=_format_validation_error(self.name, err),
90
+ details=err.errors(),
91
+ http_status=400,
92
+ node=self.name,
93
+ ) from err
94
+
95
+ # 2. Run the user's function.
96
+ result = self._func(ctx, validated_input)
97
+
98
+ # 3. Validate + serialize output (when declared).
99
+ if self.output_model is not None:
100
+ model = result if isinstance(result, self.output_model) else None
101
+ if model is None:
102
+ try:
103
+ model = self.output_model.model_validate(result)
104
+ except ValidationError as err:
105
+ raise BlokError.validation(
106
+ code="NODE_OUTPUT_VALIDATION",
107
+ message=f"Output validation failed for node '{self.name}': "
108
+ + "; ".join(
109
+ f"{'.'.join(str(x) for x in e.get('loc', ()))} ({e.get('msg', 'invalid')})"
110
+ for e in err.errors()
111
+ ),
112
+ details=err.errors(),
113
+ http_status=500,
114
+ node=self.name,
115
+ ) from err
116
+ return model.model_dump(mode="json")
117
+
118
+ # Untyped: a Pydantic model still serializes; otherwise pass through.
119
+ if isinstance(result, BaseModel):
120
+ return result.model_dump(mode="json")
121
+ return result
122
+
123
+ def input_json_schema(self) -> Optional[Dict[str, Any]]:
124
+ return self.input_model.model_json_schema() if self.input_model is not None else None
125
+
126
+ def output_json_schema(self) -> Optional[Dict[str, Any]]:
127
+ return self.output_model.model_json_schema() if self.output_model is not None else None
128
+
129
+
130
+ def _resolve_models(
131
+ func: Callable[..., Any],
132
+ ) -> Tuple[Optional[Type[BaseModel]], Optional[Type[BaseModel]]]:
133
+ """Infer the input/output Pydantic models from a node function's signature.
134
+
135
+ Convention: `def execute(ctx, input: Input) -> Output`. The input model is
136
+ the annotation of the SECOND positional parameter; the output model is the
137
+ return annotation. Non-`BaseModel` (or missing) annotations → `None`
138
+ (untyped — the node receives the raw dict).
139
+ """
140
+ try:
141
+ hints = get_type_hints(func)
142
+ except Exception:
143
+ hints = {}
144
+
145
+ sig = inspect.signature(func)
146
+ params = list(sig.parameters.values())
147
+
148
+ input_model: Optional[Type[BaseModel]] = None
149
+ if len(params) >= 2:
150
+ second = params[1]
151
+ ann = hints.get(second.name, second.annotation)
152
+ if isinstance(ann, type) and issubclass(ann, BaseModel):
153
+ input_model = ann
154
+
155
+ ret = hints.get("return", sig.return_annotation)
156
+ output_model = ret if isinstance(ret, type) and issubclass(ret, BaseModel) else None
157
+
158
+ return input_model, output_model
159
+
160
+
161
+ def node(
162
+ name: str,
163
+ description: str = "",
164
+ *,
165
+ register: bool = True,
166
+ ) -> Callable[[Callable[[Context, Any], Any]], FunctionNode]:
167
+ """Decorate a node function into a validated, auto-registered `FunctionNode`.
168
+
169
+ :param name: the node's registered name (e.g. `"@acme/search"`).
170
+ :param description: human-readable description (surfaced in `/__blok/nodes`).
171
+ :param register: append to the module-global collection for
172
+ `register_decorated()`. Set `False` for ad-hoc / test nodes.
173
+ """
174
+
175
+ def decorator(func: Callable[[Context, Any], Any]) -> FunctionNode:
176
+ input_model, output_model = _resolve_models(func)
177
+ handler = FunctionNode(
178
+ name=name,
179
+ description=description,
180
+ func=func,
181
+ input_model=input_model,
182
+ output_model=output_model,
183
+ )
184
+ if register:
185
+ _DECORATED_NODES.append(handler)
186
+ return handler
187
+
188
+ return decorator
189
+
190
+
191
+ def registered_nodes() -> List[NodeHandler]:
192
+ """All `@node`-decorated handlers collected so far (import-order)."""
193
+ return list(_DECORATED_NODES)
194
+
195
+
196
+ def register_decorated(registry: Any) -> int:
197
+ """Register every collected `@node` handler into `registry`. Returns the count."""
198
+ count = 0
199
+ for handler in _DECORATED_NODES:
200
+ registry.register(getattr(handler, "name"), handler)
201
+ count += 1
202
+ return count
203
+
204
+
205
+ def load_user_nodes(registry: Any, nodes_dir: Optional[str]) -> int:
206
+ """Discover + register user-authored `@node` handlers from a directory.
207
+
208
+ Each user node lives in ``<nodes_dir>/<name>/node.py`` and self-registers via
209
+ the `@node` decorator on import. We import each module so its decorator runs,
210
+ then register only the handlers collected during THIS call — purely additive,
211
+ so the SDK's built-in nodes (registered earlier) are untouched. Returns the
212
+ number of newly registered nodes. A node that fails to import is logged and
213
+ skipped so one bad file can't sink the whole runtime.
214
+ """
215
+ if not nodes_dir or not os.path.isdir(nodes_dir):
216
+ return 0
217
+ before = len(_DECORATED_NODES)
218
+ log = logging.getLogger("blok.discovery")
219
+ for entry in sorted(os.listdir(nodes_dir)):
220
+ node_file = os.path.join(nodes_dir, entry, "node.py")
221
+ if not os.path.isfile(node_file):
222
+ continue
223
+ spec = importlib.util.spec_from_file_location(f"blok_user_node_{entry}", node_file)
224
+ if spec is None or spec.loader is None:
225
+ continue
226
+ try:
227
+ module = importlib.util.module_from_spec(spec)
228
+ spec.loader.exec_module(module) # runs the @node decorator(s)
229
+ except Exception: # noqa: BLE001 — one bad node must not crash the runtime
230
+ log.exception("Failed to load user node from %s", node_file)
231
+ new_handlers = _DECORATED_NODES[before:]
232
+ for handler in new_handlers:
233
+ registry.register(getattr(handler, "name"), handler)
234
+ return len(new_handlers)
235
+
236
+
237
+ def _reset_decorated_for_tests() -> None:
238
+ """Clear the global collection (test isolation)."""
239
+ _DECORATED_NODES.clear()
@@ -0,0 +1,35 @@
1
+ from __future__ import annotations
2
+ from abc import ABC, abstractmethod
3
+ from typing import Any, Dict, Tuple
4
+
5
+ from blok.types.context import Context
6
+
7
+
8
+ class NodeHandler(ABC):
9
+ """Base class that all Blok nodes must inherit from.
10
+
11
+ Subclasses must implement the ``execute`` method which receives the
12
+ workflow context and node-specific configuration, and returns a
13
+ data value (any JSON-serializable value).
14
+
15
+ Example::
16
+
17
+ class GreetNode(NodeHandler):
18
+ def execute(self, ctx, config):
19
+ name = ctx.request.body_str("name") or "World"
20
+ prefix = config.get("prefix", "Hello")
21
+ return {"message": f"{prefix}, {name}!"}
22
+ """
23
+
24
+ @abstractmethod
25
+ def execute(self, ctx: Context, config: Dict[str, Any]) -> Any:
26
+ """Execute the node logic.
27
+
28
+ Args:
29
+ ctx: The workflow execution context.
30
+ config: Node-specific configuration.
31
+
32
+ Returns:
33
+ JSON-serializable result data.
34
+ """
35
+ raise NotImplementedError
@@ -0,0 +1,136 @@
1
+ from __future__ import annotations
2
+ import time
3
+ import traceback
4
+ from typing import Any, Callable, Dict, List, Optional
5
+
6
+ from blok.node.node_handler import NodeHandler
7
+ from blok.types.execution_request import ExecutionRequest
8
+ from blok.types.execution_result import ExecutionMetrics, ExecutionResult
9
+ from blok.errors.blok_error import BlokError
10
+ from blok.errors.node_error import NodeError
11
+
12
+
13
+ # Middleware type: receives a callable and returns a wrapped callable
14
+ Middleware = Callable[
15
+ [Callable[["Context", Dict[str, Any]], Any]],
16
+ Callable[["Context", Dict[str, Any]], Any],
17
+ ]
18
+
19
+
20
+ class HealthStatus:
21
+ """Represents the health status of the runtime."""
22
+
23
+ __slots__ = ("status", "version", "nodes_loaded")
24
+
25
+ def __init__(self, status: str, version: str, nodes_loaded: List[str]):
26
+ self.status = status
27
+ self.version = version
28
+ self.nodes_loaded = nodes_loaded
29
+
30
+ def to_dict(self) -> Dict[str, Any]:
31
+ return {
32
+ "status": self.status,
33
+ "version": self.version,
34
+ "nodes_loaded": self.nodes_loaded,
35
+ }
36
+
37
+
38
+ class NodeRegistry:
39
+ """Manages registered node handlers and dispatches execution requests.
40
+
41
+ Holds a map of node names to handler instances, applies middleware,
42
+ and measures execution timing.
43
+ """
44
+
45
+ def __init__(self, version: str = "1.0.0"):
46
+ self._nodes: Dict[str, NodeHandler] = {}
47
+ self._middlewares: List[Middleware] = []
48
+ self._version = version
49
+
50
+ def register(self, name: str, handler: NodeHandler) -> None:
51
+ """Register a node handler under the given name."""
52
+ self._nodes[name] = handler
53
+
54
+ def get(self, name: str) -> Optional[NodeHandler]:
55
+ """Look up a node handler by name."""
56
+ return self._nodes.get(name)
57
+
58
+ def use(self, middleware: Middleware) -> None:
59
+ """Add a middleware to the execution pipeline."""
60
+ self._middlewares.append(middleware)
61
+
62
+ def node_names(self) -> List[str]:
63
+ """Return the names of all registered nodes."""
64
+ return sorted(self._nodes.keys())
65
+
66
+ def execute(self, execution_request: ExecutionRequest) -> ExecutionResult:
67
+ """Execute a node by dispatching through the registry.
68
+
69
+ Returns an ExecutionResult with timing metrics.
70
+ """
71
+ node_name = execution_request.node.name
72
+ handler = self.get(node_name)
73
+
74
+ if handler is None:
75
+ return ExecutionResult.error_result(
76
+ f"node '{node_name}' not found in registry"
77
+ )
78
+
79
+ # Build a callable that invokes the handler
80
+ def call_handler(ctx, config):
81
+ return handler.execute(ctx, config)
82
+
83
+ callable_fn = call_handler
84
+
85
+ # Apply middleware chain (each middleware wraps the callable)
86
+ for mw in self._middlewares:
87
+ callable_fn = mw(callable_fn)
88
+
89
+ start_time = time.monotonic()
90
+
91
+ try:
92
+ data = callable_fn(
93
+ execution_request.context,
94
+ execution_request.node.config,
95
+ )
96
+ duration_ms = (time.monotonic() - start_time) * 1000.0
97
+
98
+ metrics = ExecutionMetrics(duration_ms=duration_ms)
99
+ result = ExecutionResult.success_with_metrics(data, metrics)
100
+
101
+ # Include context vars so the runner can propagate them downstream
102
+ ctx_vars = execution_request.context.vars
103
+ if ctx_vars:
104
+ result.with_vars(ctx_vars)
105
+
106
+ return result
107
+
108
+ except BlokError as e:
109
+ # Structured-error path (master plan §17). The BlokError instance
110
+ # is passed through verbatim so the gRPC servicer can serialize
111
+ # every field (category, severity, remediation, retryable hints,
112
+ # cause chain, etc.) into the proto NodeError.
113
+ duration_ms = (time.monotonic() - start_time) * 1000.0
114
+ result = ExecutionResult(success=False, data=None, errors=e)
115
+ result.with_metrics(ExecutionMetrics(duration_ms=duration_ms))
116
+ return result
117
+
118
+ except NodeError as e:
119
+ duration_ms = (time.monotonic() - start_time) * 1000.0
120
+ result = ExecutionResult.error_with_details(e.message, e.to_dict())
121
+ result.with_metrics(ExecutionMetrics(duration_ms=duration_ms))
122
+ return result
123
+
124
+ except Exception as e:
125
+ duration_ms = (time.monotonic() - start_time) * 1000.0
126
+ result = ExecutionResult.error_result(str(e))
127
+ result.with_metrics(ExecutionMetrics(duration_ms=duration_ms))
128
+ return result
129
+
130
+ def health(self) -> HealthStatus:
131
+ """Return the health status of the runtime."""
132
+ return HealthStatus(
133
+ status="healthy",
134
+ version=self._version,
135
+ nodes_loaded=self.node_names(),
136
+ )