<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Reference on SAM</title><link>https://sam-mesh.dev/docs/reference/</link><description>Recent content in Reference on SAM</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://sam-mesh.dev/docs/reference/index.xml" rel="self" type="application/rss+xml"/><item><title>sam-node</title><link>https://sam-mesh.dev/docs/reference/sam-node/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sam-mesh.dev/docs/reference/sam-node/</guid><description>&lt;p>&lt;code>sam-node&lt;/code> is the mesh member that runs beside an agent or a service.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">sam-node join [control-plane-url] [flags] enroll and store a credential
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sam-node run [flags] run the node
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sam-node reset [--all] [--yes] forget the credential or everything
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sam-node skill install|list|show manage the agent skill document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="files">Files&lt;/h2>
&lt;p>The data directory is &lt;code>--data-dir&lt;/code> if set, otherwise &lt;code>$SAM_DATA_DIR&lt;/code>,
otherwise the user configuration directory of the operating system
(&lt;code>~/.config/sam-mesh&lt;/code> on Linux, &lt;code>~/Library/Application Support/sam-mesh&lt;/code> on
macOS). It is created with mode &lt;code>0700&lt;/code> and holds:&lt;/p></description></item><item><title>sam-control-plane</title><link>https://sam-mesh.dev/docs/reference/control-plane/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sam-mesh.dev/docs/reference/control-plane/</guid><description>&lt;p>&lt;code>sam-control-plane&lt;/code> admits nodes, mints credentials, holds the mesh policy
and tracks routers. It is an HTTP server over SQLite or PostgreSQL.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">sam-control-plane [flags] run the server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sam-control-plane admin ban --peer &amp;lt;id&amp;gt; ban a node directly in the database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sam-control-plane admin unban --peer &amp;lt;id&amp;gt; lift a ban
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="flags">Flags&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Flag&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Meaning&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>--issuer&lt;/code>&lt;/td>
 &lt;td>required&lt;/td>
 &lt;td>OIDC issuer URL(s), comma-separated. The first is advertised to enrolling nodes on &lt;code>/info&lt;/code>. Can also be set with &lt;code>SAM_OIDC_ISSUER&lt;/code>.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--allowed-audiences&lt;/code>&lt;/td>
 &lt;td>&lt;code>sam-mesh-audience&lt;/code>&lt;/td>
 &lt;td>Audiences accepted in OIDC tokens, comma-separated.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--oidc-client-id&lt;/code>&lt;/td>
 &lt;td>first audience&lt;/td>
 &lt;td>OAuth client ID advertised on &lt;code>/info&lt;/code>, for providers where it differs from the audience.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--insecure-skip-tls-verify&lt;/code>&lt;/td>
 &lt;td>&lt;code>false&lt;/code>&lt;/td>
 &lt;td>Skip TLS verification when fetching issuer metadata and keys. For a cluster issuer served with the cluster CA, or a local development issuer.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--bind-address&lt;/code>&lt;/td>
 &lt;td>&lt;code>0.0.0.0:8080&lt;/code>&lt;/td>
 &lt;td>HTTP listen address.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--db-driver&lt;/code>&lt;/td>
 &lt;td>&lt;code>sqlite&lt;/code>&lt;/td>
 &lt;td>&lt;code>sqlite&lt;/code> or &lt;code>postgres&lt;/code>.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--db-dsn&lt;/code>&lt;/td>
 &lt;td>&lt;code>control-plane.db&lt;/code>&lt;/td>
 &lt;td>Database DSN. A PostgreSQL DSN contains a password, so the next two options are preferred for PostgreSQL.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--db-dsn-path&lt;/code>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>File containing the DSN. Overrides &lt;code>--db-dsn&lt;/code>. Can also be set with &lt;code>SAM_DB_DSN&lt;/code>.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--admin-token-path&lt;/code>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>File containing the bearer token for &lt;code>/admin/*&lt;/code> and &lt;code>POST /policies&lt;/code>. Can also be set with &lt;code>SAM_ADMIN_TOKEN&lt;/code>. Without a token, the admin API cannot be used.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--auto-approve-enrollment&lt;/code>&lt;/td>
 &lt;td>&lt;code>false&lt;/code>&lt;/td>
 &lt;td>Issue credentials for valid bootstrap-token enrollments immediately instead of queueing them for approval.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--biscuit-ttl&lt;/code>&lt;/td>
 &lt;td>&lt;code>24h&lt;/code>&lt;/td>
 &lt;td>Lifetime of each credential. If the OIDC token expires sooner, the credential expires with it.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--oidc-session-ttl&lt;/code>&lt;/td>
 &lt;td>&lt;code>2160h&lt;/code> (90 days)&lt;/td>
 &lt;td>How long an OIDC enrollment may keep refreshing before the identity must log in again.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--key-rotation-interval&lt;/code>&lt;/td>
 &lt;td>&lt;code>24h&lt;/code>&lt;/td>
 &lt;td>How often a new signing key is generated. &lt;code>0&lt;/code> disables rotation.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--key-grace-period&lt;/code>&lt;/td>
 &lt;td>&lt;code>1h&lt;/code>&lt;/td>
 &lt;td>How long a rotated-out key stays accepted. Credentials signed by a retired key cannot be verified or refreshed. Nodes and routers must pull &lt;code>/keys&lt;/code> well within this window (&lt;code>sam-node --control-plane-sync-interval&lt;/code>, &lt;code>sam-router --keys-sync-interval&lt;/code>).&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--lease-duration&lt;/code>&lt;/td>
 &lt;td>&lt;code>15m&lt;/code>&lt;/td>
 &lt;td>How long a router lease lasts without renewal.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--node-retention&lt;/code>&lt;/td>
 &lt;td>&lt;code>720h&lt;/code> (30 days)&lt;/td>
 &lt;td>How long the record of an enrolled node is kept after its session expires. Banned nodes are kept forever. &lt;code>0&lt;/code> keeps every record.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--mesh-reconnect-interval&lt;/code>&lt;/td>
 &lt;td>&lt;code>30s&lt;/code>&lt;/td>
 &lt;td>How often the event publisher re-reads the router leases and dials any router it is not connected to.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--log-level&lt;/code>&lt;/td>
 &lt;td>&lt;code>info&lt;/code>&lt;/td>
 &lt;td>&lt;code>debug&lt;/code>, &lt;code>info&lt;/code>, &lt;code>warn&lt;/code>, &lt;code>error&lt;/code>. &lt;code>LOG_FORMAT=json&lt;/code> selects JSON output.&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="http-api">HTTP API&lt;/h2>
&lt;p>Two encodings are in use. Routes that mesh components call use protobuf
(&lt;code>application/x-protobuf&lt;/code>), with messages defined in &lt;code>api/sam.proto&lt;/code>. Routes
for operators and the console use JSON. &lt;code>POST /policies&lt;/code> accepts either.&lt;/p></description></item><item><title>sam-router</title><link>https://sam-mesh.dev/docs/reference/router/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sam-mesh.dev/docs/reference/router/</guid><description>&lt;p>&lt;code>sam-router&lt;/code> is a libp2p peer with a stable identity that new nodes connect
to first. It hosts the DHT, relays traffic between nodes that cannot reach
each other, and forwards the control plane&amp;rsquo;s signed events. It has no policy
of its own.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">sam-router [flags]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="enrollment">Enrollment&lt;/h2>
&lt;p>A router enrolls like a node, requesting &lt;code>sam:role:router&lt;/code>, with one of:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Flag&lt;/th>
 &lt;th>Meaning&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>--jwt-path&lt;/code>&lt;/td>
 &lt;td>File containing an OIDC token (a projected service account token, for example).&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--bootstrap-token-path&lt;/code>&lt;/td>
 &lt;td>File containing a bootstrap token minted with &lt;code>&amp;quot;role&amp;quot;: &amp;quot;sam:role:router&amp;quot;&lt;/code>.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>--oidc-token&lt;/code>, &lt;code>--bootstrap-token&lt;/code>&lt;/td>
 &lt;td>The same tokens as values. Visible in process listings. The file forms are preferred.&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The mesh policy must bind the router&amp;rsquo;s identity to &lt;code>sam:role:router&lt;/code>. The
&lt;code>sam-mesh&lt;/code> Helm chart handles this: its bootstrap job binds the router&amp;rsquo;s
service account and mints a bootstrap token with &lt;code>max_usages&lt;/code> equal to the
replica count.&lt;/p></description></item><item><title>sam-one</title><link>https://sam-mesh.dev/docs/reference/sam-one/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sam-mesh.dev/docs/reference/sam-one/</guid><description>&lt;p>&lt;code>sam-one&lt;/code> runs a control plane, a router and the web console in one process
on one port. The router&amp;rsquo;s libp2p transport is WebSocket on the same port as
the HTTP API, so a node needs only one &lt;code>https&lt;/code> URL. The same binary is also
the admin client for a running instance.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">sam-one [flags] run the mesh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sam-one token create|list|revoke|qr manage bootstrap tokens on a running instance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sam-one admin ban &amp;lt;peer-id&amp;gt; ban a node
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="files">Files&lt;/h2>
&lt;p>Everything lives in &lt;code>--data-dir&lt;/code> (default &lt;code>.&lt;/code>): &lt;code>sam.db&lt;/code> (SQLite), the
router key, &lt;code>join-token&lt;/code> and &lt;code>admin-token&lt;/code> when generated, and &lt;code>bin/&lt;/code> for a
downloaded tunnel connector.&lt;/p></description></item><item><title>Node configuration file</title><link>https://sam-mesh.dev/docs/reference/node-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sam-mesh.dev/docs/reference/node-config/</guid><description>&lt;p>&lt;code>sam-node.yaml&lt;/code> declares what a node is (labels), what it publishes
(services), what it requires from callers (attenuation) and what it requires
from providers (egress). Both &lt;code>sam-node join&lt;/code> and &lt;code>sam-node run&lt;/code> read it from
&lt;code>--config&lt;/code>, by default &lt;code>./sam-node.yaml&lt;/code>. A missing file means an empty
configuration. Unknown keys are an error, because a typo under &lt;code>attenuation&lt;/code>
would otherwise weaken the node without notice.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;v1alpha1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">region&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">eu-west-1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">team&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">platform&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mcp&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">code-reviewer&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Reviews diffs&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">target_url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;http://127.0.0.1:7777/mcp&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mcp&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">filesystem&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;npx&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;-y&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;@modelcontextprotocol/server-filesystem&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;/srv/docs&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">NODE_OPTIONS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;--max-old-space-size=256&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inference&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vllm&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">target_url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;http://127.0.0.1:8000&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">target_auth_path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/etc/sam/vllm-key&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">a2a&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">triage&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">target_url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;http://127.0.0.1:9999&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">attenuation&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;maintenance() &amp;lt;- time($t), $t &amp;gt; 2026-12-31T00:00:00Z;&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">checks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;check if label(&amp;#34;team&amp;#34;, &amp;#34;platform&amp;#34;);&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">policies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;deny if service(&amp;#34;mcp&amp;#34;, &amp;#34;filesystem&amp;#34;), group(&amp;#34;contractors&amp;#34;);&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;deny if maintenance();&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">egress&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">require_labels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">jurisdiction&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">eu&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="version">&lt;code>version&lt;/code>&lt;/h2>
&lt;p>&lt;code>&amp;quot;v1alpha1&amp;quot;&lt;/code>, or omitted (read as &lt;code>v1alpha1&lt;/code>). A node refuses a version it
does not know.&lt;/p></description></item><item><title>Mesh policy</title><link>https://sam-mesh.dev/docs/reference/policy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sam-mesh.dev/docs/reference/policy/</guid><description>&lt;p>The mesh policy is one document held by the control plane: a list of roles
and a list of bindings. It is posted as JSON (protojson of
&lt;code>PolicyConfigUpdateRequest&lt;/code> in &lt;code>api/sam.proto&lt;/code>) to &lt;code>POST /policies&lt;/code>, edited
in the console, or given to &lt;code>sam-one --policy-file&lt;/code> for first boot.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;roles&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;sam:role:node&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;allowed_services&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;system://sam.catalog&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;allowed_labels&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;region=*&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;team=platform&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;developer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;allowed_services&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;mcp://code-reviewer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;mcp://build-runner.*&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;inference://*&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;allowed_targets&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;group:dev-nodes&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;node:12D3KooWSpecialNode&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;allowed_agents&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;*.dev.acme.example&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;custom_datalog&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;tier(\&amp;#34;standard\&amp;#34;);&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;bindings&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;role&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;sam:role:node&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;members&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;group:engineering&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;user:system:serviceaccount:sam-nodes:calc-mcp-sam-node&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;role&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;developer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;members&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;group:engineering&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The whole document is replaced on every post. Unknown fields are rejected,
so a misspelt key fails the request instead of dropping a grant without
notice.&lt;/p></description></item><item><title>Node API</title><link>https://sam-mesh.dev/docs/reference/node-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sam-mesh.dev/docs/reference/node-api/</guid><description>&lt;p>The local API that &lt;code>sam-node run&lt;/code> serves to agents and scripts on the same
machine. It is available on TCP (&lt;code>--bind-addr&lt;/code>, default &lt;code>127.0.0.1:8080&lt;/code>)
and on a Unix socket (&lt;code>--socket-path&lt;/code>, default &lt;code>&amp;lt;data-dir&amp;gt;/sam.sock&lt;/code>).&lt;/p>
&lt;h2 id="authentication">Authentication&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Listener&lt;/th>
 &lt;th>Requirement&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>TCP&lt;/td>
 &lt;td>&lt;code>X-Sam-Authentication: Bearer &amp;lt;api-token&amp;gt;&lt;/code> on every request, or a client certificate when &lt;code>--tls-ca&lt;/code> is set.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Unix socket&lt;/td>
 &lt;td>None. The socket has mode &lt;code>0600&lt;/code>. Being able to open it is the credential.&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;code>Authorization&lt;/code> is reserved for the credential of the service that is being
called through the node, and the proxy path forwards it. The endpoints that
never forward anything (&lt;code>/mcp&lt;/code>, &lt;code>/v1/*&lt;/code>, &lt;code>/sam/service/*&lt;/code>, &lt;code>/metrics&lt;/code>,
&lt;code>/sam/identity&lt;/code>, &lt;code>/sam/peer/*&lt;/code>, &lt;code>/debug/*&lt;/code>) also accept the API token in
&lt;code>Authorization: Bearer&lt;/code>, for clients that cannot set custom headers. The
proxy path does not accept it there.&lt;/p></description></item></channel></rss>