@sanctuary-framework/mcp-server 1.1.7 → 1.2.0

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 CHANGED
@@ -1,18 +1,50 @@
1
1
  # @sanctuary-framework/mcp-server
2
2
 
3
- Sovereignty infrastructure for agent harnesses, delivered as an MCP server.
3
+ Operator-sovereign substrate for AI agents. Open source. Operator-held keys. OS-level enforcement at the cross-boundary wall. Composes with any MCP-speaking agent harness.
4
4
 
5
- Sanctuary gives agents (and their human principals) encrypted state, sovereign identity, selective disclosure, and portable reputation — without requiring any changes to the host harness.
5
+ Your agent. Your machine. Your keys.
6
6
 
7
- ## What it does
7
+ ## What Sanctuary is
8
8
 
9
- **L1 Cognitive Sovereignty** All agent state is encrypted at rest with AES-256-GCM. Keys are participant-held. Identity is Ed25519-based with DID support. Merkle tree integrity verification prevents tampering and rollback.
9
+ Sanctuary is the substrate that makes operator sovereignty structurally real in the agent era. Your agent runtime (Claude Code, OpenClaw, Hermes, Cline, Mastra, Cursor, or any MCP-speaking harness) runs as it normally would. Sanctuary sits underneath, providing four enforcement layers that together preserve the operator's identity, durable record, and decision authority across vendor churn.
10
10
 
11
- **L2 Operational Isolation** Environment attestation, health monitoring, encrypted audit log, and **Principal Policy** a human-controlled, agent-immutable approval system that defends against prompt injection by gating high-risk operations.
11
+ The framework is open source and free always. Commercial extensions (managed hosting for sovereignty-bound enterprises, premium support, compliance-pack-as-a-service, container-isolation for highest-assurance deployments) ship on top.
12
12
 
13
- **L3 Selective Disclosure** — SHA-256 commitments, Pedersen commitments on Ristretto255, zero-knowledge proofs of knowledge (Schnorr/Fiat-Shamir), and ZK range proofs (bit-decomposition with CDS OR-proofs). Disclosure policies define what information flows where.
13
+ ## Architecture: the Castle
14
14
 
