Skip to content

Commit 52038bc

Browse files
committed
Scope semantic persistence by tenant
1 parent ed9d565 commit 52038bc

15 files changed

Lines changed: 329 additions & 89 deletions

File tree

apps/host_surface/test/outer_brain/host_surface_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ defmodule OuterBrain.HostSurfaceTest do
1414
HostSurface.open_session(
1515
"session_alpha",
1616
"console_host",
17+
tenant_id: "tenant://host/a",
1718
now: DateTime.from_unix!(1_800_000_700),
1819
epoch: 1,
1920
ttl_seconds: 30,

core/memory_engine/test/outer_brain/memory_engine_test.exs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ defmodule OuterBrain.MemoryEngineTest do
33

44
alias OuterBrain.MemoryEngine
55

6+
@moduletag :tenant_isolation
7+
68
test "memory writes return refs and evidence without raw bodies" do
79
store = MemoryEngine.new()
810

core/outer_brain_persistence/lib/outer_brain/persistence/schemas/recovery_task.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule OuterBrain.Persistence.Schemas.RecoveryTask do
88
@primary_key {:task_id, :string, autogenerate: false}
99

1010
schema "recovery_tasks" do
11+
field(:tenant_id, :string)
1112
field(:session_id, :string)
1213
field(:reason, :string)
1314
field(:status, Ecto.Enum, values: [:pending, :running, :done])
@@ -17,7 +18,7 @@ defmodule OuterBrain.Persistence.Schemas.RecoveryTask do
1718

1819
def changeset(schema, attrs) do
1920
schema
20-
|> cast(attrs, [:task_id, :session_id, :reason, :status])
21-
|> validate_required([:task_id, :session_id, :reason, :status])
21+
|> cast(attrs, [:task_id, :tenant_id, :session_id, :reason, :status])
22+
|> validate_required([:task_id, :tenant_id, :session_id, :reason, :status])
2223
end
2324
end

core/outer_brain_persistence/lib/outer_brain/persistence/schemas/reply_publication.ex

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule OuterBrain.Persistence.Schemas.ReplyPublication do
88
@primary_key {:publication_id, :string, autogenerate: false}
99

1010
schema "reply_publications" do
11+
field(:tenant_id, :string)
1112
field(:causal_unit_id, :string)
1213
field(:phase, Ecto.Enum, values: [:provisional, :final])
1314
field(:state, Ecto.Enum, values: [:pending, :published, :suppressed])
@@ -22,6 +23,7 @@ defmodule OuterBrain.Persistence.Schemas.ReplyPublication do
2223
schema
2324
|> cast(attrs, [
2425
:publication_id,
26+
:tenant_id,
2527
:causal_unit_id,
2628
:phase,
2729
:state,
@@ -31,13 +33,14 @@ defmodule OuterBrain.Persistence.Schemas.ReplyPublication do
3133
])
3234
|> validate_required([
3335
:publication_id,
36+
:tenant_id,
3437
:causal_unit_id,
3538
:phase,
3639
:state,
3740
:dedupe_key,
3841
:body,
3942
:body_ref
4043
])
41-
|> unique_constraint(:dedupe_key)
44+
|> unique_constraint([:tenant_id, :dedupe_key])
4245
end
4346
end

core/outer_brain_persistence/lib/outer_brain/persistence/schemas/semantic_journal_entry.ex

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule OuterBrain.Persistence.Schemas.SemanticJournalEntry do
88
@primary_key {:entry_id, :string, autogenerate: false}
99

1010
schema "semantic_journal_entries" do
11+
field(:tenant_id, :string)
1112
field(:session_id, :string)
1213
field(:causal_unit_id, :string)
1314
field(:entry_type, :string)
@@ -19,9 +20,18 @@ defmodule OuterBrain.Persistence.Schemas.SemanticJournalEntry do
1920

2021
def changeset(schema, attrs) do
2122
schema
22-
|> cast(attrs, [:entry_id, :session_id, :causal_unit_id, :entry_type, :payload, :recorded_at])
23+
|> cast(attrs, [
24+
:entry_id,
25+
:tenant_id,
26+
:session_id,
27+
:causal_unit_id,
28+
:entry_type,
29+
:payload,
30+
:recorded_at
31+
])
2332
|> validate_required([
2433
:entry_id,
34+
:tenant_id,
2535
:session_id,
2636
:causal_unit_id,
2737
:entry_type,

core/outer_brain_persistence/lib/outer_brain/persistence/schemas/semantic_session_lease.ex

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule OuterBrain.Persistence.Schemas.SemanticSessionLease do
88
@primary_key {:row_id, :string, autogenerate: false}
99

1010
schema "semantic_session_leases" do
11+
field(:tenant_id, :string)
1112
field(:session_id, :string)
1213
field(:holder, :string)
1314
field(:lease_id, :string)
@@ -19,8 +20,16 @@ defmodule OuterBrain.Persistence.Schemas.SemanticSessionLease do
1920

2021
def changeset(schema, attrs) do
2122
schema
22-
|> cast(attrs, [:row_id, :session_id, :holder, :lease_id, :epoch, :expires_at])
23-
|> validate_required([:row_id, :session_id, :holder, :lease_id, :epoch, :expires_at])
24-
|> unique_constraint(:session_id)
23+
|> cast(attrs, [:row_id, :tenant_id, :session_id, :holder, :lease_id, :epoch, :expires_at])
24+
|> validate_required([
25+
:row_id,
26+
:tenant_id,
27+
:session_id,
28+
:holder,
29+
:lease_id,
30+
:epoch,
31+
:expires_at
32+
])
33+
|> unique_constraint([:tenant_id, :session_id])
2534
end
2635
end

0 commit comments

Comments
 (0)