space-data-module-sdk 0.8.3 → 0.8.5

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 (354) hide show
  1. package/README.md +117 -20
  2. package/bin/space-data-module.js +263 -0
  3. package/docs/.nojekyll +1 -0
  4. package/docs/AGENTS.md +34 -0
  5. package/docs/architecture.svg +141 -0
  6. package/docs/browser-wasmedge-isomorphic.md +179 -0
  7. package/docs/flatsql-streaming-standard.md +341 -0
  8. package/docs/gpu-module-abi.md +193 -0
  9. package/docs/index.html +125 -0
  10. package/docs/isomorphic-pthreads.md +188 -0
  11. package/docs/isomorphic-sdn-runtime-plan.md +167 -0
  12. package/docs/language-runtime-matrix.md +82 -0
  13. package/docs/manifest-structure.svg +114 -0
  14. package/docs/module-bundle-runtime-plan.md +19 -0
  15. package/docs/module-lifecycle.svg +70 -0
  16. package/docs/module-publication-standard.md +540 -0
  17. package/docs/node-red-default-node-parity.md +88 -0
  18. package/docs/protocol-installation.md +196 -0
  19. package/docs/secrets-capability.md +152 -0
  20. package/docs/styles.css +288 -0
  21. package/docs/testing-harness.md +408 -0
  22. package/docs/tri-runtime-parity.md +132 -0
  23. package/docs/wallet-callback.html +2 -0
  24. package/package.json +26 -6
  25. package/schemas/HttpRequestAbi.fbs +41 -0
  26. package/schemas/HttpResponseAbi.fbs +36 -0
  27. package/schemas/PluginManifest.fbs +2 -1
  28. package/src/AGENTS.md +1 -1
  29. package/src/app/codec.js +548 -0
  30. package/src/app/index.js +6 -0
  31. package/src/browser.js +5 -0
  32. package/src/bundle/constants.js +1 -0
  33. package/src/bundle/index.js +15 -0
  34. package/src/bundle/sigdomain.js +179 -0
  35. package/src/bundle/signing.js +767 -0
  36. package/src/bundle/wasm.js +3 -2
  37. package/src/capabilities.js +3 -0
  38. package/src/compat/index.js +7 -0
  39. package/src/compat/sdnLegacy.js +449 -0
  40. package/src/compiler/compileModule.js +556 -55
  41. package/src/compiler/flatcSupport.js +41 -27
  42. package/src/compiler/index.d.ts +2 -0
  43. package/src/compiler/index.js +18 -0
  44. package/src/compiler/invokeGlue.js +1212 -183
  45. package/src/compiler/pthreadArtifactGuard.js +910 -0
  46. package/src/compiler/sdnShimGenerator.js +323 -0
  47. package/src/compiler/wasiThreadsToolchain.js +150 -0
  48. package/src/compliance/index.js +11 -1
  49. package/src/compliance/legacyWildcardPorts.js +228 -0
  50. package/src/compliance/pluginCompliance.js +1000 -96
  51. package/src/field-stream/index.d.ts +31 -0
  52. package/src/field-stream/index.js +119 -0
  53. package/src/flow/dependencyStreamBridge.js +234 -0
  54. package/src/flow/flatsqlLinkShim.js +304 -0
  55. package/src/flow/flowCodec.js +107 -0
  56. package/src/flow/flowCompiler.js +2900 -0
  57. package/src/flow/flowRuntimeHost.js +877 -0
  58. package/src/flow/index.d.ts +117 -0
  59. package/src/flow/index.js +31 -0
  60. package/src/flow/isomorphicFlowHost.js +384 -0
  61. package/src/flow/jsFlowRuntime.js +275 -0
  62. package/src/flow/normalize.js +294 -0
  63. package/src/flow/runtime-src/flow_runtime.cpp +1699 -0
  64. package/src/flow/vendor/sdn-flow/MethodRegistry.js +400 -0
  65. package/src/flow/vendor/sdn-flow/constants.js +39 -0
  66. package/src/flow/vendor/sdn-flow/index.js +29 -0
  67. package/src/flow/vendor/sdn-flow/normalize.js +506 -0
  68. package/src/flow/vendor/sdn-flow/wasmCompatibility.js +189 -0
  69. package/src/generated/http/cpp/HttpRequestAbi_generated.h +285 -0
  70. package/src/generated/http/cpp/HttpResponseAbi_generated.h +192 -0
  71. package/src/generated/http/sdn/http/http-header.js +53 -0
  72. package/src/generated/http/sdn/http/http-header.ts +67 -0
  73. package/src/generated/http/sdn/http/http-request.js +132 -0
  74. package/src/generated/http/sdn/http/http-request.ts +179 -0
  75. package/src/generated/http/sdn/http/http-response.js +144 -0
  76. package/src/generated/http/sdn/http/http-response.ts +168 -0
  77. package/src/generated/http/sdn/http.js +11 -0
  78. package/src/generated/http/sdn/http.ts +4 -0
  79. package/src/generated/orbpro/flow/backpressure-policy.d.ts +12 -0
  80. package/src/generated/orbpro/flow/backpressure-policy.d.ts.map +1 -0
  81. package/src/generated/orbpro/flow/backpressure-policy.js +17 -0
  82. package/src/generated/orbpro/flow/backpressure-policy.js.map +1 -0
  83. package/src/generated/orbpro/flow/backpressure-policy.ts +15 -0
  84. package/src/generated/orbpro/flow/flow-bundle-manifest.d.ts +142 -0
  85. package/src/generated/orbpro/flow/flow-bundle-manifest.d.ts.map +1 -0
  86. package/src/generated/orbpro/flow/flow-bundle-manifest.js +304 -0
  87. package/src/generated/orbpro/flow/flow-bundle-manifest.js.map +1 -0
  88. package/src/generated/orbpro/flow/flow-bundle-manifest.ts +399 -0
  89. package/src/generated/orbpro/flow/flow-edge.d.ts +113 -0
  90. package/src/generated/orbpro/flow/flow-edge.d.ts.map +1 -0
  91. package/src/generated/orbpro/flow/flow-edge.js +221 -0
  92. package/src/generated/orbpro/flow/flow-edge.js.map +1 -0
  93. package/src/generated/orbpro/flow/flow-edge.ts +292 -0
  94. package/src/generated/orbpro/flow/flow-node.d.ts +80 -0
  95. package/src/generated/orbpro/flow/flow-node.d.ts.map +1 -0
  96. package/src/generated/orbpro/flow/flow-node.js +158 -0
  97. package/src/generated/orbpro/flow/flow-node.js.map +1 -0
  98. package/src/generated/orbpro/flow/flow-node.ts +202 -0
  99. package/src/generated/orbpro/flow/flow-program.d.ts +164 -0
  100. package/src/generated/orbpro/flow/flow-program.d.ts.map +1 -0
  101. package/src/generated/orbpro/flow/flow-program.js +350 -0
  102. package/src/generated/orbpro/flow/flow-program.js.map +1 -0
  103. package/src/generated/orbpro/flow/flow-program.ts +477 -0
  104. package/src/generated/orbpro/flow/flow-trigger.d.ts +108 -0
  105. package/src/generated/orbpro/flow/flow-trigger.d.ts.map +1 -0
  106. package/src/generated/orbpro/flow/flow-trigger.js +207 -0
  107. package/src/generated/orbpro/flow/flow-trigger.js.map +1 -0
  108. package/src/generated/orbpro/flow/flow-trigger.ts +276 -0
  109. package/src/generated/orbpro/flow/node-kind.d.ts +13 -0
  110. package/src/generated/orbpro/flow/node-kind.d.ts.map +1 -0
  111. package/src/generated/orbpro/flow/node-kind.js +16 -0
  112. package/src/generated/orbpro/flow/node-kind.js.map +1 -0
  113. package/src/generated/orbpro/{invoke.ts → flow/node-kind.ts} +12 -2
  114. package/src/generated/orbpro/flow/plugin-version-binding.d.ts +52 -0
  115. package/src/generated/orbpro/flow/plugin-version-binding.d.ts.map +1 -0
  116. package/src/generated/orbpro/flow/plugin-version-binding.js +85 -0
  117. package/src/generated/orbpro/flow/plugin-version-binding.js.map +1 -0
  118. package/src/generated/orbpro/flow/plugin-version-binding.ts +121 -0
  119. package/src/generated/orbpro/flow/schema-hash-binding.d.ts +70 -0
  120. package/src/generated/orbpro/flow/schema-hash-binding.d.ts.map +1 -0
  121. package/src/generated/orbpro/flow/schema-hash-binding.js +143 -0
  122. package/src/generated/orbpro/flow/schema-hash-binding.js.map +1 -0
  123. package/src/generated/orbpro/flow/schema-hash-binding.ts +189 -0
  124. package/src/generated/orbpro/flow/trigger-binding.d.ts +71 -0
  125. package/src/generated/orbpro/flow/trigger-binding.d.ts.map +1 -0
  126. package/src/generated/orbpro/flow/trigger-binding.js +142 -0
  127. package/src/generated/orbpro/flow/trigger-binding.js.map +1 -0
  128. package/src/generated/orbpro/flow/trigger-binding.ts +181 -0
  129. package/src/generated/orbpro/flow/trigger-kind.d.ts +14 -0
  130. package/src/generated/orbpro/flow/trigger-kind.d.ts.map +1 -0
  131. package/src/generated/orbpro/flow/trigger-kind.js +17 -0
  132. package/src/generated/orbpro/flow/trigger-kind.js.map +1 -0
  133. package/src/generated/orbpro/flow/trigger-kind.ts +17 -0
  134. package/src/generated/orbpro/flow.d.ts +21 -0
  135. package/src/generated/orbpro/flow.d.ts.map +1 -0
  136. package/src/generated/orbpro/flow.js +23 -0
  137. package/src/generated/orbpro/flow.js.map +1 -0
  138. package/src/generated/orbpro/flow.ts +24 -0
  139. package/src/generated/orbpro/manifest/capability-kind.d.ts +2 -1
  140. package/src/generated/orbpro/manifest/capability-kind.js +1 -0
  141. package/src/generated/orbpro/manifest/capability-kind.ts +1 -0
  142. package/src/generated/orbpro/plugin/stream-invoke-request.d.ts +93 -0
  143. package/src/generated/orbpro/plugin/stream-invoke-request.js +160 -0
  144. package/src/generated/orbpro/plugin/stream-invoke-request.ts +211 -0
  145. package/src/generated/orbpro/plugin/stream-invoke-response.d.ts +99 -0
  146. package/src/generated/orbpro/plugin/stream-invoke-response.js +175 -0
  147. package/src/generated/orbpro/plugin/stream-invoke-response.ts +226 -0
  148. package/src/generated/orbpro/plugin.js +8 -0
  149. package/src/generated/orbpro/stream.d.ts +12 -0
  150. package/src/generated/orbpro/stream.js +14 -0
  151. package/src/generated/orbpro/stream.ts +15 -0
  152. package/src/generated/spacedatastandards/plg/EntryFunction.d.ts +52 -0
  153. package/src/generated/spacedatastandards/plg/EntryFunction.d.ts.map +1 -0
  154. package/src/generated/spacedatastandards/plg/EntryFunction.js +106 -0
  155. package/src/generated/spacedatastandards/plg/EntryFunction.ts +162 -0
  156. package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.d.ts +90 -0
  157. package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.d.ts.map +1 -0
  158. package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.js +189 -0
  159. package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.ts +270 -0
  160. package/src/generated/spacedatastandards/plg/PLG.d.ts +492 -0
  161. package/src/generated/spacedatastandards/plg/PLG.d.ts.map +1 -0
  162. package/src/generated/spacedatastandards/plg/PLG.js +1139 -0
  163. package/src/generated/spacedatastandards/plg/PLG.ts +1600 -0
  164. package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.d.ts +63 -0
  165. package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.d.ts.map +1 -0
  166. package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.js +138 -0
  167. package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.ts +189 -0
  168. package/src/generated/spacedatastandards/plg/PLGBuildArtifact.d.ts +41 -0
  169. package/src/generated/spacedatastandards/plg/PLGBuildArtifact.d.ts.map +1 -0
  170. package/src/generated/spacedatastandards/plg/PLGBuildArtifact.js +104 -0
  171. package/src/generated/spacedatastandards/plg/PLGBuildArtifact.ts +151 -0
  172. package/src/generated/spacedatastandards/plg/PLGFlowEdge.d.ts +68 -0
  173. package/src/generated/spacedatastandards/plg/PLGFlowEdge.d.ts.map +1 -0
  174. package/src/generated/spacedatastandards/plg/PLGFlowEdge.js +124 -0
  175. package/src/generated/spacedatastandards/plg/PLGFlowEdge.ts +184 -0
  176. package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.d.ts +58 -0
  177. package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.d.ts.map +1 -0
  178. package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.js +126 -0
  179. package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.ts +161 -0
  180. package/src/generated/spacedatastandards/plg/PLGFlowNode.d.ts +82 -0
  181. package/src/generated/spacedatastandards/plg/PLGFlowNode.d.ts.map +1 -0
  182. package/src/generated/spacedatastandards/plg/PLGFlowNode.js +164 -0
  183. package/src/generated/spacedatastandards/plg/PLGFlowNode.ts +244 -0
  184. package/src/generated/spacedatastandards/plg/PLGFlowTrigger.d.ts +55 -0
  185. package/src/generated/spacedatastandards/plg/PLGFlowTrigger.d.ts.map +1 -0
  186. package/src/generated/spacedatastandards/plg/PLGFlowTrigger.js +105 -0
  187. package/src/generated/spacedatastandards/plg/PLGFlowTrigger.ts +162 -0
  188. package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.d.ts +42 -0
  189. package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.d.ts.map +1 -0
  190. package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.js +83 -0
  191. package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.ts +127 -0
  192. package/src/generated/spacedatastandards/plg/PLGHostCapability.d.ts +36 -0
  193. package/src/generated/spacedatastandards/plg/PLGHostCapability.d.ts.map +1 -0
  194. package/src/generated/spacedatastandards/plg/PLGHostCapability.js +90 -0
  195. package/src/generated/spacedatastandards/plg/PLGHostCapability.ts +127 -0
  196. package/src/generated/spacedatastandards/plg/PLGMethodManifest.d.ts +53 -0
  197. package/src/generated/spacedatastandards/plg/PLGMethodManifest.d.ts.map +1 -0
  198. package/src/generated/spacedatastandards/plg/PLGMethodManifest.js +153 -0
  199. package/src/generated/spacedatastandards/plg/PLGMethodManifest.ts +210 -0
  200. package/src/generated/spacedatastandards/plg/PLGPortManifest.d.ts +70 -0
  201. package/src/generated/spacedatastandards/plg/PLGPortManifest.d.ts.map +1 -0
  202. package/src/generated/spacedatastandards/plg/PLGPortManifest.js +149 -0
  203. package/src/generated/spacedatastandards/plg/PLGPortManifest.ts +212 -0
  204. package/src/generated/spacedatastandards/plg/PLGProtocolSpec.d.ts +73 -0
  205. package/src/generated/spacedatastandards/plg/PLGProtocolSpec.d.ts.map +1 -0
  206. package/src/generated/spacedatastandards/plg/PLGProtocolSpec.js +199 -0
  207. package/src/generated/spacedatastandards/plg/PLGProtocolSpec.ts +292 -0
  208. package/src/generated/spacedatastandards/plg/PLGTimerSpec.d.ts +40 -0
  209. package/src/generated/spacedatastandards/plg/PLGTimerSpec.d.ts.map +1 -0
  210. package/src/generated/spacedatastandards/plg/PLGTimerSpec.js +103 -0
  211. package/src/generated/spacedatastandards/plg/PLGTimerSpec.ts +148 -0
  212. package/src/generated/spacedatastandards/plg/PluginCapability.d.ts +41 -0
  213. package/src/generated/spacedatastandards/plg/PluginCapability.d.ts.map +1 -0
  214. package/src/generated/spacedatastandards/plg/PluginCapability.js +82 -0
  215. package/src/generated/spacedatastandards/plg/{plugin-capability.ts → PluginCapability.ts} +55 -18
  216. package/src/generated/spacedatastandards/plg/PluginDependency.d.ts +42 -0
  217. package/src/generated/spacedatastandards/plg/PluginDependency.d.ts.map +1 -0
  218. package/src/generated/spacedatastandards/plg/PluginDependency.js +80 -0
  219. package/src/generated/spacedatastandards/plg/PluginDependency.ts +124 -0
  220. package/src/generated/spacedatastandards/plg/TAB.d.ts +85 -0
  221. package/src/generated/spacedatastandards/plg/TAB.d.ts.map +1 -0
  222. package/src/generated/spacedatastandards/plg/TAB.js +173 -0
  223. package/src/generated/spacedatastandards/plg/TAB.ts +228 -0
  224. package/src/generated/spacedatastandards/plg/bufferMutability.d.ts +18 -0
  225. package/src/generated/spacedatastandards/plg/bufferMutability.d.ts.map +1 -0
  226. package/src/generated/spacedatastandards/plg/bufferMutability.js +20 -0
  227. package/src/generated/spacedatastandards/plg/bufferMutability.ts +23 -0
  228. package/src/generated/spacedatastandards/plg/bufferOwnership.d.ts +18 -0
  229. package/src/generated/spacedatastandards/plg/bufferOwnership.d.ts.map +1 -0
  230. package/src/generated/spacedatastandards/plg/bufferOwnership.js +20 -0
  231. package/src/generated/spacedatastandards/plg/bufferOwnership.ts +23 -0
  232. package/src/generated/spacedatastandards/plg/drainBehavior.d.ts +20 -0
  233. package/src/generated/spacedatastandards/plg/drainBehavior.d.ts.map +1 -0
  234. package/src/generated/spacedatastandards/plg/drainBehavior.js +22 -0
  235. package/src/generated/spacedatastandards/plg/drainBehavior.ts +25 -0
  236. package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.d.ts +10 -0
  237. package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.d.ts.map +1 -0
  238. package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.js +12 -0
  239. package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.ts +13 -0
  240. package/src/generated/spacedatastandards/plg/hostCapabilityKind.d.ts +51 -0
  241. package/src/generated/spacedatastandards/plg/hostCapabilityKind.d.ts.map +1 -0
  242. package/src/generated/spacedatastandards/plg/hostCapabilityKind.js +53 -0
  243. package/src/generated/spacedatastandards/plg/hostCapabilityKind.ts +55 -0
  244. package/src/generated/spacedatastandards/plg/invokeSurfaceKind.d.ts +15 -0
  245. package/src/generated/spacedatastandards/plg/invokeSurfaceKind.d.ts.map +1 -0
  246. package/src/generated/spacedatastandards/plg/invokeSurfaceKind.js +17 -0
  247. package/src/generated/spacedatastandards/plg/invokeSurfaceKind.ts +19 -0
  248. package/src/generated/spacedatastandards/plg/main.d.ts +29 -0
  249. package/src/generated/spacedatastandards/plg/main.d.ts.map +1 -0
  250. package/src/generated/spacedatastandards/plg/main.js +30 -0
  251. package/src/generated/spacedatastandards/plg/main.ts +32 -0
  252. package/src/generated/spacedatastandards/plg/payloadWireFormat.d.ts +17 -0
  253. package/src/generated/spacedatastandards/plg/payloadWireFormat.d.ts.map +1 -0
  254. package/src/generated/spacedatastandards/plg/payloadWireFormat.js +19 -0
  255. package/src/generated/spacedatastandards/plg/payloadWireFormat.ts +21 -0
  256. package/src/generated/spacedatastandards/plg/pluginCategory.d.ts +82 -0
  257. package/src/generated/spacedatastandards/plg/pluginCategory.d.ts.map +1 -0
  258. package/src/generated/spacedatastandards/plg/pluginCategory.js +84 -0
  259. package/src/generated/spacedatastandards/plg/pluginCategory.ts +103 -0
  260. package/src/generated/spacedatastandards/plg/publicationState.d.ts +18 -0
  261. package/src/generated/spacedatastandards/plg/publicationState.d.ts.map +1 -0
  262. package/src/generated/spacedatastandards/plg/publicationState.js +20 -0
  263. package/src/generated/spacedatastandards/plg/purchaseTier.d.ts +18 -0
  264. package/src/generated/spacedatastandards/plg/purchaseTier.d.ts.map +1 -0
  265. package/src/generated/spacedatastandards/plg/purchaseTier.js +20 -0
  266. package/src/host/AGENTS.md +2 -2
  267. package/src/host/abi.js +53 -66
  268. package/src/host/browserHost.js +355 -8
  269. package/src/host/cpp/keyslotClient.hpp +231 -0
  270. package/src/host/cpp/secretsClient.hpp +583 -0
  271. package/src/host/hostcallWire.js +183 -0
  272. package/src/host/index.js +2 -0
  273. package/src/host/isomorphicLoader.js +44 -7
  274. package/src/host/nodeHost.js +227 -8
  275. package/src/host/sabHostcallChannel.js +206 -0
  276. package/src/host/timerDriver.js +203 -0
  277. package/src/host/wasiShim.js +41 -1
  278. package/src/host/wasiThreadBrowserWorker.mjs +48 -0
  279. package/src/host/wasiThreadHost.js +393 -0
  280. package/src/host/wasiThreadWorker.mjs +32 -0
  281. package/src/host/wasiThreadWorkerRuntime.js +93 -0
  282. package/src/http/index.js +339 -0
  283. package/src/index.d.ts +716 -10
  284. package/src/index.js +4 -0
  285. package/src/invoke/codec.js +1202 -128
  286. package/src/invoke/index.js +5 -1
  287. package/src/licensing/index.d.ts +2 -0
  288. package/src/licensing/index.js +2 -0
  289. package/src/licensing/records.js +287 -8
  290. package/src/manifest/codec.js +62 -14
  291. package/src/manifest/index.js +2 -0
  292. package/src/manifest/legacyToPlg.js +164 -25
  293. package/src/manifest/normalize.js +1 -0
  294. package/src/manifest/plgCodec.js +1303 -62
  295. package/src/manifest/typeRefs.js +162 -24
  296. package/src/runtime/compiledRuntimeAbi.js +47 -0
  297. package/src/runtime/compiledRuntimeAbi.json +33 -0
  298. package/src/runtime/index.d.ts +32 -0
  299. package/src/runtime/index.js +1 -0
  300. package/src/runtime-host/index.js +3 -0
  301. package/src/runtime-host/methodRegistry.js +55 -0
  302. package/src/standards/index.js +200 -56
  303. package/src/standards/sharedCatalog.js +16 -0
  304. package/src/testing/browserModuleHarness.js +604 -31
  305. package/src/testing/docker/wasmedge-parity.Dockerfile +39 -0
  306. package/src/testing/index.d.ts +151 -0
  307. package/src/testing/index.js +21 -0
  308. package/src/testing/native/wasmedge_emscripten_pthread_runner.c +25 -1
  309. package/src/testing/parityBrowserRunner.js +138 -0
  310. package/src/testing/parityHarness.js +616 -0
  311. package/src/testing/parityLanes.js +537 -0
  312. package/src/testing/processInvoke.js +29 -21
  313. package/src/testing/streamInvokeCodec.js +10 -175
  314. package/src/testing/wasmedgePin.json +6 -0
  315. package/src/testing/workerModuleHarness.js +242 -0
  316. package/src/testing/workerModuleHarnessWorker.js +176 -0
  317. package/src/transport/index.js +3 -0
  318. package/src/transport/pki.js +299 -11
  319. package/src/transport/records.js +16 -7
  320. package/src/utils/ecdsaDer.js +106 -0
  321. package/src/utils/wasmCrypto.js +0 -43
  322. package/templates/gpu-module/README.md +48 -0
  323. package/templates/gpu-module/include/space_data_gpu_abi.h +122 -0
  324. package/templates/gpu-module/manifest.json +84 -0
  325. package/schemas/PluginInvokeRequest.fbs +0 -18
  326. package/schemas/PluginInvokeResponse.fbs +0 -30
  327. package/schemas/spacedatastandards/PLG.fbs +0 -191
  328. package/src/generated/orbpro/invoke/plugin-invoke-request.d.ts +0 -51
  329. package/src/generated/orbpro/invoke/plugin-invoke-request.d.ts.map +0 -1
  330. package/src/generated/orbpro/invoke/plugin-invoke-request.js +0 -131
  331. package/src/generated/orbpro/invoke/plugin-invoke-request.js.map +0 -1
  332. package/src/generated/orbpro/invoke/plugin-invoke-request.ts +0 -173
  333. package/src/generated/orbpro/invoke/plugin-invoke-response.d.ts +0 -76
  334. package/src/generated/orbpro/invoke/plugin-invoke-response.d.ts.map +0 -1
  335. package/src/generated/orbpro/invoke/plugin-invoke-response.js +0 -184
  336. package/src/generated/orbpro/invoke/plugin-invoke-response.js.map +0 -1
  337. package/src/generated/orbpro/invoke/plugin-invoke-response.ts +0 -243
  338. package/src/generated/orbpro/invoke.d.ts +0 -3
  339. package/src/generated/orbpro/invoke.js +0 -5
  340. package/src/generated/spacedatastandards/plg/entry-function.js +0 -86
  341. package/src/generated/spacedatastandards/plg/entry-function.ts +0 -119
  342. package/src/generated/spacedatastandards/plg/index.js +0 -16
  343. package/src/generated/spacedatastandards/plg/index.ts +0 -11
  344. package/src/generated/spacedatastandards/plg/plg.js +0 -657
  345. package/src/generated/spacedatastandards/plg/plg.ts +0 -924
  346. package/src/generated/spacedatastandards/plg/plugin-capability.js +0 -66
  347. package/src/generated/spacedatastandards/plg/plugin-category.js +0 -15
  348. package/src/generated/spacedatastandards/plg/plugin-category.ts +0 -53
  349. package/src/generated/spacedatastandards/plg/plugin-dependency.js +0 -63
  350. package/src/generated/spacedatastandards/plg/plugin-dependency.ts +0 -86
  351. package/src/generated/spacedatastandards/plg/publication-state.js +0 -9
  352. package/src/generated/spacedatastandards/plg/purchase-tier.js +0 -9
  353. /package/src/generated/spacedatastandards/plg/{publication-state.ts → publicationState.ts} +0 -0
  354. /package/src/generated/spacedatastandards/plg/{purchase-tier.ts → purchaseTier.ts} +0 -0
