diff --git a/README.md b/README.md index 83257c6..542e220 100644 --- a/README.md +++ b/README.md @@ -54,11 +54,11 @@ Skills compose by adoption-list order (`10123`) and trigger tags carry runtime e Didactyl will support local inference, which is very privacy preserving. Remote inference does however have it's advantages, and in those cases Didactyl supports using Bitcoin Lightning and eCash inference providers. -## Current Status — v0.2.2 +## Current Status — v0.2.3 **Active build — this project is barely working. Experiment at your own risk.** -> Last release update: v0.2.2 — Re-apply v0.2.0 migration after history rewrite rollback +> Last release update: v0.2.3 — Silence unused static helper warnings after migration rollback reapply - Connects to configured relays with auto-reconnect and relay state transition logging - Publishes configured startup events per relay as each relay becomes connected diff --git a/context.log.md b/context.log.md index 488109f..cf508d3 100644 --- a/context.log.md +++ b/context.log.md @@ -1,3 +1,191 @@ +```text +Context Log - not seen by model +timestamp=2026-03-22 12:11:32 +phase=direct_tool_exec +sender=1ec454734dcbf6fe54901ce25c0c7c6bca5edd89443416761fadc321d38df139 +model=claude-opus-4.6 +context_bytes=13723 +approx_tokens=3430 +``` + +slash=/help +result_json=AVAILABLE TOOLS +- admin_identity — Build admin identity context block from cached runtime metadata +- agent_identity — Build agent identity context block with pubkey and npub +- agent_version — Return current Didactyl version and metadata from build macros +- blossom_delete — Delete a blob from Blossom +- blossom_download — Download a blob from Blossom to a local file +- blossom_head — Fetch blob metadata from Blossom +- blossom_list — List blobs for a pubkey on Blossom +- blossom_upload — Upload a local file to a Blossom server +- cashu_wallet_balance — Return current wallet balances aggregated by mint and unit +- cashu_wallet_check_proofs — Check current wallet proofs state against mint +- cashu_wallet_info — Fetch mint info for a specific mint_url or the default configured mint +- cashu_wallet_melt_pay — Pay a previously quoted melt by quote_id +- cashu_wallet_melt_quote — Request a melt quote for a Lightning payment request +- cashu_wallet_mint_check — Check a previously requested mint quote status +- cashu_wallet_mint_claim — Claim minted proofs for a paid quote_id and add them to wallet state +- cashu_wallet_mint_quote — Request a mint quote for a target amount +- cashu_wallet_mints_get — Get currently configured wallet and public mints +- cashu_wallet_mints_set — Set wallet mints (NIP-60), public mints (NIP-61), or both +- cashu_wallet_receive_token — Receive an ecash token string (cashuA/cashuB), swap to fresh proofs, and store it in wallet state +- cashu_wallet_send_token — Create an outbound ecash token from wallet proofs for an exact amount +- config_recall — Fetch and decrypt agent config kind 30078 by d_tag +- config_store — Encrypt and publish agent config as kind 30078 for a given d_tag +- local_file_read — Read a local file as text from the configured working directory +- local_file_write — Write text content to a local file in the configured working directory +- local_http_fetch — Fetch HTTP(S) resources with optional method, headers, timeout, and body +- local_shell_exec — Execute a shell command and return stdout/stderr +- memory_recall — Recall encrypted agent memory (kind 30078, d=memory) +- memory_save — Prepend a new entry to encrypted agent memory (kind 30078, d=memory) and truncate oldest content if needed +- model_get — Get current active LLM runtime configuration (excluding API key) +- model_list — List available model IDs using provider OpenAI-compatible /models endpoint +- model_set — Update active LLM configuration and persist it to Nostr kind 30078 (d=llm_config) +- my_contacts — Alias for nostr_agent_contacts: return this agent's kind 3 contacts context +- my_kind0_profile — Alias for nostr_agent_profile: return this agent's kind 0 profile context +- my_notes — Alias for nostr_agent_notes: return this agent's recent kind 1 notes context +- my_npub — Alias for nostr_npub: return this agent's pubkey encoded as npub bech32 +- my_pubkey — Alias for nostr_pubkey: return this agent's pubkey in hex format +- my_relays — Alias for nostr_agent_relays: return this agent's kind 10002 relay context +- nostr_admin_contacts — Build admin contacts context block from cached kind 3 contact list +- nostr_admin_notes — Build admin notes context block from cached kind 1 notes +- nostr_admin_profile — Build admin profile context block from cached kind 0 metadata +- nostr_admin_relays — Build admin relay context block from cached kind 10002 data +- nostr_agent_contacts — Build agent contacts context block from cached kind 3 contact list +- nostr_agent_notes — Build agent notes context block from cached kind 1 notes +- nostr_agent_profile — Build agent profile context block from cached kind 0 metadata +- nostr_agent_relays — Build agent relay context block from cached kind 10002 data +- nostr_block_edit — Add or remove blocked tuples in kind-10000 block list; entries are private (encrypted) by default +- nostr_block_list — View blocked pubkeys, event IDs, or hashtags from the local encrypted kind-10000 block list cache +- nostr_decode — Decode a Nostr bech32/nostr: URI into components +- nostr_decrypt — Decrypt NIP-44 ciphertext from a sender +- nostr_delete — Request deletion of one or more previously published events (NIP-09 kind 5) +- nostr_dm_send — Send a NIP-04 encrypted DM +- nostr_dm_send_nip17 — Send a private DM using NIP-17 gift wrap protocol +- nostr_encode — Encode a Nostr entity into nostr: URI (npub, note, nprofile, nevent, naddr) +- nostr_encrypt — Encrypt plaintext using NIP-44 for a recipient +- nostr_file_md_to_longform_post — Read a markdown file and publish it as kind 30023 longform post; defaults d-tag to lowercase filename +- nostr_list_manage — Add/remove tag tuples in replaceable list events (NIP-51 style) +- nostr_my_events — Query recent events authored by this agent and return kind, event_id, timestamp, d_tag, and cache presence +- nostr_nip05_lookup — Look up or verify a NIP-05 identifier (user@domain) +- nostr_npub — Return this agent's pubkey encoded as npub bech32 +- nostr_post — Publish a Nostr event to connected relays +- nostr_post_readme — Publish README.md as kind 30023 with deterministic d tag readme.md +- nostr_profile_get — Look up a Nostr profile (kind 0 metadata) by pubkey +- nostr_pubkey — Return this agent's pubkey in hex format +- nostr_query — Query events from relays using a Nostr filter +- nostr_react — React to a Nostr event with like/dislike/emoji (NIP-25 kind 7) +- nostr_relay_info — Fetch NIP-11 relay information document +- nostr_relay_status — Get connection status and statistics for all relays +- nostr_subscription_set — Update one managed runtime subscription by name (toggle enabled and/or replace filter) +- nostr_subscription_status — List currently managed runtime Nostr subscriptions and filters +- skill_adopt — Adopt a skill by adding its address to kind 10123 adoption list +- skill_create — Create or update a skill definition as kind 31123/31124 and optionally auto-adopt it +- skill_edit — Edit an existing self skill by d tag and republish it as kind 31123/31124 +- skill_list — List available skills discovered online (agent + admin), with adoption status and optional filters +- skill_remove — Remove a skill address from kind 10123 adoption list +- skill_search — Search public skills by query/author and optionally rank by adoption popularity +- task_list — Build current task list context block from agent task memory on Nostr +- task_manage — Manage agent short-term task memory stored on Nostr kind 30078 (d=tasks): list/add/update/remove/clear/replace +- tool_list — List available tools with name, description, and JSON parameter schema +- trigger_list — List active triggered skills and their runtime status + +AVAILABLE SKILLS +- (none) + +ADOPTED SKILLS +- default_admin_dm + +result_markdown=AVAILABLE TOOLS +- admin_identity — Build admin identity context block from cached runtime metadata +- agent_identity — Build agent identity context block with pubkey and npub +- agent_version — Return current Didactyl version and metadata from build macros +- blossom_delete — Delete a blob from Blossom +- blossom_download — Download a blob from Blossom to a local file +- blossom_head — Fetch blob metadata from Blossom +- blossom_list — List blobs for a pubkey on Blossom +- blossom_upload — Upload a local file to a Blossom server +- cashu_wallet_balance — Return current wallet balances aggregated by mint and unit +- cashu_wallet_check_proofs — Check current wallet proofs state against mint +- cashu_wallet_info — Fetch mint info for a specific mint_url or the default configured mint +- cashu_wallet_melt_pay — Pay a previously quoted melt by quote_id +- cashu_wallet_melt_quote — Request a melt quote for a Lightning payment request +- cashu_wallet_mint_check — Check a previously requested mint quote status +- cashu_wallet_mint_claim — Claim minted proofs for a paid quote_id and add them to wallet state +- cashu_wallet_mint_quote — Request a mint quote for a target amount +- cashu_wallet_mints_get — Get currently configured wallet and public mints +- cashu_wallet_mints_set — Set wallet mints (NIP-60), public mints (NIP-61), or both +- cashu_wallet_receive_token — Receive an ecash token string (cashuA/cashuB), swap to fresh proofs, and store it in wallet state +- cashu_wallet_send_token — Create an outbound ecash token from wallet proofs for an exact amount +- config_recall — Fetch and decrypt agent config kind 30078 by d_tag +- config_store — Encrypt and publish agent config as kind 30078 for a given d_tag +- local_file_read — Read a local file as text from the configured working directory +- local_file_write — Write text content to a local file in the configured working directory +- local_http_fetch — Fetch HTTP(S) resources with optional method, headers, timeout, and body +- local_shell_exec — Execute a shell command and return stdout/stderr +- memory_recall — Recall encrypted agent memory (kind 30078, d=memory) +- memory_save — Prepend a new entry to encrypted agent memory (kind 30078, d=memory) and truncate oldest content if needed +- model_get — Get current active LLM runtime configuration (excluding API key) +- model_list — List available model IDs using provider OpenAI-compatible /models endpoint +- model_set — Update active LLM configuration and persist it to Nostr kind 30078 (d=llm_config) +- my_contacts — Alias for nostr_agent_contacts: return this agent's kind 3 contacts context +- my_kind0_profile — Alias for nostr_agent_profile: return this agent's kind 0 profile context +- my_notes — Alias for nostr_agent_notes: return this agent's recent kind 1 notes context +- my_npub — Alias for nostr_npub: return this agent's pubkey encoded as npub bech32 +- my_pubkey — Alias for nostr_pubkey: return this agent's pubkey in hex format +- my_relays — Alias for nostr_agent_relays: return this agent's kind 10002 relay context +- nostr_admin_contacts — Build admin contacts context block from cached kind 3 contact list +- nostr_admin_notes — Build admin notes context block from cached kind 1 notes +- nostr_admin_profile — Build admin profile context block from cached kind 0 metadata +- nostr_admin_relays — Build admin relay context block from cached kind 10002 data +- nostr_agent_contacts — Build agent contacts context block from cached kind 3 contact list +- nostr_agent_notes — Build agent notes context block from cached kind 1 notes +- nostr_agent_profile — Build agent profile context block from cached kind 0 metadata +- nostr_agent_relays — Build agent relay context block from cached kind 10002 data +- nostr_block_edit — Add or remove blocked tuples in kind-10000 block list; entries are private (encrypted) by default +- nostr_block_list — View blocked pubkeys, event IDs, or hashtags from the local encrypted kind-10000 block list cache +- nostr_decode — Decode a Nostr bech32/nostr: URI into components +- nostr_decrypt — Decrypt NIP-44 ciphertext from a sender +- nostr_delete — Request deletion of one or more previously published events (NIP-09 kind 5) +- nostr_dm_send — Send a NIP-04 encrypted DM +- nostr_dm_send_nip17 — Send a private DM using NIP-17 gift wrap protocol +- nostr_encode — Encode a Nostr entity into nostr: URI (npub, note, nprofile, nevent, naddr) +- nostr_encrypt — Encrypt plaintext using NIP-44 for a recipient +- nostr_file_md_to_longform_post — Read a markdown file and publish it as kind 30023 longform post; defaults d-tag to lowercase filename +- nostr_list_manage — Add/remove tag tuples in replaceable list events (NIP-51 style) +- nostr_my_events — Query recent events authored by this agent and return kind, event_id, timestamp, d_tag, and cache presence +- nostr_nip05_lookup — Look up or verify a NIP-05 identifier (user@domain) +- nostr_npub — Return this agent's pubkey encoded as npub bech32 +- nostr_post — Publish a Nostr event to connected relays +- nostr_post_readme — Publish README.md as kind 30023 with deterministic d tag readme.md +- nostr_profile_get — Look up a Nostr profile (kind 0 metadata) by pubkey +- nostr_pubkey — Return this agent's pubkey in hex format +- nostr_query — Query events from relays using a Nostr filter +- nostr_react — React to a Nostr event with like/dislike/emoji (NIP-25 kind 7) +- nostr_relay_info — Fetch NIP-11 relay information document +- nostr_relay_status — Get connection status and statistics for all relays +- nostr_subscription_set — Update one managed runtime subscription by name (toggle enabled and/or replace filter) +- nostr_subscription_status — List currently managed runtime Nostr subscriptions and filters +- skill_adopt — Adopt a skill by adding its address to kind 10123 adoption list +- skill_create — Create or update a skill definition as kind 31123/31124 and optionally auto-adopt it +- skill_edit — Edit an existing self skill by d tag and republish it as kind 31123/31124 +- skill_list — List available skills discovered online (agent + admin), with adoption status and optional filters +- skill_remove — Remove a skill address from kind 10123 adoption list +- skill_search — Search public skills by query/author and optionally rank by adoption popularity +- task_list — Build current task list context block from agent task memory on Nostr +- task_manage — Manage agent short-term task memory stored on Nostr kind 30078 (d=tasks): list/add/update/remove/clear/replace +- tool_list — List available tools with name, description, and JSON parameter schema +- trigger_list — List active triggered skills and their runtime status + +AVAILABLE SKILLS +- (none) + +ADOPTED SKILLS +- default_admin_dm + + +--- + ```text Context Log - not seen by model timestamp=2026-03-21 07:09:20 diff --git a/src/agent.c b/src/agent.c index df15814..f27beb1 100644 --- a/src/agent.c +++ b/src/agent.c @@ -1126,7 +1126,7 @@ static const char* get_context_part_name_copy(int idx) { return tls_name[0] ? tls_name : NULL; } -static void template_emit_hook(const char* section_name, int message_index, void* user_data) { +static __attribute__((unused)) void template_emit_hook(const char* section_name, int message_index, void* user_data) { (void)user_data; set_context_part_name(message_index, section_name ? section_name : "context_part"); } @@ -1250,7 +1250,7 @@ void agent_append_context_log(const char* sender_pubkey_hex, const char* phase, } -static char* build_sender_verification_text(didactyl_sender_tier_t sender_tier) { +static __attribute__((unused)) char* build_sender_verification_text(didactyl_sender_tier_t sender_tier) { if (sender_tier == DIDACTYL_SENDER_ADMIN) { return strdup("This message has been cryptographically verified as coming from your administrator."); } @@ -1968,7 +1968,7 @@ static char* flatten_skill_content_to_text(const char* skill_content) { return out; } -static int append_adopted_skills_context(cJSON* messages) { +static __attribute__((unused)) int append_adopted_skills_context(cJSON* messages) { if (!messages || !g_cfg) { return -1; } @@ -2078,7 +2078,7 @@ static int append_adopted_skills_context(cJSON* messages) { return rc; } -static cJSON* build_recent_admin_dm_history_messages(const char* current_message) { +static __attribute__((unused)) cJSON* build_recent_admin_dm_history_messages(const char* current_message) { cJSON* messages = cJSON_CreateArray(); if (!messages) { return NULL; diff --git a/src/main.h b/src/main.h index 3f1c20f..e31a68d 100644 --- a/src/main.h +++ b/src/main.h @@ -12,8 +12,8 @@ // Using DIDACTYL_ prefix to avoid conflicts with nostr_core_lib VERSION macros #define DIDACTYL_VERSION_MAJOR 0 #define DIDACTYL_VERSION_MINOR 2 -#define DIDACTYL_VERSION_PATCH 2 -#define DIDACTYL_VERSION "v0.2.2" +#define DIDACTYL_VERSION_PATCH 3 +#define DIDACTYL_VERSION "v0.2.3" // Agent metadata #define DIDACTYL_NAME "Didactyl" diff --git a/src/nostr_handler.c b/src/nostr_handler.c index 2786112..49cb679 100644 --- a/src/nostr_handler.c +++ b/src/nostr_handler.c @@ -999,7 +999,7 @@ static int parse_enabled_flag_local(const char* enabled_s) { return (strcmp(enabled_s, "false") == 0 || strcmp(enabled_s, "0") == 0) ? 0 : 1; } -static int parse_skill_address_local(const char* addr, int* out_kind, char out_pubkey_hex[65], char out_d_tag[65]) { +static __attribute__((unused)) int parse_skill_address_local(const char* addr, int* out_kind, char out_pubkey_hex[65], char out_d_tag[65]) { if (!addr || !out_kind || !out_pubkey_hex || !out_d_tag) { return -1; } diff --git a/src/trigger_manager.c b/src/trigger_manager.c index c63a235..2980af6 100644 --- a/src/trigger_manager.c +++ b/src/trigger_manager.c @@ -490,7 +490,7 @@ static cJSON* find_tag_value_string(cJSON* tags, const char* key) { return NULL; } -static int parse_address_tag(const char* addr, int* out_kind, char out_pubkey[65], char out_d_tag[65]) { +static __attribute__((unused)) int parse_address_tag(const char* addr, int* out_kind, char out_pubkey[65], char out_d_tag[65]) { if (!addr || !out_kind || !out_pubkey || !out_d_tag) { return -1; }