space-data-module-sdk 0.8.4 → 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.
- package/README.md +117 -20
- package/bin/space-data-module.js +263 -0
- package/docs/.nojekyll +1 -0
- package/docs/AGENTS.md +34 -0
- package/docs/architecture.svg +141 -0
- package/docs/browser-wasmedge-isomorphic.md +179 -0
- package/docs/flatsql-streaming-standard.md +341 -0
- package/docs/gpu-module-abi.md +193 -0
- package/docs/index.html +125 -0
- package/docs/isomorphic-pthreads.md +188 -0
- package/docs/isomorphic-sdn-runtime-plan.md +167 -0
- package/docs/language-runtime-matrix.md +82 -0
- package/docs/manifest-structure.svg +114 -0
- package/docs/module-bundle-runtime-plan.md +19 -0
- package/docs/module-lifecycle.svg +70 -0
- package/docs/module-publication-standard.md +540 -0
- package/docs/node-red-default-node-parity.md +88 -0
- package/docs/protocol-installation.md +196 -0
- package/docs/secrets-capability.md +152 -0
- package/docs/styles.css +288 -0
- package/docs/testing-harness.md +408 -0
- package/docs/tri-runtime-parity.md +132 -0
- package/docs/wallet-callback.html +2 -0
- package/package.json +25 -6
- package/schemas/HttpRequestAbi.fbs +41 -0
- package/schemas/HttpResponseAbi.fbs +36 -0
- package/schemas/PluginManifest.fbs +2 -1
- package/src/AGENTS.md +1 -1
- package/src/app/codec.js +548 -0
- package/src/app/index.js +6 -0
- package/src/browser.js +5 -0
- package/src/bundle/constants.js +1 -0
- package/src/bundle/index.js +15 -0
- package/src/bundle/sigdomain.js +179 -0
- package/src/bundle/signing.js +767 -0
- package/src/bundle/wasm.js +3 -2
- package/src/capabilities.js +3 -0
- package/src/compat/index.js +7 -0
- package/src/compat/sdnLegacy.js +449 -0
- package/src/compiler/compileModule.js +556 -55
- package/src/compiler/flatcSupport.js +41 -27
- package/src/compiler/index.d.ts +2 -0
- package/src/compiler/index.js +18 -0
- package/src/compiler/invokeGlue.js +1212 -183
- package/src/compiler/pthreadArtifactGuard.js +910 -0
- package/src/compiler/sdnShimGenerator.js +323 -0
- package/src/compiler/wasiThreadsToolchain.js +150 -0
- package/src/compliance/index.js +11 -1
- package/src/compliance/legacyWildcardPorts.js +228 -0
- package/src/compliance/pluginCompliance.js +1000 -96
- package/src/field-stream/index.d.ts +31 -0
- package/src/field-stream/index.js +119 -0
- package/src/flow/dependencyStreamBridge.js +234 -0
- package/src/flow/flatsqlLinkShim.js +304 -0
- package/src/flow/flowCodec.js +107 -0
- package/src/flow/flowCompiler.js +2900 -0
- package/src/flow/flowRuntimeHost.js +877 -0
- package/src/flow/index.d.ts +117 -0
- package/src/flow/index.js +31 -0
- package/src/flow/isomorphicFlowHost.js +384 -0
- package/src/flow/jsFlowRuntime.js +275 -0
- package/src/flow/normalize.js +294 -0
- package/src/flow/runtime-src/flow_runtime.cpp +1699 -0
- package/src/flow/vendor/sdn-flow/MethodRegistry.js +400 -0
- package/src/flow/vendor/sdn-flow/constants.js +39 -0
- package/src/flow/vendor/sdn-flow/index.js +29 -0
- package/src/flow/vendor/sdn-flow/normalize.js +506 -0
- package/src/flow/vendor/sdn-flow/wasmCompatibility.js +189 -0
- package/src/generated/http/cpp/HttpRequestAbi_generated.h +285 -0
- package/src/generated/http/cpp/HttpResponseAbi_generated.h +192 -0
- package/src/generated/http/sdn/http/http-header.js +53 -0
- package/src/generated/http/sdn/http/http-header.ts +67 -0
- package/src/generated/http/sdn/http/http-request.js +132 -0
- package/src/generated/http/sdn/http/http-request.ts +179 -0
- package/src/generated/http/sdn/http/http-response.js +144 -0
- package/src/generated/http/sdn/http/http-response.ts +168 -0
- package/src/generated/http/sdn/http.js +11 -0
- package/src/generated/http/sdn/http.ts +4 -0
- package/src/generated/orbpro/flow/backpressure-policy.d.ts +12 -0
- package/src/generated/orbpro/flow/backpressure-policy.d.ts.map +1 -0
- package/src/generated/orbpro/flow/backpressure-policy.js +17 -0
- package/src/generated/orbpro/flow/backpressure-policy.js.map +1 -0
- package/src/generated/orbpro/flow/backpressure-policy.ts +15 -0
- package/src/generated/orbpro/flow/flow-bundle-manifest.d.ts +142 -0
- package/src/generated/orbpro/flow/flow-bundle-manifest.d.ts.map +1 -0
- package/src/generated/orbpro/flow/flow-bundle-manifest.js +304 -0
- package/src/generated/orbpro/flow/flow-bundle-manifest.js.map +1 -0
- package/src/generated/orbpro/flow/flow-bundle-manifest.ts +399 -0
- package/src/generated/orbpro/flow/flow-edge.d.ts +113 -0
- package/src/generated/orbpro/flow/flow-edge.d.ts.map +1 -0
- package/src/generated/orbpro/flow/flow-edge.js +221 -0
- package/src/generated/orbpro/flow/flow-edge.js.map +1 -0
- package/src/generated/orbpro/flow/flow-edge.ts +292 -0
- package/src/generated/orbpro/flow/flow-node.d.ts +80 -0
- package/src/generated/orbpro/flow/flow-node.d.ts.map +1 -0
- package/src/generated/orbpro/flow/flow-node.js +158 -0
- package/src/generated/orbpro/flow/flow-node.js.map +1 -0
- package/src/generated/orbpro/flow/flow-node.ts +202 -0
- package/src/generated/orbpro/flow/flow-program.d.ts +164 -0
- package/src/generated/orbpro/flow/flow-program.d.ts.map +1 -0
- package/src/generated/orbpro/flow/flow-program.js +350 -0
- package/src/generated/orbpro/flow/flow-program.js.map +1 -0
- package/src/generated/orbpro/flow/flow-program.ts +477 -0
- package/src/generated/orbpro/flow/flow-trigger.d.ts +108 -0
- package/src/generated/orbpro/flow/flow-trigger.d.ts.map +1 -0
- package/src/generated/orbpro/flow/flow-trigger.js +207 -0
- package/src/generated/orbpro/flow/flow-trigger.js.map +1 -0
- package/src/generated/orbpro/flow/flow-trigger.ts +276 -0
- package/src/generated/orbpro/flow/node-kind.d.ts +13 -0
- package/src/generated/orbpro/flow/node-kind.d.ts.map +1 -0
- package/src/generated/orbpro/flow/node-kind.js +16 -0
- package/src/generated/orbpro/flow/node-kind.js.map +1 -0
- package/src/generated/orbpro/{invoke.ts → flow/node-kind.ts} +12 -2
- package/src/generated/orbpro/flow/plugin-version-binding.d.ts +52 -0
- package/src/generated/orbpro/flow/plugin-version-binding.d.ts.map +1 -0
- package/src/generated/orbpro/flow/plugin-version-binding.js +85 -0
- package/src/generated/orbpro/flow/plugin-version-binding.js.map +1 -0
- package/src/generated/orbpro/flow/plugin-version-binding.ts +121 -0
- package/src/generated/orbpro/flow/schema-hash-binding.d.ts +70 -0
- package/src/generated/orbpro/flow/schema-hash-binding.d.ts.map +1 -0
- package/src/generated/orbpro/flow/schema-hash-binding.js +143 -0
- package/src/generated/orbpro/flow/schema-hash-binding.js.map +1 -0
- package/src/generated/orbpro/flow/schema-hash-binding.ts +189 -0
- package/src/generated/orbpro/flow/trigger-binding.d.ts +71 -0
- package/src/generated/orbpro/flow/trigger-binding.d.ts.map +1 -0
- package/src/generated/orbpro/flow/trigger-binding.js +142 -0
- package/src/generated/orbpro/flow/trigger-binding.js.map +1 -0
- package/src/generated/orbpro/flow/trigger-binding.ts +181 -0
- package/src/generated/orbpro/flow/trigger-kind.d.ts +14 -0
- package/src/generated/orbpro/flow/trigger-kind.d.ts.map +1 -0
- package/src/generated/orbpro/flow/trigger-kind.js +17 -0
- package/src/generated/orbpro/flow/trigger-kind.js.map +1 -0
- package/src/generated/orbpro/flow/trigger-kind.ts +17 -0
- package/src/generated/orbpro/flow.d.ts +21 -0
- package/src/generated/orbpro/flow.d.ts.map +1 -0
- package/src/generated/orbpro/flow.js +23 -0
- package/src/generated/orbpro/flow.js.map +1 -0
- package/src/generated/orbpro/flow.ts +24 -0
- package/src/generated/orbpro/manifest/capability-kind.d.ts +2 -1
- package/src/generated/orbpro/manifest/capability-kind.js +1 -0
- package/src/generated/orbpro/manifest/capability-kind.ts +1 -0
- package/src/generated/orbpro/plugin/stream-invoke-request.d.ts +93 -0
- package/src/generated/orbpro/plugin/stream-invoke-request.js +160 -0
- package/src/generated/orbpro/plugin/stream-invoke-request.ts +211 -0
- package/src/generated/orbpro/plugin/stream-invoke-response.d.ts +99 -0
- package/src/generated/orbpro/plugin/stream-invoke-response.js +175 -0
- package/src/generated/orbpro/plugin/stream-invoke-response.ts +226 -0
- package/src/generated/orbpro/plugin.js +8 -0
- package/src/generated/orbpro/stream.d.ts +12 -0
- package/src/generated/orbpro/stream.js +14 -0
- package/src/generated/orbpro/stream.ts +15 -0
- package/src/generated/spacedatastandards/plg/EntryFunction.d.ts +52 -0
- package/src/generated/spacedatastandards/plg/EntryFunction.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/EntryFunction.js +106 -0
- package/src/generated/spacedatastandards/plg/EntryFunction.ts +162 -0
- package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.d.ts +90 -0
- package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.js +189 -0
- package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.ts +270 -0
- package/src/generated/spacedatastandards/plg/PLG.d.ts +492 -0
- package/src/generated/spacedatastandards/plg/PLG.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLG.js +1139 -0
- package/src/generated/spacedatastandards/plg/PLG.ts +1600 -0
- package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.d.ts +63 -0
- package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.js +138 -0
- package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.ts +189 -0
- package/src/generated/spacedatastandards/plg/PLGBuildArtifact.d.ts +41 -0
- package/src/generated/spacedatastandards/plg/PLGBuildArtifact.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGBuildArtifact.js +104 -0
- package/src/generated/spacedatastandards/plg/PLGBuildArtifact.ts +151 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdge.d.ts +68 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdge.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdge.js +124 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdge.ts +184 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.d.ts +58 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.js +126 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.ts +161 -0
- package/src/generated/spacedatastandards/plg/PLGFlowNode.d.ts +82 -0
- package/src/generated/spacedatastandards/plg/PLGFlowNode.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGFlowNode.js +164 -0
- package/src/generated/spacedatastandards/plg/PLGFlowNode.ts +244 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTrigger.d.ts +55 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTrigger.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTrigger.js +105 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTrigger.ts +162 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.d.ts +42 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.js +83 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.ts +127 -0
- package/src/generated/spacedatastandards/plg/PLGHostCapability.d.ts +36 -0
- package/src/generated/spacedatastandards/plg/PLGHostCapability.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGHostCapability.js +90 -0
- package/src/generated/spacedatastandards/plg/PLGHostCapability.ts +127 -0
- package/src/generated/spacedatastandards/plg/PLGMethodManifest.d.ts +53 -0
- package/src/generated/spacedatastandards/plg/PLGMethodManifest.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGMethodManifest.js +153 -0
- package/src/generated/spacedatastandards/plg/PLGMethodManifest.ts +210 -0
- package/src/generated/spacedatastandards/plg/PLGPortManifest.d.ts +70 -0
- package/src/generated/spacedatastandards/plg/PLGPortManifest.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGPortManifest.js +149 -0
- package/src/generated/spacedatastandards/plg/PLGPortManifest.ts +212 -0
- package/src/generated/spacedatastandards/plg/PLGProtocolSpec.d.ts +73 -0
- package/src/generated/spacedatastandards/plg/PLGProtocolSpec.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGProtocolSpec.js +199 -0
- package/src/generated/spacedatastandards/plg/PLGProtocolSpec.ts +292 -0
- package/src/generated/spacedatastandards/plg/PLGTimerSpec.d.ts +40 -0
- package/src/generated/spacedatastandards/plg/PLGTimerSpec.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGTimerSpec.js +103 -0
- package/src/generated/spacedatastandards/plg/PLGTimerSpec.ts +148 -0
- package/src/generated/spacedatastandards/plg/PluginCapability.d.ts +41 -0
- package/src/generated/spacedatastandards/plg/PluginCapability.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PluginCapability.js +82 -0
- package/src/generated/spacedatastandards/plg/{plugin-capability.ts → PluginCapability.ts} +55 -18
- package/src/generated/spacedatastandards/plg/PluginDependency.d.ts +42 -0
- package/src/generated/spacedatastandards/plg/PluginDependency.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PluginDependency.js +80 -0
- package/src/generated/spacedatastandards/plg/PluginDependency.ts +124 -0
- package/src/generated/spacedatastandards/plg/TAB.d.ts +85 -0
- package/src/generated/spacedatastandards/plg/TAB.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/TAB.js +173 -0
- package/src/generated/spacedatastandards/plg/TAB.ts +228 -0
- package/src/generated/spacedatastandards/plg/bufferMutability.d.ts +18 -0
- package/src/generated/spacedatastandards/plg/bufferMutability.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/bufferMutability.js +20 -0
- package/src/generated/spacedatastandards/plg/bufferMutability.ts +23 -0
- package/src/generated/spacedatastandards/plg/bufferOwnership.d.ts +18 -0
- package/src/generated/spacedatastandards/plg/bufferOwnership.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/bufferOwnership.js +20 -0
- package/src/generated/spacedatastandards/plg/bufferOwnership.ts +23 -0
- package/src/generated/spacedatastandards/plg/drainBehavior.d.ts +20 -0
- package/src/generated/spacedatastandards/plg/drainBehavior.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/drainBehavior.js +22 -0
- package/src/generated/spacedatastandards/plg/drainBehavior.ts +25 -0
- package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.d.ts +10 -0
- package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.js +12 -0
- package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.ts +13 -0
- package/src/generated/spacedatastandards/plg/hostCapabilityKind.d.ts +51 -0
- package/src/generated/spacedatastandards/plg/hostCapabilityKind.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/hostCapabilityKind.js +53 -0
- package/src/generated/spacedatastandards/plg/hostCapabilityKind.ts +55 -0
- package/src/generated/spacedatastandards/plg/invokeSurfaceKind.d.ts +15 -0
- package/src/generated/spacedatastandards/plg/invokeSurfaceKind.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/invokeSurfaceKind.js +17 -0
- package/src/generated/spacedatastandards/plg/invokeSurfaceKind.ts +19 -0
- package/src/generated/spacedatastandards/plg/main.d.ts +29 -0
- package/src/generated/spacedatastandards/plg/main.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/main.js +30 -0
- package/src/generated/spacedatastandards/plg/main.ts +32 -0
- package/src/generated/spacedatastandards/plg/payloadWireFormat.d.ts +17 -0
- package/src/generated/spacedatastandards/plg/payloadWireFormat.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/payloadWireFormat.js +19 -0
- package/src/generated/spacedatastandards/plg/payloadWireFormat.ts +21 -0
- package/src/generated/spacedatastandards/plg/pluginCategory.d.ts +82 -0
- package/src/generated/spacedatastandards/plg/pluginCategory.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/pluginCategory.js +84 -0
- package/src/generated/spacedatastandards/plg/pluginCategory.ts +103 -0
- package/src/generated/spacedatastandards/plg/publicationState.d.ts +18 -0
- package/src/generated/spacedatastandards/plg/publicationState.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/publicationState.js +20 -0
- package/src/generated/spacedatastandards/plg/purchaseTier.d.ts +18 -0
- package/src/generated/spacedatastandards/plg/purchaseTier.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/purchaseTier.js +20 -0
- package/src/host/AGENTS.md +2 -2
- package/src/host/abi.js +53 -66
- package/src/host/browserHost.js +355 -8
- package/src/host/cpp/keyslotClient.hpp +231 -0
- package/src/host/cpp/secretsClient.hpp +583 -0
- package/src/host/hostcallWire.js +183 -0
- package/src/host/index.js +2 -0
- package/src/host/isomorphicLoader.js +44 -7
- package/src/host/nodeHost.js +227 -8
- package/src/host/sabHostcallChannel.js +206 -0
- package/src/host/timerDriver.js +203 -0
- package/src/host/wasiShim.js +41 -1
- package/src/host/wasiThreadBrowserWorker.mjs +48 -0
- package/src/host/wasiThreadHost.js +393 -0
- package/src/host/wasiThreadWorker.mjs +32 -0
- package/src/host/wasiThreadWorkerRuntime.js +93 -0
- package/src/http/index.js +339 -0
- package/src/index.d.ts +716 -10
- package/src/index.js +4 -0
- package/src/invoke/codec.js +1202 -128
- package/src/invoke/index.js +5 -1
- package/src/licensing/index.d.ts +2 -0
- package/src/licensing/index.js +2 -0
- package/src/licensing/records.js +287 -8
- package/src/manifest/codec.js +62 -14
- package/src/manifest/index.js +2 -0
- package/src/manifest/legacyToPlg.js +164 -25
- package/src/manifest/normalize.js +1 -0
- package/src/manifest/plgCodec.js +1303 -62
- package/src/manifest/typeRefs.js +162 -24
- package/src/runtime/compiledRuntimeAbi.js +47 -0
- package/src/runtime/compiledRuntimeAbi.json +33 -0
- package/src/runtime/index.d.ts +32 -0
- package/src/runtime/index.js +1 -0
- package/src/runtime-host/index.js +3 -0
- package/src/runtime-host/methodRegistry.js +55 -0
- package/src/standards/index.js +200 -56
- package/src/standards/sharedCatalog.js +16 -0
- package/src/testing/browserModuleHarness.js +604 -31
- package/src/testing/docker/wasmedge-parity.Dockerfile +39 -0
- package/src/testing/index.d.ts +151 -0
- package/src/testing/index.js +21 -0
- package/src/testing/native/wasmedge_emscripten_pthread_runner.c +25 -1
- package/src/testing/parityBrowserRunner.js +138 -0
- package/src/testing/parityHarness.js +616 -0
- package/src/testing/parityLanes.js +537 -0
- package/src/testing/processInvoke.js +29 -21
- package/src/testing/streamInvokeCodec.js +10 -175
- package/src/testing/wasmedgePin.json +6 -0
- package/src/testing/workerModuleHarness.js +242 -0
- package/src/testing/workerModuleHarnessWorker.js +176 -0
- package/src/transport/index.js +3 -0
- package/src/transport/pki.js +299 -11
- package/src/transport/records.js +16 -7
- package/src/utils/ecdsaDer.js +106 -0
- package/src/utils/wasmCrypto.js +0 -43
- package/templates/gpu-module/README.md +48 -0
- package/templates/gpu-module/include/space_data_gpu_abi.h +122 -0
- package/templates/gpu-module/manifest.json +84 -0
- package/schemas/PluginInvokeRequest.fbs +0 -18
- package/schemas/PluginInvokeResponse.fbs +0 -30
- package/schemas/spacedatastandards/PLG.fbs +0 -191
- package/src/generated/orbpro/invoke/plugin-invoke-request.d.ts +0 -51
- package/src/generated/orbpro/invoke/plugin-invoke-request.d.ts.map +0 -1
- package/src/generated/orbpro/invoke/plugin-invoke-request.js +0 -131
- package/src/generated/orbpro/invoke/plugin-invoke-request.js.map +0 -1
- package/src/generated/orbpro/invoke/plugin-invoke-request.ts +0 -173
- package/src/generated/orbpro/invoke/plugin-invoke-response.d.ts +0 -76
- package/src/generated/orbpro/invoke/plugin-invoke-response.d.ts.map +0 -1
- package/src/generated/orbpro/invoke/plugin-invoke-response.js +0 -184
- package/src/generated/orbpro/invoke/plugin-invoke-response.js.map +0 -1
- package/src/generated/orbpro/invoke/plugin-invoke-response.ts +0 -243
- package/src/generated/orbpro/invoke.d.ts +0 -3
- package/src/generated/orbpro/invoke.js +0 -5
- package/src/generated/spacedatastandards/plg/entry-function.js +0 -86
- package/src/generated/spacedatastandards/plg/entry-function.ts +0 -119
- package/src/generated/spacedatastandards/plg/index.js +0 -16
- package/src/generated/spacedatastandards/plg/index.ts +0 -11
- package/src/generated/spacedatastandards/plg/plg.js +0 -657
- package/src/generated/spacedatastandards/plg/plg.ts +0 -924
- package/src/generated/spacedatastandards/plg/plugin-capability.js +0 -66
- package/src/generated/spacedatastandards/plg/plugin-category.js +0 -15
- package/src/generated/spacedatastandards/plg/plugin-category.ts +0 -53
- package/src/generated/spacedatastandards/plg/plugin-dependency.js +0 -63
- package/src/generated/spacedatastandards/plg/plugin-dependency.ts +0 -86
- package/src/generated/spacedatastandards/plg/publication-state.js +0 -9
- package/src/generated/spacedatastandards/plg/purchase-tier.js +0 -9
- /package/src/generated/spacedatastandards/plg/{publication-state.ts → publicationState.ts} +0 -0
- /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`) |
|
package/docs/styles.css
ADDED
|
@@ -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
|
+
}
|