Tell every bot its own id, in every run

The bot's id never reached its prompt: `composeBotPrompt` only took its
instructions, the appendix, its memory and its workspace, and
`grabBotPrompt` never passed `bot.id` or `bot.name` on. A bot could only
learn its id by accident, from a tool description that named it, so
"which bot am I" was unanswerable in most contexts.

- Open the prompt with who the bot is (`composeIdentity`): its name,
  whether it's the coordinator or a worker, its role, and its id, said
  to be how tools and refs point back at it. `grabBotPrompt` now passes
  the bot, which covers chat replies, tasks, routines and delegated
  tasks, since both runners build their prompt there.
- Turn the notes' example refs into functions bound to the running bot:
  `chatReplyNote`, `botFilesNote` and `coordinatorReplyNote` take its id,
  so the folder-ref example no longer points at a hardcoded `owner_id: 5`
  (another bot's folder) nor `[bot:3]`. ComputerFilesNote keeps the
  computer it's given.
- Stop `create_task` from hiding the worker's own id in its own chat.

Tests: four new `composeBotPrompt` cases pin the identity block (worker,
coordinator, unnamed, no bot at all), and a new `harness-prompts.test.ts`
checks each note's own-folder and self refs point at exactly the running
bot, for three ids.
This commit is contained in:
2026-10-23 17:40:28 +01:00
parent 0166f31cfc
commit 4261535741
8 changed files with 187 additions and 23 deletions
@@ -19,10 +19,10 @@ type Params = {
};
/**
* The full prompt for one of the user's bots (`composeBotPrompt`): its
* core instructions, the install-wide appendix, its memory, what it
* remembers about this user, and in a workspace that workspace's context
* and what the bot has for it.
* The full prompt for one of the user's bots (`composeBotPrompt`): who it
* is (its name and id), its core instructions, the install-wide appendix,
* its memory, what it remembers about this user, and in a workspace that
* workspace's context and what the bot has for it.
*/
export default async function grabBotPrompt({ bot_id, user_id, workspace_id }: Params) {
const bot = await grabUserBot({ bot_id, user_id });
@@ -40,6 +40,7 @@ export default async function grabBotPrompt({ bot_id, user_id, workspace_id }: P
}
return composeBotPrompt({
bot: { id: bot.id, name: bot.name, kind: bot.kind, role: bot.role },
system_prompt: bot.system_prompt,
appendix: await grabSystemPromptAppend(),
memory: bot.memory,