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,803 @@
1
+ // Structured BlokError per master plan §17 — the canonical error contract
2
+ // every Blok node SDK populates the same way. Mirrors the TypeScript
3
+ // BlokError in core/shared/src/BlokError.ts and the Python BlokError in
4
+ // sdks/python3/blok/errors/blok_error.go so node authors writing in any
5
+ // language see the same field shape.
6
+ //
7
+ // Idiomatic usage (master plan §17.5 builder pattern):
8
+ //
9
+ // return nil, blok.NewError(blok.CategoryDependency).
10
+ // Code("POSTGRES_CONNECT_TIMEOUT").
11
+ // Message("Could not connect to Postgres within 5s").
12
+ // Description(fmt.Sprintf("Tried host=%s port=%d; timeout=%s", host, port, dur)).
13
+ // Remediation("Check DATABASE_URL env var and network reachability").
14
+ // Cause(err).
15
+ // Retryable(true).
16
+ // RetryAfter(5 * time.Second).
17
+ // Details(map[string]any{"sql_state": "08001"}).
18
+ // Build()
19
+ //
20
+ // The legacy NodeError (5 categories) in errors.go stays available for
21
+ // back-compat. New code should prefer BlokError.
22
+
23
+ package blok
24
+
25
+ import (
26
+ "encoding/json"
27
+ "errors"
28
+ "fmt"
29
+ "runtime/debug"
30
+ "time"
31
+ )
32
+
33
+ // =============================================================================
34
+ // Categories — 12 values mirroring the proto blok.runtime.v1.ErrorCategory enum
35
+ // =============================================================================
36
+ //
37
+ // Reuses the existing ErrorCategory string type so legacy NodeError values
38
+ // (EXECUTION, NETWORK) stay valid. The proto serialization in grpc_server.go
39
+ // maps known→known and falls back to INTERNAL for legacy/unknown values.
40
+
41
+ const (
42
+ // CategoryDependency: external dependency unreachable (DB, API, etc.). Retryable.
43
+ CategoryDependency ErrorCategory = "DEPENDENCY"
44
+ // CategoryTimeout: deadline exceeded (network, computation, lock). Retryable.
45
+ CategoryTimeout ErrorCategory = "TIMEOUT"
46
+ // CategoryPermission: caller lacks the right role/scope.
47
+ CategoryPermission ErrorCategory = "PERMISSION"
48
+ // CategoryRateLimit: caller exceeded a quota. Retryable with retry_after_ms.
49
+ CategoryRateLimit ErrorCategory = "RATE_LIMIT"
50
+ // CategoryConflict: idempotency violation, concurrent update.
51
+ CategoryConflict ErrorCategory = "CONFLICT"
52
+ // CategoryCancelled: caller cancelled before completion.
53
+ CategoryCancelled ErrorCategory = "CANCELLED"
54
+ // CategoryInternal: SDK threw without classification — default fallback.
55
+ CategoryInternal ErrorCategory = "INTERNAL"
56
+ // CategoryProtocol: wire-format / framing / serialization error.
57
+ CategoryProtocol ErrorCategory = "PROTOCOL"
58
+ // CategoryData: payload schema OK but values are unprocessable.
59
+ CategoryData ErrorCategory = "DATA"
60
+ // Aliases for the categories the legacy NodeError already declared:
61
+ // - CategoryValidation == ErrorCategoryValidation == "VALIDATION"
62
+ // - CategoryConfiguration == ErrorCategoryConfiguration == "CONFIGURATION"
63
+ // - CategoryNotFound == ErrorCategoryNotFound == "NOT_FOUND"
64
+ CategoryValidation = ErrorCategoryValidation
65
+ CategoryConfiguration = ErrorCategoryConfiguration
66
+ CategoryNotFound = ErrorCategoryNotFound
67
+ )
68
+
69
+ // ErrorSeverity classifies how serious an error is.
70
+ type ErrorSeverity string
71
+
72
+ const (
73
+ // SeverityInfo: informational, no action needed.
74
+ SeverityInfo ErrorSeverity = "INFO"
75
+ // SeverityWarn: recoverable, worth surfacing.
76
+ SeverityWarn ErrorSeverity = "WARN"
77
+ // SeverityError: standard error level (default for thrown errors).
78
+ SeverityError ErrorSeverity = "ERROR"
79
+ // SeverityFatal: process must terminate.
80
+ SeverityFatal ErrorSeverity = "FATAL"
81
+ )
82
+
83
+ // DefaultHTTPStatus maps each category to its conventional HTTP status code.
84
+ // Authors override per-error via the .HTTPStatus(int) builder method.
85
+ var DefaultHTTPStatus = map[ErrorCategory]int{
86
+ CategoryValidation: 400,
87
+ CategoryConfiguration: 500,
88
+ CategoryDependency: 502,
89
+ CategoryTimeout: 504,
90
+ CategoryPermission: 403,
91
+ CategoryRateLimit: 429,
92
+ CategoryNotFound: 404,
93
+ CategoryConflict: 409,
94
+ CategoryCancelled: 499,
95
+ CategoryInternal: 500,
96
+ CategoryProtocol: 502,
97
+ CategoryData: 422,
98
+ }
99
+
100
+ // DefaultRetryable maps each category to a sensible retry hint default.
101
+ var DefaultRetryable = map[ErrorCategory]bool{
102
+ CategoryValidation: false,
103
+ CategoryConfiguration: false,
104
+ CategoryDependency: true,
105
+ CategoryTimeout: true,
106
+ CategoryPermission: false,
107
+ CategoryRateLimit: true,
108
+ CategoryNotFound: false,
109
+ CategoryConflict: false,
110
+ CategoryCancelled: false,
111
+ CategoryInternal: false,
112
+ CategoryProtocol: false,
113
+ CategoryData: false,
114
+ }
115
+
116
+ // SDK-side identifiers for auto-enrichment when handlers don't set them.
117
+ const (
118
+ DefaultSDKName = "blok-go"
119
+ DefaultRuntimeKind = "runtime.go"
120
+ )
121
+
122
+ // ContextSnapshotMaxBytes caps the JSON-serialized size of a context snapshot
123
+ // so trace + LLM payloads stay inspectable at a glance.
124
+ const ContextSnapshotMaxBytes = 4096
125
+
126
+ // =============================================================================
127
+ // BlokError — the structured error type
128
+ // =============================================================================
129
+
130
+ // BlokError is the canonical structured error per master plan §17. Returned
131
+ // from a NodeHandler.Execute to convey category-aware failure info that flows
132
+ // losslessly through the gRPC wire to the runner and into Studio traces.
133
+ //
134
+ // Use NewError(category) + builder methods to construct; direct struct
135
+ // literals work too if you prefer.
136
+ type BlokError struct {
137
+ Category ErrorCategory
138
+ Severity ErrorSeverity
139
+ Code string
140
+ Message string
141
+ Description string
142
+ Remediation string
143
+ DocURL string
144
+ HTTPStatus int
145
+ Retryable bool
146
+ RetryAfterMs int64
147
+ Details interface{}
148
+ ContextSnapshot interface{}
149
+ // Causes is a flat list of cause-chain payloads (outermost first). Already
150
+ // flattened at construction time so cross-wire serialization doesn't
151
+ // double-count nested chains.
152
+ Causes []map[string]interface{}
153
+ Stack string
154
+ At time.Time
155
+
156
+ // Origin — auto-enriched by the gRPC servicer when not set by the handler.
157
+ Node string
158
+ SDK string
159
+ SDKVersion string
160
+ RuntimeKind string
161
+
162
+ // underlyingCause keeps the original Go error for errors.Is / errors.Unwrap.
163
+ underlyingCause error
164
+ }
165
+
166
+ // Error implements the error interface.
167
+ func (e *BlokError) Error() string {
168
+ if e.underlyingCause != nil {
169
+ return fmt.Sprintf("[%s] %s: %v", e.Category, e.Message, e.underlyingCause)
170
+ }
171
+ return fmt.Sprintf("[%s] %s", e.Category, e.Message)
172
+ }
173
+
174
+ // Unwrap returns the underlying Go error so errors.Is / errors.As traverse
175
+ // the cause chain naturally.
176
+ func (e *BlokError) Unwrap() error {
177
+ return e.underlyingCause
178
+ }
179
+
180
+ // =============================================================================
181
+ // Builder — chained construction matching the master plan §17.5 example
182
+ // =============================================================================
183
+
184
+ // ErrorBuilder is the fluent constructor returned by NewError. Each chained
185
+ // method returns the same builder; Build() finalizes into a *BlokError with
186
+ // auto-fields populated (At, Stack, defaults).
187
+ type ErrorBuilder struct {
188
+ err *BlokError
189
+ }
190
+
191
+ // NewError starts a new BlokError builder for the given category. Defaults
192
+ // (HTTPStatus, Retryable, Severity) come from the per-category tables and
193
+ // can be overridden via the matching builder methods.
194
+ func NewError(category ErrorCategory) *ErrorBuilder {
195
+ httpStatus, ok := DefaultHTTPStatus[category]
196
+ if !ok {
197
+ httpStatus = 500
198
+ }
199
+ retryable := DefaultRetryable[category]
200
+ return &ErrorBuilder{err: &BlokError{
201
+ Category: category,
202
+ Severity: SeverityError,
203
+ HTTPStatus: httpStatus,
204
+ Retryable: retryable,
205
+ }}
206
+ }
207
+
208
+ // Code sets the stable machine identifier for this error
209
+ // (e.g. "POSTGRES_CONNECT_TIMEOUT").
210
+ func (b *ErrorBuilder) Code(c string) *ErrorBuilder { b.err.Code = c; return b }
211
+
212
+ // Message sets the one-sentence human summary.
213
+ func (b *ErrorBuilder) Message(m string) *ErrorBuilder { b.err.Message = m; return b }
214
+
215
+ // Description sets the multi-paragraph context (what was tried, why it failed).
216
+ func (b *ErrorBuilder) Description(d string) *ErrorBuilder { b.err.Description = d; return b }
217
+
218
+ // Remediation sets the suggested next step for the developer.
219
+ func (b *ErrorBuilder) Remediation(r string) *ErrorBuilder { b.err.Remediation = r; return b }
220
+
221
+ // DocURL sets a link to documentation explaining this error code.
222
+ func (b *ErrorBuilder) DocURL(u string) *ErrorBuilder { b.err.DocURL = u; return b }
223
+
224
+ // HTTPStatus overrides the default HTTP status for this category.
225
+ func (b *ErrorBuilder) HTTPStatus(s int) *ErrorBuilder { b.err.HTTPStatus = s; return b }
226
+
227
+ // Severity overrides the default severity (ERROR).
228
+ func (b *ErrorBuilder) Severity(s ErrorSeverity) *ErrorBuilder { b.err.Severity = s; return b }
229
+
230
+ // Retryable overrides the default retryable hint.
231
+ func (b *ErrorBuilder) Retryable(r bool) *ErrorBuilder { b.err.Retryable = r; return b }
232
+
233
+ // RetryAfter sets the suggested retry-after duration. Stored as
234
+ // milliseconds in the proto wire format.
235
+ func (b *ErrorBuilder) RetryAfter(d time.Duration) *ErrorBuilder {
236
+ b.err.RetryAfterMs = d.Milliseconds()
237
+ return b
238
+ }
239
+
240
+ // RetryAfterMs sets the suggested retry-after directly in milliseconds.
241
+ func (b *ErrorBuilder) RetryAfterMs(ms int64) *ErrorBuilder { b.err.RetryAfterMs = ms; return b }
242
+
243
+ // Details attaches category-specific structured details
244
+ // (Zod issues, SQL state, etc.).
245
+ func (b *ErrorBuilder) Details(d interface{}) *ErrorBuilder { b.err.Details = d; return b }
246
+
247
+ // ContextSnapshot attaches a bounded slice of inputs/state at error time.
248
+ // Use BuildContextSnapshot to construct one within the size budget.
249
+ func (b *ErrorBuilder) ContextSnapshot(s interface{}) *ErrorBuilder {
250
+ b.err.ContextSnapshot = s
251
+ return b
252
+ }
253
+
254
+ // Cause attaches an underlying Go error. The cause chain is walked at
255
+ // Build time and flattened into the .Causes payload list.
256
+ func (b *ErrorBuilder) Cause(c error) *ErrorBuilder { b.err.underlyingCause = c; return b }
257
+
258
+ // Node overrides the auto-filled node name (handlers normally don't set this).
259
+ func (b *ErrorBuilder) Node(n string) *ErrorBuilder { b.err.Node = n; return b }
260
+
261
+ // SDK overrides the auto-filled SDK identifier ("blok-go").
262
+ func (b *ErrorBuilder) SDK(s string) *ErrorBuilder { b.err.SDK = s; return b }
263
+
264
+ // SDKVersion overrides the auto-filled SDK version.
265
+ func (b *ErrorBuilder) SDKVersion(v string) *ErrorBuilder { b.err.SDKVersion = v; return b }
266
+
267
+ // RuntimeKind overrides the auto-filled runtime kind ("runtime.go").
268
+ func (b *ErrorBuilder) RuntimeKind(k string) *ErrorBuilder { b.err.RuntimeKind = k; return b }
269
+
270
+ // Build finalizes the BlokError, capturing the current timestamp + stack and
271
+ // flattening the cause chain. Subsequent calls to other builder methods
272
+ // after Build() have no effect (the builder is intentionally one-shot).
273
+ func (b *ErrorBuilder) Build() *BlokError {
274
+ b.err.At = time.Now().UTC()
275
+ b.err.Stack = string(debug.Stack())
276
+ if b.err.underlyingCause != nil {
277
+ b.err.Causes = flattenCauses(b.err.underlyingCause)
278
+ }
279
+ return b.err
280
+ }
281
+
282
+ // =============================================================================
283
+ // Conversion — FromUnknown, ToMap, FromMap
284
+ // =============================================================================
285
+
286
+ // FromUnknown wraps any error/value as a BlokError. Used by the runner's
287
+ // auto-wrap layer so legacy `errors.New("oops")` still produces a structured
288
+ // error. Categorization heuristic:
289
+ //
290
+ // - *BlokError: passthrough; missing origin fields filled in.
291
+ // - *NodeError (legacy): preserves message/details/cause; category=INTERNAL.
292
+ // - error: wraps as INTERNAL with code=UNCAUGHT_<TYPE> and the error
293
+ // preserved in the cause chain.
294
+ // - map[string]interface{} / map[string]string: extracts "message" key,
295
+ // full payload preserved in Details.
296
+ // - string: becomes the message.
297
+ // - nil: placeholder "node error".
298
+ // - everything else: stringified, payload preserved in Details.
299
+ func FromUnknown(v interface{}, ctx Origin) *BlokError {
300
+ switch err := v.(type) {
301
+ case nil:
302
+ return NewError(CategoryInternal).
303
+ Code("UNCAUGHT_ERROR").
304
+ Message("node error").
305
+ applyOrigin(ctx).
306
+ Build()
307
+ case *BlokError:
308
+ err.applyOriginIfMissing(ctx)
309
+ return err
310
+ case *NodeError:
311
+ details := err.ToMap()
312
+ return NewError(CategoryInternal).
313
+ Code("UNCAUGHT_NODEERROR").
314
+ Message(err.Message).
315
+ Details(details).
316
+ Cause(err.Cause).
317
+ applyOrigin(ctx).
318
+ Build()
319
+ case error:
320
+ return NewError(CategoryInternal).
321
+ Code(uncaughtCode(err)).
322
+ Message(err.Error()).
323
+ Cause(err).
324
+ applyOrigin(ctx).
325
+ Build()
326
+ case string:
327
+ return NewError(CategoryInternal).
328
+ Code("UNCAUGHT_ERROR").
329
+ Message(err).
330
+ Details(map[string]interface{}{"message": err}).
331
+ applyOrigin(ctx).
332
+ Build()
333
+ case map[string]interface{}:
334
+ return wrapMap(err, ctx)
335
+ case map[string]string:
336
+ converted := make(map[string]interface{}, len(err))
337
+ for k, v := range err {
338
+ converted[k] = v
339
+ }
340
+ return wrapMap(converted, ctx)
341
+ default:
342
+ text, mErr := json.Marshal(err)
343
+ if mErr != nil {
344
+ text = []byte(fmt.Sprintf("%v", err))
345
+ }
346
+ message := string(text)
347
+ return NewError(CategoryInternal).
348
+ Code("UNCAUGHT_ERROR").
349
+ Message(message).
350
+ Details(map[string]interface{}{"message": message}).
351
+ applyOrigin(ctx).
352
+ Build()
353
+ }
354
+ }
355
+
356
+ func wrapMap(m map[string]interface{}, ctx Origin) *BlokError {
357
+ message, _ := m["message"].(string)
358
+ if message == "" {
359
+ message = "node error"
360
+ }
361
+ return NewError(CategoryInternal).
362
+ Code("UNCAUGHT_ERROR").
363
+ Message(message).
364
+ Details(m).
365
+ applyOrigin(ctx).
366
+ Build()
367
+ }
368
+
369
+ // Origin carries the auto-enrichment fields the gRPC servicer fills in when
370
+ // a handler-thrown BlokError doesn't have them.
371
+ type Origin struct {
372
+ Node string
373
+ SDK string
374
+ SDKVersion string
375
+ RuntimeKind string
376
+ }
377
+
378
+ // DefaultOrigin returns an Origin populated with the SDK constants
379
+ // (DefaultSDKName, DefaultRuntimeKind). The servicer fills Node + SDKVersion
380
+ // at call time.
381
+ func DefaultOrigin(node, sdkVersion string) Origin {
382
+ return Origin{
383
+ Node: node,
384
+ SDK: DefaultSDKName,
385
+ SDKVersion: sdkVersion,
386
+ RuntimeKind: DefaultRuntimeKind,
387
+ }
388
+ }
389
+
390
+ func (b *ErrorBuilder) applyOrigin(o Origin) *ErrorBuilder {
391
+ if b.err.Node == "" {
392
+ b.err.Node = o.Node
393
+ }
394
+ if b.err.SDK == "" {
395
+ b.err.SDK = o.SDK
396
+ }
397
+ if b.err.SDKVersion == "" {
398
+ b.err.SDKVersion = o.SDKVersion
399
+ }
400
+ if b.err.RuntimeKind == "" {
401
+ b.err.RuntimeKind = o.RuntimeKind
402
+ }
403
+ return b
404
+ }
405
+
406
+ // applyOriginIfMissing fills in *missing* origin fields on an
407
+ // already-constructed BlokError (e.g. handler-thrown). Won't overwrite
408
+ // fields the handler set explicitly.
409
+ func (e *BlokError) applyOriginIfMissing(o Origin) {
410
+ if e.Node == "" {
411
+ e.Node = o.Node
412
+ }
413
+ if e.SDK == "" {
414
+ e.SDK = o.SDK
415
+ }
416
+ if e.SDKVersion == "" {
417
+ e.SDKVersion = o.SDKVersion
418
+ }
419
+ if e.RuntimeKind == "" {
420
+ e.RuntimeKind = o.RuntimeKind
421
+ }
422
+ }
423
+
424
+ // EnrichOrigin is a public helper for the gRPC servicer to fill in missing
425
+ // origin fields on a handler-thrown BlokError before serializing.
426
+ func (e *BlokError) EnrichOrigin(o Origin) *BlokError {
427
+ e.applyOriginIfMissing(o)
428
+ return e
429
+ }
430
+
431
+ // ToMap serializes the BlokError to a JSON-friendly map matching the proto
432
+ // wire format. Inverse of FromMap.
433
+ func (e *BlokError) ToMap() map[string]interface{} {
434
+ return map[string]interface{}{
435
+ "code": e.Code,
436
+ "category": string(e.Category),
437
+ "severity": string(e.Severity),
438
+ "node": e.Node,
439
+ "sdk": e.SDK,
440
+ "sdk_version": e.SDKVersion,
441
+ "runtime_kind": e.RuntimeKind,
442
+ "at": e.At.Format(time.RFC3339Nano),
443
+ "message": e.Message,
444
+ "description": e.Description,
445
+ "remediation": e.Remediation,
446
+ "doc_url": e.DocURL,
447
+ "causes": causesAsAny(e.Causes),
448
+ "stack": e.Stack,
449
+ "context_snapshot": e.ContextSnapshot,
450
+ "http_status": e.HTTPStatus,
451
+ "retryable": e.Retryable,
452
+ "retry_after_ms": e.RetryAfterMs,
453
+ "details": e.Details,
454
+ }
455
+ }
456
+
457
+ // FromMap reconstructs a BlokError from a JSON-decoded map. Accepts both
458
+ // snake_case (Go convention) and camelCase (TS payload shape) keys for
459
+ // cross-language fixture compatibility.
460
+ func FromMap(m map[string]interface{}) *BlokError {
461
+ b := NewError(parseCategory(getAny(m, "category")))
462
+ if code, ok := getString(m, "code"); ok {
463
+ b.Code(code)
464
+ }
465
+ if msg, ok := getString(m, "message"); ok {
466
+ b.Message(msg)
467
+ }
468
+ if desc, ok := getString(m, "description"); ok {
469
+ b.Description(desc)
470
+ }
471
+ if rem, ok := getString(m, "remediation"); ok {
472
+ b.Remediation(rem)
473
+ }
474
+ if doc, ok := getString(m, "doc_url", "docUrl"); ok {
475
+ b.DocURL(doc)
476
+ }
477
+ if status, ok := getInt(m, "http_status", "httpStatus"); ok {
478
+ b.HTTPStatus(status)
479
+ }
480
+ if r, ok := getBool(m, "retryable"); ok {
481
+ b.Retryable(r)
482
+ }
483
+ if ra, ok := getInt64(m, "retry_after_ms", "retryAfterMs"); ok {
484
+ b.RetryAfterMs(ra)
485
+ }
486
+ if d, ok := m["details"]; ok {
487
+ b.Details(d)
488
+ }
489
+ if cs, ok := m["context_snapshot"]; ok {
490
+ b.ContextSnapshot(cs)
491
+ } else if cs, ok := m["contextSnapshot"]; ok {
492
+ b.ContextSnapshot(cs)
493
+ }
494
+ if sev, ok := getString(m, "severity"); ok {
495
+ b.Severity(parseSeverity(sev))
496
+ }
497
+ if n, ok := getString(m, "node"); ok {
498
+ b.Node(n)
499
+ }
500
+ if s, ok := getString(m, "sdk"); ok {
501
+ b.SDK(s)
502
+ }
503
+ if sv, ok := getString(m, "sdk_version", "sdkVersion"); ok {
504
+ b.SDKVersion(sv)
505
+ }
506
+ if rk, ok := getString(m, "runtime_kind", "runtimeKind"); ok {
507
+ b.RuntimeKind(rk)
508
+ }
509
+ built := b.Build()
510
+ if at, ok := getString(m, "at"); ok {
511
+ if parsed, err := time.Parse(time.RFC3339Nano, at); err == nil {
512
+ built.At = parsed
513
+ } else if parsed, err := time.Parse(time.RFC3339, at); err == nil {
514
+ built.At = parsed
515
+ }
516
+ }
517
+ if stack, ok := getString(m, "stack"); ok {
518
+ built.Stack = stack
519
+ }
520
+ if causes, ok := m["causes"].([]interface{}); ok {
521
+ built.Causes = make([]map[string]interface{}, 0, len(causes))
522
+ for _, c := range causes {
523
+ if cm, ok := c.(map[string]interface{}); ok {
524
+ built.Causes = append(built.Causes, cm)
525
+ }
526
+ }
527
+ }
528
+ return built
529
+ }
530
+
531
+ // =============================================================================
532
+ // Cause chain
533
+ // =============================================================================
534
+
535
+ func flattenCauses(cause error) []map[string]interface{} {
536
+ causes := make([]map[string]interface{}, 0, 4)
537
+ visited := make(map[error]struct{})
538
+ current := cause
539
+ for current != nil {
540
+ if _, seen := visited[current]; seen {
541
+ break
542
+ }
543
+ visited[current] = struct{}{}
544
+ switch typed := current.(type) {
545
+ case *BlokError:
546
+ payload := typed.ToMap()
547
+ payload["causes"] = []interface{}{}
548
+ causes = append(causes, payload)
549
+ for _, c := range typed.Causes {
550
+ causes = append(causes, c)
551
+ }
552
+ return causes
553
+ default:
554
+ causes = append(causes, errToPayload(current))
555
+ current = errors.Unwrap(current)
556
+ }
557
+ }
558
+ return causes
559
+ }
560
+
561
+ func errToPayload(err error) map[string]interface{} {
562
+ return map[string]interface{}{
563
+ "code": uncaughtCode(err),
564
+ "category": string(CategoryInternal),
565
+ "severity": string(SeverityError),
566
+ "node": "",
567
+ "sdk": "",
568
+ "sdk_version": "",
569
+ "runtime_kind": "",
570
+ "at": time.Now().UTC().Format(time.RFC3339Nano),
571
+ "message": err.Error(),
572
+ "description": "",
573
+ "remediation": "",
574
+ "doc_url": "",
575
+ "causes": []interface{}{},
576
+ "stack": "",
577
+ "context_snapshot": nil,
578
+ "http_status": 500,
579
+ "retryable": false,
580
+ "retry_after_ms": int64(0),
581
+ "details": nil,
582
+ }
583
+ }
584
+
585
+ func uncaughtCode(err error) string {
586
+ // Go error types don't have a stable .Name like Python; use the
587
+ // concrete type's name via fmt's %T verb, then upper-case + sanitize.
588
+ typeName := fmt.Sprintf("%T", err)
589
+ // Strip leading "*" and package prefix to match Python's
590
+ // `UNCAUGHT_<TYPE>` convention shape.
591
+ for i := len(typeName) - 1; i >= 0; i-- {
592
+ if typeName[i] == '.' {
593
+ typeName = typeName[i+1:]
594
+ break
595
+ }
596
+ }
597
+ if typeName == "" {
598
+ typeName = "ERROR"
599
+ }
600
+ upper := make([]byte, 0, len(typeName))
601
+ for i := 0; i < len(typeName); i++ {
602
+ c := typeName[i]
603
+ if c >= 'a' && c <= 'z' {
604
+ c -= 32
605
+ }
606
+ if (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') {
607
+ upper = append(upper, c)
608
+ }
609
+ }
610
+ if len(upper) == 0 {
611
+ return "UNCAUGHT_ERROR"
612
+ }
613
+ return "UNCAUGHT_" + string(upper)
614
+ }
615
+
616
+ func causesAsAny(causes []map[string]interface{}) []interface{} {
617
+ out := make([]interface{}, len(causes))
618
+ for i, c := range causes {
619
+ out[i] = c
620
+ }
621
+ return out
622
+ }
623
+
624
+ // =============================================================================
625
+ // Context snapshot helper
626
+ // =============================================================================
627
+
628
+ // BuildContextSnapshot creates a JSON-friendly bounded slice of inputs +
629
+ // recent vars suitable for the BlokError.ContextSnapshot field. Per master
630
+ // plan §17.6: 4KB cap by default + last-N (default 16) vars keys, with
631
+ // progressive trimming when oversize. `inputs` is preserved as-is — it's
632
+ // the most LLM-actionable context.
633
+ func BuildContextSnapshot(inputs map[string]interface{}, vars map[string]interface{}) map[string]interface{} {
634
+ return BuildContextSnapshotWithOpts(inputs, vars, ContextSnapshotMaxBytes, 16)
635
+ }
636
+
637
+ // BuildContextSnapshotWithOpts is the customizable variant of
638
+ // BuildContextSnapshot. maxVarsKeys=0 drops vars entirely; maxBytes<=0
639
+ // disables byte-budget trimming.
640
+ func BuildContextSnapshotWithOpts(
641
+ inputs map[string]interface{},
642
+ vars map[string]interface{},
643
+ maxBytes int,
644
+ maxVarsKeys int,
645
+ ) map[string]interface{} {
646
+ safeInputs := jsonSafeMap(inputs)
647
+ keys := make([]string, 0, len(vars))
648
+ for k := range vars {
649
+ keys = append(keys, k)
650
+ }
651
+ // Keep insertion-ish order as best Go can; use last N as the recent slice.
652
+ // Go's maps don't preserve order, but for a 4KB-budget snapshot the
653
+ // downstream consumer (LLM/Studio) doesn't care about ordering — just
654
+ // that the keys are there.
655
+ if maxVarsKeys >= 0 && len(keys) > maxVarsKeys {
656
+ keys = keys[len(keys)-maxVarsKeys:]
657
+ }
658
+ recent := make(map[string]interface{}, len(keys))
659
+ for _, k := range keys {
660
+ recent[k] = vars[k]
661
+ }
662
+ safeVars := jsonSafeMap(recent)
663
+
664
+ snapshot := map[string]interface{}{"inputs": safeInputs, "vars": safeVars}
665
+ if maxBytes <= 0 {
666
+ return snapshot
667
+ }
668
+ encoded, err := json.Marshal(snapshot)
669
+ if err != nil || len(encoded) <= maxBytes {
670
+ return snapshot
671
+ }
672
+ for len(keys) > 0 {
673
+ keys = keys[1:]
674
+ recent = make(map[string]interface{}, len(keys))
675
+ for _, k := range keys {
676
+ recent[k] = vars[k]
677
+ }
678
+ snapshot["vars"] = jsonSafeMap(recent)
679
+ encoded, err = json.Marshal(snapshot)
680
+ if err == nil && len(encoded) <= maxBytes {
681
+ return snapshot
682
+ }
683
+ }
684
+ return map[string]interface{}{"inputs": safeInputs, "vars": map[string]interface{}{}, "_truncated": true}
685
+ }
686
+
687
+ func jsonSafeMap(m map[string]interface{}) map[string]interface{} {
688
+ out := make(map[string]interface{}, len(m))
689
+ for k, v := range m {
690
+ out[k] = jsonSafe(v)
691
+ }
692
+ return out
693
+ }
694
+
695
+ func jsonSafe(v interface{}) interface{} {
696
+ switch x := v.(type) {
697
+ case nil, bool, string, int, int8, int16, int32, int64,
698
+ uint, uint8, uint16, uint32, uint64,
699
+ float32, float64:
700
+ return x
701
+ case map[string]interface{}:
702
+ return jsonSafeMap(x)
703
+ case []interface{}:
704
+ out := make([]interface{}, len(x))
705
+ for i, e := range x {
706
+ out[i] = jsonSafe(e)
707
+ }
708
+ return out
709
+ default:
710
+ if _, err := json.Marshal(x); err == nil {
711
+ return x
712
+ }
713
+ return fmt.Sprintf("%+v", x)
714
+ }
715
+ }
716
+
717
+ // =============================================================================
718
+ // Internal: small map/getter helpers (FromMap implementation)
719
+ // =============================================================================
720
+
721
+ func parseCategory(v interface{}) ErrorCategory {
722
+ if c, ok := v.(string); ok {
723
+ switch ErrorCategory(c) {
724
+ case CategoryValidation, CategoryConfiguration, CategoryDependency,
725
+ CategoryTimeout, CategoryPermission, CategoryRateLimit,
726
+ CategoryNotFound, CategoryConflict, CategoryCancelled,
727
+ CategoryInternal, CategoryProtocol, CategoryData:
728
+ return ErrorCategory(c)
729
+ }
730
+ }
731
+ return CategoryInternal
732
+ }
733
+
734
+ func parseSeverity(v string) ErrorSeverity {
735
+ switch ErrorSeverity(v) {
736
+ case SeverityInfo, SeverityWarn, SeverityError, SeverityFatal:
737
+ return ErrorSeverity(v)
738
+ }
739
+ return SeverityError
740
+ }
741
+
742
+ func getAny(m map[string]interface{}, keys ...string) interface{} {
743
+ for _, k := range keys {
744
+ if v, ok := m[k]; ok {
745
+ return v
746
+ }
747
+ }
748
+ return nil
749
+ }
750
+
751
+ func getString(m map[string]interface{}, keys ...string) (string, bool) {
752
+ for _, k := range keys {
753
+ if v, ok := m[k]; ok {
754
+ if s, ok := v.(string); ok {
755
+ return s, true
756
+ }
757
+ }
758
+ }
759
+ return "", false
760
+ }
761
+
762
+ func getBool(m map[string]interface{}, keys ...string) (bool, bool) {
763
+ for _, k := range keys {
764
+ if v, ok := m[k]; ok {
765
+ if b, ok := v.(bool); ok {
766
+ return b, true
767
+ }
768
+ }
769
+ }
770
+ return false, false
771
+ }
772
+
773
+ func getInt(m map[string]interface{}, keys ...string) (int, bool) {
774
+ for _, k := range keys {
775
+ if v, ok := m[k]; ok {
776
+ switch x := v.(type) {
777
+ case int:
778
+ return x, true
779
+ case int64:
780
+ return int(x), true
781
+ case float64:
782
+ return int(x), true
783
+ }
784
+ }
785
+ }
786
+ return 0, false
787
+ }
788
+
789
+ func getInt64(m map[string]interface{}, keys ...string) (int64, bool) {
790
+ for _, k := range keys {
791
+ if v, ok := m[k]; ok {
792
+ switch x := v.(type) {
793
+ case int:
794
+ return int64(x), true
795
+ case int64:
796
+ return x, true
797
+ case float64:
798
+ return int64(x), true
799
+ }
800
+ }
801
+ }
802
+ return 0, false
803
+ }