15
- **L4 Verifiable Reputation** Signed attestations (EAS-compatible) with sovereignty-gated tiers. Weighted scoring based on counterparty sovereignty posture. Export/import for cross-platform portability. Trust bootstrapping via escrow and principal guarantees. Sovereignty handshakes and MCP-to-MCP federation.
15
+ Sanctuary's enforcement model is the Castle Architecture. Four layers, each with a distinct enforcement contract.
16
+
17
+ **Layer 1, Castle Wall.** OS-level egress filtering at the operator-external boundary. Linux netfilter / NFQUEUE, macOS Network Extension or pf rules, Windows Filtering Platform. The kernel itself blocks unauthorized cross-boundary calls. Even prompt-injected agents cannot bypass. Phase 1 (macOS plus Linux) ships in v1.x; Windows is Phase 2; container or microVM isolation is Phase 3 for highest-assurance enterprises.
18
+
19
+ **Layer 2, Sentinels.** Internal observation, not enforcement. Behavioral baselining via process introspection and eBPF. Anomalies surface to the operator via menubar and OS notifications. Sentinels watch internal patterns the wall cannot see (file access, internal LLM calls, cross-agent coordination); they observe and surface; they do not block. Sentinels ship in v1.3.
20
+
21
+ **Layer 3, Cooperative MCP.** Additive sovereignty surface for compliant agents. Encrypted state at rest, signed audit, mandate primitives, four canonical policy slots (memory, credentials, plans, outputs), substrate selector, Concordia receipt integration, Verascore reputation hooks. Compliant agents that voluntarily route through Sanctuary's MCP get the full sovereignty surface. Non-compliant agents still hit Layer 1 at the wall and Layer 2 inside the castle.
22
+
23
+ **Layer 4, Cryptographic Receipts and Reputation.** Concordia receipts on cross-castle transactions. Verascore reputation aggregating across operators. Cross-castle accountability post-action. Portable reputation across vendor churn.
24
+
25
+ The castle MUST be both real AND delightful. Hard enforcement at the wall AND approval response under 2 seconds when prompted. Default-deny outbound AND smart always-allow rules with learning. Sentinels observe AND do not surface noise. Cooperative MCP path remains additive and fully usable. Composition with agent runtimes is preserved because the runtime sees a normal operating environment with constrained egress; nothing internal is sandboxed.
26
+
27
+ ## Capability surfaces
28
+
29
+ Within the Cooperative MCP layer (Castle Layer 3), Sanctuary exposes four capability surfaces. These are the tool-level primitives compliant agents call.
30
+
31
+ **Cognitive Sovereignty.** All agent state encrypted at rest with AES-256-GCM. Keys are participant-held. Identity is Ed25519-based with DID support. Merkle tree integrity verification prevents tampering and rollback.
32
+
33
+ **Operational Isolation.** Environment attestation, encrypted audit log, and Principal Policy: a human-controlled, agent-immutable approval system that gates high-risk operations. The Sentinels layer (Castle Layer 2, v1.3+) extends this with behavioral baselining and anomaly detection.
34
+
35
+ **Selective Disclosure.** SHA-256 commitments, Pedersen commitments on Ristretto255, zero-knowledge proofs of knowledge (Schnorr/Fiat-Shamir), and ZK range proofs (bit-decomposition with CDS OR-proofs). Disclosure policies define what information flows where.
36
+
37
+ **Verifiable Reputation.** Signed attestations (EAS-compatible) with sovereignty-gated tiers. Weighted scoring based on counterparty sovereignty posture. Export/import for cross-platform portability. Trust bootstrapping via escrow and principal guarantees. Sovereignty handshakes and MCP-to-MCP federation.
38
+
39
+ ## Operator experience
40
+
41
+ Sanctuary lives in your menubar. When your agent wants to do something risky, you get an OS notification. Click, see the request in plain English, approve or deny in five seconds. The agent receives a structured response that surfaces the decision back to you naturally if you missed the notification. Three-channel coverage means you never get to the "my agent is mysteriously broken" mental state.
42
+
43
+ The dashboard is for setup and inspection, not daily ops. Substrate selector (pick local model, Venice.ai, or operator-frontier with redaction), policy editor, audit deep-dive, exit bundle drill, fortress configuration. You visit the dashboard for setup; you stay in your menubar for daily ops.
44
+
45
+ Concierge chat is the natural-language interface to your sovereignty primitives. "What's going on?" returns a summary from the audit log. "Why did my Hermes agent stop?" looks up recent gate triggers and explains. "Approve all GitHub-read requests" batch-approves. "What does my Hermes agent have access to?" introspects policy. "Give me a portable bundle of everything" triggers exit bundle generation.
46
+
47
+ You do not sit in Sanctuary. Sanctuary sits with you.
16
48
 
17
49
  ## Quick start
18
50
 
@@ -50,21 +82,22 @@ On first launch, Sanctuary will:
50
82
 
51
83
  1. Derive a master encryption key from your passphrase (Argon2id)
52
84
  2. Create the storage directory (`~/.sanctuary/`)
53
- 3. Display a recovery key if no passphrase is set (save it shown once)
85
+ 3. Display a recovery key if no passphrase is set (save it; shown once)
86
+ 4. Walk you through the first-run wizard for the egress filter (which endpoints to pre-allow vs prompt for); macOS plus Linux Phase 1, Windows Phase 2
54
87
 
55
88
  ## Key protection modes
56
89
 
57
90
  Sanctuary supports three key protection modes:
58
91
 
