blokctl 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (693) hide show
  1. package/dist/commands/create/project.d.ts +3 -0
  2. package/dist/commands/create/project.js +166 -21
  3. package/dist/commands/create/utils/Examples.d.ts +2 -2
  4. package/dist/commands/create/utils/Examples.js +9 -3
  5. package/dist/commands/dev/index.js +13 -1
  6. package/dist/commands/runtime/add.js +92 -29
  7. package/dist/commands/runtime/index.js +1 -0
  8. package/dist/commands/runtime/shared.js +4 -0
  9. package/dist/scaffold-repo/examples/ts-workflows/mcp-greeter.ts +59 -0
  10. package/dist/scaffold-repo/examples/ts-workflows/runtime-csharp-hello.ts +36 -0
  11. package/dist/scaffold-repo/examples/ts-workflows/runtime-go-hello.ts +36 -0
  12. package/dist/scaffold-repo/examples/ts-workflows/runtime-java-hello.ts +36 -0
  13. package/dist/scaffold-repo/examples/ts-workflows/runtime-php-hello.ts +36 -0
  14. package/dist/scaffold-repo/examples/ts-workflows/runtime-python3-hello.ts +36 -0
  15. package/dist/scaffold-repo/examples/ts-workflows/runtime-ruby-hello.ts +36 -0
  16. package/dist/scaffold-repo/examples/ts-workflows/runtime-rust-hello.ts +36 -0
  17. package/dist/scaffold-repo/infra/development/3055.dat +602 -0
  18. package/dist/scaffold-repo/infra/development/3057.dat +203 -0
  19. package/dist/scaffold-repo/infra/development/3059.dat +19 -0
  20. package/dist/scaffold-repo/infra/development/3061.dat +1003 -0
  21. package/dist/scaffold-repo/infra/development/3062.dat +5465 -0
  22. package/dist/scaffold-repo/infra/development/3063.dat +1003 -0
  23. package/dist/scaffold-repo/infra/development/3065.dat +606 -0
  24. package/dist/scaffold-repo/infra/development/3067.dat +603 -0
  25. package/dist/scaffold-repo/infra/development/3069.dat +112 -0
  26. package/dist/scaffold-repo/infra/development/3071.dat +4584 -0
  27. package/dist/scaffold-repo/infra/development/3073.dat +9 -0
  28. package/dist/scaffold-repo/infra/development/3075.dat +14599 -0
  29. package/dist/scaffold-repo/infra/development/3077.dat +16047 -0
  30. package/dist/scaffold-repo/infra/development/3079.dat +5 -0
  31. package/dist/scaffold-repo/infra/development/3081.dat +5 -0
  32. package/dist/scaffold-repo/infra/development/docker-compose.yml +106 -0
  33. package/dist/scaffold-repo/infra/development/schema.sql +1616 -0
  34. package/dist/scaffold-repo/infra/development/toc.dat +0 -0
  35. package/dist/scaffold-repo/infra/metrics/alertmanager.yml +43 -0
  36. package/dist/scaffold-repo/infra/metrics/alloy-config.alloy +75 -0
  37. package/dist/scaffold-repo/infra/metrics/dashboard.json +1152 -0
  38. package/dist/scaffold-repo/infra/metrics/dashboards/blok-overview.json +314 -0
  39. package/dist/scaffold-repo/infra/metrics/dashboards/blok-system.json +175 -0
  40. package/dist/scaffold-repo/infra/metrics/dashboards/blok-tracing.json +235 -0
  41. package/dist/scaffold-repo/infra/metrics/dashboards/blok-triggers.json +258 -0
  42. package/dist/scaffold-repo/infra/metrics/datasources.yml +43 -0
  43. package/dist/scaffold-repo/infra/metrics/default.yaml +8 -0
  44. package/dist/scaffold-repo/infra/metrics/docker-compose.yml +193 -0
  45. package/dist/scaffold-repo/infra/metrics/loki-config.yaml +50 -0
  46. package/dist/scaffold-repo/infra/metrics/nginx.conf +25 -0
  47. package/dist/scaffold-repo/infra/metrics/prometheus.yml +51 -0
  48. package/dist/scaffold-repo/infra/metrics/rules/blok-alerts.yml +114 -0
  49. package/dist/scaffold-repo/infra/metrics/telegraf.conf +41 -0
  50. package/dist/scaffold-repo/infra/metrics/tempo.yaml +81 -0
  51. package/dist/scaffold-repo/infra/milvus/docker-compose.yml +73 -0
  52. package/dist/scaffold-repo/sdk/javascript/README.md +151 -0
  53. package/dist/scaffold-repo/sdk/javascript/bootstrap.min.css +11660 -0
  54. package/dist/scaffold-repo/sdk/javascript/image-ai.html +316 -0
  55. package/dist/scaffold-repo/sdk/javascript/nanosdk.js +180 -0
  56. package/dist/scaffold-repo/sdk/javascript/nanosdk.min.js +100 -0
  57. package/dist/scaffold-repo/sdk/javascript/pdf.html +63 -0
  58. package/dist/scaffold-repo/sdk/javascript/test.html +68 -0
  59. package/dist/scaffold-repo/sdks/CLAUDE.md +67 -0
  60. package/dist/scaffold-repo/sdks/csharp/.dockerignore +7 -0
  61. package/dist/scaffold-repo/sdks/csharp/Blok.Core.sln +24 -0
  62. package/dist/scaffold-repo/sdks/csharp/Dockerfile +42 -0
  63. package/dist/scaffold-repo/sdks/csharp/README.md +138 -0
  64. package/dist/scaffold-repo/sdks/csharp/proto/blok/runtime/v1/runtime.proto +302 -0
  65. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Blok.Core.csproj +39 -0
  66. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Config/ServerConfig.cs +90 -0
  67. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BlokError.cs +538 -0
  68. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BlokErrorCategory.cs +112 -0
  69. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BlokErrorSeverity.cs +40 -0
  70. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/BuildContextSnapshot.cs +168 -0
  71. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/ErrorCategory.cs +13 -0
  72. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Errors/NodeException.cs +44 -0
  73. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Logging/LogEntry.cs +34 -0
  74. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Logging/LogLevel.cs +12 -0
  75. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Logging/Logger.cs +92 -0
  76. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/IMiddleware.cs +14 -0
  77. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/LoggingMiddleware.cs +46 -0
  78. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/MiddlewareChain.cs +35 -0
  79. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Middleware/RecoveryMiddleware.cs +63 -0
  80. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Node/INodeHandler.cs +17 -0
  81. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Node/NodeRegistry.cs +128 -0
  82. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Node/TypedNode.cs +140 -0
  83. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/ApiCallNode.cs +129 -0
  84. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/BlokErrorDemoNode.cs +125 -0
  85. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/ChainTestNode.cs +79 -0
  86. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/HelloWorldNode.cs +45 -0
  87. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/TransformDataNode.cs +119 -0
  88. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Nodes/TypedGreetNode.cs +23 -0
  89. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Program.cs +26 -0
  90. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Server/BlokNodeRuntimeService.cs +536 -0
  91. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Server/RuntimeServer.cs +183 -0
  92. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Testing/MockContextBuilder.cs +117 -0
  93. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Testing/TestNodeRunner.cs +50 -0
  94. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/Context.cs +56 -0
  95. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/ExecutionMetrics.cs +21 -0
  96. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/ExecutionRequest.cs +15 -0
  97. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/ExecutionResult.cs +104 -0
  98. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/HealthStatus.cs +18 -0
  99. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/NodeConfig.cs +59 -0
  100. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/Request.cs +57 -0
  101. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Types/Response.cs +24 -0
  102. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/UserNodeRegistry.cs +17 -0
  103. package/dist/scaffold-repo/sdks/csharp/src/Blok.Core/Validation/SchemaValidator.cs +198 -0
  104. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Blok.Core.Tests.csproj +25 -0
  105. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Errors/BlokErrorTests.cs +458 -0
  106. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Logging/LoggerTests.cs +129 -0
  107. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Node/NodeRegistryTests.cs +145 -0
  108. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Testing/MockContextTests.cs +153 -0
  109. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/TypedNodeTests.cs +69 -0
  110. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Types/ExecutionResultTests.cs +110 -0
  111. package/dist/scaffold-repo/sdks/csharp/tests/Blok.Core.Tests/Validation/SchemaValidatorTests.cs +233 -0
  112. package/dist/scaffold-repo/sdks/go/Dockerfile +33 -0
  113. package/dist/scaffold-repo/sdks/go/README.md +255 -0
  114. package/dist/scaffold-repo/sdks/go/blok_error.go +803 -0
  115. package/dist/scaffold-repo/sdks/go/blok_error_test.go +433 -0
  116. package/dist/scaffold-repo/sdks/go/cmd/server/main.go +45 -0
  117. package/dist/scaffold-repo/sdks/go/cmd/server/register_user_nodes.go +12 -0
  118. package/dist/scaffold-repo/sdks/go/config.go +157 -0
  119. package/dist/scaffold-repo/sdks/go/config_test.go +129 -0
  120. package/dist/scaffold-repo/sdks/go/define_node.go +87 -0
  121. package/dist/scaffold-repo/sdks/go/define_node_test.go +75 -0
  122. package/dist/scaffold-repo/sdks/go/errors.go +104 -0
  123. package/dist/scaffold-repo/sdks/go/errors_test.go +95 -0
  124. package/dist/scaffold-repo/sdks/go/examples/nodes/apicall.go +117 -0
  125. package/dist/scaffold-repo/sdks/go/examples/nodes/blokerrordemo.go +80 -0
  126. package/dist/scaffold-repo/sdks/go/examples/nodes/chaintest.go +63 -0
  127. package/dist/scaffold-repo/sdks/go/examples/nodes/helloworld.go +41 -0
  128. package/dist/scaffold-repo/sdks/go/examples/nodes/transformdata.go +176 -0
  129. package/dist/scaffold-repo/sdks/go/examples/nodes/typedgreet.go +34 -0
  130. package/dist/scaffold-repo/sdks/go/genpb/blok/runtime/v1/runtime.pb.go +2070 -0
  131. package/dist/scaffold-repo/sdks/go/genpb/blok/runtime/v1/runtime_grpc.pb.go +273 -0
  132. package/dist/scaffold-repo/sdks/go/go.mod +25 -0
  133. package/dist/scaffold-repo/sdks/go/go.sum +66 -0
  134. package/dist/scaffold-repo/sdks/go/grpc_server.go +670 -0
  135. package/dist/scaffold-repo/sdks/go/grpc_server_test.go +474 -0
  136. package/dist/scaffold-repo/sdks/go/logging.go +144 -0
  137. package/dist/scaffold-repo/sdks/go/logging_test.go +139 -0
  138. package/dist/scaffold-repo/sdks/go/middleware.go +152 -0
  139. package/dist/scaffold-repo/sdks/go/middleware_test.go +222 -0
  140. package/dist/scaffold-repo/sdks/go/node.go +50 -0
  141. package/dist/scaffold-repo/sdks/go/proto/blok/runtime/v1/runtime.proto +302 -0
  142. package/dist/scaffold-repo/sdks/go/registry.go +156 -0
  143. package/dist/scaffold-repo/sdks/go/registry_test.go +195 -0
  144. package/dist/scaffold-repo/sdks/go/server.go +207 -0
  145. package/dist/scaffold-repo/sdks/go/server_test.go +186 -0
  146. package/dist/scaffold-repo/sdks/go/shutdown.go +32 -0
  147. package/dist/scaffold-repo/sdks/go/testutil.go +169 -0
  148. package/dist/scaffold-repo/sdks/go/testutil_test.go +124 -0
  149. package/dist/scaffold-repo/sdks/go/types.go +295 -0
  150. package/dist/scaffold-repo/sdks/go/types_test.go +251 -0
  151. package/dist/scaffold-repo/sdks/go/validation.go +210 -0
  152. package/dist/scaffold-repo/sdks/go/validation_test.go +262 -0
  153. package/dist/scaffold-repo/sdks/go/worker.go +577 -0
  154. package/dist/scaffold-repo/sdks/java/Dockerfile +33 -0
  155. package/dist/scaffold-repo/sdks/java/README.md +221 -0
  156. package/dist/scaffold-repo/sdks/java/pom.xml +163 -0
  157. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/Main.java +90 -0
  158. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/UserNodeRegistry.java +19 -0
  159. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/config/ServerConfig.java +244 -0
  160. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BlokError.java +576 -0
  161. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BlokErrorCategory.java +68 -0
  162. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BlokErrorSeverity.java +31 -0
  163. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/BuildContextSnapshot.java +132 -0
  164. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/ErrorCategory.java +22 -0
  165. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/errors/NodeException.java +176 -0
  166. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/logging/LogEntry.java +78 -0
  167. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/logging/LogLevel.java +48 -0
  168. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/logging/Logger.java +160 -0
  169. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/LoggingMiddleware.java +65 -0
  170. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/Middleware.java +29 -0
  171. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/MiddlewareChain.java +59 -0
  172. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/middleware/RecoveryMiddleware.java +53 -0
  173. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/NodeHandler.java +40 -0
  174. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/NodeReflector.java +18 -0
  175. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/NodeRegistry.java +205 -0
  176. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/node/TypedNode.java +143 -0
  177. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/ApiCallNode.java +145 -0
  178. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/BlokErrorDemoNode.java +109 -0
  179. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/ChainTestNode.java +65 -0
  180. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/HelloWorldNode.java +62 -0
  181. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/TransformDataNode.java +121 -0
  182. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/nodes/TypedGreetNode.java +41 -0
  183. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/server/BlokGrpcServer.java +103 -0
  184. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/server/BlokNodeRuntimeService.java +501 -0
  185. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/server/RuntimeServer.java +176 -0
  186. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/testing/MockContext.java +120 -0
  187. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/testing/TestRunner.java +59 -0
  188. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/Context.java +167 -0
  189. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/ExecutionMetrics.java +80 -0
  190. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/ExecutionRequest.java +61 -0
  191. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/ExecutionResult.java +188 -0
  192. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/HealthStatus.java +77 -0
  193. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/NodeConfig.java +139 -0
  194. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/Request.java +154 -0
  195. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/types/Response.java +77 -0
  196. package/dist/scaffold-repo/sdks/java/src/main/java/com/blok/blok/validation/SchemaValidator.java +178 -0
  197. package/dist/scaffold-repo/sdks/java/src/main/proto/blok/runtime/v1/runtime.proto +302 -0
  198. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/errors/BlokErrorTest.java +416 -0
  199. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/logging/LoggerTest.java +176 -0
  200. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/node/NodeRegistryTest.java +227 -0
  201. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/node/TypedNodeTest.java +76 -0
  202. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/server/RuntimeServerTest.java +197 -0
  203. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/types/ExecutionResultTest.java +194 -0
  204. package/dist/scaffold-repo/sdks/java/src/test/java/com/blok/blok/validation/SchemaValidatorTest.java +246 -0
  205. package/dist/scaffold-repo/sdks/php/.rr.yaml +29 -0
  206. package/dist/scaffold-repo/sdks/php/Dockerfile +61 -0
  207. package/dist/scaffold-repo/sdks/php/README.md +387 -0
  208. package/dist/scaffold-repo/sdks/php/composer.json +41 -0
  209. package/dist/scaffold-repo/sdks/php/examples/ApiCallNode.php +103 -0
  210. package/dist/scaffold-repo/sdks/php/examples/BlokErrorDemoNode.php +90 -0
  211. package/dist/scaffold-repo/sdks/php/examples/ChainTestNode.php +56 -0
  212. package/dist/scaffold-repo/sdks/php/examples/HelloWorldNode.php +39 -0
  213. package/dist/scaffold-repo/sdks/php/examples/TransformDataNode.php +94 -0
  214. package/dist/scaffold-repo/sdks/php/examples/TypedGreetNode.php +57 -0
  215. package/dist/scaffold-repo/sdks/php/phpunit.xml +23 -0
  216. package/dist/scaffold-repo/sdks/php/proto/blok/runtime/v1/runtime.proto +302 -0
  217. package/dist/scaffold-repo/sdks/php/src/Config/ServerConfig.php +83 -0
  218. package/dist/scaffold-repo/sdks/php/src/Errors/BlokError.php +467 -0
  219. package/dist/scaffold-repo/sdks/php/src/Errors/BlokErrorBuilder.php +121 -0
  220. package/dist/scaffold-repo/sdks/php/src/Errors/BlokErrorCategory.php +83 -0
  221. package/dist/scaffold-repo/sdks/php/src/Errors/BlokErrorSeverity.php +30 -0
  222. package/dist/scaffold-repo/sdks/php/src/Errors/BuildContextSnapshot.php +141 -0
  223. package/dist/scaffold-repo/sdks/php/src/Errors/ErrorCategory.php +17 -0
  224. package/dist/scaffold-repo/sdks/php/src/Errors/NodeException.php +107 -0
  225. package/dist/scaffold-repo/sdks/php/src/Errors/Origin.php +35 -0
  226. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ErrorCategory.php +118 -0
  227. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ErrorSeverity.php +72 -0
  228. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteEvent.php +181 -0
  229. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteOptions.php +159 -0
  230. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteRequest.php +328 -0
  231. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ExecuteResponse.php +288 -0
  232. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/HealthRequest.php +59 -0
  233. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/HealthResponse/Status.php +54 -0
  234. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/HealthResponse.php +113 -0
  235. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ListNodesRequest.php +32 -0
  236. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/ListNodesResponse.php +154 -0
  237. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/LogLine.php +156 -0
  238. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/Metrics.php +165 -0
  239. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeDescriptor.php +174 -0
  240. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeError.php +627 -0
  241. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeRef.php +134 -0
  242. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeRuntimeClient.php +101 -0
  243. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/NodeStarted.php +68 -0
  244. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/PartialResult.php +59 -0
  245. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/Progress.php +85 -0
  246. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/RuntimeState.php +142 -0
  247. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/StepInfo.php +168 -0
  248. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/TriggerInfo.php +289 -0
  249. package/dist/scaffold-repo/sdks/php/src/Genpb/Blok/Runtime/V1/WorkflowInfo.php +176 -0
  250. package/dist/scaffold-repo/sdks/php/src/Genpb/GPBMetadata/Blok/Runtime/V1/Runtime.php +26 -0
  251. package/dist/scaffold-repo/sdks/php/src/Logging/LogEntry.php +47 -0
  252. package/dist/scaffold-repo/sdks/php/src/Logging/LogLevel.php +50 -0
  253. package/dist/scaffold-repo/sdks/php/src/Logging/Logger.php +133 -0
  254. package/dist/scaffold-repo/sdks/php/src/Node/NodeHandler.php +35 -0
  255. package/dist/scaffold-repo/sdks/php/src/Node/NodeReflector.php +21 -0
  256. package/dist/scaffold-repo/sdks/php/src/Node/NodeRegistry.php +172 -0
  257. package/dist/scaffold-repo/sdks/php/src/Node/TypedNode.php +159 -0
  258. package/dist/scaffold-repo/sdks/php/src/Server/BlokNodeRuntimeService.php +504 -0
  259. package/dist/scaffold-repo/sdks/php/src/Server/DecodeException.php +13 -0
  260. package/dist/scaffold-repo/sdks/php/src/Server/Middleware.php +18 -0
  261. package/dist/scaffold-repo/sdks/php/src/Server/MiddlewarePipeline.php +33 -0
  262. package/dist/scaffold-repo/sdks/php/src/Server/NodeRuntimeInterface.php +40 -0
  263. package/dist/scaffold-repo/sdks/php/src/Server/Server.php +157 -0
  264. package/dist/scaffold-repo/sdks/php/src/Testing/MockContext.php +161 -0
  265. package/dist/scaffold-repo/sdks/php/src/Testing/TestRunner.php +78 -0
  266. package/dist/scaffold-repo/sdks/php/src/Types/Context.php +80 -0
  267. package/dist/scaffold-repo/sdks/php/src/Types/ExecutionMetrics.php +48 -0
  268. package/dist/scaffold-repo/sdks/php/src/Types/ExecutionRequest.php +38 -0
  269. package/dist/scaffold-repo/sdks/php/src/Types/ExecutionResult.php +143 -0
  270. package/dist/scaffold-repo/sdks/php/src/Types/HealthStatus.php +42 -0
  271. package/dist/scaffold-repo/sdks/php/src/Types/NodeConfig.php +72 -0
  272. package/dist/scaffold-repo/sdks/php/src/Types/Request.php +82 -0
  273. package/dist/scaffold-repo/sdks/php/src/Types/Response.php +44 -0
  274. package/dist/scaffold-repo/sdks/php/src/Validation/SchemaValidator.php +197 -0
  275. package/dist/scaffold-repo/sdks/php/tests/Errors/BlokErrorTest.php +402 -0
  276. package/dist/scaffold-repo/sdks/php/tests/Logging/LoggerTest.php +165 -0
  277. package/dist/scaffold-repo/sdks/php/tests/Node/NodeRegistryTest.php +139 -0
  278. package/dist/scaffold-repo/sdks/php/tests/Node/TypedNodeTest.php +84 -0
  279. package/dist/scaffold-repo/sdks/php/tests/Server/BlokNodeRuntimeServiceTest.php +288 -0
  280. package/dist/scaffold-repo/sdks/php/tests/Testing/MockContextTest.php +184 -0
  281. package/dist/scaffold-repo/sdks/php/tests/Types/ExecutionResultTest.php +136 -0
  282. package/dist/scaffold-repo/sdks/php/tests/Validation/SchemaValidatorTest.php +191 -0
  283. package/dist/scaffold-repo/sdks/python3/Dockerfile +62 -0
  284. package/dist/scaffold-repo/sdks/python3/blok/__init__.py +61 -0
  285. package/dist/scaffold-repo/sdks/python3/blok/config/__init__.py +3 -0
  286. package/dist/scaffold-repo/sdks/python3/blok/config/server_config.py +116 -0
  287. package/dist/scaffold-repo/sdks/python3/blok/errors/__init__.py +50 -0
  288. package/dist/scaffold-repo/sdks/python3/blok/errors/blok_error.py +555 -0
  289. package/dist/scaffold-repo/sdks/python3/blok/errors/node_error.py +64 -0
  290. package/dist/scaffold-repo/sdks/python3/blok/logging/__init__.py +3 -0
  291. package/dist/scaffold-repo/sdks/python3/blok/logging/logger.py +82 -0
  292. package/dist/scaffold-repo/sdks/python3/blok/middleware/__init__.py +4 -0
  293. package/dist/scaffold-repo/sdks/python3/blok/middleware/logging_middleware.py +35 -0
  294. package/dist/scaffold-repo/sdks/python3/blok/middleware/recovery_middleware.py +36 -0
  295. package/dist/scaffold-repo/sdks/python3/blok/node/__init__.py +4 -0
  296. package/dist/scaffold-repo/sdks/python3/blok/node/define_node.py +239 -0
  297. package/dist/scaffold-repo/sdks/python3/blok/node/node_handler.py +35 -0
  298. package/dist/scaffold-repo/sdks/python3/blok/node/node_registry.py +136 -0
  299. package/dist/scaffold-repo/sdks/python3/blok/runtime/__init__.py +0 -0
  300. package/dist/scaffold-repo/sdks/python3/blok/runtime/v1/__init__.py +0 -0
  301. package/dist/scaffold-repo/sdks/python3/blok/runtime/v1/runtime_pb2.py +112 -0
  302. package/dist/scaffold-repo/sdks/python3/blok/runtime/v1/runtime_pb2_grpc.py +259 -0
  303. package/dist/scaffold-repo/sdks/python3/blok/server/__init__.py +3 -0
  304. package/dist/scaffold-repo/sdks/python3/blok/server/grpc_server.py +757 -0
  305. package/dist/scaffold-repo/sdks/python3/blok/server/runtime_server.py +165 -0
  306. package/dist/scaffold-repo/sdks/python3/blok/types/__init__.py +13 -0
  307. package/dist/scaffold-repo/sdks/python3/blok/types/context.py +162 -0
  308. package/dist/scaffold-repo/sdks/python3/blok/types/execution_request.py +74 -0
  309. package/dist/scaffold-repo/sdks/python3/blok/types/execution_result.py +103 -0
  310. package/dist/scaffold-repo/sdks/python3/blok/worker/__init__.py +10 -0
  311. package/dist/scaffold-repo/sdks/python3/blok/worker/job_message.py +34 -0
  312. package/dist/scaffold-repo/sdks/python3/blok/worker/worker.py +451 -0
  313. package/dist/scaffold-repo/sdks/python3/blok/worker/worker_config.py +129 -0
  314. package/dist/scaffold-repo/sdks/python3/examples/__init__.py +32 -0
  315. package/dist/scaffold-repo/sdks/python3/examples/api_call_node.py +85 -0
  316. package/dist/scaffold-repo/sdks/python3/examples/blok_error_demo_node.py +79 -0
  317. package/dist/scaffold-repo/sdks/python3/examples/chain_test_node.py +51 -0
  318. package/dist/scaffold-repo/sdks/python3/examples/hello_world_node.py +44 -0
  319. package/dist/scaffold-repo/sdks/python3/examples/transform_data_node.py +71 -0
  320. package/dist/scaffold-repo/sdks/python3/examples/typed_greet_node.py +25 -0
  321. package/dist/scaffold-repo/sdks/python3/proto/blok/runtime/v1/runtime.proto +302 -0
  322. package/dist/scaffold-repo/sdks/python3/pyproject.toml +47 -0
  323. package/dist/scaffold-repo/sdks/python3/requirements.txt +17 -0
  324. package/dist/scaffold-repo/sdks/python3/tests/__init__.py +0 -0
  325. package/dist/scaffold-repo/sdks/python3/tests/test_blok_error.py +341 -0
  326. package/dist/scaffold-repo/sdks/python3/tests/test_define_node.py +135 -0
  327. package/dist/scaffold-repo/sdks/python3/tests/test_discovery.py +99 -0
  328. package/dist/scaffold-repo/sdks/python3/tests/test_grpc_codec.py +260 -0
  329. package/dist/scaffold-repo/sdks/python3/tests/test_grpc_server.py +398 -0
  330. package/dist/scaffold-repo/sdks/ruby/Dockerfile +37 -0
  331. package/dist/scaffold-repo/sdks/ruby/Gemfile +5 -0
  332. package/dist/scaffold-repo/sdks/ruby/README.md +210 -0
  333. package/dist/scaffold-repo/sdks/ruby/Rakefile +11 -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/dist/services/runtime-detector.d.ts +2 -0
  690. package/dist/services/runtime-detector.js +35 -11
  691. package/dist/services/runtime-setup.d.ts +1 -0
  692. package/dist/services/runtime-setup.js +17 -7
  693. package/package.json +4 -4
