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,501 @@
1
+ package com.blok.blok.server;
2
+
3
+ import com.blok.blok.errors.BlokError;
4
+ import com.blok.blok.errors.BlokErrorCategory;
5
+ import com.blok.blok.errors.BlokErrorSeverity;
6
+ import com.blok.blok.node.NodeRegistry;
7
+ import com.blok.blok.types.Context;
8
+ import com.blok.blok.types.ExecutionRequest;
9
+ import com.blok.blok.types.ExecutionResult;
10
+ import com.blok.blok.types.NodeConfig;
11
+ import com.blok.blok.types.Request;
12
+ import com.blok.blok.types.Response;
13
+ // `java_multiple_files = true` in runtime.proto puts each message and enum
14
+ // at the top level of the `com.blok.runtime.v1` package.
15
+ import com.blok.runtime.v1.ErrorCategory;
16
+ import com.blok.runtime.v1.ErrorSeverity;
17
+ import com.blok.runtime.v1.ExecuteEvent;
18
+ import com.blok.runtime.v1.ExecuteRequest;
19
+ import com.blok.runtime.v1.ExecuteResponse;
20
+ import com.blok.runtime.v1.HealthRequest;
21
+ import com.blok.runtime.v1.HealthResponse;
22
+ import com.blok.runtime.v1.ListNodesRequest;
23
+ import com.blok.runtime.v1.ListNodesResponse;
24
+ import com.blok.runtime.v1.Metrics;
25
+ import com.blok.runtime.v1.NodeDescriptor;
26
+ import com.blok.runtime.v1.NodeError;
27
+ import com.blok.runtime.v1.NodeRuntimeGrpc;
28
+ import com.blok.runtime.v1.NodeStarted;
29
+ import com.blok.runtime.v1.RuntimeState;
30
+ import com.blok.runtime.v1.TriggerInfo;
31
+ import com.blok.runtime.v1.WorkflowInfo;
32
+ import com.google.protobuf.Timestamp;
33
+ import com.google.gson.Gson;
34
+ import com.google.gson.GsonBuilder;
35
+ import com.google.gson.JsonElement;
36
+ import com.google.gson.JsonObject;
37
+ import com.google.gson.JsonParser;
38
+ import com.google.gson.JsonSyntaxException;
39
+ import com.google.gson.reflect.TypeToken;
40
+ import com.google.protobuf.ByteString;
41
+ import io.grpc.Status;
42
+ import io.grpc.stub.StreamObserver;
43
+
44
+ import java.lang.reflect.Type;
45
+ import java.nio.charset.StandardCharsets;
46
+ import java.util.HashMap;
47
+ import java.util.Map;
48
+
49
+ /**
50
+ * gRPC implementation of the canonical Blok {@code NodeRuntime} v1 service.
51
+ *
52
+ * <p>Wire contract: {@code proto/blok/runtime/v1/runtime.proto}. Generated
53
+ * stubs are produced by {@code protobuf-maven-plugin} at build time
54
+ * (configured in {@code pom.xml}).
55
+ *
56
+ * <p>Single Responsibility: translate proto messages into the SDK's internal
57
+ * {@link ExecutionRequest} / {@link ExecutionResult} and dispatch to
58
+ * {@link NodeRegistry}. All node-level error handling lives in
59
+ * {@code NodeRegistry.execute(ExecutionRequest)}.
60
+ *
61
+ * <p>The proto sends {@code inputs}, {@code previous_output}, {@code vars},
62
+ * and the request {@code body} as raw JSON-encoded {@code bytes}. The SDK
63
+ * JSON-decodes them lazily here at the proto boundary so node handlers see
64
+ * the same map shapes as the HTTP path.
65
+ */
66
+ public final class BlokNodeRuntimeService extends NodeRuntimeGrpc.NodeRuntimeImplBase {
67
+
68
+ private static final Gson GSON = new GsonBuilder().serializeNulls().create();
69
+ private static final Type MAP_TYPE = new TypeToken<Map<String, Object>>() {}.getType();
70
+
71
+ private final NodeRegistry registry;
72
+ private final String sdkVersion;
73
+
74
+ public BlokNodeRuntimeService(NodeRegistry registry, String sdkVersion) {
75
+ if (registry == null) {
76
+ throw new IllegalArgumentException("registry must not be null");
77
+ }
78
+ this.registry = registry;
79
+ this.sdkVersion = sdkVersion == null || sdkVersion.isBlank() ? "1.0.0" : sdkVersion;
80
+ }
81
+
82
+ @Override
83
+ public void execute(ExecuteRequest request, StreamObserver<ExecuteResponse> responseObserver) {
84
+ ExecutionRequest executionRequest;
85
+ try {
86
+ executionRequest = decodeExecuteRequest(request);
87
+ } catch (DecodeException e) {
88
+ responseObserver.onError(Status.INVALID_ARGUMENT.withDescription(e.getMessage()).asRuntimeException());
89
+ return;
90
+ }
91
+
92
+ ExecutionResult result = registry.execute(executionRequest);
93
+ responseObserver.onNext(encodeExecuteResponse(result, executionRequest.getNode().getName()));
94
+ responseObserver.onCompleted();
95
+ }
96
+
97
+ /**
98
+ * Server-streaming variant of {@link #execute}. Emits, in order:
99
+ * (1) one {@code NodeStarted} event marking call acceptance,
100
+ * (2) one terminal {@code ExecuteResponse} matching the unary payload.
101
+ *
102
+ * <p>Log capture (LogLine events) is intentionally out of scope for the
103
+ * Phase 5 Java pilot — {@code NodeHandler.execute} has no per-call
104
+ * logger sink, and threading one through would change the SDK API.
105
+ * Real-time log streaming arrives in a follow-up.
106
+ */
107
+ @Override
108
+ public void executeStream(ExecuteRequest request, StreamObserver<ExecuteEvent> responseObserver) {
109
+ ExecutionRequest executionRequest;
110
+ try {
111
+ executionRequest = decodeExecuteRequest(request);
112
+ } catch (DecodeException e) {
113
+ responseObserver.onError(Status.INVALID_ARGUMENT.withDescription(e.getMessage()).asRuntimeException());
114
+ return;
115
+ }
116
+
117
+ responseObserver.onNext(ExecuteEvent.newBuilder()
118
+ .setStarted(NodeStarted.newBuilder().setAt(currentTimestamp()).build())
119
+ .build());
120
+
121
+ ExecutionResult result = registry.execute(executionRequest);
122
+ ExecuteResponse finalResponse = encodeExecuteResponse(result, executionRequest.getNode().getName());
123
+
124
+ responseObserver.onNext(ExecuteEvent.newBuilder().setFinal(finalResponse).build());
125
+ responseObserver.onCompleted();
126
+ }
127
+
128
+ private static Timestamp currentTimestamp() {
129
+ long millis = System.currentTimeMillis();
130
+ return Timestamp.newBuilder()
131
+ .setSeconds(millis / 1000)
132
+ .setNanos((int) ((millis % 1000) * 1_000_000))
133
+ .build();
134
+ }
135
+
136
+ @Override
137
+ public void health(HealthRequest request, StreamObserver<HealthResponse> responseObserver) {
138
+ HealthResponse.Builder builder = HealthResponse.newBuilder()
139
+ .setStatus(HealthResponse.Status.SERVING)
140
+ .setSdkVersion(sdkVersion);
141
+ builder.addAllRegisteredNodes(registry.nodeNames());
142
+ responseObserver.onNext(builder.build());
143
+ responseObserver.onCompleted();
144
+ }
145
+
146
+ @Override
147
+ public void listNodes(ListNodesRequest request, StreamObserver<ListNodesResponse> responseObserver) {
148
+ ListNodesResponse.Builder builder = ListNodesResponse.newBuilder()
149
+ .setSdkName("blok-java")
150
+ .setSdkVersion(sdkVersion)
151
+ .setProtoVersion("1.0.0");
152
+ for (String name : registry.nodeNames()) {
153
+ NodeDescriptor.Builder descriptor = NodeDescriptor.newBuilder().setName(name);
154
+ // SPEC-B P4 — TypedNode handlers expose a description + JSON Schema
155
+ // via NodeReflector; legacy handlers report empty.
156
+ com.blok.blok.node.NodeHandler handler = registry.get(name);
157
+ if (handler instanceof com.blok.blok.node.NodeReflector reflector) {
158
+ descriptor.setDescription(reflector.description());
159
+ String inputSchema = reflector.inputSchemaJson();
160
+ if (inputSchema != null) {
161
+ descriptor.setInputSchemaJson(com.google.protobuf.ByteString.copyFromUtf8(inputSchema));
162
+ }
163
+ String outputSchema = reflector.outputSchemaJson();
164
+ if (outputSchema != null) {
165
+ descriptor.setOutputSchemaJson(com.google.protobuf.ByteString.copyFromUtf8(outputSchema));
166
+ }
167
+ }
168
+ builder.addNodes(descriptor.build());
169
+ }
170
+ responseObserver.onNext(builder.build());
171
+ responseObserver.onCompleted();
172
+ }
173
+
174
+ // =========================================================================
175
+ // Codec — proto ↔ internal types
176
+ // =========================================================================
177
+
178
+ private static final class DecodeException extends Exception {
179
+ DecodeException(String message) { super(message); }
180
+ }
181
+
182
+ private static ExecutionRequest decodeExecuteRequest(ExecuteRequest req) throws DecodeException {
183
+ if (!req.hasNode() || req.getNode().getName().isEmpty()) {
184
+ throw new DecodeException("ExecuteRequest.node is required");
185
+ }
186
+
187
+ Map<String, Object> inputs = decodeJsonObject(req.getInputs(), "inputs");
188
+
189
+ RuntimeState state = req.getState();
190
+ Object previousOutput = decodeJsonValue(state.getPreviousOutput(), "previous_output");
191
+ Map<String, Object> vars = decodeJsonObject(state.getVars(), "vars");
192
+
193
+ TriggerInfo trigger = req.getTrigger();
194
+ Object body = decodeRequestBody(trigger.getBody(), trigger.getHeadersMap());
195
+
196
+ WorkflowInfo workflow = req.getWorkflow();
197
+
198
+ Context ctx = new Context();
199
+ ctx.setId(workflow.getRunId());
200
+ ctx.setWorkflowName(workflow.getName());
201
+ ctx.setWorkflowPath(workflow.getPath());
202
+
203
+ Request internalRequest = new Request();
204
+ internalRequest.setBody(body);
205
+ internalRequest.setHeaders(new HashMap<>(trigger.getHeadersMap()));
206
+ internalRequest.setParams(new HashMap<>(trigger.getParamsMap()));
207
+ internalRequest.setQuery(new HashMap<>(trigger.getQueryMap()));
208
+ internalRequest.setCookies(new HashMap<>(trigger.getCookiesMap()));
209
+ internalRequest.setMethod(trigger.getMethod());
210
+ internalRequest.setUrl(trigger.getUrl());
211
+ internalRequest.setBaseUrl(trigger.getBaseUrl());
212
+ ctx.setRequest(internalRequest);
213
+
214
+ Response internalResponse = new Response();
215
+ internalResponse.setData(previousOutput);
216
+ internalResponse.setContentType("application/json");
217
+ internalResponse.setSuccess(true);
218
+ ctx.setResponse(internalResponse);
219
+
220
+ ctx.setVars(vars);
221
+ ctx.setEnv(new HashMap<>(state.getEnvMap()));
222
+
223
+ NodeConfig nodeConfig = new NodeConfig();
224
+ nodeConfig.setName(req.getNode().getName());
225
+ nodeConfig.setType(req.getNode().getType());
226
+ nodeConfig.setConfig(inputs);
227
+
228
+ ExecutionRequest exec = new ExecutionRequest();
229
+ exec.setNode(nodeConfig);
230
+ exec.setContext(ctx);
231
+ return exec;
232
+ }
233
+
234
+ private ExecuteResponse encodeExecuteResponse(ExecutionResult result, String nodeName) {
235
+ ExecuteResponse.Builder builder = ExecuteResponse.newBuilder()
236
+ .setSuccess(result.isSuccess())
237
+ .setContentType("application/json");
238
+
239
+ ByteString dataBytes = ByteString.EMPTY;
240
+ if (result.isSuccess() && result.getData() != null) {
241
+ dataBytes = ByteString.copyFromUtf8(GSON.toJson(result.getData()));
242
+ builder.setData(dataBytes);
243
+ }
244
+
245
+ ByteString varsDeltaBytes = ByteString.EMPTY;
246
+ if (result.getVars() != null && !result.getVars().isEmpty()) {
247
+ varsDeltaBytes = ByteString.copyFromUtf8(GSON.toJson(result.getVars()));
248
+ builder.setVarsDelta(varsDeltaBytes);
249
+ }
250
+
251
+ // Phase 0 follow-up: response_bytes — approximate via JSON-payload
252
+ // length (data + vars_delta). Studio's run-detail Inspector reads
253
+ // this so operators can see "wire 1.1 KB → 84 B" rather than
254
+ // "→ 0 B".
255
+ long responseBytes = (long) dataBytes.size() + (long) varsDeltaBytes.size();
256
+
257
+ if (result.getMetrics() != null || responseBytes > 0) {
258
+ Metrics.Builder metrics = Metrics.newBuilder();
259
+ if (result.getMetrics() != null) {
260
+ if (result.getMetrics().getDurationMs() != null) {
261
+ metrics.setDurationMs(result.getMetrics().getDurationMs());
262
+ }
263
+ if (result.getMetrics().getCpuMs() != null) {
264
+ metrics.setCpuMs(result.getMetrics().getCpuMs());
265
+ }
266
+ if (result.getMetrics().getMemoryBytes() != null) {
267
+ metrics.setMemoryBytes(result.getMetrics().getMemoryBytes());
268
+ }
269
+ }
270
+ metrics.setResponseBytes(responseBytes);
271
+ builder.setMetrics(metrics.build());
272
+ }
273
+
274
+ if (!result.isSuccess()) {
275
+ builder.setError(internalErrorToProto(result.getErrors(), nodeName));
276
+ }
277
+
278
+ return builder.build();
279
+ }
280
+
281
+ /**
282
+ * Build a proto {@link NodeError} from whatever {@link ExecutionResult}
283
+ * carried.
284
+ *
285
+ * <p>Two paths, both producing the same proto shape:
286
+ * <ul>
287
+ * <li><b>Structured (preferred)</b> — {@code errVal} is a typed
288
+ * {@link BlokError}. All 19 fields serialize losslessly via
289
+ * {@link #blokErrorToProto}. Auto-fills
290
+ * {@code node}/{@code sdk}/{@code sdk_version}/{@code runtime_kind}
291
+ * if the BlokError didn't set them itself.</li>
292
+ * <li><b>Loose</b> — {@code errVal} is anything else (Map, String,
293
+ * null, Throwable). Wrapped via {@link BlokError#fromUnknown}
294
+ * (always produces {@code category=INTERNAL} with the original
295
+ * payload preserved in {@code details_json}) and then serialized
296
+ * via the structured path.</li>
297
+ * </ul>
298
+ */
299
+ private NodeError internalErrorToProto(Object errVal, String nodeName) {
300
+ BlokError.Origin origin = BlokError.Origin.defaults(nodeName, sdkVersion);
301
+ if (errVal instanceof BlokError be) {
302
+ be.applyOriginIfMissing(origin);
303
+ return blokErrorToProto(be);
304
+ }
305
+ return blokErrorToProto(BlokError.fromUnknown(errVal, origin));
306
+ }
307
+
308
+ /**
309
+ * Serialize a fully-populated {@link BlokError} into the proto wire
310
+ * format. The cause chain is serialized as a list of proto NodeError
311
+ * messages; each element's own {@code causes} list is left empty (the
312
+ * chain is already flat at the BlokError layer).
313
+ */
314
+ private NodeError blokErrorToProto(BlokError err) {
315
+ NodeError.Builder b = NodeError.newBuilder()
316
+ .setCode(err.getCode() != null ? err.getCode() : "")
317
+ .setCategory(categoryToProto(err.getCategory()))
318
+ .setSeverity(severityToProto(err.getSeverity()))
319
+ .setNode(err.getNode())
320
+ .setSdk(err.getSdk())
321
+ .setSdkVersion(err.getSdkVersion())
322
+ .setRuntimeKind(err.getRuntimeKind())
323
+ .setMessage(err.getMessage() != null ? err.getMessage() : "")
324
+ .setDescription(err.getDescription())
325
+ .setRemediation(err.getRemediation())
326
+ .setDocUrl(err.getDocUrl())
327
+ .setStack(err.getStack())
328
+ .setHttpStatus(err.getHttpStatus())
329
+ .setRetryable(err.isRetryable())
330
+ .setRetryAfterMs(err.getRetryAfterMs());
331
+
332
+ long epochSec = err.getAt().getEpochSecond();
333
+ int nanos = err.getAt().getNano();
334
+ b.setAt(Timestamp.newBuilder().setSeconds(epochSec).setNanos(nanos).build());
335
+
336
+ if (err.getDetails() != null) {
337
+ b.setDetailsJson(ByteString.copyFromUtf8(GSON.toJson(err.getDetails())));
338
+ }
339
+ if (err.getContextSnapshot() != null) {
340
+ b.setContextSnapshotJson(ByteString.copyFromUtf8(GSON.toJson(err.getContextSnapshot())));
341
+ }
342
+
343
+ for (Map<String, Object> cause : err.getCauses()) {
344
+ b.addCauses(causeMapToProto(cause));
345
+ }
346
+ return b.build();
347
+ }
348
+
349
+ /**
350
+ * Convert one cause-chain link (already a snake_case map) into a proto
351
+ * NodeError. Each link's own {@code causes} list is left empty; the chain
352
+ * is already flat at the BlokError layer.
353
+ */
354
+ private NodeError causeMapToProto(Map<String, Object> cause) {
355
+ BlokErrorCategory category = BlokErrorCategory.parse(stringField(cause, "category"));
356
+ BlokErrorSeverity severity = BlokErrorSeverity.parse(stringField(cause, "severity"));
357
+ NodeError.Builder b = NodeError.newBuilder()
358
+ .setCode(stringField(cause, "code"))
359
+ .setCategory(categoryToProto(category))
360
+ .setSeverity(severityToProto(severity))
361
+ .setNode(stringField(cause, "node"))
362
+ .setSdk(stringField(cause, "sdk"))
363
+ .setSdkVersion(stringField(cause, "sdk_version"))
364
+ .setRuntimeKind(stringField(cause, "runtime_kind"))
365
+ .setMessage(stringField(cause, "message"))
366
+ .setDescription(stringField(cause, "description"))
367
+ .setRemediation(stringField(cause, "remediation"))
368
+ .setDocUrl(stringField(cause, "doc_url"))
369
+ .setStack(stringField(cause, "stack"))
370
+ .setHttpStatus(intField(cause, "http_status", 500))
371
+ .setRetryable(boolField(cause, "retryable", false))
372
+ .setRetryAfterMs(longField(cause, "retry_after_ms", 0L));
373
+
374
+ Object atRaw = cause.get("at");
375
+ if (atRaw instanceof String at) {
376
+ try {
377
+ java.time.Instant instant = java.time.Instant.parse(at);
378
+ b.setAt(Timestamp.newBuilder()
379
+ .setSeconds(instant.getEpochSecond())
380
+ .setNanos(instant.getNano())
381
+ .build());
382
+ } catch (Exception ignored) {
383
+ // best effort
384
+ }
385
+ }
386
+
387
+ Object det = cause.get("details");
388
+ if (det != null) {
389
+ b.setDetailsJson(ByteString.copyFromUtf8(GSON.toJson(det)));
390
+ }
391
+ Object snap = cause.get("context_snapshot");
392
+ if (snap != null) {
393
+ b.setContextSnapshotJson(ByteString.copyFromUtf8(GSON.toJson(snap)));
394
+ }
395
+ return b.build();
396
+ }
397
+
398
+ private static ErrorCategory categoryToProto(BlokErrorCategory c) {
399
+ return switch (c) {
400
+ case VALIDATION -> ErrorCategory.VALIDATION;
401
+ case CONFIGURATION -> ErrorCategory.CONFIGURATION;
402
+ case DEPENDENCY -> ErrorCategory.DEPENDENCY;
403
+ case TIMEOUT -> ErrorCategory.TIMEOUT;
404
+ case PERMISSION -> ErrorCategory.PERMISSION;
405
+ case RATE_LIMIT -> ErrorCategory.RATE_LIMIT;
406
+ case NOT_FOUND -> ErrorCategory.NOT_FOUND;
407
+ case CONFLICT -> ErrorCategory.CONFLICT;
408
+ case CANCELLED -> ErrorCategory.CANCELLED;
409
+ case PROTOCOL -> ErrorCategory.PROTOCOL;
410
+ case DATA -> ErrorCategory.DATA;
411
+ case INTERNAL -> ErrorCategory.INTERNAL;
412
+ };
413
+ }
414
+
415
+ private static ErrorSeverity severityToProto(BlokErrorSeverity s) {
416
+ return switch (s) {
417
+ case INFO -> ErrorSeverity.INFO;
418
+ case WARN -> ErrorSeverity.WARN;
419
+ case FATAL -> ErrorSeverity.FATAL;
420
+ case ERROR -> ErrorSeverity.ERROR;
421
+ };
422
+ }
423
+
424
+ private static String stringField(Map<String, Object> m, String key) {
425
+ Object v = m.get(key);
426
+ return v instanceof String s ? s : "";
427
+ }
428
+
429
+ private static int intField(Map<String, Object> m, String key, int fallback) {
430
+ Object v = m.get(key);
431
+ if (v instanceof Number n) return n.intValue();
432
+ return fallback;
433
+ }
434
+
435
+ private static long longField(Map<String, Object> m, String key, long fallback) {
436
+ Object v = m.get(key);
437
+ if (v instanceof Number n) return n.longValue();
438
+ return fallback;
439
+ }
440
+
441
+ private static boolean boolField(Map<String, Object> m, String key, boolean fallback) {
442
+ Object v = m.get(key);
443
+ if (v instanceof Boolean b) return b;
444
+ return fallback;
445
+ }
446
+
447
+ /** Decode JSON-encoded bytes into a typed map. Empty bytes → empty map. */
448
+ private static Map<String, Object> decodeJsonObject(ByteString bytes, String field) throws DecodeException {
449
+ if (bytes.isEmpty()) return new HashMap<>();
450
+ String json = bytes.toStringUtf8();
451
+ try {
452
+ JsonElement element = JsonParser.parseString(json);
453
+ if (element.isJsonObject()) {
454
+ Map<String, Object> map = GSON.fromJson(element, MAP_TYPE);
455
+ return map != null ? map : new HashMap<>();
456
+ }
457
+ // Wrap non-object payloads under a reserved key so handlers
458
+ // expecting a map don't crash.
459
+ Map<String, Object> wrapped = new HashMap<>();
460
+ wrapped.put("_value", GSON.fromJson(element, Object.class));
461
+ return wrapped;
462
+ } catch (JsonSyntaxException ex) {
463
+ throw new DecodeException("invalid `" + field + "` JSON: " + ex.getMessage());
464
+ }
465
+ }
466
+
467
+ /** Decode JSON-encoded bytes into an arbitrary value. Empty bytes → null. */
468
+ private static Object decodeJsonValue(ByteString bytes, String field) throws DecodeException {
469
+ if (bytes.isEmpty()) return null;
470
+ try {
471
+ return GSON.fromJson(bytes.toStringUtf8(), Object.class);
472
+ } catch (JsonSyntaxException ex) {
473
+ throw new DecodeException("invalid `" + field + "` JSON: " + ex.getMessage());
474
+ }
475
+ }
476
+
477
+ /**
478
+ * Decode the trigger body. JSON content-types parse as JSON; everything
479
+ * else surfaces as a raw string for the node to interpret.
480
+ */
481
+ private static Object decodeRequestBody(ByteString bytes, Map<String, String> headers) {
482
+ if (bytes.isEmpty()) return null;
483
+ String contentType = pickHeader(headers, "content-type");
484
+ if (contentType.toLowerCase().contains("application/json")) {
485
+ try {
486
+ return GSON.fromJson(bytes.toStringUtf8(), Object.class);
487
+ } catch (JsonSyntaxException ignored) {
488
+ // fall through
489
+ }
490
+ }
491
+ return new String(bytes.toByteArray(), StandardCharsets.UTF_8);
492
+ }
493
+
494
+ private static String pickHeader(Map<String, String> headers, String name) {
495
+ if (headers == null) return "";
496
+ for (Map.Entry<String, String> entry : headers.entrySet()) {
497
+ if (entry.getKey().equalsIgnoreCase(name)) return entry.getValue();
498
+ }
499
+ return "";
500
+ }
501
+ }
@@ -0,0 +1,176 @@
1
+ package com.blok.blok.server;
2
+
3
+ import com.blok.blok.config.ServerConfig;
4
+ import com.blok.blok.node.NodeRegistry;
5
+ import com.blok.blok.types.ExecutionRequest;
6
+ import com.blok.blok.types.ExecutionResult;
7
+ import com.blok.blok.types.HealthStatus;
8
+ import com.google.gson.Gson;
9
+ import com.google.gson.GsonBuilder;
10
+ import com.google.gson.JsonSyntaxException;
11
+ import com.sun.net.httpserver.HttpExchange;
12
+ import com.sun.net.httpserver.HttpServer;
13
+
14
+ import java.io.IOException;
15
+ import java.io.InputStreamReader;
16
+ import java.io.OutputStream;
17
+ import java.net.InetSocketAddress;
18
+ import java.nio.charset.StandardCharsets;
19
+ import java.util.concurrent.Executors;
20
+
21
+ /**
22
+ * HTTP server for the Blok blok runtime.
23
+ * Uses the JDK built-in {@code com.sun.net.httpserver.HttpServer}.
24
+ * <p>
25
+ * Exposes two endpoints:
26
+ * <ul>
27
+ * <li>POST /execute - Execute a workflow node</li>
28
+ * <li>GET /health - Health check</li>
29
+ * </ul>
30
+ */
31
+ public class RuntimeServer {
32
+
33
+ private final NodeRegistry registry;
34
+ private final ServerConfig config;
35
+ private final Gson gson;
36
+ private HttpServer httpServer;
37
+
38
+ /**
39
+ * Creates a new RuntimeServer.
40
+ *
41
+ * @param registry the node registry
42
+ * @param config the server configuration
43
+ * @throws IllegalArgumentException if registry or config is null
44
+ */
45
+ public RuntimeServer(NodeRegistry registry, ServerConfig config) {
46
+ if (registry == null) {
47
+ throw new IllegalArgumentException("registry must not be null");
48
+ }
49
+ if (config == null) {
50
+ throw new IllegalArgumentException("config must not be null");
51
+ }
52
+ this.registry = registry;
53
+ this.config = config;
54
+ this.gson = new GsonBuilder()
55
+ .serializeNulls()
56
+ .create();
57
+ }
58
+
59
+ /**
60
+ * Starts the HTTP server. Blocks until the server is stopped.
61
+ *
62
+ * @throws IOException if the server cannot bind to the port
63
+ */
64
+ public void start() throws IOException {
65
+ InetSocketAddress address = new InetSocketAddress(config.getHost(), config.getPort());
66
+ httpServer = HttpServer.create(address, 0);
67
+ httpServer.setExecutor(Executors.newCachedThreadPool());
68
+
69
+ httpServer.createContext("/execute", this::handleExecute);
70
+ httpServer.createContext("/health", this::handleHealth);
71
+
72
+ httpServer.start();
73
+
74
+ System.out.println("Blok runtime v" + config.getVersion()
75
+ + " starting on " + config.address());
76
+ System.out.println("Registered nodes: " + registry.nodeNames());
77
+ }
78
+
79
+ /**
80
+ * Stops the HTTP server gracefully.
81
+ */
82
+ public void stop() {
83
+ if (httpServer != null) {
84
+ System.out.println("Shutting down blok runtime...");
85
+ httpServer.stop(config.getShutdownTimeoutSec());
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Returns the underlying HttpServer for testing or advanced use.
91
+ *
92
+ * @return the HttpServer, or null if not started
93
+ */
94
+ public HttpServer getHttpServer() {
95
+ return httpServer;
96
+ }
97
+
98
+ private void handleExecute(HttpExchange exchange) throws IOException {
99
+ // CORS preflight
100
+ if (config.isEnableCors()) {
101
+ setCorsHeaders(exchange);
102
+ if ("OPTIONS".equalsIgnoreCase(exchange.getRequestMethod())) {
103
+ exchange.sendResponseHeaders(204, -1);
104
+ exchange.close();
105
+ return;
106
+ }
107
+ }
108
+
109
+ if (!"POST".equalsIgnoreCase(exchange.getRequestMethod())) {
110
+ ExecutionResult error = ExecutionResult.error("method not allowed, use POST");
111
+ writeJson(exchange, 405, error);
112
+ return;
113
+ }
114
+
115
+ try {
116
+ InputStreamReader reader = new InputStreamReader(
117
+ exchange.getRequestBody(), StandardCharsets.UTF_8);
118
+ ExecutionRequest request = gson.fromJson(reader, ExecutionRequest.class);
119
+
120
+ if (request == null) {
121
+ writeJson(exchange, 400, ExecutionResult.error("invalid JSON: empty body"));
122
+ return;
123
+ }
124
+
125
+ ExecutionResult result = registry.execute(request);
126
+ writeJson(exchange, 200, result);
127
+
128
+ } catch (JsonSyntaxException e) {
129
+ ExecutionResult error = ExecutionResult.error("invalid JSON: " + e.getMessage());
130
+ writeJson(exchange, 400, error);
131
+ } catch (Exception e) {
132
+ ExecutionResult error = ExecutionResult.error("internal server error: " + e.getMessage());
133
+ writeJson(exchange, 200, error);
134
+ }
135
+ }
136
+
137
+ private void handleHealth(HttpExchange exchange) throws IOException {
138
+ if (config.isEnableCors()) {
139
+ setCorsHeaders(exchange);
140
+ if ("OPTIONS".equalsIgnoreCase(exchange.getRequestMethod())) {
141
+ exchange.sendResponseHeaders(204, -1);
142
+ exchange.close();
143
+ return;
144
+ }
145
+ }
146
+
147
+ if (!"GET".equalsIgnoreCase(exchange.getRequestMethod())) {
148
+ exchange.sendResponseHeaders(405, -1);
149
+ exchange.close();
150
+ return;
151
+ }
152
+
153
+ HealthStatus health = registry.health(config.getVersion());
154
+ writeJson(exchange, 200, health);
155
+ }
156
+
157
+ private void writeJson(HttpExchange exchange, int statusCode, Object data) throws IOException {
158
+ // Build JSON with null exclusion for optional fields
159
+ Gson responseGson = new GsonBuilder().create();
160
+ String json = responseGson.toJson(data);
161
+ byte[] bytes = json.getBytes(StandardCharsets.UTF_8);
162
+
163
+ exchange.getResponseHeaders().set("Content-Type", "application/json");
164
+ exchange.sendResponseHeaders(statusCode, bytes.length);
165
+
166
+ try (OutputStream os = exchange.getResponseBody()) {
167
+ os.write(bytes);
168
+ }
169
+ }
170
+
171
+ private void setCorsHeaders(HttpExchange exchange) {
172
+ exchange.getResponseHeaders().set("Access-Control-Allow-Origin", "*");
173
+ exchange.getResponseHeaders().set("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
174
+ exchange.getResponseHeaders().set("Access-Control-Allow-Headers", "Content-Type, Authorization");
175
+ }
176
+ }