59
- - **Passphrase** Master key derived via Argon2id. Set `SANCTUARY_PASSPHRASE` env var.
60
- - **Recovery key** Random master key generated on first run. Recovery key displayed once.
61
- - **Hardware key** FIDO2/WebAuthn support planned for v0.3.0.
92
+ - **Passphrase.** Master key derived via Argon2id. Set `SANCTUARY_PASSPHRASE` env var.
93
+ - **Recovery key.** Random master key generated on first run. Recovery key displayed once.
94
+ - **Hardware key.** FIDO2/WebAuthn support planned for v0.3.0.
62
95
 
63
96
  ## MCP tools
64
97
 
65
- Once connected, your agent has access to these tools:
98
+ Once connected, your agent has access to these tools, organized by capability surface within Cooperative MCP (Castle Layer 3).
66
99
 
67
- ### L1 — Cognitive Sovereignty
100
+ ### Cognitive Sovereignty
68
101
  | Tool | Description |
69
102
  |------|-------------|
70
103
  | `sanctuary/identity_create` | Create a new Ed25519 identity |
@@ -75,20 +108,20 @@ Once connected, your agent has access to these tools:
75
108
  | `sanctuary/state_write` | Write encrypted state (signed, Merkle-verified) |
76
109
  | `sanctuary/state_read` | Read and verify encrypted state |
77
110
  | `sanctuary/state_list` | List keys in a namespace |
78
- | `sanctuary/state_delete` | Securely delete state (overwrite + unlink) |
111
+ | `sanctuary/state_delete` | Securely delete state (overwrite plus unlink) |
79
112
  | `sanctuary/state_export` | Export state as encrypted portable bundle |
80
113
  | `sanctuary/state_import` | Import state bundle with conflict resolution |
81
114
 
82
- ### L2 — Operational Isolation
115
+ ### Operational Isolation
83
116
  | Tool | Description |
84
117
  |------|-------------|
85
118
  | `sanctuary/exec_attest` | Environment attestation with sovereignty assessment |
86
- | `sanctuary/monitor_health` | Sanctuary Health Report (all four layers) |
119
+ | `sanctuary/monitor_health` | Sanctuary Health Report (all four capability surfaces) |
87
120
  | `sanctuary/monitor_audit_log` | Query the sovereignty audit log |
88
121
  | `sanctuary/principal_policy_view` | View the current Principal Policy (read-only) |
89
122
  | `sanctuary/principal_baseline_view` | View the behavioral baseline profile (read-only) |
90
123
 
91
- ### L3 — Selective Disclosure
124
+ ### Selective Disclosure
92
125
  | Tool | Description |
93
126
  |------|-------------|
94
127
  | `sanctuary/proof_commitment` | Create a SHA-256 cryptographic commitment |
@@ -101,7 +134,7 @@ Once connected, your agent has access to these tools:
101
134
  | `sanctuary/zk_range_prove` | Prove a value is in [min, max] without revealing it |
102
135
  | `sanctuary/zk_range_verify` | Verify a ZK range proof |
103
136
 
104
- ### L4 — Verifiable Reputation
137
+ ### Verifiable Reputation
105
138
  | Tool | Description |
106
139
  |------|-------------|
107
140
  | `sanctuary/reputation_record` | Record signed interaction attestation (sovereignty-weighted) |
@@ -126,14 +159,14 @@ Once connected, your agent has access to these tools:
126
159
  ### Concordia Bridge
127
160
  | Tool | Description |
128
161
  |------|-------------|
129
- | `sanctuary/bridge_commit` | Bind a Concordia negotiation outcome to a Sanctuary L3 commitment |
162
+ | `sanctuary/bridge_commit` | Bind a Concordia negotiation outcome to a Sanctuary commitment |
130
163
  | `sanctuary/bridge_verify` | Verify a bridge commitment against a revealed outcome |
131
- | `sanctuary/bridge_attest` | Record a negotiation as an L4 reputation attestation |
164
+ | `sanctuary/bridge_attest` | Record a negotiation as a reputation attestation |
132
165
 
133
166
  ### Meta
134
167
  | Tool | Description |
135
168
  |------|-------------|