@@ -0,0 +1,39 @@
1
+ <Project Sdk="Microsoft.NET.Sdk.Web">
2
+
3
+ <PropertyGroup>
4
+ <TargetFramework>net10.0</TargetFramework>
5
+ <Nullable>enable</Nullable>
6
+ <ImplicitUsings>enable</ImplicitUsings>
7
+ <RootNamespace>Blok.Core</RootNamespace>
8
+ <AssemblyName>Blok.Core</AssemblyName>
9
+
10
+ <!-- NuGet Package Metadata -->
11
+ <PackageId>Blok.Core</PackageId>
12
+ <Version>1.0.0</Version>
13
+ <Authors>Blok</Authors>
14
+ <Description>C# SDK for the Blok blok framework. Build workflow nodes as Docker containers with HTTP and/or gRPC transports.</Description>
15
+ <PackageTags>blok;blok;workflow;microservice;docker;grpc</PackageTags>
16
+ <PackageLicenseExpression>MIT</PackageLicenseExpression>
17
+ <RepositoryUrl>https://github.com/deskree/blok</RepositoryUrl>
18
+ <RepositoryType>git</RepositoryType>
19
+ <GenerateDocumentationFile>true</GenerateDocumentationFile>
20
+ <IsPackable>true</IsPackable>
21
+ </PropertyGroup>
22
+
23
+ <!-- gRPC server stack. Generates server stubs from `runtime.proto` at build
24
+ time via `Grpc.Tools` (no external protoc required). -->
25
+ <ItemGroup>
26
+ <PackageReference Include="Grpc.AspNetCore" Version="2.66.0" />
27
+ <PackageReference Include="Google.Protobuf" Version="3.28.3" />
28
+ <PackageReference Include="Grpc.Tools" Version="2.67.0">
29
+ <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
30
+ <PrivateAssets>all</PrivateAssets>
31
+ </PackageReference>
32
+ <PackageReference Include="NJsonSchema" Version="11.6.1" />
33
+ </ItemGroup>
34
+
35
+ <ItemGroup>
36
+ <Protobuf Include="..\..\proto\blok\runtime\v1\runtime.proto" GrpcServices="Server" ProtoRoot="..\..\proto" />
37
+ </ItemGroup>
38
+
39
+ </Project>
@@ -0,0 +1,90 @@
1
+ using Blok.Core.Logging;
2
+
3
+ namespace Blok.Core.Config;
4
+
5
+ /// <summary>Selects which server(s) to start.</summary>
6
+ public enum Transport
7
+ {
8
+ /// <summary>HTTP only (default; preserves existing behavior).</summary>
9
+ Http,
10
+ /// <summary>gRPC only on <see cref="ServerConfig.GrpcPort" />.</summary>
11
+ Grpc,
12
+ /// <summary>HTTP and gRPC concurrently — used during migration.</summary>
13
+ Both,
14
+ }
15
+
16
+ /// <summary>
17
+ /// Server configuration loaded from environment variables.
18
+ /// </summary>
19
+ public class ServerConfig
20
+ {
21
+ /// <summary>HTTP port to listen on. Default: 9004 (matches the runner's
22
+ /// <c>DEFAULT_PORTS.csharp</c>).</summary>
23
+ public int Port { get; set; } = 9004;
24
+
25
+ /// <summary>Host address to bind to. Default: 0.0.0.0.</summary>
26
+ public string Host { get; set; } = "0.0.0.0";
27
+
28
+ /// <summary>Runtime version string. Default: 1.0.0.</summary>
29
+ public string Version { get; set; } = "1.0.0";
30
+
31
+ /// <summary>gRPC port to listen on. Default: 10004 (matches the runner's
32
+ /// <c>DEFAULT_GRPC_PORTS.csharp = HTTP+1000</c>).</summary>
33
+ public int GrpcPort { get; set; } = 10004;
34
+
35
+ /// <summary>Selects which server(s) to start. Default: <see cref="Transport.Http" />.</summary>
36
+ public Transport Transport { get; set; } = Transport.Http;
37
+
38
+ /// <summary>Minimum log level. Default: Info.</summary>
39
+ public Logging.LogLevel LogLevel { get; set; } = Logging.LogLevel.Info;
40
+
41
+ /// <summary>Whether to enable CORS. Default: false.</summary>
42
+ public bool EnableCors { get; set; } = false;
43
+
44
+ /// <summary>
45
+ /// Load configuration from environment variables with defaults.
46
+ /// - PORT (default: 9004)
47
+ /// - HOST (default: 0.0.0.0)
48
+ /// - VERSION (default: 1.0.0)
49
+ /// - GRPC_PORT (default: 10004)
50
+ /// - BLOK_TRANSPORT: "http" | "grpc" | "both" (default: "http")
51
+ /// - LOG_LEVEL (default: INFO)
52
+ /// - ENABLE_CORS (default: false)
53
+ /// </summary>
54
+ public static ServerConfig FromEnv()
55
+ {
56
+ return new ServerConfig
57
+ {
58
+ Port = int.TryParse(Environment.GetEnvironmentVariable("PORT"), out var port) ? port : 9004,
59
+ Host = Environment.GetEnvironmentVariable("HOST") ?? "0.0.0.0",
60
+ Version = Environment.GetEnvironmentVariable("VERSION") ?? "1.0.0",
61
+ GrpcPort = int.TryParse(Environment.GetEnvironmentVariable("GRPC_PORT"), out var grpcPort) ? grpcPort : 10004,
62
+ Transport = ParseTransport(Environment.GetEnvironmentVariable("BLOK_TRANSPORT")),
63
+ LogLevel = ParseLogLevel(Environment.GetEnvironmentVariable("LOG_LEVEL")),
64
+ EnableCors = bool.TryParse(Environment.GetEnvironmentVariable("ENABLE_CORS"), out var cors) && cors
65
+ };
66
+ }
67
+
68
+ private static Transport ParseTransport(string? value) => value?.ToLowerInvariant() switch
69
+ {
70
+ "grpc" => Transport.Grpc,
71
+ "both" => Transport.Both,
72
+ _ => Transport.Http,
73
+ };
74
+
75
+ /// <summary>
76
+ /// Return the bind address as "host:port".
77
+ /// </summary>
78
+ public string Address() => $"{Host}:{Port}";
79
+
80
+ private static Logging.LogLevel ParseLogLevel(string? level)
81
+ {
82
+ return level?.ToUpperInvariant() switch
83
+ {
84
+ "DEBUG" => Logging.LogLevel.Debug,
85
+ "WARN" => Logging.LogLevel.Warn,
86
+ "ERROR" => Logging.LogLevel.Error,
87
+ _ => Logging.LogLevel.Info
88
+ };
89
+ }
90
+ }
@@ -0,0 +1,538 @@
1
+ using System.Text.Json;
2
+
3
+ namespace Blok.Core.Errors;
4
+
5
+ /// <summary>
6
+ /// Structured <c>BlokError</c> per master plan §17 — the canonical error
7
+ /// contract every Blok node SDK populates the same way.
8
+ ///
9
+ /// <para>Mirrors the TypeScript <c>BlokError</c>, Python <c>BlokError</c>, Go
10
+ /// <c>*BlokError</c>, Rust <c>BlokError</c>, and Java <c>BlokError</c>, so
11
+ /// node authors writing in any language see the same field shape.</para>
12
+ ///
13
+ /// <para>Idiomatic usage (master plan §17.5 builder pattern):</para>
14
+ /// <code>
15
+ /// throw BlokError.Dependency()
16
+ /// .Code("POSTGRES_CONNECT_TIMEOUT")
17
+ /// .Message("Could not connect to Postgres within 5s")
18
+ /// .Description($"Tried host={host} port={port}; timeout={dur}ms")
19
+ /// .Remediation("Check DATABASE_URL env var and network reachability")
20
+ /// .Cause(ex)
21
+ /// .Retryable(true)
22
+ /// .RetryAfter(TimeSpan.FromSeconds(5))
23
+ /// .Details(new Dictionary&lt;string, object?&gt; { ["host"] = host, ["port"] = port })
24
+ /// .Build();
25
+ /// </code>
26
+ ///
27
+ /// <para>Extends <see cref="Exception"/> so handlers can <c>throw</c> it
28
+ /// directly. The legacy <see cref="NodeException"/> (5 categories) stays
29
+ /// available for back-compat. New code should prefer <c>BlokError</c>.</para>
30
+ /// </summary>
31
+ public sealed class BlokError : Exception
32
+ {
33
+ /// <summary>SDK identifier reported on auto-enriched errors.</summary>
34
+ public const string DefaultSdkName = "blok-csharp";
35
+
36
+ /// <summary>Runtime kind reported on auto-enriched errors.</summary>
37
+ public const string DefaultRuntimeKind = "runtime.csharp";
38
+
39
+ /// <summary>Default cap on serialized <c>context_snapshot</c> size in bytes.</summary>
40
+ public const int ContextSnapshotMaxBytes = 4096;
41
+
42
+ public BlokErrorCategory Category { get; }
43
+ public BlokErrorSeverity Severity { get; internal set; }
44
+ public string Code { get; }
45
+ public string Description { get; }
46
+ public string Remediation { get; }
47
+ public string DocUrl { get; }
48
+ public int HttpStatus { get; internal set; }
49
+ public bool Retryable { get; internal set; }
50
+ public long RetryAfterMs { get; }
51
+ public object? Details { get; }
52
+ public object? ContextSnapshot { get; }
53
+ public IReadOnlyList<Dictionary<string, object?>> Causes { get; }
54
+ public string Stack { get; }
55
+ public DateTime At { get; }
56
+
57
+ // Origin — auto-enriched by the gRPC servicer when not set by the handler.
58
+ public string Node { get; internal set; }
59
+ public string Sdk { get; internal set; }
60
+ public string SdkVersion { get; internal set; }
61
+ public string RuntimeKind { get; internal set; }
62
+
63
+ private BlokError(Builder b)
64
+ : base(b.MessageValue ?? string.Empty, b.CauseValue)
65
+ {
66
+ Category = b.CategoryValue;
67
+ Severity = b.SeverityValue;
68
+ Code = b.CodeValue ?? string.Empty;
69
+ Description = b.DescriptionValue ?? string.Empty;
70
+ Remediation = b.RemediationValue ?? string.Empty;
71
+ DocUrl = b.DocUrlValue ?? string.Empty;
72
+ HttpStatus = b.HttpStatusValue;
73
+ Retryable = b.RetryableValue;
74
+ RetryAfterMs = b.RetryAfterMsValue;
75
+ Details = b.DetailsValue;
76
+ ContextSnapshot = b.ContextSnapshotValue;
77
+ Stack = b.StackValue ?? (b.CauseValue?.StackTrace ?? string.Empty);
78
+ At = b.AtValue ?? DateTime.UtcNow;
79
+ Node = b.NodeValue ?? string.Empty;
80
+ Sdk = b.SdkValue ?? string.Empty;
81
+ SdkVersion = b.SdkVersionValue ?? string.Empty;
82
+ RuntimeKind = b.RuntimeKindValue ?? string.Empty;
83
+ if (b.CausesValue is not null)
84
+ {
85
+ Causes = b.CausesValue;
86
+ }
87
+ else if (b.CauseValue is not null)
88
+ {
89
+ Causes = FlattenCauses(b.CauseValue);
90
+ }
91
+ else
92
+ {
93
+ Causes = Array.Empty<Dictionary<string, object?>>();
94
+ }
95
+ }
96
+
97
+ public override string ToString() => $"[{Category.AsWire()}] {Message}";
98
+
99
+ // =========================================================================
100
+ // Static factory shortcuts — one per category
101
+ // =========================================================================
102
+
103
+ /// <summary>Builder for a <c>VALIDATION</c> error (default 400, non-retryable).</summary>
104
+ public static Builder Validation() => new(BlokErrorCategory.Validation);
105
+ /// <summary>Builder for a <c>CONFIGURATION</c> error (default 500, non-retryable).</summary>
106
+ public static Builder Configuration() => new(BlokErrorCategory.Configuration);
107
+ /// <summary>Builder for a <c>DEPENDENCY</c> error (default 502, retryable).</summary>
108
+ public static Builder Dependency() => new(BlokErrorCategory.Dependency);
109
+ /// <summary>Builder for a <c>TIMEOUT</c> error (default 504, retryable).</summary>
110
+ public static Builder Timeout() => new(BlokErrorCategory.Timeout);
111
+ /// <summary>Builder for a <c>PERMISSION</c> error (default 403, non-retryable).</summary>
112
+ public static Builder Permission() => new(BlokErrorCategory.Permission);
113
+ /// <summary>Builder for a <c>RATE_LIMIT</c> error (default 429, retryable).</summary>
114
+ public static Builder RateLimit() => new(BlokErrorCategory.RateLimit);
115
+ /// <summary>Builder for a <c>NOT_FOUND</c> error (default 404, non-retryable).</summary>
116
+ public static Builder NotFound() => new(BlokErrorCategory.NotFound);
117
+ /// <summary>Builder for a <c>CONFLICT</c> error (default 409, non-retryable).</summary>
118
+ public static Builder Conflict() => new(BlokErrorCategory.Conflict);
119
+ /// <summary>Builder for a <c>CANCELLED</c> error (default 499, non-retryable).</summary>
120
+ public static Builder Cancelled() => new(BlokErrorCategory.Cancelled);
121
+ /// <summary>Builder for an <c>INTERNAL</c> error (default 500, non-retryable).</summary>
122
+ public static Builder Internal() => new(BlokErrorCategory.Internal);
123
+ /// <summary>Builder for a <c>PROTOCOL</c> error (default 502, non-retryable).</summary>
124
+ public static Builder Protocol() => new(BlokErrorCategory.Protocol);
125
+ /// <summary>Builder for a <c>DATA</c> error (default 422, non-retryable).</summary>
126
+ /// <remarks>The <c>new</c> modifier hides <see cref="Exception.Data"/> (the
127
+ /// dictionary inherited from <c>Exception</c>) at the type level. Callers
128
+ /// reaching for the dictionary must access it via the base type.</remarks>
129
+ public static new Builder Data() => new(BlokErrorCategory.Data);
130
+
131
+ /// <summary>Generic factory if the category isn't known at compile time.</summary>
132
+ public static Builder Of(BlokErrorCategory category) => new(category);
133
+
134
+ // =========================================================================
135
+ // Conversion — FromUnknown, ToMap, FromMap
136
+ // =========================================================================
137
+
138
+ /// <summary>
139
+ /// Wrap any value as a <c>BlokError</c>. Used by the runner's auto-wrap
140
+ /// layer so legacy <c>throw new InvalidOperationException(...)</c> still
141
+ /// produces a structured error.
142
+ ///
143
+ /// <para>Categorization heuristic:</para>
144
+ /// <list type="bullet">
145
+ /// <item><c>BlokError</c> — passthrough; missing origin fields filled in.</item>
146
+ /// <item><c>NodeException</c> (legacy) — preserves message/details/cause; category=INTERNAL.</item>
147
+ /// <item><c>Exception</c> — wraps as INTERNAL with <c>code=UNCAUGHT_&lt;TYPE&gt;</c>.</item>
148
+ /// <item><c>IDictionary</c> — extracts <c>"message"</c> key, full payload in details.</item>
149
+ /// <item><c>string</c> — becomes the message.</item>
150
+ /// <item><c>null</c> — placeholder <c>"node error"</c>.</item>
151
+ /// </list>
152
+ /// </summary>
153
+ public static BlokError FromUnknown(object? value, BlokErrorOrigin origin)
154
+ {
155
+ if (value is BlokError be)
156
+ {
157
+ be.ApplyOriginIfMissing(origin);
158
+ return be;
159
+ }
160
+ if (value is NodeException ne)
161
+ {
162
+ var details = new Dictionary<string, object?>
163
+ {
164
+ ["message"] = ne.Message,
165
+ ["code"] = ne.Code,
166
+ ["category"] = ne.Category.ToString(),
167
+ ["details"] = ne.Details,
168
+ };
169
+ return Internal()
170
+ .Code("UNCAUGHT_NODEEXCEPTION")
171
+ .Message(ne.Message)
172
+ .Cause(ne)
173
+ .Details(details)
174
+ .ApplyOrigin(origin)
175
+ .Build();
176
+ }
177
+ if (value is Exception ex)
178
+ {
179
+ var msg = string.IsNullOrEmpty(ex.Message) ? "Uncaught error" : ex.Message;
180
+ return Internal()
181
+ .Code(UncaughtCode(ex.GetType()))
182
+ .Message(msg)
183
+ .Cause(ex)
184
+ .ApplyOrigin(origin)
185
+ .Build();
186
+ }
187
+ if (value is null)
188
+ {
189
+ return Internal()
190
+ .Code("UNCAUGHT_ERROR")
191
+ .Message("node error")
192
+ .ApplyOrigin(origin)
193
+ .Build();
194
+ }
195
+ if (value is string s)
196
+ {
197
+ return Internal()
198
+ .Code("UNCAUGHT_ERROR")
199
+ .Message(s)
200
+ .Details(new Dictionary<string, object?> { ["message"] = s })
201
+ .ApplyOrigin(origin)
202
+ .Build();
203
+ }
204
+ if (value is System.Collections.IDictionary dict)
205
+ {
206
+ var typed = AsStringKeyMap(dict);
207
+ var message = typed.TryGetValue("message", out var m) && m is string ms && !string.IsNullOrEmpty(ms)
208
+ ? ms
209
+ : "node error";
210
+ return Internal()
211
+ .Code("UNCAUGHT_ERROR")
212
+ .Message(message)
213
+ .Details(typed)
214
+ .ApplyOrigin(origin)
215
+ .Build();
216
+ }
217
+ var repr = value.ToString() ?? "node error";
218
+ return Internal()
219
+ .Code("UNCAUGHT_ERROR")
220
+ .Message(repr)
221
+ .Details(new Dictionary<string, object?> { ["message"] = repr })
222
+ .ApplyOrigin(origin)
223
+ .Build();
224
+ }
225
+
226
+ /// <summary>
227
+ /// Lossless serialization to a map matching the proto wire shape
228
+ /// (snake_case keys). Inverse of <see cref="FromMap"/>.
229
+ /// </summary>
230
+ public Dictionary<string, object?> ToMap() => new()
231
+ {
232
+ ["code"] = Code,
233
+ ["category"] = Category.AsWire(),
234
+ ["severity"] = Severity.AsWire(),
235
+ ["node"] = Node,
236
+ ["sdk"] = Sdk,
237
+ ["sdk_version"] = SdkVersion,
238
+ ["runtime_kind"] = RuntimeKind,
239
+ ["at"] = At.ToString("o"),
240
+ ["message"] = Message,
241
+ ["description"] = Description,
242
+ ["remediation"] = Remediation,
243
+ ["doc_url"] = DocUrl,
244
+ ["causes"] = Causes.Select(c => new Dictionary<string, object?>(c)).ToList(),
245
+ ["stack"] = Stack,
246
+ ["context_snapshot"] = ContextSnapshot,
247
+ ["http_status"] = HttpStatus,
248
+ ["retryable"] = Retryable,
249
+ ["retry_after_ms"] = RetryAfterMs,
250
+ ["details"] = Details,
251
+ };
252
+
253
+ /// <summary>
254
+ /// Reconstruct a <c>BlokError</c> from a JSON-decoded map. Tolerates both
255
+ /// <c>snake_case</c> (C#/Java/Python/Go convention) and <c>camelCase</c>
256
+ /// (TS payload shape) keys for cross-language fixture compatibility.
257
+ /// </summary>
258
+ public static BlokError FromMap(IDictionary<string, object?> m)
259
+ {
260
+ var category = BlokErrorCategoryExtensions.Parse(PickFirst(m, "category") as string);
261
+ var severity = BlokErrorSeverityExtensions.Parse(PickFirst(m, "severity") as string);
262
+ var b = new Builder(category).Severity(severity);
263
+ if (PickFirst(m, "code") is string code) b.Code(code);
264
+ if (PickFirst(m, "message") is string message) b.Message(message);
265
+ if (PickFirst(m, "description") is string description) b.Description(description);
266
+ if (PickFirst(m, "remediation") is string remediation) b.Remediation(remediation);
267
+ if (PickFirst(m, "doc_url", "docUrl") is string docUrl) b.DocUrl(docUrl);
268
+ if (TryGetInt(m, out var http, "http_status", "httpStatus")) b.HttpStatus(http);
269
+ if (PickFirst(m, "retryable") is bool retry) b.Retryable(retry);
270
+ if (TryGetLong(m, out var retryAfter, "retry_after_ms", "retryAfterMs")) b.RetryAfterMs(retryAfter);
271
+ if (m.TryGetValue("details", out var details)) b.Details(details);
272
+ var snapshot = PickFirst(m, "context_snapshot", "contextSnapshot");
273
+ if (snapshot is not null) b.ContextSnapshot(snapshot);
274
+ if (PickFirst(m, "node") is string node) b.Node(node);
275
+ if (PickFirst(m, "sdk") is string sdk) b.Sdk(sdk);
276
+ if (PickFirst(m, "sdk_version", "sdkVersion") is string sdkVersion) b.SdkVersion(sdkVersion);
277
+ if (PickFirst(m, "runtime_kind", "runtimeKind") is string runtimeKind) b.RuntimeKind(runtimeKind);
278
+ if (PickFirst(m, "stack") is string stack) b.Stack(stack);
279
+ if (PickFirst(m, "at") is string at && DateTime.TryParse(at, null, System.Globalization.DateTimeStyles.RoundtripKind, out var parsedAt))
280
+ {
281
+ b.At(parsedAt);
282
+ }
283
+ if (m.TryGetValue("causes", out var rawCauses) && rawCauses is System.Collections.IEnumerable causesList)
284
+ {
285
+ var typed = new List<Dictionary<string, object?>>();
286
+ foreach (var c in causesList)
287
+ {
288
+ if (c is System.Collections.IDictionary cm)
289
+ {
290
+ typed.Add(AsStringKeyMap(cm));
291
+ }
292
+ }
293
+ b.Causes(typed);
294
+ }
295
+ return b.Build();
296
+ }
297
+
298
+ // =========================================================================
299
+ // Origin auto-enrichment
300
+ // =========================================================================
301
+
302
+ /// <summary>
303
+ /// Fill in any missing origin fields. Won't overwrite explicit values.
304
+ /// </summary>
305
+ public BlokError ApplyOriginIfMissing(BlokErrorOrigin origin)
306
+ {
307
+ if (string.IsNullOrEmpty(Node)) Node = origin.Node;
308
+ if (string.IsNullOrEmpty(Sdk)) Sdk = origin.Sdk;
309
+ if (string.IsNullOrEmpty(SdkVersion)) SdkVersion = origin.SdkVersion;
310
+ if (string.IsNullOrEmpty(RuntimeKind)) RuntimeKind = origin.RuntimeKind;
311
+ return this;
312
+ }
313
+
314
+ // =========================================================================
315
+ // Cause-chain flattening
316
+ // =========================================================================
317
+
318
+ /// <summary>
319
+ /// Walk an exception's <see cref="Exception.InnerException"/> chain and
320
+ /// produce a flat list of payloads. Cycle-safe; lifts a <see cref="BlokError"/>
321
+ /// link in directly so cross-wire serialization doesn't double-count
322
+ /// nested chains.
323
+ /// </summary>
324
+ public static List<Dictionary<string, object?>> FlattenCauses(Exception cause)
325
+ {
326
+ var causes = new List<Dictionary<string, object?>>();
327
+ var visited = new HashSet<Exception>();
328
+ var current = cause;
329
+ while (current is not null && visited.Add(current))
330
+ {
331
+ if (current is BlokError be)
332
+ {
333
+ var payload = be.ToMap();
334
+ payload["causes"] = new List<Dictionary<string, object?>>();
335
+ causes.Add(payload);
336
+ foreach (var nested in be.Causes)
337
+ {
338
+ causes.Add(new Dictionary<string, object?>(nested));
339
+ }
340
+ return causes;
341
+ }
342
+ causes.Add(ExceptionToPayload(current));
343
+ current = current.InnerException;
344
+ }
345
+ return causes;
346
+ }
347
+
348
+ private static Dictionary<string, object?> ExceptionToPayload(Exception ex) => new()
349
+ {
350
+ ["code"] = UncaughtCode(ex.GetType()),
351
+ ["category"] = BlokErrorCategory.Internal.AsWire(),
352
+ ["severity"] = BlokErrorSeverity.Error.AsWire(),
353
+ ["node"] = "",
354
+ ["sdk"] = "",
355
+ ["sdk_version"] = "",
356
+ ["runtime_kind"] = "",
357
+ ["at"] = DateTime.UtcNow.ToString("o"),
358
+ ["message"] = string.IsNullOrEmpty(ex.Message) ? "Uncaught error" : ex.Message,
359
+ ["description"] = "",
360
+ ["remediation"] = "",
361
+ ["doc_url"] = "",
362
+ ["causes"] = new List<Dictionary<string, object?>>(),
363
+ ["stack"] = ex.StackTrace ?? string.Empty,
364
+ ["context_snapshot"] = null,
365
+ ["http_status"] = 500,
366
+ ["retryable"] = false,
367
+ ["retry_after_ms"] = 0L,
368
+ ["details"] = null,
369
+ };
370
+
371
+ /// <summary>
372
+ /// Derive an <c>UNCAUGHT_&lt;TYPE&gt;</c> code from a type. Mirrors the
373
+ /// Python <c>UNCAUGHT_CONNECTIONERROR</c>, Go <c>UNCAUGHT_&lt;TYPE&gt;</c>,
374
+ /// and Java <c>UNCAUGHT_IOEXCEPTION</c> conventions: simple type name,
375
+ /// alphanumerics only, uppercased.
376
+ /// </summary>
377
+ public static string UncaughtCode(Type? type)
378
+ {
379
+ if (type is null) return "UNCAUGHT_ERROR";
380
+ var simple = type.Name;
381
+ var sb = new System.Text.StringBuilder(simple.Length);
382
+ foreach (var c in simple)
383
+ {
384
+ if (char.IsLetterOrDigit(c)) sb.Append(char.ToUpperInvariant(c));
385
+ }
386
+ return sb.Length == 0 ? "UNCAUGHT_ERROR" : "UNCAUGHT_" + sb;
387
+ }
388
+
389
+ // =========================================================================
390
+ // Internal map helpers
391
+ // =========================================================================
392
+
393
+ private static object? PickFirst(IDictionary<string, object?> m, params string[] keys)
394
+ {
395
+ foreach (var k in keys)
396
+ {
397
+ if (m.TryGetValue(k, out var v)) return v;
398
+ }
399
+ return null;
400
+ }
401
+
402
+ private static bool TryGetInt(IDictionary<string, object?> m, out int value, params string[] keys)
403
+ {
404
+ var raw = PickFirst(m, keys);
405
+ switch (raw)
406
+ {
407
+ case int i: value = i; return true;
408
+ case long l: value = (int)l; return true;
409
+ case double d: value = (int)d; return true;
410
+ case JsonElement el when el.ValueKind == JsonValueKind.Number:
411
+ value = el.GetInt32();
412
+ return true;
413
+ default:
414
+ value = 0;
415
+ return false;
416
+ }
417
+ }
418
+
419
+ private static bool TryGetLong(IDictionary<string, object?> m, out long value, params string[] keys)
420
+ {
421
+ var raw = PickFirst(m, keys);
422
+ switch (raw)
423
+ {
424
+ case int i: value = i; return true;
425
+ case long l: value = l; return true;
426
+ case double d: value = (long)d; return true;
427
+ case JsonElement el when el.ValueKind == JsonValueKind.Number:
428
+ value = el.GetInt64();
429
+ return true;
430
+ default:
431
+ value = 0;
432
+ return false;
433
+ }
434
+ }
435
+
436
+ private static Dictionary<string, object?> AsStringKeyMap(System.Collections.IDictionary raw)
437
+ {
438
+ var typed = new Dictionary<string, object?>();
439
+ foreach (System.Collections.DictionaryEntry e in raw)
440
+ {
441
+ typed[e.Key.ToString() ?? ""] = e.Value;
442
+ }
443
+ return typed;
444
+ }
445
+
446
+ // =========================================================================
447
+ // Builder
448
+ // =========================================================================
449
+
450
+ /// <summary>
451
+ /// Fluent builder per master plan §17.5. Each setter returns
452
+ /// <c>this</c> so chained calls compose without intermediate variables.
453
+ /// Call <see cref="Build"/> to finalize.
454
+ /// </summary>
455
+ public sealed class Builder
456
+ {
457
+ internal readonly BlokErrorCategory CategoryValue;
458
+ internal BlokErrorSeverity SeverityValue = BlokErrorSeverity.Error;
459
+ internal string? CodeValue;
460
+ internal string? MessageValue;
461
+ internal string? DescriptionValue;
462
+ internal string? RemediationValue;
463
+ internal string? DocUrlValue;
464
+ internal int HttpStatusValue;
465
+ internal bool RetryableValue;
466
+ internal long RetryAfterMsValue;
467
+ internal object? DetailsValue;
468
+ internal object? ContextSnapshotValue;
469
+ internal Exception? CauseValue;
470
+ internal List<Dictionary<string, object?>>? CausesValue;
471
+ internal string? StackValue;
472
+ internal DateTime? AtValue;
473
+ internal string? NodeValue;
474
+ internal string? SdkValue;
475
+ internal string? SdkVersionValue;
476
+ internal string? RuntimeKindValue;
477
+
478
+ internal Builder(BlokErrorCategory category)
479
+ {
480
+ CategoryValue = category;
481
+ HttpStatusValue = category.DefaultHttpStatus();
482
+ RetryableValue = category.DefaultRetryable();
483
+ }
484
+
485
+ public Builder Code(string value) { CodeValue = value; return this; }
486
+ public Builder Message(string value) { MessageValue = value; return this; }
487
+ public Builder Description(string value) { DescriptionValue = value; return this; }
488
+ public Builder Remediation(string value) { RemediationValue = value; return this; }
489
+ public Builder DocUrl(string value) { DocUrlValue = value; return this; }
490
+ public Builder HttpStatus(int value) { HttpStatusValue = value; return this; }
491
+ public Builder Severity(BlokErrorSeverity value) { SeverityValue = value; return this; }
492
+ public Builder Retryable(bool value) { RetryableValue = value; return this; }
493
+ public Builder RetryAfter(TimeSpan duration) { RetryAfterMsValue = (long)duration.TotalMilliseconds; return this; }
494
+ public Builder RetryAfterMs(long value) { RetryAfterMsValue = value; return this; }
495
+ public Builder Details(object? value) { DetailsValue = value; return this; }
496
+ public Builder ContextSnapshot(object? value) { ContextSnapshotValue = value; return this; }
497
+ public Builder Cause(Exception? value) { CauseValue = value; return this; }
498
+ public Builder Causes(List<Dictionary<string, object?>> value) { CausesValue = value; return this; }
499
+ public Builder Stack(string value) { StackValue = value; return this; }
500
+ public Builder At(DateTime value) { AtValue = value; return this; }
501
+ public Builder Node(string value) { NodeValue = value; return this; }
502
+ public Builder Sdk(string value) { SdkValue = value; return this; }
503
+ public Builder SdkVersion(string value) { SdkVersionValue = value; return this; }
504
+ public Builder RuntimeKind(string value) { RuntimeKindValue = value; return this; }
505
+
506
+ /// <summary>
507
+ /// Apply origin fields, only filling unset ones. Use this in the
508
+ /// runtime-side wrapping path; explicit handler-set values win.
509
+ /// </summary>
510
+ public Builder ApplyOrigin(BlokErrorOrigin origin)
511
+ {
512
+ if (string.IsNullOrEmpty(NodeValue)) NodeValue = origin.Node;
513
+ if (string.IsNullOrEmpty(SdkValue)) SdkValue = origin.Sdk;
514
+ if (string.IsNullOrEmpty(SdkVersionValue)) SdkVersionValue = origin.SdkVersion;
515
+ if (string.IsNullOrEmpty(RuntimeKindValue)) RuntimeKindValue = origin.RuntimeKind;
516
+ return this;
517
+ }
518
+
519
+ public BlokError Build() => new(this);
520
+ }
521
+ }
522
+
523
+ /// <summary>
524
+ /// Carrier of the auto-enrichment fields the gRPC servicer fills into a
525
+ /// handler-thrown <see cref="BlokError"/> when the handler didn't set those
526
+ /// fields explicitly.
527
+ /// </summary>
528
+ public record BlokErrorOrigin(string Node, string Sdk, string SdkVersion, string RuntimeKind)
529
+ {
530
+ /// <summary>
531
+ /// Build an <see cref="BlokErrorOrigin"/> populated with the SDK
532
+ /// constants (<see cref="BlokError.DefaultSdkName"/>,
533
+ /// <see cref="BlokError.DefaultRuntimeKind"/>) and the caller-provided
534
+ /// node name + SDK version.
535
+ /// </summary>
536
+ public static BlokErrorOrigin Defaults(string node, string sdkVersion)
537
+ => new(node ?? string.Empty, BlokError.DefaultSdkName, sdkVersion ?? string.Empty, BlokError.DefaultRuntimeKind);
538
+ }