Skip to main content

spin_capabilities/
lib.rs

1pub use collect::required_capabilities;
2pub use deny::apply_deny_adapter;
3mod collect;
4mod deny;
5
6/// Specifies which host capabilities a component dependency is allowed to inherit
7/// from its parent component.
8///
9/// When a dependency is composed into a parent component, it may need access to
10/// host-provided interfaces such as networking, key-value stores, or environment
11/// variables. This enum controls which of those capability sets are "allowed through"
12/// (i.e. not denied by the deny adapter).
13pub enum InheritConfiguration {
14    /// Inherit all capabilities from the parent component.
15    All,
16    /// Inherit no capabilities; the deny adapter blocks every host interface.
17    None,
18    /// Inherit only the named capability sets (e.g. `"allowed_outbound_hosts"`,
19    /// `"key_value_stores"`). Unrecognized names are silently ignored.
20    Some(Vec<String>),
21}
22
23const CAPABILITY_SETS: &[(&str, &[&str])] = &[
24    ("ai_models", AI_MODELS),
25    ("allowed_outbound_hosts", ALLOWED_OUTBOUND_HOSTS),
26    ("environment", ENVIRONMENT),
27    ("files", FILES),
28    ("key_value_stores", KEY_VALUE_STORES),
29    ("sqlite_databases", SQLITE_DATABASES),
30    ("variables", VARIABLES),
31];
32
33const AI_MODELS: &[&str] = &["fermyon:spin/llm", "fermyon:spin/llm@2.0.0"];
34
35const ALLOWED_OUTBOUND_HOSTS: &[&str] = &[
36    "fermyon:spin/http",
37    "fermyon:spin/mysql",
38    "fermyon:spin/postgres",
39    "fermyon:spin/redis",
40    "fermyon:spin/mqtt@2.0.0",
41    "fermyon:spin/mysql@2.0.0",
42    "fermyon:spin/postgres@2.0.0",
43    "fermyon:spin/redis@2.0.0",
44    "spin:mqtt/mqtt@3.0.0",
45    "spin:mysql/mysql@3.0.0",
46    "spin:postgres/postgres@3.0.0",
47    "spin:postgres/postgres@4.2.0",
48    "spin:redis/redis@3.0.0",
49    "wasi:http/client@0.3.0",
50    "wasi:http/client@0.3.0-rc-2026-03-15",
51    "wasi:http/outgoing-handler@0.2.6",
52    "wasi:sockets/ip-name-lookup@0.2.6",
53    "wasi:sockets/ip-name-lookup@0.3.0",
54    "wasi:sockets/ip-name-lookup@0.3.0-rc-2026-03-15",
55    "wasi:sockets/tcp-create-socket@0.2.6",
56    "wasi:sockets/tcp@0.2.6",
57    "wasi:sockets/udp-create-socket@0.2.6",
58    "wasi:sockets/udp@0.2.6",
59];
60
61const ENVIRONMENT: &[&str] = &[
62    "wasi:cli/environment@0.2.6",
63    "wasi:cli/environment@0.3.0",
64    "wasi:cli/environment@0.3.0-rc-2026-03-15",
65];
66
67const FILES: &[&str] = &[
68    "wasi:filesystem/preopens@0.2.6",
69    "wasi:filesystem/preopens@0.3.0",
70    "wasi:filesystem/preopens@0.3.0-rc-2026-03-15",
71];
72
73const KEY_VALUE_STORES: &[&str] = &[
74    "fermyon:spin/key-value",
75    "fermyon:spin/key-value@2.0.0",
76    "spin:key-value/key-value@3.0.0",
77    "wasi:keyvalue/store@0.2.0-draft2",
78    "wasi:keyvalue/atomics@0.2.0-draft2",
79    "wasi:keyvalue/batch@0.2.0-draft2",
80];
81
82const SQLITE_DATABASES: &[&str] = &[
83    "fermyon:spin/sqlite",
84    "fermyon:spin/sqlite@2.0.0",
85    "spin:sqlite/sqlite@3.1.0",
86];
87
88const VARIABLES: &[&str] = &[
89    "fermyon:spin/config",
90    "fermyon:spin/variables@2.0.0",
91    "spin:variables/variables@3.0.0",
92    "wasi:config/store@0.2.0-draft-2024-09-27",
93];