fleetmesh-node 0.2.0__py3-none-any.whl
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.
- fleetmesh_node-0.2.0.dist-info/METADATA +57 -0
- fleetmesh_node-0.2.0.dist-info/RECORD +338 -0
- fleetmesh_node-0.2.0.dist-info/WHEEL +5 -0
- fleetmesh_node-0.2.0.dist-info/entry_points.txt +2 -0
- fleetmesh_node-0.2.0.dist-info/licenses/LICENSE +121 -0
- fleetmesh_node-0.2.0.dist-info/top_level.txt +2 -0
- node/RELEASE +1 -0
- node/__init__.py +35 -0
- node/app/__init__.py +49 -0
- node/app/commands.py +265 -0
- node/app/config.py +131 -0
- node/app/control.py +670 -0
- node/app/core.py +867 -0
- node/app/plugins.py +76 -0
- node/app/router.py +83 -0
- node/app/socket.py +431 -0
- node/app/systemd.py +36 -0
- node/app/views.py +204 -0
- node/channels/__init__.py +378 -0
- node/channels/bus.py +331 -0
- node/channels/journal.py +46 -0
- node/commands/__init__.py +140 -0
- node/commands/adapter.py +210 -0
- node/commands/base.py +278 -0
- node/commands/cluster_cmds.py +183 -0
- node/commands/compute_cmds.py +401 -0
- node/commands/core.py +474 -0
- node/commands/gossip_cmds.py +106 -0
- node/commands/nsite_cmds.py +141 -0
- node/commands/peering.py +402 -0
- node/commands/plugin_cmds.py +135 -0
- node/commands/sidecar_cmds.py +120 -0
- node/commands/sync.py +388 -0
- node/commands/transport_cmds.py +451 -0
- node/commands/video_cmds.py +99 -0
- node/compartment/__init__.py +124 -0
- node/compartment/base.py +868 -0
- node/compartment/command.py +458 -0
- node/compartment/context.py +163 -0
- node/compartment/every.py +108 -0
- node/compartment/handler.py +131 -0
- node/compartment/lifecycle.py +460 -0
- node/compartment/lint.py +388 -0
- node/compartment/need.py +158 -0
- node/compartment/problem.py +521 -0
- node/compartment/refusals.py +120 -0
- node/compartment/registry.py +790 -0
- node/compartment/schema.py +290 -0
- node/compartment/sidecar.py +499 -0
- node/compartment/stores.py +662 -0
- node/compartment/wire.py +225 -0
- node/compartment/worker.py +61 -0
- node/config/__init__.py +43 -0
- node/config/base.py +116 -0
- node/config/change.py +441 -0
- node/config/changestore.py +201 -0
- node/config/compartments.py +1144 -0
- node/config/node.py +318 -0
- node/config/parameter.py +563 -0
- node/config/protocols.py +274 -0
- node/config/records.py +171 -0
- node/examples/__init__.py +1 -0
- node/examples/demo.py +226 -0
- node/examples/follower.py +46 -0
- node/interfaces.py +235 -0
- node/keystore/__init__.py +27 -0
- node/keystore/core.py +103 -0
- node/keystore/enclave.py +688 -0
- node/meshnode.py +111 -0
- node/metrics/__init__.py +396 -0
- node/metrics/adapters.py +102 -0
- node/metrics/face.py +110 -0
- node/planes/__init__.py +21 -0
- node/planes/identity/__init__.py +20 -0
- node/planes/identity/announce/__init__.py +9 -0
- node/planes/identity/announce/compartment.py +447 -0
- node/planes/identity/announce/types.py +26 -0
- node/planes/identity/discovery/__init__.py +9 -0
- node/planes/identity/discovery/compartment.py +522 -0
- node/planes/identity/discovery/types.py +13 -0
- node/planes/identity/linked/__init__.py +1 -0
- node/planes/identity/linked/compartment.py +270 -0
- node/planes/identity/linked/types.py +25 -0
- node/planes/identity/presence/__init__.py +7 -0
- node/planes/identity/presence/compartment.py +409 -0
- node/planes/identity/presence/types.py +14 -0
- node/planes/operations/__init__.py +13 -0
- node/planes/operations/scheduler/__init__.py +9 -0
- node/planes/operations/scheduler/compartment.py +353 -0
- node/planes/operations/scheduler/types.py +21 -0
- node/planes/operations/updates/__init__.py +17 -0
- node/planes/operations/updates/core.py +310 -0
- node/planes/operations/updates/store.py +79 -0
- node/planes/operations/updates/types.py +20 -0
- node/planes/peering/__init__.py +28 -0
- node/planes/peering/budget/__init__.py +43 -0
- node/planes/peering/budget/chain.py +43 -0
- node/planes/peering/budget/core.py +537 -0
- node/planes/peering/budget/evaluation.py +80 -0
- node/planes/peering/budget/meter.py +100 -0
- node/planes/peering/budget/receipts.py +439 -0
- node/planes/peering/budget/shape.py +101 -0
- node/planes/peering/budget/tick.py +110 -0
- node/planes/peering/budget/types.py +67 -0
- node/planes/peering/budget/windows.py +346 -0
- node/planes/peering/capacity/__init__.py +7 -0
- node/planes/peering/capacity/compartment.py +342 -0
- node/planes/peering/capacity/types.py +24 -0
- node/planes/peering/peering/__init__.py +25 -0
- node/planes/peering/peering/core.py +464 -0
- node/planes/peering/peering/envelope.py +142 -0
- node/planes/peering/peering/handshake.py +198 -0
- node/planes/peering/peering/shape.py +80 -0
- node/planes/peering/peering/types.py +39 -0
- node/planes/peering/reporter/__init__.py +42 -0
- node/planes/peering/reporter/constants.py +29 -0
- node/planes/peering/reporter/core.py +299 -0
- node/planes/peering/reporter/finding.py +74 -0
- node/planes/peering/reporter/findings.py +171 -0
- node/planes/peering/reporter/publish.py +285 -0
- node/planes/peering/reporter/reading.py +193 -0
- node/planes/peering/reporter/shape.py +86 -0
- node/planes/peering/reporter/types.py +50 -0
- node/planes/peering/strain/__init__.py +9 -0
- node/planes/peering/strain/compartment.py +204 -0
- node/planes/peering/strain/types.py +21 -0
- node/planes/peering/trust/__init__.py +9 -0
- node/planes/peering/trust/compartment.py +239 -0
- node/planes/peering/trust/types.py +30 -0
- node/planes/services/__init__.py +33 -0
- node/planes/services/compute/__init__.py +160 -0
- node/planes/services/compute/common.py +134 -0
- node/planes/services/compute/compartment.py +681 -0
- node/planes/services/compute/executors/__init__.py +121 -0
- node/planes/services/compute/executors/agent.py +840 -0
- node/planes/services/compute/executors/bacalhau.py +605 -0
- node/planes/services/compute/executors/base.py +127 -0
- node/planes/services/compute/executors/harness.py +439 -0
- node/planes/services/compute/executors/mcp.py +454 -0
- node/planes/services/compute/executors/media.py +898 -0
- node/planes/services/compute/executors/nondet.py +283 -0
- node/planes/services/compute/executors/providers.py +499 -0
- node/planes/services/compute/executors/registry.py +140 -0
- node/planes/services/compute/executors/wasm.py +244 -0
- node/planes/services/compute/executors/zk.py +604 -0
- node/planes/services/compute/jobs.py +227 -0
- node/planes/services/compute/load.py +180 -0
- node/planes/services/compute/market.py +433 -0
- node/planes/services/compute/sandbox.py +282 -0
- node/planes/services/compute/types.py +84 -0
- node/planes/services/compute_wire/__init__.py +58 -0
- node/planes/services/compute_wire/compartment.py +256 -0
- node/planes/services/compute_wire/messages.py +320 -0
- node/planes/services/compute_wire/sealing.py +147 -0
- node/planes/services/compute_wire/session.py +572 -0
- node/planes/services/compute_wire/types.py +49 -0
- node/planes/services/compute_wire/verify.py +331 -0
- node/planes/services/dvm/__init__.py +24 -0
- node/planes/services/dvm/gateway.py +526 -0
- node/planes/services/dvm/protocol.py +35 -0
- node/planes/services/dvm/translate.py +15 -0
- node/planes/services/dvm/types.py +25 -0
- node/planes/services/gateway/__init__.py +40 -0
- node/planes/services/gateway/settle.py +279 -0
- node/planes/services/gateway/translate.py +644 -0
- node/planes/services/gossip/__init__.py +22 -0
- node/planes/services/gossip/core.py +929 -0
- node/planes/services/gossip/envelope.py +154 -0
- node/planes/services/gossip/mesh.py +127 -0
- node/planes/services/gossip/types.py +50 -0
- node/planes/services/nsite/__init__.py +7 -0
- node/planes/services/nsite/client.py +62 -0
- node/planes/services/nsite/compartment.py +752 -0
- node/planes/services/nsite/types.py +44 -0
- node/planes/services/paidfetch/__init__.py +7 -0
- node/planes/services/paidfetch/compartment.py +862 -0
- node/planes/services/paidfetch/types.py +99 -0
- node/planes/services/settle/__init__.py +27 -0
- node/planes/services/settle/compartment.py +384 -0
- node/planes/services/settle/engine.py +456 -0
- node/planes/services/settle/gateways.py +541 -0
- node/planes/services/settle/payment.py +512 -0
- node/planes/services/settle/store.py +74 -0
- node/planes/services/settle/types.py +58 -0
- node/planes/services/sidecars/__init__.py +8 -0
- node/planes/services/sidecars/compartment.py +461 -0
- node/planes/services/sidecars/manifest.py +304 -0
- node/planes/services/sidecars/manifests/10-grasp.json +37 -0
- node/planes/services/sidecars/manifests/20-ncontainer.json +31 -0
- node/planes/services/sidecars/manifests/30-magpie.json +28 -0
- node/planes/services/sidecars/types.py +43 -0
- node/planes/services/video/__init__.py +106 -0
- node/planes/services/video/barter.py +407 -0
- node/planes/services/video/cli.py +158 -0
- node/planes/services/video/compartment.py +932 -0
- node/planes/services/video/ingest.py +524 -0
- node/planes/services/video/ledger.py +705 -0
- node/planes/services/video/packager.py +847 -0
- node/planes/services/video/player.py +456 -0
- node/planes/services/video/timed_segments.py +124 -0
- node/planes/services/video/transit.py +478 -0
- node/planes/store/__init__.py +24 -0
- node/planes/store/blob_replication/__init__.py +7 -0
- node/planes/store/blob_replication/compartment.py +496 -0
- node/planes/store/blob_replication/types.py +35 -0
- node/planes/store/blob_wire/__init__.py +48 -0
- node/planes/store/blob_wire/client.py +57 -0
- node/planes/store/blob_wire/core.py +359 -0
- node/planes/store/blob_wire/intake.py +74 -0
- node/planes/store/blob_wire/messages.py +85 -0
- node/planes/store/projected/__init__.py +7 -0
- node/planes/store/projected/compartment.py +258 -0
- node/planes/store/projected/types.py +29 -0
- node/planes/store/retention/__init__.py +7 -0
- node/planes/store/retention/compartment.py +214 -0
- node/planes/store/retention/types.py +12 -0
- node/planes/store/sync/__init__.py +35 -0
- node/planes/store/sync/core.py +311 -0
- node/planes/store/sync/envelope.py +106 -0
- node/planes/store/sync/handover.py +206 -0
- node/planes/store/sync/initiator.py +128 -0
- node/planes/store/sync/responder.py +114 -0
- node/planes/store/sync/rules.py +179 -0
- node/planes/store/sync/shape.py +80 -0
- node/planes/store/sync/types.py +51 -0
- node/planes/transport/__init__.py +23 -0
- node/planes/transport/bridge/__init__.py +13 -0
- node/planes/transport/bridge/compartment.py +785 -0
- node/planes/transport/bridge/ratelimit.py +44 -0
- node/planes/transport/bridge/types.py +43 -0
- node/planes/transport/lan/__init__.py +9 -0
- node/planes/transport/lan/compartment.py +446 -0
- node/planes/transport/lan/types.py +25 -0
- node/planes/transport/link/__init__.py +7 -0
- node/planes/transport/link/compartment.py +257 -0
- node/planes/transport/link/types.py +27 -0
- node/planes/transport/mediation/__init__.py +45 -0
- node/planes/transport/mediation/compartment.py +238 -0
- node/planes/transport/mediation/leaf.py +107 -0
- node/planes/transport/mediation/messages.py +302 -0
- node/planes/transport/mediation/service.py +233 -0
- node/planes/transport/mediation/store.py +37 -0
- node/planes/transport/mediation/types.py +20 -0
- node/planes/transport/p2p/__init__.py +7 -0
- node/planes/transport/p2p/compartment.py +349 -0
- node/planes/transport/p2p/types.py +22 -0
- node/protocols/__init__.py +277 -0
- node/protocols/activitypub/__init__.py +56 -0
- node/protocols/activitypub/actor.py +230 -0
- node/protocols/activitypub/federation.py +490 -0
- node/protocols/activitypub/media.py +145 -0
- node/protocols/activitypub/models.py +286 -0
- node/protocols/activitypub/package.py +271 -0
- node/protocols/activitypub/store.py +564 -0
- node/protocols/arcade/__init__.py +26 -0
- node/protocols/atproto/__init__.py +13 -0
- node/protocols/atproto/firehose.py +126 -0
- node/protocols/atproto/metering.py +165 -0
- node/protocols/atproto/package.py +155 -0
- node/protocols/atproto/repo.py +250 -0
- node/protocols/atproto/xrpc.py +285 -0
- node/protocols/base.py +109 -0
- node/protocols/circles/__init__.py +29 -0
- node/protocols/dm/__init__.py +50 -0
- node/protocols/grasp/__init__.py +22 -0
- node/protocols/isotime.py +15 -0
- node/protocols/nostr/__init__.py +51 -0
- node/protocols/nostr/blobstore.py +383 -0
- node/protocols/nostr/blossom.py +627 -0
- node/protocols/nostr/client.py +377 -0
- node/protocols/nostr/descriptor.py +211 -0
- node/protocols/nostr/eventstore.py +304 -0
- node/protocols/nostr/package.py +182 -0
- node/protocols/nostr/peers.py +109 -0
- node/protocols/nostr/relayserver.py +656 -0
- node/protocols/p2panda/__init__.py +22 -0
- node/protocols/p2panda/identity.py +19 -0
- node/protocols/p2panda/package.py +236 -0
- node/protocols/p2panda/rung.py +152 -0
- node/protocols/p2panda/store.py +273 -0
- node/protocols/rhio/__init__.py +33 -0
- node/protocols/rhio/package.py +275 -0
- node/protocols/rhio/rung.py +136 -0
- node/protocols/rhio/store.py +1423 -0
- node/protocols/ssb/muxrpc.py +256 -0
- node/protocols/ssb/package.py +267 -0
- node/protocols/textile/__init__.py +111 -0
- node/protocols/textile/transducers.py +259 -0
- node/release.py +119 -0
- node/storage/__init__.py +88 -0
- node/storage/accounts.py +305 -0
- node/storage/adapter.py +161 -0
- node/storage/base.py +385 -0
- node/storage/dialect.py +209 -0
- node/storage/grants.py +317 -0
- node/storage/locator.py +150 -0
- node/storage/postgres.py +294 -0
- node/storage/projected.py +953 -0
- node/storage/sharding.py +448 -0
- node/storage/standing.py +568 -0
- node/testnet/__init__.py +9 -0
- node/testnet/cluster.py +731 -0
- node/testnet/fips_daemon.py +230 -0
- node/transport/__init__.py +94 -0
- node/transport/const.py +110 -0
- node/transport/didcomm_inbound.py +251 -0
- node/transport/dnstxt.py +169 -0
- node/transport/fips_rung/__init__.py +67 -0
- node/transport/fips_rung/core.py +666 -0
- node/transport/fips_rung/listener.py +96 -0
- node/transport/fips_rung/types.py +12 -0
- node/transport/host.py +334 -0
- node/transport/iroh_rung/__init__.py +29 -0
- node/transport/iroh_rung/core.py +477 -0
- node/transport/iroh_rung/quic.py +942 -0
- node/transport/iroh_rung/types.py +22 -0
- node/transport/ladder.py +145 -0
- node/transport/lineproto.py +49 -0
- node/transport/mdns.py +303 -0
- node/transport/netfetch.py +283 -0
- node/transport/relay_rung/__init__.py +23 -0
- node/transport/relay_rung/cooldown.py +87 -0
- node/transport/relay_rung/core.py +138 -0
- node/transport/relay_rung/inbound.py +161 -0
- node/transport/relay_rung/ledger.py +104 -0
- node/transport/relay_rung/listen.py +121 -0
- node/transport/relay_rung/outbound.py +181 -0
- node/transport/relay_rung/shape.py +71 -0
- node/transport/relay_rung/types.py +58 -0
- node/transport/relay_rung/wire.py +63 -0
- node/transport/router.py +761 -0
- node/transport/rung.py +276 -0
- node/transport/ssb_rung.py +166 -0
- node/transport/ws.py +502 -0
- sidecar/fleetmesh_announce.py +338 -0
- sidecar/fleetmesh_p2p.py +373 -0
- sidecar/fleetmesh_rhio.py +352 -0
- sidecar/fleetmesh_ssb.py +603 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"""compute/1.0: Compute offers, confidential asks, and bilateral job receipts.
|
|
2
|
+
|
|
3
|
+
Implements the compute market protocol on the wire:
|
|
4
|
+
- Kind 11803: Replaceable Compute Offer published by selling nodes.
|
|
5
|
+
- Kind 30810: Addressable Compute Ask carrying blind SHA-256 commitments without
|
|
6
|
+
leaking module or input plaintexts.
|
|
7
|
+
- Kind 30811: Addressable Compute Job Receipt carrying NIP-44 encrypted bilateral
|
|
8
|
+
settlement claims under a blinded job identifier.
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from .common import (
|
|
13
|
+
ComputeError,
|
|
14
|
+
OFFER_KIND,
|
|
15
|
+
ASK_KIND,
|
|
16
|
+
RECEIPT_KIND,
|
|
17
|
+
WASI_PROFILE,
|
|
18
|
+
DEFAULT_EXPIRATION,
|
|
19
|
+
MAX_BLOB_FETCH_BYTES,
|
|
20
|
+
LLM_MAX_RESPONSE_BYTES,
|
|
21
|
+
resolve_blob,
|
|
22
|
+
)
|
|
23
|
+
from .market import (
|
|
24
|
+
build_offer,
|
|
25
|
+
validate_offer,
|
|
26
|
+
build_ask,
|
|
27
|
+
verify_ask,
|
|
28
|
+
parse_offer,
|
|
29
|
+
parse_ask,
|
|
30
|
+
match_ask_to_offers,
|
|
31
|
+
match_offer_to_asks,
|
|
32
|
+
)
|
|
33
|
+
from .sandbox import (
|
|
34
|
+
ComputeLimits,
|
|
35
|
+
NODE_MAX_TIMEOUT_S,
|
|
36
|
+
NODE_MAX_MEMORY_BYTES,
|
|
37
|
+
clamp_limits,
|
|
38
|
+
sandbox_limits,
|
|
39
|
+
_sandbox_available,
|
|
40
|
+
run_sandboxed,
|
|
41
|
+
)
|
|
42
|
+
from .executors import (
|
|
43
|
+
ComputeQuote,
|
|
44
|
+
ComputeExecutionResult,
|
|
45
|
+
ExecutorProtocol,
|
|
46
|
+
ComputeExecutor,
|
|
47
|
+
WASM_DEFAULT_MEMORY_BYTES,
|
|
48
|
+
WASM_MAX_OUTPUT_BYTES,
|
|
49
|
+
WASM_VIRTUAL_EPOCH_NS,
|
|
50
|
+
wasmtime_available,
|
|
51
|
+
_wasm_engine,
|
|
52
|
+
run_wasi_module,
|
|
53
|
+
WasmExecutor,
|
|
54
|
+
ZkGroth16Executor,
|
|
55
|
+
ZkVmExecutor,
|
|
56
|
+
ZkVmReceiptResult,
|
|
57
|
+
ZkVmVerifierProtocol,
|
|
58
|
+
ZkVmReceiptVerifier,
|
|
59
|
+
MockZkVmVerifier,
|
|
60
|
+
ZkProverResult,
|
|
61
|
+
ZkProverProtocol,
|
|
62
|
+
MockZkProverClient,
|
|
63
|
+
ZkProverExecutor,
|
|
64
|
+
LlmExecutor,
|
|
65
|
+
BacalhauExecutor,
|
|
66
|
+
AgentExecutor,
|
|
67
|
+
PROVIDER_PRESETS,
|
|
68
|
+
ProviderPreset,
|
|
69
|
+
LinkedProviderConfig,
|
|
70
|
+
OperatorProviderRouter,
|
|
71
|
+
AgentExecutionContext,
|
|
72
|
+
AgentToolProtocol,
|
|
73
|
+
AgentToolResult,
|
|
74
|
+
AgentDecision,
|
|
75
|
+
AgentBackendProtocol,
|
|
76
|
+
CalculatorTool,
|
|
77
|
+
Sha256Tool,
|
|
78
|
+
RegexSearchTool,
|
|
79
|
+
FetchBlobTool,
|
|
80
|
+
SubAskTool,
|
|
81
|
+
FinishTool,
|
|
82
|
+
ScriptedAgentBackend,
|
|
83
|
+
LlmAgentBackend,
|
|
84
|
+
AgentSkillModule,
|
|
85
|
+
HARNESS_SKILL_MODULES,
|
|
86
|
+
AgentProfileSpec,
|
|
87
|
+
BUILTIN_AGENT_PROFILES,
|
|
88
|
+
AgentHarnessRegistry,
|
|
89
|
+
McpToolSpec,
|
|
90
|
+
McpResourceSpec,
|
|
91
|
+
McpServerConfig,
|
|
92
|
+
McpToolAdapter,
|
|
93
|
+
McpClientBridge,
|
|
94
|
+
BacalhauClientProtocol,
|
|
95
|
+
BacalhauRestClient,
|
|
96
|
+
MockBacalhauClient,
|
|
97
|
+
BlossomMountBridge,
|
|
98
|
+
BlossomStagingResult,
|
|
99
|
+
BlossomUploadResult,
|
|
100
|
+
FfmpegTranscodeExecutor,
|
|
101
|
+
MEDIA_PROFILES,
|
|
102
|
+
FFMPEG_PROFILE_DIGEST,
|
|
103
|
+
DETERMINISTIC_FFMPEG_THREADS,
|
|
104
|
+
BITEXACT_MUX_FLAGS,
|
|
105
|
+
compute_deterministic_ffmpeg_job_key,
|
|
106
|
+
ffmpeg_available,
|
|
107
|
+
ExecutorRegistry,
|
|
108
|
+
DEFAULT_REGISTRY,
|
|
109
|
+
)
|
|
110
|
+
from .load import (
|
|
111
|
+
ComputeLoadMonitor,
|
|
112
|
+
DEFAULT_CPU_REFLECT_CEILING,
|
|
113
|
+
)
|
|
114
|
+
from .types import (
|
|
115
|
+
AgentSubAsk,
|
|
116
|
+
AgentTraceStep,
|
|
117
|
+
BacalhauJobSummary,
|
|
118
|
+
ComputeReceiptPayload,
|
|
119
|
+
JobRunResult,
|
|
120
|
+
OpenAIChatRequest,
|
|
121
|
+
)
|
|
122
|
+
from .jobs import run_job, build_receipt, open_receipt
|
|
123
|
+
from .compartment import Compute
|
|
124
|
+
from .. import compute_wire as wire
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
__all__ = [
|
|
128
|
+
'ComputeError', 'OFFER_KIND', 'ASK_KIND', 'RECEIPT_KIND', 'WASI_PROFILE',
|
|
129
|
+
'DEFAULT_EXPIRATION', 'MAX_BLOB_FETCH_BYTES', 'LLM_MAX_RESPONSE_BYTES', 'resolve_blob',
|
|
130
|
+
'build_offer', 'validate_offer', 'build_ask', 'verify_ask', 'parse_offer', 'parse_ask',
|
|
131
|
+
'match_ask_to_offers', 'match_offer_to_asks',
|
|
132
|
+
'ComputeLimits', 'NODE_MAX_TIMEOUT_S', 'NODE_MAX_MEMORY_BYTES', 'clamp_limits',
|
|
133
|
+
'sandbox_limits', '_sandbox_available', 'run_sandboxed',
|
|
134
|
+
'ComputeQuote', 'ComputeExecutionResult', 'ExecutorProtocol', 'JobRunResult',
|
|
135
|
+
'ComputeExecutor', 'WASM_DEFAULT_MEMORY_BYTES', 'WASM_MAX_OUTPUT_BYTES',
|
|
136
|
+
'WASM_VIRTUAL_EPOCH_NS', 'wasmtime_available', '_wasm_engine', 'run_wasi_module',
|
|
137
|
+
'WasmExecutor', 'ZkGroth16Executor', 'ZkVmExecutor', 'ZkVmReceiptResult',
|
|
138
|
+
'ZkVmVerifierProtocol', 'ZkVmReceiptVerifier', 'MockZkVmVerifier',
|
|
139
|
+
'ZkProverResult', 'ZkProverProtocol', 'MockZkProverClient', 'ZkProverExecutor',
|
|
140
|
+
'LlmExecutor', 'BacalhauExecutor', 'AgentExecutor',
|
|
141
|
+
'PROVIDER_PRESETS', 'ProviderPreset', 'LinkedProviderConfig', 'OperatorProviderRouter',
|
|
142
|
+
'AgentExecutionContext', 'AgentToolProtocol', 'AgentToolResult', 'AgentDecision',
|
|
143
|
+
'AgentBackendProtocol', 'CalculatorTool', 'Sha256Tool', 'RegexSearchTool',
|
|
144
|
+
'FetchBlobTool', 'SubAskTool', 'FinishTool', 'ScriptedAgentBackend', 'LlmAgentBackend',
|
|
145
|
+
'AgentSkillModule', 'HARNESS_SKILL_MODULES', 'AgentProfileSpec',
|
|
146
|
+
'BUILTIN_AGENT_PROFILES', 'AgentHarnessRegistry',
|
|
147
|
+
'McpToolSpec', 'McpResourceSpec', 'McpServerConfig', 'McpToolAdapter', 'McpClientBridge',
|
|
148
|
+
'BacalhauClientProtocol', 'BacalhauRestClient', 'MockBacalhauClient',
|
|
149
|
+
'BlossomMountBridge', 'BlossomStagingResult', 'BlossomUploadResult',
|
|
150
|
+
'FfmpegTranscodeExecutor', 'MEDIA_PROFILES', 'FFMPEG_PROFILE_DIGEST',
|
|
151
|
+
'DETERMINISTIC_FFMPEG_THREADS', 'BITEXACT_MUX_FLAGS',
|
|
152
|
+
'compute_deterministic_ffmpeg_job_key', 'ffmpeg_available',
|
|
153
|
+
'ExecutorRegistry', 'DEFAULT_REGISTRY',
|
|
154
|
+
'ComputeLoadMonitor', 'DEFAULT_CPU_REFLECT_CEILING',
|
|
155
|
+
'run_job', 'build_receipt', 'open_receipt',
|
|
156
|
+
'Compute', 'wire',
|
|
157
|
+
'AgentSubAsk', 'AgentTraceStep', 'BacalhauJobSummary',
|
|
158
|
+
'ComputeReceiptPayload', 'OpenAIChatRequest',
|
|
159
|
+
]
|
|
160
|
+
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"""Kinds, size ceilings, ComputeError and blob resolution shared by the compute package.
|
|
2
|
+
|
|
3
|
+
Separate so every other compute module can import the shared vocabulary without pulling in the market or executor code.
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
from typing import Any, Mapping, Optional, Sequence
|
|
9
|
+
|
|
10
|
+
from node.transport import netfetch
|
|
11
|
+
|
|
12
|
+
OFFER_KIND: int = 11803
|
|
13
|
+
ASK_KIND: int = 30810
|
|
14
|
+
RECEIPT_KIND: int = 30811
|
|
15
|
+
|
|
16
|
+
WASI_PROFILE: str = 'fleetmesh-wasi-v1'
|
|
17
|
+
DEFAULT_EXPIRATION: int = 86400 * 7
|
|
18
|
+
|
|
19
|
+
# Ceiling on any module/input fetched over the network on a job's behalf when
|
|
20
|
+
# the caller does not pass a tighter one (a Blossom server's upload cap is
|
|
21
|
+
# 64 MiB, so the same figure keeps the two planes consistent).
|
|
22
|
+
MAX_BLOB_FETCH_BYTES: int = 64 * 1024 * 1024
|
|
23
|
+
|
|
24
|
+
# Cap on a chat-completions response body from the operator's LLM backend; a
|
|
25
|
+
# misbehaving backend must not be able to exhaust node memory either.
|
|
26
|
+
LLM_MAX_RESPONSE_BYTES: int = 16 * 1024 * 1024
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ComputeError(Exception):
|
|
30
|
+
"""Raised when an ask, offer, or receipt fails cryptographic or wire validation."""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def resolve_blob(
|
|
34
|
+
spec: object,
|
|
35
|
+
blob_store: Optional[Any] = None,
|
|
36
|
+
blossom_servers: Optional[Sequence[str]] = None,
|
|
37
|
+
max_bytes: Optional[int] = None,
|
|
38
|
+
) -> Optional[bytes]:
|
|
39
|
+
"""Resolve blob bytes from local store, or peer Blossom servers via BUD-01/04.
|
|
40
|
+
|
|
41
|
+
``max_bytes`` bounds anything fetched over the network (a job's blob or
|
|
42
|
+
upload limit); it defaults to MAX_BLOB_FETCH_BYTES.
|
|
43
|
+
"""
|
|
44
|
+
if not isinstance(spec, Mapping):
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
sha256_hex = spec.get('sha256') or spec.get('hash')
|
|
48
|
+
if sha256_hex and str(sha256_hex).startswith('baf'):
|
|
49
|
+
# A CID in the sha256 slot must decode; if it does not, we have no
|
|
50
|
+
# digest to verify against and must not fall through to a fetch that
|
|
51
|
+
# would then be accepted unverified.
|
|
52
|
+
from node.protocols.nostr import blobstore
|
|
53
|
+
try:
|
|
54
|
+
sha256_hex = blobstore.cid_to_sha256(str(sha256_hex))
|
|
55
|
+
except Exception as e:
|
|
56
|
+
raise ComputeError('invalid CID in blob spec: %s' % e)
|
|
57
|
+
elif not sha256_hex and spec.get('cid'):
|
|
58
|
+
from node.protocols.nostr import blobstore
|
|
59
|
+
try:
|
|
60
|
+
sha256_hex = blobstore.cid_to_sha256(spec['cid'])
|
|
61
|
+
except Exception as e:
|
|
62
|
+
raise ComputeError('invalid CID in blob spec: %s' % e)
|
|
63
|
+
|
|
64
|
+
if not sha256_hex:
|
|
65
|
+
raw = spec.get('raw') or spec.get('data')
|
|
66
|
+
if isinstance(raw, (bytes, bytearray)):
|
|
67
|
+
return bytes(raw)
|
|
68
|
+
if isinstance(raw, str):
|
|
69
|
+
return raw.encode('utf-8')
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
sha256_hex = str(sha256_hex).lower()
|
|
73
|
+
|
|
74
|
+
if blob_store is not None:
|
|
75
|
+
if hasattr(blob_store, 'get_blob'):
|
|
76
|
+
data = blob_store.get_blob(sha256_hex)
|
|
77
|
+
elif hasattr(blob_store, 'get'):
|
|
78
|
+
data = blob_store.get(sha256_hex)
|
|
79
|
+
else:
|
|
80
|
+
data = None
|
|
81
|
+
if data is not None:
|
|
82
|
+
return data
|
|
83
|
+
|
|
84
|
+
if spec.get('raw'):
|
|
85
|
+
raw = spec['raw']
|
|
86
|
+
data = raw if isinstance(raw, (bytes, bytearray)) else str(raw).encode('utf-8')
|
|
87
|
+
if hashlib.sha256(data).hexdigest().lower() == sha256_hex:
|
|
88
|
+
if blob_store is not None:
|
|
89
|
+
if hasattr(blob_store, 'store_blob'):
|
|
90
|
+
blob_store.store_blob(bytes(data))
|
|
91
|
+
elif hasattr(blob_store, 'put'):
|
|
92
|
+
blob_store.put(data)
|
|
93
|
+
return bytes(data)
|
|
94
|
+
|
|
95
|
+
from node.protocols.nostr import blossom
|
|
96
|
+
servers = list(blossom_servers or [])
|
|
97
|
+
if spec.get('url'):
|
|
98
|
+
# The URL is chosen by the requester. netfetch refuses non-http(s)
|
|
99
|
+
# schemes and private/loopback/metadata destinations, and caps the
|
|
100
|
+
# body: a job may name a public origin for its module, not turn the
|
|
101
|
+
# node into a proxy into its own LAN. The cap is the caller's blob
|
|
102
|
+
# limit (falls back to MAX_BLOB_FETCH_BYTES), and the bytes are only
|
|
103
|
+
# accepted if they hash to what the job committed to.
|
|
104
|
+
try:
|
|
105
|
+
data, _ = netfetch.fetch(
|
|
106
|
+
str(spec['url']),
|
|
107
|
+
max_bytes=int(max_bytes or MAX_BLOB_FETCH_BYTES),
|
|
108
|
+
timeout=10.0,
|
|
109
|
+
headers={'User-Agent': 'fleetmesh-compute/1.0'},
|
|
110
|
+
)
|
|
111
|
+
if hashlib.sha256(data).hexdigest().lower() == sha256_hex:
|
|
112
|
+
if blob_store is not None:
|
|
113
|
+
if hasattr(blob_store, 'store_blob'):
|
|
114
|
+
blob_store.store_blob(bytes(data))
|
|
115
|
+
elif hasattr(blob_store, 'put'):
|
|
116
|
+
blob_store.put(data)
|
|
117
|
+
return data
|
|
118
|
+
except netfetch.FetchError:
|
|
119
|
+
pass
|
|
120
|
+
|
|
121
|
+
for srv in servers:
|
|
122
|
+
try:
|
|
123
|
+
data = blossom.BlossomClient.get_blob(srv, sha256_hex, timeout=5.0,
|
|
124
|
+
max_bytes=int(max_bytes or MAX_BLOB_FETCH_BYTES))
|
|
125
|
+
if blob_store is not None:
|
|
126
|
+
if hasattr(blob_store, 'store_blob'):
|
|
127
|
+
blob_store.store_blob(bytes(data))
|
|
128
|
+
elif hasattr(blob_store, 'put'):
|
|
129
|
+
blob_store.put(data)
|
|
130
|
+
return data
|
|
131
|
+
except Exception:
|
|
132
|
+
continue
|
|
133
|
+
|
|
134
|
+
return None
|