a tool to help your Letta AI agents navigate bluesky

Compare changes

Choose any two refs to compare.

Changed files
+6 -11
utils
+1
.env.example
··· 24 24 # AUTOMATION_DESCRIPTION="refuses to open pod bay doors" 25 25 # DISCLOSURE_URL="example.com/bot-policy" 26 26 # RESPONSIBLE_PARTY_BSKY="DID:... or example.bsky.app, no @symbol" 27 + # EXTERNAL_SERVICES="Letta, Railway, Google Gemini 2.5-pro" 27 28 # PRESERVE_MEMORY_BLOCKS=true
+1
README.md
··· 52 52 - **`AUTOMATION_DESCRIPTION`**: a description of what your agent generally does on bluesky. 53 53 - **`DISCLOSURE_URL`**: a URL to a disclosure document of some kind, likely a longer version of your `AUTOMATION_DESCRIPTION`. 54 54 - **`RESPONSIBLE_PARTY_BSKY`**: the DID or bluesky handle of the responsible party 55 + - **`EXTERNAL_SERVICES`**: a comma-separated list of external tools and services your agent relies on outside of Bluesky (e.g., "Letta, Railway, Google Gemini 2.5-pro"). This information is added to your agent's autonomy declaration record on the PDS and included in the agent's memory for transparency. 55 56 - **`PRESERVE_MEMORY_BLOCKS`**: a boolean for controlling if your agent's memory blocks can be overridden if you run `deno task mount` more than once. Setting this value to **`true`** will allow your agent's version of those memory blocks to persist if they already exist. This is false by default.
+4 -11
utils/declaration.ts
··· 1 1 import { bsky } from "../utils/bsky.ts"; 2 2 import type { AutonomyDeclarationRecord } from "./types.ts"; 3 3 import { Lexicons } from "@atproto/lexicon"; 4 + import { agentContext } from "./agentContext.ts"; 4 5 5 6 export const AUTONOMY_DECLARATION_LEXICON = { 6 7 "lexicon": 1, ··· 103 104 const automationLevel = Deno.env.get("AUTOMATION_LEVEL")?.toLowerCase(); 104 105 const projectDescription = Deno.env.get("PROJECT_DESCRIPTION"); 105 106 const disclosureUrl = Deno.env.get("DISCLOSURE_URL"); 106 - const externalServicesEnv = Deno.env.get("EXTERNAL_SERVICES"); 107 107 108 108 const responsiblePartyType = Deno.env.get("RESPONSIBLE_PARTY_TYPE") 109 109 ?.toLowerCase(); ··· 132 132 declarationRecord.disclosureUrl = disclosureUrl.trim(); 133 133 } 134 134 135 - // Add external services if provided 136 - if (externalServicesEnv?.trim()) { 137 - const services = externalServicesEnv 138 - .split(",") 139 - .map((service) => service.trim()) 140 - .filter((service) => service.length > 0); 141 - 142 - if (services.length > 0) { 143 - declarationRecord.externalServices = services; 144 - } 135 + // Add external services from agentContext (already parsed and validated) 136 + if (agentContext.externalServices) { 137 + declarationRecord.externalServices = agentContext.externalServices; 145 138 } 146 139 147 140 // Build responsible party object if any fields are provided