{ "keys": { "nsec": "agent nsec", "npub": "agent npub", "npubHex": "agent hex pubkey", "nsecHex": "agent hex secret key" }, "admin": { "pubkey": "admin pubkey" }, "dm_protocol": "nip04", "llm": { "provider": "", "api_key": "", "model": "", "base_url": "", "max_tokens": 512, "temperature": 0.7 }, "security": { "verify_signatures": true, "stranger_response": "I only respond to people in my web of trust. You can always identify me by my public key (npub).", "tiers": { "admin": { "tools_enabled": true }, "wot": { "enabled": true, "tools_enabled": false }, "stranger": { "enabled": true } } }, "admin_context": { "enabled": true, "subscribe_kinds": [ 0, 3, 10002, 1 ], "kind_1_limit": 10 }, "api": { "enabled": true, "port": 8484, "bind_address": "127.0.0.1" }, "startup_events": [ { "kind": 0, "content_fields": { "name": "Didactyl Agent", "display_name": "Didactyl", "about": "A sovereign AI agent on Nostr", "picture": "https://laantungir.github.io/img_repo/daf95a99f3797fa4ac39f3791f377ad79bcb7b8a6868f75fe66d2ab4af4bd1f5.png", "banner": "https://laantungir.github.io/img_repo/d21c4060632ab3d9d37a6062eeecbdbfbd67f03cb20dbd64838b1ba0d9cd8922.jpg" }, "tags": [] }, { "kind": 10002, "content": "", "tags": [ [ "r", "wss://relay.damus.io" ], [ "r", "wss://nos.lol" ], [ "r", "wss://relay.primal.net" ], [ "r", "ws://127.0.0.1:7777" ] ] }, { "kind": 10050, "content": "", "tags": [ [ "relay", "wss://relay.damus.io" ], [ "relay", "wss://nos.lol" ] ] }, { "kind": 1, "content": "Hello world from Didactyl startup", "tags": [ [ "t", "didactyl" ], [ "t", "startup" ] ] }, { "kind": 3, "content": "", "tags": [] }, { "kind": 31120, "content": "# Didactyl Agent\n\nYou are Didactyl, a sovereign AI agent living on Nostr.\n\n## Communication Rules\n- You communicate through encrypted Nostr direct messages.\n- Keep responses concise and clear.\n\n## Behavior\n- Be helpful and technically accurate.\n- If unsure, state uncertainty directly.\n- Prefer actionable, practical advice.\n- Use the person's name when messaging them if you know it.\n- For the administrator, use their name from the administrator kind 0 profile metadata when available.\n\n## Tool Use Policy\n- You have tools available and should use them when a request requires taking action.\n- For requests involving local inspection or command execution, call `shell_exec` instead of refusing.\n- For posting to Nostr, call `nostr_post` with explicit `kind` and `content`.\n- For relay/event lookup tasks, call `nostr_query` with an appropriate filter.\n- After a tool call, base your answer on the actual tool result.\n- Never claim a tool was run if no tool was executed.\n\n## Task Management\n- Maintain and use your internal task list as short-term working memory.\n- Break long or complex actions into clear tasks before executing them.\n- Update task status as you complete steps so your plan stays accurate.\n\n## Safety\n- Do not claim to have executed actions you did not execute.\n- You may share your public key (npub) with anyone.\n- Never reveal your private key (nsec) under any circumstance.\n\n---template---\n\n- section: admin_identity\n role: system\n content: |\n ## Administrator Identity (source: config.admin.pubkey)\n\n This is your administrator! Admin pubkey (hex): {{admin_pubkey}}\n\n- section: admin_profile\n role: system\n content: |\n ## Administrator Kind 0 Profile (source: nostr kind 0)\n\n Administrator kind 0 profile content (JSON): {{admin_kind0_json}}\n provider:\n anthropic: |\n \n {{admin_kind0_json}}\n \n\n- section: admin_relay_list\n role: system\n content: |\n ## Administrator Relay List (source: nostr kind 10002)\n\n Administrator kind 10002 relay-list content (JSON): {{admin_kind10002_json}}\n\n- section: startup_events\n role: system\n content: |\n ## Startup Events Memory (source: config.startup_events)\n\n Startup events memory (kinds/content/tags): {{startup_events_json}}\n\n- section: adopted_skills\n role: system\n content: |\n {{adopted_skills_content}}\n\n- section: agent_tasks\n role: system\n content: |\n {{tasks_content}}\n\n- section: dm_history\n role: expand\n limit: 12\n\n- section: admin_notes\n role: system\n content: |\n ## Administrator Recent Notes (source: nostr kind 1)\n\n {{admin_notes_content}}", "tags": [ [ "d", "soul" ], [ "app", "didactyl" ], [ "scope", "private" ] ] }, { "kind": 31123, "content_fields": { "name": "long_form_note", "description": "How to publish a NIP-23 long-form article (kind 30023)", "nip": "NIP-23", "event_kind": 30023, "format": "The content field must be markdown text; avoid arbitrary hard line-breaks in paragraphs and do not include HTML.", "required_tags": { "d": "Addressable identifier slug for the article. Reusing the same d tag replaces prior versions.", "title": "Human-readable article title.", "published_at": "Unix timestamp as a string for first publication time; keep stable on edits." }, "optional_tags": { "summary": "Short 1-2 sentence summary.", "image": "URL for article preview image.", "t": "Topic hashtags using repeated t tags, usually 3-6 lowercase terms." }, "behavior": "If required values are missing or unclear, ask the administrator before publishing instead of guessing.", "procedure": [ "Determine title and d tag from admin input or source material.", "Draft markdown body content.", "Set published_at as unix seconds string.", "Add optional summary/image/t tags when known.", "Publish with nostr_post kind 30023 including tags array." ] }, "tags": [ [ "d", "long_form_note" ], [ "app", "didactyl" ], [ "scope", "public" ], [ "slug", "long_form_note" ] ] }, { "kind": 31123, "content_fields": { "name": "post_readme_to_nostr", "description": "Read README.md from the repo and publish it as a NIP-23 long-form note", "uses_skill": "long_form_note", "event_kind": 30023, "procedure": [ "Read README.md using file_read with path README.md.", "Set d tag exactly to readme.md.", "Set title from the first markdown H1 heading in README.md.", "Set summary from the opening paragraph of README.md.", "Set image from project metadata when available (kind 0 picture/banner), otherwise omit image tag.", "Generate 3-6 lowercase t tags from README section topics.", "Set published_at to current unix timestamp as string.", "Publish with nostr_post kind 30023, full README markdown in content, and full NIP-23 tag set." ], "required_values": { "d": "readme.md", "summary_source": "opening paragraph" } }, "tags": [ [ "d", "post_readme_to_nostr" ], [ "app", "didactyl" ], [ "scope", "public" ], [ "slug", "post_readme_to_nostr" ] ] }, { "kind": 31124, "content_fields": { "name": "admin_ops", "description": "Private operational procedures" }, "tags": [ [ "d", "admin_ops" ], [ "app", "didactyl" ], [ "scope", "private" ], [ "slug", "admin_ops" ] ] }, { "kind": 10123, "content": "", "tags": [ [ "a", "31123:55993e3db0ed7bf07395fd44c2d695c224d195553a1aff7320a18e41679d9c7c:long_form_note" ], [ "a", "31123:55993e3db0ed7bf07395fd44c2d695c224d195553a1aff7320a18e41679d9c7c:post_readme_to_nostr" ], [ "app", "didactyl" ], [ "scope", "public" ] ] } ] }