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.
Files changed (338) hide show
  1. fleetmesh_node-0.2.0.dist-info/METADATA +57 -0
  2. fleetmesh_node-0.2.0.dist-info/RECORD +338 -0
  3. fleetmesh_node-0.2.0.dist-info/WHEEL +5 -0
  4. fleetmesh_node-0.2.0.dist-info/entry_points.txt +2 -0
  5. fleetmesh_node-0.2.0.dist-info/licenses/LICENSE +121 -0
  6. fleetmesh_node-0.2.0.dist-info/top_level.txt +2 -0
  7. node/RELEASE +1 -0
  8. node/__init__.py +35 -0
  9. node/app/__init__.py +49 -0
  10. node/app/commands.py +265 -0
  11. node/app/config.py +131 -0
  12. node/app/control.py +670 -0
  13. node/app/core.py +867 -0
  14. node/app/plugins.py +76 -0
  15. node/app/router.py +83 -0
  16. node/app/socket.py +431 -0
  17. node/app/systemd.py +36 -0
  18. node/app/views.py +204 -0
  19. node/channels/__init__.py +378 -0
  20. node/channels/bus.py +331 -0
  21. node/channels/journal.py +46 -0
  22. node/commands/__init__.py +140 -0
  23. node/commands/adapter.py +210 -0
  24. node/commands/base.py +278 -0
  25. node/commands/cluster_cmds.py +183 -0
  26. node/commands/compute_cmds.py +401 -0
  27. node/commands/core.py +474 -0
  28. node/commands/gossip_cmds.py +106 -0
  29. node/commands/nsite_cmds.py +141 -0
  30. node/commands/peering.py +402 -0
  31. node/commands/plugin_cmds.py +135 -0
  32. node/commands/sidecar_cmds.py +120 -0
  33. node/commands/sync.py +388 -0
  34. node/commands/transport_cmds.py +451 -0
  35. node/commands/video_cmds.py +99 -0
  36. node/compartment/__init__.py +124 -0
  37. node/compartment/base.py +868 -0
  38. node/compartment/command.py +458 -0
  39. node/compartment/context.py +163 -0
  40. node/compartment/every.py +108 -0
  41. node/compartment/handler.py +131 -0
  42. node/compartment/lifecycle.py +460 -0
  43. node/compartment/lint.py +388 -0
  44. node/compartment/need.py +158 -0
  45. node/compartment/problem.py +521 -0
  46. node/compartment/refusals.py +120 -0
  47. node/compartment/registry.py +790 -0
  48. node/compartment/schema.py +290 -0
  49. node/compartment/sidecar.py +499 -0
  50. node/compartment/stores.py +662 -0
  51. node/compartment/wire.py +225 -0
  52. node/compartment/worker.py +61 -0
  53. node/config/__init__.py +43 -0
  54. node/config/base.py +116 -0
  55. node/config/change.py +441 -0
  56. node/config/changestore.py +201 -0
  57. node/config/compartments.py +1144 -0
  58. node/config/node.py +318 -0
  59. node/config/parameter.py +563 -0
  60. node/config/protocols.py +274 -0
  61. node/config/records.py +171 -0
  62. node/examples/__init__.py +1 -0
  63. node/examples/demo.py +226 -0
  64. node/examples/follower.py +46 -0
  65. node/interfaces.py +235 -0
  66. node/keystore/__init__.py +27 -0
  67. node/keystore/core.py +103 -0
  68. node/keystore/enclave.py +688 -0
  69. node/meshnode.py +111 -0
  70. node/metrics/__init__.py +396 -0
  71. node/metrics/adapters.py +102 -0
  72. node/metrics/face.py +110 -0
  73. node/planes/__init__.py +21 -0
  74. node/planes/identity/__init__.py +20 -0
  75. node/planes/identity/announce/__init__.py +9 -0
  76. node/planes/identity/announce/compartment.py +447 -0
  77. node/planes/identity/announce/types.py +26 -0
  78. node/planes/identity/discovery/__init__.py +9 -0
  79. node/planes/identity/discovery/compartment.py +522 -0
  80. node/planes/identity/discovery/types.py +13 -0
  81. node/planes/identity/linked/__init__.py +1 -0
  82. node/planes/identity/linked/compartment.py +270 -0
  83. node/planes/identity/linked/types.py +25 -0
  84. node/planes/identity/presence/__init__.py +7 -0
  85. node/planes/identity/presence/compartment.py +409 -0
  86. node/planes/identity/presence/types.py +14 -0
  87. node/planes/operations/__init__.py +13 -0
  88. node/planes/operations/scheduler/__init__.py +9 -0
  89. node/planes/operations/scheduler/compartment.py +353 -0
  90. node/planes/operations/scheduler/types.py +21 -0
  91. node/planes/operations/updates/__init__.py +17 -0
  92. node/planes/operations/updates/core.py +310 -0
  93. node/planes/operations/updates/store.py +79 -0
  94. node/planes/operations/updates/types.py +20 -0
  95. node/planes/peering/__init__.py +28 -0
  96. node/planes/peering/budget/__init__.py +43 -0
  97. node/planes/peering/budget/chain.py +43 -0
  98. node/planes/peering/budget/core.py +537 -0
  99. node/planes/peering/budget/evaluation.py +80 -0
  100. node/planes/peering/budget/meter.py +100 -0
  101. node/planes/peering/budget/receipts.py +439 -0
  102. node/planes/peering/budget/shape.py +101 -0
  103. node/planes/peering/budget/tick.py +110 -0
  104. node/planes/peering/budget/types.py +67 -0
  105. node/planes/peering/budget/windows.py +346 -0
  106. node/planes/peering/capacity/__init__.py +7 -0
  107. node/planes/peering/capacity/compartment.py +342 -0
  108. node/planes/peering/capacity/types.py +24 -0
  109. node/planes/peering/peering/__init__.py +25 -0
  110. node/planes/peering/peering/core.py +464 -0
  111. node/planes/peering/peering/envelope.py +142 -0
  112. node/planes/peering/peering/handshake.py +198 -0
  113. node/planes/peering/peering/shape.py +80 -0
  114. node/planes/peering/peering/types.py +39 -0
  115. node/planes/peering/reporter/__init__.py +42 -0
  116. node/planes/peering/reporter/constants.py +29 -0
  117. node/planes/peering/reporter/core.py +299 -0
  118. node/planes/peering/reporter/finding.py +74 -0
  119. node/planes/peering/reporter/findings.py +171 -0
  120. node/planes/peering/reporter/publish.py +285 -0
  121. node/planes/peering/reporter/reading.py +193 -0
  122. node/planes/peering/reporter/shape.py +86 -0
  123. node/planes/peering/reporter/types.py +50 -0
  124. node/planes/peering/strain/__init__.py +9 -0
  125. node/planes/peering/strain/compartment.py +204 -0
  126. node/planes/peering/strain/types.py +21 -0
  127. node/planes/peering/trust/__init__.py +9 -0
  128. node/planes/peering/trust/compartment.py +239 -0
  129. node/planes/peering/trust/types.py +30 -0
  130. node/planes/services/__init__.py +33 -0
  131. node/planes/services/compute/__init__.py +160 -0
  132. node/planes/services/compute/common.py +134 -0
  133. node/planes/services/compute/compartment.py +681 -0
  134. node/planes/services/compute/executors/__init__.py +121 -0
  135. node/planes/services/compute/executors/agent.py +840 -0
  136. node/planes/services/compute/executors/bacalhau.py +605 -0
  137. node/planes/services/compute/executors/base.py +127 -0
  138. node/planes/services/compute/executors/harness.py +439 -0
  139. node/planes/services/compute/executors/mcp.py +454 -0
  140. node/planes/services/compute/executors/media.py +898 -0
  141. node/planes/services/compute/executors/nondet.py +283 -0
  142. node/planes/services/compute/executors/providers.py +499 -0
  143. node/planes/services/compute/executors/registry.py +140 -0
  144. node/planes/services/compute/executors/wasm.py +244 -0
  145. node/planes/services/compute/executors/zk.py +604 -0
  146. node/planes/services/compute/jobs.py +227 -0
  147. node/planes/services/compute/load.py +180 -0
  148. node/planes/services/compute/market.py +433 -0
  149. node/planes/services/compute/sandbox.py +282 -0
  150. node/planes/services/compute/types.py +84 -0
  151. node/planes/services/compute_wire/__init__.py +58 -0
  152. node/planes/services/compute_wire/compartment.py +256 -0
  153. node/planes/services/compute_wire/messages.py +320 -0
  154. node/planes/services/compute_wire/sealing.py +147 -0
  155. node/planes/services/compute_wire/session.py +572 -0
  156. node/planes/services/compute_wire/types.py +49 -0
  157. node/planes/services/compute_wire/verify.py +331 -0
  158. node/planes/services/dvm/__init__.py +24 -0
  159. node/planes/services/dvm/gateway.py +526 -0
  160. node/planes/services/dvm/protocol.py +35 -0
  161. node/planes/services/dvm/translate.py +15 -0
  162. node/planes/services/dvm/types.py +25 -0
  163. node/planes/services/gateway/__init__.py +40 -0
  164. node/planes/services/gateway/settle.py +279 -0
  165. node/planes/services/gateway/translate.py +644 -0
  166. node/planes/services/gossip/__init__.py +22 -0
  167. node/planes/services/gossip/core.py +929 -0
  168. node/planes/services/gossip/envelope.py +154 -0
  169. node/planes/services/gossip/mesh.py +127 -0
  170. node/planes/services/gossip/types.py +50 -0
  171. node/planes/services/nsite/__init__.py +7 -0
  172. node/planes/services/nsite/client.py +62 -0
  173. node/planes/services/nsite/compartment.py +752 -0
  174. node/planes/services/nsite/types.py +44 -0
  175. node/planes/services/paidfetch/__init__.py +7 -0
  176. node/planes/services/paidfetch/compartment.py +862 -0
  177. node/planes/services/paidfetch/types.py +99 -0
  178. node/planes/services/settle/__init__.py +27 -0
  179. node/planes/services/settle/compartment.py +384 -0
  180. node/planes/services/settle/engine.py +456 -0
  181. node/planes/services/settle/gateways.py +541 -0
  182. node/planes/services/settle/payment.py +512 -0
  183. node/planes/services/settle/store.py +74 -0
  184. node/planes/services/settle/types.py +58 -0
  185. node/planes/services/sidecars/__init__.py +8 -0
  186. node/planes/services/sidecars/compartment.py +461 -0
  187. node/planes/services/sidecars/manifest.py +304 -0
  188. node/planes/services/sidecars/manifests/10-grasp.json +37 -0
  189. node/planes/services/sidecars/manifests/20-ncontainer.json +31 -0
  190. node/planes/services/sidecars/manifests/30-magpie.json +28 -0
  191. node/planes/services/sidecars/types.py +43 -0
  192. node/planes/services/video/__init__.py +106 -0
  193. node/planes/services/video/barter.py +407 -0
  194. node/planes/services/video/cli.py +158 -0
  195. node/planes/services/video/compartment.py +932 -0
  196. node/planes/services/video/ingest.py +524 -0
  197. node/planes/services/video/ledger.py +705 -0
  198. node/planes/services/video/packager.py +847 -0
  199. node/planes/services/video/player.py +456 -0
  200. node/planes/services/video/timed_segments.py +124 -0
  201. node/planes/services/video/transit.py +478 -0
  202. node/planes/store/__init__.py +24 -0
  203. node/planes/store/blob_replication/__init__.py +7 -0
  204. node/planes/store/blob_replication/compartment.py +496 -0
  205. node/planes/store/blob_replication/types.py +35 -0
  206. node/planes/store/blob_wire/__init__.py +48 -0
  207. node/planes/store/blob_wire/client.py +57 -0
  208. node/planes/store/blob_wire/core.py +359 -0
  209. node/planes/store/blob_wire/intake.py +74 -0
  210. node/planes/store/blob_wire/messages.py +85 -0
  211. node/planes/store/projected/__init__.py +7 -0
  212. node/planes/store/projected/compartment.py +258 -0
  213. node/planes/store/projected/types.py +29 -0
  214. node/planes/store/retention/__init__.py +7 -0
  215. node/planes/store/retention/compartment.py +214 -0
  216. node/planes/store/retention/types.py +12 -0
  217. node/planes/store/sync/__init__.py +35 -0
  218. node/planes/store/sync/core.py +311 -0
  219. node/planes/store/sync/envelope.py +106 -0
  220. node/planes/store/sync/handover.py +206 -0
  221. node/planes/store/sync/initiator.py +128 -0
  222. node/planes/store/sync/responder.py +114 -0
  223. node/planes/store/sync/rules.py +179 -0
  224. node/planes/store/sync/shape.py +80 -0
  225. node/planes/store/sync/types.py +51 -0
  226. node/planes/transport/__init__.py +23 -0
  227. node/planes/transport/bridge/__init__.py +13 -0
  228. node/planes/transport/bridge/compartment.py +785 -0
  229. node/planes/transport/bridge/ratelimit.py +44 -0
  230. node/planes/transport/bridge/types.py +43 -0
  231. node/planes/transport/lan/__init__.py +9 -0
  232. node/planes/transport/lan/compartment.py +446 -0
  233. node/planes/transport/lan/types.py +25 -0
  234. node/planes/transport/link/__init__.py +7 -0
  235. node/planes/transport/link/compartment.py +257 -0
  236. node/planes/transport/link/types.py +27 -0
  237. node/planes/transport/mediation/__init__.py +45 -0
  238. node/planes/transport/mediation/compartment.py +238 -0
  239. node/planes/transport/mediation/leaf.py +107 -0
  240. node/planes/transport/mediation/messages.py +302 -0
  241. node/planes/transport/mediation/service.py +233 -0
  242. node/planes/transport/mediation/store.py +37 -0
  243. node/planes/transport/mediation/types.py +20 -0
  244. node/planes/transport/p2p/__init__.py +7 -0
  245. node/planes/transport/p2p/compartment.py +349 -0
  246. node/planes/transport/p2p/types.py +22 -0
  247. node/protocols/__init__.py +277 -0
  248. node/protocols/activitypub/__init__.py +56 -0
  249. node/protocols/activitypub/actor.py +230 -0
  250. node/protocols/activitypub/federation.py +490 -0
  251. node/protocols/activitypub/media.py +145 -0
  252. node/protocols/activitypub/models.py +286 -0
  253. node/protocols/activitypub/package.py +271 -0
  254. node/protocols/activitypub/store.py +564 -0
  255. node/protocols/arcade/__init__.py +26 -0
  256. node/protocols/atproto/__init__.py +13 -0
  257. node/protocols/atproto/firehose.py +126 -0
  258. node/protocols/atproto/metering.py +165 -0
  259. node/protocols/atproto/package.py +155 -0
  260. node/protocols/atproto/repo.py +250 -0
  261. node/protocols/atproto/xrpc.py +285 -0
  262. node/protocols/base.py +109 -0
  263. node/protocols/circles/__init__.py +29 -0
  264. node/protocols/dm/__init__.py +50 -0
  265. node/protocols/grasp/__init__.py +22 -0
  266. node/protocols/isotime.py +15 -0
  267. node/protocols/nostr/__init__.py +51 -0
  268. node/protocols/nostr/blobstore.py +383 -0
  269. node/protocols/nostr/blossom.py +627 -0
  270. node/protocols/nostr/client.py +377 -0
  271. node/protocols/nostr/descriptor.py +211 -0
  272. node/protocols/nostr/eventstore.py +304 -0
  273. node/protocols/nostr/package.py +182 -0
  274. node/protocols/nostr/peers.py +109 -0
  275. node/protocols/nostr/relayserver.py +656 -0
  276. node/protocols/p2panda/__init__.py +22 -0
  277. node/protocols/p2panda/identity.py +19 -0
  278. node/protocols/p2panda/package.py +236 -0
  279. node/protocols/p2panda/rung.py +152 -0
  280. node/protocols/p2panda/store.py +273 -0
  281. node/protocols/rhio/__init__.py +33 -0
  282. node/protocols/rhio/package.py +275 -0
  283. node/protocols/rhio/rung.py +136 -0
  284. node/protocols/rhio/store.py +1423 -0
  285. node/protocols/ssb/muxrpc.py +256 -0
  286. node/protocols/ssb/package.py +267 -0
  287. node/protocols/textile/__init__.py +111 -0
  288. node/protocols/textile/transducers.py +259 -0
  289. node/release.py +119 -0
  290. node/storage/__init__.py +88 -0
  291. node/storage/accounts.py +305 -0
  292. node/storage/adapter.py +161 -0
  293. node/storage/base.py +385 -0
  294. node/storage/dialect.py +209 -0
  295. node/storage/grants.py +317 -0
  296. node/storage/locator.py +150 -0
  297. node/storage/postgres.py +294 -0
  298. node/storage/projected.py +953 -0
  299. node/storage/sharding.py +448 -0
  300. node/storage/standing.py +568 -0
  301. node/testnet/__init__.py +9 -0
  302. node/testnet/cluster.py +731 -0
  303. node/testnet/fips_daemon.py +230 -0
  304. node/transport/__init__.py +94 -0
  305. node/transport/const.py +110 -0
  306. node/transport/didcomm_inbound.py +251 -0
  307. node/transport/dnstxt.py +169 -0
  308. node/transport/fips_rung/__init__.py +67 -0
  309. node/transport/fips_rung/core.py +666 -0
  310. node/transport/fips_rung/listener.py +96 -0
  311. node/transport/fips_rung/types.py +12 -0
  312. node/transport/host.py +334 -0
  313. node/transport/iroh_rung/__init__.py +29 -0
  314. node/transport/iroh_rung/core.py +477 -0
  315. node/transport/iroh_rung/quic.py +942 -0
  316. node/transport/iroh_rung/types.py +22 -0
  317. node/transport/ladder.py +145 -0
  318. node/transport/lineproto.py +49 -0
  319. node/transport/mdns.py +303 -0
  320. node/transport/netfetch.py +283 -0
  321. node/transport/relay_rung/__init__.py +23 -0
  322. node/transport/relay_rung/cooldown.py +87 -0
  323. node/transport/relay_rung/core.py +138 -0
  324. node/transport/relay_rung/inbound.py +161 -0
  325. node/transport/relay_rung/ledger.py +104 -0
  326. node/transport/relay_rung/listen.py +121 -0
  327. node/transport/relay_rung/outbound.py +181 -0
  328. node/transport/relay_rung/shape.py +71 -0
  329. node/transport/relay_rung/types.py +58 -0
  330. node/transport/relay_rung/wire.py +63 -0
  331. node/transport/router.py +761 -0
  332. node/transport/rung.py +276 -0
  333. node/transport/ssb_rung.py +166 -0
  334. node/transport/ws.py +502 -0
  335. sidecar/fleetmesh_announce.py +338 -0
  336. sidecar/fleetmesh_p2p.py +373 -0
  337. sidecar/fleetmesh_rhio.py +352 -0
  338. 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