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,576 @@
1
+ package com.blok.blok.errors;
2
+
3
+ import java.io.PrintWriter;
4
+ import java.io.StringWriter;
5
+ import java.time.Duration;
6
+ import java.time.Instant;
7
+ import java.util.ArrayList;
8
+ import java.util.Arrays;
9
+ import java.util.Collection;
10
+ import java.util.HashMap;
11
+ import java.util.HashSet;
12
+ import java.util.LinkedHashMap;
13
+ import java.util.List;
14
+ import java.util.Map;
15
+ import java.util.Objects;
16
+ import java.util.Set;
17
+
18
+ /**
19
+ * Structured {@code BlokError} per master plan §17 — the canonical error
20
+ * contract every Blok node SDK populates the same way.
21
+ *
22
+ * <p>Mirrors the TypeScript {@code BlokError} in
23
+ * {@code core/shared/src/BlokError.ts}, the Python {@code BlokError} in
24
+ * {@code sdks/python3/blok/errors/blok_error.py}, the Go {@code BlokError}
25
+ * in {@code sdks/go/blok_error.go}, and the Rust {@code BlokError} in
26
+ * {@code sdks/rust/src/blok_error.rs}, so node authors writing in any
27
+ * language see the same field shape.
28
+ *
29
+ * <p>Idiomatic usage (master plan §17.5 builder pattern):
30
+ *
31
+ * <pre>{@code
32
+ * throw BlokError.dependency()
33
+ * .code("POSTGRES_CONNECT_TIMEOUT")
34
+ * .message("Could not connect to Postgres within 5s")
35
+ * .description(String.format("Tried host=%s port=%d; timeout=%dms", host, port, dur))
36
+ * .remediation("Check DATABASE_URL env var and network reachability")
37
+ * .cause(e)
38
+ * .retryable(true)
39
+ * .retryAfterMs(5_000)
40
+ * .build();
41
+ * }</pre>
42
+ *
43
+ * <p>Extends {@link RuntimeException} so handlers can {@code throw} it
44
+ * directly without changing the {@code throws Exception} signature on
45
+ * {@link com.blok.blok.node.NodeHandler#execute}. The legacy
46
+ * {@link NodeException} (5 categories) stays available for back-compat.
47
+ * New code should prefer {@code BlokError}.
48
+ */
49
+ public final class BlokError extends RuntimeException {
50
+
51
+ /** SDK identifier reported on auto-enriched errors. */
52
+ public static final String DEFAULT_SDK_NAME = "blok-java";
53
+ /** Runtime kind reported on auto-enriched errors. */
54
+ public static final String DEFAULT_RUNTIME_KIND = "runtime.java";
55
+ /** Default cap on serialized {@code context_snapshot} size in bytes. */
56
+ public static final int CONTEXT_SNAPSHOT_MAX_BYTES = 4096;
57
+
58
+ private final BlokErrorCategory category;
59
+ private BlokErrorSeverity severity;
60
+ private final String code;
61
+ private final String description;
62
+ private final String remediation;
63
+ private final String docUrl;
64
+ private int httpStatus;
65
+ private boolean retryable;
66
+ private final long retryAfterMs;
67
+ private final Object details;
68
+ private final Object contextSnapshot;
69
+ private final List<Map<String, Object>> causes;
70
+ private final String stack;
71
+ private final Instant at;
72
+
73
+ // Origin — auto-enriched by the gRPC servicer when not set by the handler.
74
+ private String node;
75
+ private String sdk;
76
+ private String sdkVersion;
77
+ private String runtimeKind;
78
+
79
+ private BlokError(Builder b) {
80
+ super(b.message != null ? b.message : "", b.causeThrowable);
81
+ this.category = b.category;
82
+ this.severity = b.severity;
83
+ this.code = b.code != null ? b.code : "";
84
+ this.description = b.description != null ? b.description : "";
85
+ this.remediation = b.remediation != null ? b.remediation : "";
86
+ this.docUrl = b.docUrl != null ? b.docUrl : "";
87
+ this.httpStatus = b.httpStatus;
88
+ this.retryable = b.retryable;
89
+ this.retryAfterMs = b.retryAfterMs;
90
+ this.details = b.details;
91
+ this.contextSnapshot = b.contextSnapshot;
92
+ this.stack = b.stack != null ? b.stack : captureStack(this);
93
+ this.at = b.at != null ? b.at : Instant.now();
94
+ this.node = b.node != null ? b.node : "";
95
+ this.sdk = b.sdk != null ? b.sdk : "";
96
+ this.sdkVersion = b.sdkVersion != null ? b.sdkVersion : "";
97
+ this.runtimeKind = b.runtimeKind != null ? b.runtimeKind : "";
98
+ // Cause-chain takes the explicit list when provided, otherwise walks
99
+ // the Throwable cause chain.
100
+ if (b.causes != null) {
101
+ this.causes = b.causes;
102
+ } else if (b.causeThrowable != null) {
103
+ this.causes = flattenCauses(b.causeThrowable);
104
+ } else {
105
+ this.causes = new ArrayList<>();
106
+ }
107
+ }
108
+
109
+ // =========================================================================
110
+ // Static factory shortcuts — one per category
111
+ // =========================================================================
112
+
113
+ /** Builder for a {@code VALIDATION} error (default 400, non-retryable). */
114
+ public static Builder validation() { return new Builder(BlokErrorCategory.VALIDATION); }
115
+ /** Builder for a {@code CONFIGURATION} error (default 500, non-retryable). */
116
+ public static Builder configuration() { return new Builder(BlokErrorCategory.CONFIGURATION); }
117
+ /** Builder for a {@code DEPENDENCY} error (default 502, retryable). */
118
+ public static Builder dependency() { return new Builder(BlokErrorCategory.DEPENDENCY); }
119
+ /** Builder for a {@code TIMEOUT} error (default 504, retryable). */
120
+ public static Builder timeout() { return new Builder(BlokErrorCategory.TIMEOUT); }
121
+ /** Builder for a {@code PERMISSION} error (default 403, non-retryable). */
122
+ public static Builder permission() { return new Builder(BlokErrorCategory.PERMISSION); }
123
+ /** Builder for a {@code RATE_LIMIT} error (default 429, retryable). */
124
+ public static Builder rateLimit() { return new Builder(BlokErrorCategory.RATE_LIMIT); }
125
+ /** Builder for a {@code NOT_FOUND} error (default 404, non-retryable). */
126
+ public static Builder notFound() { return new Builder(BlokErrorCategory.NOT_FOUND); }
127
+ /** Builder for a {@code CONFLICT} error (default 409, non-retryable). */
128
+ public static Builder conflict() { return new Builder(BlokErrorCategory.CONFLICT); }
129
+ /** Builder for a {@code CANCELLED} error (default 499, non-retryable). */
130
+ public static Builder cancelled() { return new Builder(BlokErrorCategory.CANCELLED); }
131
+ /** Builder for an {@code INTERNAL} error (default 500, non-retryable). */
132
+ public static Builder internal() { return new Builder(BlokErrorCategory.INTERNAL); }
133
+ /** Builder for a {@code PROTOCOL} error (default 502, non-retryable). */
134
+ public static Builder protocol() { return new Builder(BlokErrorCategory.PROTOCOL); }
135
+ /** Builder for a {@code DATA} error (default 422, non-retryable). */
136
+ public static Builder data() { return new Builder(BlokErrorCategory.DATA); }
137
+
138
+ /** Generic factory if the category isn't known at compile time. */
139
+ public static Builder of(BlokErrorCategory category) { return new Builder(category); }
140
+
141
+ // =========================================================================
142
+ // Conversion — fromUnknown, toMap, fromMap
143
+ // =========================================================================
144
+
145
+ /**
146
+ * Wrap any {@link Throwable} or value as a {@code BlokError}. Used by the
147
+ * runner's auto-wrap layer so legacy {@code throw new RuntimeException(...)}
148
+ * still produces a structured error.
149
+ *
150
+ * <p>Categorization heuristic:
151
+ * <ul>
152
+ * <li>{@code BlokError} — passthrough; missing origin fields filled in.</li>
153
+ * <li>{@code NodeException} (legacy) — preserves message/details/cause;
154
+ * category=INTERNAL with code derived from the legacy category.</li>
155
+ * <li>{@code Throwable} — wraps as INTERNAL with
156
+ * {@code code=UNCAUGHT_<TYPE>} and the throwable preserved as cause.</li>
157
+ * <li>{@code Map} — extracts {@code "message"} key, full payload preserved
158
+ * in {@code details}.</li>
159
+ * <li>{@code String} — becomes the message.</li>
160
+ * <li>{@code null} — placeholder {@code "node error"}.</li>
161
+ * <li>everything else — stringified, payload preserved in details.</li>
162
+ * </ul>
163
+ */
164
+ public static BlokError fromUnknown(Object value, Origin origin) {
165
+ if (value instanceof BlokError be) {
166
+ be.applyOriginIfMissing(origin);
167
+ return be;
168
+ }
169
+ if (value instanceof NodeException ne) {
170
+ Map<String, Object> det = ne.toMap();
171
+ return BlokError.internal()
172
+ .code("UNCAUGHT_NODEEXCEPTION")
173
+ .message(ne.getMessage() != null ? ne.getMessage() : "node exception")
174
+ .cause(ne)
175
+ .details(det)
176
+ .applyOrigin(origin)
177
+ .build();
178
+ }
179
+ if (value instanceof Throwable t) {
180
+ return BlokError.internal()
181
+ .code(uncaughtCode(t.getClass()))
182
+ .message(t.getMessage() != null && !t.getMessage().isEmpty()
183
+ ? t.getMessage()
184
+ : "Uncaught error")
185
+ .cause(t)
186
+ .applyOrigin(origin)
187
+ .build();
188
+ }
189
+ if (value == null) {
190
+ return BlokError.internal()
191
+ .code("UNCAUGHT_ERROR")
192
+ .message("node error")
193
+ .applyOrigin(origin)
194
+ .build();
195
+ }
196
+ if (value instanceof String s) {
197
+ Map<String, Object> det = new HashMap<>();
198
+ det.put("message", s);
199
+ return BlokError.internal()
200
+ .code("UNCAUGHT_ERROR")
201
+ .message(s)
202
+ .details(det)
203
+ .applyOrigin(origin)
204
+ .build();
205
+ }
206
+ if (value instanceof Map<?, ?> m) {
207
+ Object msg = m.get("message");
208
+ String message = (msg instanceof String ms && !ms.isEmpty()) ? ms : "node error";
209
+ return BlokError.internal()
210
+ .code("UNCAUGHT_ERROR")
211
+ .message(message)
212
+ .details(new HashMap<>(asStringKeyMap(m)))
213
+ .applyOrigin(origin)
214
+ .build();
215
+ }
216
+ String repr = String.valueOf(value);
217
+ Map<String, Object> det = new HashMap<>();
218
+ det.put("message", repr);
219
+ return BlokError.internal()
220
+ .code("UNCAUGHT_ERROR")
221
+ .message(repr)
222
+ .details(det)
223
+ .applyOrigin(origin)
224
+ .build();
225
+ }
226
+
227
+ /**
228
+ * Lossless serialization to a map matching the proto wire shape
229
+ * (snake_case keys). Inverse of {@link #fromMap}.
230
+ */
231
+ public Map<String, Object> toMap() {
232
+ Map<String, Object> m = new LinkedHashMap<>();
233
+ m.put("code", code);
234
+ m.put("category", category.name());
235
+ m.put("severity", severity.name());
236
+ m.put("node", node);
237
+ m.put("sdk", sdk);
238
+ m.put("sdk_version", sdkVersion);
239
+ m.put("runtime_kind", runtimeKind);
240
+ m.put("at", at.toString());
241
+ m.put("message", getMessage() != null ? getMessage() : "");
242
+ m.put("description", description);
243
+ m.put("remediation", remediation);
244
+ m.put("doc_url", docUrl);
245
+ m.put("causes", new ArrayList<>(causes));
246
+ m.put("stack", stack);
247
+ m.put("context_snapshot", contextSnapshot);
248
+ m.put("http_status", httpStatus);
249
+ m.put("retryable", retryable);
250
+ m.put("retry_after_ms", retryAfterMs);
251
+ m.put("details", details);
252
+ return m;
253
+ }
254
+
255
+ /**
256
+ * Reconstruct a {@code BlokError} from a JSON-decoded map. Tolerates both
257
+ * snake_case (Java/Python/Go convention) and camelCase (TS payload shape)
258
+ * keys for cross-language fixture compatibility.
259
+ */
260
+ @SuppressWarnings("unchecked")
261
+ public static BlokError fromMap(Map<String, Object> m) {
262
+ BlokErrorCategory category = BlokErrorCategory.parse((String) m.get("category"));
263
+ BlokErrorSeverity severity = BlokErrorSeverity.parse((String) m.get("severity"));
264
+ Builder b = new Builder(category).severity(severity);
265
+ Object code = m.get("code");
266
+ if (code instanceof String c) b.code(c);
267
+ Object msg = m.get("message");
268
+ if (msg instanceof String s) b.message(s);
269
+ Object desc = m.get("description");
270
+ if (desc instanceof String s) b.description(s);
271
+ Object rem = m.get("remediation");
272
+ if (rem instanceof String s) b.remediation(s);
273
+ Object docUrl = pickFirst(m, "doc_url", "docUrl");
274
+ if (docUrl instanceof String s) b.docUrl(s);
275
+ Object http = pickFirst(m, "http_status", "httpStatus");
276
+ if (http instanceof Number n) b.httpStatus(n.intValue());
277
+ Object retryable = m.get("retryable");
278
+ if (retryable instanceof Boolean v) b.retryable(v);
279
+ Object retryAfter = pickFirst(m, "retry_after_ms", "retryAfterMs");
280
+ if (retryAfter instanceof Number n) b.retryAfterMs(n.longValue());
281
+ Object details = m.get("details");
282
+ if (details != null) b.details(details);
283
+ Object snapshot = pickFirst(m, "context_snapshot", "contextSnapshot");
284
+ if (snapshot != null) b.contextSnapshot(snapshot);
285
+ Object node = m.get("node");
286
+ if (node instanceof String s) b.node(s);
287
+ Object sdk = m.get("sdk");
288
+ if (sdk instanceof String s) b.sdk(s);
289
+ Object sdkVer = pickFirst(m, "sdk_version", "sdkVersion");
290
+ if (sdkVer instanceof String s) b.sdkVersion(s);
291
+ Object runtimeKind = pickFirst(m, "runtime_kind", "runtimeKind");
292
+ if (runtimeKind instanceof String s) b.runtimeKind(s);
293
+ Object stack = m.get("stack");
294
+ if (stack instanceof String s) b.stack(s);
295
+ Object at = m.get("at");
296
+ if (at instanceof String s) {
297
+ try {
298
+ b.at(Instant.parse(s));
299
+ } catch (Exception ignored) {
300
+ // keep default
301
+ }
302
+ }
303
+ Object causes = m.get("causes");
304
+ if (causes instanceof List<?> list) {
305
+ List<Map<String, Object>> typed = new ArrayList<>();
306
+ for (Object c : list) {
307
+ if (c instanceof Map<?, ?> cm) {
308
+ typed.add(asStringKeyMap(cm));
309
+ }
310
+ }
311
+ b.causes(typed);
312
+ }
313
+ return b.build();
314
+ }
315
+
316
+ // =========================================================================
317
+ // Origin auto-enrichment
318
+ // =========================================================================
319
+
320
+ /**
321
+ * Carrier of the auto-enrichment fields the gRPC servicer fills into a
322
+ * handler-thrown {@code BlokError} when the handler didn't set those
323
+ * fields explicitly.
324
+ */
325
+ public record Origin(String node, String sdk, String sdkVersion, String runtimeKind) {
326
+ /**
327
+ * Build an {@code Origin} populated with the SDK constants
328
+ * ({@link #DEFAULT_SDK_NAME}, {@link #DEFAULT_RUNTIME_KIND}) and the
329
+ * caller-provided node name + SDK version.
330
+ */
331
+ public static Origin defaults(String node, String sdkVersion) {
332
+ return new Origin(
333
+ node != null ? node : "",
334
+ DEFAULT_SDK_NAME,
335
+ sdkVersion != null ? sdkVersion : "",
336
+ DEFAULT_RUNTIME_KIND
337
+ );
338
+ }
339
+ }
340
+
341
+ /** Fill in any missing origin fields on this error. Won't overwrite explicit values. */
342
+ public BlokError applyOriginIfMissing(Origin origin) {
343
+ if (origin == null) return this;
344
+ if (this.node.isEmpty()) this.node = origin.node;
345
+ if (this.sdk.isEmpty()) this.sdk = origin.sdk;
346
+ if (this.sdkVersion.isEmpty()) this.sdkVersion = origin.sdkVersion;
347
+ if (this.runtimeKind.isEmpty()) this.runtimeKind = origin.runtimeKind;
348
+ return this;
349
+ }
350
+
351
+ // =========================================================================
352
+ // Getters
353
+ // =========================================================================
354
+
355
+ public BlokErrorCategory getCategory() { return category; }
356
+ public BlokErrorSeverity getSeverity() { return severity; }
357
+ public String getCode() { return code; }
358
+ public String getDescription() { return description; }
359
+ public String getRemediation() { return remediation; }
360
+ public String getDocUrl() { return docUrl; }
361
+ public int getHttpStatus() { return httpStatus; }
362
+ public boolean isRetryable() { return retryable; }
363
+ public long getRetryAfterMs() { return retryAfterMs; }
364
+ public Object getDetails() { return details; }
365
+ public Object getContextSnapshot() { return contextSnapshot; }
366
+ public List<Map<String, Object>> getCauses() { return causes; }
367
+ public String getStack() { return stack; }
368
+ public Instant getAt() { return at; }
369
+ public String getNode() { return node; }
370
+ public String getSdk() { return sdk; }
371
+ public String getSdkVersion() { return sdkVersion; }
372
+ public String getRuntimeKind() { return runtimeKind; }
373
+
374
+ @Override
375
+ public String toString() {
376
+ return "[" + category.name() + "] " + (getMessage() != null ? getMessage() : "");
377
+ }
378
+
379
+ @Override
380
+ public boolean equals(Object o) {
381
+ if (this == o) return true;
382
+ if (!(o instanceof BlokError that)) return false;
383
+ return httpStatus == that.httpStatus
384
+ && retryable == that.retryable
385
+ && retryAfterMs == that.retryAfterMs
386
+ && category == that.category
387
+ && severity == that.severity
388
+ && Objects.equals(code, that.code)
389
+ && Objects.equals(getMessage(), that.getMessage());
390
+ }
391
+
392
+ @Override
393
+ public int hashCode() {
394
+ return Objects.hash(category, code, getMessage(), httpStatus);
395
+ }
396
+
397
+ // =========================================================================
398
+ // Builder
399
+ // =========================================================================
400
+
401
+ /**
402
+ * Fluent builder per master plan §17.5. Each setter returns {@code this}
403
+ * so chained calls compose without intermediate variables. Call
404
+ * {@link #build()} to finalize.
405
+ */
406
+ public static final class Builder {
407
+ private final BlokErrorCategory category;
408
+ private BlokErrorSeverity severity = BlokErrorSeverity.ERROR;
409
+ private String code;
410
+ private String message;
411
+ private String description;
412
+ private String remediation;
413
+ private String docUrl;
414
+ private int httpStatus;
415
+ private boolean retryable;
416
+ private long retryAfterMs;
417
+ private Object details;
418
+ private Object contextSnapshot;
419
+ private Throwable causeThrowable;
420
+ private List<Map<String, Object>> causes;
421
+ private String stack;
422
+ private Instant at;
423
+ private String node;
424
+ private String sdk;
425
+ private String sdkVersion;
426
+ private String runtimeKind;
427
+
428
+ Builder(BlokErrorCategory category) {
429
+ this.category = Objects.requireNonNull(category, "category");
430
+ this.httpStatus = category.defaultHttpStatus();
431
+ this.retryable = category.defaultRetryable();
432
+ }
433
+
434
+ public Builder code(String value) { this.code = value; return this; }
435
+ public Builder message(String value) { this.message = value; return this; }
436
+ public Builder description(String value) { this.description = value; return this; }
437
+ public Builder remediation(String value) { this.remediation = value; return this; }
438
+ public Builder docUrl(String value) { this.docUrl = value; return this; }
439
+ public Builder httpStatus(int value) { this.httpStatus = value; return this; }
440
+ public Builder severity(BlokErrorSeverity value) { this.severity = value != null ? value : BlokErrorSeverity.ERROR; return this; }
441
+ public Builder retryable(boolean value) { this.retryable = value; return this; }
442
+ public Builder retryAfter(Duration duration) { this.retryAfterMs = duration != null ? duration.toMillis() : 0; return this; }
443
+ public Builder retryAfterMs(long value) { this.retryAfterMs = value; return this; }
444
+ public Builder details(Object value) { this.details = value; return this; }
445
+ public Builder contextSnapshot(Object value) { this.contextSnapshot = value; return this; }
446
+ public Builder cause(Throwable value) { this.causeThrowable = value; return this; }
447
+ public Builder causes(List<Map<String, Object>> value) { this.causes = value; return this; }
448
+ public Builder stack(String value) { this.stack = value; return this; }
449
+ public Builder at(Instant value) { this.at = value; return this; }
450
+ public Builder node(String value) { this.node = value; return this; }
451
+ public Builder sdk(String value) { this.sdk = value; return this; }
452
+ public Builder sdkVersion(String value) { this.sdkVersion = value; return this; }
453
+ public Builder runtimeKind(String value) { this.runtimeKind = value; return this; }
454
+
455
+ /**
456
+ * Apply origin fields, only filling unset ones. Use this in the
457
+ * runtime-side wrapping path; explicit handler-set values win.
458
+ */
459
+ public Builder applyOrigin(Origin origin) {
460
+ if (origin == null) return this;
461
+ if (this.node == null || this.node.isEmpty()) this.node = origin.node;
462
+ if (this.sdk == null || this.sdk.isEmpty()) this.sdk = origin.sdk;
463
+ if (this.sdkVersion == null || this.sdkVersion.isEmpty()) this.sdkVersion = origin.sdkVersion;
464
+ if (this.runtimeKind == null || this.runtimeKind.isEmpty()) this.runtimeKind = origin.runtimeKind;
465
+ return this;
466
+ }
467
+
468
+ public BlokError build() {
469
+ return new BlokError(this);
470
+ }
471
+ }
472
+
473
+ // =========================================================================
474
+ // Cause-chain flattening
475
+ // =========================================================================
476
+
477
+ /**
478
+ * Walk a Throwable's {@code getCause()} chain and produce a flat list of
479
+ * payloads. Cycle-safe; lifts a {@code BlokError} link in directly so
480
+ * cross-wire serialization doesn't double-count nested chains.
481
+ */
482
+ public static List<Map<String, Object>> flattenCauses(Throwable cause) {
483
+ List<Map<String, Object>> causes = new ArrayList<>();
484
+ Set<Throwable> visited = new HashSet<>();
485
+ Throwable current = cause;
486
+ while (current != null && !visited.contains(current)) {
487
+ visited.add(current);
488
+ if (current instanceof BlokError be) {
489
+ Map<String, Object> payload = be.toMap();
490
+ payload.put("causes", new ArrayList<>());
491
+ causes.add(payload);
492
+ causes.addAll(be.getCauses());
493
+ return causes;
494
+ }
495
+ causes.add(throwableToPayload(current));
496
+ current = current.getCause();
497
+ }
498
+ return causes;
499
+ }
500
+
501
+ private static Map<String, Object> throwableToPayload(Throwable t) {
502
+ Map<String, Object> m = new LinkedHashMap<>();
503
+ m.put("code", uncaughtCode(t.getClass()));
504
+ m.put("category", BlokErrorCategory.INTERNAL.name());
505
+ m.put("severity", BlokErrorSeverity.ERROR.name());
506
+ m.put("node", "");
507
+ m.put("sdk", "");
508
+ m.put("sdk_version", "");
509
+ m.put("runtime_kind", "");
510
+ m.put("at", Instant.now().toString());
511
+ m.put("message", t.getMessage() != null ? t.getMessage() : "Uncaught error");
512
+ m.put("description", "");
513
+ m.put("remediation", "");
514
+ m.put("doc_url", "");
515
+ m.put("causes", new ArrayList<>());
516
+ m.put("stack", captureStack(t));
517
+ m.put("context_snapshot", null);
518
+ m.put("http_status", 500);
519
+ m.put("retryable", false);
520
+ m.put("retry_after_ms", 0L);
521
+ m.put("details", null);
522
+ return m;
523
+ }
524
+
525
+ /**
526
+ * Derive an {@code UNCAUGHT_<TYPE>} code from a class. Mirrors the Python
527
+ * {@code UNCAUGHT_CONNECTIONERROR} and Go {@code UNCAUGHT_<TYPE>}
528
+ * conventions: simple class name, alphanumerics only, uppercased.
529
+ */
530
+ static String uncaughtCode(Class<?> cls) {
531
+ if (cls == null) return "UNCAUGHT_ERROR";
532
+ String simple = cls.getSimpleName();
533
+ StringBuilder sb = new StringBuilder(simple.length());
534
+ for (int i = 0; i < simple.length(); i++) {
535
+ char c = simple.charAt(i);
536
+ if (Character.isLetterOrDigit(c)) {
537
+ sb.append(Character.toUpperCase(c));
538
+ }
539
+ }
540
+ return sb.length() == 0 ? "UNCAUGHT_ERROR" : "UNCAUGHT_" + sb;
541
+ }
542
+
543
+ private static String captureStack(Throwable t) {
544
+ if (t == null) return "";
545
+ StringWriter sw = new StringWriter();
546
+ try (PrintWriter pw = new PrintWriter(sw)) {
547
+ t.printStackTrace(pw);
548
+ }
549
+ return sw.toString();
550
+ }
551
+
552
+ // =========================================================================
553
+ // Internal map helpers
554
+ // =========================================================================
555
+
556
+ private static Object pickFirst(Map<String, Object> m, String... keys) {
557
+ for (String k : keys) {
558
+ if (m.containsKey(k)) return m.get(k);
559
+ }
560
+ return null;
561
+ }
562
+
563
+ @SuppressWarnings("unchecked")
564
+ private static Map<String, Object> asStringKeyMap(Map<?, ?> raw) {
565
+ Map<String, Object> out = new LinkedHashMap<>();
566
+ for (Map.Entry<?, ?> e : raw.entrySet()) {
567
+ out.put(String.valueOf(e.getKey()), e.getValue());
568
+ }
569
+ return out;
570
+ }
571
+
572
+ /** Visible for testing. */
573
+ static Collection<Class<?>> allCategoryClasses() {
574
+ return Arrays.asList(BlokErrorCategory.class, BlokErrorSeverity.class);
575
+ }
576
+ }
@@ -0,0 +1,68 @@
1
+ package com.blok.blok.errors;
2
+
3
+ /**
4
+ * The 12 canonical error categories every Blok node error falls into.
5
+ *
6
+ * <p>Mirrors the proto {@code blok.runtime.v1.ErrorCategory} enum value-for-value
7
+ * and matches the Python {@code BlokErrorCategory}, Go {@code CategoryDependency},
8
+ * and Rust {@code BlokErrorCategory::Dependency} constants. Each category carries
9
+ * a default HTTP status and retryable hint that authors can override per-error.
10
+ */
11
+ public enum BlokErrorCategory {
12
+
13
+ /** Input failed schema validation. Default HTTP 400, non-retryable. */
14
+ VALIDATION(400, false),
15
+ /** Misconfiguration of the runner / node / environment. Default 500, non-retryable. */
16
+ CONFIGURATION(500, false),
17
+ /** External dependency unreachable (DB, API). Default 502, retryable. */
18
+ DEPENDENCY(502, true),
19
+ /** Deadline exceeded. Default 504, retryable. */
20
+ TIMEOUT(504, true),
21
+ /** Caller lacks the right role/scope. Default 403, non-retryable. */
22
+ PERMISSION(403, false),
23
+ /** Caller exceeded a quota. Default 429, retryable with retry_after_ms. */
24
+ RATE_LIMIT(429, true),
25
+ /** Resource not found. Default 404, non-retryable. */
26
+ NOT_FOUND(404, false),
27
+ /** Idempotency violation, concurrent update. Default 409, non-retryable. */
28
+ CONFLICT(409, false),
29
+ /** Caller cancelled before completion. Default 499, non-retryable. */
30
+ CANCELLED(499, false),
31
+ /** SDK threw without classification — default fallback. Default 500, non-retryable. */
32
+ INTERNAL(500, false),
33
+ /** Wire-format / framing / serialization error. Default 502, non-retryable. */
34
+ PROTOCOL(502, false),
35
+ /** Payload schema OK but values are unprocessable. Default 422, non-retryable. */
36
+ DATA(422, false);
37
+
38
+ private final int defaultHttpStatus;
39
+ private final boolean defaultRetryable;
40
+
41
+ BlokErrorCategory(int defaultHttpStatus, boolean defaultRetryable) {
42
+ this.defaultHttpStatus = defaultHttpStatus;
43
+ this.defaultRetryable = defaultRetryable;
44
+ }
45
+
46
+ /** HTTP status conventionally associated with this category. */
47
+ public int defaultHttpStatus() {
48
+ return defaultHttpStatus;
49
+ }
50
+
51
+ /** Retryable hint conventionally associated with this category. */
52
+ public boolean defaultRetryable() {
53
+ return defaultRetryable;
54
+ }
55
+
56
+ /**
57
+ * Parse a string into a category, falling back to {@link #INTERNAL} for
58
+ * unknown values (matches Python/Go/Rust behaviour).
59
+ */
60
+ public static BlokErrorCategory parse(String value) {
61
+ if (value == null) return INTERNAL;
62
+ try {
63
+ return BlokErrorCategory.valueOf(value);
64
+ } catch (IllegalArgumentException ex) {
65
+ return INTERNAL;
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,31 @@
1
+ package com.blok.blok.errors;
2
+
3
+ /**
4
+ * How serious an error is. Mirrors the proto
5
+ * {@code blok.runtime.v1.ErrorSeverity} enum. Default for thrown errors is
6
+ * {@link #ERROR}.
7
+ */
8
+ public enum BlokErrorSeverity {
9
+
10
+ /** Informational, no action needed. */
11
+ INFO,
12
+ /** Recoverable, worth surfacing. */
13
+ WARN,
14
+ /** Standard error level. */
15
+ ERROR,
16
+ /** Process must terminate. */
17
+ FATAL;
18
+
19
+ /**
20
+ * Parse a string into a severity, falling back to {@link #ERROR} for
21
+ * unknown values.
22
+ */
23
+ public static BlokErrorSeverity parse(String value) {
24
+ if (value == null) return ERROR;
25
+ try {
26
+ return BlokErrorSeverity.valueOf(value);
27
+ } catch (IllegalArgumentException ex) {
28
+ return ERROR;
29
+ }
30
+ }
31
+ }