@@ -0,0 +1,196 @@
1
+ # Protocol Installation Metadata
2
+
3
+ This SDK now separates protocol identity from deployment-time routing.
4
+
5
+ That split matters because module artifacts are portable, compiled, and
6
+ signable, while deployment endpoints are environment-specific.
7
+
8
+ ## Canonical Manifest
9
+
10
+ Hosted protocol declarations belong in `manifest.protocols`.
11
+
12
+ Those declarations describe what a module can host or dial:
13
+
14
+ - `protocolId`
15
+ - `methodId`
16
+ - `inputPortId`
17
+ - `outputPortId`
18
+ - `wireId`
19
+ - `transportKind`
20
+ - `role`
21
+ - `specUri`
22
+ - `autoInstall`
23
+ - `advertise`
24
+ - `discoveryKey`
25
+ - `defaultPort`
26
+ - `requireSecureTransport`
27
+
28
+ These fields are embedded in the compiled `PluginManifest.fbs` bytes and are
29
+ part of the canonical module contract.
30
+
31
+ ## Deployment Metadata
32
+
33
+ Concrete deployment routing does **not** belong in the canonical manifest.
34
+
35
+ Examples:
36
+
37
+ - concrete multiaddrs
38
+ - resolved listen ports
39
+ - selected peer IDs
40
+ - deployment URLs
41
+ - interface-keyed input bindings
42
+ - scheduler bindings
43
+ - hosted service bindings
44
+ - request-time auth policy
45
+ - publication, pinning, retention, and archive policy
46
+
47
+ Those values vary per environment and should not change the identity of a
48
+ signed `.wasm` artifact.
49
+
50
+ Instead, attach them as a deployment-plan payload inside the bundle `MBL`
51
+ record carried by the appended `REC` trailer.
52
+
53
+ Deployment plans should use `protocolId` as the required identifier for a
54
+ resolved protocol installation. `wireId` is optional deployment metadata for
55
+ legacy transports that still expose it, not a required routing key.
56
+
57
+ Deployment input and publication bindings should reference
58
+ `manifest.externalInterfaces[].interfaceId`. That keeps deployment routing tied
59
+ to the declared module contract instead of transport-specific `topic` or
60
+ `wireId` hints.
61
+
62
+ The standard bundle entry is:
63
+
64
+ - `entryId`: `deployment-plan`
65
+ - `sectionName`: `sds.deployment`
66
+ - `payloadEncoding`: `json-utf8`
67
+ - `mediaType`: `application/vnd.space-data.module.deployment+json`
68
+
69
+ ## Public Helpers
70
+
71
+ Use `space-data-module-sdk/deployment` to work with that payload:
72
+
73
+ - `normalizeDeploymentPlan(...)`
74
+ - `validateDeploymentPlan(...)`
75
+ - `createDeploymentPlanBundleEntry(...)`
76
+ - `findDeploymentPlanEntry(...)`
77
+ - `readDeploymentPlanFromBundle(...)`
78
+
79
+ ## Example Manifest Protocol
80
+
81
+ ```json
82
+ {
83
+ "protocols": [
84
+ {
85
+ "protocolId": "sgp4-stream",
86
+ "methodId": "propagate",
87
+ "inputPortId": "request",
88
+ "outputPortId": "state",
89
+ "wireId": "/sdn/sgp4/1.0.0",
90
+ "transportKind": "libp2p",
91
+ "role": "handle",
92
+ "specUri": "https://spacedatastandards.org/#/schemas/PNM",
93
+ "autoInstall": true,
94
+ "advertise": true,
95
+ "discoveryKey": "sgp4-stream",
96
+ "defaultPort": 443,
97
+ "requireSecureTransport": true
98
+ }
99
+ ]
100
+ }
101
+ ```
102
+
103
+ ## Example Deployment Plan
104
+
105
+ ```json
106
+ {
107
+ "formatVersion": 1,
108
+ "pluginId": "com.example.sgp4",
109
+ "version": "1.2.3",
110
+ "protocolInstallations": [
111
+ {
112
+ "protocolId": "sgp4-stream",
113
+ "transportKind": "libp2p",
114
+ "role": "handle",
115
+ "peerId": "12D3KooW...",
116
+ "listenMultiaddrs": [
117
+ "/ip4/127.0.0.1/tcp/14080/ws/p2p/12D3KooW..."
118
+ ],
119
+ "advertisedMultiaddrs": [
120
+ "/dns4/sgp4.example.test/tcp/443/wss/p2p/12D3KooW..."
121
+ ],
122
+ "nodeInfoUrl": "https://sgp4.example.test/api/node/info"
123
+ }
124
+ ],
125
+ "inputBindings": [
126
+ {
127
+ "bindingId": "catalog-feed",
128
+ "interfaceId": "catalog-pubsub",
129
+ "targetMethodId": "propagate",
130
+ "targetInputPortId": "request",
131
+ "sourceKind": "pubsub"
132
+ }
133
+ ],
134
+ "scheduleBindings": [
135
+ {
136
+ "scheduleId": "poll-upstream",
137
+ "bindingMode": "local",
138
+ "targetMethodId": "propagate",
139
+ "targetInputPortId": "request",
140
+ "scheduleKind": "cron",
141
+ "cron": "*/15 * * * *"
142
+ }
143
+ ],
144
+ "serviceBindings": [
145
+ {
146
+ "serviceId": "https-query",
147
+ "bindingMode": "delegated",
148
+ "serviceKind": "http-server",
149
+ "routePath": "/api/sgp4",
150
+ "method": "GET",
151
+ "remoteUrl": "https://gateway.example.test/api/sgp4",
152
+ "authPolicyId": "approved-keys"
153
+ }
154
+ ],
155
+ "authPolicies": [
156
+ {
157
+ "policyId": "approved-keys",
158
+ "bindingMode": "delegated",
159
+ "targetKind": "service",
160
+ "targetId": "https-query",
161
+ "walletProfileId": "orbpro-default",
162
+ "trustMapId": "approved-operators",
163
+ "allowServerKeys": ["ed25519:..."]
164
+ }
165
+ ],
166
+ "publicationBindings": [
167
+ {
168
+ "publicationId": "state-catalog",
169
+ "interfaceId": "state-catalog-pubsub",
170
+ "bindingMode": "local",
171
+ "sourceKind": "method-output",
172
+ "sourceMethodId": "propagate",
173
+ "sourceOutputPortId": "state",
174
+ "schemaName": "CAT.fbs",
175
+ "emitPnm": true,
176
+ "emitFlatbufferArchive": true,
177
+ "archivePath": "/data/catalog/cat.bin",
178
+ "queryInterfaceId": "state-query-api",
179
+ "recordRangeStartField": "startIndex",
180
+ "recordRangeStopField": "stopIndex"
181
+ }
182
+ ]
183
+ }
184
+ ```
185
+
186
+ ## Identity Rules
187
+
188
+ - `wireId` identifies the network protocol.
189
+ - `specUri` identifies the message or schema contract.
190
+ - multiaddrs identify one deployment instance of that protocol.
191
+ - `interfaceId` identifies the declared module boundary used by deployment
192
+ input/publication bindings.
193
+ - deployment plans should resolve installed protocol surfaces by `protocolId`;
194
+ include `wireId` only when a host integration still needs that legacy hint.
195
+
196
+ Do not treat those as interchangeable.
@@ -0,0 +1,152 @@
1
+ # Credential Lanes — the `secrets` Capability
2
+
3
+ A module often needs an operator's third-party credential: a Space-Track login,
4
+ a data-provider API password, an account at whatever service the operator uses.
5
+ The `secrets` capability is how that credential reaches the module **without the
6
+ credential ever living in the module, the manifest, the flow, or a record**.
7
+
8
+ The operator enters the credential once on their node. The node seals it at rest
9
+ under its own key material. A module the operator has explicitly approved can
10
+ then read exactly that one credential at runtime.
11
+
12
+ This document is normative for module authors. The guest-side helper is
13
+ [`src/host/cpp/secretsClient.hpp`](../src/host/cpp/secretsClient.hpp); the
14
+ reference host implementation is `sdn-server/internal/modulert/caps/secrets.go`.
15
+
16
+ ## Lanes
17
+
18
+ A **lane** is a named credential slot on the node — `spacetrack`,
19
+ `acme-weather`, `zephyr_billing`. Lane ids are lowercase
20
+ `[a-z0-9_-]{2,64}`.
21
+
22
+ **Lanes are operator-defined.** A few are well-known (`spacetrack`, `edc_cpf`,
23
+ `myintelsat`) because the node ships a verifier that can probe them, but an
24
+ operator may create a lane for any service at all. Do not hard-code an
25
+ assumption that a fixed set exists:
26
+
27
+ - Take the lane id as **module configuration**, not as a compile-time constant,
28
+ so an operator can point your module at their own lane.
29
+ - Treat "not configured" as a **normal runtime state**, not an error condition
30
+ that should crash a run.
31
+ - A lane may be permanently **unverified**. The node cannot probe a service it
32
+ knows nothing about, so `verified_at` stays empty forever for most
33
+ operator-defined lanes. That is honest, not broken.
34
+
35
+ ## The approval contract
36
+
37
+ Reading a credential requires **two** things, and neither is something your
38
+ module can arrange for itself.
39
+
40
+ 1. **Declare the capability.** Add `secrets:<lane>` to your manifest's
41
+ `capabilities` for each lane you read. `secrets:spacetrack` conveys nothing
42
+ about `secrets:edc_cpf`: the host re-checks the exact lane on **every call**,
43
+ so a module holding one lane's grant is refused on every other lane.
44
+
45
+ 2. **The operator approves your module's content hash.** Every `secrets:*`
46
+ capability is *sensitive*. The operator records an approval for your module's
47
+ exact SHA-256 content hash, for that exact lane, in the node's
48
+ `capability_policy.json`. Without it the module is **denied at load** — the
49
+ whole module fails to load, not just the call.
50
+
51
+ Recompiling changes the hash and therefore **revokes** the approval. That is
52
+ deliberate: the approval is for the bytes the operator reviewed, not for a
53
+ name.
54
+
55
+ There is **no enumeration**. There is no `secrets.list` and no `secrets.export`.
56
+ A guest can ask for a lane it is already approved for and nothing else; it can
57
+ never discover which credentials the node holds. Do not probe lane names.
58
+
59
+ ## Handling the plaintext
60
+
61
+ `secrets.get` returns the credential **in the clear**, in your linear memory.
62
+ There is no way around that — the module's job is to present the password to the
63
+ provider's own login, so the secret *is* the message. Once it crosses the
64
+ boundary the host cannot protect it further, and these rules are yours to keep:
65
+
66
+ - **Never log it.** Not in an error message, not in a trace, not in a progress
67
+ event, not at debug level.
68
+ - **Never persist it.** Not through `storage.write`, not to the filesystem, not
69
+ into a record, not into a cache that outlives the call.
70
+ - **Never forward it** anywhere except the provider it belongs to.
71
+ - **Wipe it** as soon as the provider call is done, on success *and* failure
72
+ paths, and keep its lifetime as short as you can.
73
+
74
+ If your module also holds `http`, it is technically capable of exfiltrating the
75
+ credential. The operator's approval is precisely the decision to trust it not
76
+ to. Honor that.
77
+
78
+ ## Minimal usage
79
+
80
+ ```cpp
81
+ #include "sdm_hostcall_wire.hpp" // must be included first
82
+ #include "secretsClient.hpp"
83
+
84
+ // The lane comes from module configuration — never assume "spacetrack".
85
+ bool fetch_provider_data(const std::string& lane) {
86
+ sdm_secrets::Credential cred;
87
+ if (!sdm_secrets::secrets_get(lane, &cred)) {
88
+ // Not approved for this lane, or the operator has not entered it yet.
89
+ // Report the CONDITION, never the lane's contents.
90
+ log_error("provider credential unavailable");
91
+ return false;
92
+ }
93
+
94
+ const bool ok = provider_login(cred.username, cred.secret);
95
+ sdm_secrets::wipe(&cred); // on every path, including this failure one
96
+ return ok;
97
+ }
98
+ ```
99
+
100
+ Manifest:
101
+
102
+ ```json
103
+ {
104
+ "pluginId": "com.example.provider-fetch",
105
+ "capabilities": ["http", "secrets:acme-weather"]
106
+ }
107
+ ```
108
+
109
+ To decide whether a fetch is worth attempting without touching the plaintext:
110
+
111
+ ```cpp
112
+ sdm_secrets::Status status;
113
+ if (sdm_secrets::secrets_status(lane, &status) && status.configured) {
114
+ // A credential is present. status.username_masked is safe to show an
115
+ // operator ("o***@acme.example"); status.verified_at is EMPTY when the node
116
+ // has never probed it, which is normal for an operator-defined lane.
117
+ }
118
+ ```
119
+
120
+ `secrets_status` is gated by the **same** per-lane capability, so an unapproved
121
+ module cannot use it to probe which credentials a node holds.
122
+
123
+ ## Wire shapes
124
+
125
+ Both operations are plain JSON meta documents; neither uses binary segments.
126
+
127
+ ```
128
+ secrets.get -> {"id":"<lane>"}
129
+ <- {"ok":true,"result":{"id":"...","username":"...","secret":"..."}}
130
+
131
+ secrets.status -> {"id":"<lane>"}
132
+ <- {"ok":true,"result":{"id":"...","configured":true,
133
+ "username_masked":"o***@example.com",
134
+ "updated_at":"...","verified_at":"..."}}
135
+ ```
136
+
137
+ A refusal — unapproved lane, unconfigured credential, no keystore on this node —
138
+ comes back as `{"ok":false,...}` and **never** carries credential material. Both
139
+ helpers return `false` in that case and leave their output parameter untouched.
140
+ A `false` return never means "empty credential"; it means no credential was
141
+ obtained.
142
+
143
+ ## Failure modes worth expecting
144
+
145
+ | Situation | What you see |
146
+ |---|---|
147
+ | Capability not declared in the manifest | Refused per call (`ok:false`) |
148
+ | Declared but not approved by the operator | **Module denied at load** |
149
+ | Approved for a different lane | Refused per call (`ok:false`) |
150
+ | Lane exists but the operator has not filled it in | `secrets_get` false; `secrets_status` `configured:false` |
151
+ | Lane has no verifier on this node | `verified_at` empty — normal, not an error |
152
+ | Node has no credential keystore | Refused per call (`ok:false`) |
@@ -0,0 +1,288 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --bg: #05070a;
4
+ --surface: rgba(15, 19, 25, 0.82);
5
+ --surface-strong: rgba(22, 27, 35, 0.92);
6
+ --line: rgba(255, 255, 255, 0.12);
7
+ --line-strong: rgba(255, 255, 255, 0.2);
8
+ --text: #f5f5f7;
9
+ --muted: #a1a1aa;
10
+ --subtle: #747782;
11
+ --blue: #58a6ff;
12
+ --green: #42d392;
13
+ --amber: #f2cc60;
14
+ --sdn-stack-footer-height: 40px;
15
+ --sdn-stack-header-height: 52px;
16
+ --sdn-stack-header-brand-size: 15px;
17
+ --sdn-stack-header-link-size: 14px;
18
+ --sdn-stack-header-action-size: 13px;
19
+ --sdn-stack-header-mobile-link-size: 16px;
20
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
21
+ }
22
+
23
+ * {
24
+ box-sizing: border-box;
25
+ }
26
+
27
+ body {
28
+ margin: 0;
29
+ min-height: 100vh;
30
+ background:
31
+ radial-gradient(circle at 16% 18%, rgba(88, 166, 255, 0.16), transparent 30rem),
32
+ radial-gradient(circle at 84% 20%, rgba(66, 211, 146, 0.12), transparent 28rem),
33
+ linear-gradient(180deg, rgba(255, 255, 255, 0.035), transparent 20rem),
34
+ var(--bg);
35
+ color: var(--text);
36
+ }
37
+
38
+ a {
39
+ color: inherit;
40
+ text-decoration: none;
41
+ }
42
+
43
+ .site-header {
44
+ position: fixed;
45
+ top: 0;
46
+ left: 0;
47
+ right: 0;
48
+ z-index: 1000;
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: space-between;
52
+ height: var(--sdn-stack-header-height, 52px);
53
+ padding: 0 max(16px, calc((100vw - 1180px) / 2));
54
+ border-bottom: 1px solid var(--line);
55
+ background: rgba(5, 7, 10, 0.88);
56
+ backdrop-filter: blur(18px);
57
+ }
58
+
59
+ .site-brand {
60
+ color: var(--text);
61
+ font-size: var(--sdn-stack-header-brand-size, 15px);
62
+ font-weight: 800;
63
+ }
64
+
65
+ .stack-button {
66
+ display: inline-flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ min-height: 30px;
70
+ padding: 0 14px;
71
+ border: 1px solid rgba(88, 166, 255, 0.42);
72
+ border-radius: 8px;
73
+ background: rgba(88, 166, 255, 0.16);
74
+ color: var(--text);
75
+ font-size: var(--sdn-stack-header-link-size, 14px);
76
+ font-weight: 800;
77
+ }
78
+
79
+ main {
80
+ width: min(1180px, calc(100vw - 32px));
81
+ margin: 0 auto;
82
+ padding: 88px 0 calc(var(--sdn-stack-footer-height, 40px) + 72px);
83
+ }
84
+
85
+ .hero {
86
+ display: grid;
87
+ grid-template-columns: minmax(0, 0.92fr) minmax(320px, 1.08fr);
88
+ gap: 32px;
89
+ align-items: center;
90
+ min-height: calc(100vh - 128px);
91
+ }
92
+
93
+ .hero-copy {
94
+ min-width: 0;
95
+ }
96
+
97
+ .eyebrow {
98
+ margin: 0 0 10px;
99
+ color: var(--green);
100
+ font-size: 12px;
101
+ font-weight: 800;
102
+ letter-spacing: 0;
103
+ text-transform: uppercase;
104
+ }
105
+
106
+ h1,
107
+ h2,
108
+ p {
109
+ margin-top: 0;
110
+ }
111
+
112
+ h1 {
113
+ max-width: 10ch;
114
+ margin-bottom: 18px;
115
+ font-size: clamp(48px, 8vw, 92px);
116
+ line-height: 0.92;
117
+ letter-spacing: 0;
118
+ }
119
+
120
+ .lede {
121
+ max-width: 60ch;
122
+ color: var(--muted);
123
+ font-size: 18px;
124
+ line-height: 1.65;
125
+ }
126
+
127
+ .actions {
128
+ display: flex;
129
+ flex-wrap: wrap;
130
+ gap: 10px;
131
+ margin-top: 28px;
132
+ }
133
+
134
+ .button {
135
+ display: inline-flex;
136
+ align-items: center;
137
+ justify-content: center;
138
+ min-height: 42px;
139
+ padding: 0 16px;
140
+ border: 1px solid var(--line);
141
+ border-radius: 8px;
142
+ background: rgba(255, 255, 255, 0.06);
143
+ color: var(--text);
144
+ font-size: 14px;
145
+ font-weight: 700;
146
+ }
147
+
148
+ .button:hover {
149
+ border-color: var(--line-strong);
150
+ background: rgba(255, 255, 255, 0.1);
151
+ }
152
+
153
+ .button.primary {
154
+ border-color: rgba(88, 166, 255, 0.46);
155
+ background: rgba(88, 166, 255, 0.2);
156
+ }
157
+
158
+ .architecture {
159
+ margin: 0;
160
+ border: 1px solid var(--line);
161
+ border-radius: 8px;
162
+ background: var(--surface);
163
+ box-shadow: 0 28px 80px rgba(0, 0, 0, 0.36);
164
+ overflow: hidden;
165
+ }
166
+
167
+ .architecture img {
168
+ display: block;
169
+ width: 100%;
170
+ height: auto;
171
+ background: #0d1117;
172
+ }
173
+
174
+ .quick-grid {
175
+ display: grid;
176
+ grid-template-columns: repeat(4, minmax(0, 1fr));
177
+ gap: 12px;
178
+ margin: 28px 0 72px;
179
+ }
180
+
181
+ .quick-grid article {
182
+ min-width: 0;
183
+ border: 1px solid var(--line);
184
+ border-radius: 8px;
185
+ background: var(--surface);
186
+ padding: 18px;
187
+ }
188
+
189
+ .quick-grid h2 {
190
+ margin-bottom: 8px;
191
+ font-size: 16px;
192
+ }
193
+
194
+ .quick-grid p {
195
+ margin-bottom: 0;
196
+ color: var(--muted);
197
+ font-size: 14px;
198
+ line-height: 1.55;
199
+ }
200
+
201
+ .docs-list,
202
+ .stack-list {
203
+ display: grid;
204
+ grid-template-columns: minmax(220px, 0.34fr) minmax(0, 0.66fr);
205
+ gap: 28px;
206
+ align-items: start;
207
+ border-top: 1px solid var(--line);
208
+ padding-top: 36px;
209
+ }
210
+
211
+ .stack-list {
212
+ margin-top: 72px;
213
+ }
214
+
215
+ .section-head h2 {
216
+ margin: 0;
217
+ font-size: 28px;
218
+ }
219
+
220
+ .link-list {
221
+ display: grid;
222
+ gap: 10px;
223
+ }
224
+
225
+ .link-list a {
226
+ display: grid;
227
+ gap: 6px;
228
+ border: 1px solid var(--line);
229
+ border-radius: 8px;
230
+ background: var(--surface-strong);
231
+ padding: 18px;
232
+ }
233
+
234
+ .link-list a:hover {
235
+ border-color: rgba(88, 166, 255, 0.52);
236
+ }
237
+
238
+ .link-list a.active {
239
+ border-color: rgba(88, 166, 255, 0.52);
240
+ background: rgba(88, 166, 255, 0.14);
241
+ }
242
+
243
+ .link-list span {
244
+ color: var(--text);
245
+ font-weight: 760;
246
+ }
247
+
248
+ .link-list small {
249
+ color: var(--muted);
250
+ font-size: 13px;
251
+ line-height: 1.45;
252
+ }
253
+
254
+ @media (max-width: 860px) {
255
+ main {
256
+ width: min(100vw - 24px, 1180px);
257
+ padding-top: 72px;
258
+ }
259
+
260
+ .hero,
261
+ .docs-list,
262
+ .stack-list {
263
+ grid-template-columns: 1fr;
264
+ }
265
+
266
+ .hero {
267
+ min-height: auto;
268
+ }
269
+
270
+ h1 {
271
+ max-width: 11ch;
272
+ }
273
+
274
+ .quick-grid {
275
+ grid-template-columns: repeat(2, minmax(0, 1fr));
276
+ }
277
+ }
278
+
279
+ @media (max-width: 560px) {
280
+ .quick-grid {
281
+ grid-template-columns: 1fr;
282
+ }
283
+
284
+ .actions {
285
+ flex-direction: column;
286
+ align-items: stretch;
287
+ }
288
+ }