136
- | `sanctuary/manifest` | Sanctuary Interface Manifest (SIM) machine-readable capabilities |
169
+ | `sanctuary/manifest` | Sanctuary Interface Manifest (SIM); machine-readable capabilities |
137
170
  | `sanctuary/shr_generate` | Generate signed, machine-readable sovereignty health report |
138
171
  | `sanctuary/shr_verify` | Verify a counterparty's SHR |
139
172
 
@@ -143,47 +176,63 @@ Environment variables:
143
176
 
144
177
  | Variable | Description | Default |
145
178
  |----------|-------------|---------|
146
- | `SANCTUARY_PASSPHRASE` | Passphrase for master key derivation | _(none uses recovery key)_ |
179
+ | `SANCTUARY_PASSPHRASE` | Passphrase for master key derivation | _(none; uses recovery key)_ |
147
180
  | `SANCTUARY_STORAGE_PATH` | Storage directory path | `~/.sanctuary` |
148
181
  | `SANCTUARY_TRANSPORT` | Transport mode (`stdio` or `http`) | `stdio` |
149
182
  | `SANCTUARY_DASHBOARD_ENABLED` | Enable web dashboard (`true`/`false`) | `false` |
150
183
  | `SANCTUARY_DASHBOARD_PORT` | Dashboard port | `3501` |
151
- | `SANCTUARY_DASHBOARD_AUTH_TOKEN` | Bearer token (`"auto"` to generate) | |
152
- | `SANCTUARY_DASHBOARD_TLS_CERT` | TLS certificate path | |
153
- | `SANCTUARY_DASHBOARD_TLS_KEY` | TLS private key path | |
184
+ | `SANCTUARY_DASHBOARD_AUTH_TOKEN` | Bearer token (`"auto"` to generate) | _(none)_ |
185
+ | `SANCTUARY_DASHBOARD_TLS_CERT` | TLS certificate path | _(none)_ |
186
+ | `SANCTUARY_DASHBOARD_TLS_KEY` | TLS private key path | _(none)_ |
154
187
  | `SANCTUARY_WEBHOOK_ENABLED` | Enable webhook approvals | `false` |
155
- | `SANCTUARY_WEBHOOK_URL` | Webhook target URL | |
156
- | `SANCTUARY_WEBHOOK_SECRET` | HMAC-SHA256 shared secret | |
188
+ | `SANCTUARY_WEBHOOK_URL` | Webhook target URL | _(none)_ |
189
+ | `SANCTUARY_WEBHOOK_SECRET` | HMAC-SHA256 shared secret | _(none)_ |
157
190
  | `SANCTUARY_WEBHOOK_CALLBACK_PORT` | Callback listener port | `3502` |
158
191
 
159
- ## Running Alongside Another MCP Server
192
+ ## Running alongside another MCP server
160
193
 
161
- Sanctuary is designed to run as a parallel MCP server it adds sovereignty infrastructure to your agent without replacing any of its existing tools. Both servers appear in the same session as independent tool providers.
194
+ Sanctuary is designed to run as a parallel MCP server. It adds the substrate underneath your agent without replacing any of its existing tools. Both servers appear in the same session as independent tool providers. Castle Wall enforcement (Layer 1) operates at the OS level regardless of which MCP servers the agent uses; the wall sees egress, not MCP routing.
162
195
 
163
- For the full setup guide (installation options, passphrase management, systemd units), see [`docs/DEPLOYMENT.md`](docs/DEPLOYMENT.md).
196
+ For the full setup guide (installation options, passphrase management, systemd units, egress filter configuration), see [`docs/DEPLOYMENT.md`](docs/DEPLOYMENT.md).
164
197
 
165
198
  For a reference MCP config, see [`docs/examples/parallel-mcp-config.json`](docs/examples/parallel-mcp-config.json).
166
199
 
