Share one crew across the install, keep user memory per user

Bots, workspaces and computers now belong to the install. Users reach
workers only through bot_users (assigned by a super admin or admin) and
workspace_users; the coordinator and main computer are one per install,
and only the super admin sees the coordinator. Conversations are per
user (bot_sessions.user_id), jobs run for the session's user, and live
updates go only to who should see them.

A bot's core memory is now general knowledge shared by every user it
works for; what it learns about a user lives in bot_user_memories.

One-off scripts move existing installs over: move-bot-memory-to-owners
(run first), then share-crew.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-19 11:37:14 +01:00
co-authored by Claude Opus 5.5
parent 4dd34ed251
commit e45d54d30b
133 changed files with 1854 additions and 436 deletions
+5 -2
View File
@@ -6,7 +6,8 @@ describe("composeBotPrompt", () => {
expect(
composeBotPrompt({
system_prompt: "# You are Scout\n\nFind things.",
memory: "- The user prefers short replies.",
memory: "- Cite sources.",
user_memory: "- The user prefers short replies.",
workspace: {
name: "Launch",
description: "The spring launch.",
@@ -22,7 +23,8 @@ describe("composeBotPrompt", () => {
"# You are Scout\n\nFind things.",
`# Workspace: Launch\n\nYou're working in the workspace "Launch". Follow its context and your instructions for it below, over your general habits where they differ.\n\nThe spring launch.\n\nShip by Friday.`,
"# Your instructions in Launch\n\nOwn the changelog.",
"# Memory\n\n- The user prefers short replies.",
"# Memory\n\n- Cite sources.",
"# Memory about the user\n\n- The user prefers short replies.",
"# Memory in Launch\n\n- Marketing signs off on copy.",
].join("\n\n"),
);
@@ -33,6 +35,7 @@ describe("composeBotPrompt", () => {
composeBotPrompt({
system_prompt: "Core.",
memory: " ",
user_memory: "",
workspace_bot: { system_prompt: "Ignored." },
}),
).toBe("Core.");