167
200
  For always-on agents with latency constraints, use the `persistent-agent` Principal Policy template which auto-allows routine operations and only gates destructive actions. See [`src/principal-policy/templates/persistent-agent.yaml`](src/principal-policy/templates/persistent-agent.yaml).
168
201
 
169
- ## Principal Policy (prompt injection defense)
202
+ ## Principal Policy (cooperative gate, Castle Layer 3)
170
203
 
171
- The Principal Policy is the human-controlled, agent-immutable configuration that gates operations through a three-tier approval system. It sits between the MCP router and every tool handler no tool call can bypass it.
204
+ The Principal Policy is the human-controlled, agent-immutable configuration that gates operations through a three-tier approval system within the Cooperative MCP layer. It sits between the MCP router and every tool handler. No tool call routed through Sanctuary can bypass it.
172
205
 
173
- **Tier 1 Always requires approval:** High-risk operations like `state_export`, `state_import`, `identity_rotate`, and `reputation_import` always require explicit human approval before execution.
206
+ **Tier 1: Always requires approval.** High-risk operations like `state_export`, `state_import`, `identity_rotate`, and `reputation_import` always require explicit human approval before execution.
174
207
 
175
- **Tier 2 Behavioral anomaly detection:** The system tracks a behavioral baseline (namespaces accessed, counterparties seen, signing frequency, read patterns). Deviations trigger approval a compromised agent accessing unfamiliar data or signing at unusual rates is caught automatically.
208
+ **Tier 2: Behavioral anomaly detection.** The system tracks a behavioral baseline (namespaces accessed, counterparties seen, signing frequency, read patterns). Deviations trigger approval; a compromised agent accessing unfamiliar data or signing at unusual rates is caught automatically.
176
209
 
177
- **Tier 3 Always allowed (audit only):** Standard read/write/sign operations pass through without interruption, but every operation is audit-logged.
210
+ **Tier 3: Always allowed (audit only).** Standard read/write/sign operations pass through without interruption, but every operation is audit-logged.
178
211
 
179
- The policy file lives at `~/.sanctuary/principal-policy.yaml`. It is loaded once at startup and frozen no MCP tool can modify it. The agent cannot see the policy rules in denial responses (preventing attacker learning). Approval requests flow through out-of-band channels the agent cannot access. Three channels are available: **stderr** (default, auto-deny), **dashboard** (browser-based web UI with real-time SSE, optional bearer token auth and TLS), and **webhook** (POST to external endpoints like Slack or Discord with HMAC-SHA256 signatures).
212
+ The policy file lives at `~/.sanctuary/principal-policy.yaml`. It is loaded once at startup and frozen; no MCP tool can modify it. The agent cannot see the policy rules in denial responses (preventing attacker learning). Approval requests flow through OS notifications (Castle Layer 1 surface), the menubar dashboard, or external webhooks (Slack, Discord, etc., with HMAC-SHA256 signatures).
180
213
 
181
- On first session, non-Tier-3 operations require approval (no baseline exists yet). As the system learns normal patterns, approval fatigue decreases you only get asked about genuinely unusual behavior.
214
+ On first session, non-Tier-3 operations require approval (no baseline exists yet). As the system learns normal patterns, approval fatigue decreases; you only get asked about genuinely unusual behavior.
182
215
 
183
216
  See [`rfcs/RFC-0002-principal-policy-operational-approval.md`](../rfcs/RFC-0002-principal-policy-operational-approval.md) for the complete specification.
184
217
 
185
218
  ## Security model
186
219
 
220
+ Sanctuary's security claims are structural, not cooperative-only.
221
+
222
+ **Layer 1 enforcement (Castle Wall, OS-level egress filter; ships in v1.x):**
223
+ - Outbound network calls intercepted by the kernel before leaving the operator's machine
224
+ - Linux netfilter / NFQUEUE, macOS Network Extension or pf rules, Windows Filtering Platform
225
+ - Per-process policy with per-agent-template defaults
226
+ - Default-deny outbound with first-run wizard pre-allowing common developer endpoints
227
+ - Performance overhead under 10ms p99 on allowed traffic
228
+ - Even prompt-injected agents cannot bypass the wall
229
+
230
+ **Layer 2 observation (Sentinels; ships in v1.3):**
231
+ - Process introspection via eBPF and syscall observation
232
+ - Behavioral baselining with anomaly detection
233
+ - Anomalies surface via OS notifications, not blocks
234
+
235
+ **Layer 3 cooperative primitives (Cooperative MCP additive surface):**
187
236
  - AES-256-GCM authenticated encryption with unique 12-byte IVs (NIST SP 800-38D)
188
237
  - Ed25519 keypairs for identity and signing
189
238
  - Argon2id key derivation (m=64MB, t=3, p=4) for passphrase protection
@@ -194,7 +243,13 @@ See [`rfcs/RFC-0002-principal-policy-operational-approval.md`](../rfcs/RFC-0002-
194
243
  - Monotonic version numbers prevent state rollback
195
244
  - Principal Policy gates every tool call (three-tier approval)
196
245
  - Behavioral baseline detects anomalous agent behavior
197
- - Approval channel (stderr) is outside MCP protocol agent cannot intercept
246
+ - Approval channel (stderr) is outside MCP protocol; agent cannot intercept
247
+
248
+ **Layer 4 cross-castle accountability:**
249
+ - Concordia receipts for cross-castle commitments
250
+ - Verascore reputation aggregating across operators
251
+ - Portable reputation bundles for cross-platform portability
252
+ - Signed audit trails as compliance evidence
198
253
 
199
254
  ## Development
200
255
 
@@ -206,7 +261,9 @@ npm run build
206
261
  npm test
207
262
  ```
208
263
 
209
- ## Architecture
264
+ ## Architecture (source tree)
265
+
266
+ The directory layout below reflects v1.2 shipped reality plus annotated v1.x and v1.3 placeholders for the Castle Wall and Sentinels work packages. Capability-surface directory names are the legacy `l1-l4-` prefixes; a follow-on cleanup pass renames them to plain capability names (`cognitive/`, `operational/`, `disclosure/`, `reputation/`) so the prefixes do not collide with Castle Layer numbering. The cleanup is non-gating; references in tooling and tests carry over either way.
210
267
 
211
268
  ```
212
269
  src/
@@ -217,41 +274,44 @@ src/
217
274
  │ ├── key-derivation.ts # Argon2id, HKDF
218
275
  │ ├── encoding.ts # Base64url, constant-time compare
219
276
  │ └── random.ts # CSPRNG
277
+ ├── castle-wall/ # Castle Layer 1: OS-level egress enforcement (planned, ships with WP-V1.x-CASTLE-WALL)
278
+ ├── sentinels/ # Castle Layer 2: internal observation (planned, ships with v1.3 WP-V1.3-1, -2)
220
279
  ├── storage/ # Pluggable storage backends
221
280
  │ ├── interface.ts # Abstract StorageBackend
222
281
  │ ├── filesystem.ts # Encrypted filesystem (default)
223
282
  │ └── memory.ts # In-memory (testing)
224
- ├── l1-cognitive/ # L1: Encrypted state + identity
283
+ ├── l1-cognitive/ # Capability surface 1 (Castle Layer 3): encrypted state plus identity
225
284
  │ ├── state-store.ts # StateStore with Merkle verification
226
285
  │ └── tools.ts # MCP tool definitions
227
- ├── l2-operational/ # L2: Attestation + monitoring
286
+ ├── l2-operational/ # Capability surface 2 (Castle Layer 3): attestation plus monitoring
228
287
  │ └── audit-log.ts # Encrypted append-only audit log
229
- ├── l3-disclosure/ # L3: Commitments + ZK proofs + policies
288
+ ├── l3-disclosure/ # Capability surface 3 (Castle Layer 3): commitments plus ZK proofs plus policies
230
289
  │ ├── commitments.ts # SHA-256 commitment schemes
231
290
  │ ├── zk-proofs.ts # Pedersen/Ristretto255, Schnorr proofs, range proofs
232
291
  │ ├── policies.ts # Disclosure policy engine
233
292
  │ └── tools.ts # MCP tool definitions
234
- ├── l4-reputation/ # L4: Reputation + bootstrap + tiers
293
+ ├── l4-reputation/ # Capability surface 4 (Castle Layer 3): reputation plus bootstrap plus tiers
235
294
  │ ├── reputation-store.ts # Signed attestations, escrow, guarantees
236
295
  │ ├── tiers.ts # Sovereignty-gated reputation tiers
237
296
  │ └── tools.ts # MCP tool definitions
238
297
  ├── shr/ # Machine-readable sovereignty health reports
239
298
  ├── handshake/ # Sovereignty handshake protocol
240
299
  ├── federation/ # MCP-to-MCP federation registry
241
- ├── bridge/ # Concordia bridge (negotiation sovereignty)
242
- │ ├── types.ts # Interface contract (ConcordiaOutcome, BridgeCommitment)
300
+ ├── bridge/ # Concordia bridge (negotiation to sovereignty)
301
+ │ ├── types.ts # Interface contract
243
302
  │ ├── bridge.ts # Core: canonicalize, commit, verify
244
- │ └── tools.ts # MCP tools + BridgeStore
245
- ├── principal-policy/ # Principal Policy (prompt injection defense)
303
+ │ └── tools.ts # MCP tools plus BridgeStore
304
+ ├── principal-policy/ # Principal Policy (Cooperative MCP gate, Castle Layer 3)
246
305
  │ ├── types.ts # Policy, gate, baseline type definitions
247
- │ ├── loader.ts # YAML/JSON policy parser + defaults
306
+ │ ├── loader.ts # YAML/JSON policy parser plus defaults
248
307
  │ ├── baseline.ts # Behavioral baseline tracker (encrypted)
249
- │ ├── approval-channel.ts # Stderr + callback approval channels
250
- │ ├── dashboard.ts # Browser-based approval UI (SSE, auth, TLS)
251
- │ ├── dashboard-html.ts # Embedded HTML/CSS/JS template
308
+ │ ├── approval-channel.ts # OS notification plus stderr plus webhook channels
309
+ │ ├── menubar/ # macOS / Linux / Windows menubar status app (v1.2)
252
310
  │ ├── webhook.ts # External webhook approval (HMAC-SHA256)
253
311
  │ ├── gate.ts # Three-tier approval gate
254
312
  │ └── tools.ts # Read-only policy/baseline MCP tools
313
+ ├── chat/ # Concierge chat: operator-to-Sanctuary natural-language surface (v1.2)
314
+ │ # Direct-agent chat surfaces removed in the v1.2 chat-removal pass.
255
315
  ├── router.ts # MCP SDK tool router (with gate integration)
256
316
  ├── config.ts # Configuration management
257
317
  ├── index.ts # Server factory
@@ -260,7 +320,7 @@ src/
260
320
 
261
321
  ## Specification
262
322
 
263
- See [`rfcs/RFC-0001-sanctuary-mcp-server.md`](../rfcs/RFC-0001-sanctuary-mcp-server.md) for the core specification and [`rfcs/RFC-0002-principal-policy-operational-approval.md`](../rfcs/RFC-0002-principal-policy-operational-approval.md) for the Principal Policy specification.
323
+ See [`rfcs/RFC-0001-sanctuary-mcp-server.md`](../rfcs/RFC-0001-sanctuary-mcp-server.md) for the core specification, [`rfcs/RFC-0002-principal-policy-operational-approval.md`](../rfcs/RFC-0002-principal-policy-operational-approval.md) for the Principal Policy specification, and [`rfcs/RFC-0003-castle-architecture.md`](../rfcs/RFC-0003-castle-architecture.md) for the Castle Architecture specification.
264
324
 
265
325
  ## License
266
326